Add "Best Book Move" UCI option
authorMarco Costalba <mcostalba@gmail.com>
Thu, 15 Apr 2010 13:54:44 +0000 (15:54 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 16 Apr 2010 04:45:30 +0000 (05:45 +0100)
Is a boolean option that when set allows Stockfish
to select the best book move across the possible ones.

Feature requested by Salvo Spitaleri.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/book.cpp
src/book.h
src/search.cpp
src/ucioption.cpp

index 20861988b24c906b1ba04c5788b6dc9014a553ca..dbd037885711c191b23d53622a6b6aa8db75dba9 100644 (file)
@@ -399,14 +399,15 @@ const string Book::file_name() { // Not const to compile on HP-UX 11.X
 /// Book::get_move() gets a book move for a given position. Returns
 /// MOVE_NONE if no book move is found.
 
 /// 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;
 
 
   if (!is_open() || bookSize == 0)
       return MOVE_NONE;
 
-  int bookMove = 0, scoresSum = 0;
-  uint64_t key = book_key(pos);
   BookEntry entry;
   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++)
 
   // Choose a book move among the possible moves for the given position
   for (int idx = find_key(key); idx < bookSize; idx++)
@@ -419,6 +420,17 @@ Move Book::get_move(const Position& pos) {
 
       assert(score > 0);
 
 
       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.
       // 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.
index 9e775ede31743429a8f7a4ba3f337cb7a240b9f4..32b6e607ebba5bf1eaf510ce66ac3456ec4c869c 100644 (file)
@@ -61,7 +61,7 @@ public:
   void open(const std::string& fName);
   void close();
   const std::string file_name();
   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; }
 
 private:
   Book& operator>>(uint64_t& n) { n = read_integer(8); return *this; }
index fff523c39e48e538099e3a169c7c9491c59154b5..0e65d19ff3c9f5d8da2d9fd7887ceb2bb42ec3e5 100644 (file)
@@ -387,7 +387,7 @@ bool think(const Position& pos, bool infinite, bool ponder, int side_to_move,
       if (get_option_value_string("Book File") != OpeningBook.file_name())
           OpeningBook.open(get_option_value_string("Book File"));
 
       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)
       if (bookMove != MOVE_NONE)
       {
           if (PonderSearch)
index 154e141080371612256c68f3b995d147582ebc5b..990c748c9012d649c3182f8186430b5c3a449b00 100644 (file)
@@ -79,6 +79,7 @@ namespace {
     o["Use Search Log"] = Option(false);
     o["Search Log Filename"] = Option("SearchLog.txt");
     o["Book File"] = Option("book.bin");
     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);
     o["Mobility (Middle Game)"] = Option(100, 0, 200);
     o["Mobility (Endgame)"] = Option(100, 0, 200);
     o["Pawn Structure (Middle Game)"] = Option(100, 0, 200);