if (Options["Contempt Factor"] && !Options["UCI_AnalyseMode"])
{
int cf = Options["Contempt Factor"] * PawnValueMg / 100; // From centipawns
if (Options["Contempt Factor"] && !Options["UCI_AnalyseMode"])
{
int cf = Options["Contempt Factor"] * PawnValueMg / 100; // From centipawns
bestValue = Threads.split<FakeSplit>(pos, ss, alpha, beta, bestValue, &bestMove,
depth, threatMove, moveCount, mp, NT);
if (bestValue >= beta)
bestValue = Threads.split<FakeSplit>(pos, ss, alpha, beta, bestValue, &bestMove,
depth, threatMove, moveCount, mp, NT);
if (bestValue >= beta)
Key posKey;
Move ttMove, move, bestMove;
Value bestValue, value, ttValue, futilityValue, futilityBase, oldAlpha;
Key posKey;
Move ttMove, move, bestMove;
Value bestValue, value, ttValue, futilityValue, futilityBase, oldAlpha;
- bool givesCheck, enoughMaterial, evasionPrunable;
+ bool givesCheck, enoughMaterial, evasionPrunable, fromNull;
// Check for an instant draw or maximum ply reached
if (pos.is_draw<false, false>() || ss->ply > MAX_PLY)
// Check for an instant draw or maximum ply reached
if (pos.is_draw<false, false>() || ss->ply > MAX_PLY)
- ss->staticEval = bestValue = evaluate(pos, ss->evalMargin);
+ if (fromNull)
+ {
+ // Approximated score. Real one is slightly higher due to tempo
+ ss->staticEval = bestValue = -(ss-1)->staticEval;
+ ss->evalMargin = VALUE_ZERO;
+ }
+ else
+ ss->staticEval = bestValue = evaluate(pos, ss->evalMargin);
pos.do_move(pv[ply++], *st++);
tte = TT.probe(pos.key());
pos.do_move(pv[ply++], *st++);
tte = TT.probe(pos.key());
if (!tte || tte->move() != pv[ply]) // Don't overwrite correct entries
TT.store(pos.key(), VALUE_NONE, BOUND_NONE, DEPTH_NONE, pv[ply]);
if (!tte || tte->move() != pv[ply]) // Don't overwrite correct entries
TT.store(pos.key(), VALUE_NONE, BOUND_NONE, DEPTH_NONE, pv[ply]);
pos.do_move(pv[ply++], *st++);
} while (pv[ply] != MOVE_NONE);
pos.do_move(pv[ply++], *st++);
} while (pv[ply] != MOVE_NONE);