diff --git a/src/movepick.cpp b/src/movepick.cpp index d2764fa84..3e7c10160 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -56,6 +56,7 @@ enum Stages { QCAPTURE }; + // Sort moves in descending order up to and including a given limit. // The order of moves smaller than the limit is left unspecified. void partial_insertion_sort(ExtMove* begin, ExtMove* end, int limit) { @@ -207,6 +208,7 @@ Move MovePicker::select(Pred filter) { // picking the move with the highest score from a list of generated moves. Move MovePicker::next_move() { + constexpr int goodQuietThreshold = -14000; top: switch (stage) { @@ -222,7 +224,7 @@ top: case PROBCUT_INIT : case QCAPTURE_INIT : cur = endBadCaptures = moves; - endCur = generate(pos, cur); + endCur = endCaptures = generate(pos, cur); score(); partial_insertion_sort(cur, endCur, std::numeric_limits::min()); @@ -244,8 +246,7 @@ top: case QUIET_INIT : if (!skipQuiets) { - cur = endBadQuiets = endBadCaptures; - endCur = generate(pos, cur); + endCur = endGenerated = generate(pos, cur); score(); partial_insertion_sort(cur, endCur, -3560 * depth); @@ -255,12 +256,7 @@ top: [[fallthrough]]; case GOOD_QUIET : - if (!skipQuiets && select([&]() { - if (cur->value > -14000) - return true; - *endBadQuiets++ = *cur; - return false; - })) + if (!skipQuiets && select([&]() { return cur->value > goodQuietThreshold; })) return *(cur - 1); // Prepare the pointers to loop over the bad captures @@ -274,22 +270,22 @@ top: if (select([]() { return true; })) return *(cur - 1); - // Prepare the pointers to loop over the bad quiets - cur = endBadCaptures; - endCur = endBadQuiets; + // Prepare the pointers to loop over quiets again + cur = endCaptures; + endCur = endGenerated; ++stage; [[fallthrough]]; case BAD_QUIET : if (!skipQuiets) - return select([]() { return true; }); + return select([&]() { return cur->value <= goodQuietThreshold; }); return Move::none(); case EVASION_INIT : cur = moves; - endCur = generate(pos, cur); + endCur = endGenerated = generate(pos, cur); score(); partial_insertion_sort(cur, endCur, std::numeric_limits::min()); @@ -315,7 +311,7 @@ bool MovePicker::can_move_king_or_pawn() const { // SEE negative captures shouldn't be returned in GOOD_CAPTURE stage assert(stage > GOOD_CAPTURE && stage != EVASION_INIT); - for (const ExtMove* m = moves; m < endCur; ++m) + for (const ExtMove* m = moves; m < endGenerated; ++m) { PieceType movedPieceType = type_of(pos.moved_piece(*m)); if ((movedPieceType == PAWN || movedPieceType == KING) && pos.legal(*m)) diff --git a/src/movepick.h b/src/movepick.h index b6784fb78..bf0c96c7c 100644 --- a/src/movepick.h +++ b/src/movepick.h @@ -67,7 +67,7 @@ class MovePicker { const PieceToHistory** continuationHistory; const PawnHistory* pawnHistory; Move ttMove; - ExtMove * cur, *endCur, *endBadCaptures, *endBadQuiets; + ExtMove * cur, *endCur, *endBadCaptures, *endCaptures, *endGenerated; int stage; int threshold; Depth depth;