for (MoveStack* cur = mlist; cur != last; cur++)
{
m = cur->move;
- pos.do_move(m, st, ci, pos.move_is_check(m, ci));
+ pos.do_move(m, st, ci, pos.move_gives_check(m, ci));
sum += perft(pos, depth - ONE_PLY);
pos.undo_move(m);
}
// Read UCI options
UCIMultiPV = Options["MultiPV"].value<int>();
- SkillLevel = Options["Skill level"].value<int>();
+ SkillLevel = Options["Skill Level"].value<int>();
read_evaluation_uci_options(pos.side_to_move());
Threads.read_uci_options();
if (Rml.size() == 0)
{
cout << "info depth 0 score "
- << value_to_uci(pos.is_check() ? -VALUE_MATE : VALUE_DRAW)
+ << value_to_uci(pos.in_check() ? -VALUE_MATE : VALUE_DRAW)
<< endl;
return MOVE_NONE;
ValueType vt;
Value bestValue, value, oldAlpha;
Value refinedValue, nullValue, futilityBase, futilityValueScaled; // Non-PV specific
- bool isPvMove, isCheck, singularExtensionNode, moveIsCheck, captureOrPromotion, dangerous, isBadCap;
+ bool isPvMove, inCheck, singularExtensionNode, givesCheck, captureOrPromotion, dangerous;
int moveCount = 0, playedMoveCount = 0;
int threadID = pos.thread();
SplitPoint* sp = NULL;
refinedValue = bestValue = value = -VALUE_INFINITE;
oldAlpha = alpha;
- isCheck = pos.is_check();
+ inCheck = pos.in_check();
ss->ply = (ss-1)->ply + 1;
// Used to send selDepth info to GUI
}
// Step 5. Evaluate the position statically and update parent's gain statistics
- if (isCheck)
+ if (inCheck)
ss->eval = ss->evalMargin = VALUE_NONE;
else if (tte)
{
// Step 6. Razoring (is omitted in PV nodes)
if ( !PvNode
&& depth < RazorDepth
- && !isCheck
+ && !inCheck
&& refinedValue + razor_margin(depth) < beta
&& ttMove == MOVE_NONE
&& abs(beta) < VALUE_MATE_IN_PLY_MAX
if ( !PvNode
&& !ss->skipNullMove
&& depth < RazorDepth
- && !isCheck
+ && !inCheck
&& refinedValue - futility_margin(depth, 0) >= beta
&& abs(beta) < VALUE_MATE_IN_PLY_MAX
&& pos.non_pawn_material(pos.side_to_move()))
if ( !PvNode
&& !ss->skipNullMove
&& depth > ONE_PLY
- && !isCheck
+ && !inCheck
&& refinedValue >= beta
&& abs(beta) < VALUE_MATE_IN_PLY_MAX
&& pos.non_pawn_material(pos.side_to_move()))
// Step 9. Internal iterative deepening
if ( depth >= IIDDepth[PvNode]
&& ttMove == MOVE_NONE
- && (PvNode || (!isCheck && ss->eval + IIDMargin >= beta)))
+ && (PvNode || (!inCheck && ss->eval + IIDMargin >= beta)))
{
Depth d = (PvNode ? depth - 2 * ONE_PLY : depth / 2);
search<PvNode>(pos, ss, alpha, beta, d);
ss->skipNullMove = false;
- ttMove = ss->bestMove;
tte = TT.probe(posKey);
+ ttMove = tte ? tte->move() : MOVE_NONE;
}
split_point_start: // At split points actual search starts from here
singularExtensionNode = !Root
&& !SpNode
&& depth >= SingularExtensionDepth[PvNode]
- && tte
- && tte->move()
+ && ttMove != MOVE_NONE
&& !excludedMove // Do not allow recursive singular extension search
&& (tte->type() & VALUE_TYPE_LOWER)
&& tte->depth() >= depth - 3 * ONE_PLY;
// At Root and at first iteration do a PV search on all the moves to score root moves
isPvMove = (PvNode && moveCount <= (Root ? depth <= ONE_PLY ? 1000 : MultiPV : 1));
- moveIsCheck = pos.move_is_check(move, ci);
- captureOrPromotion = pos.move_is_capture_or_promotion(move);
+ givesCheck = pos.move_gives_check(move, ci);
+ captureOrPromotion = pos.move_is_capture(move) || move_is_promotion(move);
// Step 11. Decide the new search depth
- ext = extension<PvNode>(pos, move, captureOrPromotion, moveIsCheck, &dangerous);
+ ext = extension<PvNode>(pos, move, captureOrPromotion, givesCheck, &dangerous);
// Singular extension search. If all moves but one fail low on a search of
// (alpha-s, beta-s), and just one fails high on (alpha, beta), then that move
// on all the other moves but the ttMove, if result is lower than ttValue minus
// a margin then we extend ttMove.
if ( singularExtensionNode
- && move == tte->move()
+ && move == ttMove
&& ext < ONE_PLY)
{
Value ttValue = value_from_tt(tte->value(), ss->ply);
// Step 12. Futility pruning (is omitted in PV nodes)
if ( !PvNode
&& !captureOrPromotion
- && !isCheck
+ && !inCheck
&& !dangerous
&& move != ttMove
&& !move_is_castle(move))
}
}
- // 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;
-
// Step 13. Make the move
- pos.do_move(move, st, ci, moveIsCheck);
+ pos.do_move(move, st, ci, givesCheck);
if (!SpNode && !captureOrPromotion)
movesSearched[playedMoveCount++] = move;
ss->reduction = reduction<PvNode>(depth, moveCount);
if (ss->reduction)
{
- alpha = SpNode ? sp->alpha : alpha;
Depth d = newDepth - ss->reduction;
value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d);
// 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;
// no legal moves, it must be mate or stalemate.
// If one move was excluded return fail low score.
if (!SpNode && !moveCount)
- return excludedMove ? oldAlpha : isCheck ? value_mated_in(ss->ply) : VALUE_DRAW;
+ return excludedMove ? oldAlpha : inCheck ? value_mated_in(ss->ply) : VALUE_DRAW;
// Step 20. Update tables
// If the search is not aborted, update the transposition table,
// Update killers and history only for non capture moves that fails high
if ( bestValue >= beta
- && !pos.move_is_capture_or_promotion(move))
+ && !pos.move_is_capture(move)
+ && !move_is_promotion(move))
{
if (move != ss->killers[0])
{
StateInfo st;
Move ttMove, move;
Value bestValue, value, evalMargin, futilityValue, futilityBase;
- bool isCheck, enoughMaterial, moveIsCheck, evasionPrunable;
+ bool inCheck, enoughMaterial, givesCheck, evasionPrunable;
const TTEntry* tte;
Depth ttDepth;
Value oldAlpha = alpha;
// Decide whether or not to include checks, this fixes also the type of
// TT entry depth that we are going to use. Note that in qsearch we use
// only two types of depth in TT: DEPTH_QS_CHECKS or DEPTH_QS_NO_CHECKS.
- isCheck = pos.is_check();
- ttDepth = (isCheck || depth >= DEPTH_QS_CHECKS ? DEPTH_QS_CHECKS : DEPTH_QS_NO_CHECKS);
+ inCheck = pos.in_check();
+ ttDepth = (inCheck || depth >= DEPTH_QS_CHECKS ? DEPTH_QS_CHECKS : DEPTH_QS_NO_CHECKS);
// Transposition table lookup. At PV nodes, we don't use the TT for
// pruning, but only for move ordering.
}
// Evaluate the position statically
- if (isCheck)
+ if (inCheck)
{
bestValue = futilityBase = -VALUE_INFINITE;
ss->eval = evalMargin = VALUE_NONE;
{
assert(move_is_ok(move));
- moveIsCheck = pos.move_is_check(move, ci);
+ givesCheck = pos.move_gives_check(move, ci);
// Futility pruning
if ( !PvNode
- && !isCheck
- && !moveIsCheck
+ && !inCheck
+ && !givesCheck
&& move != ttMove
&& enoughMaterial
&& !move_is_promotion(move)
}
// Detect non-capture evasions that are candidate to be pruned
- evasionPrunable = isCheck
+ evasionPrunable = inCheck
&& bestValue > VALUE_MATED_IN_PLY_MAX
&& !pos.move_is_capture(move)
&& !pos.can_castle(pos.side_to_move());
// Don't search moves with negative SEE values
if ( !PvNode
- && (!isCheck || evasionPrunable)
+ && (!inCheck || evasionPrunable)
&& move != ttMove
&& !move_is_promotion(move)
&& pos.see_sign(move) < 0)
// Don't search useless checks
if ( !PvNode
- && !isCheck
- && moveIsCheck
+ && !inCheck
+ && givesCheck
&& move != ttMove
- && !pos.move_is_capture_or_promotion(move)
+ && !pos.move_is_capture(move)
+ && !move_is_promotion(move)
&& ss->eval + PawnValueMidgame / 4 < beta
&& !check_is_dangerous(pos, move, futilityBase, beta, &bestValue))
{
ss->currentMove = move;
// Make and search the move
- pos.do_move(move, st, ci, moveIsCheck);
+ pos.do_move(move, st, ci, givesCheck);
value = -qsearch<PvNode>(pos, ss+1, -beta, -alpha, depth-ONE_PLY);
pos.undo_move(move);
// All legal moves have been searched. A special case: If we're in check
// and no legal moves were found, it is checkmate.
- if (isCheck && bestValue == -VALUE_INFINITE)
+ if (inCheck && bestValue == -VALUE_INFINITE)
return value_mated_in(ss->ply);
// Update transposition table
assert(move_is_ok(m));
assert(threat && move_is_ok(threat));
- assert(!pos.move_is_check(m));
- assert(!pos.move_is_capture_or_promotion(m));
+ assert(!pos.move_gives_check(m));
+ assert(!pos.move_is_capture(m) && !move_is_promotion(m));
assert(!pos.move_is_passed_pawn_push(m));
Square mfrom, mto, tfrom, tto;
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++);
+ Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
+
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(), pinned)
&& 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();
// Don't overwrite existing correct entries
if (!tte || tte->move() != pv[ply])
{
- v = (pos.is_check() ? VALUE_NONE : evaluate(pos, m));
+ v = (pos.in_check() ? VALUE_NONE : evaluate(pos, m));
TT.store(k, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, pv[ply], v, m);
}
pos.do_move(pv[ply], *st++);