clean up code

**Non functional changes:**
in search.cpp:
- an unnecessary pair of parenthesis in the IIR condition has been removed.
- refactored the stalemate trap detection code

in movepick.cpp:
- use the variables `from`, `to`, `piece`, `pieceType` and `capturedPiece`  instead of calling the same functions multiple times in `MovePicker::score()`.
- rename `MovePicker::other_piece_types_mobile()`.

**Functional changes:**
- make sure the processed move is always legal in `MovePicker::other_piece_types_mobile()`.

passed non regression STC:
https://tests.stockfishchess.org/tests/view/6829da686ec7634154f99faf
LLR: 2.93 (-2.94,2.94) <-1.75,0.25>
Total: 95680 W: 24962 L: 24820 D: 45898
Ptnml(0-2): 221, 9622, 28025, 9738, 234

Passed non regression LTC:
https://tests.stockfishchess.org/tests/view/682a102c6ec7634154f9a086
LLR: 2.94 (-2.94,2.94) <-1.75,0.25>
Total: 117666 W: 30065 L: 29957 D: 57644
Ptnml(0-2): 45, 10173, 38291, 10277, 47

Run of 10k games on the stalemate opening book:
https://tests.stockfishchess.org/tests/view/682b114e6ec7634154f9aa2d
Elo: 0.76 ± 0.9 (95%) LOS: 95.3%
Total: 10000 W: 4637 L: 4615 D: 748
Ptnml(0-2): 0, 75, 4828, 97, 0
nElo: 5.83 ± 6.8 (95%) PairsRatio: 1.29

closes https://github.com/official-stockfish/Stockfish/pull/6080

Bench: 2422771
This commit is contained in:
Nonlinear2
2025-05-21 07:25:40 +02:00
committed by Joost VandeVondele
parent 347e328fdb
commit 54fb42ddf8
3 changed files with 44 additions and 54 deletions
+19 -19
View File
@@ -910,7 +910,7 @@ Value Search::Worker::search(
// Step 10. Internal iterative reductions
// For PV nodes without a ttMove as well as for deep enough cutNodes, we decrease depth.
// (*Scaler) Especially if they make IIR less aggressive.
if ((!allNode && depth >= (PvNode ? 5 : 7)) && !ttData.move)
if (!allNode && depth >= (PvNode ? 5 : 7) && !ttData.move)
depth--;
// Step 11. ProbCut
@@ -1002,10 +1002,8 @@ moves_loop: // When in check, search starts here
// Check for legality
if (!pos.legal(move))
{
mp.mark_current_illegal();
continue;
}
// At root obey the "searchmoves" option and skip moves not listed in Root
// Move List. In MultiPV mode we also skip PV moves that have been already
// searched and those of lower "TB rank" if we are in a TB root position.
@@ -1074,15 +1072,17 @@ moves_loop: // When in check, search starts here
int seeHist = std::clamp(captHist / 31, -137 * depth, 125 * depth);
if (!pos.see_ge(move, -158 * depth - seeHist))
{
bool skip = true;
if (depth > 2 && !capture && givesCheck && alpha < 0
&& pos.non_pawn_material(us) == PieceValue[movedPiece]
&& PieceValue[movedPiece] >= RookValue
&& !(PseudoAttacks[KING][pos.square<KING>(us)] & move.from_sq()))
// if the opponent captures last mobile piece it might be stalemate
skip = mp.other_piece_types_mobile(type_of(movedPiece));
bool mayStalemateTrap =
depth > 2 && givesCheck && alpha < 0
&& !capture // we consider that captures will likely destroy the stalemate configuration
&& pos.non_pawn_material(us) == PieceValue[movedPiece]
&& PieceValue[movedPiece] >= RookValue
// it can't be stalemate if we moved a piece adjacent to the king
&& !(attacks_bb<KING>(pos.square<KING>(us)) & move.from_sq())
&& !mp.can_move_king_or_pawn();
if (skip)
// avoid pruning sacrifices of our last piece for stalemate
if (!mayStalemateTrap)
continue;
}
}
@@ -1873,8 +1873,8 @@ void update_all_stats(const Position& pos,
int moveCount) {
CapturePieceToHistory& captureHistory = workerThread.captureHistory;
Piece moved_piece = pos.moved_piece(bestMove);
PieceType captured;
Piece movedPiece = pos.moved_piece(bestMove);
PieceType capturedPiece;
int bonus = std::min(143 * depth - 89, 1496) + 302 * (bestMove == ttMove);
int malus = std::min(737 * depth - 179, 3141) - 30 * moveCount;
@@ -1890,8 +1890,8 @@ void update_all_stats(const Position& pos,
else
{
// Increase stats for the best move in case it was a capture move
captured = type_of(pos.piece_on(bestMove.to_sq()));
captureHistory[moved_piece][bestMove.to_sq()][captured] << bonus * 1213 / 1024;
capturedPiece = type_of(pos.piece_on(bestMove.to_sq()));
captureHistory[movedPiece][bestMove.to_sq()][capturedPiece] << bonus * 1213 / 1024;
}
// Extra penalty for a quiet early move that was not a TT move in
@@ -1902,9 +1902,9 @@ void update_all_stats(const Position& pos,
// Decrease stats for all non-best capture moves
for (Move move : capturesSearched)
{
moved_piece = pos.moved_piece(move);
captured = type_of(pos.piece_on(move.to_sq()));
captureHistory[moved_piece][move.to_sq()][captured] << -malus * 1388 / 1024;
movedPiece = pos.moved_piece(move);
capturedPiece = type_of(pos.piece_on(move.to_sq()));
captureHistory[movedPiece][move.to_sq()][capturedPiece] << -malus * 1388 / 1024;
}
}