]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Clarify we want Score and Value to be integers
[stockfish] / src / search.cpp
index 88160ef2529df13179ce9cb8839090ec2aa9fa2d..370889cca3c2ecd6a3196a2374d3dd2854c1b258 100644 (file)
 #include "evaluate.h"
 #include "history.h"
 #include "misc.h"
+#include "move.h"
 #include "movegen.h"
 #include "movepick.h"
 #include "lock.h"
-#include "san.h"
 #include "search.h"
 #include "timeman.h"
 #include "thread.h"
@@ -129,7 +129,7 @@ namespace {
 
     void extract_pv_from_tt(Position& pos);
     void insert_pv_in_tt(Position& pos);
-    std::string pv_info_to_uci(const Position& pos, Value alpha, Value beta, int pvLine = 0);
+    std::string pv_info_to_uci(Position& pos, Value alpha, Value beta, int pvLine = 0);
 
     int64_t nodes;
     Value pv_score;
@@ -170,8 +170,11 @@ namespace {
 
   // Overload operator << for moves to make it easier to print moves in
   // coordinate notation compatible with UCI protocol.
+  std::ostream& operator<<(std::ostream& os, Move m) {
 
-  std::ostream& operator<<(std::ostream& os, Move m);
+    bool chess960 = (os.iword(0) != 0); // See set960()
+    return os << move_to_uci(m, chess960);
+  }
 
 
   /// Adjustments
@@ -378,7 +381,7 @@ int64_t perft(Position& pos, Depth depth)
     int64_t sum = 0;
 
     // Generate all legal moves
-    MoveStack* last = generate_moves(pos, mlist);
+    MoveStack* last = generate<MV_LEGAL>(pos, mlist);
 
     // If we are at the last ply we don't need to do and undo
     // the moves, just to count them.
@@ -420,7 +423,7 @@ bool think(Position& pos, bool infinite, bool ponder, int time[], int increment[
   // Look for a book move, only during games, not tests
   if (UseTimeManagement && Options["OwnBook"].value<bool>())
   {
-      if (Options["Book File"].value<std::string>() != OpeningBook.file_name())
+      if (Options["Book File"].value<std::string>() != OpeningBook.name())
           OpeningBook.open(Options["Book File"].value<std::string>());
 
       Move bookMove = OpeningBook.get_move(pos, Options["Best Book Move"].value<bool>());
@@ -699,6 +702,7 @@ namespace {
 
     // Step 1. Initialize node (polling is omitted at root)
     ss->currentMove = ss->bestMove = MOVE_NONE;
+    (ss+2)->killers[0] = (ss+2)->killers[1] = (ss+2)->mateKiller = MOVE_NONE;
 
     // Step 2. Check for aborted search (omitted at root)
     // Step 3. Mate distance pruning (omitted at root)
@@ -1905,8 +1909,9 @@ split_point_start: // At split points actual search starts from here
   void update_history(const Position& pos, Move move, Depth depth,
                       Move movesSearched[], int moveCount) {
     Move m;
+    Value bonus = Value(int(depth) * int(depth));
 
-    H.success(pos.piece_on(move_from(move)), move_to(move), depth);
+    H.update(pos.piece_on(move_from(move)), move_to(move), bonus);
 
     for (int i = 0; i < moveCount - 1; i++)
     {
@@ -1915,7 +1920,7 @@ split_point_start: // At split points actual search starts from here
         assert(m != move);
 
         if (!pos.move_is_capture_or_promotion(m))
-            H.failure(pos.piece_on(move_from(m)), move_to(m), depth);
+            H.update(pos.piece_on(move_from(m)), move_to(m), -bonus);
     }
   }
 
@@ -1943,7 +1948,7 @@ split_point_start: // At split points actual search starts from here
         && after != VALUE_NONE
         && pos.captured_piece_type() == PIECE_TYPE_NONE
         && !move_is_special(m))
-        H.set_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
+        H.update_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
   }
 
 
@@ -2013,7 +2018,7 @@ split_point_start: // At split points actual search starts from here
     int t = current_search_time();
 
     //  Poll for input
-    if (data_available())
+    if (input_available())
     {
         // We are line oriented, don't read single chars
         std::string command;
@@ -2630,7 +2635,7 @@ split_point_start: // At split points actual search starts from here
   // formatted according to UCI specification and eventually writes the info
   // to a log file. It is called at each iteration or after a new pv is found.
 
-  std::string RootMove::pv_info_to_uci(const Position& pos, Value alpha, Value beta, int pvLine) {
+  std::string RootMove::pv_info_to_uci(Position& pos, Value alpha, Value beta, int pvLine) {
 
     std::stringstream s, l;
     Move* m = pv;
@@ -2671,7 +2676,7 @@ split_point_start: // At split points actual search starts from here
     ss[0].eval = ss[0].evalMargin = VALUE_NONE;
 
     // Generate all legal moves
-    MoveStack* last = generate_moves(pos, mlist);
+    MoveStack* last = generate<MV_LEGAL>(pos, mlist);
 
     // Add each move to the RootMoveList's vector
     for (MoveStack* cur = mlist; cur != last; cur++)
@@ -2717,35 +2722,4 @@ split_point_start: // At split points actual search starts from here
               }
   }
 
-  // Overload operator << to make it easier to print moves in coordinate notation
-  // (g1f3, a7a8q, etc.). The only special case is castling moves, where we
-  // print in the e1g1 notation in normal chess mode, and in e1h1 notation in
-  // Chess960 mode.
-
-  std::ostream& operator<<(std::ostream& os, Move m) {
-
-    Square from = move_from(m);
-    Square to = move_to(m);
-    bool chess960 = (os.iword(0) != 0); // See set960()
-
-    if (m == MOVE_NONE)
-        return os << "(none)";
-
-    if (m == MOVE_NULL)
-        return os << "0000";
-
-    if (move_is_short_castle(m) && !chess960)
-        return os << (from == SQ_E1 ? "e1g1" : "e8g8");
-
-    if (move_is_long_castle(m) && !chess960)
-        return os << (from == SQ_E1 ? "e1c1" : "e8c8");
-
-    os << square_to_string(from) << square_to_string(to);
-
-    if (move_is_promotion(m))
-        os << char(tolower(piece_type_to_char(move_promotion_piece(m))));
-
-    return os;
-  }
-
 } // namespace