From: Marco Costalba Date: Sun, 26 Oct 2014 06:50:09 +0000 (+0100) Subject: Retire notation.cpp X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=9ba391c5cb1c138bb9828bc8d8be296ebddf1d72 Retire notation.cpp Now we can finally retire notation.cpp and move UCI helpers under uci.cpp No functional change. --- diff --git a/src/Makefile b/src/Makefile index 92072cc1..bc7dc5c8 100644 --- a/src/Makefile +++ b/src/Makefile @@ -39,8 +39,8 @@ PGOBENCH = ./$(EXE) bench 32 1 1 default time ### Object files OBJS = benchmark.o bitbase.o bitboard.o endgame.o evaluate.o main.o \ - material.o misc.o movegen.o movepick.o notation.o pawns.o \ - position.o search.o thread.o timeman.o tt.o uci.o ucioption.o + material.o misc.o movegen.o movepick.o pawns.o position.o \ + search.o thread.o timeman.o tt.o uci.o ucioption.o ### ========================================================================== ### Section 2. High-level Configuration diff --git a/src/notation.cpp b/src/notation.cpp deleted file mode 100644 index d167c2ff..00000000 --- a/src/notation.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - Stockfish, a UCI chess playing engine derived from Glaurung 2.1 - Copyright (C) 2004-2008 Tord Romstad (Glaurung author) - Copyright (C) 2008-2014 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 - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Stockfish is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include -#include - -#include "movegen.h" -#include "position.h" -#include "uci.h" - -using namespace std; - -static const char* PieceToChar[COLOR_NB] = { " PNBRQK", " pnbrqk" }; - - -/// score_to_uci() converts a Value to a string suitable for use with the UCI -/// protocol specifications: -/// -/// cp The score from the engine's point of view in centipawns. -/// mate Mate in y moves, not plies. If the engine is getting mated -/// use negative values for y. - -string UCI::format_value(Value v, Value alpha, Value beta) { - - stringstream ss; - - if (abs(v) < VALUE_MATE_IN_MAX_PLY) - ss << "cp " << v * 100 / PawnValueEg; - else - ss << "mate " << (v > 0 ? VALUE_MATE - v + 1 : -VALUE_MATE - v) / 2; - - ss << (v >= beta ? " lowerbound" : v <= alpha ? " upperbound" : ""); - - return ss.str(); -} - - -/// format_square() converts a Square to a string (g1, a7, etc.) - -std::string UCI::format_square(Square s) { - char ch[] = { 'a' + file_of(s), '1' + rank_of(s), 0 }; - return ch; -} - - -/// format_move() converts a Move to a string in coordinate notation -/// (g1f3, a7a8q, etc.). The only special case is castling moves, where we print -/// in the e1g1 notation in normal chess mode, and in e1h1 notation in chess960 -/// mode. Internally castling moves are always encoded as "king captures rook". - -string UCI::format_move(Move m, bool chess960) { - - Square from = from_sq(m); - Square to = to_sq(m); - - if (m == MOVE_NONE) - return "(none)"; - - if (m == MOVE_NULL) - return "0000"; - - if (type_of(m) == CASTLING && !chess960) - to = make_square(to > from ? FILE_G : FILE_C, rank_of(from)); - - string move = format_square(from) + format_square(to); - - if (type_of(m) == PROMOTION) - move += PieceToChar[BLACK][promotion_type(m)]; // Lower case - - return move; -} - - -/// to_move() takes a position and a string representing a move in -/// simple coordinate notation and returns an equivalent legal Move if any. - -Move UCI::to_move(const Position& pos, string& str) { - - if (str.length() == 5) // Junior could send promotion piece in uppercase - str[4] = char(tolower(str[4])); - - for (MoveList it(pos); *it; ++it) - if (str == format_move(*it, pos.is_chess960())) - return *it; - - return MOVE_NONE; -} diff --git a/src/uci.cpp b/src/uci.cpp index b3a27fbc..819e02bc 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -23,6 +23,7 @@ #include #include "evaluate.h" +#include "movegen.h" #include "position.h" #include "search.h" #include "thread.h" @@ -212,3 +213,78 @@ void UCI::loop(int argc, char* argv[]) { Threads.wait_for_think_finished(); // Cannot quit whilst the search is running } + + +/// format_value() converts a Value to a string suitable for use with the UCI +/// protocol specifications: +/// +/// cp The score from the engine's point of view in centipawns. +/// mate Mate in y moves, not plies. If the engine is getting mated +/// use negative values for y. + +string UCI::format_value(Value v, Value alpha, Value beta) { + + stringstream ss; + + if (abs(v) < VALUE_MATE_IN_MAX_PLY) + ss << "cp " << v * 100 / PawnValueEg; + else + ss << "mate " << (v > 0 ? VALUE_MATE - v + 1 : -VALUE_MATE - v) / 2; + + ss << (v >= beta ? " lowerbound" : v <= alpha ? " upperbound" : ""); + + return ss.str(); +} + + +/// format_square() converts a Square to a string (g1, a7, etc.) + +std::string UCI::format_square(Square s) { + + char ch[] = { 'a' + file_of(s), '1' + rank_of(s), 0 }; // Zero-terminating + return ch; +} + + +/// format_move() converts a Move to a string in coordinate notation +/// (g1f3, a7a8q, etc.). The only special case is castling moves, where we print +/// in the e1g1 notation in normal chess mode, and in e1h1 notation in chess960 +/// mode. Internally castling moves are always encoded as "king captures rook". + +string UCI::format_move(Move m, bool chess960) { + + Square from = from_sq(m); + Square to = to_sq(m); + + if (m == MOVE_NONE) + return "(none)"; + + if (m == MOVE_NULL) + return "0000"; + + if (type_of(m) == CASTLING && !chess960) + to = make_square(to > from ? FILE_G : FILE_C, rank_of(from)); + + string move = format_square(from) + format_square(to); + + if (type_of(m) == PROMOTION) + move += " pnbrqk"[promotion_type(m)]; + + return move; +} + + +/// to_move() takes a position and a string representing a move in +/// simple coordinate notation and returns an equivalent legal Move if any. + +Move UCI::to_move(const Position& pos, string& str) { + + if (str.length() == 5) // Junior could send promotion piece in uppercase + str[4] = char(tolower(str[4])); + + for (MoveList it(pos); *it; ++it) + if (str == format_move(*it, pos.is_chess960())) + return *it; + + return MOVE_NONE; +} diff --git a/src/uci.h b/src/uci.h index 1b606809..a39624a9 100644 --- a/src/uci.h +++ b/src/uci.h @@ -67,10 +67,10 @@ private: void init(OptionsMap&); void loop(int argc, char* argv[]); -Move to_move(const Position& pos, std::string& str); -std::string format_move(Move m, bool chess960); std::string format_value(Value v, Value alpha = -VALUE_INFINITE, Value beta = VALUE_INFINITE); std::string format_square(Square s); +std::string format_move(Move m, bool chess960); +Move to_move(const Position& pos, std::string& str); } // namespace UCI