mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-17 15:46:24 +08:00
Implement post futility pruning
and prevent futility pruning from pruning castling moves Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
committed by
Marco Costalba
parent
22b8dc8c98
commit
05a8c318b8
@@ -703,6 +703,7 @@ namespace {
|
|||||||
// Initialize
|
// Initialize
|
||||||
TT.new_search();
|
TT.new_search();
|
||||||
H.clear();
|
H.clear();
|
||||||
|
MG.clear();
|
||||||
init_ss_array(ss);
|
init_ss_array(ss);
|
||||||
IterationInfo[1] = IterationInfoType(rml.get_move_score(0), rml.get_move_score(0));
|
IterationInfo[1] = IterationInfoType(rml.get_move_score(0), rml.get_move_score(0));
|
||||||
Iteration = 1;
|
Iteration = 1;
|
||||||
@@ -1428,6 +1429,10 @@ namespace {
|
|||||||
MG.store(pos.piece_on(move_to(m)), move_from(m), move_to(m), ss[ply - 1].eval, -ss[ply].eval);
|
MG.store(pos.piece_on(move_to(m)), move_from(m), move_to(m), ss[ply - 1].eval, -ss[ply].eval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Post futility pruning
|
||||||
|
if (staticValue - FutilityValueMargin >= beta)
|
||||||
|
return (staticValue - FutilityValueMargin);
|
||||||
|
|
||||||
// Null move search
|
// Null move search
|
||||||
if ( allowNullmove
|
if ( allowNullmove
|
||||||
&& depth > OnePly
|
&& depth > OnePly
|
||||||
@@ -1555,6 +1560,7 @@ namespace {
|
|||||||
if ( useFutilityPruning
|
if ( useFutilityPruning
|
||||||
&& !dangerous
|
&& !dangerous
|
||||||
&& !captureOrPromotion
|
&& !captureOrPromotion
|
||||||
|
&& !move_is_castle(move)
|
||||||
&& move != ttMove)
|
&& move != ttMove)
|
||||||
{
|
{
|
||||||
// Move count based pruning
|
// Move count based pruning
|
||||||
@@ -2509,9 +2515,8 @@ namespace {
|
|||||||
|
|
||||||
Square mfrom, mto, tfrom, tto;
|
Square mfrom, mto, tfrom, tto;
|
||||||
|
|
||||||
// Prune if there isn't any threat move and
|
// Prune if there isn't any threat move
|
||||||
// is not a castling move (common case).
|
if (threat == MOVE_NONE)
|
||||||
if (threat == MOVE_NONE && !move_is_castle(m))
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
mfrom = move_from(m);
|
mfrom = move_from(m);
|
||||||
@@ -2519,15 +2524,11 @@ namespace {
|
|||||||
tfrom = move_from(threat);
|
tfrom = move_from(threat);
|
||||||
tto = move_to(threat);
|
tto = move_to(threat);
|
||||||
|
|
||||||
// Case 1: Castling moves are never pruned
|
// Case 1: Don't prune moves which move the threatened piece
|
||||||
if (move_is_castle(m))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Case 2: Don't prune moves which move the threatened piece
|
|
||||||
if (mfrom == tto)
|
if (mfrom == tto)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Case 3: If the threatened piece has value less than or equal to the
|
// Case 2: If the threatened piece has value less than or equal to the
|
||||||
// value of the threatening piece, don't prune move which defend it.
|
// value of the threatening piece, don't prune move which defend it.
|
||||||
if ( pos.move_is_capture(threat)
|
if ( pos.move_is_capture(threat)
|
||||||
&& ( pos.midgame_value_of_piece_on(tfrom) >= pos.midgame_value_of_piece_on(tto)
|
&& ( pos.midgame_value_of_piece_on(tfrom) >= pos.midgame_value_of_piece_on(tto)
|
||||||
@@ -2535,7 +2536,7 @@ namespace {
|
|||||||
&& pos.move_attacks_square(m, tto))
|
&& pos.move_attacks_square(m, tto))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Case 4: If the moving piece in the threatened move is a slider, don't
|
// Case 3: If the moving piece in the threatened move is a slider, don't
|
||||||
// prune safe moves which block its ray.
|
// prune safe moves which block its ray.
|
||||||
if ( piece_is_slider(pos.piece_on(tfrom))
|
if ( piece_is_slider(pos.piece_on(tfrom))
|
||||||
&& bit_is_set(squares_between(tfrom, tto), mto)
|
&& bit_is_set(squares_between(tfrom, tto), mto)
|
||||||
|
|||||||
Reference in New Issue
Block a user