namespace Stockfish {
-constexpr int PAWN_HISTORY_SIZE = 512; // has to be a power of 2
-constexpr int CORRECTION_HISTORY_SIZE = 16384; // has to be a power of 2
-constexpr int CORRECTION_HISTORY_LIMIT = 1024;
+constexpr int PAWN_HISTORY_SIZE = 512; // has to be a power of 2
+constexpr int PAWN_CORRECTION_HISTORY_SIZE = 16384; // has to be a power of 2
+constexpr int MATERIAL_CORRECTION_HISTORY_SIZE = 32768; // has to be a power of 2
+constexpr int CORRECTION_HISTORY_LIMIT = 1024;
static_assert((PAWN_HISTORY_SIZE & (PAWN_HISTORY_SIZE - 1)) == 0,
"PAWN_HISTORY_SIZE has to be a power of 2");
-static_assert((CORRECTION_HISTORY_SIZE & (CORRECTION_HISTORY_SIZE - 1)) == 0,
+static_assert((PAWN_CORRECTION_HISTORY_SIZE & (PAWN_CORRECTION_HISTORY_SIZE - 1)) == 0,
"CORRECTION_HISTORY_SIZE has to be a power of 2");
enum PawnHistoryType {
template<PawnHistoryType T = Normal>
inline int pawn_structure_index(const Position& pos) {
- return pos.pawn_key() & ((T == Normal ? PAWN_HISTORY_SIZE : CORRECTION_HISTORY_SIZE) - 1);
+ return pos.pawn_key() & ((T == Normal ? PAWN_HISTORY_SIZE : PAWN_CORRECTION_HISTORY_SIZE) - 1);
+}
+
+inline int material_index(const Position& pos) {
+ return pos.material_key() & (MATERIAL_CORRECTION_HISTORY_SIZE - 1);
}
// StatsEntry stores the stat table value. It is usually a number but could
// PawnHistory is addressed by the pawn structure and a move's [piece][to]
using PawnHistory = Stats<int16_t, 8192, PAWN_HISTORY_SIZE, PIECE_NB, SQUARE_NB>;
-// CorrectionHistory is addressed by color and pawn structure
-using CorrectionHistory =
- Stats<int16_t, CORRECTION_HISTORY_LIMIT, COLOR_NB, CORRECTION_HISTORY_SIZE>;
+
+// Correction histories record differences between the static evaluation of
+// positions and their search score. It is used to improve the static evaluation
+// used by some search heuristics.
+
+// PawnCorrectionHistory is addressed by color and pawn structure
+using PawnCorrectionHistory =
+ Stats<int16_t, CORRECTION_HISTORY_LIMIT, COLOR_NB, PAWN_CORRECTION_HISTORY_SIZE>;
+
+// MaterialCorrectionHistory is addressed by color and material configuration
+using MaterialCorrectionHistory =
+ Stats<int16_t, CORRECTION_HISTORY_LIMIT, COLOR_NB, MATERIAL_CORRECTION_HISTORY_SIZE>;
// The 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 emits one
// Add correctionHistory value to raw staticEval and guarantee evaluation
// does not hit the tablebase range.
Value to_corrected_static_eval(Value v, const Worker& w, const Position& pos) {
- auto cv = w.correctionHistory[pos.side_to_move()][pawn_structure_index<Correction>(pos)];
+ const auto pcv =
+ w.pawnCorrectionHistory[pos.side_to_move()][pawn_structure_index<Correction>(pos)];
+ const auto mcv = w.materialCorrectionHistory[pos.side_to_move()][material_index(pos)];
+ const auto cv = (2 * pcv + mcv) / 3;
v += 66 * cv / 512;
return std::clamp(v, VALUE_TB_LOSS_IN_MAX_PLY + 1, VALUE_TB_WIN_IN_MAX_PLY - 1);
}
mainHistory.fill(0);
captureHistory.fill(-700);
pawnHistory.fill(-1188);
- correctionHistory.fill(0);
+ pawnCorrectionHistory.fill(0);
+ materialCorrectionHistory.fill(0);
for (bool inCheck : {false, true})
for (StatsType c : {NoCaptures, Captures})
{
auto bonus = std::clamp(int(bestValue - ss->staticEval) * depth / 8,
-CORRECTION_HISTORY_LIMIT / 4, CORRECTION_HISTORY_LIMIT / 4);
- thisThread->correctionHistory[us][pawn_structure_index<Correction>(pos)] << bonus;
+ thisThread->pawnCorrectionHistory[us][pawn_structure_index<Correction>(pos)] << bonus;
+ thisThread->materialCorrectionHistory[us][material_index(pos)] << bonus;
}
assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE);
void ensure_network_replicated();
// Public because they need to be updatable by the stats
- ButterflyHistory mainHistory;
- CapturePieceToHistory captureHistory;
- ContinuationHistory continuationHistory[2][2];
- PawnHistory pawnHistory;
- CorrectionHistory correctionHistory;
+ ButterflyHistory mainHistory;
+ CapturePieceToHistory captureHistory;
+ ContinuationHistory continuationHistory[2][2];
+ PawnHistory pawnHistory;
+ PawnCorrectionHistory pawnCorrectionHistory;
+ MaterialCorrectionHistory materialCorrectionHistory;
private:
void iterative_deepening();