From e59d053984466dcea45cdbb60157a32acf132028 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Thu, 5 Nov 2009 14:40:51 +0100 Subject: [PATCH] Enable PH_TT_MOVES during evasion generation This allow us to avoid the generation of the evasion moves if we already have a TT move, and in case we have a cut-off we skip evasion generation altoghter. Node count is changed because now we try TT move _before_ to generate evasions. The search on the TT move alters the piece lists so that when we come back to generate evasions we build the move list with a diferent order and this alters the node count. Signed-off-by: Marco Costalba --- src/movepick.cpp | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/src/movepick.cpp b/src/movepick.cpp index 26627474..4479c321 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -52,7 +52,7 @@ namespace { CACHE_LINE_ALIGNMENT const uint8_t MainSearchPhaseTable[] = { PH_TT_MOVES, PH_GOOD_CAPTURES, PH_KILLERS, PH_NONCAPTURES, PH_BAD_CAPTURES, PH_STOP}; - const uint8_t EvasionsPhaseTable[] = { PH_EVASIONS, PH_STOP}; + const uint8_t EvasionsPhaseTable[] = { PH_TT_MOVES, PH_EVASIONS, PH_STOP}; const uint8_t QsearchWithChecksPhaseTable[] = { PH_TT_MOVES, PH_QCAPTURES, PH_QCHECKS, PH_STOP}; const uint8_t QsearchWithoutChecksPhaseTable[] = { PH_TT_MOVES, PH_QCAPTURES, PH_STOP}; } @@ -77,7 +77,7 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, finished = false; lastBadCapture = badCaptures; - if (ss) + if (ss && !p.is_check()) { ttMoves[1].move = (ss->mateKiller == ttm)? MOVE_NONE : ss->mateKiller; searchTT |= ttMoves[1].move; @@ -91,13 +91,13 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, if (p.is_check()) phasePtr = EvasionsPhaseTable; else if (d > Depth(0)) - phasePtr = MainSearchPhaseTable + !searchTT; + phasePtr = MainSearchPhaseTable; else if (d == Depth(0)) - phasePtr = QsearchWithChecksPhaseTable + !searchTT; + phasePtr = QsearchWithChecksPhaseTable; else - phasePtr = QsearchWithoutChecksPhaseTable + !searchTT; + phasePtr = QsearchWithoutChecksPhaseTable; - phasePtr--; + phasePtr += !searchTT - 1; go_next_phase(); } @@ -226,20 +226,17 @@ void MovePicker::score_noncaptures() { } void MovePicker::score_evasions() { - // Always try ttMove as first. Then try good captures ordered - // by MVV/LVA, then non-captures if destination square is not - // under attack, ordered by history value, and at the end - // bad-captures and non-captures with a negative SEE. This - // last group is ordered by the SEE score. + // Try good captures ordered by MVV/LVA, then non-captures if + // destination square is not under attack, ordered by history + // value, and at the end bad-captures and non-captures with a + // negative SEE. This last group is ordered by the SEE score. Move m; int seeScore; for (MoveStack* cur = moves; cur != lastMove; cur++) { m = cur->move; - if (m == ttMoves[0].move) - cur->score = 2 * HistoryMax; - else if ((seeScore = pos.see_sign(m)) < 0) + if ((seeScore = pos.see_sign(m)) < 0) cur->score = seeScore; else if (pos.move_is_capture(m)) cur->score = pos.midgame_value_of_piece_on(move_to(m)) @@ -257,9 +254,6 @@ void MovePicker::score_evasions() { Move MovePicker::get_next_move() { - assert(!pos.is_check() || *phasePtr == PH_EVASIONS || *phasePtr == PH_STOP); - assert( pos.is_check() || *phasePtr != PH_EVASIONS); - Move move; while (true) @@ -320,11 +314,6 @@ Move MovePicker::get_next_move() { return move; case PH_EVASIONS: - move = pick_best(curMove++, lastMove).move; - if (pos.pl_move_is_legal(move, pinned)) - return move; - break; - case PH_QCAPTURES: move = pick_best(curMove++, lastMove).move; if ( move != ttMoves[0].move -- 2.39.2