int current_search_time();
std::string value_to_uci(Value v);
- int nps(const Position& pos);
+ std::string speed_to_uci(int64_t nodes);
void poll(const Position& pos);
void wait_for_stop_or_ponderhit();
Move bestMove = id_loop(pos, searchMoves, &ponderMove);
// Print final search statistics
- cout << "info nodes " << pos.nodes_searched()
- << " nps " << nps(pos)
- << " time " << current_search_time() << endl;
+ cout << "info" << speed_to_uci(pos.nodes_searched()) << endl;
if (UseLogFile)
{
+ int t = current_search_time();
+
LogFile << "Nodes: " << pos.nodes_searched()
- << "\nNodes/second: " << nps(pos)
+ << "\nNodes/second: " << (t > 0 ? int(pos.nodes_searched() * 1000 / t) : 0)
<< "\nBest move: " << move_to_san(pos, bestMove);
StateInfo st;
if (SendSearchedNodes)
{
SendSearchedNodes = false;
- cout << "info nodes " << nodes
- << " nps " << nps(pos)
- << " time " << current_search_time() << endl;
+ cout << "info" << speed_to_uci(pos.nodes_searched()) << endl;
}
if (current_search_time() >= 1000)
ss->bestMove = move;
if (SpNode)
- sp->parentSstack->bestMove = move;
+ sp->ss->bestMove = move;
}
}
H.update_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
}
+ // current_search_time() returns the number of milliseconds which have passed
+ // since the beginning of the current search.
+
+ int current_search_time() {
+
+ return get_system_time() - SearchStartTime;
+ }
+
// value_to_uci() converts a value to a string suitable for use with the UCI
// protocol specifications:
}
- // current_search_time() returns the number of milliseconds which have passed
- // since the beginning of the current search.
-
- int current_search_time() {
-
- return get_system_time() - SearchStartTime;
- }
+ // speed_to_uci() returns a string with time stats of current search suitable
+ // to be sent to UCI gui.
+ std::string speed_to_uci(int64_t nodes) {
- // nps() computes the current nodes/second count
+ std::stringstream s;
+ int t = current_search_time();
- int nps(const Position& pos) {
+ s << " nodes " << nodes
+ << " nps " << (t > 0 ? int(nodes * 1000 / t) : 0)
+ << " time " << t;
- int t = current_search_time();
- return (t > 0 ? int((pos.nodes_searched() * 1000) / t) : 0);
+ return s.str();
}
SplitPoint* tsp = threads[threadID].splitPoint;
Position pos(*tsp->pos, threadID);
- memcpy(ss, tsp->parentSstack - 1, 4 * sizeof(SearchStack));
+ memcpy(ss, tsp->ss - 1, 4 * sizeof(SearchStack));
(ss+1)->sp = tsp;
if (tsp->pvNode)
splitPoint.moveCount = moveCount;
splitPoint.pos = &pos;
splitPoint.nodes = 0;
- splitPoint.parentSstack = ss;
+ splitPoint.ss = ss;
for (i = 0; i < activeThreads; i++)
splitPoint.slaves[i] = 0;
lock_release(&mpLock);
// Tell the threads that they have work to do. This will make them leave
- // their idle loop. But before copy search stack tail for each thread.
+ // their idle loop.
for (i = 0; i < activeThreads; i++)
if (i == master || splitPoint.slaves[i])
{
<< " multipv " << pvLine + 1
<< " score " << value_to_uci(pv_score)
<< (pv_score >= beta ? " lowerbound" : pv_score <= alpha ? " upperbound" : "")
- << " time " << current_search_time()
- << " nodes " << pos.nodes_searched()
- << " nps " << nps(pos)
+ << speed_to_uci(pos.nodes_searched())
<< " pv " << l.str();
return s.str();