Prune silly comments in search()
[stockfish] / src / search.cpp
index ba31bd0221bc3a811a861c99c56d7c1df0025b2b..9a1fa821211c317bed64fb25e71a82d9604a23d9 100644 (file)
@@ -147,20 +147,11 @@ namespace {
 
   /// Namespace variables
 
-  // Root move list
   RootMoveList Rml;
-
-  // MultiPV mode
   size_t MultiPV, UCIMultiPV, MultiPVIdx;
-
-  // Time management variables
   TimeManager TimeMgr;
-
-  // Skill level adjustment
   int SkillLevel;
   bool SkillLevelEnabled;
-
-  // History table
   History H;
 
 
@@ -294,15 +285,12 @@ int64_t Search::perft(Position& pos, Depth depth) {
   StateInfo st;
   int64_t sum = 0;
 
-  // Generate all legal moves
   MoveList<MV_LEGAL> ml(pos);
 
-  // If we are at the last ply we don't need to do and undo
-  // the moves, just to count them.
+  // At the last ply just return the number of moves (leaf nodes)
   if (depth <= ONE_PLY)
       return ml.size();
 
-  // Loop through all legal moves
   CheckInfo ci(pos);
   for ( ; !ml.end(); ++ml)
   {
@@ -323,14 +311,12 @@ void Search::think() {
   static Book book; // Defined static to initialize the PRNG only once
 
   Position& pos = RootPosition;
-
-  // Reset elapsed search time
   elapsed_time(true);
+  TimeMgr.init(Limits, pos.startpos_ply_counter());
 
   // Set output stream mode: normal or chess960. Castling notation is different
   cout << set960(pos.is_chess960());
 
-  // Look for a book move
   if (Options["OwnBook"].value<bool>())
   {
       if (Options["Book File"].value<string>() != book.name())
@@ -351,9 +337,7 @@ void Search::think() {
   read_evaluation_uci_options(pos.side_to_move());
   Threads.read_uci_options();
 
-  // Set a new TT size if changed
   TT.set_size(Options["Hash"].value<int>());
-
   if (Options["Clear Hash"].value<bool>())
   {
       Options["Clear Hash"].set_value("false");
@@ -368,7 +352,6 @@ void Search::think() {
   SkillLevelEnabled = (SkillLevel < 20);
   MultiPV = (SkillLevelEnabled ? std::max(UCIMultiPV, (size_t)4) : UCIMultiPV);
 
-  // Write current search header to log file
   if (Options["Use Search Log"].value<bool>())
   {
       Log log(Options["Search Log Filename"].value<string>());
@@ -390,8 +373,6 @@ void Search::think() {
 
   // Set best timer interval to avoid lagging under time pressure. Timer is
   // used to check for remaining available thinking time.
-   TimeMgr.init(Limits, pos.startpos_ply_counter());
-
   if (TimeMgr.available_time())
       Threads.set_timer(std::min(100, std::max(TimeMgr.available_time() / 8, 20)));
   else
@@ -401,13 +382,10 @@ void Search::think() {
   Move ponderMove = MOVE_NONE;
   Move bestMove = id_loop(pos, &RootMoves[0], &ponderMove);
 
-  // Stop timer, no need to check for available time any more
+  // Stop timer and send all the slaves to sleep, if not already sleeping
   Threads.set_timer(0);
-
-  // This makes all the slave threads to go to sleep, if not already sleeping
   Threads.set_size(1);
 
-  // Write current search final statistics to log file
   if (Options["Use Search Log"].value<bool>())
   {
       int e = elapsed_time();
@@ -457,7 +435,6 @@ namespace {
     Move bestMove, skillBest, skillPonder;
     bool bestMoveNeverChanged = true;
 
-    // Initialize stuff before a new search
     memset(ss, 0, 4 * sizeof(Stack));
     TT.new_search();
     H.clear();
@@ -465,8 +442,6 @@ namespace {
     depth = aspirationDelta = 0;
     bestValue = alpha = -VALUE_INFINITE, beta = VALUE_INFINITE;
     ss->currentMove = MOVE_NULL; // Hack to skip update gains
-
-    // Moves to search are verified and copied
     Rml.init(pos, rootMoves);
 
     // Handle special case of searching on a mate/stalemate position
@@ -585,7 +560,6 @@ namespace {
             } while (abs(bestValue) < VALUE_KNOWN_WIN);
         }
 
-        // Collect info about search result
         bestMove = Rml[0].pv[0];
         *ponderMove = Rml[0].pv[1];
         bestValues[depth] = bestValue;
@@ -932,7 +906,6 @@ namespace {
 
 split_point_start: // At split points actual search starts from here
 
-    // Initialize a MovePicker object for the current position
     MovePickerExt<SpNode> mp(pos, ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta);
     CheckInfo ci(pos);
     ss->bestMove = MOVE_NONE;
@@ -941,7 +914,7 @@ split_point_start: // At split points actual search starts from here
                            && !SpNode
                            && depth >= SingularExtensionDepth[PvNode]
                            && ttMove != MOVE_NONE
-                           && !excludedMove // Do not allow recursive singular extension search
+                           && !excludedMove // Recursive singular search is not allowed
                            && (tte->type() & VALUE_TYPE_LOWER)
                            && tte->depth() >= depth - 3 * ONE_PLY;
     if (SpNode)
@@ -987,10 +960,8 @@ split_point_start: // At split points actual search starts from here
           // This is used by time management
           Signals.firstRootMove = (moveCount == 1);
 
-          // Save the current node count before the move is searched
           nodes = pos.nodes_searched();
 
-          // For long searches send current move info to GUI
           if (pos.thread() == 0 && elapsed_time() > 2000)
               cout << "info" << depth_to_uci(depth)
                    << " currmove " << move
@@ -1155,14 +1126,12 @@ split_point_start: // At split points actual search starts from here
       // be trusted, and we don't update the best move and/or PV.
       if (RootNode && !Signals.stop)
       {
-          // Remember searched nodes counts for this move
           RootMove* rm = Rml.find(move);
           rm->nodes += pos.nodes_searched() - nodes;
 
           // PV move or new best move ?
           if (isPvMove || value > alpha)
           {
-              // Update PV
               rm->score = value;
               rm->extract_pv_from_tt(pos);
 
@@ -1178,7 +1147,7 @@ split_point_start: // At split points actual search starts from here
               // position in the list is preserved, just the PV is pushed up.
               rm->score = -VALUE_INFINITE;
 
-      } // RootNode
+      }
 
       if (value > bestValue)
       {
@@ -1219,7 +1188,7 @@ split_point_start: // At split points actual search starts from here
     if (!moveCount)
         return excludedMove ? oldAlpha : inCheck ? value_mated_in(ss->ply) : VALUE_DRAW;
 
-    // We have pruned all the moves, so return a fail-low score
+    // If we have pruned all the moves without searching return a fail-low score
     if (bestValue == -VALUE_INFINITE)
     {
         assert(!playedMoveCount);
@@ -1228,8 +1197,7 @@ split_point_start: // At split points actual search starts from here
     }
 
     // Step 21. Update tables
-    // If the search is not aborted, update the transposition table,
-    // history counters, and killer moves.
+    // Update transposition table entry, history and killers
     if (!SpNode && !Signals.stop && !thread.cutoff_occurred())
     {
         move = bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove;
@@ -1264,6 +1232,7 @@ split_point_start: // At split points actual search starts from here
     return bestValue;
   }
 
+
   // qsearch() is the quiescence search function, which is called by the main
   // search function when the remaining depth is zero (or, to be more precise,
   // less than ONE_PLY).
@@ -1344,7 +1313,6 @@ split_point_start: // At split points actual search starts from here
         if (PvNode && bestValue > alpha)
             alpha = bestValue;
 
-        // Futility pruning parameters, not needed when in check
         futilityBase = ss->eval + evalMargin + FutilityMarginQS;
         enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
     }
@@ -1426,7 +1394,6 @@ split_point_start: // At split points actual search starts from here
       if (!pos.pl_move_is_legal(move, ci.pinned))
           continue;
 
-      // Update current move
       ss->currentMove = move;
 
       // Make and search the move
@@ -1647,8 +1614,8 @@ split_point_start: // At split points actual search starts from here
   }
 
 
-  // can_return_tt() returns true if a transposition table score
-  // can be used to cut-off at a given point in search.
+  // can_return_tt() returns true if a transposition table score can be used to
+  // cut-off at a given point in search.
 
   bool can_return_tt(const TTEntry* tte, Depth depth, Value beta, int ply) {
 
@@ -1663,8 +1630,8 @@ split_point_start: // At split points actual search starts from here
   }
 
 
-  // refine_eval() returns the transposition table score if
-  // possible otherwise falls back on static position evaluation.
+  // refine_eval() returns the transposition table score if possible, otherwise
+  // falls back on static position evaluation.
 
   Value refine_eval(const TTEntry* tte, Value defaultEval, int ply) {
 
@@ -1680,8 +1647,8 @@ split_point_start: // At split points actual search starts from here
   }
 
 
-  // update_history() registers a good move that produced a beta-cutoff
-  // in history and marks as failures all the other moves of that ply.
+  // update_history() registers a good move that produced a beta-cutoff in
+  // history and marks as failures all the other moves of that ply.
 
   void update_history(const Position& pos, Move move, Depth depth,
                       Move movesSearched[], int moveCount) {
@@ -1787,6 +1754,12 @@ split_point_start: // At split points actual search starts from here
     return s.str();
   }
 
+
+  // pretty_pv() creates a human-readable string from a position and a PV.
+  // It is used to write search information to the log file (which is created
+  // when the UCI parameter "Use Search Log" is "true"). It uses the two helpers
+  // time_to_string() and score_to_string() to format time and score respectively.
+
   string time_to_string(int millisecs) {
 
     const int MSecMinute = 1000 * 60;
@@ -1819,11 +1792,6 @@ split_point_start: // At split points actual search starts from here
     return s.str();
   }
 
-
-  // pretty_pv() creates a human-readable string from a position and a PV.
-  // It is used to write search information to the log file (which is created
-  // when the UCI parameter "Use Search Log" is "true").
-
   string pretty_pv(Position& pos, int depth, Value value, int time, Move pv[]) {
 
     const int64_t K = 1000;
@@ -1918,7 +1886,7 @@ split_point_start: // At split points actual search starts from here
   }
 
 
-  /// RootMove and RootMoveList method's definitions
+  // RootMove and RootMoveList method's definitions
 
   void RootMoveList::init(Position& pos, Move rootMoves[]) {
 
@@ -2024,9 +1992,9 @@ split_point_start: // At split points actual search starts from here
 } // namespace
 
 
-// Thread::idle_loop() is where the thread is parked when it has no work to do.
-// The parameter 'sp', if non-NULL, is a pointer to an active SplitPoint object
-// for which the thread is the master.
+/// Thread::idle_loop() is where the thread is parked when it has no work to do.
+/// The parameter 'sp', if non-NULL, is a pointer to an active SplitPoint object
+/// for which the thread is the master.
 
 void Thread::idle_loop(SplitPoint* sp) {
 
@@ -2040,7 +2008,6 @@ void Thread::idle_loop(SplitPoint* sp) {
       {
           assert((!sp && threadID) || Threads.use_sleeping_threads());
 
-          // Slave thread should exit as soon as do_terminate flag raises
           if (do_terminate)
           {
               assert(!sp);
@@ -2115,15 +2082,16 @@ void Thread::idle_loop(SplitPoint* sp) {
 }
 
 
-// do_timer_event() is called by the timer thread when the timer triggers
+/// do_timer_event() is called by the timer thread when the timer triggers. It
+/// is used to print debug info and, more important, to detect when we are out of
+/// available time and so stop the search.
 
 void do_timer_event() {
 
   static int lastInfoTime;
   int e = elapsed_time();
 
-  // Print debug information every one second
-  if (!lastInfoTime || get_system_time() - lastInfoTime >= 1000)
+  if (get_system_time() - lastInfoTime >= 1000 || !lastInfoTime)
   {
       lastInfoTime = get_system_time();
 
@@ -2131,7 +2099,6 @@ void do_timer_event() {
       dbg_print_hit_rate();
   }
 
-  // Should we stop the search?
   if (Limits.ponder)
       return;