/*
Texel - A UCI chess engine.
Copyright (C) 2012-2014 Peter Ă–sterlund, peterosterlund2@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* book.hpp
*
* Created on: Feb 25, 2012
* Author: petero
*/
#ifndef BOOK_HPP_
#define BOOK_HPP_
#include "move.hpp"
#include "util/util.hpp"
#include "util/random.hpp"
#include <map>
#include <vector>
#include <cmath>
class Position;
/**
* Implements an opening book.
*/
class Book {
public:
/** Constructor. */
Book(bool verbose0);
/** Return a random book move for a position, or empty move if out of book. */
void getBookMove(Position& pos, Move& out);
/** Return a string describing all book moves. */
std::string getAllBookMoves(const Position& pos);
private:
void initBook();
/** Add a move to a position in the opening book. */
void addToBook(const Position& pos, const Move& moveToAdd);
int getWeight(int count);
static void createBinBook(std::vector<S8>& binBook);
/** Add a sequence of moves, starting from the initial position, to the binary opening book. */
static bool addBookLine(const std::string& line, std::vector<S8>& binBook);
static int pieceToProm(int p);
static int promToPiece(int prom, bool whiteMove);
struct BookEntry {
Move move;
int count;
BookEntry(const Move& m) : move(m), count(1) { }
};
using BookMap = std::map<U64, std::vector<BookEntry>>;
static BookMap bookMap;
static Random rndGen;
static int numBookMoves;
bool verbose;
static const char* bookLines[];
};
inline
Book::Book(bool verbose0)
: verbose(verbose0) {
}
#endif /* BOOK_HPP_ */