summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
e31f97e)
This patch replaces `pos.capture_or_promotion()` with `pos.capture()`
and comes after a few attempts with elo-gaining bounds, two of which
failed yellow at LTC
(https://tests.stockfishchess.org/tests/view/
622f8f0cc9e950cbfc237024
and
https://tests.stockfishchess.org/tests/view/
62319a8bb3b498ba71a6b2dc).
Passed non-regression STC:
https://tests.stockfishchess.org/tests/view/
623aff7eea447151c74828d3
LLR: 2.94 (-2.94,2.94) <-2.25,0.25>
Total: 246864 W: 65462 L: 65618 D: 115784
Ptnml(0-2): 1201, 28116, 65001, 27866, 1248
Passed non-regression LTC:
https://tests.stockfishchess.org/tests/view/
623c1fdcea447151c7484fb0
LLR: 2.94 (-2.94,2.94) <-2.25,0.25>
Total: 30120 W: 8125 L: 7978 D: 14017
Ptnml(0-2): 22, 2993, 8881, 3144, 20
closes https://github.com/official-stockfish/Stockfish/pull/3968
Bench:
6847732
-inline bool Position::capture_or_promotion(Move m) const {
- assert(is_ok(m));
- return type_of(m) != NORMAL ? type_of(m) != CASTLING : !empty(to_sq(m));
-}
-
inline bool Position::capture(Move m) const {
assert(is_ok(m));
// Castling is encoded as "king captures rook"
inline bool Position::capture(Move m) const {
assert(is_ok(m));
// Castling is encoded as "king captures rook"
Depth extension, newDepth;
Value bestValue, value, ttValue, eval, maxValue, probCutBeta;
bool givesCheck, improving, didLMR, priorCapture;
Depth extension, newDepth;
Value bestValue, value, ttValue, eval, maxValue, probCutBeta;
bool givesCheck, improving, didLMR, priorCapture;
- bool captureOrPromotion, doFullDepthSearch, moveCountPruning, ttCapture;
+ bool capture, doFullDepthSearch, moveCountPruning, ttCapture;
Piece movedPiece;
int moveCount, captureCount, quietCount, bestMoveCount, improvement, complexity;
Piece movedPiece;
int moveCount, captureCount, quietCount, bestMoveCount, improvement, complexity;
ttValue = ss->ttHit ? value_from_tt(tte->value(), ss->ply, pos.rule50_count()) : VALUE_NONE;
ttMove = rootNode ? thisThread->rootMoves[thisThread->pvIdx].pv[0]
: ss->ttHit ? tte->move() : MOVE_NONE;
ttValue = ss->ttHit ? value_from_tt(tte->value(), ss->ply, pos.rule50_count()) : VALUE_NONE;
ttMove = rootNode ? thisThread->rootMoves[thisThread->pvIdx].pv[0]
: ss->ttHit ? tte->move() : MOVE_NONE;
- ttCapture = ttMove && pos.capture_or_promotion(ttMove);
+ ttCapture = ttMove && pos.capture(ttMove);
if (!excludedMove)
ss->ttPv = PvNode || (ss->ttHit && tte->is_pv());
if (!excludedMove)
ss->ttPv = PvNode || (ss->ttHit && tte->is_pv());
MovePicker mp(pos, ttMove, probCutBeta - ss->staticEval, depth - 3, &captureHistory);
bool ttPv = ss->ttPv;
MovePicker mp(pos, ttMove, probCutBeta - ss->staticEval, depth - 3, &captureHistory);
bool ttPv = ss->ttPv;
+ bool captureOrPromotion;
ss->ttPv = false;
while ((move = mp.next_move()) != MOVE_NONE)
if (move != excludedMove && pos.legal(move))
{
ss->ttPv = false;
while ((move = mp.next_move()) != MOVE_NONE)
if (move != excludedMove && pos.legal(move))
{
- assert(pos.capture_or_promotion(move));
+ assert(pos.capture(move) || promotion_type(move) == QUEEN);
captureOrPromotion = true;
captureOrPromotion = true;
(ss+1)->pv = nullptr;
extension = 0;
(ss+1)->pv = nullptr;
extension = 0;
- captureOrPromotion = pos.capture_or_promotion(move);
+ capture = pos.capture(move);
movedPiece = pos.moved_piece(move);
givesCheck = pos.gives_check(move);
movedPiece = pos.moved_piece(move);
givesCheck = pos.gives_check(move);
// Reduced depth of the next LMR search
int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount, delta, thisThread->rootDelta), 0);
// Reduced depth of the next LMR search
int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount, delta, thisThread->rootDelta), 0);
- if ( captureOrPromotion
|| givesCheck)
{
// Futility pruning for captures (~0 Elo)
|| givesCheck)
{
// Futility pruning for captures (~0 Elo)
// Update the current move (this must be done after singular extension search)
ss->currentMove = move;
ss->continuationHistory = &thisThread->continuationHistory[ss->inCheck]
// Update the current move (this must be done after singular extension search)
ss->currentMove = move;
ss->continuationHistory = &thisThread->continuationHistory[ss->inCheck]
[movedPiece]
[to_sq(move)];
[movedPiece]
[to_sq(move)];
if ( depth >= 2
&& moveCount > 1 + (PvNode && ss->ply <= 1)
&& ( !ss->ttPv
if ( depth >= 2
&& moveCount > 1 + (PvNode && ss->ply <= 1)
&& ( !ss->ttPv
|| (cutNode && (ss-1)->moveCount > 1)))
{
Depth r = reduction(improving, depth, moveCount, delta, thisThread->rootDelta);
|| (cutNode && (ss-1)->moveCount > 1)))
{
Depth r = reduction(improving, depth, moveCount, delta, thisThread->rootDelta);
int bonus = value > alpha ? stat_bonus(newDepth)
: -stat_bonus(newDepth);
int bonus = value > alpha ? stat_bonus(newDepth)
: -stat_bonus(newDepth);
- if (captureOrPromotion)
bonus /= 6;
update_continuation_histories(ss, movedPiece, to_sq(move), bonus);
bonus /= 6;
update_continuation_histories(ss, movedPiece, to_sq(move), bonus);
// If the move is worse than some previously searched move, remember it to update its stats later
if (move != bestMove)
{
// If the move is worse than some previously searched move, remember it to update its stats later
if (move != bestMove)
{
- if (captureOrPromotion && captureCount < 32)
+ if (capture && captureCount < 32)
capturesSearched[captureCount++] = move;
capturesSearched[captureCount++] = move;
- else if (!captureOrPromotion && quietCount < 64)
+ else if (!capture && quietCount < 64)
quietsSearched[quietCount++] = move;
}
}
quietsSearched[quietCount++] = move;
}
}
Move ttMove, move, bestMove;
Depth ttDepth;
Value bestValue, value, ttValue, futilityValue, futilityBase;
Move ttMove, move, bestMove;
Depth ttDepth;
Value bestValue, value, ttValue, futilityValue, futilityBase;
- bool pvHit, givesCheck, captureOrPromotion;
+ bool pvHit, givesCheck, capture;
int moveCount;
if (PvNode)
int moveCount;
if (PvNode)
continue;
givesCheck = pos.gives_check(move);
continue;
givesCheck = pos.gives_check(move);
- captureOrPromotion = pos.capture_or_promotion(move);
+ capture = pos.capture(move);
ss->currentMove = move;
ss->continuationHistory = &thisThread->continuationHistory[ss->inCheck]
ss->currentMove = move;
ss->continuationHistory = &thisThread->continuationHistory[ss->inCheck]
[pos.moved_piece(move)]
[to_sq(move)];
// Continuation history based pruning (~2 Elo)
[pos.moved_piece(move)]
[to_sq(move)];
// Continuation history based pruning (~2 Elo)
- if ( !captureOrPromotion
&& bestValue > VALUE_TB_LOSS_IN_MAX_PLY
&& (*contHist[0])[pos.moved_piece(move)][to_sq(move)] < CounterMovePruneThreshold
&& (*contHist[1])[pos.moved_piece(move)][to_sq(move)] < CounterMovePruneThreshold)
&& bestValue > VALUE_TB_LOSS_IN_MAX_PLY
&& (*contHist[0])[pos.moved_piece(move)][to_sq(move)] < CounterMovePruneThreshold
&& (*contHist[1])[pos.moved_piece(move)][to_sq(move)] < CounterMovePruneThreshold)
// movecount pruning for quiet check evasions
if ( bestValue > VALUE_TB_LOSS_IN_MAX_PLY
&& quietCheckEvasions > 1
// movecount pruning for quiet check evasions
if ( bestValue > VALUE_TB_LOSS_IN_MAX_PLY
&& quietCheckEvasions > 1
&& ss->inCheck)
continue;
&& ss->inCheck)
continue;
- quietCheckEvasions += !captureOrPromotion && ss->inCheck;
+ quietCheckEvasions += !capture && ss->inCheck;
// Make and search the move
pos.do_move(move, st, givesCheck);
// Make and search the move
pos.do_move(move, st, givesCheck);
bonus2 = bestValue > beta + PawnValueMg ? bonus1 // larger bonus
: stat_bonus(depth); // smaller bonus
bonus2 = bestValue > beta + PawnValueMg ? bonus1 // larger bonus
: stat_bonus(depth); // smaller bonus
- if (!pos.capture_or_promotion(bestMove))
+ if (!pos.capture(bestMove))
{
// Increase stats for the best move in case it was a quiet move
update_quiet_stats(pos, ss, bestMove, bonus2);
{
// Increase stats for the best move in case it was a quiet move
update_quiet_stats(pos, ss, bestMove, bonus2);