From 321320b0814d5994640977cf96e015eba8ce22d5 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Tue, 26 Apr 2011 11:19:57 +0200 Subject: [PATCH] Tidy up uci.cpp and siblings No functional change. Signed-off-by: Marco Costalba --- src/move.cpp | 3 +- src/position.cpp | 24 +++++++------ src/position.h | 2 +- src/uci.cpp | 94 ++++++++++++++++++++---------------------------- 4 files changed, 55 insertions(+), 68 deletions(-) diff --git a/src/move.cpp b/src/move.cpp index 96215e82..ff0adbe5 100644 --- a/src/move.cpp +++ b/src/move.cpp @@ -66,7 +66,8 @@ const string move_to_uci(Move m, bool chess960) { /// move_from_uci() takes a position and a string representing a move in -/// simple coordinate notation and returns an equivalent Move. +/// simple coordinate notation and returns an equivalent Move if any. +/// Moves are guaranteed to be legal. Move move_from_uci(const Position& pos, const string& str) { diff --git a/src/position.cpp b/src/position.cpp index 657a4d58..9f9069cd 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -853,9 +853,8 @@ bool Position::move_is_check(Move m, const CheckInfo& ci) const { } -/// Position::do_setup_move() makes a permanent move on the board. -/// It should be used when setting up a position on board. -/// You can't undo the move. +/// Position::do_setup_move() makes a permanent move on the board. It should +/// be used when setting up a position on board. You can't undo the move. void Position::do_setup_move(Move m) { @@ -872,13 +871,14 @@ void Position::do_setup_move(Move m) { startPosPlyCounter++; // Our StateInfo newSt is about going out of scope so copy - // its content inside pos before it disappears. + // its content before it disappears. detach(); } + /// Position::do_move() makes a move, and saves all information necessary -/// to a StateInfo object. The move is assumed to be legal. -/// Pseudo-legal moves should be filtered out before this function is called. +/// to a StateInfo object. The move is assumed to be legal. Pseudo-legal +/// moves should be filtered out before this function is called. void Position::do_move(Move m, StateInfo& newSt) { @@ -1842,13 +1842,15 @@ void Position::init_piece_square_tables() { } -/// Position::flipped_copy() makes a copy of the input position, but with -/// the white and black sides reversed. This is only useful for debugging, -/// especially for finding evaluation symmetry bugs. +/// Position::flip() flips position with the white and black sides reversed. This +/// is only useful for debugging especially for finding evaluation symmetry bugs. + +void Position::flip() { -void Position::flipped_copy(const Position& pos) { + assert(is_ok()); - assert(pos.is_ok()); + // Make a copy of current position before to start changing + const Position pos(*this, threadID); clear(); threadID = pos.thread(); diff --git a/src/position.h b/src/position.h index 222cd92c..b811e8c6 100644 --- a/src/position.h +++ b/src/position.h @@ -123,7 +123,7 @@ public: void print(Move m = MOVE_NONE) const; // Copying - void flipped_copy(const Position& pos); + void flip(); // The piece on a given square Piece piece_on(Square s) const; diff --git a/src/uci.cpp b/src/uci.cpp index 34a26586..5a302a8d 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -17,13 +17,7 @@ along with this program. If not, see . */ - -//// -//// Includes -//// - #include -#include #include #include #include @@ -31,14 +25,12 @@ #include "evaluate.h" #include "misc.h" #include "move.h" -#include "movegen.h" #include "position.h" #include "search.h" #include "ucioption.h" using namespace std; - namespace { // FEN string for the initial position @@ -48,7 +40,6 @@ namespace { // is actually a string stream built on a given input string. typedef istringstream UCIParser; - // Local functions void set_option(UCIParser& up); void set_position(Position& pos, UCIParser& up); bool go(Position& pos, UCIParser& up); @@ -64,6 +55,7 @@ namespace { bool execute_uci_command(const string& cmd) { static Position pos(StartPositionFEN, false, 0); // The root position + UCIParser up(cmd); string token; @@ -72,16 +64,10 @@ bool execute_uci_command(const string& cmd) { if (token == "quit") return false; - else if (token == "go") + if (token == "go") return go(pos, up); - else if (token == "uci") - cout << "id name " << engine_name() - << "\nid author " << engine_authors() - << "\n" << Options.print_all() - << "\nuciok" << endl; - - else if (token == "ucinewgame") + if (token == "ucinewgame") pos.from_fen(StartPositionFEN, false); else if (token == "isready") @@ -93,9 +79,15 @@ bool execute_uci_command(const string& cmd) { else if (token == "setoption") set_option(up); + else if (token == "perft") + perft(pos, up); + else if (token == "d") pos.print(); + else if (token == "flip") + pos.flip(); + else if (token == "eval") { read_evaluation_uci_options(pos.side_to_move()); @@ -107,14 +99,11 @@ bool execute_uci_command(const string& cmd) { << "\nmaterial key: " << pos.get_material_key() << "\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 if (token == "uci") + cout << "id name " << engine_name() + << "\nid author " << engine_authors() + << "\n" << Options.print_all() + << "\nuciok" << endl; else cout << "Unknown command: " << cmd << endl; @@ -122,28 +111,23 @@ bool execute_uci_command(const string& cmd) { } -//// -//// Local functions -//// - namespace { - // set_position() is called when Stockfish receives the "position" UCI - // command. The input parameter is a UCIParser. It is assumed - // that this parser has consumed the first token of the UCI command - // ("position"), and is ready to read the second token ("startpos" - // or "fen", if the input is well-formed). + // set_position() is called when engine receives the "position" UCI + // command. The function sets up the position described in the given + // fen string ("fen") or the starting position ("startpos") and then + // makes the moves given in the following move list ("moves"). void set_position(Position& pos, UCIParser& up) { - string fen, token; + string token, fen; up >> token; // operator>>() skips any whitespace if (token == "startpos") { pos.from_fen(StartPositionFEN, false); - up >> token; // Consume "moves" token + up >> token; // Consume "moves" token if any } else if (token == "fen") { @@ -160,16 +144,14 @@ namespace { } - // set_option() is called when Stockfish receives the "setoption" UCI - // command. The input parameter is a UCIParser. It is assumed - // that this parser has consumed the first token of the UCI command - // ("setoption"), and is ready to read the second token ("name", if - // the input is well-formed). + // set_option() is called when engine receives the "setoption" UCI + // command. The function updates the corresponding UCI option ("name") + // to the given value ("value"). void set_option(UCIParser& up) { - string value = "true"; // UCI buttons don't have a "value" field string token, name; + string value = "true"; // UCI buttons don't have a "value" field up >> token; // Consume "name" token up >> name; // Read option name @@ -191,14 +173,10 @@ namespace { } - // go() is called when Stockfish receives the "go" UCI command. The - // input parameter is a UCIParser. It is assumed that this - // parser has consumed the first token of the UCI command ("go"), - // and is ready to read the second token. The function sets the - // thinking time and other parameters from the input string, and - // calls think() (defined in search.cpp) with the appropriate - // parameters. Returns false if a quit command is received while - // thinking, returns true otherwise. + // 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 calls think(). Returns false if a quit command + // is received while thinking, true otherwise. bool go(Position& pos, UCIParser& up) { @@ -247,21 +225,27 @@ namespace { return think(pos, limits, searchMoves); } + + // perft() is called when engine receives the "perft" command. + // The function calls perft() passing the required search depth + // then prints counted nodes and elapsed time. + void perft(Position& pos, UCIParser& up) { - int depth, tm; + int depth, time; int64_t n; if (!(up >> depth)) return; - tm = get_system_time(); + time = get_system_time(); n = perft(pos, depth * ONE_PLY); - tm = get_system_time() - tm; + time = get_system_time() - time; + std::cout << "\nNodes " << n - << "\nTime (ms) " << tm - << "\nNodes/second " << int(n / (tm / 1000.0)) << std::endl; + << "\nTime (ms) " << time + << "\nNodes/second " << int(n / (time / 1000.0)) << std::endl; } } -- 2.39.2