/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
- Copyright (C) 2008-2009 Marco Costalba
+ Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
namespace {
+ // FEN string for the initial position
+ const string StartPositionFEN = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
+
// UCIInputParser is a class for parsing UCI input. The class
// is actually a string stream built on a given input string.
// The root position. This is set up when the user (or in practice, the GUI)
// sends the "position" UCI command. The root position is sent to the think()
// function when the program receives the "go" command.
- Position RootPosition(StartPosition);
+ Position RootPosition(0);
// Local functions
bool handle_command(const string& command);
void uci_main_loop() {
- RootPosition.from_fen(StartPosition);
+ RootPosition.from_fen(StartPositionFEN);
string command;
do {
else if (token == "ucinewgame")
{
push_button("New Game");
- Position::init_piece_square_tables();
- RootPosition.from_fen(StartPosition);
+ RootPosition.from_fen(StartPositionFEN);
}
else if (token == "isready")
cout << "readyok" << endl;
RootPosition.print();
else if (token == "flip")
{
- Position p(RootPosition);
+ Position p(RootPosition, RootPosition.thread());
RootPosition.flipped_copy(p);
}
else if (token == "eval")
{
- EvalInfo ei;
- cout << "Incremental mg: " << mg_value(RootPosition.value())
+ Value evalMargin;
+ cout << "Incremental mg: " << mg_value(RootPosition.value())
<< "\nIncremental eg: " << eg_value(RootPosition.value())
- << "\nFull eval: " << evaluate(RootPosition, ei, 0) << endl;
+ << "\nFull eval: " << evaluate(RootPosition, evalMargin) << endl;
}
else if (token == "key")
cout << "key: " << hex << RootPosition.get_key()
return;
if (token == "startpos")
- RootPosition.from_fen(StartPosition);
+ RootPosition.from_fen(StartPositionFEN);
else if (token == "fen")
{
string fen;
RootPosition.do_move(move, st);
if (RootPosition.rule_50_counter() == 0)
RootPosition.reset_game_ply();
+
+ RootPosition.inc_startpos_ply_counter(); //FIXME: make from_fen to support this and rule50
}
// Our StateInfo st is about going out of scope so copy
- // its content inside RootPosition before they disappear.
+ // its content inside RootPosition before it disappears.
RootPosition.detach();
}
}
void set_option(UCIInputParser& uip) {
- string token, name;
+ string token, name, value;
if (!(uip >> token)) // operator>>() skips any whitespace
return;
while (uip >> token && token != "value")
name += (" " + token);
- if (token == "value")
+ if (token == "value" && uip >> value)
{
- // Reads until end of line and left trim white space
- getline(uip, token);
- token.erase(0, token.find_first_not_of(" \n\r\t"));
+ while (uip >> token)
+ value += (" " + token);
- set_option_value(name, token);
+ set_option_value(name, value);
} else
push_button(name);
}
}
}
- if (moveTime)
- infinite = true; // HACK
-
assert(RootPosition.is_ok());
- return think(RootPosition, infinite, ponder, RootPosition.side_to_move(),
- time, inc, movesToGo, depth, nodes, moveTime, searchMoves);
+ return think(RootPosition, infinite, ponder, time, inc, movesToGo,
+ depth, nodes, moveTime, searchMoves);
}
void perft(UCIInputParser& uip) {
string token;
int depth, tm, n;
- Position pos(RootPosition);
+ Position pos(RootPosition, RootPosition.thread());
if (!(uip >> depth))
return;
tm = get_system_time();
- n = perft(pos, depth * OnePly);
+ n = perft(pos, depth * ONE_PLY);
tm = get_system_time() - tm;
std::cout << "\nNodes " << n