diff --git a/src/evaluate.cpp b/src/evaluate.cpp index baf6f927..a35661ff 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -52,14 +52,14 @@ class Evaluation { public: Evaluation() = delete; - explicit Evaluation(Position *p) : pos(p) + explicit Evaluation(const Position &p) : pos(p) { } Evaluation &operator=(const Evaluation &) = delete; Value value(); private: - Position *pos; + const Position &pos; }; // Evaluation::value() is the main function of the class. It computes the various @@ -74,25 +74,25 @@ Value Evaluation::value() int nPiecesOnBoardDiff; int pieceCountNeedRemove; - switch (pos->phase) { + switch (pos.phase) { case PHASE_READY: break; case PHASE_PLACING: - nPiecesInHandDiff = pos->pieceCountInHand[BLACK] - pos->pieceCountInHand[WHITE]; + nPiecesInHandDiff = pos.pieceCountInHand[BLACK] - pos.pieceCountInHand[WHITE]; value += nPiecesInHandDiff * VALUE_EACH_PIECE_INHAND; - nPiecesOnBoardDiff = pos->pieceCountOnBoard[BLACK] - pos->pieceCountOnBoard[WHITE]; + nPiecesOnBoardDiff = pos.pieceCountOnBoard[BLACK] - pos.pieceCountOnBoard[WHITE]; value += nPiecesOnBoardDiff * VALUE_EACH_PIECE_ONBOARD; - switch (pos->action) { + switch (pos.action) { case ACTION_SELECT: case ACTION_PLACE: break; case ACTION_REMOVE: - pieceCountNeedRemove = (pos->sideToMove == BLACK) ? - pos->pieceCountNeedRemove : -(pos->pieceCountNeedRemove); + pieceCountNeedRemove = (pos.sideToMove == BLACK) ? + pos.pieceCountNeedRemove : -(pos.pieceCountNeedRemove); value += pieceCountNeedRemove * VALUE_EACH_PIECE_PLACING_NEEDREMOVE; break; default: @@ -102,21 +102,21 @@ Value Evaluation::value() break; case PHASE_MOVING: - value = pos->pieceCountOnBoard[BLACK] * VALUE_EACH_PIECE_ONBOARD - - pos->pieceCountOnBoard[WHITE] * VALUE_EACH_PIECE_ONBOARD; + value = pos.pieceCountOnBoard[BLACK] * VALUE_EACH_PIECE_ONBOARD - + pos.pieceCountOnBoard[WHITE] * VALUE_EACH_PIECE_ONBOARD; #ifdef EVALUATE_MOBILITY - value += pos->get_mobility_diff(position->turn, position->pieceCountInHand[BLACK], position->pieceCountInHand[WHITE], false) * 10; + value += pos.get_mobility_diff(position->turn, position->pieceCountInHand[BLACK], position->pieceCountInHand[WHITE], false) * 10; #endif /* EVALUATE_MOBILITY */ - switch (pos->action) { + switch (pos.action) { case ACTION_SELECT: case ACTION_PLACE: break; case ACTION_REMOVE: - pieceCountNeedRemove = (pos->sideToMove == BLACK) ? - pos->pieceCountNeedRemove : -(pos->pieceCountNeedRemove); + pieceCountNeedRemove = (pos.sideToMove == BLACK) ? + pos.pieceCountNeedRemove : -(pos.pieceCountNeedRemove); value += pieceCountNeedRemove * VALUE_EACH_PIECE_MOVING_NEEDREMOVE; break; default: @@ -126,23 +126,23 @@ Value Evaluation::value() break; case PHASE_GAMEOVER: - if (pos->pieceCountOnBoard[BLACK] + pos->pieceCountOnBoard[WHITE] >= + if (pos.pieceCountOnBoard[BLACK] + pos.pieceCountOnBoard[WHITE] >= RANK_NB * FILE_NB) { if (rule.isBlackLosebutNotDrawWhenBoardFull) { value -= VALUE_MATE; } else { value = VALUE_DRAW; } - } else if (pos->action == ACTION_SELECT && - pos->is_all_surrounded() && + } else if (pos.action == ACTION_SELECT && + pos.is_all_surrounded() && rule.isLoseButNotChangeTurnWhenNoWay) { - Value delta = pos->sideToMove == BLACK ? -VALUE_MATE : VALUE_MATE; + Value delta = pos.sideToMove == BLACK ? -VALUE_MATE : VALUE_MATE; value += delta; } - else if (pos->pieceCountOnBoard[BLACK] < rule.nPiecesAtLeast) { + else if (pos.pieceCountOnBoard[BLACK] < rule.nPiecesAtLeast) { value -= VALUE_MATE; - } else if (pos->pieceCountOnBoard[WHITE] < rule.nPiecesAtLeast) { + } else if (pos.pieceCountOnBoard[WHITE] < rule.nPiecesAtLeast) { value += VALUE_MATE; } @@ -152,7 +152,7 @@ Value Evaluation::value() break; } - if (pos->sideToMove == WHITE) { + if (pos.sideToMove == WHITE) { value = -value; } @@ -165,7 +165,7 @@ Value Evaluation::value() /// evaluate() is the evaluator for the outer world. It returns a static /// evaluation of the position from the point of view of the side to move. -Value Eval::evaluate(Position *pos) +Value Eval::evaluate(const Position &pos) { #ifdef ALPHABETA_AI return Evaluation(pos).value(); @@ -176,17 +176,17 @@ Value Eval::evaluate(Position *pos) /// a string (suitable for outputting to stdout) that contains the detailed /// descriptions and values of each evaluation term. Useful for debugging. -std::string Eval::trace(Position *pos) +std::string Eval::trace(const Position &pos) { #if 0 std::memset(scores, 0, sizeof(scores)); // TODO - //pos->this_thread()->contempt = 0 // TODO: SCORE_ZERO; // Reset any dynamic contempt + //pos.this_thread()->contempt = 0 // TODO: SCORE_ZERO; // Reset any dynamic contempt Value v = Evaluation(pos)->value(); - v = pos->side_to_move() == WHITE ? v : -v; // Trace scores are from white's point of view + v = pos.side_to_move() == WHITE ? v : -v; // Trace scores are from white's point of view std::stringstream ss; ss << std::showpoint << std::noshowpos << std::fixed << std::setprecision(2) @@ -207,6 +207,6 @@ std::string Eval::trace(Position *pos) return ss.str(); #endif - pos = pos; + //pos = pos; return ""; } \ No newline at end of file diff --git a/src/evaluate.h b/src/evaluate.h index ae37c09d..eaab60eb 100644 --- a/src/evaluate.h +++ b/src/evaluate.h @@ -28,9 +28,9 @@ class Position; namespace Eval { -std::string trace(Position *pos); +std::string trace(const Position &pos); -Value evaluate(Position *pos); +Value evaluate(const Position &pos); }; #endif // #ifndef EVALUATE_H_INCLUDED diff --git a/src/position.cpp b/src/position.cpp index 7d5615f0..6ff3ec02 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1469,7 +1469,7 @@ Square Position::polar_to_square(File file, Rank rank) return static_cast(file * RANK_NB + rank - 1); } -Color Position::color_on(Square s) +Color Position::color_on(Square s) const { return Color((board[s] & 0x30) >> PLAYER_SHIFT); } @@ -1637,7 +1637,7 @@ void Position::surrounded_pieces_count(Square s, int &nOurPieces, int &nTheirPie } } -bool Position::is_all_surrounded() +bool Position::is_all_surrounded() const { // Full if (pieceCountOnBoard[BLACK] + pieceCountOnBoard[WHITE] >= RANK_NB * FILE_NB) diff --git a/src/position.h b/src/position.h index c612f347..6e4b872a 100644 --- a/src/position.h +++ b/src/position.h @@ -77,7 +77,7 @@ public: // Position representation Piece piece_on(Square s) const; - Color color_on(Square s); + Color color_on(Square s) const; bool empty(Square s) const; template int count(Color c) const; @@ -155,7 +155,7 @@ public: int surrounded_empty_squares_count(Square s, bool includeFobidden); void surrounded_pieces_count(Square s, int &nOurPieces, int &nTheirPieces, int &nBanned, int &nEmpty); - bool is_all_surrounded(); + bool is_all_surrounded() const; static void square_to_polar(Square s, File &file, Rank &rank); static Square polar_to_square(File file, Rank rank); diff --git a/src/search.cpp b/src/search.cpp index fbc3df48..d2f2e5c0 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -786,7 +786,7 @@ Value search(Position *pos, Stack &ss, Depth depth, Depth originDepth, if (unlikely(pos->phase == PHASE_GAMEOVER) || // TODO: Deal with hash and requiredQuit depth <= 0) { - bestValue = Eval::evaluate(pos); + bestValue = Eval::evaluate(*pos); // For win quickly if (bestValue > 0) { diff --git a/src/uci.cpp b/src/uci.cpp index 50495480..d25eb0f0 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -37,6 +37,8 @@ using namespace std; extern vector setup_bench(Position*, istream&); +#if 0 + namespace { // FEN string of the initial position, normal mill game @@ -48,7 +50,7 @@ namespace { // or the starting position ("startpos") and then makes the moves given in the // following move list ("moves"). - void position(Position* pos, istringstream& is, StateListPtr& states) { + void position(Position& pos, istringstream& is, StateListPtr& states) { Move m; string token, fen; @@ -74,7 +76,7 @@ namespace { { states->emplace_back(); //pos.do_move(m, states->back()); // TODO - pos->do_move(m); + pos.do_move(m); } } @@ -166,10 +168,10 @@ namespace { nodes += Threads.nodes_searched(); } else - sync_cout << "\n" << Eval::trace(&pos) << sync_endl; + sync_cout << "\n" << Eval::trace(pos) << sync_endl; } else if (token == "setoption") setoption(is); - else if (token == "position") position(&pos, is, states); + else if (token == "position") position(pos, is, states); else if (token == "ucinewgame") { Search::clear(); elapsed = now(); } // Search::clear() may take some while } @@ -230,7 +232,7 @@ void UCI::loop(int argc, char* argv[]) { else if (token == "setoption") setoption(is); else if (token == "go") go(pos, is, states); - else if (token == "position") position(&pos, is, states); + else if (token == "position") position(pos, is, states); else if (token == "ucinewgame") Search::clear(); else if (token == "isready") sync_cout << "readyok" << sync_endl; @@ -239,7 +241,7 @@ void UCI::loop(int argc, char* argv[]) { else if (token == "flip") pos.flip(); else if (token == "bench") bench(pos, is, states); else if (token == "d") sync_cout << &pos << sync_endl; - else if (token == "eval") sync_cout << Eval::trace(&pos) << sync_endl; + else if (token == "eval") sync_cout << Eval::trace(pos) << sync_endl; else if (token == "compiler") sync_cout << compiler_info() << sync_endl; else sync_cout << "Unknown command: " << cmd << sync_endl; @@ -302,7 +304,7 @@ string UCI::move(Move m) { /// UCI::to_move() converts a string representing a move in coordinate notation /// (g1f3, a7a8q) to the corresponding legal Move, if any. -Move UCI::to_move(Position* pos, string& str) { +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])); @@ -313,3 +315,4 @@ Move UCI::to_move(Position* pos, string& str) { return MOVE_NONE; } +#endif diff --git a/src/uci.h b/src/uci.h index f99f3629..a56131b5 100644 --- a/src/uci.h +++ b/src/uci.h @@ -73,7 +73,7 @@ void loop(int argc, char* argv[]); std::string value(Value v); std::string square(Square s); std::string move(Move m); -std::string pv(Position* pos, Depth depth, Value alpha, Value beta); +std::string pv(Position& pos, Depth depth, Value alpha, Value beta); Move to_move(Position* pos, std::string& str); } // namespace UCI