SelectiveDepth was ignored
Test results for the whole futility pruning series:
4CPU:
Orig - Mod: 959 - 1027 (+12 elo)
1CPU:
Orig - Mod: 763 - 830 (+15 elo)
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
Move ttMove, move;
Depth ext, newDepth;
Value bestValue, staticValue, nullValue, value, futilityValue, futilityValueScaled;
Move ttMove, move;
Depth ext, newDepth;
Value bestValue, staticValue, nullValue, value, futilityValue, futilityValueScaled;
- bool isCheck, useFutilityPruning, singleEvasion, moveIsCheck, captureOrPromotion, dangerous;
+ bool isCheck, singleEvasion, moveIsCheck, captureOrPromotion, dangerous;
bool mateThreat = false;
int moveCount = 0;
futilityValue = staticValue = bestValue = value = -VALUE_INFINITE;
bool mateThreat = false;
int moveCount = 0;
futilityValue = staticValue = bestValue = value = -VALUE_INFINITE;
}
// Post futility pruning
}
// Post futility pruning
- if (staticValue - PostFutilityValueMargin >= beta)
+ if (depth < SelectiveDepth && staticValue - PostFutilityValueMargin >= beta)
return (staticValue - PostFutilityValueMargin);
// Null move search
return (staticValue - PostFutilityValueMargin);
// Null move search
// to search all moves.
MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]);
CheckInfo ci(pos);
// to search all moves.
MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]);
CheckInfo ci(pos);
- useFutilityPruning = depth < SelectiveDepth && !isCheck;
// Loop through all legal moves until no moves remain or a beta cutoff occurs
while ( bestValue < beta
// Loop through all legal moves until no moves remain or a beta cutoff occurs
while ( bestValue < beta
// Futility pruning for captures
Color them = opposite_color(pos.side_to_move());
// Futility pruning for captures
Color them = opposite_color(pos.side_to_move());
- if ( useFutilityPruning
+ if ( !isCheck
+ && newDepth < SelectiveDepth
&& !dangerous
&& pos.move_is_capture(move)
&& !pos.move_is_check(move, ci)
&& !dangerous
&& pos.move_is_capture(move)
&& !pos.move_is_check(move, ci)
- if ( useFutilityPruning
&& !dangerous
&& !captureOrPromotion
&& !move_is_castle(move)
&& !dangerous
&& !captureOrPromotion
&& !move_is_castle(move)
if (red >= 1.0)
predictedDepth -= int(floor(red * int(OnePly)));
if (red >= 1.0)
predictedDepth -= int(floor(red * int(OnePly)));
- int preFutilityValueMargin = 0;
- if (predictedDepth >= OnePly)
- preFutilityValueMargin = 112 * bitScanReverse32(int(predictedDepth) * int(predictedDepth) / 2);
+ if (predictedDepth < SelectiveDepth)
+ {
+ int preFutilityValueMargin = 0;
+ if (predictedDepth >= OnePly)
+ preFutilityValueMargin = 112 * bitScanReverse32(int(predictedDepth) * int(predictedDepth) / 2);
- preFutilityValueMargin += MG.retrieve(pos.piece_on(move_from(move)), move_from(move), move_to(move)) + 45;
+ preFutilityValueMargin += MG.retrieve(pos.piece_on(move_from(move)), move_from(move), move_to(move)) + 45;
- futilityValueScaled = ss[ply].eval + preFutilityValueMargin - moveCount * IncrementalFutilityMargin;
+ futilityValueScaled = ss[ply].eval + preFutilityValueMargin - moveCount * IncrementalFutilityMargin;
- if (futilityValueScaled < beta)
- {
- if (futilityValueScaled > bestValue)
- bestValue = futilityValueScaled;
- continue;
+ if (futilityValueScaled < beta)
+ {
+ if (futilityValueScaled > bestValue)
+ bestValue = futilityValueScaled;
+ continue;
+ }