&& !Skill(Options["Skill Level"]).enabled()
&& rootMoves[0].pv[0] != MOVE_NONE)
{
- std::map<Move, int> votes;
+ std::map<Move, int64_t> votes;
Value minScore = this->rootMoves[0].score;
// Find out minimum score and reset votes for moves which can be voted
}
// Vote according to score and depth
+ auto square = [](int64_t x) { return x * x; };
for (Thread* th : Threads)
- votes[th->rootMoves[0].pv[0]] += int(th->rootMoves[0].score - minScore)
- + int(th->completedDepth);
+ votes[th->rootMoves[0].pv[0]] += 200 + (square(th->rootMoves[0].score - minScore + 1)
+ * int64_t(th->completedDepth));
// Select best thread
- int bestVote = votes[this->rootMoves[0].pv[0]];
+ int64_t bestVote = votes[this->rootMoves[0].pv[0]];
for (Thread* th : Threads)
{
if (votes[th->rootMoves[0].pv[0]] > bestVote)
if (!pos.capture_or_promotion(ttMove))
update_quiet_stats(pos, ss, ttMove, nullptr, 0, stat_bonus(depth));
- // Extra penalty for a quiet TT move in previous ply when it gets refuted
- if ((ss-1)->moveCount == 1 && !pos.captured_piece())
- update_continuation_histories(ss-1, pos.piece_on(prevSq), prevSq, -stat_bonus(depth + ONE_PLY));
+ // Extra penalty for a quiet TT or main killer move in previous ply when it gets refuted
+ if ( (ss-1)->moveCount == 1
+ || ((ss-1)->currentMove == (ss-1)->killers[0] && (ss-1)->killers[0]))
+ if (!pos.captured_piece())
+ update_continuation_histories(ss-1, pos.piece_on(prevSq), prevSq, -stat_bonus(depth + ONE_PLY));
}
// Penalty for a quiet ttMove that fails low
else if (!pos.capture_or_promotion(ttMove))