mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00
Small touches to book.cpp
No functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
c2c185423b
commit
80dd90f972
3 changed files with 27 additions and 38 deletions
61
src/book.cpp
61
src/book.cpp
|
@ -361,8 +361,8 @@ 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.
|
||||
/// Book::close() closes the file only if it is open, otherwise the call fails
|
||||
/// and the failbit internal state flag is set.
|
||||
|
||||
void Book::close() {
|
||||
|
||||
|
@ -374,21 +374,20 @@ void Book::close() {
|
|||
}
|
||||
|
||||
|
||||
/// Book::open() opens a book file with a given file name
|
||||
/// Book::open() opens a book file with a given name
|
||||
|
||||
void Book::open(const string& fileName) {
|
||||
|
||||
// Close old file before opening the new
|
||||
close();
|
||||
|
||||
bookFile.open(fileName.c_str(), ifstream::in | ifstream::binary);
|
||||
bookFile.open(fileName.c_str(), ifstream::in | ifstream::binary |ios::ate);
|
||||
|
||||
// Silently return when asked to open a non-exsistent file
|
||||
if (!bookFile.is_open())
|
||||
return;
|
||||
|
||||
// Get the book size in number of entries
|
||||
bookFile.seekg(0, ios::end);
|
||||
// Get the book size in number of entries, we are already at the file end
|
||||
bookSize = long(bookFile.tellg()) / sizeof(BookEntry);
|
||||
|
||||
if (!bookFile.good())
|
||||
|
@ -402,44 +401,34 @@ void Book::open(const string& fileName) {
|
|||
}
|
||||
|
||||
|
||||
/// Book::get_move() gets a book move for a given position. Returns
|
||||
/// MOVE_NONE if no book move is found. If findBestMove is true then
|
||||
/// return always the highest rated book move.
|
||||
/// Book::probe() gets a book move for a given position. Returns MOVE_NONE
|
||||
/// if no book move is found. If findBest is true then returns always the
|
||||
/// highest rated move otherwise chooses randomly based on the move score.
|
||||
|
||||
Move Book::get_move(const Position& pos, bool findBestMove) {
|
||||
Move Book::probe(const Position& pos, bool findBest) {
|
||||
|
||||
if (!bookSize || !bookFile.is_open())
|
||||
return MOVE_NONE;
|
||||
|
||||
BookEntry entry;
|
||||
int bookMove = MOVE_NONE;
|
||||
unsigned score, scoresSum = 0, bestScore = 0;
|
||||
unsigned scoresSum = 0, bestScore = 0, bookMove = 0;
|
||||
uint64_t key = book_key(pos);
|
||||
int idx = first_entry(key) - 1;
|
||||
|
||||
// Choose a book move among the possible moves for the given position
|
||||
for (int idx = first_entry(key); idx < bookSize; idx++)
|
||||
while (++idx < bookSize && (entry = read_entry(idx), entry.key == key))
|
||||
{
|
||||
entry = read_entry(idx);
|
||||
scoresSum += entry.count;
|
||||
|
||||
if (entry.key != key)
|
||||
break;
|
||||
|
||||
score = entry.count;
|
||||
|
||||
if (!findBestMove)
|
||||
{
|
||||
// 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.
|
||||
scoresSum += score;
|
||||
if (RKiss.rand<unsigned>() % scoresSum < score)
|
||||
bookMove = entry.move;
|
||||
}
|
||||
else if (score > bestScore)
|
||||
{
|
||||
bestScore = score;
|
||||
// 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>() % scoresSum < entry.count
|
||||
|| (findBest && entry.count > bestScore))
|
||||
bookMove = entry.move;
|
||||
}
|
||||
|
||||
if (entry.count > bestScore)
|
||||
bestScore = entry.count;
|
||||
}
|
||||
|
||||
if (!bookMove)
|
||||
|
@ -458,12 +447,12 @@ Move Book::get_move(const Position& pos, bool findBestMove) {
|
|||
int promotion = (bookMove >> 12) & 7;
|
||||
|
||||
if (promotion)
|
||||
bookMove = int(make_promotion_move(move_from(Move(bookMove)),
|
||||
move_to(Move(bookMove)),
|
||||
PieceType(promotion + 1)));
|
||||
bookMove = make_promotion_move(move_from(Move(bookMove)),
|
||||
move_to(Move(bookMove)),
|
||||
PieceType(promotion + 1));
|
||||
// Verify the book move is legal
|
||||
for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
|
||||
if ((ml.move() & ~(3 << 14)) == bookMove) // Mask out special flags
|
||||
if (unsigned(ml.move() & ~(3 << 14)) == bookMove) // Mask out special flags
|
||||
return ml.move();
|
||||
|
||||
return MOVE_NONE;
|
||||
|
|
|
@ -44,7 +44,7 @@ public:
|
|||
~Book();
|
||||
void open(const std::string& fileName);
|
||||
void close();
|
||||
Move get_move(const Position& pos, bool findBestMove);
|
||||
Move probe(const Position& pos, bool findBestMove);
|
||||
const std::string name() const { return bookName; }
|
||||
|
||||
private:
|
||||
|
|
|
@ -391,7 +391,7 @@ bool think(Position& pos, const SearchLimits& limits, Move searchMoves[]) {
|
|||
if (Options["Book File"].value<string>() != book.name())
|
||||
book.open(Options["Book File"].value<string>());
|
||||
|
||||
Move bookMove = book.get_move(pos, Options["Best Book Move"].value<bool>());
|
||||
Move bookMove = book.probe(pos, Options["Best Book Move"].value<bool>());
|
||||
if (bookMove != MOVE_NONE)
|
||||
{
|
||||
if (Limits.ponder)
|
||||
|
|
Loading…
Add table
Reference in a new issue