From a6e0f62a4f83bf4303e920d5f689de7cbc0467e8 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 9 Jun 2013 13:43:30 +0200 Subject: [PATCH] Zobrist::init() should be Position::init() No functional change. --- src/main.cpp | 2 +- src/position.cpp | 126 +++++++++++++++++++++++------------------------ src/position.h | 5 +- src/types.h | 2 - 4 files changed, 65 insertions(+), 70 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 2a04308c..3d26b63a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,7 +34,7 @@ int main(int argc, char* argv[]) { UCI::init(Options); Bitboards::init(); - Zobrist::init(); + Position::init(); Bitbases::init_kpk(); Search::init(); Eval::init(); diff --git a/src/position.cpp b/src/position.cpp index 7d7a0641..05a02f15 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -41,67 +41,16 @@ static const string PieceToChar(" PNBRQK pnbrqk"); CACHE_LINE_ALIGNMENT -Score pieceSquareTable[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB]; +Score psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB]; Value PieceValue[PHASE_NB][PIECE_NB] = { { VALUE_ZERO, PawnValueMg, KnightValueMg, BishopValueMg, RookValueMg, QueenValueMg }, { VALUE_ZERO, PawnValueEg, KnightValueEg, BishopValueEg, RookValueEg, QueenValueEg } }; -namespace Zobrist { - -Key psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB]; -Key enpassant[FILE_NB]; -Key castle[CASTLE_RIGHT_NB]; -Key side; -Key exclusion; - -/// init() initializes at startup the various arrays used to compute hash keys -/// and the piece square tables. The latter is a two-step operation: First, the -/// white halves of the tables are copied from PSQT[] tables. Second, the black -/// halves of the tables are initialized by flipping and changing the sign of -/// the white scores. - -void init() { - - RKISS rk; - - for (Color c = WHITE; c <= BLACK; c++) - for (PieceType pt = PAWN; pt <= KING; pt++) - for (Square s = SQ_A1; s <= SQ_H8; s++) - psq[c][pt][s] = rk.rand(); - - for (File f = FILE_A; f <= FILE_H; f++) - enpassant[f] = rk.rand(); - - for (int cr = CASTLES_NONE; cr <= ALL_CASTLES; cr++) - { - Bitboard b = cr; - while (b) - { - Key k = castle[1ULL << pop_lsb(&b)]; - castle[cr] ^= k ? k : rk.rand(); - } - } - - side = rk.rand(); - exclusion = rk.rand(); - - for (PieceType pt = PAWN; pt <= KING; pt++) - { - PieceValue[MG][make_piece(BLACK, pt)] = PieceValue[MG][pt]; - PieceValue[EG][make_piece(BLACK, pt)] = PieceValue[EG][pt]; - - Score v = make_score(PieceValue[MG][pt], PieceValue[EG][pt]); - - for (Square s = SQ_A1; s <= SQ_H8; s++) - { - pieceSquareTable[WHITE][pt][ s] = (v + PSQT[pt][s]); - pieceSquareTable[BLACK][pt][~s] = -(v + PSQT[pt][s]); - } - } -} - -} // namespace Zobrist - +Key Zobrist::psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB]; +Key Zobrist::enpassant[FILE_NB]; +Key Zobrist::castle[CASTLE_RIGHT_NB]; +Key Zobrist::side; +Key Zobrist::exclusion; namespace { @@ -156,6 +105,53 @@ CheckInfo::CheckInfo(const Position& pos) { } +/// Position::init() initializes at startup the various arrays used to compute +/// hash keys and the piece square tables. The latter is a two-step operation: +/// First, the white halves of the tables are copied from PSQT[] tables. Second, +/// the black halves of the tables are initialized by flipping and changing the +/// sign of the white scores. + +void Position::init() { + + RKISS rk; + + for (Color c = WHITE; c <= BLACK; c++) + for (PieceType pt = PAWN; pt <= KING; pt++) + for (Square s = SQ_A1; s <= SQ_H8; s++) + Zobrist::psq[c][pt][s] = rk.rand(); + + for (File f = FILE_A; f <= FILE_H; f++) + Zobrist::enpassant[f] = rk.rand(); + + for (int cr = CASTLES_NONE; cr <= ALL_CASTLES; cr++) + { + Bitboard b = cr; + while (b) + { + Key k = Zobrist::castle[1ULL << pop_lsb(&b)]; + Zobrist::castle[cr] ^= k ? k : rk.rand(); + } + } + + Zobrist::side = rk.rand(); + Zobrist::exclusion = rk.rand(); + + for (PieceType pt = PAWN; pt <= KING; pt++) + { + PieceValue[MG][make_piece(BLACK, pt)] = PieceValue[MG][pt]; + PieceValue[EG][make_piece(BLACK, pt)] = PieceValue[EG][pt]; + + Score v = make_score(PieceValue[MG][pt], PieceValue[EG][pt]); + + for (Square s = SQ_A1; s <= SQ_H8; s++) + { + psq[WHITE][pt][ s] = (v + PSQT[pt][s]); + psq[BLACK][pt][~s] = -(v + PSQT[pt][s]); + } + } +} + + /// Position::operator=() creates a copy of 'pos'. We want the new born Position /// object do not depend on any external data so we detach state pointer from /// the source one. @@ -288,7 +284,7 @@ void Position::set(const string& fenStr, bool isChess960, Thread* th) { st->key = compute_key(); st->pawnKey = compute_pawn_key(); st->materialKey = compute_material_key(); - st->psqScore = compute_psq_score(); + st->psq = compute_psq_score(); st->npMaterial[WHITE] = compute_non_pawn_material(WHITE); st->npMaterial[BLACK] = compute_non_pawn_material(BLACK); st->checkersBB = attackers_to(king_square(sideToMove)) & pieces(~sideToMove); @@ -767,7 +763,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI do_castle(from, to, rfrom, rto); - st->psqScore += pieceSquareTable[us][ROOK][rto] - pieceSquareTable[us][ROOK][rfrom]; + st->psq += psq[us][ROOK][rto] - psq[us][ROOK][rfrom]; k ^= Zobrist::psq[us][ROOK][rfrom] ^ Zobrist::psq[us][ROOK][rto]; } @@ -820,7 +816,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI prefetch((char*)thisThread->materialTable[st->materialKey]); // Update incremental scores - st->psqScore -= pieceSquareTable[them][capture][capsq]; + st->psq -= psq[them][capture][capsq]; // Reset rule 50 counter st->rule50 = 0; @@ -903,7 +899,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI ^ Zobrist::psq[us][PAWN][pieceCount[us][PAWN]]; // Update incremental score - st->psqScore += pieceSquareTable[us][promotion][to] - pieceSquareTable[us][PAWN][to]; + st->psq += psq[us][promotion][to] - psq[us][PAWN][to]; // Update material st->npMaterial[us] += PieceValue[MG][promotion]; @@ -918,7 +914,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI } // Update incremental scores - st->psqScore += pieceSquareTable[us][pt][to] - pieceSquareTable[us][pt][from]; + st->psq += psq[us][pt][to] - psq[us][pt][from]; // Set capture piece st->capturedType = capture; @@ -1350,7 +1346,7 @@ Score Position::compute_psq_score() const { { Square s = pop_lsb(&b); Piece pc = piece_on(s); - score += pieceSquareTable[color_of(pc)][type_of(pc)][s]; + score += psq[color_of(pc)][type_of(pc)][s]; } return score; @@ -1445,7 +1441,7 @@ void Position::flip() { st->key = compute_key(); st->pawnKey = compute_pawn_key(); st->materialKey = compute_material_key(); - st->psqScore = compute_psq_score(); + st->psq = compute_psq_score(); st->npMaterial[WHITE] = compute_non_pawn_material(WHITE); st->npMaterial[BLACK] = compute_non_pawn_material(BLACK); @@ -1536,7 +1532,7 @@ bool Position::pos_is_ok(int* failedStep) const { if ((*step)++, debugMaterialKey && st->materialKey != compute_material_key()) return false; - if ((*step)++, debugIncrementalEval && st->psqScore != compute_psq_score()) + if ((*step)++, debugIncrementalEval && st->psq != compute_psq_score()) return false; if ((*step)++, debugNonPawnMaterial) diff --git a/src/position.h b/src/position.h index 8b813587..c25244a6 100644 --- a/src/position.h +++ b/src/position.h @@ -52,7 +52,7 @@ struct StateInfo { Key pawnKey, materialKey; Value npMaterial[COLOR_NB]; int castleRights, rule50, pliesFromNull; - Score psqScore; + Score psq; Square epSquare; Key key; @@ -95,6 +95,7 @@ public: Position(const Position& p, Thread* t) { *this = p; thisThread = t; } Position(const std::string& f, bool c960, Thread* t) { set(f, c960, t); } Position& operator=(const Position&); + static void init(); // Text input/output void set(const std::string& fen, bool isChess960, Thread* th); @@ -358,7 +359,7 @@ inline Key Position::material_key() const { } inline Score Position::psq_score() const { - return st->psqScore; + return st->psq; } inline Value Position::non_pawn_material(Color c) const { diff --git a/src/types.h b/src/types.h index 653ebade..43b01bc9 100644 --- a/src/types.h +++ b/src/types.h @@ -335,8 +335,6 @@ namespace Zobrist { extern Key castle[CASTLE_RIGHT_NB]; extern Key side; extern Key exclusion; - - void init(); } extern Value PieceValue[PHASE_NB][PIECE_NB]; -- 2.39.2