mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 11:39:15 +00:00
Shuffle aspiration window loop
No functional change.
This commit is contained in:
parent
70b1b79264
commit
9c2b3faec4
1 changed files with 38 additions and 42 deletions
|
@ -91,6 +91,7 @@ namespace {
|
||||||
TimeManager TimeMgr;
|
TimeManager TimeMgr;
|
||||||
int BestMoveChanges;
|
int BestMoveChanges;
|
||||||
int SkillLevel;
|
int SkillLevel;
|
||||||
|
Move skillBest;
|
||||||
bool SkillLevelEnabled, Chess960;
|
bool SkillLevelEnabled, Chess960;
|
||||||
Value DrawValue[COLOR_NB];
|
Value DrawValue[COLOR_NB];
|
||||||
History H;
|
History H;
|
||||||
|
@ -215,6 +216,7 @@ void Search::think() {
|
||||||
// Do we have to play with skill handicap? In this case enable MultiPV that
|
// Do we have to play with skill handicap? In this case enable MultiPV that
|
||||||
// we will use behind the scenes to retrieve a set of possible moves.
|
// we will use behind the scenes to retrieve a set of possible moves.
|
||||||
SkillLevelEnabled = (SkillLevel < 20);
|
SkillLevelEnabled = (SkillLevel < 20);
|
||||||
|
skillBest = MOVE_NONE;
|
||||||
MultiPV = (SkillLevelEnabled ? std::max(UCIMultiPV, (size_t)4) : UCIMultiPV);
|
MultiPV = (SkillLevelEnabled ? std::max(UCIMultiPV, (size_t)4) : UCIMultiPV);
|
||||||
|
|
||||||
if (Options["Use Search Log"])
|
if (Options["Use Search Log"])
|
||||||
|
@ -246,6 +248,15 @@ void Search::think() {
|
||||||
Threads.set_timer(0); // Stop timer
|
Threads.set_timer(0); // Stop timer
|
||||||
Threads.sleep();
|
Threads.sleep();
|
||||||
|
|
||||||
|
// When using skills swap best PV line with the sub-optimal one
|
||||||
|
if (SkillLevelEnabled)
|
||||||
|
{
|
||||||
|
if (skillBest == MOVE_NONE) // Still unassigned ?
|
||||||
|
skillBest = do_skill_level();
|
||||||
|
|
||||||
|
std::swap(RootMoves[0], *std::find(RootMoves.begin(), RootMoves.end(), skillBest));
|
||||||
|
}
|
||||||
|
|
||||||
if (Options["Use Search Log"])
|
if (Options["Use Search Log"])
|
||||||
{
|
{
|
||||||
Time::point elapsed = Time::now() - SearchTime + 1;
|
Time::point elapsed = Time::now() - SearchTime + 1;
|
||||||
|
@ -287,7 +298,6 @@ namespace {
|
||||||
int depth, prevBestMoveChanges;
|
int depth, prevBestMoveChanges;
|
||||||
Value bestValue, alpha, beta, delta;
|
Value bestValue, alpha, beta, delta;
|
||||||
bool bestMoveNeverChanged = true;
|
bool bestMoveNeverChanged = true;
|
||||||
Move skillBest = MOVE_NONE;
|
|
||||||
|
|
||||||
memset(ss, 0, 4 * sizeof(Stack));
|
memset(ss, 0, 4 * sizeof(Stack));
|
||||||
depth = BestMoveChanges = 0;
|
depth = BestMoveChanges = 0;
|
||||||
|
@ -295,7 +305,7 @@ namespace {
|
||||||
ss->currentMove = MOVE_NULL; // Hack to skip update gains
|
ss->currentMove = MOVE_NULL; // Hack to skip update gains
|
||||||
|
|
||||||
// Iterative deepening loop until requested to stop or target depth reached
|
// Iterative deepening loop until requested to stop or target depth reached
|
||||||
while (!Signals.stop && ++depth <= MAX_PLY && (!Limits.depth || depth <= Limits.depth))
|
while (++depth <= MAX_PLY && !Signals.stop && (!Limits.depth || depth <= Limits.depth))
|
||||||
{
|
{
|
||||||
// Save last iteration's scores before first PV line is searched and all
|
// Save last iteration's scores before first PV line is searched and all
|
||||||
// the move scores but the (new) PV are set to -VALUE_INFINITE.
|
// the move scores but the (new) PV are set to -VALUE_INFINITE.
|
||||||
|
@ -337,37 +347,41 @@ namespace {
|
||||||
// the already searched PV lines are preserved.
|
// the already searched PV lines are preserved.
|
||||||
sort<RootMove>(RootMoves.begin() + PVIdx, RootMoves.end());
|
sort<RootMove>(RootMoves.begin() + PVIdx, RootMoves.end());
|
||||||
|
|
||||||
// In case we have found an exact score and we are going to leave
|
|
||||||
// the fail high/low loop then reorder the PV moves, otherwise
|
|
||||||
// leave the last PV move in its position so to be searched again.
|
|
||||||
// Of course this is needed only in MultiPV search.
|
|
||||||
if (PVIdx && bestValue > alpha && bestValue < beta)
|
|
||||||
sort<RootMove>(RootMoves.begin(), RootMoves.begin() + PVIdx);
|
|
||||||
|
|
||||||
// Write PV back to transposition table in case the relevant
|
// Write PV back to transposition table in case the relevant
|
||||||
// entries have been overwritten during the search.
|
// entries have been overwritten during the search.
|
||||||
for (size_t i = 0; i <= PVIdx; i++)
|
for (size_t i = 0; i <= PVIdx; i++)
|
||||||
RootMoves[i].insert_pv_in_tt(pos);
|
RootMoves[i].insert_pv_in_tt(pos);
|
||||||
|
|
||||||
// If search has been stopped exit the aspiration window loop.
|
// If search has been stopped return immediately. Sorting and
|
||||||
// Sorting and writing PV back to TT is safe becuase RootMoves
|
// writing PV back to TT is safe becuase RootMoves is still
|
||||||
// is still valid, although refers to previous iteration.
|
// valid, although refers to previous iteration.
|
||||||
if (Signals.stop)
|
if (Signals.stop)
|
||||||
break;
|
return;
|
||||||
|
|
||||||
// Send full PV info to GUI if we are going to leave the loop or
|
|
||||||
// if we have a fail high/low and we are deep in the search.
|
|
||||||
if ((bestValue > alpha && bestValue < beta) || Time::now() - SearchTime > 2000)
|
|
||||||
sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl;
|
|
||||||
|
|
||||||
// In case of failing high/low increase aspiration window and
|
// In case of failing high/low increase aspiration window and
|
||||||
// research, otherwise exit the fail high/low loop.
|
// research, otherwise sort multi-PV lines and exit the loop.
|
||||||
if (bestValue >= beta)
|
if (bestValue > alpha && bestValue < beta)
|
||||||
|
{
|
||||||
|
sort<RootMove>(RootMoves.begin(), RootMoves.begin() + PVIdx);
|
||||||
|
sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 += delta;
|
beta += delta;
|
||||||
delta += delta / 2;
|
delta += delta / 2;
|
||||||
}
|
}
|
||||||
else if (bestValue <= alpha)
|
else
|
||||||
{
|
{
|
||||||
Signals.failedLowAtRoot = true;
|
Signals.failedLowAtRoot = true;
|
||||||
Signals.stopOnPonderhit = false;
|
Signals.stopOnPonderhit = false;
|
||||||
|
@ -375,15 +389,6 @@ namespace {
|
||||||
alpha -= delta;
|
alpha -= delta;
|
||||||
delta += delta / 2;
|
delta += delta / 2;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Search with full window in case we have a win/mate score
|
|
||||||
if (abs(bestValue) >= VALUE_KNOWN_WIN)
|
|
||||||
{
|
|
||||||
alpha = -VALUE_INFINITE;
|
|
||||||
beta = VALUE_INFINITE;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(alpha >= -VALUE_INFINITE && beta <= VALUE_INFINITE);
|
assert(alpha >= -VALUE_INFINITE && beta <= VALUE_INFINITE);
|
||||||
}
|
}
|
||||||
|
@ -393,7 +398,7 @@ namespace {
|
||||||
if (SkillLevelEnabled && depth == 1 + SkillLevel)
|
if (SkillLevelEnabled && depth == 1 + SkillLevel)
|
||||||
skillBest = do_skill_level();
|
skillBest = do_skill_level();
|
||||||
|
|
||||||
if (!Signals.stop && Options["Use Search Log"])
|
if (Options["Use Search Log"])
|
||||||
{
|
{
|
||||||
Log log(Options["Search Log Filename"]);
|
Log log(Options["Search Log Filename"]);
|
||||||
log << pretty_pv(pos, depth, bestValue, Time::now() - SearchTime, &RootMoves[0].pv[0])
|
log << pretty_pv(pos, depth, bestValue, Time::now() - SearchTime, &RootMoves[0].pv[0])
|
||||||
|
@ -405,7 +410,7 @@ namespace {
|
||||||
bestMoveNeverChanged = false;
|
bestMoveNeverChanged = false;
|
||||||
|
|
||||||
// Do we have time for the next iteration? Can we stop searching now?
|
// Do we have time for the next iteration? Can we stop searching now?
|
||||||
if (!Signals.stop && !Signals.stopOnPonderhit && Limits.use_time_management())
|
if (Limits.use_time_management() && !Signals.stopOnPonderhit)
|
||||||
{
|
{
|
||||||
bool stop = false; // Local variable, not the volatile Signals.stop
|
bool stop = false; // Local variable, not the volatile Signals.stop
|
||||||
|
|
||||||
|
@ -447,15 +452,6 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// When using skills swap best PV line with the sub-optimal one
|
|
||||||
if (SkillLevelEnabled)
|
|
||||||
{
|
|
||||||
if (skillBest == MOVE_NONE) // Still unassigned ?
|
|
||||||
skillBest = do_skill_level();
|
|
||||||
|
|
||||||
std::swap(RootMoves[0], *std::find(RootMoves.begin(), RootMoves.end(), skillBest));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -821,8 +817,8 @@ split_point_start: // At split points actual search starts from here
|
||||||
// on all the other moves but the ttMove, if result is lower than ttValue minus
|
// on all the other moves but the ttMove, if result is lower than ttValue minus
|
||||||
// a margin then we extend ttMove.
|
// a margin then we extend ttMove.
|
||||||
if ( singularExtensionNode
|
if ( singularExtensionNode
|
||||||
&& !ext
|
|
||||||
&& move == ttMove
|
&& move == ttMove
|
||||||
|
&& !ext
|
||||||
&& pos.pl_move_is_legal(move, ci.pinned)
|
&& pos.pl_move_is_legal(move, ci.pinned)
|
||||||
&& abs(ttValue) < VALUE_KNOWN_WIN)
|
&& abs(ttValue) < VALUE_KNOWN_WIN)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue