/// move ordering is at the current node.
MovePicker::MovePicker(const Position& p, Move ttm, Depth d,
- const History& h, SearchStack* ss) : pos(p), H(h) {
+ const History& h, SearchStack* ss, Value beta) : pos(p), H(h) {
int searchTT = ttm;
ttMoves[0].move = ttm;
lastBadCapture = badCaptures;
+ badCaptureThreshold = 0;
pinned = p.pinned_pieces(pos.side_to_move());
if (p.is_check())
phasePtr = EvasionsPhaseTable;
else if (d > Depth(0))
+ {
+ // Consider sligtly negative captures as good if at low
+ // depth and far from beta.
+ if (ss && ss->eval < beta - PawnValueMidgame && d < 3 * OnePly)
+ badCaptureThreshold = -PawnValueMidgame;
+
phasePtr = MainSearchPhaseTable;
- else if (d == Depth(0))
+ } else if (d == Depth(0))
phasePtr = QsearchWithChecksPhaseTable;
else
{
{
// Check for a non negative SEE now
int seeValue = pos.see_sign(move);
- if (seeValue >= 0)
+ if (seeValue >= badCaptureThreshold)
return move;
// Losing capture, move it to the badCaptures[] array, note
MovePicker& operator=(const MovePicker&); // silence a warning under MSVC
public:
- MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss = NULL);
+ MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss = NULL, Value beta = -VALUE_INFINITE);
Move get_next_move();
int number_of_evasions() const;
const Position& pos;
const History& H;
MoveStack ttMoves[2], killers[2];
- int phase;
+ int badCaptureThreshold, phase;
const uint8_t* phasePtr;
MoveStack *curMove, *lastMove, *lastGoodNonCapture, *lastBadCapture;
Bitboard pinned;
// Loop through all legal moves until no moves remain or a beta cutoff occurs
// Initialize a MovePicker object for the current position
- MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]);
+ MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply], beta);
CheckInfo ci(pos);
while ( bestValue < beta