// Step 6. Razoring
+ // Maximum depth for razoring
const Depth RazorDepth = 4 * OnePly;
+
+ // Dynamic razoring margin based on depth
inline Value razor_margin(Depth d) { return Value(0x200 + 0x10 * d); }
// Step 8. Null move search with verification search
// evaluation of the position is more than NullMoveMargin below beta.
const Value NullMoveMargin = Value(0x200);
- // Depth limit for use of dynamic threat detection when null move fails low
+ // Maximum depth for use of dynamic threat detection when null move fails low
const Depth ThreatDepth = 5 * OnePly;
// Step 9. Internal iterative deepening
+ // Minimum depth for use of internal iterative deepening
const Depth IIDDepthAtPVNodes = 5 * OnePly;
const Depth IIDDepthAtNonPVNodes = 8 * OnePly;
Depth CheckExtension[2], SingleEvasionExtension[2], PawnPushTo7thExtension[2];
Depth PassedPawnExtension[2], PawnEndgameExtension[2], MateThreatExtension[2];
+ // Minimum depth for use of singular extension
const Depth SingularExtensionDepthAtPVNodes = 6 * OnePly;
const Depth SingularExtensionDepthAtNonPVNodes = 8 * OnePly;
// Step 12. Futility pruning
+ // Futility margin for quiescence search
const Value FutilityMarginQS = Value(0x80);
// Futility lookup tables (initialized at startup) and their getter functions
inline Depth pv_reduction(Depth d, int mn) { return (Depth) PVReductionMatrix[Min(d / 2, 63)][Min(mn, 63)]; }
inline Depth nonpv_reduction(Depth d, int mn) { return (Depth) NonPVReductionMatrix[Min(d / 2, 63)][Min(mn, 63)]; }
-
+ // Step. Common adjustments
// Search depth at iteration 1
const Depth InitialDepth = OnePly;
// better than the second best move.
const Value EasyMoveMargin = Value(0x200);
- /// Variables initialized by UCI options
-
// Last seconds noise filtering (LSN)
const bool UseLSNFiltering = true;
const int LSNTime = 4000; // In milliseconds
const Value LSNValue = value_from_centipawns(200);
bool loseOnTime = false;
+
+ /// Global variables
+
// Iteration counters
int Iteration;
// Loop through all legal moves until no moves remain or a beta cutoff occurs
// Initialize a MovePicker object for the current position
- MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]);
+ MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply], beta);
CheckInfo ci(pos);
while ( bestValue < beta
if (ActiveThreads == 1)
return;
- for (int i = 1; i < ActiveThreads; i++)
- assert(threads[i].state == THREAD_SLEEPING);
-
#if !defined(_MSC_VER)
pthread_mutex_lock(&WaitLock);
pthread_cond_broadcast(&WaitCond);