1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-11 11:39:15 +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 {
enum Sequencer {
MAIN_SEARCH, TT_MOVE_S1, CAPTURES_S1, KILLERS_S1, QUIETS_1_S1,
QUIETS_2_S1, BAD_CAPTURES_S1, STOP_S1,
EVASIONS, TT_MOVE_S2, EVASIONS_S2, STOP_S2,
CAPTURES_AND_CHECKS, TT_MOVE_S3, CAPTURES_S3, QUIET_CHECKS_S3, STOP_S3,
CAPTURES, TT_MOVE_S4, CAPTURES_S4, STOP_S4,
PROBCUT, TT_MOVE_S5, CAPTURES_S5, STOP_S5,
RECAPTURES, CAPTURES_S6, STOP_S6
MAIN_SEARCH, CAPTURES_S1, KILLERS_S1, QUIETS_1_S1, QUIETS_2_S1, BAD_CAPTURES_S1,
EVASION, EVASIONS_S2,
QSEARCH_0, CAPTURES_S3, QUIET_CHECKS_S3,
QSEARCH_1, CAPTURES_S4,
PROBCUT, CAPTURES_S5,
RECAPTURE, CAPTURES_S6,
STOP
};
// 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);
captureThreshold = 0;
curMove = lastMove = 0;
curMove = lastMove = moves;
badCaptures = moves + MAX_MOVES;
if (p.in_check())
phase = EVASIONS;
phase = EVASION;
else
{
phase = MAIN_SEARCH;
killers[0].move = ss->killers[0];
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
else if (ss && ss->eval > beta)
captureThreshold = beta - ss->eval;
phase = MAIN_SEARCH;
}
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,
Square sq) : pos(p), H(h), curMove(0), lastMove(0) {
Square sq) : pos(p), H(h), curMove(moves), lastMove(moves) {
assert(d <= DEPTH_ZERO);
if (p.in_check())
phase = EVASIONS;
phase = EVASION;
else if (d > DEPTH_QS_NO_CHECKS)
phase = CAPTURES_AND_CHECKS;
phase = QSEARCH_0;
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
// 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
{
phase = RECAPTURES - 1;
phase = RECAPTURE;
recaptureSquare = sq;
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,
PieceType pt) : pos(p), H(h), curMove(0), lastMove(0) {
MovePicker::MovePicker(const Position& p, Move ttm, const History& h, PieceType pt)
: pos(p), H(h), curMove(moves), lastMove(moves) {
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
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);
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.
void MovePicker::next_phase() {
void MovePicker::generate_next() {
curMove = moves;
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:
lastMove = generate<MV_CAPTURE>(pos, moves);
score_captures();
@ -261,7 +257,9 @@ void MovePicker::next_phase() {
lastMove = generate<MV_QUIET_CHECK>(pos, moves);
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
return;
@ -285,11 +283,11 @@ Move MovePicker::next_move() {
while (true)
{
while (curMove == lastMove)
next_phase();
generate_next();
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++;
return ttMove;
@ -318,8 +316,7 @@ Move MovePicker::next_move() {
return move;
break;
case QUIETS_1_S1:
case QUIETS_2_S1:
case QUIETS_1_S1: case QUIETS_2_S1:
move = (curMove++)->move;
if ( move != ttMove
&& move != killers[0].move
@ -331,9 +328,7 @@ Move MovePicker::next_move() {
move = pick_best(curMove++, lastMove)->move;
return move;
case EVASIONS_S2:
case CAPTURES_S3:
case CAPTURES_S4:
case EVASIONS_S2: case CAPTURES_S3: case CAPTURES_S4:
move = pick_best(curMove++, lastMove)->move;
if (move != ttMove)
return move;
@ -357,7 +352,7 @@ Move MovePicker::next_move() {
return move;
break;
case STOP_S1: case STOP_S2: case STOP_S3: case STOP_S4: case STOP_S5: case STOP_S6:
case STOP:
return MOVE_NONE;
default:

View file

@ -47,7 +47,7 @@ private:
void score_captures();
void score_noncaptures();
void score_evasions();
void next_phase();
void generate_next();
const Position& pos;
const History& H;