UCIParser up(cmd);
string token;
- if (!(up >> token)) // operator>>() skips any whitespace
- return true;
+ up >> token; // operator>>() skips any whitespace
if (token == "quit")
return false;
- if (token == "go")
+ else if (token == "go")
return go(pos, up);
- if (token == "uci")
- {
+ else if (token == "uci")
cout << "id name " << engine_name()
- << "\nid author Tord Romstad, Marco Costalba, Joona Kiiski\n";
- print_uci_options();
- cout << "uciok" << endl;
- }
+ << "\nid author " << engine_authors()
+ << "\n" << Options.print_all()
+ << "\nuciok" << endl;
+
else if (token == "ucinewgame")
pos.from_fen(StartPositionFEN, false);
else if (token == "setoption")
set_option(up);
- // The remaining commands are for debugging purposes only
else if (token == "d")
pos.print();
- else if (token == "flip")
- {
- Position p(pos, pos.thread());
- pos.flipped_copy(p);
- }
else if (token == "eval")
{
- Value evalMargin;
- cout << "Incremental mg: " << mg_value(pos.value())
- << "\nIncremental eg: " << eg_value(pos.value())
- << "\nFull eval: " << evaluate(pos, evalMargin) << endl;
+ read_evaluation_uci_options(pos.side_to_move());
+ cout << trace_evaluate(pos) << endl;
}
+
else if (token == "key")
- cout << "key: " << hex << pos.get_key()
+ cout << "key: " << hex << pos.get_key()
<< "\nmaterial key: " << pos.get_material_key()
- << "\npawn key: " << pos.get_pawn_key() << endl;
+ << "\npawn key: " << pos.get_pawn_key() << endl;
else if (token == "perft")
perft(pos, up);
+ else if (token == "flip")
+ {
+ Position p(pos, pos.thread());
+ pos.flipped_copy(p);
+ }
else
cout << "Unknown command: " << cmd << endl;
bool go(Position& pos, UCIParser& up) {
string token;
-
- int time[2] = {0, 0}, inc[2] = {0, 0};
- int movesToGo = 0, depth = 0, nodes = 0, moveTime = 0;
- bool infinite = false, ponder = false;
- Move searchMoves[MOVES_MAX];
-
- searchMoves[0] = MOVE_NONE;
+ int time[] = { 0, 0 }, inc[] = { 0, 0 };
+ SearchLimits limits(0, 0, 0, 0, 0, 0, false, false);
+ Move searchMoves[MOVES_MAX] = { MOVE_NONE };
+ Move* cur = searchMoves;
while (up >> token)
{
if (token == "infinite")
- infinite = true;
+ limits.infinite = true;
else if (token == "ponder")
- ponder = true;
+ limits.ponder = true;
else if (token == "wtime")
- up >> time[0];
+ up >> time[WHITE];
else if (token == "btime")
- up >> time[1];
+ up >> time[BLACK];
else if (token == "winc")
- up >> inc[0];
+ up >> inc[WHITE];
else if (token == "binc")
- up >> inc[1];
+ up >> inc[BLACK];
else if (token == "movestogo")
- up >> movesToGo;
+ up >> limits.movesToGo;
else if (token == "depth")
- up >> depth;
+ up >> limits.maxDepth;
else if (token == "nodes")
- up >> nodes;
+ up >> limits.maxNodes;
else if (token == "movetime")
- up >> moveTime;
+ up >> limits.maxTime;
else if (token == "searchmoves")
{
- int numOfMoves = 0;
while (up >> token)
- searchMoves[numOfMoves++] = move_from_uci(pos, token);
+ *cur++ = move_from_uci(pos, token);
- searchMoves[numOfMoves] = MOVE_NONE;
+ *cur = MOVE_NONE;
}
}
assert(pos.is_ok());
- return think(pos, infinite, ponder, time, inc, movesToGo,
- depth, nodes, moveTime, searchMoves);
+ limits.time = time[pos.side_to_move()];
+ limits.increment = inc[pos.side_to_move()];
+
+ return think(pos, limits, searchMoves);
}
void perft(Position& pos, UCIParser& up) {