mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 08:43:09 +00:00
Call cycle detection before qsearch()
This has the property of raising alpha before calling qsearch(), thus maybe giving some more cuts during qsearch(). The patch is equivalent to the use of cycle detection inside qsearch() at depth 0, but is in fact implemented by re-ordering code inside search(), which explains the [0..4] bounds in the following tests. STC (interrupted after 124250 games, with LLR=0.87): http://tests.stockfishchess.org/tests/view/5b1500bd0ebc5902a8b420bf LLR: 0.87 (-2.94,2.94) [0.00,4.00] Total: 124250 W: 24973 L: 24470 D: 74807 LTC: http://tests.stockfishchess.org/tests/view/5b1590eb0ebc5902a84dcd09 LLR: 2.96 (-2.94,2.94) [0.00,4.00] Total: 74234 W: 11098 L: 10733 D: 52403 Closes https://github.com/official-stockfish/Stockfish/pull/1635 Bench: 4326784
This commit is contained in:
parent
9597ad8cab
commit
e4f8a4fa7f
1 changed files with 16 additions and 15 deletions
|
@ -519,13 +519,25 @@ namespace {
|
||||||
template <NodeType NT>
|
template <NodeType NT>
|
||||||
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode) {
|
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode) {
|
||||||
|
|
||||||
// Use quiescence search when needed
|
|
||||||
if (depth < ONE_PLY)
|
|
||||||
return qsearch<NT>(pos, ss, alpha, beta);
|
|
||||||
|
|
||||||
constexpr bool PvNode = NT == PV;
|
constexpr bool PvNode = NT == PV;
|
||||||
const bool rootNode = PvNode && ss->ply == 0;
|
const bool rootNode = PvNode && ss->ply == 0;
|
||||||
|
|
||||||
|
// Check if we have an upcoming move which draws by repetition, or
|
||||||
|
// if the opponent had an alternative move earlier to this position.
|
||||||
|
if ( pos.rule50_count() >= 3
|
||||||
|
&& alpha < VALUE_DRAW
|
||||||
|
&& !rootNode
|
||||||
|
&& pos.has_game_cycle(ss->ply))
|
||||||
|
{
|
||||||
|
alpha = VALUE_DRAW;
|
||||||
|
if (alpha >= beta)
|
||||||
|
return alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dive into quiescence search when the depth reaches zero
|
||||||
|
if (depth < ONE_PLY)
|
||||||
|
return qsearch<NT>(pos, ss, alpha, beta);
|
||||||
|
|
||||||
assert(-VALUE_INFINITE <= alpha && alpha < beta && beta <= VALUE_INFINITE);
|
assert(-VALUE_INFINITE <= alpha && alpha < beta && beta <= VALUE_INFINITE);
|
||||||
assert(PvNode || (alpha == beta - 1));
|
assert(PvNode || (alpha == beta - 1));
|
||||||
assert(DEPTH_ZERO < depth && depth < DEPTH_MAX);
|
assert(DEPTH_ZERO < depth && depth < DEPTH_MAX);
|
||||||
|
@ -578,17 +590,6 @@ namespace {
|
||||||
beta = std::min(mate_in(ss->ply+1), beta);
|
beta = std::min(mate_in(ss->ply+1), beta);
|
||||||
if (alpha >= beta)
|
if (alpha >= beta)
|
||||||
return alpha;
|
return alpha;
|
||||||
|
|
||||||
// Check if there exists a move which draws by repetition, or an alternative
|
|
||||||
// earlier move to this position.
|
|
||||||
if ( pos.rule50_count() >= 3
|
|
||||||
&& alpha < VALUE_DRAW
|
|
||||||
&& pos.has_game_cycle(ss->ply))
|
|
||||||
{
|
|
||||||
alpha = VALUE_DRAW;
|
|
||||||
if (alpha >= beta)
|
|
||||||
return alpha;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(0 <= ss->ply && ss->ply < MAX_PLY);
|
assert(0 <= ss->ply && ss->ply < MAX_PLY);
|
||||||
|
|
Loading…
Add table
Reference in a new issue