X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovepick.cpp;h=78765beccabc228f0a8c8346866866b061a0d700;hp=c52384947a6381008b661b5d70d5c8496ea34f9b;hb=d909d10f33df023be46a2633608bdf655d1f5a62;hpb=647402ff7910ff26f5d6b967812d85f5f4259fee diff --git a/src/movepick.cpp b/src/movepick.cpp index c5238494..78765bec 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -26,7 +26,7 @@ namespace { enum Stages { - MAIN_SEARCH, GOOD_CAPTURES, KILLERS, GOOD_QUIETS, BAD_QUIETS, BAD_CAPTURES, + MAIN_SEARCH, GOOD_CAPTURES, KILLERS, QUIET, BAD_CAPTURES, EVASION, ALL_EVASIONS, QSEARCH_WITH_CHECKS, QCAPTURES_1, CHECKS, QSEARCH_WITHOUT_CHECKS, QCAPTURES_2, @@ -67,22 +67,21 @@ namespace { /// search captures, promotions, and some checks) and how important good move /// ordering is at the current node. -MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const HistoryStats& h, - const CounterMoveStats& cmh, const CounterMoveStats& fmh, - Move cm, Search::Stack* s) - : pos(p), history(h), counterMoveHistory(&cmh), - followupMoveHistory(&fmh), ss(s), countermove(cm), depth(d) { +MovePicker::MovePicker(const Position& p, Move ttm, Depth d, Search::Stack* s) + : pos(p), ss(s), depth(d) { assert(d > DEPTH_ZERO); + Square prevSq = to_sq((ss-1)->currentMove); + countermove = pos.this_thread()->counterMoves[pos.piece_on(prevSq)][prevSq]; + stage = pos.checkers() ? EVASION : MAIN_SEARCH; ttMove = ttm && pos.pseudo_legal(ttm) ? ttm : MOVE_NONE; endMoves += (ttMove != MOVE_NONE); } -MovePicker::MovePicker(const Position& p, Move ttm, Depth d, - const HistoryStats& h, Square s) - : pos(p), history(h) { +MovePicker::MovePicker(const Position& p, Move ttm, Depth d, Square s) + : pos(p) { assert(d <= DEPTH_ZERO); @@ -106,8 +105,8 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, endMoves += (ttMove != MOVE_NONE); } -MovePicker::MovePicker(const Position& p, Move ttm, const HistoryStats& h, Value th) - : pos(p), history(h), threshold(th) { +MovePicker::MovePicker(const Position& p, Move ttm, Value th) + : pos(p), threshold(th) { assert(!pos.checkers()); @@ -142,10 +141,21 @@ void MovePicker::score() { template<> void MovePicker::score() { + const HistoryStats& history = pos.this_thread()->history; + const FromToStats& fromTo = pos.this_thread()->fromTo; + + const CounterMoveStats* cm = (ss-1)->counterMoves; + const CounterMoveStats* fm = (ss-2)->counterMoves; + const CounterMoveStats* f2 = (ss-4)->counterMoves; + + Color c = pos.side_to_move(); + for (auto& m : *this) - m.value = history[pos.moved_piece(m)][to_sq(m)] - + (*counterMoveHistory )[pos.moved_piece(m)][to_sq(m)] - + (*followupMoveHistory)[pos.moved_piece(m)][to_sq(m)]; + m.value = history[pos.moved_piece(m)][to_sq(m)] + + (cm ? (*cm)[pos.moved_piece(m)][to_sq(m)] : VALUE_ZERO) + + (fm ? (*fm)[pos.moved_piece(m)][to_sq(m)] : VALUE_ZERO) + + (f2 ? (*f2)[pos.moved_piece(m)][to_sq(m)] : VALUE_ZERO) + + fromTo.get(c, m); } template<> @@ -153,6 +163,9 @@ void MovePicker::score() { // Try winning and equal captures ordered by MVV/LVA, then non-captures ordered // by history value, then bad captures and quiet moves with a negative SEE ordered // by SEE value. + const HistoryStats& history = pos.this_thread()->history; + const FromToStats& fromTo = pos.this_thread()->fromTo; + Color c = pos.side_to_move(); Value see; for (auto& m : *this) @@ -163,7 +176,7 @@ void MovePicker::score() { m.value = PieceValue[MG][pos.piece_on(to_sq(m))] - Value(type_of(pos.moved_piece(m))) + HistoryStats::Max; else - m.value = history[pos.moved_piece(m)][to_sq(m)]; + m.value = history[pos.moved_piece(m)][to_sq(m)] + fromTo.get(c, m); } @@ -192,17 +205,15 @@ void MovePicker::generate_next_stage() { endMoves = cur + 2 + (countermove != killers[0] && countermove != killers[1]); break; - case GOOD_QUIETS: - endQuiets = endMoves = generate(pos, moves); + case QUIET: + endMoves = generate(pos, moves); score(); - endMoves = std::partition(cur, endMoves, [](const ExtMove& m) { return m.value > VALUE_ZERO; }); - insertion_sort(cur, endMoves); - break; - - case BAD_QUIETS: - cur = endMoves; - endMoves = endQuiets; - if (depth >= 3 * ONE_PLY) + if (depth < 3 * ONE_PLY) + { + ExtMove* goodQuiet = std::partition(cur, endMoves, [](const ExtMove& m) + { return m.value > VALUE_ZERO; }); + insertion_sort(cur, goodQuiet); + } else insertion_sort(cur, endMoves); break; @@ -275,7 +286,7 @@ Move MovePicker::next_move() { return move; break; - case GOOD_QUIETS: case BAD_QUIETS: + case QUIET: move = *cur++; if ( move != ttMove && move != killers[0]