mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53:09 +00:00
Tidy up uci.cpp and siblings
No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
ca9d40c145
commit
321320b081
4 changed files with 55 additions and 68 deletions
|
@ -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
|
/// 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) {
|
Move move_from_uci(const Position& pos, const string& str) {
|
||||||
|
|
||||||
|
|
|
@ -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.
|
/// Position::do_setup_move() makes a permanent move on the board. It should
|
||||||
/// It should be used when setting up a position on board.
|
/// be used when setting up a position on board. You can't undo the move.
|
||||||
/// You can't undo the move.
|
|
||||||
|
|
||||||
void Position::do_setup_move(Move m) {
|
void Position::do_setup_move(Move m) {
|
||||||
|
|
||||||
|
@ -872,13 +871,14 @@ void Position::do_setup_move(Move m) {
|
||||||
startPosPlyCounter++;
|
startPosPlyCounter++;
|
||||||
|
|
||||||
// Our StateInfo newSt is about going out of scope so copy
|
// Our StateInfo newSt is about going out of scope so copy
|
||||||
// its content inside pos before it disappears.
|
// its content before it disappears.
|
||||||
detach();
|
detach();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Position::do_move() makes a move, and saves all information necessary
|
/// Position::do_move() makes a move, and saves all information necessary
|
||||||
/// to a StateInfo object. The move is assumed to be legal.
|
/// to a StateInfo object. The move is assumed to be legal. Pseudo-legal
|
||||||
/// Pseudo-legal moves should be filtered out before this function is called.
|
/// moves should be filtered out before this function is called.
|
||||||
|
|
||||||
void Position::do_move(Move m, StateInfo& newSt) {
|
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
|
/// Position::flip() flips position with the white and black sides reversed. This
|
||||||
/// the white and black sides reversed. This is only useful for debugging,
|
/// is only useful for debugging especially for finding evaluation symmetry bugs.
|
||||||
/// especially for finding evaluation symmetry bugs.
|
|
||||||
|
|
||||||
void Position::flipped_copy(const Position& pos) {
|
void Position::flip() {
|
||||||
|
|
||||||
assert(pos.is_ok());
|
assert(is_ok());
|
||||||
|
|
||||||
|
// Make a copy of current position before to start changing
|
||||||
|
const Position pos(*this, threadID);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
threadID = pos.thread();
|
threadID = pos.thread();
|
||||||
|
|
|
@ -123,7 +123,7 @@ public:
|
||||||
void print(Move m = MOVE_NONE) const;
|
void print(Move m = MOVE_NONE) const;
|
||||||
|
|
||||||
// Copying
|
// Copying
|
||||||
void flipped_copy(const Position& pos);
|
void flip();
|
||||||
|
|
||||||
// The piece on a given square
|
// The piece on a given square
|
||||||
Piece piece_on(Square s) const;
|
Piece piece_on(Square s) const;
|
||||||
|
|
94
src/uci.cpp
94
src/uci.cpp
|
@ -17,13 +17,7 @@
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
////
|
|
||||||
//// Includes
|
|
||||||
////
|
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cctype>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -31,14 +25,12 @@
|
||||||
#include "evaluate.h"
|
#include "evaluate.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "move.h"
|
#include "move.h"
|
||||||
#include "movegen.h"
|
|
||||||
#include "position.h"
|
#include "position.h"
|
||||||
#include "search.h"
|
#include "search.h"
|
||||||
#include "ucioption.h"
|
#include "ucioption.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// FEN string for the initial position
|
// FEN string for the initial position
|
||||||
|
@ -48,7 +40,6 @@ namespace {
|
||||||
// is actually a string stream built on a given input string.
|
// is actually a string stream built on a given input string.
|
||||||
typedef istringstream UCIParser;
|
typedef istringstream UCIParser;
|
||||||
|
|
||||||
// Local functions
|
|
||||||
void set_option(UCIParser& up);
|
void set_option(UCIParser& up);
|
||||||
void set_position(Position& pos, UCIParser& up);
|
void set_position(Position& pos, UCIParser& up);
|
||||||
bool go(Position& pos, UCIParser& up);
|
bool go(Position& pos, UCIParser& up);
|
||||||
|
@ -64,6 +55,7 @@ namespace {
|
||||||
bool execute_uci_command(const string& cmd) {
|
bool execute_uci_command(const string& cmd) {
|
||||||
|
|
||||||
static Position pos(StartPositionFEN, false, 0); // The root position
|
static Position pos(StartPositionFEN, false, 0); // The root position
|
||||||
|
|
||||||
UCIParser up(cmd);
|
UCIParser up(cmd);
|
||||||
string token;
|
string token;
|
||||||
|
|
||||||
|
@ -72,16 +64,10 @@ bool execute_uci_command(const string& cmd) {
|
||||||
if (token == "quit")
|
if (token == "quit")
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
else if (token == "go")
|
if (token == "go")
|
||||||
return go(pos, up);
|
return go(pos, up);
|
||||||
|
|
||||||
else if (token == "uci")
|
if (token == "ucinewgame")
|
||||||
cout << "id name " << engine_name()
|
|
||||||
<< "\nid author " << engine_authors()
|
|
||||||
<< "\n" << Options.print_all()
|
|
||||||
<< "\nuciok" << endl;
|
|
||||||
|
|
||||||
else if (token == "ucinewgame")
|
|
||||||
pos.from_fen(StartPositionFEN, false);
|
pos.from_fen(StartPositionFEN, false);
|
||||||
|
|
||||||
else if (token == "isready")
|
else if (token == "isready")
|
||||||
|
@ -93,9 +79,15 @@ bool execute_uci_command(const string& cmd) {
|
||||||
else if (token == "setoption")
|
else if (token == "setoption")
|
||||||
set_option(up);
|
set_option(up);
|
||||||
|
|
||||||
|
else if (token == "perft")
|
||||||
|
perft(pos, up);
|
||||||
|
|
||||||
else if (token == "d")
|
else if (token == "d")
|
||||||
pos.print();
|
pos.print();
|
||||||
|
|
||||||
|
else if (token == "flip")
|
||||||
|
pos.flip();
|
||||||
|
|
||||||
else if (token == "eval")
|
else if (token == "eval")
|
||||||
{
|
{
|
||||||
read_evaluation_uci_options(pos.side_to_move());
|
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()
|
<< "\nmaterial key: " << pos.get_material_key()
|
||||||
<< "\npawn key: " << pos.get_pawn_key() << endl;
|
<< "\npawn key: " << pos.get_pawn_key() << endl;
|
||||||
|
|
||||||
else if (token == "perft")
|
else if (token == "uci")
|
||||||
perft(pos, up);
|
cout << "id name " << engine_name()
|
||||||
|
<< "\nid author " << engine_authors()
|
||||||
else if (token == "flip")
|
<< "\n" << Options.print_all()
|
||||||
{
|
<< "\nuciok" << endl;
|
||||||
Position p(pos, pos.thread());
|
|
||||||
pos.flipped_copy(p);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
cout << "Unknown command: " << cmd << endl;
|
cout << "Unknown command: " << cmd << endl;
|
||||||
|
|
||||||
|
@ -122,28 +111,23 @@ bool execute_uci_command(const string& cmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////
|
|
||||||
//// Local functions
|
|
||||||
////
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// set_position() is called when Stockfish receives the "position" UCI
|
// set_position() is called when engine receives the "position" UCI
|
||||||
// command. The input parameter is a UCIParser. It is assumed
|
// command. The function sets up the position described in the given
|
||||||
// that this parser has consumed the first token of the UCI command
|
// fen string ("fen") or the starting position ("startpos") and then
|
||||||
// ("position"), and is ready to read the second token ("startpos"
|
// makes the moves given in the following move list ("moves").
|
||||||
// or "fen", if the input is well-formed).
|
|
||||||
|
|
||||||
void set_position(Position& pos, UCIParser& up) {
|
void set_position(Position& pos, UCIParser& up) {
|
||||||
|
|
||||||
string fen, token;
|
string token, fen;
|
||||||
|
|
||||||
up >> token; // operator>>() skips any whitespace
|
up >> token; // operator>>() skips any whitespace
|
||||||
|
|
||||||
if (token == "startpos")
|
if (token == "startpos")
|
||||||
{
|
{
|
||||||
pos.from_fen(StartPositionFEN, false);
|
pos.from_fen(StartPositionFEN, false);
|
||||||
up >> token; // Consume "moves" token
|
up >> token; // Consume "moves" token if any
|
||||||
}
|
}
|
||||||
else if (token == "fen")
|
else if (token == "fen")
|
||||||
{
|
{
|
||||||
|
@ -160,16 +144,14 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// set_option() is called when Stockfish receives the "setoption" UCI
|
// set_option() is called when engine receives the "setoption" UCI
|
||||||
// command. The input parameter is a UCIParser. It is assumed
|
// command. The function updates the corresponding UCI option ("name")
|
||||||
// that this parser has consumed the first token of the UCI command
|
// to the given value ("value").
|
||||||
// ("setoption"), and is ready to read the second token ("name", if
|
|
||||||
// the input is well-formed).
|
|
||||||
|
|
||||||
void set_option(UCIParser& up) {
|
void set_option(UCIParser& up) {
|
||||||
|
|
||||||
string value = "true"; // UCI buttons don't have a "value" field
|
|
||||||
string token, name;
|
string token, name;
|
||||||
|
string value = "true"; // UCI buttons don't have a "value" field
|
||||||
|
|
||||||
up >> token; // Consume "name" token
|
up >> token; // Consume "name" token
|
||||||
up >> name; // Read option name
|
up >> name; // Read option name
|
||||||
|
@ -191,14 +173,10 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// go() is called when Stockfish receives the "go" UCI command. The
|
// go() is called when engine receives the "go" UCI command. The
|
||||||
// input parameter is a UCIParser. It is assumed that this
|
// function sets the thinking time and other parameters from the input
|
||||||
// parser has consumed the first token of the UCI command ("go"),
|
// string, and then calls think(). Returns false if a quit command
|
||||||
// and is ready to read the second token. The function sets the
|
// is received while thinking, true otherwise.
|
||||||
// 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.
|
|
||||||
|
|
||||||
bool go(Position& pos, UCIParser& up) {
|
bool go(Position& pos, UCIParser& up) {
|
||||||
|
|
||||||
|
@ -247,21 +225,27 @@ namespace {
|
||||||
return think(pos, limits, searchMoves);
|
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) {
|
void perft(Position& pos, UCIParser& up) {
|
||||||
|
|
||||||
int depth, tm;
|
int depth, time;
|
||||||
int64_t n;
|
int64_t n;
|
||||||
|
|
||||||
if (!(up >> depth))
|
if (!(up >> depth))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
tm = get_system_time();
|
time = get_system_time();
|
||||||
|
|
||||||
n = perft(pos, depth * ONE_PLY);
|
n = perft(pos, depth * ONE_PLY);
|
||||||
|
|
||||||
tm = get_system_time() - tm;
|
time = get_system_time() - time;
|
||||||
|
|
||||||
std::cout << "\nNodes " << n
|
std::cout << "\nNodes " << n
|
||||||
<< "\nTime (ms) " << tm
|
<< "\nTime (ms) " << time
|
||||||
<< "\nNodes/second " << int(n / (tm / 1000.0)) << std::endl;
|
<< "\nNodes/second " << int(n / (time / 1000.0)) << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue