mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00
Prune silly comments in search()
Comments should be informative but not pedantic / obvious. The only exception is the function description where we indulge a bit on the "chatty" side, but has always been like this since Glaurung times, so we continue with this tradition. No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
f3728e66f8
commit
91601d7f95
1 changed files with 28 additions and 61 deletions
|
@ -147,20 +147,11 @@ namespace {
|
||||||
|
|
||||||
/// Namespace variables
|
/// Namespace variables
|
||||||
|
|
||||||
// Root move list
|
|
||||||
RootMoveList Rml;
|
RootMoveList Rml;
|
||||||
|
|
||||||
// MultiPV mode
|
|
||||||
size_t MultiPV, UCIMultiPV, MultiPVIdx;
|
size_t MultiPV, UCIMultiPV, MultiPVIdx;
|
||||||
|
|
||||||
// Time management variables
|
|
||||||
TimeManager TimeMgr;
|
TimeManager TimeMgr;
|
||||||
|
|
||||||
// Skill level adjustment
|
|
||||||
int SkillLevel;
|
int SkillLevel;
|
||||||
bool SkillLevelEnabled;
|
bool SkillLevelEnabled;
|
||||||
|
|
||||||
// History table
|
|
||||||
History H;
|
History H;
|
||||||
|
|
||||||
|
|
||||||
|
@ -294,15 +285,12 @@ int64_t Search::perft(Position& pos, Depth depth) {
|
||||||
StateInfo st;
|
StateInfo st;
|
||||||
int64_t sum = 0;
|
int64_t sum = 0;
|
||||||
|
|
||||||
// Generate all legal moves
|
|
||||||
MoveList<MV_LEGAL> ml(pos);
|
MoveList<MV_LEGAL> ml(pos);
|
||||||
|
|
||||||
// If we are at the last ply we don't need to do and undo
|
// At the last ply just return the number of moves (leaf nodes)
|
||||||
// the moves, just to count them.
|
|
||||||
if (depth <= ONE_PLY)
|
if (depth <= ONE_PLY)
|
||||||
return ml.size();
|
return ml.size();
|
||||||
|
|
||||||
// Loop through all legal moves
|
|
||||||
CheckInfo ci(pos);
|
CheckInfo ci(pos);
|
||||||
for ( ; !ml.end(); ++ml)
|
for ( ; !ml.end(); ++ml)
|
||||||
{
|
{
|
||||||
|
@ -323,14 +311,12 @@ void Search::think() {
|
||||||
static Book book; // Defined static to initialize the PRNG only once
|
static Book book; // Defined static to initialize the PRNG only once
|
||||||
|
|
||||||
Position& pos = RootPosition;
|
Position& pos = RootPosition;
|
||||||
|
|
||||||
// Reset elapsed search time
|
|
||||||
elapsed_time(true);
|
elapsed_time(true);
|
||||||
|
TimeMgr.init(Limits, pos.startpos_ply_counter());
|
||||||
|
|
||||||
// Set output stream mode: normal or chess960. Castling notation is different
|
// Set output stream mode: normal or chess960. Castling notation is different
|
||||||
cout << set960(pos.is_chess960());
|
cout << set960(pos.is_chess960());
|
||||||
|
|
||||||
// Look for a book move
|
|
||||||
if (Options["OwnBook"].value<bool>())
|
if (Options["OwnBook"].value<bool>())
|
||||||
{
|
{
|
||||||
if (Options["Book File"].value<string>() != book.name())
|
if (Options["Book File"].value<string>() != book.name())
|
||||||
|
@ -351,9 +337,7 @@ void Search::think() {
|
||||||
read_evaluation_uci_options(pos.side_to_move());
|
read_evaluation_uci_options(pos.side_to_move());
|
||||||
Threads.read_uci_options();
|
Threads.read_uci_options();
|
||||||
|
|
||||||
// Set a new TT size if changed
|
|
||||||
TT.set_size(Options["Hash"].value<int>());
|
TT.set_size(Options["Hash"].value<int>());
|
||||||
|
|
||||||
if (Options["Clear Hash"].value<bool>())
|
if (Options["Clear Hash"].value<bool>())
|
||||||
{
|
{
|
||||||
Options["Clear Hash"].set_value("false");
|
Options["Clear Hash"].set_value("false");
|
||||||
|
@ -368,7 +352,6 @@ void Search::think() {
|
||||||
SkillLevelEnabled = (SkillLevel < 20);
|
SkillLevelEnabled = (SkillLevel < 20);
|
||||||
MultiPV = (SkillLevelEnabled ? std::max(UCIMultiPV, (size_t)4) : UCIMultiPV);
|
MultiPV = (SkillLevelEnabled ? std::max(UCIMultiPV, (size_t)4) : UCIMultiPV);
|
||||||
|
|
||||||
// Write current search header to log file
|
|
||||||
if (Options["Use Search Log"].value<bool>())
|
if (Options["Use Search Log"].value<bool>())
|
||||||
{
|
{
|
||||||
Log log(Options["Search Log Filename"].value<string>());
|
Log log(Options["Search Log Filename"].value<string>());
|
||||||
|
@ -390,8 +373,6 @@ void Search::think() {
|
||||||
|
|
||||||
// Set best timer interval to avoid lagging under time pressure. Timer is
|
// Set best timer interval to avoid lagging under time pressure. Timer is
|
||||||
// used to check for remaining available thinking time.
|
// used to check for remaining available thinking time.
|
||||||
TimeMgr.init(Limits, pos.startpos_ply_counter());
|
|
||||||
|
|
||||||
if (TimeMgr.available_time())
|
if (TimeMgr.available_time())
|
||||||
Threads.set_timer(std::min(100, std::max(TimeMgr.available_time() / 8, 20)));
|
Threads.set_timer(std::min(100, std::max(TimeMgr.available_time() / 8, 20)));
|
||||||
else
|
else
|
||||||
|
@ -401,13 +382,10 @@ void Search::think() {
|
||||||
Move ponderMove = MOVE_NONE;
|
Move ponderMove = MOVE_NONE;
|
||||||
Move bestMove = id_loop(pos, &RootMoves[0], &ponderMove);
|
Move bestMove = id_loop(pos, &RootMoves[0], &ponderMove);
|
||||||
|
|
||||||
// Stop timer, no need to check for available time any more
|
// Stop timer and send all the slaves to sleep, if not already sleeping
|
||||||
Threads.set_timer(0);
|
Threads.set_timer(0);
|
||||||
|
|
||||||
// This makes all the slave threads to go to sleep, if not already sleeping
|
|
||||||
Threads.set_size(1);
|
Threads.set_size(1);
|
||||||
|
|
||||||
// Write current search final statistics to log file
|
|
||||||
if (Options["Use Search Log"].value<bool>())
|
if (Options["Use Search Log"].value<bool>())
|
||||||
{
|
{
|
||||||
int e = elapsed_time();
|
int e = elapsed_time();
|
||||||
|
@ -457,7 +435,6 @@ namespace {
|
||||||
Move bestMove, skillBest, skillPonder;
|
Move bestMove, skillBest, skillPonder;
|
||||||
bool bestMoveNeverChanged = true;
|
bool bestMoveNeverChanged = true;
|
||||||
|
|
||||||
// Initialize stuff before a new search
|
|
||||||
memset(ss, 0, 4 * sizeof(Stack));
|
memset(ss, 0, 4 * sizeof(Stack));
|
||||||
TT.new_search();
|
TT.new_search();
|
||||||
H.clear();
|
H.clear();
|
||||||
|
@ -465,8 +442,6 @@ namespace {
|
||||||
depth = aspirationDelta = 0;
|
depth = aspirationDelta = 0;
|
||||||
bestValue = alpha = -VALUE_INFINITE, beta = VALUE_INFINITE;
|
bestValue = alpha = -VALUE_INFINITE, beta = VALUE_INFINITE;
|
||||||
ss->currentMove = MOVE_NULL; // Hack to skip update gains
|
ss->currentMove = MOVE_NULL; // Hack to skip update gains
|
||||||
|
|
||||||
// Moves to search are verified and copied
|
|
||||||
Rml.init(pos, rootMoves);
|
Rml.init(pos, rootMoves);
|
||||||
|
|
||||||
// Handle special case of searching on a mate/stalemate position
|
// Handle special case of searching on a mate/stalemate position
|
||||||
|
@ -585,7 +560,6 @@ namespace {
|
||||||
} while (abs(bestValue) < VALUE_KNOWN_WIN);
|
} while (abs(bestValue) < VALUE_KNOWN_WIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collect info about search result
|
|
||||||
bestMove = Rml[0].pv[0];
|
bestMove = Rml[0].pv[0];
|
||||||
*ponderMove = Rml[0].pv[1];
|
*ponderMove = Rml[0].pv[1];
|
||||||
bestValues[depth] = bestValue;
|
bestValues[depth] = bestValue;
|
||||||
|
@ -932,7 +906,6 @@ namespace {
|
||||||
|
|
||||||
split_point_start: // At split points actual search starts from here
|
split_point_start: // At split points actual search starts from here
|
||||||
|
|
||||||
// Initialize a MovePicker object for the current position
|
|
||||||
MovePickerExt<SpNode> mp(pos, ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta);
|
MovePickerExt<SpNode> mp(pos, ttMove, depth, H, ss, PvNode ? -VALUE_INFINITE : beta);
|
||||||
CheckInfo ci(pos);
|
CheckInfo ci(pos);
|
||||||
ss->bestMove = MOVE_NONE;
|
ss->bestMove = MOVE_NONE;
|
||||||
|
@ -941,7 +914,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
&& !SpNode
|
&& !SpNode
|
||||||
&& depth >= SingularExtensionDepth[PvNode]
|
&& depth >= SingularExtensionDepth[PvNode]
|
||||||
&& ttMove != MOVE_NONE
|
&& ttMove != MOVE_NONE
|
||||||
&& !excludedMove // Do not allow recursive singular extension search
|
&& !excludedMove // Recursive singular search is not allowed
|
||||||
&& (tte->type() & VALUE_TYPE_LOWER)
|
&& (tte->type() & VALUE_TYPE_LOWER)
|
||||||
&& tte->depth() >= depth - 3 * ONE_PLY;
|
&& tte->depth() >= depth - 3 * ONE_PLY;
|
||||||
if (SpNode)
|
if (SpNode)
|
||||||
|
@ -987,10 +960,8 @@ split_point_start: // At split points actual search starts from here
|
||||||
// This is used by time management
|
// This is used by time management
|
||||||
Signals.firstRootMove = (moveCount == 1);
|
Signals.firstRootMove = (moveCount == 1);
|
||||||
|
|
||||||
// Save the current node count before the move is searched
|
|
||||||
nodes = pos.nodes_searched();
|
nodes = pos.nodes_searched();
|
||||||
|
|
||||||
// For long searches send current move info to GUI
|
|
||||||
if (pos.thread() == 0 && elapsed_time() > 2000)
|
if (pos.thread() == 0 && elapsed_time() > 2000)
|
||||||
cout << "info" << depth_to_uci(depth)
|
cout << "info" << depth_to_uci(depth)
|
||||||
<< " currmove " << move
|
<< " currmove " << move
|
||||||
|
@ -1155,14 +1126,12 @@ split_point_start: // At split points actual search starts from here
|
||||||
// be trusted, and we don't update the best move and/or PV.
|
// be trusted, and we don't update the best move and/or PV.
|
||||||
if (RootNode && !Signals.stop)
|
if (RootNode && !Signals.stop)
|
||||||
{
|
{
|
||||||
// Remember searched nodes counts for this move
|
|
||||||
RootMove* rm = Rml.find(move);
|
RootMove* rm = Rml.find(move);
|
||||||
rm->nodes += pos.nodes_searched() - nodes;
|
rm->nodes += pos.nodes_searched() - nodes;
|
||||||
|
|
||||||
// PV move or new best move ?
|
// PV move or new best move ?
|
||||||
if (isPvMove || value > alpha)
|
if (isPvMove || value > alpha)
|
||||||
{
|
{
|
||||||
// Update PV
|
|
||||||
rm->score = value;
|
rm->score = value;
|
||||||
rm->extract_pv_from_tt(pos);
|
rm->extract_pv_from_tt(pos);
|
||||||
|
|
||||||
|
@ -1178,7 +1147,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
// position in the list is preserved, just the PV is pushed up.
|
// position in the list is preserved, just the PV is pushed up.
|
||||||
rm->score = -VALUE_INFINITE;
|
rm->score = -VALUE_INFINITE;
|
||||||
|
|
||||||
} // RootNode
|
}
|
||||||
|
|
||||||
if (value > bestValue)
|
if (value > bestValue)
|
||||||
{
|
{
|
||||||
|
@ -1219,7 +1188,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
if (!moveCount)
|
if (!moveCount)
|
||||||
return excludedMove ? oldAlpha : inCheck ? value_mated_in(ss->ply) : VALUE_DRAW;
|
return excludedMove ? oldAlpha : inCheck ? value_mated_in(ss->ply) : VALUE_DRAW;
|
||||||
|
|
||||||
// We have pruned all the moves, so return a fail-low score
|
// If we have pruned all the moves without searching return a fail-low score
|
||||||
if (bestValue == -VALUE_INFINITE)
|
if (bestValue == -VALUE_INFINITE)
|
||||||
{
|
{
|
||||||
assert(!playedMoveCount);
|
assert(!playedMoveCount);
|
||||||
|
@ -1228,8 +1197,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 21. Update tables
|
// Step 21. Update tables
|
||||||
// If the search is not aborted, update the transposition table,
|
// Update transposition table entry, history and killers
|
||||||
// history counters, and killer moves.
|
|
||||||
if (!SpNode && !Signals.stop && !thread.cutoff_occurred())
|
if (!SpNode && !Signals.stop && !thread.cutoff_occurred())
|
||||||
{
|
{
|
||||||
move = bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove;
|
move = bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove;
|
||||||
|
@ -1264,6 +1232,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
return bestValue;
|
return bestValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// qsearch() is the quiescence search function, which is called by the main
|
// qsearch() is the quiescence search function, which is called by the main
|
||||||
// search function when the remaining depth is zero (or, to be more precise,
|
// search function when the remaining depth is zero (or, to be more precise,
|
||||||
// less than ONE_PLY).
|
// less than ONE_PLY).
|
||||||
|
@ -1344,7 +1313,6 @@ split_point_start: // At split points actual search starts from here
|
||||||
if (PvNode && bestValue > alpha)
|
if (PvNode && bestValue > alpha)
|
||||||
alpha = bestValue;
|
alpha = bestValue;
|
||||||
|
|
||||||
// Futility pruning parameters, not needed when in check
|
|
||||||
futilityBase = ss->eval + evalMargin + FutilityMarginQS;
|
futilityBase = ss->eval + evalMargin + FutilityMarginQS;
|
||||||
enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
|
enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
|
||||||
}
|
}
|
||||||
|
@ -1426,7 +1394,6 @@ split_point_start: // At split points actual search starts from here
|
||||||
if (!pos.pl_move_is_legal(move, ci.pinned))
|
if (!pos.pl_move_is_legal(move, ci.pinned))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Update current move
|
|
||||||
ss->currentMove = move;
|
ss->currentMove = move;
|
||||||
|
|
||||||
// Make and search the move
|
// Make and search the move
|
||||||
|
@ -1647,8 +1614,8 @@ split_point_start: // At split points actual search starts from here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// can_return_tt() returns true if a transposition table score
|
// can_return_tt() returns true if a transposition table score can be used to
|
||||||
// can be used to cut-off at a given point in search.
|
// cut-off at a given point in search.
|
||||||
|
|
||||||
bool can_return_tt(const TTEntry* tte, Depth depth, Value beta, int ply) {
|
bool can_return_tt(const TTEntry* tte, Depth depth, Value beta, int ply) {
|
||||||
|
|
||||||
|
@ -1663,8 +1630,8 @@ split_point_start: // At split points actual search starts from here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// refine_eval() returns the transposition table score if
|
// refine_eval() returns the transposition table score if possible, otherwise
|
||||||
// possible otherwise falls back on static position evaluation.
|
// falls back on static position evaluation.
|
||||||
|
|
||||||
Value refine_eval(const TTEntry* tte, Value defaultEval, int ply) {
|
Value refine_eval(const TTEntry* tte, Value defaultEval, int ply) {
|
||||||
|
|
||||||
|
@ -1680,8 +1647,8 @@ split_point_start: // At split points actual search starts from here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// update_history() registers a good move that produced a beta-cutoff
|
// update_history() registers a good move that produced a beta-cutoff in
|
||||||
// in history and marks as failures all the other moves of that ply.
|
// history and marks as failures all the other moves of that ply.
|
||||||
|
|
||||||
void update_history(const Position& pos, Move move, Depth depth,
|
void update_history(const Position& pos, Move move, Depth depth,
|
||||||
Move movesSearched[], int moveCount) {
|
Move movesSearched[], int moveCount) {
|
||||||
|
@ -1787,6 +1754,12 @@ split_point_start: // At split points actual search starts from here
|
||||||
return s.str();
|
return s.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// pretty_pv() creates a human-readable string from a position and a PV.
|
||||||
|
// It is used to write search information to the log file (which is created
|
||||||
|
// when the UCI parameter "Use Search Log" is "true"). It uses the two helpers
|
||||||
|
// time_to_string() and score_to_string() to format time and score respectively.
|
||||||
|
|
||||||
string time_to_string(int millisecs) {
|
string time_to_string(int millisecs) {
|
||||||
|
|
||||||
const int MSecMinute = 1000 * 60;
|
const int MSecMinute = 1000 * 60;
|
||||||
|
@ -1819,11 +1792,6 @@ split_point_start: // At split points actual search starts from here
|
||||||
return s.str();
|
return s.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// pretty_pv() creates a human-readable string from a position and a PV.
|
|
||||||
// It is used to write search information to the log file (which is created
|
|
||||||
// when the UCI parameter "Use Search Log" is "true").
|
|
||||||
|
|
||||||
string pretty_pv(Position& pos, int depth, Value value, int time, Move pv[]) {
|
string pretty_pv(Position& pos, int depth, Value value, int time, Move pv[]) {
|
||||||
|
|
||||||
const int64_t K = 1000;
|
const int64_t K = 1000;
|
||||||
|
@ -1918,7 +1886,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// RootMove and RootMoveList method's definitions
|
// RootMove and RootMoveList method's definitions
|
||||||
|
|
||||||
void RootMoveList::init(Position& pos, Move rootMoves[]) {
|
void RootMoveList::init(Position& pos, Move rootMoves[]) {
|
||||||
|
|
||||||
|
@ -2024,9 +1992,9 @@ split_point_start: // At split points actual search starts from here
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
// Thread::idle_loop() is where the thread is parked when it has no work to do.
|
/// Thread::idle_loop() is where the thread is parked when it has no work to do.
|
||||||
// The parameter 'sp', if non-NULL, is a pointer to an active SplitPoint object
|
/// The parameter 'sp', if non-NULL, is a pointer to an active SplitPoint object
|
||||||
// for which the thread is the master.
|
/// for which the thread is the master.
|
||||||
|
|
||||||
void Thread::idle_loop(SplitPoint* sp) {
|
void Thread::idle_loop(SplitPoint* sp) {
|
||||||
|
|
||||||
|
@ -2040,7 +2008,6 @@ void Thread::idle_loop(SplitPoint* sp) {
|
||||||
{
|
{
|
||||||
assert((!sp && threadID) || Threads.use_sleeping_threads());
|
assert((!sp && threadID) || Threads.use_sleeping_threads());
|
||||||
|
|
||||||
// Slave thread should exit as soon as do_terminate flag raises
|
|
||||||
if (do_terminate)
|
if (do_terminate)
|
||||||
{
|
{
|
||||||
assert(!sp);
|
assert(!sp);
|
||||||
|
@ -2115,15 +2082,16 @@ void Thread::idle_loop(SplitPoint* sp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// do_timer_event() is called by the timer thread when the timer triggers
|
/// do_timer_event() is called by the timer thread when the timer triggers. It
|
||||||
|
/// is used to print debug info and, more important, to detect when we are out of
|
||||||
|
/// available time and so stop the search.
|
||||||
|
|
||||||
void do_timer_event() {
|
void do_timer_event() {
|
||||||
|
|
||||||
static int lastInfoTime;
|
static int lastInfoTime;
|
||||||
int e = elapsed_time();
|
int e = elapsed_time();
|
||||||
|
|
||||||
// Print debug information every one second
|
if (get_system_time() - lastInfoTime >= 1000 || !lastInfoTime)
|
||||||
if (!lastInfoTime || get_system_time() - lastInfoTime >= 1000)
|
|
||||||
{
|
{
|
||||||
lastInfoTime = get_system_time();
|
lastInfoTime = get_system_time();
|
||||||
|
|
||||||
|
@ -2131,7 +2099,6 @@ void do_timer_event() {
|
||||||
dbg_print_hit_rate();
|
dbg_print_hit_rate();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Should we stop the search?
|
|
||||||
if (Limits.ponder)
|
if (Limits.ponder)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue