pv[ply] = pv[ply + 1] = MOVE_NONE;
currentMove = threatMove = MOVE_NONE;
reduction = Depth(0);
+ eval = VALUE_NONE;
}
void SearchStack::initKillers() {
assert(threadID >= 0 && threadID < ActiveThreads);
Move movesSearched[256];
- EvalInfo ei;
StateInfo st;
const TTEntry* tte;
Move ttMove, move;
if (AbortSearch || thread_should_stop(threadID))
return Value(0);
- if (pos.is_draw())
+ if (pos.is_draw() || ply >= PLY_MAX - 1)
return VALUE_DRAW;
- if (ply >= PLY_MAX - 1)
- return pos.is_check() ? quick_evaluate(pos) : evaluate(pos, ei, threadID);
-
// Mate distance pruning
oldAlpha = alpha;
alpha = Max(value_mated_in(ply), alpha);
if (AbortSearch || thread_should_stop(threadID))
return Value(0);
- if (pos.is_draw())
+ if (pos.is_draw() || ply >= PLY_MAX - 1)
return VALUE_DRAW;
- if (ply >= PLY_MAX - 1)
- return pos.is_check() ? quick_evaluate(pos) : evaluate(pos, ei, threadID);
-
// Mate distance pruning
if (value_mated_in(ply) >= beta)
return beta;
}
isCheck = pos.is_check();
- ei.futilityMargin = Value(0); // Manually initialize futilityMargin
-
- // Evaluate the position statically
- if (isCheck)
- staticValue = quick_evaluate(pos);
- else if (tte && (tte->type() & VALUE_TYPE_EVAL))
- staticValue = value_from_tt(tte->value(), ply);
- else
- staticValue = evaluate(pos, ei, threadID);
// Calculate depth dependant futility pruning parameters
const int FutilityMoveCountMargin = 3 + (1 << (3 * int(depth) / 8));
const int FutilityValueMargin = 112 * bitScanReverse32(int(depth) * int(depth) / 2);
- // Enhance score accuracy with TT value if possible
- futilityValue = staticValue + FutilityValueMargin;
- staticValue = refine_eval(tte, staticValue, ply);
+ // Evaluate the position statically
+ if (isCheck)
+ ss[ply].eval = VALUE_NONE;
+ else
+ {
+ if (tte && (tte->type() & VALUE_TYPE_EVAL))
+ staticValue = value_from_tt(tte->value(), ply);
+ else
+ staticValue = evaluate(pos, ei, threadID);
+
+ ss[ply].eval = staticValue;
+ futilityValue = staticValue + FutilityValueMargin;
+ staticValue = refine_eval(tte, staticValue, ply); // Enhance accuracy with TT value if possible
+ }
// Null move search
if ( allowNullmove
}
// Null move search not allowed, try razoring
else if ( !value_is_mate(beta)
+ && !isCheck
&& depth < RazorDepth
- && staticValue < beta - (depth > OnePly ? NullMoveMargin + 16 * depth : 2*NullMoveMargin)
+ && staticValue < beta - (NullMoveMargin + 16 * depth)
&& ss[ply - 1].currentMove != MOVE_NULL
&& ttMove == MOVE_NONE
&& !pos.has_pawn_on_7th(pos.side_to_move()))
if (AbortSearch || thread_should_stop(threadID))
return Value(0);
- if (pos.is_draw())
+ if (pos.is_draw() || ply >= PLY_MAX - 1)
return VALUE_DRAW;
- if (ply >= PLY_MAX - 1)
- return pos.is_check() ? quick_evaluate(pos) : evaluate(pos, ei, threadID);
-
// Transposition table lookup. At PV nodes, we don't use the TT for
// pruning, but only for move ordering.
tte = TT.retrieve(pos.get_key());
}
isCheck = pos.is_check();
- ei.futilityMargin = Value(0); // Manually initialize futilityMargin
// Evaluate the position statically
if (isCheck)