/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
- Copyright (C) 2008-2009 Marco Costalba
+ Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
Stockfish is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
// Get the book size in number of entries
seekg(0, ios::end);
- bookSize = tellg() / EntrySize;
+ bookSize = long(tellg()) / EntrySize;
seekg(0, ios::beg);
if (!good())
/// Book::file_name() returns the file name of the currently active book,
/// or the empty string if no book is open.
-const string Book::file_name() const {
+const string Book::file_name() { // Not const to compile on HP-UX 11.X
return is_open() ? fileName : "";
}
/// Book::get_move() gets a book move for a given position. Returns
/// MOVE_NONE if no book move is found.
-Move Book::get_move(const Position& pos) {
+Move Book::get_move(const Position& pos, bool findBestMove) {
if (!is_open() || bookSize == 0)
return MOVE_NONE;
- int bookMove = 0, scoresSum = 0;
- uint64_t key = book_key(pos);
BookEntry entry;
+ int bookMove = MOVE_NONE;
+ int scoresSum = 0, bestScore = 0;
+ uint64_t key = book_key(pos);
// Choose a book move among the possible moves for the given position
for (int idx = find_key(key); idx < bookSize; idx++)
assert(score > 0);
+ // If findBestMove is true choose highest rated book move
+ if (findBestMove)
+ {
+ if (score > bestScore)
+ {
+ bestScore = score;
+ bookMove = entry.move;
+ }
+ continue;
+ }
+
// Choose book move according to its score. If a move has a very
// high score it has more probability to be choosen then a one with
// lower score. Note that first entry is always chosen.
if (!bookMove)
return MOVE_NONE;
- MoveStack moves[256];
- int n = generate_legal_moves(pos, moves);
- for (int j = 0; j < n; j++)
- if ((int(moves[j].move) & 07777) == bookMove)
- return moves[j].move;
+ MoveStack mlist[MOVES_MAX];
+ MoveStack* last = generate_moves(pos, mlist);
+ for (MoveStack* cur = mlist; cur != last; cur++)
+ if ((int(cur->move) & 07777) == bookMove)
+ return cur->move;
return MOVE_NONE;
}
read(buf, size);
// Numbers are stored on disk as a binary byte stream
- uint64_t n = 0ULL;
+ uint64_t n = 0;
for (int i = 0; i < size; i++)
n = (n << 8) + (unsigned char)buf[i];
uint64_t book_key(const Position& pos) {
- uint64_t result = 0ULL;
+ uint64_t result = 0;
for (Color c = WHITE; c <= BLACK; c++)
{
uint64_t book_castle_key(const Position& pos) {
- uint64_t result = 0ULL;
+ uint64_t result = 0;
if (pos.can_castle_kingside(WHITE))
result ^= Random64[RandomCastle+0];
uint64_t book_ep_key(const Position& pos) {
- return (pos.ep_square() == SQ_NONE ? 0ULL : Random64[RandomEnPassant + square_file(pos.ep_square())]);
+ return pos.ep_square() == SQ_NONE ? 0 : Random64[RandomEnPassant + square_file(pos.ep_square())];
}
uint64_t book_color_key(const Position& pos) {
- return (pos.side_to_move() == WHITE ? Random64[RandomTurn] : 0ULL);
+ return pos.side_to_move() == WHITE ? Random64[RandomTurn] : 0;
}
}