mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-19 16:46:30 +08:00
Unify History and Gains under a single Stats class
Handling of History and Gains is almost the same, with the exception of the update logic, so unify both classes under a single Stats struct. No functional change.
This commit is contained in:
@@ -20,35 +20,46 @@
|
||||
#if !defined MOVEPICK_H_INCLUDED
|
||||
#define MOVEPICK_H_INCLUDED
|
||||
|
||||
#include <algorithm> // For std::max
|
||||
#include <cstring> // For memset
|
||||
|
||||
#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:
|
||||
/// The Stats struct stores moves statistics. According to the template parameter
|
||||
/// the class can store both History and Gains type statistics. History records
|
||||
/// how often different moves have been successful or unsuccessful during the
|
||||
/// current search and is used for reduction and move ordering decisions. Gains
|
||||
/// records the move's best evaluation gain from one ply to the next and is used
|
||||
/// for pruning decisions. 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.
|
||||
template<bool Gain>
|
||||
struct Stats {
|
||||
|
||||
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]; }
|
||||
const Value* operator[](Piece p) const { return &table[p][0]; }
|
||||
void clear() { memset(table, 0, sizeof(table)); }
|
||||
|
||||
void clear();
|
||||
void update(Piece p, Square to, Value bonus);
|
||||
void update_gain(Piece p, Square to, Value gain);
|
||||
void update(Piece p, Square to, Value v) {
|
||||
|
||||
if (Gain)
|
||||
table[p][to] = std::max(v, table[p][to] - 1);
|
||||
|
||||
else if (abs(table[p][to] + v) < Max)
|
||||
table[p][to] += v;
|
||||
}
|
||||
|
||||
private:
|
||||
Value history[PIECE_NB][SQUARE_NB];
|
||||
Value gains[PIECE_NB][SQUARE_NB];
|
||||
Value table[PIECE_NB][SQUARE_NB];
|
||||
};
|
||||
|
||||
typedef Stats<false> History;
|
||||
typedef Stats<true> Gains;
|
||||
|
||||
|
||||
/// 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
|
||||
@@ -74,7 +85,7 @@ private:
|
||||
void generate_next();
|
||||
|
||||
const Position& pos;
|
||||
const History& H;
|
||||
const History& Hist;
|
||||
Search::Stack* ss;
|
||||
Depth depth;
|
||||
Move ttMove;
|
||||
|
||||
Reference in New Issue
Block a user