/// search captures, promotions and some checks) and about how important good
/// move ordering is at the current node.
-MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats& h, const CountermovesStats& cm,
+MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats& h, Move* cm,
Search::Stack* s, Value beta) : pos(p), history(h), depth(d) {
assert(d > DEPTH_ZERO);
killers[0].move = ss->killers[0];
killers[1].move = ss->killers[1];
- Square prevSq = to_sq((ss-1)->currentMove);
- killers[2].move = cm[pos.piece_on(prevSq)][prevSq].first;
- killers[3].move = cm[pos.piece_on(prevSq)][prevSq].second;
+ killers[2].move = cm[0];
+ killers[3].move = cm[1];
// Consider sligtly negative captures as good if at low depth and far from beta
if (ss && ss->staticEval < beta - PawnValueMg && d < 3 * ONE_PLY)
public:
MovePicker(const Position&, Move, Depth, const HistoryStats&, Square);
MovePicker(const Position&, Move, const HistoryStats&, PieceType);
- MovePicker(const Position&, Move, Depth, const HistoryStats&,
- const CountermovesStats&, Search::Stack*, Value);
+ MovePicker(const Position&, Move, Depth, const HistoryStats&, Move*, Search::Stack*, Value);
template<bool SpNode> Move next_move();
split_point_start: // At split points actual search starts from here
- MovePicker mp(pos, ttMove, depth, History, Countermoves, ss, PvNode ? -VALUE_INFINITE : beta);
+ Square prevMoveSq = to_sq((ss-1)->currentMove);
+ Move countermoves[] = { Countermoves[pos.piece_on(prevMoveSq)][prevMoveSq].first,
+ Countermoves[pos.piece_on(prevMoveSq)][prevMoveSq].second };
+
+ MovePicker mp(pos, ttMove, depth, History, countermoves, ss, PvNode ? -VALUE_INFINITE : beta);
CheckInfo ci(pos);
value = bestValue; // Workaround a bogus 'uninitialized' warning under gcc
singularExtensionNode = !RootNode
&& move != ss->killers[1])
{
ss->reduction = reduction<PvNode>(depth, moveCount);
+ if (move == countermoves[0] || move == countermoves[1])
+ ss->reduction = std::max(DEPTH_ZERO, ss->reduction-ONE_PLY);
+
Depth d = std::max(newDepth - ss->reduction, ONE_PLY);
if (SpNode)
alpha = splitPoint->alpha;
Value bonus = Value(int(depth) * int(depth));
History.update(pos.piece_moved(bestMove), to_sq(bestMove), bonus);
if (is_ok((ss-1)->currentMove))
- {
- Square prevSq = to_sq((ss-1)->currentMove);
- Countermoves.update(pos.piece_on(prevSq), prevSq, bestMove);
- }
+ Countermoves.update(pos.piece_on(prevMoveSq), prevMoveSq, bestMove);
// Decrease history of all the other played non-capture moves
for (int i = 0; i < playedMoveCount - 1; i++)