// The latter is needed for statScore and killer initialization.
Stack stack[MAX_PLY+10], *ss = stack+7;
Move pv[MAX_PLY+1];
- Value bestValue, alpha, beta, delta;
+ Value alpha, beta, delta;
Move lastBestMove = MOVE_NONE;
Depth lastBestMoveDepth = 0;
MainThread* mainThread = (this == Threads.main() ? Threads.main() : nullptr);
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
{
Depth r = reduction(improving, depth, moveCount, rangeReduction > 2);
- // Decrease reduction if on the PV (~2 Elo)
+ // Decrease reduction at some PvNodes (~2 Elo)
if ( PvNode
- && bestMoveCount <= 3)
+ && bestMoveCount <= 3
+ && beta - alpha >= thisThread->rootDelta / 4)
r--;
- // Increases reduction for PvNodes that have small window
- if (PvNode && beta - alpha < thisThread->rootDelta / 4)
- r++;
-
// Decrease reduction if position is or has been on the PV
// and node is not likely to fail low. (~3 Elo)
if ( ss->ttPv
thisThread->mainHistory[us][from_to(move)] << bonus;
update_continuation_histories(ss, pos.moved_piece(move), to_sq(move), bonus);
- // Penalty for reversed move in case of moved piece not being a pawn
- if (type_of(pos.moved_piece(move)) != PAWN)
- thisThread->mainHistory[us][from_to(reverse_move(move))] << -bonus;
-
// Update countermove history
if (is_ok((ss-1)->currentMove))
{