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
+24 -33
View File
@@ -126,11 +126,11 @@ void MovePicker::score() {
static_assert(Type == CAPTURES || Type == QUIETS || Type == EVASIONS, "Wrong type");
Color us = pos.side_to_move();
[[maybe_unused]] Bitboard threatenedPieces, threatByLesser[QUEEN + 1];
if constexpr (Type == QUIETS)
{
Color us = pos.side_to_move();
threatByLesser[KNIGHT] = threatByLesser[BISHOP] = pos.attacks_by<PAWN>(~us);
threatByLesser[ROOK] =
pos.attacks_by<KNIGHT>(~us) | pos.attacks_by<BISHOP>(~us) | threatByLesser[KNIGHT];
@@ -143,21 +143,21 @@ void MovePicker::score() {
}
for (auto& m : *this)
{
const Square from = m.from_sq();
const Square to = m.to_sq();
const Piece pc = pos.moved_piece(m);
const PieceType pt = type_of(pc);
const Piece capturedPiece = pos.piece_on(to);
if constexpr (Type == CAPTURES)
m.value =
7 * int(PieceValue[pos.piece_on(m.to_sq())])
+ 1024 * bool(pos.check_squares(type_of(pos.moved_piece(m))) & m.to_sq())
+ (*captureHistory)[pos.moved_piece(m)][m.to_sq()][type_of(pos.piece_on(m.to_sq()))];
m.value = (*captureHistory)[pc][to][type_of(capturedPiece)]
+ 7 * int(PieceValue[capturedPiece]) + 1024 * bool(pos.check_squares(pt) & to);
else if constexpr (Type == QUIETS)
{
Piece pc = pos.moved_piece(m);
PieceType pt = type_of(pc);
Square from = m.from_sq();
Square to = m.to_sq();
// histories
m.value = 2 * (*mainHistory)[pos.side_to_move()][m.from_to()];
m.value = 2 * (*mainHistory)[us][m.from_to()];
m.value += 2 * (*pawnHistory)[pawn_structure_index(pos)][pc][to];
m.value += (*continuationHistory[0])[pc][to];
m.value += (*continuationHistory[1])[pc][to];
@@ -184,15 +184,15 @@ void MovePicker::score() {
else // Type == EVASIONS
{
if (pos.capture_stage(m))
m.value = PieceValue[pos.piece_on(m.to_sq())] + (1 << 28);
m.value = PieceValue[capturedPiece] + (1 << 28);
else
{
m.value = (*mainHistory)[pos.side_to_move()][m.from_to()]
+ (*continuationHistory[0])[pos.moved_piece(m)][m.to_sq()];
m.value = (*mainHistory)[us][m.from_to()] + (*continuationHistory[0])[pc][to];
if (ply < LOW_PLY_HISTORY_SIZE)
m.value += 2 * (*lowPlyHistory)[ply][m.from_to()] / (1 + ply);
}
}
}
}
// Returns the next move satisfying a predicate function.
@@ -221,7 +221,6 @@ top:
case QSEARCH_TT :
case PROBCUT_TT :
++stage;
cur = moves + 1;
return ttMove;
case CAPTURE_INIT :
@@ -237,12 +236,10 @@ top:
case GOOD_CAPTURE :
if (select([&]() {
if (!pos.see_ge(*cur, -cur->value / 18))
{
std::swap(*endBadCaptures++, *cur);
return false;
}
return true;
if (pos.see_ge(*cur, -cur->value / 18))
return true;
std::swap(*endBadCaptures++, *cur);
return false;
}))
return *(cur - 1);
@@ -315,23 +312,17 @@ top:
void MovePicker::skip_quiet_moves() { skipQuiets = true; }
bool MovePicker::other_piece_types_mobile(PieceType pt) {
// this function must be called after all quiet moves and captures have been generated
bool MovePicker::can_move_king_or_pawn() {
assert(stage == GOOD_QUIET || stage == BAD_QUIET || stage == EVASION);
// verify all generated captures and quiets
for (ExtMove* m = moves; m < endMoves; ++m)
{
if (*m && type_of(pos.moved_piece(*m)) != pt)
{
if (type_of(pos.moved_piece(*m)) != KING)
return true;
if (pos.legal(*m))
return true;
}
PieceType movedPieceType = type_of(pos.moved_piece(*m));
if ((movedPieceType == PAWN || movedPieceType == KING) && pos.legal(*m))
return true;
}
return false;
}
void MovePicker::mark_current_illegal() { *(cur - 1) = Move::none(); }
} // namespace Stockfish