// To allow access to (ss-7) up to (ss+2), the stack must be oversized.
// The former is needed to allow update_continuation_histories(ss-1, ...),
// which accesses its argument at ss-6, also near the root.
- // The latter is needed for statScores and killer initialization.
+ // The latter is needed for statScore and killer initialization.
Stack stack[MAX_PLY+10], *ss = stack+7;
Move pv[MAX_PLY+1];
Value bestValue, alpha, beta, delta;
for (int i = 7; i > 0; i--)
(ss-i)->continuationHistory = &this->continuationHistory[0][0][NO_PIECE][0]; // Use as a sentinel
+ for (int i = 0; i <= MAX_PLY + 2; ++i)
+ (ss+i)->ply = i;
+
ss->pv = pv;
bestValue = delta = alpha = -VALUE_INFINITE;
Move ttMove, move, excludedMove, bestMove;
Depth extension, newDepth;
Value bestValue, value, ttValue, eval, maxValue, probCutBeta;
- bool formerPv, givesCheck, improving, didLMR, priorCapture;
+ bool givesCheck, improving, didLMR, priorCapture;
bool captureOrPromotion, doFullDepthSearch, moveCountPruning,
ttCapture, singularQuietLMR;
Piece movedPiece;
assert(0 <= ss->ply && ss->ply < MAX_PLY);
- (ss+1)->ply = ss->ply + 1;
(ss+1)->ttPv = false;
(ss+1)->excludedMove = bestMove = MOVE_NONE;
(ss+2)->killers[0] = (ss+2)->killers[1] = MOVE_NONE;
: ss->ttHit ? tte->move() : MOVE_NONE;
if (!excludedMove)
ss->ttPv = PvNode || (ss->ttHit && tte->is_pv());
- formerPv = ss->ttPv && !PvNode;
// Update low ply history for previous move if we are near root and position is or has been in PV
if ( ss->ttPv
&& (tte->bound() & BOUND_LOWER)
&& tte->depth() >= depth - 3)
{
- Value singularBeta = ttValue - ((formerPv + 4) * depth) / 2;
- Depth singularDepth = (depth - 1 + 3 * formerPv) / 2;
+ Value singularBeta = ttValue - 2 * depth;
+ Depth singularDepth = (depth - 1) / 2;
ss->excludedMove = move;
value = search<NonPV>(pos, ss, singularBeta - 1, singularBeta, singularDepth, cutNode);
return beta;
}
}
+ else if ( givesCheck
+ && depth > 6
+ && abs(ss->staticEval) > Value(100))
+ extension = 1;
// Add extension to new depth
newDepth += extension;
if ( depth >= 3
&& moveCount > 1 + 2 * rootNode
&& ( !captureOrPromotion
- || cutNode
- || (!PvNode && !formerPv))
+ || (cutNode && (ss-1)->moveCount > 1)
+ || !ss->ttPv)
&& (!PvNode || ss->ply > 1 || thisThread->id() % 4 != 3))
{
Depth r = reduction(improving, depth, moveCount);
else
{
assert(value >= beta); // Fail high
- ss->statScore = 0;
break;
}
}
}
Thread* thisThread = pos.this_thread();
- (ss+1)->ply = ss->ply + 1;
bestMove = MOVE_NONE;
ss->inCheck = pos.checkers();
moveCount = 0;