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
109
src/book.cpp
109
src/book.cpp
|
@ -42,12 +42,10 @@ using namespace std;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
/// Book entry size in bytes
|
// Book entry size in bytes
|
||||||
const int EntrySize = 16;
|
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] = {
|
const uint64_t Random64[781] = {
|
||||||
0x9D39247E33776D41ULL, 0x2AF7398005AAA5C7ULL, 0x44DB015024623547ULL,
|
0x9D39247E33776D41ULL, 0x2AF7398005AAA5C7ULL, 0x44DB015024623547ULL,
|
||||||
0x9C15F73E62A76AE2ULL, 0x75834465489C0C89ULL, 0x3290AC3A203001BFULL,
|
0x9C15F73E62A76AE2ULL, 0x75834465489C0C89ULL, 0x3290AC3A203001BFULL,
|
||||||
|
@ -312,17 +310,13 @@ namespace {
|
||||||
0xF8D626AAAF278509ULL
|
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
|
// Local functions
|
||||||
|
|
||||||
const int RandomPiece = 0;
|
|
||||||
const int RandomCastle = 768;
|
|
||||||
const int RandomEnPassant = 772;
|
|
||||||
const int RandomTurn = 780;
|
|
||||||
|
|
||||||
|
|
||||||
/// Prototypes
|
|
||||||
|
|
||||||
uint64_t book_key(const Position& pos);
|
uint64_t book_key(const Position& pos);
|
||||||
uint64_t book_piece_key(Piece p, Square s);
|
uint64_t book_piece_key(Piece p, Square s);
|
||||||
uint64_t book_castle_key(const Position& pos);
|
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
|
/// Book::open() opens a book file with a given file name
|
||||||
|
|
||||||
void Book::open(const string& fName) {
|
void Book::open(const string& fName) {
|
||||||
|
@ -360,29 +364,19 @@ void Book::open(const string& fName) {
|
||||||
|
|
||||||
fileName = fName;
|
fileName = fName;
|
||||||
ifstream::open(fileName.c_str(), ifstream::in | ifstream::binary);
|
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())
|
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)
|
if (!bookMove)
|
||||||
return MOVE_NONE;
|
return MOVE_NONE;
|
||||||
|
|
||||||
|
// Verify the book move is legal
|
||||||
MoveStack mlist[MOVES_MAX];
|
MoveStack mlist[MOVES_MAX];
|
||||||
MoveStack* last = generate_moves(pos, mlist);
|
MoveStack* last = generate_moves(pos, mlist);
|
||||||
for (MoveStack* cur = mlist; cur != last; cur++)
|
for (MoveStack* cur = mlist; cur != last; cur++)
|
||||||
|
@ -471,6 +466,7 @@ int Book::find_key(uint64_t key) {
|
||||||
assert(mid >= left && mid < right);
|
assert(mid >= left && mid < right);
|
||||||
|
|
||||||
read_entry(entry, mid);
|
read_entry(entry, mid);
|
||||||
|
|
||||||
if (key <= entry.key)
|
if (key <= entry.key)
|
||||||
right = mid;
|
right = mid;
|
||||||
else
|
else
|
||||||
|
@ -480,7 +476,7 @@ int Book::find_key(uint64_t key) {
|
||||||
assert(left == right);
|
assert(left == right);
|
||||||
|
|
||||||
read_entry(entry, left);
|
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());
|
assert(is_open());
|
||||||
|
|
||||||
seekg(idx * EntrySize, ios_base::beg);
|
seekg(idx * EntrySize, ios_base::beg);
|
||||||
|
|
||||||
*this >> entry;
|
*this >> entry;
|
||||||
|
|
||||||
if (!good())
|
if (!good())
|
||||||
{
|
{
|
||||||
cerr << "Failed to read book entry at index " << idx << endl;
|
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) {
|
uint64_t Book::read_integer(int size) {
|
||||||
|
|
||||||
char buf[8];
|
char buf[8];
|
||||||
|
uint64_t n = 0;
|
||||||
|
|
||||||
read(buf, size);
|
read(buf, size);
|
||||||
|
|
||||||
// Numbers are stored on disk as a binary byte stream
|
// Numbers are stored on disk as a binary byte stream
|
||||||
uint64_t n = 0;
|
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < size; i++)
|
||||||
n = (n << 8) + (unsigned char)buf[i];
|
n = (n << 8) + (unsigned char)buf[i];
|
||||||
|
|
||||||
|
@ -529,22 +528,14 @@ namespace {
|
||||||
uint64_t book_key(const Position& pos) {
|
uint64_t book_key(const Position& pos) {
|
||||||
|
|
||||||
uint64_t result = 0;
|
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);
|
Square s = pop_1st_bit(&b);
|
||||||
|
result ^= book_piece_key(pos.piece_on(s), s);
|
||||||
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_castle_key(pos);
|
result ^= book_castle_key(pos);
|
||||||
result ^= book_ep_key(pos);
|
result ^= book_ep_key(pos);
|
||||||
result ^= book_color_key(pos);
|
result ^= book_color_key(pos);
|
||||||
|
@ -554,10 +545,10 @@ namespace {
|
||||||
|
|
||||||
uint64_t book_piece_key(Piece p, Square s) {
|
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 };
|
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;
|
uint64_t result = 0;
|
||||||
|
|
||||||
if (pos.can_castle_kingside(WHITE))
|
if (pos.can_castle_kingside(WHITE))
|
||||||
result ^= Random64[RandomCastle+0];
|
result ^= Random64[CastleIdx + 0];
|
||||||
|
|
||||||
if (pos.can_castle_queenside(WHITE))
|
if (pos.can_castle_queenside(WHITE))
|
||||||
result ^= Random64[RandomCastle+1];
|
result ^= Random64[CastleIdx + 1];
|
||||||
|
|
||||||
if (pos.can_castle_kingside(BLACK))
|
if (pos.can_castle_kingside(BLACK))
|
||||||
result ^= Random64[RandomCastle+2];
|
result ^= Random64[CastleIdx + 2];
|
||||||
|
|
||||||
if (pos.can_castle_queenside(BLACK))
|
if (pos.can_castle_queenside(BLACK))
|
||||||
result ^= Random64[RandomCastle+3];
|
result ^= Random64[CastleIdx + 3];
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint64_t book_ep_key(const Position& pos) {
|
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) {
|
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.a = 0xf1ea5eed;
|
||||||
s.b = s.c = s.d = 0xd4e12c77;
|
s.b = s.c = s.d = 0xd4e12c77;
|
||||||
for (uint64_t i = 0; i < 73; i++)
|
for (int i = 0; i < 73; i++)
|
||||||
rand64();
|
rand64();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue