Move movesSearched[256];
EvalInfo ei;
StateInfo st;
- const TTEntry* tte;
+ const TTEntry *tte, *ttx;
Key posKey;
Move ttMove, move, excludedMove, threatMove;
Depth ext, newDepth;
if (tte)
{
assert(tte->static_value() != VALUE_NONE);
+
ss->eval = tte->static_value();
ei.kingDanger[pos.side_to_move()] = tte->king_danger();
}
ss->eval = evaluate(pos, ei);
TT.store(posKey, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, MOVE_NONE, ss->eval, ei.kingDanger[pos.side_to_move()]);
}
-
refinedValue = refine_eval(tte, ss->eval, ply); // Enhance accuracy with TT value if possible
update_gains(pos, (ss-1)->currentMove, (ss-1)->eval, ss->eval);
}
// Initialize a MovePicker object for the current position
MovePicker mp = MovePicker(pos, ttMove, depth, H, ss, (PvNode ? -VALUE_INFINITE : beta));
CheckInfo ci(pos);
+ ss->bestMove = MOVE_NONE;
singleEvasion = isCheck && mp.number_of_evasions() == 1;
singularExtensionNode = depth >= SingularExtensionDepth[PvNode]
- && tte && tte->move()
+ && tte
+ && tte->move()
&& !excludedMove // Do not allow recursive singular extension search
&& is_lower_bound(tte->type())
&& tte->depth() >= depth - 3 * OnePly;
- // Avoid to do an expensive singular extension search on nodes where
- // such search had already failed in the past.
- if ( !PvNode
- && singularExtensionNode
- && depth < SingularExtensionDepth[PvNode] + 5 * OnePly)
- {
- TTEntry* ttx = TT.retrieve(pos.get_exclusion_key());
- if (ttx && is_lower_bound(ttx->type()))
- singularExtensionNode = false;
- }
-
// Step 10. Loop through moves
// Loop through all legal moves until no moves remain or a beta cutoff occurs
while ( bestValue < beta
&& move == tte->move()
&& ext < OnePly)
{
+ // Avoid to do an expensive singular extension search on nodes where
+ // such search have already been done in the past, so assume the last
+ // singular extension search result is still valid.
+ if ( !PvNode
+ && depth < SingularExtensionDepth[PvNode] + 5 * OnePly
+ && ((ttx = TT.retrieve(pos.get_exclusion_key())) != NULL))
+ {
+ if (is_upper_bound(ttx->type()))
+ ext = OnePly;
+
+ singularExtensionNode = false;
+ }
+
Value ttValue = value_from_tt(tte->value(), ply);
- if (abs(ttValue) < VALUE_KNOWN_WIN)
+ if (singularExtensionNode && abs(ttValue) < VALUE_KNOWN_WIN)
{
Value b = ttValue - SingularExtensionMargin;
ss->excludedMove = move;
Value v = search<NonPV>(pos, ss, b - 1, b, depth / 2, ply);
ss->skipNullMove = false;
ss->excludedMove = MOVE_NONE;
+ ss->bestMove = MOVE_NONE;
if (v < b)
ext = OnePly;
}