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
|
||||
|
||||
// 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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue