nodesLastExplosive = nodes;
nodesLastNormal = nodes;
- state = EXPLOSION_NONE;
- trend = SCORE_ZERO;
+ state = EXPLOSION_NONE;
+ trend = SCORE_ZERO;
+ optimism[ us] = Value(25);
+ optimism[~us] = -optimism[us];
int searchAgainCounter = 0;
alpha = std::max(prev - delta,-VALUE_INFINITE);
beta = std::min(prev + delta, VALUE_INFINITE);
- // Adjust trend based on root move's previousScore (dynamic contempt)
- int tr = 113 * prev / (abs(prev) + 147);
-
+ // Adjust trend and optimism based on root move's previousScore
+ int tr = sigmoid(prev, 0, 0, 147, 113, 1);
trend = (us == WHITE ? make_score(tr, tr / 2)
: -make_score(tr, tr / 2));
+
+ int opt = sigmoid(prev, 0, 25, 147, 14464, 256);
+ optimism[ us] = Value(opt);
+ optimism[~us] = -optimism[us];
}
// Start with a small aspiration window and, in the case of a fail
// Use static evaluation difference to improve quiet move ordering
if (is_ok((ss-1)->currentMove) && !(ss-1)->inCheck && !priorCapture)
{
- int bonus = std::clamp(-depth * 4 * int((ss-1)->staticEval + ss->staticEval), -1000, 1000);
+ int bonus = std::clamp(-16 * int((ss-1)->staticEval + ss->staticEval), -2000, 2000);
thisThread->mainHistory[~us][from_to((ss-1)->currentMove)] << bonus;
}
// Step 7. Futility pruning: child node (~50 Elo).
// The depth condition is important for mate finding.
- if ( !PvNode
+ if ( !ss->ttPv
&& depth < 9
&& eval - futility_margin(depth, improving) >= beta
&& eval < 15000) // 50% larger than VALUE_KNOWN_WIN, but smaller than TB wins.
}
else
{
+ int history = (*contHist[0])[movedPiece][to_sq(move)]
+ + (*contHist[1])[movedPiece][to_sq(move)]
+ + (*contHist[3])[movedPiece][to_sq(move)];
+
// Continuation history based pruning (~20 Elo)
- if (lmrDepth < 5
- && (*contHist[0])[movedPiece][to_sq(move)]
- + (*contHist[1])[movedPiece][to_sq(move)]
- + (*contHist[3])[movedPiece][to_sq(move)] < -3000 * depth + 3000)
+ if ( lmrDepth < 5
+ && history < -3000 * depth + 3000)
continue;
+ history += thisThread->mainHistory[us][from_to(move)];
+
// Futility pruning: parent node (~5 Elo)
if ( !ss->inCheck
&& lmrDepth < 8
- && ss->staticEval + 172 + 145 * lmrDepth <= alpha)
+ && ss->staticEval + 142 + 139 * lmrDepth + history / 64 <= alpha)
continue;
// Prune moves with negative SEE (~20 Elo)