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:
Marco Costalba
2017-05-26 08:42:50 +02:00
committed by GitHub
parent 24df0f72c0
commit ecd3218b6b
6 changed files with 80 additions and 73 deletions

View File

@@ -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