mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 08:43:09 +00:00
qsearch(): remove inCheck as a template parameter
Simplifies a bit, and avoids bugs as in #1478 Passed STC: LLR: 2.95 (-2.94,2.94) [-3.00,1.00] Total: 104862 W: 21302 L: 21337 D: 62223 http://tests.stockfishchess.org/tests/view/5aa6de1b0ebc590297810097 Closes https://github.com/official-stockfish/Stockfish/pull/1484 No functional change
This commit is contained in:
parent
840605c14e
commit
efe702e9f5
2 changed files with 12 additions and 17 deletions
3
AUTHORS
3
AUTHORS
|
@ -77,16 +77,17 @@ Lucas Braesch (lucasart)
|
||||||
Lyudmil Antonov (lantonov)
|
Lyudmil Antonov (lantonov)
|
||||||
Matthew Lai (matthewlai)
|
Matthew Lai (matthewlai)
|
||||||
Matthew Sullivan
|
Matthew Sullivan
|
||||||
mbootsector
|
|
||||||
Michael Byrne (MichaelB7)
|
Michael Byrne (MichaelB7)
|
||||||
Michael Stembera (mstembera)
|
Michael Stembera (mstembera)
|
||||||
Michel Van den Bergh (vdbergh)
|
Michel Van den Bergh (vdbergh)
|
||||||
|
Mikael Bäckman (mbootsector)
|
||||||
Mike Whiteley (protonspring)
|
Mike Whiteley (protonspring)
|
||||||
Miroslav Fontán (Hexik)
|
Miroslav Fontán (Hexik)
|
||||||
Mohammed Li (tthsqe12)
|
Mohammed Li (tthsqe12)
|
||||||
Nathan Rugg (nmrugg)
|
Nathan Rugg (nmrugg)
|
||||||
Nicklas Persson (NicklasPersson)
|
Nicklas Persson (NicklasPersson)
|
||||||
Niklas Fiekas (niklasf)
|
Niklas Fiekas (niklasf)
|
||||||
|
noobpwnftw
|
||||||
Oskar Werkelin Ahlin
|
Oskar Werkelin Ahlin
|
||||||
Pablo Vazquez
|
Pablo Vazquez
|
||||||
Pascal Romaret
|
Pascal Romaret
|
||||||
|
|
|
@ -101,7 +101,7 @@ namespace {
|
||||||
template <NodeType NT>
|
template <NodeType NT>
|
||||||
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode, bool skipEarlyPruning);
|
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode, bool skipEarlyPruning);
|
||||||
|
|
||||||
template <NodeType NT, bool InCheck>
|
template <NodeType NT>
|
||||||
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth = DEPTH_ZERO);
|
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth = DEPTH_ZERO);
|
||||||
|
|
||||||
Value value_to_tt(Value v, int ply);
|
Value value_to_tt(Value v, int ply);
|
||||||
|
@ -690,12 +690,12 @@ namespace {
|
||||||
{
|
{
|
||||||
if ( depth == ONE_PLY
|
if ( depth == ONE_PLY
|
||||||
&& eval + RazorMargin1 <= alpha)
|
&& eval + RazorMargin1 <= alpha)
|
||||||
return qsearch<NonPV, false>(pos, ss, alpha, alpha+1);
|
return qsearch<NonPV>(pos, ss, alpha, alpha+1);
|
||||||
|
|
||||||
else if (eval + RazorMargin2 <= alpha)
|
else if (eval + RazorMargin2 <= alpha)
|
||||||
{
|
{
|
||||||
Value ralpha = alpha - RazorMargin2;
|
Value ralpha = alpha - RazorMargin2;
|
||||||
Value v = qsearch<NonPV, false>(pos, ss, ralpha, ralpha+1);
|
Value v = qsearch<NonPV>(pos, ss, ralpha, ralpha+1);
|
||||||
|
|
||||||
if (v <= ralpha)
|
if (v <= ralpha)
|
||||||
return v;
|
return v;
|
||||||
|
@ -724,7 +724,7 @@ namespace {
|
||||||
ss->contHistory = thisThread->contHistory[NO_PIECE][0].get();
|
ss->contHistory = thisThread->contHistory[NO_PIECE][0].get();
|
||||||
|
|
||||||
pos.do_null_move(st);
|
pos.do_null_move(st);
|
||||||
Value nullValue = depth-R < ONE_PLY ? -qsearch<NonPV, false>(pos, ss+1, -beta, -beta+1)
|
Value nullValue = depth-R < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -beta, -beta+1)
|
||||||
: - search<NonPV>(pos, ss+1, -beta, -beta+1, depth-R, !cutNode, true);
|
: - search<NonPV>(pos, ss+1, -beta, -beta+1, depth-R, !cutNode, true);
|
||||||
pos.undo_null_move();
|
pos.undo_null_move();
|
||||||
|
|
||||||
|
@ -742,7 +742,7 @@ namespace {
|
||||||
thisThread->nmp_ply = ss->ply + 3 * (depth-R) / 4;
|
thisThread->nmp_ply = ss->ply + 3 * (depth-R) / 4;
|
||||||
thisThread->nmp_odd = ss->ply % 2;
|
thisThread->nmp_odd = ss->ply % 2;
|
||||||
|
|
||||||
Value v = depth-R < ONE_PLY ? qsearch<NonPV, false>(pos, ss, beta-1, beta)
|
Value v = depth-R < ONE_PLY ? qsearch<NonPV>(pos, ss, beta-1, beta)
|
||||||
: search<NonPV>(pos, ss, beta-1, beta, depth-R, false, true);
|
: search<NonPV>(pos, ss, beta-1, beta, depth-R, false, true);
|
||||||
|
|
||||||
thisThread->nmp_odd = thisThread->nmp_ply = 0;
|
thisThread->nmp_odd = thisThread->nmp_ply = 0;
|
||||||
|
@ -1013,9 +1013,7 @@ moves_loop: // When in check, search starts from here
|
||||||
|
|
||||||
// Step 17. Full depth search when LMR is skipped or fails high
|
// Step 17. Full depth search when LMR is skipped or fails high
|
||||||
if (doFullDepthSearch)
|
if (doFullDepthSearch)
|
||||||
value = newDepth < ONE_PLY ?
|
value = newDepth < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha)
|
||||||
givesCheck ? -qsearch<NonPV, true>(pos, ss+1, -(alpha+1), -alpha)
|
|
||||||
: -qsearch<NonPV, false>(pos, ss+1, -(alpha+1), -alpha)
|
|
||||||
: - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth, !cutNode, false);
|
: - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth, !cutNode, false);
|
||||||
|
|
||||||
// For PV nodes only, do a full PV search on the first move or after a fail
|
// For PV nodes only, do a full PV search on the first move or after a fail
|
||||||
|
@ -1026,9 +1024,7 @@ moves_loop: // When in check, search starts from here
|
||||||
(ss+1)->pv = pv;
|
(ss+1)->pv = pv;
|
||||||
(ss+1)->pv[0] = MOVE_NONE;
|
(ss+1)->pv[0] = MOVE_NONE;
|
||||||
|
|
||||||
value = newDepth < ONE_PLY ?
|
value = newDepth < ONE_PLY ? -qsearch<PV>(pos, ss+1, -beta, -alpha)
|
||||||
givesCheck ? -qsearch<PV, true>(pos, ss+1, -beta, -alpha)
|
|
||||||
: -qsearch<PV, false>(pos, ss+1, -beta, -alpha)
|
|
||||||
: - search<PV>(pos, ss+1, -beta, -alpha, newDepth, false, false);
|
: - search<PV>(pos, ss+1, -beta, -alpha, newDepth, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1158,17 +1154,16 @@ moves_loop: // When in check, search starts from here
|
||||||
|
|
||||||
// qsearch() is the quiescence search function, which is called by the main
|
// qsearch() is the quiescence search function, which is called by the main
|
||||||
// search function with depth zero, or recursively with depth less than ONE_PLY.
|
// search function with depth zero, or recursively with depth less than ONE_PLY.
|
||||||
|
template <NodeType NT>
|
||||||
template <NodeType NT, bool InCheck>
|
|
||||||
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth) {
|
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth) {
|
||||||
|
|
||||||
const bool PvNode = NT == PV;
|
const bool PvNode = NT == PV;
|
||||||
|
const bool InCheck = bool(pos.checkers());
|
||||||
|
|
||||||
assert(alpha >= -VALUE_INFINITE && alpha < beta && beta <= VALUE_INFINITE);
|
assert(alpha >= -VALUE_INFINITE && alpha < beta && beta <= VALUE_INFINITE);
|
||||||
assert(PvNode || (alpha == beta - 1));
|
assert(PvNode || (alpha == beta - 1));
|
||||||
assert(depth <= DEPTH_ZERO);
|
assert(depth <= DEPTH_ZERO);
|
||||||
assert(depth / ONE_PLY * ONE_PLY == depth);
|
assert(depth / ONE_PLY * ONE_PLY == depth);
|
||||||
assert(InCheck == bool(pos.checkers()));
|
|
||||||
|
|
||||||
Move pv[MAX_PLY+1];
|
Move pv[MAX_PLY+1];
|
||||||
StateInfo st;
|
StateInfo st;
|
||||||
|
@ -1320,8 +1315,7 @@ moves_loop: // When in check, search starts from here
|
||||||
|
|
||||||
// Make and search the move
|
// Make and search the move
|
||||||
pos.do_move(move, st, givesCheck);
|
pos.do_move(move, st, givesCheck);
|
||||||
value = givesCheck ? -qsearch<NT, true>(pos, ss+1, -beta, -alpha, depth - ONE_PLY)
|
value = -qsearch<NT>(pos, ss+1, -beta, -alpha, depth - ONE_PLY);
|
||||||
: -qsearch<NT, false>(pos, ss+1, -beta, -alpha, depth - ONE_PLY);
|
|
||||||
pos.undo_move(move);
|
pos.undo_move(move);
|
||||||
|
|
||||||
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
|
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
|
||||||
|
|
Loading…
Add table
Reference in a new issue