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
Lyudmil Antonov (lantonov)
Matthew Lai (matthewlai)
Matthew Sullivan
Lyudmil Antonov (lantonov)
Matthew Lai (matthewlai)
Matthew Sullivan
Michael Byrne (MichaelB7)
Michael Stembera (mstembera)
Michel Van den Bergh (vdbergh)
Michael Byrne (MichaelB7)
Michael Stembera (mstembera)
Michel Van den Bergh (vdbergh)
+Mikael Bäckman (mbootsector)
Mike Whiteley (protonspring)
Miroslav Fontán (Hexik)
Mohammed Li (tthsqe12)
Nathan Rugg (nmrugg)
Nicklas Persson (NicklasPersson)
Niklas Fiekas (niklasf)
Mike Whiteley (protonspring)
Miroslav Fontán (Hexik)
Mohammed Li (tthsqe12)
Nathan Rugg (nmrugg)
Nicklas Persson (NicklasPersson)
Niklas Fiekas (niklasf)
Oskar Werkelin Ahlin
Pablo Vazquez
Pascal Romaret
Oskar Werkelin Ahlin
Pablo Vazquez
Pascal Romaret
template <NodeType NT>
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode, bool skipEarlyPruning);
template <NodeType NT>
Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, bool cutNode, bool skipEarlyPruning);
- template <NodeType NT, bool InCheck>
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth = DEPTH_ZERO);
Value value_to_tt(Value v, int ply);
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth = DEPTH_ZERO);
Value value_to_tt(Value v, int ply);
{
if ( depth == ONE_PLY
&& eval + RazorMargin1 <= alpha)
{
if ( depth == ONE_PLY
&& 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)
{
Value ralpha = alpha - RazorMargin2;
else if (eval + RazorMargin2 <= alpha)
{
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)
return v;
if (v <= ralpha)
return v;
ss->contHistory = thisThread->contHistory[NO_PIECE][0].get();
pos.do_null_move(st);
ss->contHistory = thisThread->contHistory[NO_PIECE][0].get();
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);
pos.undo_null_move();
: - search<NonPV>(pos, ss+1, -beta, -beta+1, depth-R, !cutNode, true);
pos.undo_null_move();
thisThread->nmp_ply = ss->ply + 3 * (depth-R) / 4;
thisThread->nmp_odd = ss->ply % 2;
thisThread->nmp_ply = ss->ply + 3 * (depth-R) / 4;
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);
thisThread->nmp_odd = thisThread->nmp_ply = 0;
: search<NonPV>(pos, ss, beta-1, beta, depth-R, false, true);
thisThread->nmp_odd = thisThread->nmp_ply = 0;
// Step 17. Full depth search when LMR is skipped or fails high
if (doFullDepthSearch)
// Step 17. Full depth search when LMR is skipped or fails high
if (doFullDepthSearch)
- value = newDepth < ONE_PLY ?
- givesCheck ? -qsearch<NonPV, true>(pos, ss+1, -(alpha+1), -alpha)
- : -qsearch<NonPV, false>(pos, ss+1, -(alpha+1), -alpha)
+ value = newDepth < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha)
: - 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
: - 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
(ss+1)->pv = pv;
(ss+1)->pv[0] = MOVE_NONE;
(ss+1)->pv = pv;
(ss+1)->pv[0] = MOVE_NONE;
- value = newDepth < ONE_PLY ?
- givesCheck ? -qsearch<PV, true>(pos, ss+1, -beta, -alpha)
- : -qsearch<PV, false>(pos, ss+1, -beta, -alpha)
+ value = newDepth < ONE_PLY ? -qsearch<PV>(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);
}
// 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.
// 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.
-
- template <NodeType NT, bool InCheck>
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth) {
const bool PvNode = NT == PV;
Value qsearch(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth) {
const bool PvNode = NT == PV;
+ const bool InCheck = bool(pos.checkers());
assert(alpha >= -VALUE_INFINITE && alpha < beta && beta <= VALUE_INFINITE);
assert(PvNode || (alpha == beta - 1));
assert(depth <= DEPTH_ZERO);
assert(depth / ONE_PLY * ONE_PLY == depth);
assert(alpha >= -VALUE_INFINITE && alpha < beta && beta <= VALUE_INFINITE);
assert(PvNode || (alpha == beta - 1));
assert(depth <= DEPTH_ZERO);
assert(depth / ONE_PLY * ONE_PLY == depth);
- assert(InCheck == bool(pos.checkers()));
Move pv[MAX_PLY+1];
StateInfo st;
Move pv[MAX_PLY+1];
StateInfo st;
// Make and search the move
pos.do_move(move, st, givesCheck);
// Make and search the move
pos.do_move(move, st, givesCheck);
- value = givesCheck ? -qsearch<NT, true>(pos, ss+1, -beta, -alpha, depth - ONE_PLY)
- : -qsearch<NT, false>(pos, ss+1, -beta, -alpha, depth - ONE_PLY);
+ value = -qsearch<NT>(pos, ss+1, -beta, -alpha, depth - ONE_PLY);
pos.undo_move(move);
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);
pos.undo_move(move);
assert(value > -VALUE_INFINITE && value < VALUE_INFINITE);