X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.cpp;h=1364c7ed7d2cb9c7b3453fd02d578d9d528947e0;hp=2508db669dfb2241ed0e4c322fbfb6fbd8d0cfe0;hb=03cfd94414b49489cae12abfd6c39f7fbb53515a;hpb=cfe59de27ddc42ac555187ae68879f2bc7bd7936 diff --git a/src/position.cpp b/src/position.cpp index 2508db66..1364c7ed 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1,7 +1,7 @@ /* 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 @@ -44,8 +44,6 @@ using std::string; //// Variables //// -int Position::castleRightsMask[64]; - Key Position::zobrist[2][8][64]; Key Position::zobEp[64]; Key Position::zobCastle[16]; @@ -87,7 +85,7 @@ Position::Position() {} Position::Position(const Position& pos) { - fast_copy(pos); + memcpy(this, &pos, sizeof(Position)); detach(); // Always detach() in copy c'tor to avoid surprises } @@ -97,19 +95,6 @@ Position::Position(const string& fen) { } -/// Position::fast_copy() creates a partial copy of the given position, -/// only data that changes with a do_move() / undo_move() cycle is copied, -/// in particular for stateInfo are copied only the pointers, so that the -/// actual data remains stored in the parent Position. This is not a problem -/// if the parent Position is known not to be destroyed while we are still alive, -/// as is the common case, see detach() otherwise. - -void Position::fast_copy(const Position& pos) { - - memcpy(this, &pos, sizeof(Position)); -} - - /// Position::detach() copies the content of the current state and castling /// masks inside the position itself. This is needed when the st pointee could /// become stale, as example because the caller is about to going out of scope. @@ -712,7 +697,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI assert(is_ok()); assert(move_is_ok(m)); - Bitboard key = st->key; + Key key = st->key; // Copy some fields of old state to our new StateInfo object except the // ones which are recalculated from scratch anyway, then switch our state @@ -843,13 +828,13 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI set_bit(&(byTypeBB[promotion]), to); board[to] = piece_of_color_and_type(us, promotion); + // Update piece counts + pieceCount[us][promotion]++; + pieceCount[us][PAWN]--; + // Update material key st->materialKey ^= zobMaterial[us][PAWN][pieceCount[us][PAWN]]; - st->materialKey ^= zobMaterial[us][promotion][pieceCount[us][promotion]+1]; - - // Update piece counts - pieceCount[us][PAWN]--; - pieceCount[us][promotion]++; + st->materialKey ^= zobMaterial[us][promotion][pieceCount[us][promotion]-1]; // Update piece lists, move the last pawn at index[to] position // and shrink the list. Add a new promotion piece to the list. @@ -911,7 +896,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI /// Position::do_capture_move() is a private method used to update captured /// piece info. It is called from the main Position::do_move function. -void Position::do_capture_move(Bitboard& key, PieceType capture, Color them, Square to, bool ep) { +void Position::do_capture_move(Key& key, PieceType capture, Color them, Square to, bool ep) { assert(capture != KING); @@ -947,12 +932,12 @@ void Position::do_capture_move(Bitboard& key, PieceType capture, Color them, Squ else st->npMaterial[them] -= piece_value_midgame(capture); - // Update material hash key - st->materialKey ^= zobMaterial[them][capture][pieceCount[them][capture]]; - // Update piece count pieceCount[them][capture]--; + // Update material hash key + st->materialKey ^= zobMaterial[them][capture][pieceCount[them][capture]]; + // Update piece list, move the last piece at index[capsq] position // // WARNING: This is a not perfectly revresible operation. When we @@ -1301,11 +1286,6 @@ void Position::undo_null_move() { } -/// -PieceType Position::captured_piece() const { - return st->capture; -} - /// Position::see() is a static exchange evaluator: It tries to estimate the /// material gain or loss resulting from a move. There are three versions of /// this function: One which takes a destination square as input, one takes a @@ -1618,7 +1598,7 @@ Key Position::compute_material_key() const { for (PieceType pt = PAWN; pt <= QUEEN; pt++) { int count = piece_count(c, pt); - for (int i = 0; i <= count; i++) + for (int i = 0; i < count; i++) result ^= zobMaterial[c][pt][i]; } return result; @@ -1678,6 +1658,7 @@ Value Position::compute_non_pawn_material(Color c) const { /// Position::is_draw() tests whether the position is drawn by material, /// repetition, or the 50 moves rule. It does not detect stalemates, this /// must be done by the search. +// FIXME: Currently we are not handling 50 move rule correctly when in check bool Position::is_draw() const { @@ -1691,7 +1672,7 @@ bool Position::is_draw() const { return true; // Draw by repetition? - for (int i = 2; i < Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2) + for (int i = 4; i <= Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2) if (history[gamePly - i] == st->key) return true; @@ -1774,10 +1755,10 @@ void Position::init_zobrist() { for (int i = 0; i < 2; i++) for (int j = 0; j < 8; j++) - for (int k = 0; k < 16; k++) - zobMaterial[i][j][k] = (k > 0)? Key(genrand_int64()) : Key(0LL); + for (int k = 0; k < 8; k++) + zobMaterial[i][j][k] = Key(genrand_int64()); - for (int i = 0; i < 16; i++) + for (int i = 0; i < 8; i++) zobMaterial[0][KING][i] = zobMaterial[1][KING][i] = Key(0ULL); zobExclusion = genrand_int64();