mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-22 12:47:08 +00:00
Do more extensions in nodes far from the root
Parameters found by @FauziAkram in the latest tune. Passed VVLTC w/ LTC Bound: LLR: 2.95 (-2.94,2.94) <0.50,2.50> Total: 243264 W: 63452 L: 62774 D: 117038 Ptnml(0-2): 18, 22494, 75934, 23164, 22 https://tests.stockfishchess.org/tests/view/680e82b23629b02d74b15e27 Passed VVLTC w/ STC Bound: LLR: 2.94 (-2.94,2.94) <0.00,2.00> Total: 37838 W: 9935 L: 9667 D: 18236 Ptnml(0-2): 6, 3383, 11873, 3651, 6 https://tests.stockfishchess.org/tests/view/681e707a3629b02d74b176e8 STC Elo Estimate: Elo: -0.49 ± 2.4 (95%) LOS: 34.8% Total: 20000 W: 5118 L: 5146 D: 9736 Ptnml(0-2): 55, 2365, 5182, 2349, 49 nElo: -0.96 ± 4.8 (95%) PairsRatio: 0.99 https://tests.stockfishchess.org/tests/view/6822af4b3629b02d74b17be6 closes https://github.com/official-stockfish/Stockfish/pull/6059 Bench: 2135382
This commit is contained in:
+55
-59
@@ -1100,72 +1100,68 @@ moves_loop: // When in check, search starts here
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Step 15. Extensions
|
// Step 15. Extensions
|
||||||
// We take care to not overdo to avoid search getting stuck.
|
// Singular extension search. If all moves but one
|
||||||
if (ss->ply < thisThread->rootDepth * 2)
|
// fail low on a search of (alpha-s, beta-s), and just one fails high on
|
||||||
|
// (alpha, beta), then that move is singular and should be extended. To
|
||||||
|
// verify this we do a reduced search on the position excluding the ttMove
|
||||||
|
// and if the result is lower than ttValue minus a margin, then we will
|
||||||
|
// extend the ttMove. Recursive singular search is avoided.
|
||||||
|
|
||||||
|
// (*Scaler) Generally, higher singularBeta (i.e closer to ttValue)
|
||||||
|
// and lower extension margins scale well.
|
||||||
|
|
||||||
|
if (!rootNode && move == ttData.move && !excludedMove
|
||||||
|
&& depth >= 6 - (thisThread->completedDepth > 27) + ss->ttPv && is_valid(ttData.value)
|
||||||
|
&& !is_decisive(ttData.value) && (ttData.bound & BOUND_LOWER)
|
||||||
|
&& ttData.depth >= depth - 3)
|
||||||
{
|
{
|
||||||
// Singular extension search. If all moves but one
|
Value singularBeta = ttData.value - (58 + 76 * (ss->ttPv && !PvNode)) * depth / 57;
|
||||||
// fail low on a search of (alpha-s, beta-s), and just one fails high on
|
Depth singularDepth = newDepth / 2;
|
||||||
// (alpha, beta), then that move is singular and should be extended. To
|
|
||||||
// verify this we do a reduced search on the position excluding the ttMove
|
|
||||||
// and if the result is lower than ttValue minus a margin, then we will
|
|
||||||
// extend the ttMove. Recursive singular search is avoided.
|
|
||||||
|
|
||||||
// (*Scaler) Generally, higher singularBeta (i.e closer to ttValue)
|
ss->excludedMove = move;
|
||||||
// and lower extension margins scale well.
|
value = search<NonPV>(pos, ss, singularBeta - 1, singularBeta, singularDepth, cutNode);
|
||||||
|
ss->excludedMove = Move::none();
|
||||||
|
|
||||||
if (!rootNode && move == ttData.move && !excludedMove
|
if (value < singularBeta)
|
||||||
&& depth >= 6 - (thisThread->completedDepth > 27) + ss->ttPv
|
|
||||||
&& is_valid(ttData.value) && !is_decisive(ttData.value)
|
|
||||||
&& (ttData.bound & BOUND_LOWER) && ttData.depth >= depth - 3)
|
|
||||||
{
|
{
|
||||||
Value singularBeta = ttData.value - (58 + 76 * (ss->ttPv && !PvNode)) * depth / 57;
|
int corrValAdj1 = std::abs(correctionValue) / 248400;
|
||||||
Depth singularDepth = newDepth / 2;
|
int corrValAdj2 = std::abs(correctionValue) / 249757;
|
||||||
|
int doubleMargin = -4 + 244 * PvNode - 206 * !ttCapture - corrValAdj1
|
||||||
|
- 997 * ttMoveHistory / 131072
|
||||||
|
- (ss->ply * 2 > thisThread->rootDepth * 3) * 47;
|
||||||
|
int tripleMargin = 84 + 269 * PvNode - 253 * !ttCapture + 91 * ss->ttPv
|
||||||
|
- corrValAdj2 - (ss->ply * 2 > thisThread->rootDepth * 3) * 54;
|
||||||
|
|
||||||
ss->excludedMove = move;
|
extension =
|
||||||
value =
|
1 + (value < singularBeta - doubleMargin) + (value < singularBeta - tripleMargin);
|
||||||
search<NonPV>(pos, ss, singularBeta - 1, singularBeta, singularDepth, cutNode);
|
|
||||||
ss->excludedMove = Move::none();
|
|
||||||
|
|
||||||
if (value < singularBeta)
|
depth++;
|
||||||
{
|
|
||||||
int corrValAdj1 = std::abs(correctionValue) / 248400;
|
|
||||||
int corrValAdj2 = std::abs(correctionValue) / 249757;
|
|
||||||
int doubleMargin = -4 + 244 * PvNode - 206 * !ttCapture - corrValAdj1
|
|
||||||
- 997 * ttMoveHistory / 131072;
|
|
||||||
int tripleMargin =
|
|
||||||
84 + 269 * PvNode - 253 * !ttCapture + 91 * ss->ttPv - corrValAdj2;
|
|
||||||
|
|
||||||
extension = 1 + (value < singularBeta - doubleMargin)
|
|
||||||
+ (value < singularBeta - tripleMargin);
|
|
||||||
|
|
||||||
depth++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Multi-cut pruning
|
|
||||||
// Our ttMove is assumed to fail high based on the bound of the TT entry,
|
|
||||||
// and if after excluding the ttMove with a reduced search we fail high
|
|
||||||
// over the original beta, we assume this expected cut-node is not
|
|
||||||
// singular (multiple moves fail high), and we can prune the whole
|
|
||||||
// subtree by returning a softbound.
|
|
||||||
else if (value >= beta && !is_decisive(value))
|
|
||||||
return value;
|
|
||||||
|
|
||||||
// Negative extensions
|
|
||||||
// If other moves failed high over (ttValue - margin) without the
|
|
||||||
// ttMove on a reduced search, but we cannot do multi-cut because
|
|
||||||
// (ttValue - margin) is lower than the original beta, we do not know
|
|
||||||
// if the ttMove is singular or can do a multi-cut, so we reduce the
|
|
||||||
// ttMove in favor of other moves based on some conditions:
|
|
||||||
|
|
||||||
// If the ttMove is assumed to fail high over current beta
|
|
||||||
else if (ttData.value >= beta)
|
|
||||||
extension = -3;
|
|
||||||
|
|
||||||
// If we are on a cutNode but the ttMove is not assumed to fail high
|
|
||||||
// over current beta
|
|
||||||
else if (cutNode)
|
|
||||||
extension = -2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Multi-cut pruning
|
||||||
|
// Our ttMove is assumed to fail high based on the bound of the TT entry,
|
||||||
|
// and if after excluding the ttMove with a reduced search we fail high
|
||||||
|
// over the original beta, we assume this expected cut-node is not
|
||||||
|
// singular (multiple moves fail high), and we can prune the whole
|
||||||
|
// subtree by returning a softbound.
|
||||||
|
else if (value >= beta && !is_decisive(value))
|
||||||
|
return value;
|
||||||
|
|
||||||
|
// Negative extensions
|
||||||
|
// If other moves failed high over (ttValue - margin) without the
|
||||||
|
// ttMove on a reduced search, but we cannot do multi-cut because
|
||||||
|
// (ttValue - margin) is lower than the original beta, we do not know
|
||||||
|
// if the ttMove is singular or can do a multi-cut, so we reduce the
|
||||||
|
// ttMove in favor of other moves based on some conditions:
|
||||||
|
|
||||||
|
// If the ttMove is assumed to fail high over current beta
|
||||||
|
else if (ttData.value >= beta)
|
||||||
|
extension = -3;
|
||||||
|
|
||||||
|
// If we are on a cutNode but the ttMove is not assumed to fail high
|
||||||
|
// over current beta
|
||||||
|
else if (cutNode)
|
||||||
|
extension = -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 16. Make the move
|
// Step 16. Make the move
|
||||||
|
|||||||
Reference in New Issue
Block a user