mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00
Better document and reshuffle stuff in think()
No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
8fa53a5b92
commit
369789b426
1 changed files with 45 additions and 36 deletions
|
@ -355,13 +355,14 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
|
||||||
|
|
||||||
static Book book; // Defined static to initialize the PRNG only once
|
static Book book; // Defined static to initialize the PRNG only once
|
||||||
|
|
||||||
|
// Save "search start" time and reset elapsed time to zero
|
||||||
|
elapsed_search_time(get_system_time());
|
||||||
|
|
||||||
// Initialize global search-related variables
|
// Initialize global search-related variables
|
||||||
StopOnPonderhit = StopRequest = QuitRequest = AspirationFailLow = false;
|
StopOnPonderhit = StopRequest = QuitRequest = AspirationFailLow = false;
|
||||||
elapsed_search_time(get_system_time());
|
|
||||||
Limits = limits;
|
Limits = limits;
|
||||||
TimeMgr.init(Limits, pos.startpos_ply_counter());
|
|
||||||
|
|
||||||
// Set output stream in normal or chess960 mode
|
// 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
|
// Look for a book move
|
||||||
|
@ -381,17 +382,7 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set best timer interval to avoid lagging under time pressure. Timer is
|
// Read UCI options: GUI could change UCI parameters during the game
|
||||||
// used to check for remaining available thinking time.
|
|
||||||
if (TimeMgr.available_time())
|
|
||||||
Threads.set_timer(std::min(100, std::max(TimeMgr.available_time() / 8, 20)));
|
|
||||||
else
|
|
||||||
Threads.set_timer(100);
|
|
||||||
|
|
||||||
// Read UCI options
|
|
||||||
UCIMultiPV = Options["MultiPV"].value<int>();
|
|
||||||
SkillLevel = Options["Skill Level"].value<int>();
|
|
||||||
|
|
||||||
read_evaluation_uci_options(pos.side_to_move());
|
read_evaluation_uci_options(pos.side_to_move());
|
||||||
Threads.read_uci_options();
|
Threads.read_uci_options();
|
||||||
|
|
||||||
|
@ -404,22 +395,14 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
|
||||||
TT.clear();
|
TT.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UCIMultiPV = Options["MultiPV"].value<int>();
|
||||||
|
SkillLevel = Options["Skill Level"].value<int>();
|
||||||
|
|
||||||
// Do we have to play with skill handicap? In this case enable MultiPV that
|
// Do we have to play with skill handicap? In this case enable MultiPV that
|
||||||
// we will use behind the scenes to retrieve a set of possible moves.
|
// we will use behind the scenes to retrieve a set of possible moves.
|
||||||
SkillLevelEnabled = (SkillLevel < 20);
|
SkillLevelEnabled = (SkillLevel < 20);
|
||||||
MultiPV = (SkillLevelEnabled ? std::max(UCIMultiPV, 4) : UCIMultiPV);
|
MultiPV = (SkillLevelEnabled ? std::max(UCIMultiPV, 4) : UCIMultiPV);
|
||||||
|
|
||||||
// Wake up needed threads and reset maxPly counter
|
|
||||||
for (int i = 0; i < Threads.size(); i++)
|
|
||||||
{
|
|
||||||
Threads[i].wake_up();
|
|
||||||
Threads[i].maxPly = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start async mode to catch UCI commands sent to us while searching,
|
|
||||||
// like "quit", "stop", etc.
|
|
||||||
Threads.start_listener();
|
|
||||||
|
|
||||||
// Write current search header to log file
|
// Write current search header to log file
|
||||||
if (Options["Use Search Log"].value<bool>())
|
if (Options["Use Search Log"].value<bool>())
|
||||||
{
|
{
|
||||||
|
@ -433,10 +416,39 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
|
||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wake up needed threads and reset maxPly counter
|
||||||
|
for (int i = 0; i < Threads.size(); i++)
|
||||||
|
{
|
||||||
|
Threads[i].maxPly = 0;
|
||||||
|
Threads[i].wake_up();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
Threads.set_timer(100);
|
||||||
|
|
||||||
|
// Start async mode to catch UCI commands sent to us while searching,
|
||||||
|
// like "quit", "stop", etc.
|
||||||
|
Threads.start_listener();
|
||||||
|
|
||||||
// We're ready to start thinking. Call the iterative deepening loop function
|
// We're ready to start thinking. Call the iterative deepening loop function
|
||||||
Move ponderMove = MOVE_NONE;
|
Move ponderMove = MOVE_NONE;
|
||||||
Move bestMove = id_loop(pos, searchMoves, &ponderMove);
|
Move bestMove = id_loop(pos, searchMoves, &ponderMove);
|
||||||
|
|
||||||
|
// From now on any UCI command will be read in-sync with Threads.getline()
|
||||||
|
Threads.stop_listener();
|
||||||
|
|
||||||
|
// Stop timer, no need to check for available time any more
|
||||||
|
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
|
// Write current search final statistics to log file
|
||||||
if (Options["Use Search Log"].value<bool>())
|
if (Options["Use Search Log"].value<bool>())
|
||||||
{
|
{
|
||||||
|
@ -453,17 +465,8 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
|
||||||
pos.undo_move(bestMove); // Return from think() with unchanged position
|
pos.undo_move(bestMove); // Return from think() with unchanged position
|
||||||
}
|
}
|
||||||
|
|
||||||
// This makes all the threads to go to sleep
|
// If we are pondering or in infinite search, we shouldn't print the best move
|
||||||
Threads.set_size(1);
|
// before we are told to do so.
|
||||||
|
|
||||||
// From now on any UCI command will be read in-sync with Threads.getline()
|
|
||||||
Threads.stop_listener();
|
|
||||||
|
|
||||||
// Stop timer, no need to check for available time any more
|
|
||||||
Threads.set_timer(0);
|
|
||||||
|
|
||||||
// If we are pondering or in infinite search, we shouldn't print the
|
|
||||||
// best move before we are told to do so.
|
|
||||||
if (Limits.ponder || Limits.infinite)
|
if (Limits.ponder || Limits.infinite)
|
||||||
wait_for_stop_or_ponderhit();
|
wait_for_stop_or_ponderhit();
|
||||||
|
|
||||||
|
@ -1780,6 +1783,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
return s.str();
|
return s.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// pv_to_uci() returns a string with information on the current PV line
|
// pv_to_uci() returns a string with information on the current PV line
|
||||||
// formatted according to UCI specification.
|
// formatted according to UCI specification.
|
||||||
|
|
||||||
|
@ -1795,6 +1799,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
return s.str();
|
return s.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// depth_to_uci() returns a string with information on the current depth and
|
// depth_to_uci() returns a string with information on the current depth and
|
||||||
// seldepth formatted according to UCI specification.
|
// seldepth formatted according to UCI specification.
|
||||||
|
|
||||||
|
@ -1845,6 +1850,7 @@ 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.
|
// 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
|
// It is used to write search information to the log file (which is created
|
||||||
// when the UCI parameter "Use Search Log" is "true").
|
// when the UCI parameter "Use Search Log" is "true").
|
||||||
|
@ -1920,6 +1926,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
|
|
||||||
// When playing with strength handicap choose best move among the MultiPV set
|
// When playing with strength handicap choose best move among the MultiPV set
|
||||||
// using a statistical rule dependent on SkillLevel. Idea by Heinz van Saanen.
|
// using a statistical rule dependent on SkillLevel. Idea by Heinz van Saanen.
|
||||||
|
|
||||||
void do_skill_level(Move* best, Move* ponder) {
|
void do_skill_level(Move* best, Move* ponder) {
|
||||||
|
|
||||||
assert(MultiPV > 1);
|
assert(MultiPV > 1);
|
||||||
|
@ -1998,6 +2005,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// extract_pv_from_tt() builds a PV by adding moves from the transposition table.
|
// extract_pv_from_tt() builds a PV by adding moves from the transposition table.
|
||||||
// We consider also failing high nodes and not only VALUE_TYPE_EXACT nodes. This
|
// We consider also failing high nodes and not only VALUE_TYPE_EXACT nodes. This
|
||||||
// allow to always have a ponder move even when we fail high at root and also a
|
// allow to always have a ponder move even when we fail high at root and also a
|
||||||
|
@ -2032,6 +2040,7 @@ split_point_start: // At split points actual search starts from here
|
||||||
do pos.undo_move(pv[--ply]); while (ply);
|
do pos.undo_move(pv[--ply]); while (ply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// insert_pv_in_tt() is called at the end of a search iteration, and inserts
|
// insert_pv_in_tt() is called at the end of a search iteration, and inserts
|
||||||
// the PV back into the TT. This makes sure the old PV moves are searched
|
// the PV back into the TT. This makes sure the old PV moves are searched
|
||||||
// first, even if the old TT entries have been overwritten.
|
// first, even if the old TT entries have been overwritten.
|
||||||
|
|
Loading…
Add table
Reference in a new issue