Stockfish, a UCI chess playing engine derived from Glaurung 2.1
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
- Copyright (C) 2015-2016 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
+ Copyright (C) 2015-2017 Marco Costalba, Joona Kiiski, Gary Linscott, 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
for (Thread* th : Threads)
{
- th->history.clear();
th->counterMoves.clear();
- th->fromTo.clear();
+ th->history.clear();
th->counterMoveHistory.clear();
th->resetCalls = true;
}
Depth depthDiff = th->completedDepth - bestThread->completedDepth;
Value scoreDiff = th->rootMoves[0].score - bestThread->rootMoves[0].score;
- if ( (depthDiff > 0 && scoreDiff >= 0)
- || (scoreDiff > 0 && depthDiff >= 0))
+ if (scoreDiff > 0 && depthDiff >= 0)
bestThread = th;
}
}
&& (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))
&& !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->history.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)
else if (bestMove)
{
- // 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));
}
- // 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) {
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);
+ thisThread->history.update(c, move, bonus);
update_cm_stats(ss, pos.moved_piece(move), to_sq(move), bonus);
if ((ss-1)->counterMoves)
// Decrease all the other played quiet moves
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);
+ thisThread->history.update(c, quiets[i], -bonus);
update_cm_stats(ss, pos.moved_piece(quiets[i]), to_sq(quiets[i]), -bonus);
}
}