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();
// 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,
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