1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-01 17:19:36 +00:00

Remove pos.capture_or_promotion()

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
This commit is contained in:
Giacomo Lorenzetti 2022-03-23 12:04:10 +01:00 committed by Joost VandeVondele
parent e31f97e3ba
commit 910cf8b218
2 changed files with 18 additions and 22 deletions

View file

@ -352,11 +352,6 @@ inline bool Position::is_chess960() const {
return chess960; return chess960;
} }
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 { inline bool Position::capture(Move m) const {
assert(is_ok(m)); assert(is_ok(m));
// Castling is encoded as "king captures rook" // Castling is encoded as "king captures rook"

View file

@ -554,7 +554,7 @@ namespace {
Depth extension, newDepth; Depth extension, newDepth;
Value bestValue, value, ttValue, eval, maxValue, probCutBeta; Value bestValue, value, ttValue, eval, maxValue, probCutBeta;
bool givesCheck, improving, didLMR, priorCapture; bool givesCheck, improving, didLMR, priorCapture;
bool captureOrPromotion, doFullDepthSearch, moveCountPruning, ttCapture; bool capture, doFullDepthSearch, moveCountPruning, ttCapture;
Piece movedPiece; Piece movedPiece;
int moveCount, captureCount, quietCount, bestMoveCount, improvement, complexity; int moveCount, captureCount, quietCount, bestMoveCount, improvement, complexity;
@ -624,7 +624,7 @@ namespace {
ttValue = ss->ttHit ? value_from_tt(tte->value(), ss->ply, pos.rule50_count()) : VALUE_NONE; ttValue = ss->ttHit ? value_from_tt(tte->value(), ss->ply, pos.rule50_count()) : VALUE_NONE;
ttMove = rootNode ? thisThread->rootMoves[thisThread->pvIdx].pv[0] ttMove = rootNode ? thisThread->rootMoves[thisThread->pvIdx].pv[0]
: ss->ttHit ? tte->move() : MOVE_NONE; : ss->ttHit ? tte->move() : MOVE_NONE;
ttCapture = ttMove && pos.capture_or_promotion(ttMove); ttCapture = ttMove && pos.capture(ttMove);
if (!excludedMove) if (!excludedMove)
ss->ttPv = PvNode || (ss->ttHit && tte->is_pv()); ss->ttPv = PvNode || (ss->ttHit && tte->is_pv());
@ -865,12 +865,13 @@ namespace {
MovePicker mp(pos, ttMove, probCutBeta - ss->staticEval, depth - 3, &captureHistory); MovePicker mp(pos, ttMove, probCutBeta - ss->staticEval, depth - 3, &captureHistory);
bool ttPv = ss->ttPv; bool ttPv = ss->ttPv;
bool captureOrPromotion;
ss->ttPv = false; ss->ttPv = false;
while ((move = mp.next_move()) != MOVE_NONE) while ((move = mp.next_move()) != MOVE_NONE)
if (move != excludedMove && pos.legal(move)) if (move != excludedMove && pos.legal(move))
{ {
assert(pos.capture_or_promotion(move)); assert(pos.capture(move) || promotion_type(move) == QUEEN);
captureOrPromotion = true; captureOrPromotion = true;
@ -987,7 +988,7 @@ moves_loop: // When in check, search starts here
(ss+1)->pv = nullptr; (ss+1)->pv = nullptr;
extension = 0; extension = 0;
captureOrPromotion = pos.capture_or_promotion(move); capture = pos.capture(move);
movedPiece = pos.moved_piece(move); movedPiece = pos.moved_piece(move);
givesCheck = pos.gives_check(move); givesCheck = pos.gives_check(move);
@ -1007,7 +1008,7 @@ moves_loop: // When in check, search starts here
// Reduced depth of the next LMR search // Reduced depth of the next LMR search
int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount, delta, thisThread->rootDelta), 0); int lmrDepth = std::max(newDepth - reduction(improving, depth, moveCount, delta, thisThread->rootDelta), 0);
if ( captureOrPromotion if ( capture
|| givesCheck) || givesCheck)
{ {
// Futility pruning for captures (~0 Elo) // Futility pruning for captures (~0 Elo)
@ -1122,7 +1123,7 @@ moves_loop: // When in check, search starts here
// Update the current move (this must be done after singular extension search) // Update the current move (this must be done after singular extension search)
ss->currentMove = move; ss->currentMove = move;
ss->continuationHistory = &thisThread->continuationHistory[ss->inCheck] ss->continuationHistory = &thisThread->continuationHistory[ss->inCheck]
[captureOrPromotion] [capture]
[movedPiece] [movedPiece]
[to_sq(move)]; [to_sq(move)];
@ -1138,7 +1139,7 @@ moves_loop: // When in check, search starts here
if ( depth >= 2 if ( depth >= 2
&& moveCount > 1 + (PvNode && ss->ply <= 1) && moveCount > 1 + (PvNode && ss->ply <= 1)
&& ( !ss->ttPv && ( !ss->ttPv
|| !captureOrPromotion || !capture
|| (cutNode && (ss-1)->moveCount > 1))) || (cutNode && (ss-1)->moveCount > 1)))
{ {
Depth r = reduction(improving, depth, moveCount, delta, thisThread->rootDelta); Depth r = reduction(improving, depth, moveCount, delta, thisThread->rootDelta);
@ -1215,7 +1216,7 @@ moves_loop: // When in check, search starts here
int bonus = value > alpha ? stat_bonus(newDepth) int bonus = value > alpha ? stat_bonus(newDepth)
: -stat_bonus(newDepth); : -stat_bonus(newDepth);
if (captureOrPromotion) if (capture)
bonus /= 6; bonus /= 6;
update_continuation_histories(ss, movedPiece, to_sq(move), bonus); update_continuation_histories(ss, movedPiece, to_sq(move), bonus);
@ -1306,10 +1307,10 @@ moves_loop: // When in check, search starts here
// If the move is worse than some previously searched move, remember it to update its stats later // If the move is worse than some previously searched move, remember it to update its stats later
if (move != bestMove) 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;
} }
} }
@ -1394,7 +1395,7 @@ moves_loop: // When in check, search starts here
Move ttMove, move, bestMove; Move ttMove, move, bestMove;
Depth ttDepth; Depth ttDepth;
Value bestValue, value, ttValue, futilityValue, futilityBase; Value bestValue, value, ttValue, futilityValue, futilityBase;
bool pvHit, givesCheck, captureOrPromotion; bool pvHit, givesCheck, capture;
int moveCount; int moveCount;
if (PvNode) if (PvNode)
@ -1503,7 +1504,7 @@ moves_loop: // When in check, search starts here
continue; continue;
givesCheck = pos.gives_check(move); givesCheck = pos.gives_check(move);
captureOrPromotion = pos.capture_or_promotion(move); capture = pos.capture(move);
moveCount++; moveCount++;
@ -1543,12 +1544,12 @@ moves_loop: // When in check, search starts here
ss->currentMove = move; ss->currentMove = move;
ss->continuationHistory = &thisThread->continuationHistory[ss->inCheck] ss->continuationHistory = &thisThread->continuationHistory[ss->inCheck]
[captureOrPromotion] [capture]
[pos.moved_piece(move)] [pos.moved_piece(move)]
[to_sq(move)]; [to_sq(move)];
// Continuation history based pruning (~2 Elo) // Continuation history based pruning (~2 Elo)
if ( !captureOrPromotion if ( !capture
&& bestValue > VALUE_TB_LOSS_IN_MAX_PLY && bestValue > VALUE_TB_LOSS_IN_MAX_PLY
&& (*contHist[0])[pos.moved_piece(move)][to_sq(move)] < CounterMovePruneThreshold && (*contHist[0])[pos.moved_piece(move)][to_sq(move)] < CounterMovePruneThreshold
&& (*contHist[1])[pos.moved_piece(move)][to_sq(move)] < CounterMovePruneThreshold) && (*contHist[1])[pos.moved_piece(move)][to_sq(move)] < CounterMovePruneThreshold)
@ -1557,11 +1558,11 @@ moves_loop: // When in check, search starts here
// movecount pruning for quiet check evasions // movecount pruning for quiet check evasions
if ( bestValue > VALUE_TB_LOSS_IN_MAX_PLY if ( bestValue > VALUE_TB_LOSS_IN_MAX_PLY
&& quietCheckEvasions > 1 && quietCheckEvasions > 1
&& !captureOrPromotion && !capture
&& ss->inCheck) && ss->inCheck)
continue; continue;
quietCheckEvasions += !captureOrPromotion && ss->inCheck; quietCheckEvasions += !capture && ss->inCheck;
// Make and search the move // Make and search the move
pos.do_move(move, st, givesCheck); pos.do_move(move, st, givesCheck);
@ -1680,7 +1681,7 @@ moves_loop: // When in check, search starts here
bonus2 = bestValue > beta + PawnValueMg ? bonus1 // larger bonus bonus2 = bestValue > beta + PawnValueMg ? bonus1 // larger bonus
: stat_bonus(depth); // smaller 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 // Increase stats for the best move in case it was a quiet move
update_quiet_stats(pos, ss, bestMove, bonus2); update_quiet_stats(pos, ss, bestMove, bonus2);