Difference between revisions of "Improving"
(Move location of improving) |
(→Improving as a Modifier to Search Heuristics: add lmp link) |
||
(3 intermediate revisions by the same user not shown) | |||
Line 7: | Line 7: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
− | ! | + | ! Heuristic |
! Modification | ! Modification | ||
|- | |- | ||
Line 13: | Line 13: | ||
| style="text-align:left;" | Lower pruning margin when improving | | style="text-align:left;" | Lower pruning margin when improving | ||
|- | |- | ||
− | | [[Late Move Pruning]] | + | | [[Futility Pruning#MoveCountBasedPruning|Late Move Pruning]] |
| style="text-align:left;" | Prune more late quiet moves when not improving | | style="text-align:left;" | Prune more late quiet moves when not improving | ||
|- | |- | ||
Line 55: | Line 55: | ||
} | } | ||
</pre> | </pre> | ||
+ | |||
+ | [[Category:Search]] |
Revision as of 10:32, 5 July 2024
Improving is an important modifier for many search heuristics. It is a boolean flag indicating whether the static evaluation of a position has improved from the position two plys ago. Improving can be used to modify the frequency and aggressiveness of certain pruning heuristics.
Improving as a Modifier to Search Heuristics
Heuristic | Modification |
---|---|
Reverse Futility Pruning | Lower pruning margin when improving |
Late Move Pruning | Prune more late quiet moves when not improving |
ProbCut | Lower ProbCut beta threshold when improving |
Null Move Pruning | More NMP when improving. This can be done by allowing pruning even when eval is under beta (and above a certain threshold) when improving. |
Late Move Reductions | Reduce more when not improving / less when improving |
Code Example
The following code is taken from Alexandria. Note that in case the position is in check both 2 and 4 plies ago, improving can be set to either true or false. SPRT testing should be done to determine which of the two options is optimal for a given engine.
// Improving is a very important modifier to many heuristics. It checks if our static eval has improved since our last move. // As we don't evaluate in check, we look for the first ply we weren't in check between 2 and 4 plies ago. If we find that // static eval has improved, or that we were in check both 2 and 4 plies ago, we set improving to true. if(inCheck) improving = false; else if ((ss - 2)->staticEval != SCORE_NONE) { improving = ss->staticEval > (ss - 2)->staticEval; } else if ((ss - 4)->staticEval != SCORE_NONE) { improving = ss->staticEval > (ss - 4)->staticEval; } else improving = true;
This following code is from Integral. It demonstrates one common way to adjust LMP margin with improving.
const int lmp_threshold = (3 + depth * depth) / (2 - improving); if (is_quiet && moves_seen >= lmp_threshold) { move_picker.SkipQuiets(); continue; }