mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-20 17:16:33 +08:00
Assorted trivia in search.cpp
The only interesting change is the moving of stack[MAX_PLY+4] back to its original position in id_loop (now renamed Thread::search). No functional change.
This commit is contained in:
@@ -174,9 +174,9 @@ void Search::init() {
|
||||
}
|
||||
|
||||
|
||||
/// Search::reset() clears all search memory, to obtain reproducible search results
|
||||
/// Search::clear() resets to zero search state, to obtain reproducible results
|
||||
|
||||
void Search::reset () {
|
||||
void Search::clear() {
|
||||
|
||||
TT.clear();
|
||||
CounterMovesHistory.clear();
|
||||
@@ -216,7 +216,7 @@ uint64_t Search::perft(Position& pos, Depth depth) {
|
||||
return nodes;
|
||||
}
|
||||
|
||||
template uint64_t Search::perft<true>(Position& pos, Depth depth);
|
||||
template uint64_t Search::perft<true>(Position&, Depth);
|
||||
|
||||
|
||||
/// MainThread::think() is called by the main thread when the program receives
|
||||
@@ -344,7 +344,7 @@ void MainThread::think() {
|
||||
|
||||
void Thread::search(bool isMainThread) {
|
||||
|
||||
Stack* ss = stack + 2; // To allow referencing (ss-2) and (ss+2)
|
||||
Stack stack[MAX_PLY+4], *ss = stack+2; // To allow referencing (ss-2) and (ss+2)
|
||||
Value bestValue, alpha, beta, delta;
|
||||
Move easyMove = MOVE_NONE;
|
||||
|
||||
@@ -577,7 +577,7 @@ namespace {
|
||||
{
|
||||
// Step 2. Check for aborted search and immediate draw
|
||||
if (Signals.stop.load(std::memory_order_relaxed) || pos.is_draw() || ss->ply >= MAX_PLY)
|
||||
return ss->ply >= MAX_PLY && !inCheck ? evaluate(pos)
|
||||
return ss->ply >= MAX_PLY && !inCheck ? evaluate(pos)
|
||||
: DrawValue[pos.side_to_move()];
|
||||
|
||||
// Step 3. Mate distance pruning. Even if we mate at the next move our score
|
||||
@@ -836,7 +836,7 @@ moves_loop: // When in check search starts from here
|
||||
|
||||
if (RootNode && thisThread == Threads.main())
|
||||
{
|
||||
Signals.firstRootMove = moveCount == 1;
|
||||
Signals.firstRootMove = (moveCount == 1);
|
||||
|
||||
if (Time.elapsed() > 3000)
|
||||
sync_cout << "info depth " << depth / ONE_PLY
|
||||
@@ -1095,7 +1095,7 @@ moves_loop: // When in check search starts from here
|
||||
&& is_ok((ss - 1)->currentMove)
|
||||
&& is_ok((ss - 2)->currentMove))
|
||||
{
|
||||
Value bonus = Value((depth / ONE_PLY) * (depth / ONE_PLY) + depth / ONE_PLY -1);
|
||||
Value bonus = Value((depth / ONE_PLY) * (depth / ONE_PLY) + depth / ONE_PLY - 1);
|
||||
Square prevPrevSq = to_sq((ss - 2)->currentMove);
|
||||
CounterMovesStats& prevCmh = CounterMovesHistory[pos.piece_on(prevPrevSq)][prevPrevSq];
|
||||
prevCmh.update(pos.piece_on(prevSq), prevSq, bonus);
|
||||
@@ -1359,8 +1359,8 @@ moves_loop: // When in check search starts from here
|
||||
}
|
||||
|
||||
|
||||
// update_stats() updates killers, history, countermove history and
|
||||
// countermoves stats for a quiet best move.
|
||||
// update_stats() updates killers, history, countermove and countermove
|
||||
// history when a new quiet best move is found.
|
||||
|
||||
void update_stats(const Position& pos, Stack* ss, Move move,
|
||||
Depth depth, Move* quiets, int quietsCnt) {
|
||||
@@ -1371,7 +1371,7 @@ moves_loop: // When in check search starts from here
|
||||
ss->killers[0] = move;
|
||||
}
|
||||
|
||||
Value bonus = Value((depth / ONE_PLY) * (depth / ONE_PLY) + depth / ONE_PLY -1);
|
||||
Value bonus = Value((depth / ONE_PLY) * (depth / ONE_PLY) + depth / ONE_PLY - 1);
|
||||
|
||||
Square prevSq = to_sq((ss-1)->currentMove);
|
||||
CounterMovesStats& cmh = CounterMovesHistory[pos.piece_on(prevSq)][prevSq];
|
||||
@@ -1394,14 +1394,14 @@ moves_loop: // When in check search starts from here
|
||||
cmh.update(pos.moved_piece(quiets[i]), to_sq(quiets[i]), -bonus);
|
||||
}
|
||||
|
||||
// Extra penalty for TT move in previous ply when it gets refuted
|
||||
// Extra penalty for a quiet TT move in previous ply when it gets refuted
|
||||
if ( (ss-1)->moveCount == 1
|
||||
&& !pos.captured_piece_type()
|
||||
&& is_ok((ss-2)->currentMove))
|
||||
{
|
||||
Square prevPrevSq = to_sq((ss-2)->currentMove);
|
||||
CounterMovesStats& prevCmh = CounterMovesHistory[pos.piece_on(prevPrevSq)][prevPrevSq];
|
||||
prevCmh.update(pos.piece_on(prevSq), prevSq, -bonus - 2 * ((depth + 1) / ONE_PLY));
|
||||
prevCmh.update(pos.piece_on(prevSq), prevSq, -bonus - 2 * (depth + 1) / ONE_PLY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1411,23 +1411,23 @@ moves_loop: // When in check search starts from here
|
||||
|
||||
Move Skill::pick_best(size_t multiPV) {
|
||||
|
||||
// PRNG sequence should be non-deterministic, so we seed it with the time at init
|
||||
const Search::RootMoveVector& rootMoves = Threads.main()->rootMoves;
|
||||
static PRNG rng(now());
|
||||
static PRNG rng(now()); // PRNG sequence should be non-deterministic
|
||||
|
||||
// RootMoves are already sorted by score in descending order
|
||||
int variance = std::min(rootMoves[0].score - rootMoves[multiPV - 1].score, PawnValueMg);
|
||||
Value topScore = rootMoves[0].score;
|
||||
int delta = std::min(topScore - rootMoves[multiPV - 1].score, PawnValueMg);
|
||||
int weakness = 120 - 2 * level;
|
||||
int maxScore = -VALUE_INFINITE;
|
||||
|
||||
// Choose best move. For each move score we add two terms both dependent on
|
||||
// Choose best move. For each move score we add two terms, both dependent on
|
||||
// weakness. One deterministic and bigger for weaker levels, and one random,
|
||||
// then we choose the move with the resulting highest score.
|
||||
for (size_t i = 0; i < multiPV; ++i)
|
||||
{
|
||||
// This is our magic formula
|
||||
int push = ( weakness * int(rootMoves[0].score - rootMoves[i].score)
|
||||
+ variance * (rng.rand<unsigned>() % weakness)) / 128;
|
||||
int push = ( weakness * int(topScore - rootMoves[i].score)
|
||||
+ delta * (rng.rand<unsigned>() % weakness)) / 128;
|
||||
|
||||
if (rootMoves[i].score + push > maxScore)
|
||||
{
|
||||
@@ -1435,6 +1435,7 @@ moves_loop: // When in check search starts from here
|
||||
best = rootMoves[i].pv[0];
|
||||
}
|
||||
}
|
||||
|
||||
return best;
|
||||
}
|
||||
|
||||
@@ -1512,7 +1513,8 @@ void RootMove::insert_pv_in_tt(Position& pos) {
|
||||
TTEntry* tte = TT.probe(pos.key(), ttHit);
|
||||
|
||||
if (!ttHit || tte->move() != m) // Don't overwrite correct entries
|
||||
tte->save(pos.key(), VALUE_NONE, BOUND_NONE, DEPTH_NONE, m, VALUE_NONE, TT.generation());
|
||||
tte->save(pos.key(), VALUE_NONE, BOUND_NONE, DEPTH_NONE,
|
||||
m, VALUE_NONE, TT.generation());
|
||||
|
||||
pos.do_move(m, *st++, pos.gives_check(m, CheckInfo(pos)));
|
||||
}
|
||||
@@ -1522,10 +1524,10 @@ void RootMove::insert_pv_in_tt(Position& pos) {
|
||||
}
|
||||
|
||||
|
||||
/// RootMove::extract_ponder_from_tt() is called in case we have no ponder move before
|
||||
/// exiting the search, for instance in case we stop the search during a fail high at
|
||||
/// root. We try hard to have a ponder move to return to the GUI, otherwise in case of
|
||||
/// 'ponder on' we have nothing to think on.
|
||||
/// RootMove::extract_ponder_from_tt() is called in case we have no ponder move
|
||||
/// before exiting the search, for instance in case we stop the search during a
|
||||
/// fail high at root. We try hard to have a ponder move to return to the GUI,
|
||||
/// otherwise in case of 'ponder on' we have nothing to think on.
|
||||
|
||||
bool RootMove::extract_ponder_from_tt(Position& pos)
|
||||
{
|
||||
@@ -1549,11 +1551,11 @@ bool RootMove::extract_ponder_from_tt(Position& pos)
|
||||
}
|
||||
|
||||
|
||||
/// check_time() is called by the timer thread when the timer triggers. It is
|
||||
/// used to print debug info and, more importantly, to detect when we are out of
|
||||
/// TimerThread::check_time() is called by when the timer triggers. It is used
|
||||
/// to print debug info and, more importantly, to detect when we are out of
|
||||
/// available time and thus stop the search.
|
||||
|
||||
void check_time() {
|
||||
void TimerThread::check_time() {
|
||||
|
||||
static TimePoint lastInfoTime = now();
|
||||
int elapsed = Time.elapsed();
|
||||
|
||||
Reference in New Issue
Block a user