mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00
Various cleanup in book.cpp
No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
fad595f5b6
commit
9dcc2aad98
2 changed files with 52 additions and 59 deletions
93
src/book.cpp
93
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;
|
||||
|
||||
if (is_open())
|
||||
{
|
||||
// Get the book size in number of entries
|
||||
seekg(0, ios::end);
|
||||
bookSize = long(tellg()) / EntrySize;
|
||||
seekg(0, ios::beg);
|
||||
|
||||
if (!good())
|
||||
{
|
||||
if (good())
|
||||
return;
|
||||
}
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
||||
for (Color c = WHITE; c <= BLACK; c++)
|
||||
{
|
||||
Bitboard b = pos.pieces_of_color(c);
|
||||
Bitboard b = pos.pieces_of_color(WHITE) | pos.pieces_of_color(BLACK);
|
||||
|
||||
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);
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue