&& type_of(pos.piece_on(move_to(m))) != PAWN
&& ( pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK)
- piece_value_midgame(pos.piece_on(move_to(m))) == VALUE_ZERO)
- && !move_is_special(m))
+ && !is_special(m))
{
result += PawnEndgameExtension[PvNode];
*dangerous = true;
break;
// Send full PV info to GUI if we are going to leave the loop or
- // if we have a fail high/low and we are deep in the search.
- if ((value > alpha && value < beta) || current_search_time() > 2000)
- for (int i = 0; i < Min(UCIMultiPV, MultiPVIteration + 1); i++)
+ // if we have a fail high/low and we are deep in the search. Note
+ // that UCI protol requires to send all the PV lines also if are
+ // still to be searched and so refer to the previous search's score.
+ if ((value > alpha && value < beta) || current_search_time() > 5000)
+ for (int i = 0; i < Min(UCIMultiPV, (int)Rml.size()); i++)
+ {
+ bool updated = (i <= MultiPVIteration);
+
+ if (depth == 1 && !updated)
+ continue;
+
+ Depth d = (updated ? depth : depth - 1) * ONE_PLY;
+ Value s = (updated ? Rml[i].score : Rml[i].prevScore);
+
cout << "info"
- << depth_to_uci(depth * ONE_PLY)
- << (i == MultiPVIteration ? score_to_uci(Rml[i].score, alpha, beta) :
- score_to_uci(Rml[i].score))
+ << depth_to_uci(d)
+ << (i == MultiPVIteration ? score_to_uci(s, alpha, beta) : score_to_uci(s))
<< speed_to_uci(pos.nodes_searched())
<< pv_to_uci(&Rml[i].pv[0], i + 1, pos.is_chess960())
<< endl;
+ }
// In case of failing high/low increase aspiration window and research,
// otherwise exit the fail high/low loop.
if ( value >= beta
&& move
- && !pos.move_is_capture_or_promotion(move)
+ && !pos.is_capture_or_promotion(move)
&& move != ss->killers[0])
{
ss->killers[1] = ss->killers[0];
&& (move = mp.get_next_move()) != MOVE_NONE
&& !thread.cutoff_occurred())
{
- assert(move_is_ok(move));
+ assert(is_ok(move));
if (move == excludedMove)
continue;
// At Root and at first iteration do a PV search on all the moves to score root moves
isPvMove = (PvNode && moveCount <= (RootNode && depth <= ONE_PLY ? MAX_MOVES : 1));
givesCheck = pos.move_gives_check(move, ci);
- captureOrPromotion = pos.move_is_capture_or_promotion(move);
+ captureOrPromotion = pos.is_capture_or_promotion(move);
// Step 12. Decide the new search depth
ext = extension<PvNode>(pos, move, captureOrPromotion, givesCheck, &dangerous);
&& !inCheck
&& !dangerous
&& move != ttMove
- && !move_is_castle(move))
+ && !is_castle(move))
{
// Move count based pruning
if ( moveCount >= futility_move_count(depth)
if ( depth > 3 * ONE_PLY
&& !captureOrPromotion
&& !dangerous
- && !move_is_castle(move)
+ && !is_castle(move)
&& ss->killers[0] != move
&& ss->killers[1] != move
&& (ss->reduction = reduction<PvNode>(depth, moveCount)) != DEPTH_ZERO)
// Update killers and history only for non capture moves that fails high
if ( bestValue >= beta
- && !pos.move_is_capture_or_promotion(move))
+ && !pos.is_capture_or_promotion(move))
{
if (move != ss->killers[0])
{
while ( bestValue < beta
&& (move = mp.get_next_move()) != MOVE_NONE)
{
- assert(move_is_ok(move));
+ assert(is_ok(move));
givesCheck = pos.move_gives_check(move, ci);
&& !givesCheck
&& move != ttMove
&& enoughMaterial
- && !move_is_promotion(move)
- && !pos.move_is_passed_pawn_push(move))
+ && !is_promotion(move)
+ && !pos.is_passed_pawn_push(move))
{
futilityValue = futilityBase
+ piece_value_endgame(pos.piece_on(move_to(move)))
- + (move_is_ep(move) ? PawnValueEndgame : VALUE_ZERO);
+ + (is_enpassant(move) ? PawnValueEndgame : VALUE_ZERO);
if (futilityValue < beta)
{
evasionPrunable = !PvNode
&& inCheck
&& bestValue > VALUE_MATED_IN_PLY_MAX
- && !pos.move_is_capture(move)
+ && !pos.is_capture(move)
&& !pos.can_castle(pos.side_to_move());
// Don't search moves with negative SEE values
if ( !PvNode
&& (!inCheck || evasionPrunable)
&& move != ttMove
- && !move_is_promotion(move)
+ && !is_promotion(move)
&& pos.see_sign(move) < 0)
continue;
&& !inCheck
&& givesCheck
&& move != ttMove
- && !pos.move_is_capture_or_promotion(move)
+ && !pos.is_capture_or_promotion(move)
&& ss->eval + PawnValueMidgame / 4 < beta
&& !check_is_dangerous(pos, move, futilityBase, beta, &bestValue))
{
Piece p1, p2;
Square ksq;
- assert(move_is_ok(m1));
- assert(move_is_ok(m2));
+ assert(is_ok(m1));
+ assert(is_ok(m2));
// Case 1: The moving piece is the same in both moves
f2 = move_from(m2);
bool connected_threat(const Position& pos, Move m, Move threat) {
- assert(move_is_ok(m));
- assert(move_is_ok(threat));
- assert(!pos.move_is_capture_or_promotion(m));
- assert(!pos.move_is_passed_pawn_push(m));
+ assert(is_ok(m));
+ assert(is_ok(threat));
+ assert(!pos.is_capture_or_promotion(m));
+ assert(!pos.is_passed_pawn_push(m));
Square mfrom, mto, tfrom, tto;
// Case 2: If the threatened piece has value less than or equal to the
// value of the threatening piece, don't prune moves which defend it.
- if ( pos.move_is_capture(threat)
+ if ( pos.is_capture(threat)
&& ( piece_value_midgame(pos.piece_on(tfrom)) >= piece_value_midgame(pos.piece_on(tto))
|| type_of(pos.piece_on(tfrom)) == KING)
&& pos.move_attacks_square(m, tto))
&& before != VALUE_NONE
&& after != VALUE_NONE
&& pos.captured_piece_type() == PIECE_TYPE_NONE
- && !move_is_special(m))
+ && !is_special(m))
H.update_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
}
int ply = 1;
Move m = pv[0];
- assert(m != MOVE_NONE && pos.move_is_pl(m));
+ assert(m != MOVE_NONE && pos.is_pseudo_legal(m));
pv.clear();
pv.push_back(m);
while ( (tte = TT.probe(pos.get_key())) != NULL
&& tte->move() != MOVE_NONE
- && pos.move_is_pl(tte->move())
+ && pos.is_pseudo_legal(tte->move())
&& pos.pl_move_is_legal(tte->move(), pos.pinned_pieces())
&& ply < PLY_MAX
&& (!pos.is_draw<false>() || ply < 2))
Value v, m = VALUE_NONE;
int ply = 0;
- assert(pv[0] != MOVE_NONE && pos.move_is_pl(pv[0]));
+ assert(pv[0] != MOVE_NONE && pos.is_pseudo_legal(pv[0]));
do {
k = pos.get_key();