ValueType vt;
Value bestValue, value, oldAlpha;
Value refinedValue, nullValue, futilityBase, futilityValueScaled; // Non-PV specific
- bool isPvMove, inCheck, singularExtensionNode, givesCheck, captureOrPromotion, dangerous, isBadCap;
+ bool isPvMove, inCheck, singularExtensionNode, givesCheck, captureOrPromotion, dangerous;
int moveCount = 0, playedMoveCount = 0;
int threadID = pos.thread();
SplitPoint* sp = NULL;
// Initialize a MovePicker object for the current position
MovePickerExt<SpNode, Root> mp(pos, ttMove, depth, H, ss, (PvNode ? -VALUE_INFINITE : beta));
CheckInfo ci(pos);
+ Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
ss->bestMove = MOVE_NONE;
futilityBase = ss->eval + ss->evalMargin;
singularExtensionNode = !Root
{
assert(move_is_ok(move));
+ if (move == excludedMove)
+ continue;
+
+ // At PV and SpNode nodes we want the moves to be legal
+ if ((PvNode || SpNode) && !pos.pl_move_is_legal(move, pinned))
+ continue;
+
if (SpNode)
{
moveCount = ++sp->moveCount;
lock_release(&(sp->lock));
}
- else if (move == excludedMove)
- continue;
else
moveCount++;
// a margin then we extend ttMove.
if ( singularExtensionNode
&& move == ttMove
+ && pos.pl_move_is_legal(move, pinned)
&& ext < ONE_PLY)
{
Value ttValue = value_from_tt(tte->value(), ss->ply);
}
// Update current move (this must be done after singular extension search)
- ss->currentMove = move;
newDepth = depth - ONE_PLY + ext;
// Step 12. Futility pruning (is omitted in PV nodes)
}
}
- // Bad capture detection. Will be used by prob-cut search
- isBadCap = depth >= 3 * ONE_PLY
- && depth < 8 * ONE_PLY
- && captureOrPromotion
- && move != ttMove
- && !dangerous
- && !move_is_promotion(move)
- && abs(alpha) < VALUE_MATE_IN_PLY_MAX
- && pos.see_sign(move) < 0;
+ // Check for legality only before to do the move
+ if (!pos.pl_move_is_legal(move, pinned))
+ {
+ moveCount--;
+ continue;
+ }
+
+ ss->currentMove = move;
// Step 13. Make the move
pos.do_move(move, st, ci, givesCheck);
// Probcut search for bad captures. If a reduced search returns a value
// very below beta then we can (almost) safely prune the bad capture.
- if (isBadCap)
+ if ( depth >= 3 * ONE_PLY
+ && depth < 8 * ONE_PLY
+ && mp.isBadCapture()
+ && move != ttMove
+ && !dangerous
+ && !move_is_promotion(move)
+ && abs(alpha) < VALUE_MATE_IN_PLY_MAX)
{
ss->reduction = 3 * ONE_PLY;
Value rAlpha = alpha - 300;
// be generated.
MovePicker mp(pos, ttMove, depth, H);
CheckInfo ci(pos);
+ Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
// Loop through the moves until no moves remain or a beta cutoff occurs
while ( alpha < beta
}
// Detect non-capture evasions that are candidate to be pruned
- evasionPrunable = inCheck
+ evasionPrunable = !PvNode
+ && inCheck
&& bestValue > VALUE_MATED_IN_PLY_MAX
&& !pos.move_is_capture(move)
&& !pos.can_castle(pos.side_to_move());
continue;
}
+ // Check for legality only before to do the move
+ if (!pos.pl_move_is_legal(move, pinned))
+ continue;
+
// Update current move
ss->currentMove = move;
TTEntry* tte;
int ply = 1;
- assert(pv[0] != MOVE_NONE && pos.move_is_legal(pv[0]));
+ assert(pv[0] != MOVE_NONE && pos.move_is_pl(pv[0]));
pos.do_move(pv[0], *st++);
while ( (tte = TT.probe(pos.get_key())) != NULL
&& tte->move() != MOVE_NONE
- && pos.move_is_legal(tte->move())
+ && pos.move_is_pl(tte->move())
+ && pos.pl_move_is_legal(tte->move(), pos.pinned_pieces(pos.side_to_move()))
&& ply < PLY_MAX
&& (!pos.is_draw() || ply < 2))
{
Value v, m = VALUE_NONE;
int ply = 0;
- assert(pv[0] != MOVE_NONE && pos.move_is_legal(pv[0]));
+ assert(pv[0] != MOVE_NONE && pos.move_is_pl(pv[0]));
do {
k = pos.get_key();