Retire Rml full PV search at depth == 1
authorMarco Costalba <mcostalba@gmail.com>
Thu, 4 Aug 2011 13:14:56 +0000 (14:14 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Tue, 9 Aug 2011 08:58:10 +0000 (09:58 +0100)
Now that Rml ordering is based on normal MovePicker logic,
apart for the ttMove that is given, we can avoid to score
all the root moves at depth 1. We only need it for easy move
detection logic, but in this case we just need to score the
first two best moves and not all the Rml set.

No regression after 6400 games
Mod vs Orig 1052 1012 4336 ELO +2 (+- 4.9)

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

index 4cce6a9171de9139d8e51e717d966af819912492..8088ff76c94ce36418d7307347ab16d211ae350e 100644 (file)
@@ -534,8 +534,10 @@ namespace {
 
         Rml.bestMoveChanges = 0;
 
-        // MultiPV iteration loop
-        for (MultiPVIteration = 0; MultiPVIteration < Min(MultiPV, (int)Rml.size()); MultiPVIteration++)
+        // MultiPV iteration loop. At depth 1 perform at least 2 iterations to
+        // get a score of the second best move for easy move detection.
+        int e = Min(Max(MultiPV, 2 * int(depth == 1)), (int)Rml.size());
+        for (MultiPVIteration = 0; MultiPVIteration < e; MultiPVIteration++)
         {
             // Calculate dynamic aspiration window based on previous iterations
             if (depth >= 5 && abs(Rml[MultiPVIteration].prevScore) < VALUE_KNOWN_WIN)
@@ -1000,8 +1002,7 @@ split_point_start: // At split points actual search starts from here
                    << " currmovenumber " << moveCount + MultiPVIteration << endl;
       }
 
-      // At Root and at first iteration do a PV search on all the moves to score root moves
-      isPvMove = (PvNode && moveCount <= (RootNode && depth <= ONE_PLY ? MAX_MOVES : 1));
+      isPvMove = (PvNode && moveCount == 1);
       givesCheck = pos.move_gives_check(move, ci);
       captureOrPromotion = pos.move_is_capture_or_promotion(move);