is >> skipws >> token;
if (token == "quit" || token == "stop")
- Threads.stop_thinking();
+ {
+ Search::Signals.stop = true;
+
+ if (token == "quit") // Cannot quit while threads are still running
+ Threads.wait_for_search_finished();
+ }
else if (token == "ponderhit")
{
Search::Limits.ponder = false;
if (Search::Signals.stopOnPonderhit)
- Threads.stop_thinking();
+ Search::Signals.stop = true;
}
else if (token == "go")
go(pos, is);
else if (token == "ucinewgame")
- pos.from_fen(StartFEN, false);
+ { /* Avoid returning "Unknown command" */ }
else if (token == "isready")
cout << "readyok" << endl;
pos.flip_me();
else if (token == "eval")
- {
- EvalRootColor = pos.side_to_move();
- cout << trace_evaluate(pos) << endl;
- }
+ cout << Eval::trace(pos) << endl;
else if (token == "key")
cout << "key: " << hex << pos.key()
while (is >> token)
value += string(" ", !value.empty()) + token;
- if (!Options.count(name))
- cout << "No such option: " << name << endl;
-
- else if (value.empty()) // UCI buttons don't have a value
- Options[name] = true;
-
- else
+ if (Options.count(name))
Options[name] = value;
+ else
+ cout << "No such option: " << name << endl;
}
// go() is called when engine receives the "go" UCI command. The function sets
// the thinking time and other parameters from the input string, and then starts
- // the main searching thread.
+ // the search.
void go(Position& pos, istringstream& is) {
- string token;
Search::LimitsType limits;
std::set<Move> searchMoves;
- int time[] = { 0, 0 }, inc[] = { 0, 0 };
+ string token;
while (is >> token)
{
- if (token == "infinite")
- limits.infinite = true;
- else if (token == "ponder")
- limits.ponder = true;
- else if (token == "wtime")
- is >> time[WHITE];
+ if (token == "wtime")
+ is >> limits.times[WHITE];
else if (token == "btime")
- is >> time[BLACK];
+ is >> limits.times[BLACK];
else if (token == "winc")
- is >> inc[WHITE];
+ is >> limits.incs[WHITE];
else if (token == "binc")
- is >> inc[BLACK];
+ is >> limits.incs[BLACK];
else if (token == "movestogo")
- is >> limits.movesToGo;
+ is >> limits.movestogo;
else if (token == "depth")
- is >> limits.maxDepth;
+ is >> limits.depth;
else if (token == "nodes")
- is >> limits.maxNodes;
+ is >> limits.nodes;
else if (token == "movetime")
- is >> limits.maxTime;
+ is >> limits.movetime;
+ else if (token == "infinite")
+ limits.infinite = true;
+ else if (token == "ponder")
+ limits.ponder = true;
else if (token == "searchmoves")
while (is >> token)
searchMoves.insert(move_from_uci(pos, token));
}
- limits.time = time[pos.side_to_move()];
- limits.increment = inc[pos.side_to_move()];
-
- Threads.start_thinking(pos, limits, searchMoves, true);
+ Threads.start_searching(pos, limits, searchMoves);
}