alpha = std::max(rootMoves[PVIdx].previousScore - delta,-VALUE_INFINITE);
beta = std::min(rootMoves[PVIdx].previousScore + delta, VALUE_INFINITE);
- // Adjust contempt based on current bestValue
- ct = Options["Contempt"] * PawnValueEg / 100 // From centipawns
- + (bestValue > 500 ? 50: // Dynamic contempt
- bestValue < -500 ? -50:
- bestValue / 10);
+ ct = Options["Contempt"] * PawnValueEg / 100; // From centipawns
+
+ // Adjust contempt based on current bestValue (dynamic contempt)
+ int sign = (bestValue > 0) - (bestValue < 0);
+ ct += bestValue > 500 ? 70 :
+ bestValue < -500 ? -70 :
+ bestValue / 10 + sign * int(std::round(3.22 * log(1 + abs(bestValue))));
Eval::Contempt = (us == WHITE ? make_score(ct, ct / 2)
: -make_score(ct, ct / 2));
Value rbeta = std::min(beta + 200, VALUE_INFINITE);
MovePicker mp(pos, ttMove, rbeta - ss->staticEval, &thisThread->captureHistory);
-
- while ((move = mp.next_move()) != MOVE_NONE)
+ int probCutCount = 0;
+ while ( (move = mp.next_move()) != MOVE_NONE
+ && probCutCount < depth / ONE_PLY - 3)
if (pos.legal(move))
{
+ probCutCount++;
+
ss->currentMove = move;
ss->contHistory = thisThread->contHistory[pos.moved_piece(move)][to_sq(move)].get();