Workaround github issue
authorMarco Costalba <mcostalba@gmail.com>
Wed, 3 Jul 2013 16:58:23 +0000 (18:58 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Wed, 3 Jul 2013 16:58:23 +0000 (18:58 +0200)
Temporary revert aspiration window patch
so to be visible to everybody: it will be
re-applied with next patch

No functional change (together with next one)

src/search.cpp

index 15a9cde5b706914ffe1904ca74d060769ff892c2..e1b7a1d7cfb8f7ee57787bb6c411b1cd6f1dbf64 100644 (file)
@@ -296,12 +296,9 @@ namespace {
     Value bestValue, alpha, beta, delta;
 
     memset(ss-1, 0, 4 * sizeof(Stack));
-    (ss-1)->currentMove = MOVE_NULL; // Hack to skip update gains
-
     depth = BestMoveChanges = 0;
-    bestValue = delta = alpha = -VALUE_INFINITE;
-    beta = VALUE_INFINITE;
-
+    bestValue = delta = -VALUE_INFINITE;
+    (ss-1)->currentMove = MOVE_NULL; // Hack to skip update gains
     TT.new_search();
     History.clear();
     Gains.clear();
@@ -331,12 +328,17 @@ namespace {
         // MultiPV loop. We perform a full root search for each PV line
         for (PVIdx = 0; PVIdx < PVSize; PVIdx++)
         {
-            // Reset aspiration window starting size
-            if (depth >= 5)
+            // Set aspiration window default width
+            if (depth >= 5 && abs(RootMoves[PVIdx].prevScore) < VALUE_KNOWN_WIN)
             {
                 delta = Value(16);
-                alpha = std::max(RootMoves[PVIdx].prevScore - delta,-VALUE_INFINITE);
-                beta  = std::min(RootMoves[PVIdx].prevScore + delta, VALUE_INFINITE);
+                alpha = RootMoves[PVIdx].prevScore - delta;
+                beta  = RootMoves[PVIdx].prevScore + delta;
+            }
+            else
+            {
+                alpha = -VALUE_INFINITE;
+                beta  =  VALUE_INFINITE;
             }
 
             // Start with a small aspiration window and, in case of fail high/low,
@@ -364,28 +366,35 @@ namespace {
                 if (Signals.stop)
                     return;
 
-                // In case of failing low/high increase aspiration window and
+                // In case of failing high/low increase aspiration window and
                 // research, otherwise exit the loop.
-                if (bestValue <= alpha)
-                {
-                    alpha = std::max(bestValue - delta, -VALUE_INFINITE);
+                if (bestValue > alpha && bestValue < beta)
+                    break;
 
-                    Signals.failedLowAtRoot = true;
-                    Signals.stopOnPonderhit = false;
+                // Give some update (without cluttering the UI) before to research
+                if (Time::now() - SearchTime > 3000)
+                    sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl;
+
+                if (abs(bestValue) >= VALUE_KNOWN_WIN)
+                {
+                    alpha = -VALUE_INFINITE;
+                    beta  =  VALUE_INFINITE;
                 }
                 else if (bestValue >= beta)
-                    beta = std::min(bestValue + delta, VALUE_INFINITE);
-
+                {
+                    beta += delta;
+                    delta += delta / 2;
+                }
                 else
-                    break;
+                {
+                    Signals.failedLowAtRoot = true;
+                    Signals.stopOnPonderhit = false;
 
-                delta += delta / 2;
+                    alpha -= delta;
+                    delta += delta / 2;
+                }
 
                 assert(alpha >= -VALUE_INFINITE && beta <= VALUE_INFINITE);
-
-                // Give some update (without cluttering the UI) before to research
-                if (Time::now() - SearchTime > 3000)
-                    sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl;
             }
 
             // Sort the PV lines searched so far and update the GUI