mirror of
https://github.com/peterosterlund2/droidfish.git
synced 2024-11-23 19:34:08 +01:00
DroidFish: Improve mate finding in endgames.
Include the early_mate code from https://github.com/syzygy1/Stockfish/tree/early_mate
This commit is contained in:
parent
4b6418cb02
commit
2570cd2871
|
@ -541,7 +541,7 @@ namespace {
|
||||||
Key posKey;
|
Key posKey;
|
||||||
Move ttMove, move, excludedMove, bestMove;
|
Move ttMove, move, excludedMove, bestMove;
|
||||||
Depth extension, newDepth;
|
Depth extension, newDepth;
|
||||||
Value bestValue, value, ttValue, eval;
|
Value bestValue, value, ttValue, eval, maxValue;
|
||||||
bool ttHit, inCheck, givesCheck, singularExtensionNode, improving;
|
bool ttHit, inCheck, givesCheck, singularExtensionNode, improving;
|
||||||
bool captureOrPromotion, doFullDepthSearch, moveCountPruning, skipQuiets, ttCapture;
|
bool captureOrPromotion, doFullDepthSearch, moveCountPruning, skipQuiets, ttCapture;
|
||||||
Piece movedPiece;
|
Piece movedPiece;
|
||||||
|
@ -553,6 +553,7 @@ namespace {
|
||||||
moveCount = quietCount = ss->moveCount = 0;
|
moveCount = quietCount = ss->moveCount = 0;
|
||||||
ss->statScore = 0;
|
ss->statScore = 0;
|
||||||
bestValue = -VALUE_INFINITE;
|
bestValue = -VALUE_INFINITE;
|
||||||
|
maxValue = VALUE_INFINITE;
|
||||||
ss->ply = (ss-1)->ply + 1;
|
ss->ply = (ss-1)->ply + 1;
|
||||||
|
|
||||||
// Check for the available remaining time
|
// Check for the available remaining time
|
||||||
|
@ -641,7 +642,7 @@ namespace {
|
||||||
&& !pos.can_castle(ANY_CASTLING))
|
&& !pos.can_castle(ANY_CASTLING))
|
||||||
{
|
{
|
||||||
TB::ProbeState err;
|
TB::ProbeState err;
|
||||||
TB::WDLScore v = Tablebases::probe_wdl(pos, &err);
|
TB::WDLScore wdl = Tablebases::probe_wdl(pos, &err);
|
||||||
|
|
||||||
if (err != TB::ProbeState::FAIL)
|
if (err != TB::ProbeState::FAIL)
|
||||||
{
|
{
|
||||||
|
@ -649,16 +650,31 @@ namespace {
|
||||||
|
|
||||||
int drawScore = TB::UseRule50 ? 1 : 0;
|
int drawScore = TB::UseRule50 ? 1 : 0;
|
||||||
|
|
||||||
value = v < -drawScore ? -VALUE_MATE + MAX_PLY + ss->ply
|
value = wdl < -drawScore ? -VALUE_MATE + MAX_PLY + ss->ply
|
||||||
: v > drawScore ? VALUE_MATE - MAX_PLY - ss->ply
|
: wdl > drawScore ? VALUE_MATE - MAX_PLY - ss->ply
|
||||||
: VALUE_DRAW + 2 * v * drawScore;
|
: VALUE_DRAW + 2 * wdl * drawScore;
|
||||||
|
|
||||||
tte->save(posKey, value_to_tt(value, ss->ply), BOUND_EXACT,
|
Bound b = wdl < -drawScore ? BOUND_UPPER
|
||||||
|
: wdl > drawScore ? BOUND_LOWER : BOUND_EXACT;
|
||||||
|
|
||||||
|
if ( b == BOUND_EXACT
|
||||||
|
|| (b == BOUND_LOWER ? value >= beta : value <= alpha))
|
||||||
|
{
|
||||||
|
tte->save(posKey, value_to_tt(value, ss->ply), b,
|
||||||
std::min(DEPTH_MAX - ONE_PLY, depth + 6 * ONE_PLY),
|
std::min(DEPTH_MAX - ONE_PLY, depth + 6 * ONE_PLY),
|
||||||
MOVE_NONE, VALUE_NONE, TT.generation());
|
MOVE_NONE, VALUE_NONE, TT.generation());
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PvNode)
|
||||||
|
{
|
||||||
|
if (b == BOUND_LOWER)
|
||||||
|
bestValue = value, alpha = std::max(alpha, bestValue);
|
||||||
|
else
|
||||||
|
maxValue = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1120,6 +1136,9 @@ moves_loop: // When in check search starts from here
|
||||||
&& is_ok((ss-1)->currentMove))
|
&& is_ok((ss-1)->currentMove))
|
||||||
update_continuation_histories(ss-1, pos.piece_on(prevSq), prevSq, stat_bonus(depth));
|
update_continuation_histories(ss-1, pos.piece_on(prevSq), prevSq, stat_bonus(depth));
|
||||||
|
|
||||||
|
if (PvNode)
|
||||||
|
bestValue = std::min(bestValue, maxValue);
|
||||||
|
|
||||||
if (!excludedMove)
|
if (!excludedMove)
|
||||||
tte->save(posKey, value_to_tt(bestValue, ss->ply),
|
tte->save(posKey, value_to_tt(bestValue, ss->ply),
|
||||||
bestValue >= beta ? BOUND_LOWER :
|
bestValue >= beta ? BOUND_LOWER :
|
||||||
|
@ -1616,4 +1635,9 @@ void Tablebases::filter_root_moves(Position& pos, Search::RootMoves& rootMoves)
|
||||||
TB::Score = TB::Score > VALUE_DRAW ? VALUE_MATE - MAX_PLY - 1
|
TB::Score = TB::Score > VALUE_DRAW ? VALUE_MATE - MAX_PLY - 1
|
||||||
: TB::Score < VALUE_DRAW ? -VALUE_MATE + MAX_PLY + 1
|
: TB::Score < VALUE_DRAW ? -VALUE_MATE + MAX_PLY + 1
|
||||||
: VALUE_DRAW;
|
: VALUE_DRAW;
|
||||||
|
|
||||||
|
// Since root_probe() and root_probe_wdl() dirty the root move scores,
|
||||||
|
// we reset them to -VALUE_INFINITE
|
||||||
|
for (RootMove& rm : rootMoves)
|
||||||
|
rm.score = -VALUE_INFINITE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user