X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmovepick.cpp;h=582978e69d0c3f1fb2c6535c82d71f564cc85aa7;hb=c7866a4215c31d7d0af8e8550fbf8c13f6ea1d1a;hp=16eb16348c1791f2761f36c8f2d96d1ce039c35d;hpb=bb968fd42a6e3c14755332f5a4c4829faaf4f9de;p=stockfish diff --git a/src/movepick.cpp b/src/movepick.cpp index 16eb1634..582978e6 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -94,8 +94,16 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d, else if (d == Depth(0)) phasePtr = QsearchWithChecksPhaseTable; else + { phasePtr = QsearchWithoutChecksPhaseTable; + // 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 when TT table is full. + if (ttm != MOVE_NONE && !pos.move_is_capture_or_promotion(ttm)) + searchTT = ttMoves[0].move = MOVE_NONE; + } + phasePtr += !searchTT - 1; go_next_phase(); } @@ -128,7 +136,7 @@ void MovePicker::go_next_phase() { case PH_NONCAPTURES: lastMove = generate_noncaptures(pos, moves); score_noncaptures(); - sort_moves(moves, lastMove); + sort_moves(moves, lastMove, &lastGoodNonCapture); return; case PH_BAD_CAPTURES: @@ -205,7 +213,6 @@ void MovePicker::score_noncaptures() { Move m; Piece piece; Square from, to; - int hs; for (MoveStack* cur = moves; cur != lastMove; cur++) { @@ -213,14 +220,7 @@ void MovePicker::score_noncaptures() { from = move_from(m); to = move_to(m); piece = pos.piece_on(from); - hs = H.move_ordering_score(piece, to); - - // Ensure history is always preferred to pst - if (hs > 0) - hs += 1000; - - // pst based scoring - cur->score = hs + mg_value(pos.pst_delta(piece, from, to)); + cur->score = H.move_ordering_score(piece, to); } } @@ -240,7 +240,7 @@ void MovePicker::score_evasions_or_checks() { { m = cur->move; if ((seeScore = pos.see_sign(m)) < 0) - cur->score = seeScore; + cur->score = seeScore - HistoryMax; // Be sure are at the bottom else if (pos.move_is_capture(m)) cur->score = pos.midgame_value_of_piece_on(move_to(m)) - pos.type_of_piece_on(move_from(m)) + HistoryMax; @@ -305,6 +305,11 @@ Move MovePicker::get_next_move() { break; case PH_NONCAPTURES: + + // Sort negative scored moves only when we get there + if (curMove == lastGoodNonCapture) + insertion_sort(lastGoodNonCapture, lastMove); + move = (curMove++)->move; if ( move != ttMoves[0].move && move != ttMoves[1].move