From 53051eefc741586f72ccbf9a765592c4ca6030bd Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 2 Feb 2013 16:04:41 +0100 Subject: [PATCH] Retire history.h And move the contents to movepick.cpp, where they are mostly used. Idea from DiscoCheck. No functional change (bench 5379503) --- src/history.h | 72 ------------------------------------------------ src/movepick.cpp | 25 ++++++++++++++--- src/movepick.h | 26 ++++++++++++++++- src/search.cpp | 5 ++-- src/thread.cpp | 4 ++- 5 files changed, 51 insertions(+), 81 deletions(-) delete mode 100644 src/history.h diff --git a/src/history.h b/src/history.h deleted file mode 100644 index c5f72f22..00000000 --- a/src/history.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - Stockfish, a UCI chess playing engine derived from Glaurung 2.1 - Copyright (C) 2004-2008 Tord Romstad (Glaurung author) - Copyright (C) 2008-2012 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 - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Stockfish is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#if !defined(HISTORY_H_INCLUDED) -#define HISTORY_H_INCLUDED - -#include -#include - -#include "types.h" - -/// The History class stores statistics about how often different moves -/// have been successful or unsuccessful during the current search. These -/// statistics are used for reduction and move ordering decisions. History -/// entries are stored according only to moving piece and destination square, -/// in particular two moves with different origin but same destination and -/// same piece will be considered identical. - -class History { - -public: - void clear(); - Value value(Piece p, Square to) const; - void add(Piece p, Square to, Value bonus); - Value gain(Piece p, Square to) const; - void update_gain(Piece p, Square to, Value g); - - static const Value MaxValue = Value(2000); - -private: - Value history[PIECE_NB][SQUARE_NB]; - Value maxGains[PIECE_NB][SQUARE_NB]; -}; - -inline void History::clear() { - memset(history, 0, 16 * 64 * sizeof(Value)); - memset(maxGains, 0, 16 * 64 * sizeof(Value)); -} - -inline Value History::value(Piece p, Square to) const { - return history[p][to]; -} - -inline void History::add(Piece p, Square to, Value bonus) { - if (abs(history[p][to] + bonus) < MaxValue) history[p][to] += bonus; -} - -inline Value History::gain(Piece p, Square to) const { - return maxGains[p][to]; -} - -inline void History::update_gain(Piece p, Square to, Value g) { - maxGains[p][to] = std::max(g, maxGains[p][to] - 1); -} - -#endif // !defined(HISTORY_H_INCLUDED) diff --git a/src/movepick.cpp b/src/movepick.cpp index 794fbde9..e2bb9741 100644 --- a/src/movepick.cpp +++ b/src/movepick.cpp @@ -52,6 +52,23 @@ namespace { } +/// History class method definitions + +void History::clear() { + memset(history, 0, sizeof(history)); + memset(gains, 0, sizeof(gains)); +} + +void History::update(Piece p, Square to, Value bonus) { + if (abs(history[p][to] + bonus) < History::Max) + history[p][to] += bonus; +} + +void History::update_gain(Piece p, Square to, Value gain) { + gains[p][to] = std::max(gain, gains[p][to] - 1); +} + + /// Constructors of the MovePicker class. As arguments we pass information /// to help it to return the presumably good moves first, to decide which /// moves to return (in the quiescence search, for instance, we only want to @@ -180,7 +197,7 @@ void MovePicker::score_noncaptures() { for (MoveStack* it = moves; it != end; ++it) { m = it->move; - it->score = H.value(pos.piece_moved(m), to_sq(m)); + it->score = H[pos.piece_moved(m)][to_sq(m)]; } } @@ -198,12 +215,12 @@ void MovePicker::score_evasions() { { m = it->move; if ((seeScore = pos.see_sign(m)) < 0) - it->score = seeScore - History::MaxValue; // Be sure we are at the bottom + it->score = seeScore - History::Max; // Be sure we are at the bottom else if (pos.is_capture(m)) it->score = PieceValue[MG][pos.piece_on(to_sq(m))] - - type_of(pos.piece_moved(m)) + History::MaxValue; + - type_of(pos.piece_moved(m)) + History::Max; else - it->score = H.value(pos.piece_moved(m), to_sq(m)); + it->score = H[pos.piece_moved(m)][to_sq(m)]; } } diff --git a/src/movepick.h b/src/movepick.h index 9459b8c2..7d6651bb 100644 --- a/src/movepick.h +++ b/src/movepick.h @@ -20,12 +20,36 @@ #if !defined MOVEPICK_H_INCLUDED #define MOVEPICK_H_INCLUDED -#include "history.h" #include "position.h" #include "search.h" #include "types.h" +/// The History class stores statistics about how often different moves +/// have been successful or unsuccessful during the current search. These +/// statistics are used for reduction and move ordering decisions. History +/// entries are stored according only to moving piece and destination square, +/// in particular two moves with different origin but same destination and +/// same piece will be considered identical. + +class History { +public: + + static const Value Max = Value(2000); + + const Value* operator[](Piece p) const { return &history[p][0]; } + Value gain(Piece p, Square to) const { return gains[p][to]; } + + void clear(); + void update(Piece p, Square to, Value bonus); + void update_gain(Piece p, Square to, Value gain); + +private: + Value history[PIECE_NB][SQUARE_NB]; + Value gains[PIECE_NB][SQUARE_NB]; +}; + + /// MovePicker class is used to pick one pseudo legal move at a time from the /// current position. The most important method is next_move(), which returns a /// new pseudo legal move each time it is called, until there are no moves left, diff --git a/src/search.cpp b/src/search.cpp index e8809f14..aa5ef13c 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -26,7 +26,6 @@ #include "book.h" #include "evaluate.h" -#include "history.h" #include "movegen.h" #include "movepick.h" #include "notation.h" @@ -1071,13 +1070,13 @@ split_point_start: // At split points actual search starts from here // Increase history value of the cut-off move Value bonus = Value(int(depth) * int(depth)); - H.add(pos.piece_moved(bestMove), to_sq(bestMove), bonus); + H.update(pos.piece_moved(bestMove), to_sq(bestMove), bonus); // Decrease history of all the other played non-capture moves for (int i = 0; i < playedMoveCount - 1; i++) { Move m = movesSearched[i]; - H.add(pos.piece_moved(m), to_sq(m), -bonus); + H.update(pos.piece_moved(m), to_sq(m), -bonus); } } } diff --git a/src/thread.cpp b/src/thread.cpp index 14c778f8..316ed76b 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -17,6 +17,7 @@ along with this program. If not, see . */ +#include // For std::count #include #include @@ -370,7 +371,8 @@ void ThreadPool::start_thinking(const Position& pos, const LimitsType& limits, RootMoves.clear(); for (MoveList ml(pos); !ml.end(); ++ml) - if (searchMoves.empty() || count(searchMoves.begin(), searchMoves.end(), ml.move())) + if ( searchMoves.empty() + || std::count(searchMoves.begin(), searchMoves.end(), ml.move())) RootMoves.push_back(RootMove(ml.move())); main_thread()->thinking = true; -- 2.39.2