const Key* ZobEnPassant = PolyGlotRandoms + 772;
const Key* ZobTurn = PolyGlotRandoms + 780;
- // PieceOffset is calculated as 64 * (PolyPiece ^ 1) where PolyPiece
- // is: BP = 0, WP = 1, BN = 2, WN = 3 ... BK = 10, WK = 11
- const int PieceOffset[] = { 0, 64, 192, 320, 448, 576, 704, 0,
- 0, 0, 128, 256, 384, 512, 640 };
-
// book_key() returns the PolyGlot hash key of the given position
uint64_t book_key(const Position& pos) {
uint64_t key = 0;
- Bitboard b = pos.occupied_squares();
+ Bitboard b = pos.pieces();
while (b)
{
- Square s = pop_1st_bit(&b);
- key ^= ZobPiece[PieceOffset[pos.piece_on(s)] + s];
+ // Piece offset is at 64 * polyPiece where polyPiece is defined as:
+ // BP = 0, WP = 1, BN = 2, WN = 3, ... BK = 10, WK = 11
+ Square s = pop_lsb(&b);
+ Piece p = pos.piece_on(s);
+ int polyPiece = 2 * (type_of(p) - 1) + (color_of(p) == WHITE);
+ key ^= ZobPiece[64 * polyPiece + s];
}
- b = (pos.can_castle(WHITE_OO) << 0) | (pos.can_castle(WHITE_OOO) << 1)
- | (pos.can_castle(BLACK_OO) << 2) | (pos.can_castle(BLACK_OOO) << 3);
+ b = pos.can_castle(ALL_CASTLES);
while (b)
- key ^= ZobCastle[pop_1st_bit(&b)];
+ key ^= ZobCastle[pop_lsb(&b)];
if (pos.ep_square() != SQ_NONE)
key ^= ZobEnPassant[file_of(pos.ep_square())];
Book::Book() : size(0) {
- for (int i = abs(system_time() % 10000); i > 0; i--)
+ for (int i = Time::current_time().msec() % 10000; i > 0; i--)
RKiss.rand<unsigned>(); // Make random number generation less deterministic
}
ifstream::open(fName, ifstream::in | ifstream::binary | ios::ate);
if (!is_open())
+ {
+ clear();
return false; // Silently fail if the file is not found
+ }
// Get the book size in number of entries, we are already at the end of file
- size = tellg() / sizeof(BookEntry);
+ size = (size_t)tellg() / sizeof(BookEntry);
if (!good())
{
// Choose book move according to its score. If a move has a very
// high score it has higher probability to be choosen than a move
// with lower score. Note that first entry is always chosen.
- if ( (RKiss.rand<unsigned>() % sum < e.count)
+ if ( (sum && RKiss.rand<unsigned>() % sum < e.count)
|| (pickBest && e.count == best))
move = Move(e.move);
}
// the special Move's flags (bit 14-15) that are not supported by PolyGlot.
int pt = (move >> 12) & 7;
if (pt)
- move = make_promotion(from_sq(move), to_sq(move), PieceType(pt + 1));
+ move = make<PROMOTION>(from_sq(move), to_sq(move), PieceType(pt + 1));
// Add 'special move' flags and verify it is legal
- for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
+ for (MoveList<LEGAL> ml(pos); !ml.end(); ++ml)
if (move == (ml.move() & 0x3FFF))
return ml.move();
void Book::binary_search(uint64_t key) {
- size_t left, right, mid;
+ size_t low, high, mid;
BookEntry e;
- left = 0;
- right = size - 1;
+ low = 0;
+ high = size - 1;
- assert(left <= right);
+ assert(low <= high);
- while (left < right && good())
+ while (low < high && good())
{
- mid = (left + right) / 2;
+ mid = (low + high) / 2;
- assert(mid >= left && mid < right);
+ assert(mid >= low && mid < high);
seekg(mid * sizeof(BookEntry), ios_base::beg);
*this >> e;
if (key <= e.key)
- right = mid;
+ high = mid;
else
- left = mid + 1;
+ low = mid + 1;
}
- assert(left == right);
+ assert(low == high);
- seekg(left * sizeof(BookEntry), ios_base::beg);
+ seekg(low * sizeof(BookEntry), ios_base::beg);
}