diff --git a/AUTHORS b/AUTHORS index 6eefb56dd5f..6957682f494 100644 --- a/AUTHORS +++ b/AUTHORS @@ -129,6 +129,7 @@ Kojirion Krystian Kuzniarek (kuzkry) Leonardo Ljubičić (ICCF World Champion) Leonid Pechenik (lp--) +Li Ying (yl25946) Liam Keegan (lkeegan) Linmiao Xu (linrock) Linus Arver (listx) diff --git a/src/search.cpp b/src/search.cpp index 3e6c56a696d..47c5dc88242 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -864,47 +864,54 @@ Value Search::Worker::search( Piece captured; while ((move = mp.next_move()) != Move::none()) - if (move != excludedMove && pos.legal(move)) - { - assert(pos.capture_stage(move)); + { + assert(move.is_ok()); - movedPiece = pos.moved_piece(move); - captured = pos.piece_on(move.to_sq()); + if (move == excludedMove) + continue; + // Check for legality + if (!pos.legal(move)) + continue; - // Prefetch the TT entry for the resulting position - prefetch(tt.first_entry(pos.key_after(move))); + assert(pos.capture_stage(move)); - ss->currentMove = move; - ss->continuationHistory = - &this - ->continuationHistory[ss->inCheck][true][pos.moved_piece(move)][move.to_sq()]; + movedPiece = pos.moved_piece(move); + captured = pos.piece_on(move.to_sq()); - thisThread->nodes.fetch_add(1, std::memory_order_relaxed); - pos.do_move(move, st); - // Perform a preliminary qsearch to verify that the move holds - value = -qsearch(pos, ss + 1, -probCutBeta, -probCutBeta + 1); + // Prefetch the TT entry for the resulting position + prefetch(tt.first_entry(pos.key_after(move))); - // If the qsearch held, perform the regular search - if (value >= probCutBeta) - value = -search(pos, ss + 1, -probCutBeta, -probCutBeta + 1, depth - 4, - !cutNode); + ss->currentMove = move; + ss->continuationHistory = + &this->continuationHistory[ss->inCheck][true][pos.moved_piece(move)][move.to_sq()]; - pos.undo_move(move); + thisThread->nodes.fetch_add(1, std::memory_order_relaxed); + pos.do_move(move, st); - if (value >= probCutBeta) - { - thisThread->captureHistory[movedPiece][move.to_sq()][type_of(captured)] - << stat_bonus(depth - 2); - - // Save ProbCut data into transposition table - ttWriter.write(posKey, value_to_tt(value, ss->ply), ss->ttPv, BOUND_LOWER, - depth - 3, move, unadjustedStaticEval, tt.generation()); - return std::abs(value) < VALUE_TB_WIN_IN_MAX_PLY ? value - (probCutBeta - beta) - : value; - } + // Perform a preliminary qsearch to verify that the move holds + value = -qsearch(pos, ss + 1, -probCutBeta, -probCutBeta + 1); + + // If the qsearch held, perform the regular search + if (value >= probCutBeta) + value = + -search(pos, ss + 1, -probCutBeta, -probCutBeta + 1, depth - 4, !cutNode); + + pos.undo_move(move); + + if (value >= probCutBeta) + { + thisThread->captureHistory[movedPiece][move.to_sq()][type_of(captured)] + << stat_bonus(depth - 2); + + // Save ProbCut data into transposition table + ttWriter.write(posKey, value_to_tt(value, ss->ply), ss->ttPv, BOUND_LOWER, + depth - 3, move, unadjustedStaticEval, tt.generation()); + return std::abs(value) < VALUE_TB_WIN_IN_MAX_PLY ? value - (probCutBeta - beta) + : value; } + } Eval::NNUE::hint_common_parent_position(pos, networks[numaAccessToken], refreshTable); }