1
0
Fork 0
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:
Marco Costalba 2012-01-22 14:25:31 +01:00
parent 97e0b0a01e
commit 662d1859bd
2 changed files with 36 additions and 41 deletions

View file

@ -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:

View file

@ -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;