mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Shrink sequencer table
Integrate TT_MOVE step into the first state. This allows to avoid the first call to next_phase() in case of a TT move. And use overflow detection instead of the bunch of STOP_XX states to detect end of moves. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
97e0b0a01e
commit
662d1859bd
2 changed files with 36 additions and 41 deletions
|
@ -27,13 +27,13 @@
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
enum Sequencer {
|
enum Sequencer {
|
||||||
MAIN_SEARCH, TT_MOVE_S1, CAPTURES_S1, KILLERS_S1, QUIETS_1_S1,
|
MAIN_SEARCH, CAPTURES_S1, KILLERS_S1, QUIETS_1_S1, QUIETS_2_S1, BAD_CAPTURES_S1,
|
||||||
QUIETS_2_S1, BAD_CAPTURES_S1, STOP_S1,
|
EVASION, EVASIONS_S2,
|
||||||
EVASIONS, TT_MOVE_S2, EVASIONS_S2, STOP_S2,
|
QSEARCH_0, CAPTURES_S3, QUIET_CHECKS_S3,
|
||||||
CAPTURES_AND_CHECKS, TT_MOVE_S3, CAPTURES_S3, QUIET_CHECKS_S3, STOP_S3,
|
QSEARCH_1, CAPTURES_S4,
|
||||||
CAPTURES, TT_MOVE_S4, CAPTURES_S4, STOP_S4,
|
PROBCUT, CAPTURES_S5,
|
||||||
PROBCUT, TT_MOVE_S5, CAPTURES_S5, STOP_S5,
|
RECAPTURE, CAPTURES_S6,
|
||||||
RECAPTURES, CAPTURES_S6, STOP_S6
|
STOP
|
||||||
};
|
};
|
||||||
|
|
||||||
// Unary predicate used by std::partition to split positive scores from remaining
|
// Unary predicate used by std::partition to split positive scores from remaining
|
||||||
|
@ -63,14 +63,16 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
|
||||||
assert(d > DEPTH_ZERO);
|
assert(d > DEPTH_ZERO);
|
||||||
|
|
||||||
captureThreshold = 0;
|
captureThreshold = 0;
|
||||||
curMove = lastMove = 0;
|
curMove = lastMove = moves;
|
||||||
badCaptures = moves + MAX_MOVES;
|
badCaptures = moves + MAX_MOVES;
|
||||||
|
|
||||||
if (p.in_check())
|
if (p.in_check())
|
||||||
phase = EVASIONS;
|
phase = EVASION;
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
phase = MAIN_SEARCH;
|
||||||
|
|
||||||
killers[0].move = ss->killers[0];
|
killers[0].move = ss->killers[0];
|
||||||
killers[1].move = ss->killers[1];
|
killers[1].move = ss->killers[1];
|
||||||
|
|
||||||
|
@ -81,28 +83,26 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
|
||||||
// Consider negative captures as good if still enough to reach beta
|
// Consider negative captures as good if still enough to reach beta
|
||||||
else if (ss && ss->eval > beta)
|
else if (ss && ss->eval > beta)
|
||||||
captureThreshold = beta - ss->eval;
|
captureThreshold = beta - ss->eval;
|
||||||
|
|
||||||
phase = MAIN_SEARCH;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ttMove = (ttm && pos.is_pseudo_legal(ttm) ? ttm : MOVE_NONE);
|
ttMove = (ttm && pos.is_pseudo_legal(ttm) ? ttm : MOVE_NONE);
|
||||||
phase += (ttMove == MOVE_NONE);
|
lastMove += (ttMove != MOVE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
|
MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
|
||||||
Square sq) : pos(p), H(h), curMove(0), lastMove(0) {
|
Square sq) : pos(p), H(h), curMove(moves), lastMove(moves) {
|
||||||
|
|
||||||
assert(d <= DEPTH_ZERO);
|
assert(d <= DEPTH_ZERO);
|
||||||
|
|
||||||
if (p.in_check())
|
if (p.in_check())
|
||||||
phase = EVASIONS;
|
phase = EVASION;
|
||||||
|
|
||||||
else if (d > DEPTH_QS_NO_CHECKS)
|
else if (d > DEPTH_QS_NO_CHECKS)
|
||||||
phase = CAPTURES_AND_CHECKS;
|
phase = QSEARCH_0;
|
||||||
|
|
||||||
else if (d > DEPTH_QS_RECAPTURES)
|
else if (d > DEPTH_QS_RECAPTURES)
|
||||||
{
|
{
|
||||||
phase = CAPTURES;
|
phase = QSEARCH_1;
|
||||||
|
|
||||||
// Skip TT move if is not a capture or a promotion, this avoids qsearch
|
// Skip TT move if is not a capture or a promotion, this avoids qsearch
|
||||||
// tree explosion due to a possible perpetual check or similar rare cases
|
// tree explosion due to a possible perpetual check or similar rare cases
|
||||||
|
@ -112,17 +112,17 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const History& h,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
phase = RECAPTURES - 1;
|
phase = RECAPTURE;
|
||||||
recaptureSquare = sq;
|
recaptureSquare = sq;
|
||||||
ttm = MOVE_NONE;
|
ttm = MOVE_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ttMove = (ttm && pos.is_pseudo_legal(ttm) ? ttm : MOVE_NONE);
|
ttMove = (ttm && pos.is_pseudo_legal(ttm) ? ttm : MOVE_NONE);
|
||||||
phase += (ttMove == MOVE_NONE);
|
lastMove += (ttMove != MOVE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
MovePicker::MovePicker(const Position& p, Move ttm, const History& h,
|
MovePicker::MovePicker(const Position& p, Move ttm, const History& h, PieceType pt)
|
||||||
PieceType pt) : pos(p), H(h), curMove(0), lastMove(0) {
|
: pos(p), H(h), curMove(moves), lastMove(moves) {
|
||||||
|
|
||||||
assert(!pos.in_check());
|
assert(!pos.in_check());
|
||||||
|
|
||||||
|
@ -130,12 +130,12 @@ MovePicker::MovePicker(const Position& p, Move ttm, const History& h,
|
||||||
|
|
||||||
// In ProbCut we generate only captures better than parent's captured piece
|
// In ProbCut we generate only captures better than parent's captured piece
|
||||||
captureThreshold = PieceValueMidgame[pt];
|
captureThreshold = PieceValueMidgame[pt];
|
||||||
|
|
||||||
if (ttm && (!pos.is_capture(ttm) || pos.see(ttm) <= captureThreshold))
|
|
||||||
ttm = MOVE_NONE;
|
|
||||||
|
|
||||||
ttMove = (ttm && pos.is_pseudo_legal(ttm) ? ttm : MOVE_NONE);
|
ttMove = (ttm && pos.is_pseudo_legal(ttm) ? ttm : MOVE_NONE);
|
||||||
phase += (ttMove == MOVE_NONE);
|
|
||||||
|
if (ttMove && (!pos.is_capture(ttMove) || pos.see(ttMove) <= captureThreshold))
|
||||||
|
ttMove = MOVE_NONE;
|
||||||
|
|
||||||
|
lastMove += (ttMove != MOVE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -208,19 +208,15 @@ void MovePicker::score_evasions() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// MovePicker::next_phase() generates, scores and sorts the next bunch of moves,
|
/// MovePicker::generate_next() generates, scores and sorts the next bunch of moves,
|
||||||
/// when there are no more moves to try for the current phase.
|
/// when there are no more moves to try for the current phase.
|
||||||
|
|
||||||
void MovePicker::next_phase() {
|
void MovePicker::generate_next() {
|
||||||
|
|
||||||
curMove = moves;
|
curMove = moves;
|
||||||
|
|
||||||
switch (++phase) {
|
switch (++phase) {
|
||||||
|
|
||||||
case TT_MOVE_S1: case TT_MOVE_S2: case TT_MOVE_S3: case TT_MOVE_S4: case TT_MOVE_S5:
|
|
||||||
lastMove = curMove + 1;
|
|
||||||
return;
|
|
||||||
|
|
||||||
case CAPTURES_S1: case CAPTURES_S3: case CAPTURES_S4: case CAPTURES_S5: case CAPTURES_S6:
|
case CAPTURES_S1: case CAPTURES_S3: case CAPTURES_S4: case CAPTURES_S5: case CAPTURES_S6:
|
||||||
lastMove = generate<MV_CAPTURE>(pos, moves);
|
lastMove = generate<MV_CAPTURE>(pos, moves);
|
||||||
score_captures();
|
score_captures();
|
||||||
|
@ -261,7 +257,9 @@ void MovePicker::next_phase() {
|
||||||
lastMove = generate<MV_QUIET_CHECK>(pos, moves);
|
lastMove = generate<MV_QUIET_CHECK>(pos, moves);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case STOP_S1: case STOP_S2: case STOP_S3: case STOP_S4: case STOP_S5: case STOP_S6:
|
case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: case RECAPTURE:
|
||||||
|
phase = STOP;
|
||||||
|
case STOP:
|
||||||
lastMove = curMove + 1; // Avoid another next_phase() call
|
lastMove = curMove + 1; // Avoid another next_phase() call
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -285,11 +283,11 @@ Move MovePicker::next_move() {
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
while (curMove == lastMove)
|
while (curMove == lastMove)
|
||||||
next_phase();
|
generate_next();
|
||||||
|
|
||||||
switch (phase) {
|
switch (phase) {
|
||||||
|
|
||||||
case TT_MOVE_S1: case TT_MOVE_S2: case TT_MOVE_S3: case TT_MOVE_S4: case TT_MOVE_S5:
|
case MAIN_SEARCH: case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT:
|
||||||
curMove++;
|
curMove++;
|
||||||
return ttMove;
|
return ttMove;
|
||||||
|
|
||||||
|
@ -318,8 +316,7 @@ Move MovePicker::next_move() {
|
||||||
return move;
|
return move;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QUIETS_1_S1:
|
case QUIETS_1_S1: case QUIETS_2_S1:
|
||||||
case QUIETS_2_S1:
|
|
||||||
move = (curMove++)->move;
|
move = (curMove++)->move;
|
||||||
if ( move != ttMove
|
if ( move != ttMove
|
||||||
&& move != killers[0].move
|
&& move != killers[0].move
|
||||||
|
@ -331,9 +328,7 @@ Move MovePicker::next_move() {
|
||||||
move = pick_best(curMove++, lastMove)->move;
|
move = pick_best(curMove++, lastMove)->move;
|
||||||
return move;
|
return move;
|
||||||
|
|
||||||
case EVASIONS_S2:
|
case EVASIONS_S2: case CAPTURES_S3: case CAPTURES_S4:
|
||||||
case CAPTURES_S3:
|
|
||||||
case CAPTURES_S4:
|
|
||||||
move = pick_best(curMove++, lastMove)->move;
|
move = pick_best(curMove++, lastMove)->move;
|
||||||
if (move != ttMove)
|
if (move != ttMove)
|
||||||
return move;
|
return move;
|
||||||
|
@ -357,7 +352,7 @@ Move MovePicker::next_move() {
|
||||||
return move;
|
return move;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STOP_S1: case STOP_S2: case STOP_S3: case STOP_S4: case STOP_S5: case STOP_S6:
|
case STOP:
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -47,7 +47,7 @@ private:
|
||||||
void score_captures();
|
void score_captures();
|
||||||
void score_noncaptures();
|
void score_noncaptures();
|
||||||
void score_evasions();
|
void score_evasions();
|
||||||
void next_phase();
|
void generate_next();
|
||||||
|
|
||||||
const Position& pos;
|
const Position& pos;
|
||||||
const History& H;
|
const History& H;
|
||||||
|
|
Loading…
Add table
Reference in a new issue