1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 08:13:08 +00:00

Various cleanup in book.cpp

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-11-08 15:30:12 +01:00
parent fad595f5b6
commit 9dcc2aad98
2 changed files with 52 additions and 59 deletions

View file

@ -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())
{
cerr << "Failed to open book file " << fileName << endl;
Application::exit_with_failure();
}
}
/// 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();
{
// Get the book size in number of entries
seekg(0, ios::end);
bookSize = long(tellg()) / EntrySize;
seekg(0, ios::beg);
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;
}
}

View file

@ -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();
}