/// Book::get_move() gets a book move for a given position. Returns
/// MOVE_NONE if no book move is found.
-Move Book::get_move(const Position& pos) {
+Move Book::get_move(const Position& pos, bool findBestMove) {
if (!is_open() || bookSize == 0)
return MOVE_NONE;
- int bookMove = 0, scoresSum = 0;
- uint64_t key = book_key(pos);
BookEntry entry;
+ int bookMove = MOVE_NONE;
+ int scoresSum = 0, bestScore = 0;
+ uint64_t key = book_key(pos);
// Choose a book move among the possible moves for the given position
for (int idx = find_key(key); idx < bookSize; idx++)
assert(score > 0);
+ // If findBestMove is true choose highest rated book move
+ if (findBestMove)
+ {
+ if (score > bestScore)
+ {
+ bestScore = score;
+ bookMove = entry.move;
+ }
+ continue;
+ }
+
// Choose book move according to its score. If a move has a very
// high score it has more probability to be choosen then a one with
// lower score. Note that first entry is always chosen.
void open(const std::string& fName);
void close();
const std::string file_name();
- Move get_move(const Position& pos);
+ Move get_move(const Position& pos, bool findBestMove);
private:
Book& operator>>(uint64_t& n) { n = read_integer(8); return *this; }
if (get_option_value_string("Book File") != OpeningBook.file_name())
OpeningBook.open(get_option_value_string("Book File"));
- Move bookMove = OpeningBook.get_move(pos);
+ Move bookMove = OpeningBook.get_move(pos, get_option_value_bool("Best Book Move"));
if (bookMove != MOVE_NONE)
{
if (PonderSearch)
o["Use Search Log"] = Option(false);
o["Search Log Filename"] = Option("SearchLog.txt");
o["Book File"] = Option("book.bin");
+ o["Best Book Move"] = Option(false);
o["Mobility (Middle Game)"] = Option(100, 0, 200);
o["Mobility (Endgame)"] = Option(100, 0, 200);
o["Pawn Structure (Middle Game)"] = Option(100, 0, 200);