1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 08:13:08 +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:
Marco Costalba 2011-12-10 19:14:13 +01:00
parent f3728e66f8
commit 91601d7f95

View file

@ -147,20 +147,11 @@ namespace {
/// Namespace variables
// Root move list
RootMoveList Rml;
// MultiPV mode
size_t MultiPV, UCIMultiPV, MultiPVIdx;
// Time management variables
TimeManager TimeMgr;
// Skill level adjustment
int SkillLevel;
bool SkillLevelEnabled;
// History table
History H;
@ -294,15 +285,12 @@ int64_t Search::perft(Position& pos, Depth depth) {
StateInfo st;
int64_t sum = 0;
// Generate all legal moves
MoveList<MV_LEGAL> ml(pos);
// If we are at the last ply we don't need to do and undo
// the moves, just to count them.
// At the last ply just return the number of moves (leaf nodes)
if (depth <= ONE_PLY)
return ml.size();
// Loop through all legal moves
CheckInfo ci(pos);
for ( ; !ml.end(); ++ml)
{
@ -323,14 +311,12 @@ void Search::think() {
static Book book; // Defined static to initialize the PRNG only once
Position& pos = RootPosition;
// Reset elapsed search time
elapsed_time(true);
TimeMgr.init(Limits, pos.startpos_ply_counter());
// Set output stream mode: normal or chess960. Castling notation is different
cout << set960(pos.is_chess960());
// Look for a book move
if (Options["OwnBook"].value<bool>())
{
if (Options["Book File"].value<string>() != book.name())
@ -351,9 +337,7 @@ void Search::think() {
read_evaluation_uci_options(pos.side_to_move());
Threads.read_uci_options();
// Set a new TT size if changed
TT.set_size(Options["Hash"].value<int>());
if (Options["Clear Hash"].value<bool>())
{
Options["Clear Hash"].set_value("false");
@ -368,7 +352,6 @@ void Search::think() {
SkillLevelEnabled = (SkillLevel < 20);
MultiPV = (SkillLevelEnabled ? std::max(UCIMultiPV, (size_t)4) : UCIMultiPV);
// Write current search header to log file
if (Options["Use Search Log"].value<bool>())
{
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
// used to check for remaining available thinking time.
TimeMgr.init(Limits, pos.startpos_ply_counter());
if (TimeMgr.available_time())
Threads.set_timer(std::min(100, std::max(TimeMgr.available_time() / 8, 20)));
else
@ -401,13 +382,10 @@ void Search::think() {
Move ponderMove = MOVE_NONE;
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);
// This makes all the slave threads to go to sleep, if not already sleeping
Threads.set_size(1);
// Write current search final statistics to log file
if (Options["Use Search Log"].value<bool>())
{
int e = elapsed_time();
@ -457,7 +435,6 @@ namespace {
Move bestMove, skillBest, skillPonder;
bool bestMoveNeverChanged = true;
// Initialize stuff before a new search
memset(ss, 0, 4 * sizeof(Stack));
TT.new_search();
H.clear();
@ -465,8 +442,6 @@ namespace {
depth = aspirationDelta = 0;
bestValue = alpha = -VALUE_INFINITE, beta = VALUE_INFINITE;
ss->currentMove = MOVE_NULL; // Hack to skip update gains
// Moves to search are verified and copied
Rml.init(pos, rootMoves);
// Handle special case of searching on a mate/stalemate position
@ -585,7 +560,6 @@ namespace {
} while (abs(bestValue) < VALUE_KNOWN_WIN);
}
// Collect info about search result
bestMove = Rml[0].pv[0];
*ponderMove = Rml[0].pv[1];
bestValues[depth] = bestValue;
@ -932,7 +906,6 @@ namespace {
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);
CheckInfo ci(pos);
ss->bestMove = MOVE_NONE;
@ -941,7 +914,7 @@ split_point_start: // At split points actual search starts from here
&& !SpNode
&& depth >= SingularExtensionDepth[PvNode]
&& ttMove != MOVE_NONE
&& !excludedMove // Do not allow recursive singular extension search
&& !excludedMove // Recursive singular search is not allowed
&& (tte->type() & VALUE_TYPE_LOWER)
&& tte->depth() >= depth - 3 * ONE_PLY;
if (SpNode)
@ -987,10 +960,8 @@ split_point_start: // At split points actual search starts from here
// This is used by time management
Signals.firstRootMove = (moveCount == 1);
// Save the current node count before the move is searched
nodes = pos.nodes_searched();
// For long searches send current move info to GUI
if (pos.thread() == 0 && elapsed_time() > 2000)
cout << "info" << depth_to_uci(depth)
<< " 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.
if (RootNode && !Signals.stop)
{
// Remember searched nodes counts for this move
RootMove* rm = Rml.find(move);
rm->nodes += pos.nodes_searched() - nodes;
// PV move or new best move ?
if (isPvMove || value > alpha)
{
// Update PV
rm->score = value;
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.
rm->score = -VALUE_INFINITE;
} // RootNode
}
if (value > bestValue)
{
@ -1219,7 +1188,7 @@ split_point_start: // At split points actual search starts from here
if (!moveCount)
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)
{
assert(!playedMoveCount);
@ -1228,8 +1197,7 @@ split_point_start: // At split points actual search starts from here
}
// Step 21. Update tables
// If the search is not aborted, update the transposition table,
// history counters, and killer moves.
// Update transposition table entry, history and killers
if (!SpNode && !Signals.stop && !thread.cutoff_occurred())
{
move = bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove;
@ -1264,6 +1232,7 @@ split_point_start: // At split points actual search starts from here
return bestValue;
}
// 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,
// less than ONE_PLY).
@ -1344,7 +1313,6 @@ split_point_start: // At split points actual search starts from here
if (PvNode && bestValue > alpha)
alpha = bestValue;
// Futility pruning parameters, not needed when in check
futilityBase = ss->eval + evalMargin + FutilityMarginQS;
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))
continue;
// Update current move
ss->currentMove = 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 be used to cut-off at a given point in search.
// can_return_tt() returns true if a transposition table score can be used to
// cut-off at a given point in search.
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
// possible otherwise falls back on static position evaluation.
// refine_eval() returns the transposition table score if possible, otherwise
// falls back on static position evaluation.
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
// in history and marks as failures all the other moves of that ply.
// update_history() registers a good move that produced a beta-cutoff in
// history and marks as failures all the other moves of that ply.
void update_history(const Position& pos, Move move, Depth depth,
Move movesSearched[], int moveCount) {
@ -1787,6 +1754,12 @@ split_point_start: // At split points actual search starts from here
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) {
const int MSecMinute = 1000 * 60;
@ -1819,11 +1792,6 @@ split_point_start: // At split points actual search starts from here
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[]) {
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[]) {
@ -2024,9 +1992,9 @@ split_point_start: // At split points actual search starts from here
} // namespace
// 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
// for which the thread is the master.
/// 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
/// for which the thread is the master.
void Thread::idle_loop(SplitPoint* sp) {
@ -2040,7 +2008,6 @@ void Thread::idle_loop(SplitPoint* sp) {
{
assert((!sp && threadID) || Threads.use_sleeping_threads());
// Slave thread should exit as soon as do_terminate flag raises
if (do_terminate)
{
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() {
static int lastInfoTime;
int e = elapsed_time();
// Print debug information every one second
if (!lastInfoTime || get_system_time() - lastInfoTime >= 1000)
if (get_system_time() - lastInfoTime >= 1000 || !lastInfoTime)
{
lastInfoTime = get_system_time();
@ -2131,7 +2099,6 @@ void do_timer_event() {
dbg_print_hit_rate();
}
// Should we stop the search?
if (Limits.ponder)
return;