STC:
LLR: 3.44 (-2.94,2.94) [-3.00,1.00]
Total: 120831 W: 21572 L: 21594 D: 77665
LTC:
LLR: 2.96 (-2.94,2.94) [-3.00,1.00]
Total: 26565 W: 3519 L: 3406 D: 19640
bench
5920493
template<>
void MovePicker::score<QUIETS>() {
template<>
void MovePicker::score<QUIETS>() {
- const HistoryStats& history = pos.this_thread()->history;
const FromToStats& fromTo = pos.this_thread()->fromTo;
const CounterMoveStats* cmh = (ss-1)->counterMoves;
const FromToStats& fromTo = pos.this_thread()->fromTo;
const CounterMoveStats* cmh = (ss-1)->counterMoves;
Color c = pos.side_to_move();
for (auto& m : *this)
Color c = pos.side_to_move();
for (auto& m : *this)
- m.value = history[pos.moved_piece(m)][to_sq(m)]
- + (cmh ? (*cmh)[pos.moved_piece(m)][to_sq(m)] : VALUE_ZERO)
+ m.value = (cmh ? (*cmh)[pos.moved_piece(m)][to_sq(m)] : VALUE_ZERO)
+ (fmh ? (*fmh)[pos.moved_piece(m)][to_sq(m)] : VALUE_ZERO)
+ (fmh2 ? (*fmh2)[pos.moved_piece(m)][to_sq(m)] : VALUE_ZERO)
+ fromTo.get(c, m);
+ (fmh ? (*fmh)[pos.moved_piece(m)][to_sq(m)] : VALUE_ZERO)
+ (fmh2 ? (*fmh2)[pos.moved_piece(m)][to_sq(m)] : VALUE_ZERO)
+ fromTo.get(c, m);
template<>
void MovePicker::score<EVASIONS>() {
template<>
void MovePicker::score<EVASIONS>() {
- // Try captures ordered by MVV/LVA, then non-captures ordered by history value
- const HistoryStats& history = pos.this_thread()->history;
+ // Try captures ordered by MVV/LVA, then non-captures ordered by stats heuristics
const FromToStats& fromTo = pos.this_thread()->fromTo;
Color c = pos.side_to_move();
for (auto& m : *this)
if (pos.capture(m))
m.value = PieceValue[MG][pos.piece_on(to_sq(m))]
const FromToStats& fromTo = pos.this_thread()->fromTo;
Color c = pos.side_to_move();
for (auto& m : *this)
if (pos.capture(m))
m.value = PieceValue[MG][pos.piece_on(to_sq(m))]
- - Value(type_of(pos.moved_piece(m))) + HistoryStats::Max;
+ - Value(type_of(pos.moved_piece(m))) + FromToStats::Max;
- m.value = history[pos.moved_piece(m)][to_sq(m)] + fromTo.get(c, m);
+ m.value = fromTo.get(c, m);
/// different origin but same destination and piece will be considered identical.
template<typename T, bool CM = false>
struct Stats {
/// different origin but same destination and piece will be considered identical.
template<typename T, bool CM = false>
struct Stats {
-
- static const Value Max = Value(1 << 28);
-
const T* operator[](Piece pc) const { return table[pc]; }
T* operator[](Piece pc) { return table[pc]; }
void clear() { std::memset(table, 0, sizeof(table)); }
const T* operator[](Piece pc) const { return table[pc]; }
T* operator[](Piece pc) { return table[pc]; }
void clear() { std::memset(table, 0, sizeof(table)); }
};
typedef Stats<Move> MoveStats;
};
typedef Stats<Move> MoveStats;
-typedef Stats<Value, false> HistoryStats;
-typedef Stats<Value, true> CounterMoveStats;
+typedef Stats<Value, true> CounterMoveStats;
typedef Stats<CounterMoveStats> CounterMoveHistoryStats;
struct FromToStats {
typedef Stats<CounterMoveStats> CounterMoveHistoryStats;
struct FromToStats {
+ static const Value Max = Value(1 << 28);
+
Value get(Color c, Move m) const { return table[c][from_sq(m)][to_sq(m)]; }
void clear() { std::memset(table, 0, sizeof(table)); }
void update(Color c, Move m, Value v) {
Value get(Color c, Move m) const { return table[c][from_sq(m)][to_sq(m)]; }
void clear() { std::memset(table, 0, sizeof(table)); }
void update(Color c, Move m, Value v) {
for (Thread* th : Threads)
{
for (Thread* th : Threads)
{
th->counterMoves.clear();
th->fromTo.clear();
th->counterMoveHistory.clear();
th->counterMoves.clear();
th->fromTo.clear();
th->counterMoveHistory.clear();
&& (ttValue >= beta ? (tte->bound() & BOUND_LOWER)
: (tte->bound() & BOUND_UPPER)))
{
&& (ttValue >= beta ? (tte->bound() & BOUND_LOWER)
: (tte->bound() & BOUND_UPPER)))
{
- // If ttMove is quiet, update killers, history, counter move on TT hit
+ // If ttMove is quiet, update move sorting heuristics on TT hit
if (ttValue >= beta && ttMove)
{
if (!pos.capture_or_promotion(ttMove))
if (ttValue >= beta && ttMove)
{
if (!pos.capture_or_promotion(ttMove))
&& !pos.see_ge(make_move(to_sq(move), from_sq(move)), VALUE_ZERO))
r -= 2 * ONE_PLY;
&& !pos.see_ge(make_move(to_sq(move), from_sq(move)), VALUE_ZERO))
r -= 2 * ONE_PLY;
- ss->history = thisThread->history[moved_piece][to_sq(move)]
- + (cmh ? (*cmh )[moved_piece][to_sq(move)] : VALUE_ZERO)
- + (fmh ? (*fmh )[moved_piece][to_sq(move)] : VALUE_ZERO)
- + (fmh2 ? (*fmh2)[moved_piece][to_sq(move)] : VALUE_ZERO)
- + thisThread->fromTo.get(~pos.side_to_move(), move)
- - 8000; // Correction factor
+ ss->history = (cmh ? (*cmh )[moved_piece][to_sq(move)] : VALUE_ZERO)
+ + (fmh ? (*fmh )[moved_piece][to_sq(move)] : VALUE_ZERO)
+ + (fmh2 ? (*fmh2)[moved_piece][to_sq(move)] : VALUE_ZERO)
+ + thisThread->fromTo.get(~pos.side_to_move(), move)
+ - 8000; // Correction factor
// Decrease/increase reduction by comparing opponent's stat score
if (ss->history > VALUE_ZERO && (ss-1)->history < VALUE_ZERO)
// Decrease/increase reduction by comparing opponent's stat score
if (ss->history > VALUE_ZERO && (ss-1)->history < VALUE_ZERO)
- // Quiet best move: update killers, history and countermoves
+ // Quiet best move: update move sorting heuristics
if (!pos.capture_or_promotion(bestMove))
update_stats(pos, ss, bestMove, quietsSearched, quietCount, bonus(depth));
if (!pos.capture_or_promotion(bestMove))
update_stats(pos, ss, bestMove, quietsSearched, quietCount, bonus(depth));
- // update_stats() updates killers, history, countermove and countermove plus
- // follow-up move history when a new quiet best move is found.
+ // update_stats() updates move sorting heuristics when a new quiet best move is found
void update_stats(const Position& pos, Stack* ss, Move move,
Move* quiets, int quietsCnt, Value bonus) {
void update_stats(const Position& pos, Stack* ss, Move move,
Move* quiets, int quietsCnt, Value bonus) {
Color c = pos.side_to_move();
Thread* thisThread = pos.this_thread();
thisThread->fromTo.update(c, move, bonus);
Color c = pos.side_to_move();
Thread* thisThread = pos.this_thread();
thisThread->fromTo.update(c, move, bonus);
- thisThread->history.update(pos.moved_piece(move), to_sq(move), bonus);
update_cm_stats(ss, pos.moved_piece(move), to_sq(move), bonus);
if ((ss-1)->counterMoves)
update_cm_stats(ss, pos.moved_piece(move), to_sq(move), bonus);
if ((ss-1)->counterMoves)
for (int i = 0; i < quietsCnt; ++i)
{
thisThread->fromTo.update(c, quiets[i], -bonus);
for (int i = 0; i < quietsCnt; ++i)
{
thisThread->fromTo.update(c, quiets[i], -bonus);
- thisThread->history.update(pos.moved_piece(quiets[i]), to_sq(quiets[i]), -bonus);
update_cm_stats(ss, pos.moved_piece(quiets[i]), to_sq(quiets[i]), -bonus);
}
}
update_cm_stats(ss, pos.moved_piece(quiets[i]), to_sq(quiets[i]), -bonus);
}
}
Depth rootDepth;
Depth completedDepth;
std::atomic_bool resetCalls;
Depth rootDepth;
Depth completedDepth;
std::atomic_bool resetCalls;
MoveStats counterMoves;
FromToStats fromTo;
CounterMoveHistoryStats counterMoveHistory;
MoveStats counterMoves;
FromToStats fromTo;
CounterMoveHistoryStats counterMoveHistory;