No change in functionality signature
The only functional change is that when we reach PLY_MAX,
we now return VALUE_DRAW instead of evaluating position.
But we reach PLY_MAX only when position is dead drawn and
transposition table is filled with draw scores, so this
shouldn't matter at all.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
-/// 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) {
/// init_eval() initializes various tables used by the evaluation function
void init_eval(int threads) {
////
extern Value evaluate(const Position& pos, EvalInfo& ei, int threadID);
////
extern Value evaluate(const Position& pos, EvalInfo& ei, int threadID);
-extern Value quick_evaluate(const Position& pos);
extern void init_eval(int threads);
extern void quit_eval();
extern void read_weights(Color sideToMove);
extern void init_eval(int threads);
extern void quit_eval();
extern void read_weights(Color sideToMove);
assert(threadID >= 0 && threadID < ActiveThreads);
Move movesSearched[256];
assert(threadID >= 0 && threadID < ActiveThreads);
Move movesSearched[256];
StateInfo st;
const TTEntry* tte;
Move ttMove, move;
StateInfo st;
const TTEntry* tte;
Move ttMove, move;
if (AbortSearch || thread_should_stop(threadID))
return Value(0);
if (AbortSearch || thread_should_stop(threadID))
return Value(0);
+ if (pos.is_draw() || ply >= PLY_MAX - 1)
- 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);
// Mate distance pruning
oldAlpha = alpha;
alpha = Max(value_mated_in(ply), alpha);
if (AbortSearch || thread_should_stop(threadID))
return Value(0);
if (AbortSearch || thread_should_stop(threadID))
return Value(0);
+ if (pos.is_draw() || ply >= PLY_MAX - 1)
- 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;
// Mate distance pruning
if (value_mated_in(ply) >= beta)
return beta;
isCheck = pos.is_check();
ei.futilityMargin = Value(0); // Manually initialize futilityMargin
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);
// 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
// Null move search
if ( allowNullmove
if (AbortSearch || thread_should_stop(threadID))
return Value(0);
if (AbortSearch || thread_should_stop(threadID))
return Value(0);
+ if (pos.is_draw() || ply >= PLY_MAX - 1)
- 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());
// 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());