The assert:
assert(ttValue != VALUE_NONE);
Could fire for multiple reasons (although is very rare),
for instance after an IID we can have ttMove != MOVE_NONE
while ttValue is still set at VALUE_NONE.
But not only this, actually SMP is a source of corrupted
ttValue and anyhow we can detect the condition:
ttMove != MOVE_NONE && ttValue == VALUE_NONE
even north of IID.
Reported by Ronald de Man.
It is so rare that bench didn't change.
bench:
7710548
&& depth >= 8 * ONE_PLY
&& abs(beta) < VALUE_KNOWN_WIN
&& ttMove != MOVE_NONE
&& depth >= 8 * ONE_PLY
&& abs(beta) < VALUE_KNOWN_WIN
&& ttMove != MOVE_NONE
+ && ttValue != VALUE_NONE
&& !excludedMove // Recursive singular search is not allowed
&& (tte->bound() & BOUND_LOWER)
&& tte->depth() >= depth - 3 * ONE_PLY;
&& !excludedMove // Recursive singular search is not allowed
&& (tte->bound() & BOUND_LOWER)
&& tte->depth() >= depth - 3 * ONE_PLY;
&& !ext
&& pos.legal(move, ci.pinned))
{
&& !ext
&& pos.legal(move, ci.pinned))
{
- assert(ttValue != VALUE_NONE);
-
Value rBeta = ttValue - int(depth);
ss->excludedMove = move;
ss->skipNullMove = true;
Value rBeta = ttValue - int(depth);
ss->excludedMove = move;
ss->skipNullMove = true;