X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovepick.cpp;h=64380da9c3367e7d07a6e5cfbfabd2e0eeba9567;hp=3bc56751f94c3710ddc1051362fc1ac87a1f1c56;hb=7756344d5d2b93970e7cd423f8cbf6fb1da11b74;hpb=33d95482182e459eb033de47a31f142880aa9afb diff --git a/src/movepick.cpp b/src/movepick.cpp index 3bc56751..64380da9 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -31,9 +31,6 @@ namespace { QSEARCH_TT, QCAPTURE_INIT, QCAPTURE, QCHECK_INIT, QCHECK }; - // Helper filter used with select() - const auto Any = [](){ return true; }; - // partial_insertion_sort() sorts moves in descending order up to and including // a given limit. The order of moves smaller than the limit is left unspecified. void partial_insertion_sort(ExtMove* begin, ExtMove* end, int limit) { @@ -67,7 +64,7 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHist assert(d > DEPTH_ZERO); stage = pos.checkers() ? EVASION_TT : MAIN_TT; - ttMove = pos.pseudo_legal(ttm) ? ttm : MOVE_NONE; + ttMove = ttm && pos.pseudo_legal(ttm) ? ttm : MOVE_NONE; stage += (ttMove == MOVE_NONE); } @@ -79,8 +76,9 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, const ButterflyHist assert(d <= DEPTH_ZERO); stage = pos.checkers() ? EVASION_TT : QSEARCH_TT; - ttMove = pos.pseudo_legal(ttm) - && (depth > DEPTH_QS_RECAPTURES || to_sq(ttm) == recaptureSquare) ? ttm : MOVE_NONE; + ttMove = ttm + && (depth > DEPTH_QS_RECAPTURES || to_sq(ttm) == recaptureSquare) + && pos.pseudo_legal(ttm) ? ttm : MOVE_NONE; stage += (ttMove == MOVE_NONE); } @@ -92,8 +90,9 @@ MovePicker::MovePicker(const Position& p, Move ttm, Value th, const CapturePiece assert(!pos.checkers()); stage = PROBCUT_TT; - ttMove = pos.pseudo_legal(ttm) + ttMove = ttm && pos.capture(ttm) + && pos.pseudo_legal(ttm) && pos.see_ge(ttm, threshold) ? ttm : MOVE_NONE; stage += (ttMove == MOVE_NONE); } @@ -108,14 +107,15 @@ void MovePicker::score() { for (auto& m : *this) if (Type == CAPTURES) - m.value = PieceValue[MG][pos.piece_on(to_sq(m))] - + (*captureHistory)[pos.moved_piece(m)][to_sq(m)][type_of(pos.piece_on(to_sq(m)))] / 8; + m.value = int(PieceValue[MG][pos.piece_on(to_sq(m))]) * 6 + + (*captureHistory)[pos.moved_piece(m)][to_sq(m)][type_of(pos.piece_on(to_sq(m)))]; else if (Type == QUIETS) m.value = (*mainHistory)[pos.side_to_move()][from_to(m)] + (*continuationHistory[0])[pos.moved_piece(m)][to_sq(m)] + (*continuationHistory[1])[pos.moved_piece(m)][to_sq(m)] - + (*continuationHistory[3])[pos.moved_piece(m)][to_sq(m)]; + + (*continuationHistory[3])[pos.moved_piece(m)][to_sq(m)] + + (*continuationHistory[5])[pos.moved_piece(m)][to_sq(m)] / 2; else // Type == EVASIONS { @@ -139,12 +139,12 @@ Move MovePicker::select(Pred filter) { if (T == Best) std::swap(*cur, *std::max_element(cur, endMoves)); - move = *cur++; + if (*cur != ttMove && filter()) + return *cur++; - if (move != ttMove && filter()) - return move; + cur++; } - return move = MOVE_NONE; + return MOVE_NONE; } /// MovePicker::next_move() is the most important method of the MovePicker class. It @@ -174,10 +174,10 @@ top: case GOOD_CAPTURE: if (select([&](){ - return pos.see_ge(move, Value(-55 * (cur-1)->value / 1024)) ? + return pos.see_ge(*cur, Value(-55 * cur->value / 1024)) ? // Move losing capture to endBadCaptures to be tried later - true : (*endBadCaptures++ = move, false); })) - return move; + true : (*endBadCaptures++ = *cur, false); })) + return *(cur - 1); // Prepare the pointers to loop over the refutations array cur = std::begin(refutations); @@ -192,27 +192,32 @@ top: /* fallthrough */ case REFUTATION: - if (select([&](){ return !pos.capture(move) - && pos.pseudo_legal(move); })) - return move; + if (select([&](){ return *cur != MOVE_NONE + && !pos.capture(*cur) + && pos.pseudo_legal(*cur); })) + return *(cur - 1); ++stage; /* fallthrough */ case QUIET_INIT: - cur = endBadCaptures; - endMoves = generate(pos, cur); + if (!skipQuiets) + { + cur = endBadCaptures; + endMoves = generate(pos, cur); + + score(); + partial_insertion_sort(cur, endMoves, -4000 * depth / ONE_PLY); + } - score(); - partial_insertion_sort(cur, endMoves, -4000 * depth / ONE_PLY); ++stage; /* fallthrough */ case QUIET: if ( !skipQuiets - && select([&](){return move != refutations[0] - && move != refutations[1] - && move != refutations[2];})) - return move; + && select([&](){return *cur != refutations[0].move + && *cur != refutations[1].move + && *cur != refutations[2].move;})) + return *(cur - 1); // Prepare the pointers to loop over the bad captures cur = moves; @@ -222,7 +227,7 @@ top: /* fallthrough */ case BAD_CAPTURE: - return select(Any); + return select([](){ return true; }); case EVASION_INIT: cur = moves; @@ -233,15 +238,15 @@ top: /* fallthrough */ case EVASION: - return select(Any); + return select([](){ return true; }); case PROBCUT: - return select([&](){ return pos.see_ge(move, threshold); }); + return select([&](){ return pos.see_ge(*cur, threshold); }); case QCAPTURE: if (select([&](){ return depth > DEPTH_QS_RECAPTURES - || to_sq(move) == recaptureSquare; })) - return move; + || to_sq(*cur) == recaptureSquare; })) + return *(cur - 1); // If we did not find any move and we do not try checks, we have finished if (depth != DEPTH_QS_CHECKS) @@ -258,7 +263,7 @@ top: /* fallthrough */ case QCHECK: - return select(Any); + return select([](){ return true; }); } assert(false);