mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-19 16:46:30 +08:00
History code rewrite (#1122)
Rearrange and rename all history heuristic code. Naming is now based on chessprogramming.wikispaces.com conventions and the relations among the various heuristics are now more clear and consistent. No functional change.
This commit is contained in:
@@ -193,14 +193,15 @@ void Search::clear() {
|
||||
|
||||
for (Thread* th : Threads)
|
||||
{
|
||||
th->counterMoves.clear();
|
||||
th->history.clear();
|
||||
th->counterMoveHistory.clear();
|
||||
th->resetCalls = true;
|
||||
th->counterMoves.fill(MOVE_NONE);
|
||||
th->history.fill(0);
|
||||
|
||||
CounterMoveStats& cm = th->counterMoveHistory[NO_PIECE][0];
|
||||
auto* t = &cm[NO_PIECE][0];
|
||||
std::fill(t, t + sizeof(cm)/sizeof(*t), CounterMovePruneThreshold - 1);
|
||||
for (auto& to : th->counterMoveHistory)
|
||||
for (auto& h : to)
|
||||
h.fill(0);
|
||||
|
||||
th->counterMoveHistory[NO_PIECE][0].fill(CounterMovePruneThreshold - 1);
|
||||
}
|
||||
|
||||
Threads.main()->previousScore = VALUE_INFINITE;
|
||||
@@ -334,7 +335,7 @@ void Thread::search() {
|
||||
|
||||
std::memset(ss-4, 0, 7 * sizeof(Stack));
|
||||
for(int i = 4; i > 0; i--)
|
||||
(ss-i)->counterMoves = &this->counterMoveHistory[NO_PIECE][0]; // Use as sentinel
|
||||
(ss-i)->history = &this->counterMoveHistory[NO_PIECE][0]; // Use as sentinel
|
||||
|
||||
bestValue = delta = alpha = -VALUE_INFINITE;
|
||||
beta = VALUE_INFINITE;
|
||||
@@ -558,7 +559,7 @@ namespace {
|
||||
Thread* thisThread = pos.this_thread();
|
||||
inCheck = pos.checkers();
|
||||
moveCount = quietCount = ss->moveCount = 0;
|
||||
ss->history = 0;
|
||||
ss->statScore = 0;
|
||||
bestValue = -VALUE_INFINITE;
|
||||
ss->ply = (ss-1)->ply + 1;
|
||||
|
||||
@@ -607,7 +608,7 @@ namespace {
|
||||
assert(0 <= ss->ply && ss->ply < MAX_PLY);
|
||||
|
||||
ss->currentMove = (ss+1)->excludedMove = bestMove = MOVE_NONE;
|
||||
ss->counterMoves = &thisThread->counterMoveHistory[NO_PIECE][0];
|
||||
ss->history = &thisThread->counterMoveHistory[NO_PIECE][0];
|
||||
(ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE;
|
||||
Square prevSq = to_sq((ss-1)->currentMove);
|
||||
|
||||
@@ -750,7 +751,7 @@ namespace {
|
||||
Depth R = ((823 + 67 * depth / ONE_PLY) / 256 + std::min((eval - beta) / PawnValueMg, 3)) * ONE_PLY;
|
||||
|
||||
ss->currentMove = MOVE_NULL;
|
||||
ss->counterMoves = &thisThread->counterMoveHistory[NO_PIECE][0];
|
||||
ss->history = &thisThread->counterMoveHistory[NO_PIECE][0];
|
||||
|
||||
pos.do_null_move(st);
|
||||
Value nullValue = depth-R < ONE_PLY ? -qsearch<NonPV, false>(pos, ss+1, -beta, -beta+1)
|
||||
@@ -794,7 +795,7 @@ namespace {
|
||||
if (pos.legal(move))
|
||||
{
|
||||
ss->currentMove = move;
|
||||
ss->counterMoves = &thisThread->counterMoveHistory[pos.moved_piece(move)][to_sq(move)];
|
||||
ss->history = &thisThread->counterMoveHistory[pos.moved_piece(move)][to_sq(move)];
|
||||
|
||||
pos.do_move(move, st);
|
||||
value = -search<NonPV>(pos, ss+1, -rbeta, -rbeta+1, rdepth, !cutNode, false);
|
||||
@@ -818,9 +819,9 @@ namespace {
|
||||
|
||||
moves_loop: // When in check search starts from here
|
||||
|
||||
const CounterMoveStats& cmh = *(ss-1)->counterMoves;
|
||||
const CounterMoveStats& fmh = *(ss-2)->counterMoves;
|
||||
const CounterMoveStats& fm2 = *(ss-4)->counterMoves;
|
||||
const PieceToHistory& cmh = *(ss-1)->history;
|
||||
const PieceToHistory& fmh = *(ss-2)->history;
|
||||
const PieceToHistory& fm2 = *(ss-4)->history;
|
||||
|
||||
MovePicker mp(pos, ttMove, depth, ss);
|
||||
value = bestValue; // Workaround a bogus 'uninitialized' warning under gcc
|
||||
@@ -956,7 +957,7 @@ moves_loop: // When in check search starts from here
|
||||
|
||||
// Update the current move (this must be done after singular extension search)
|
||||
ss->currentMove = move;
|
||||
ss->counterMoves = &thisThread->counterMoveHistory[moved_piece][to_sq(move)];
|
||||
ss->history = &thisThread->counterMoveHistory[moved_piece][to_sq(move)];
|
||||
|
||||
// Step 14. Make the move
|
||||
pos.do_move(move, st, givesCheck);
|
||||
@@ -984,21 +985,21 @@ moves_loop: // When in check search starts from here
|
||||
&& !pos.see_ge(make_move(to_sq(move), from_sq(move))))
|
||||
r -= 2 * ONE_PLY;
|
||||
|
||||
ss->history = cmh[moved_piece][to_sq(move)]
|
||||
+ fmh[moved_piece][to_sq(move)]
|
||||
+ fm2[moved_piece][to_sq(move)]
|
||||
+ thisThread->history.get(~pos.side_to_move(), move)
|
||||
- 4000; // Correction factor
|
||||
ss->statScore = cmh[moved_piece][to_sq(move)]
|
||||
+ fmh[moved_piece][to_sq(move)]
|
||||
+ fm2[moved_piece][to_sq(move)]
|
||||
+ thisThread->history[~pos.side_to_move()][from_to(move)]
|
||||
- 4000; // Correction factor
|
||||
|
||||
// Decrease/increase reduction by comparing opponent's stat score
|
||||
if (ss->history > 0 && (ss-1)->history < 0)
|
||||
if (ss->statScore > 0 && (ss-1)->statScore < 0)
|
||||
r -= ONE_PLY;
|
||||
|
||||
else if (ss->history < 0 && (ss-1)->history > 0)
|
||||
else if (ss->statScore < 0 && (ss-1)->statScore > 0)
|
||||
r += ONE_PLY;
|
||||
|
||||
// Decrease/increase reduction for moves with a good/bad history
|
||||
r = std::max(DEPTH_ZERO, (r / ONE_PLY - ss->history / 20000) * ONE_PLY);
|
||||
r = std::max(DEPTH_ZERO, (r / ONE_PLY - ss->statScore / 20000) * ONE_PLY);
|
||||
}
|
||||
|
||||
Depth d = std::max(newDepth - r, ONE_PLY);
|
||||
@@ -1399,7 +1400,7 @@ moves_loop: // When in check search starts from here
|
||||
|
||||
for (int i : {1, 2, 4})
|
||||
if (is_ok((ss-i)->currentMove))
|
||||
(ss-i)->counterMoves->update(pc, s, bonus);
|
||||
(ss-i)->history->update(pc, s, bonus);
|
||||
}
|
||||
|
||||
|
||||
@@ -1422,7 +1423,7 @@ moves_loop: // When in check search starts from here
|
||||
if (is_ok((ss-1)->currentMove))
|
||||
{
|
||||
Square prevSq = to_sq((ss-1)->currentMove);
|
||||
thisThread->counterMoves.update(pos.piece_on(prevSq), prevSq, move);
|
||||
thisThread->counterMoves[pos.piece_on(prevSq)][prevSq]=move;
|
||||
}
|
||||
|
||||
// Decrease all the other played quiet moves
|
||||
|
||||
Reference in New Issue
Block a user