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:
parent
e31f97e3ba
commit
910cf8b218
2 changed files with 18 additions and 22 deletions
|
@ -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"
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue