/// Local functions
Value id_loop(const Position& pos, Move searchMoves[]);
- Value root_search(Position& pos, SearchStack ss[], RootMoveList& rml, Value& oldAlpha, Value& beta);
+ Value root_search(Position& pos, SearchStack ss[], RootMoveList& rml, Value* alphaPtr, Value* betaPtr);
Value search_pv(Position& pos, SearchStack ss[], Value alpha, Value beta, Depth depth, int ply, int threadID);
Value search(Position& pos, SearchStack ss[], Value beta, Depth depth, int ply, bool allowNullmove, int threadID, Move excludedMove = MOVE_NONE);
Value qsearch(Position& pos, SearchStack ss[], Value alpha, Value beta, Depth depth, int ply, int threadID);
// Initialize global search variables
StopOnPonderhit = AbortSearch = Quit = AspirationFailLow = false;
+ MaxSearchTime = AbsoluteMaxSearchTime = ExtraSearchTime = 0;
NodesSincePoll = 0;
TM.resetNodeCounters();
SearchStartTime = get_system_time();
// Initialize iteration
Iteration++;
BestMoveChangesByIteration[Iteration] = 0;
- if (Iteration <= 5)
- ExtraSearchTime = 0;
cout << "info depth " << Iteration << endl;
beta = Min(ValueByIteration[Iteration - 1] + AspirationDelta, VALUE_INFINITE);
}
- // Search to the current depth, rml is updated and sorted
- value = root_search(p, ss, rml, alpha, beta);
+ // Search to the current depth, rml is updated and sorted, alpha and beta could change
+ value = root_search(p, ss, rml, &alpha, &beta);
// Write PV to transposition table, in case the relevant entries have
// been overwritten during the search.
// scheme, prints some information to the standard output and handles
// the fail low/high loops.
- Value root_search(Position& pos, SearchStack ss[], RootMoveList& rml, Value& oldAlpha, Value& beta) {
+ Value root_search(Position& pos, SearchStack ss[], RootMoveList& rml, Value* alphaPtr, Value* betaPtr) {
EvalInfo ei;
StateInfo st;
+ CheckInfo ci(pos);
int64_t nodes;
Move move;
Depth depth, ext, newDepth;
- Value value, alpha;
+ Value value, alpha, beta;
bool isCheck, moveIsCheck, captureOrPromotion, dangerous;
- int researchCount = 0;
- CheckInfo ci(pos);
- alpha = oldAlpha;
+ int researchCountFH, researchCountFL;
+
+ researchCountFH = researchCountFL = 0;
+ alpha = *alphaPtr;
+ beta = *betaPtr;
isCheck = pos.is_check();
// Step 1. Initialize node and poll (omitted at root, but I can see no good reason for this, FIXME)
print_pv_info(pos, ss, alpha, beta, value);
// Prepare for a research after a fail high, each time with a wider window
- researchCount++;
- beta = Min(beta + AspirationDelta * (1 << researchCount), VALUE_INFINITE);
+ researchCountFH++;
+ *betaPtr = beta = Min(beta + AspirationDelta * (1 << researchCountFH), VALUE_INFINITE);
} // End of fail high loop
}
} // PV move or new best move
- assert(alpha >= oldAlpha);
+ assert(alpha >= *alphaPtr);
- AspirationFailLow = (alpha == oldAlpha);
+ AspirationFailLow = (alpha == *alphaPtr);
if (AspirationFailLow && StopOnPonderhit)
StopOnPonderhit = false;
}
// Can we exit fail low loop ?
- if (AbortSearch || alpha > oldAlpha)
+ if (AbortSearch || !AspirationFailLow)
break;
// Prepare for a research after a fail low, each time with a wider window
- researchCount++;
- alpha = Max(alpha - AspirationDelta * (1 << researchCount), -VALUE_INFINITE);
- oldAlpha = alpha;
+ researchCountFL++;
+ *alphaPtr = alpha = Max(alpha - AspirationDelta * (1 << researchCountFL), -VALUE_INFINITE);
} // Fail low loop