} // namespace
-/// quick_evaluate() does a very approximate evaluation of the current position.
-/// It currently considers only material and piece square table scores. Perhaps
-/// we should add scores from the pawn and material hash tables?
-
-Value quick_evaluate(const Position &pos) {
-
- assert(pos.is_ok());
-
- static const ScaleFactor sf[2] = {SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL};
-
- Value v = scale_by_game_phase(pos.value(), MaterialInfoTable::game_phase(pos), sf);
- return (pos.side_to_move() == WHITE ? v : -v);
-}
-
-
/// init_eval() initializes various tables used by the evaluation function
void init_eval(int threads) {
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
- ss[ply].eval = staticValue;
- 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
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());