From 9dcc2aad98b970380a66b61f2238875e9051de97 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 8 Nov 2010 15:30:12 +0100 Subject: [PATCH] Various cleanup in book.cpp No functional change. Signed-off-by: Marco Costalba --- src/book.cpp | 107 ++++++++++++++++++++++++--------------------------- src/rkiss.h | 2 +- 2 files changed, 51 insertions(+), 58 deletions(-) diff --git a/src/book.cpp b/src/book.cpp index c066f7a4..0212317f 100644 --- a/src/book.cpp +++ b/src/book.cpp @@ -42,12 +42,10 @@ using namespace std; namespace { - /// Book entry size in bytes + // Book entry size in bytes const int EntrySize = 16; - - /// Random numbers from PolyGlot, used to compute book hash keys - + // Random numbers from PolyGlot, used to compute book hash keys const uint64_t Random64[781] = { 0x9D39247E33776D41ULL, 0x2AF7398005AAA5C7ULL, 0x44DB015024623547ULL, 0x9C15F73E62A76AE2ULL, 0x75834465489C0C89ULL, 0x3290AC3A203001BFULL, @@ -312,17 +310,13 @@ namespace { 0xF8D626AAAF278509ULL }; + // Indices to the Random64[] array + const int PieceIdx = 0; + const int CastleIdx = 768; + const int EnPassantIdx = 772; + const int TurnIdx = 780; - /// Indices to the Random64[] array - - const int RandomPiece = 0; - const int RandomCastle = 768; - const int RandomEnPassant = 772; - const int RandomTurn = 780; - - - /// Prototypes - + // Local functions uint64_t book_key(const Position& pos); uint64_t book_piece_key(Piece p, Square s); uint64_t book_castle_key(const Position& pos); @@ -351,6 +345,16 @@ Book::~Book() { } +/// Book::close() closes the file only if it is open, otherwise +/// we can end up in a little mess due to how std::ifstream works. + +void Book::close() { + + if (is_open()) + ifstream::close(); +} + + /// Book::open() opens a book file with a given file name void Book::open(const string& fName) { @@ -360,29 +364,19 @@ void Book::open(const string& fName) { fileName = fName; ifstream::open(fileName.c_str(), ifstream::in | ifstream::binary); - if (!is_open()) - return; - - // Get the book size in number of entries - seekg(0, ios::end); - bookSize = long(tellg()) / EntrySize; - seekg(0, ios::beg); - if (!good()) + if (is_open()) { - cerr << "Failed to open book file " << fileName << endl; - Application::exit_with_failure(); - } -} + // Get the book size in number of entries + seekg(0, ios::end); + bookSize = long(tellg()) / EntrySize; + seekg(0, ios::beg); - -/// Book::close() closes the file only if it is open, otherwise -/// we can end up in a little mess due to how std::ifstream works. - -void Book::close() { - - if (is_open()) - ifstream::close(); + if (good()) + return; + } + cerr << "Failed to open book file " << fileName << endl; + Application::exit_with_failure(); } @@ -438,6 +432,7 @@ Move Book::get_move(const Position& pos, bool findBestMove) { if (!bookMove) return MOVE_NONE; + // Verify the book move is legal MoveStack mlist[MOVES_MAX]; MoveStack* last = generate_moves(pos, mlist); for (MoveStack* cur = mlist; cur != last; cur++) @@ -471,6 +466,7 @@ int Book::find_key(uint64_t key) { assert(mid >= left && mid < right); read_entry(entry, mid); + if (key <= entry.key) right = mid; else @@ -480,7 +476,7 @@ int Book::find_key(uint64_t key) { assert(left == right); read_entry(entry, left); - return (entry.key == key)? left : bookSize; + return entry.key == key ? left : bookSize; } @@ -494,7 +490,9 @@ void Book::read_entry(BookEntry& entry, int idx) { assert(is_open()); seekg(idx * EntrySize, ios_base::beg); + *this >> entry; + if (!good()) { cerr << "Failed to read book entry at index " << idx << endl; @@ -509,10 +507,11 @@ void Book::read_entry(BookEntry& entry, int idx) { uint64_t Book::read_integer(int size) { char buf[8]; + uint64_t n = 0; + read(buf, size); // Numbers are stored on disk as a binary byte stream - uint64_t n = 0; for (int i = 0; i < size; i++) n = (n << 8) + (unsigned char)buf[i]; @@ -529,22 +528,14 @@ namespace { uint64_t book_key(const Position& pos) { uint64_t result = 0; + Bitboard b = pos.pieces_of_color(WHITE) | pos.pieces_of_color(BLACK); - for (Color c = WHITE; c <= BLACK; c++) + while (b) { - Bitboard b = pos.pieces_of_color(c); - - while (b) - { - Square s = pop_1st_bit(&b); - Piece p = pos.piece_on(s); - - assert(piece_is_ok(p)); - assert(color_of_piece(p) == c); - - result ^= book_piece_key(p, s); - } + Square s = pop_1st_bit(&b); + result ^= book_piece_key(pos.piece_on(s), s); } + result ^= book_castle_key(pos); result ^= book_ep_key(pos); result ^= book_color_key(pos); @@ -554,10 +545,10 @@ namespace { uint64_t book_piece_key(Piece p, Square s) { - /// Convert pieces to the range 0..11 + // Convert pieces to the range 0..11 static const int PieceTo12[] = { 0, 0, 2, 4, 6, 8, 10, 0, 0, 1, 3, 5, 7, 9, 11 }; - return Random64[RandomPiece + (PieceTo12[int(p)]^1) * 64 + int(s)]; + return Random64[PieceIdx + (PieceTo12[int(p)]^1) * 64 + int(s)]; } @@ -566,27 +557,29 @@ namespace { uint64_t result = 0; if (pos.can_castle_kingside(WHITE)) - result ^= Random64[RandomCastle+0]; + result ^= Random64[CastleIdx + 0]; if (pos.can_castle_queenside(WHITE)) - result ^= Random64[RandomCastle+1]; + result ^= Random64[CastleIdx + 1]; if (pos.can_castle_kingside(BLACK)) - result ^= Random64[RandomCastle+2]; + result ^= Random64[CastleIdx + 2]; if (pos.can_castle_queenside(BLACK)) - result ^= Random64[RandomCastle+3]; + result ^= Random64[CastleIdx + 3]; return result; } uint64_t book_ep_key(const Position& pos) { - return pos.ep_square() == SQ_NONE ? 0 : Random64[RandomEnPassant + square_file(pos.ep_square())]; + + return pos.ep_square() == SQ_NONE ? 0 : Random64[EnPassantIdx + square_file(pos.ep_square())]; } uint64_t book_color_key(const Position& pos) { - return pos.side_to_move() == WHITE ? Random64[RandomTurn] : 0; + + return pos.side_to_move() == WHITE ? Random64[TurnIdx] : 0; } } diff --git a/src/rkiss.h b/src/rkiss.h index 22ab5037..d197c02d 100644 --- a/src/rkiss.h +++ b/src/rkiss.h @@ -72,7 +72,7 @@ class RKISS { s.a = 0xf1ea5eed; s.b = s.c = s.d = 0xd4e12c77; - for (uint64_t i = 0; i < 73; i++) + for (int i = 0; i < 73; i++) rand64(); } -- 2.39.2