1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-01 01:03:09 +00:00

Move draw checks right after doing the move

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Joona Kiiski 2011-07-12 00:09:50 +03:00 committed by Marco Costalba
parent 07e0dd27fb
commit 969ad8001c

View file

@ -726,7 +726,7 @@ namespace {
if (PvNode && thread.maxPly < ss->ply) if (PvNode && thread.maxPly < ss->ply)
thread.maxPly = ss->ply; thread.maxPly = ss->ply;
// Step 1. Initialize node and poll. Polling can abort search // Step 1. Initialize node.
if (!SpNode) if (!SpNode)
{ {
ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE; ss->currentMove = ss->bestMove = threatMove = (ss+1)->excludedMove = MOVE_NONE;
@ -742,18 +742,6 @@ namespace {
goto split_point_start; goto split_point_start;
} }
if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
{
NodesSincePoll = 0;
poll(pos);
}
// Step 2. Check for aborted search and immediate draw
if (( StopRequest
|| pos.is_draw<false>()
|| ss->ply > PLY_MAX) && !RootNode)
return VALUE_DRAW;
// Step 3. Mate distance pruning // Step 3. Mate distance pruning
if (!RootNode) if (!RootNode)
{ {
@ -914,7 +902,12 @@ namespace {
if (pos.pl_move_is_legal(move, ci.pinned)) if (pos.pl_move_is_legal(move, ci.pinned))
{ {
pos.do_move(move, st, ci, pos.move_gives_check(move, ci)); pos.do_move(move, st, ci, pos.move_gives_check(move, ci));
value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
if (pos.is_draw<false>() || ss->ply + 1 > PLY_MAX)
value = VALUE_DRAW;
else
value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth);
pos.undo_move(move); pos.undo_move(move);
if (value >= rbeta) if (value >= rbeta)
return value; return value;
@ -1104,6 +1097,22 @@ split_point_start: // At split points actual search starts from here
// Step 14. Make the move // Step 14. Make the move
pos.do_move(move, st, ci, givesCheck); pos.do_move(move, st, ci, givesCheck);
// Step XX. Poll. Check if search should be aborted.
if (pos.thread() == 0 && ++NodesSincePoll > NodesBetweenPolls)
{
NodesSincePoll = 0;
poll(pos);
}
// Step XX. Check for aborted search and immediate draw
if ( StopRequest
|| pos.is_draw<false>()
|| ss->ply + 1 > PLY_MAX)
{
value = VALUE_DRAW;
goto undo;
}
// Step extra. pv search (only in PV nodes) // Step extra. pv search (only in PV nodes)
// The first move in list is the expected PV // The first move in list is the expected PV
if (isPvMove) if (isPvMove)
@ -1150,6 +1159,7 @@ split_point_start: // At split points actual search starts from here
} }
// Step 17. Undo move // Step 17. Undo move
undo:
pos.undo_move(move); pos.undo_move(move);
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE); assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);