X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovepick.cpp;h=901aa60e5625c766b797fd88d4dec2888b24ac69;hp=8d8060b55571f9b4420ba29a674e791ce48f58e9;hb=337ec0f3d0b402782c3704cc251c209393047dd9;hpb=66d5c13a88f041247adf2ba62acdf936a6d6224e diff --git a/src/movepick.cpp b/src/movepick.cpp index 8d8060b5..901aa60e 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(); } @@ -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); } } @@ -254,6 +254,8 @@ void MovePicker::score_evasions_or_checks() { /// are no more moves left. /// It picks the move with the biggest score from a list of generated moves taking /// care not to return the tt move if has already been searched previously. +/// Note that this function is not thread safe so should be lock protected by +/// caller when accessed through a shared MovePicker object. Move MovePicker::get_next_move() { @@ -343,17 +345,3 @@ Move MovePicker::get_next_move() { } } -/// A variant of get_next_move() which takes a lock as a parameter, used to -/// prevent multiple threads from picking the same move at a split point. - -Move MovePicker::get_next_move(Lock &lock) { - - lock_grab(&lock); - - // Note that it is safe to call many times - // get_next_move() when phase == PH_STOP - Move m = get_next_move(); - - lock_release(&lock); - return m; -}