// to search the moves. Because the depth is <= 0 here, only captures,
// queen promotions and checks (only if depth == 0) will be generated.
MovePicker mp = MovePicker(pos, false, MOVE_NONE, MOVE_NONE, MOVE_NONE,
- MOVE_NONE, depth);
+ MOVE_NONE, depth, &ei);
Move move;
int moveCount = 0;
Bitboard dcCandidates = mp.discovered_check_candidates();
bool isCheck = pos.is_check();
+ bool pvNode = (beta - alpha != 1);
+ bool enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
// Loop through the moves until no moves remain or a beta cutoff
// occurs.
&& !moveIsCheck
&& !move_promotion(move)
&& !moveIsPassedPawnPush
- && beta - alpha == 1
- && pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame)
+ && !pvNode
+ && enoughMaterial)
{
Value futilityValue = staticValue
+ Max(pos.midgame_value_of_piece_on(move_to(move)),
}
}
- // Don't search captures and checks with negative SEE values.
+ // Don't search captures and checks with negative SEE values
if ( !isCheck
&& !move_promotion(move)
+ && !pvNode
&& (pos.midgame_value_of_piece_on(move_from(move)) >
pos.midgame_value_of_piece_on(move_to(move)))
&& pos.see(move) < 0)
// ok_to_history() returns true if a move m can be stored
- // in history. Should be a non capturing move.
+ // in history. Should be a non capturing move nor a promotion.
bool ok_to_history(const Position& pos, Move m) {
- return pos.square_is_empty(move_to(m))
- && !move_promotion(m)
- && !move_is_ep(m);
+ return !pos.move_is_capture(m) && !move_promotion(m);
}
H.success(pos.piece_on(move_from(m)), m, depth);
for (int i = 0; i < moveCount - 1; i++)
- if (ok_to_history(pos, movesSearched[i]) && m != movesSearched[i])
+ {
+ assert(m != movesSearched[i]);
+ if (ok_to_history(pos, movesSearched[i]))
H.failure(pos.piece_on(move_from(movesSearched[i])), movesSearched[i]);
+ }
}
// fail_high_ply_1() checks if some thread is currently resolving a fail