mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 01:03:09 +00:00
Join refutation stages in the movepicker
Unifies a bit further the three refuation stages in the MovePicker class. Also treat the skipping of TT move now always via select_move(), as discussed in pull request #1454. Passed STC: LLR: 2.95 (-2.94,2.94) [-3.00,1.00] Total: 16608 W: 3461 L: 3331 D: 9816 http://tests.stockfishchess.org/tests/view/5ab0aaf00ebc59029fb6f6c3 Closes https://github.com/official-stockfish/Stockfish/pull/1502 No functional change.
This commit is contained in:
parent
ed26d71354
commit
d40e7ee209
2 changed files with 23 additions and 24 deletions
|
@ -25,7 +25,7 @@
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
enum Stages {
|
enum Stages {
|
||||||
MAIN_TT, CAPTURE_INIT, GOOD_CAPTURE, KILLER0, KILLER1, COUNTERMOVE, QUIET_INIT, QUIET, BAD_CAPTURE,
|
MAIN_TT, CAPTURE_INIT, GOOD_CAPTURE, REFUTATION, QUIET_INIT, QUIET, BAD_CAPTURE,
|
||||||
EVASION_TT, EVASION_INIT, EVASION,
|
EVASION_TT, EVASION_INIT, EVASION,
|
||||||
PROBCUT_TT, PROBCUT_INIT, PROBCUT,
|
PROBCUT_TT, PROBCUT_INIT, PROBCUT,
|
||||||
QSEARCH_TT, QCAPTURE_INIT, QCAPTURE, QCHECK_INIT, QCHECK
|
QSEARCH_TT, QCAPTURE_INIT, QCAPTURE, QCHECK_INIT, QCHECK
|
||||||
|
@ -60,9 +60,9 @@ namespace {
|
||||||
|
|
||||||
/// MovePicker constructor for the main search
|
/// MovePicker constructor for the main search
|
||||||
MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHistory* mh,
|
MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHistory* mh,
|
||||||
const CapturePieceToHistory* cph, const PieceToHistory** ch, Move cm, Move* killers_p)
|
const CapturePieceToHistory* cph, const PieceToHistory** ch, Move cm, Move* killers)
|
||||||
: pos(p), mainHistory(mh), captureHistory(cph), contHistory(ch),
|
: pos(p), mainHistory(mh), captureHistory(cph), contHistory(ch),
|
||||||
refutations{killers_p[0], killers_p[1], cm}, depth(d){
|
refutations{{killers[0], 0}, {killers[1], 0}, {cm, 0}}, depth(d){
|
||||||
|
|
||||||
assert(d > DEPTH_ZERO);
|
assert(d > DEPTH_ZERO);
|
||||||
|
|
||||||
|
@ -129,7 +129,8 @@ void MovePicker::score() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// MovePicker::select_move() returns the next move satisfying a predicate function
|
/// MovePicker::select_move() returns the next move satisfying a predicate function.
|
||||||
|
/// It never returns the TT move.
|
||||||
template<PickType T, typename Pred>
|
template<PickType T, typename Pred>
|
||||||
Move MovePicker::select_move(Pred filter) {
|
Move MovePicker::select_move(Pred filter) {
|
||||||
|
|
||||||
|
@ -147,8 +148,8 @@ Move MovePicker::select_move(Pred filter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// MovePicker::next_move() is the most important method of the MovePicker class. It
|
/// MovePicker::next_move() is the most important method of the MovePicker class. It
|
||||||
/// returns a new pseudo legal move every time it is called, until there are no more
|
/// returns a new pseudo legal move every time it is called until there are no more
|
||||||
/// moves left. It picks the move with the highest score from a list of generated moves.
|
/// moves left, picking the move with the highest score from a list of generated moves.
|
||||||
Move MovePicker::next_move(bool skipQuiets) {
|
Move MovePicker::next_move(bool skipQuiets) {
|
||||||
|
|
||||||
top:
|
top:
|
||||||
|
@ -176,25 +177,23 @@ top:
|
||||||
true : (*endBadCaptures++ = move, false); }))
|
true : (*endBadCaptures++ = move, false); }))
|
||||||
return move;
|
return move;
|
||||||
|
|
||||||
|
// Prepare the pointers to loop over the refutations array
|
||||||
|
cur = std::begin(refutations), endMoves = std::end(refutations);
|
||||||
|
|
||||||
// If the countermove is the same as a killer, skip it
|
// If the countermove is the same as a killer, skip it
|
||||||
if ( refutations[0] == refutations[2]
|
if ( refutations[0].move == refutations[2].move
|
||||||
|| refutations[1] == refutations[2])
|
|| refutations[1].move == refutations[2].move)
|
||||||
refutations[2] = MOVE_NONE;
|
--endMoves;
|
||||||
|
|
||||||
++stage;
|
++stage;
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
|
|
||||||
case KILLER0:
|
case REFUTATION:
|
||||||
case KILLER1:
|
if (select_move<NEXT>([&](){ return move != MOVE_NONE
|
||||||
case COUNTERMOVE:
|
&& !pos.capture(move)
|
||||||
while (stage <= COUNTERMOVE)
|
&& pos.pseudo_legal(move); }))
|
||||||
{
|
return move;
|
||||||
move = refutations[ stage++ - KILLER0];
|
++stage;
|
||||||
if ( move != MOVE_NONE
|
|
||||||
&& move != ttMove
|
|
||||||
&& pos.pseudo_legal(move)
|
|
||||||
&& !pos.capture(move))
|
|
||||||
return move;
|
|
||||||
}
|
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
|
|
||||||
case QUIET_INIT:
|
case QUIET_INIT:
|
||||||
|
@ -212,7 +211,7 @@ top:
|
||||||
&& move != refutations[2];}))
|
&& move != refutations[2];}))
|
||||||
return move;
|
return move;
|
||||||
|
|
||||||
// Point to beginning and end of bad captures
|
// Prepare the pointers to loop over the bad captures
|
||||||
cur = moves, endMoves = endBadCaptures;
|
cur = moves, endMoves = endBadCaptures;
|
||||||
++stage;
|
++stage;
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
|
|
|
@ -131,8 +131,8 @@ private:
|
||||||
const ButterflyHistory* mainHistory;
|
const ButterflyHistory* mainHistory;
|
||||||
const CapturePieceToHistory* captureHistory;
|
const CapturePieceToHistory* captureHistory;
|
||||||
const PieceToHistory** contHistory;
|
const PieceToHistory** contHistory;
|
||||||
Move ttMove, refutations[3];
|
Move ttMove;
|
||||||
ExtMove *cur, *endMoves, *endBadCaptures;
|
ExtMove refutations[3], *cur, *endMoves, *endBadCaptures;
|
||||||
int stage;
|
int stage;
|
||||||
Move move;
|
Move move;
|
||||||
Square recaptureSquare;
|
Square recaptureSquare;
|
||||||
|
|
Loading…
Add table
Reference in a new issue