mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Implement a fallback system when aspiration search fails low and we are out of time.
However also this patch is immediately reverted. For three reasons: 1) the case it affects is very rare (and then we are likely to lose anyway), so we can well live without this. 2) Because the case is so rare it's hard to test this change properly. 3) To perform fallback search, we must reset so many global variables that this patch is very likely both buggy and extremely bad style. Consider including this again if we clean-up global variables one day... Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
6c4e36aab6
commit
0ea716463b
1 changed files with 39 additions and 8 deletions
|
@ -259,7 +259,7 @@ namespace {
|
|||
// Time managment variables
|
||||
int SearchStartTime;
|
||||
int MaxNodes, MaxDepth;
|
||||
int MaxSearchTime, AbsoluteMaxSearchTime, ExtraSearchTime;
|
||||
int MaxSearchTime, AbsoluteMaxSearchTime, EmergencyMaxSearchTime, ExtraSearchTime;
|
||||
Move EasyMove;
|
||||
int RootMoveNumber;
|
||||
bool InfiniteSearch;
|
||||
|
@ -520,9 +520,11 @@ void think(const Position &pos, bool infinite, bool ponder, int side_to_move,
|
|||
{
|
||||
MaxSearchTime = myTime / 30 + myIncrement;
|
||||
AbsoluteMaxSearchTime = Max(myTime / 4, myIncrement - 100);
|
||||
EmergencyMaxSearchTime = Max(myTime / 2, myIncrement - 100);
|
||||
} else { // Blitz game without increment
|
||||
MaxSearchTime = myTime / 30;
|
||||
AbsoluteMaxSearchTime = myTime / 8;
|
||||
EmergencyMaxSearchTime = myTime / 4;
|
||||
}
|
||||
}
|
||||
else // (x moves) / (y minutes)
|
||||
|
@ -531,9 +533,11 @@ void think(const Position &pos, bool infinite, bool ponder, int side_to_move,
|
|||
{
|
||||
MaxSearchTime = myTime / 2;
|
||||
AbsoluteMaxSearchTime = Min(myTime / 2, myTime - 500);
|
||||
EmergencyMaxSearchTime = myTime - 500;
|
||||
} else {
|
||||
MaxSearchTime = myTime / Min(movesToGo, 20);
|
||||
AbsoluteMaxSearchTime = Min((4 * myTime) / movesToGo, myTime / 3);
|
||||
EmergencyMaxSearchTime = Min((8 * myTime) / movesToGo, myTime / 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -700,6 +704,9 @@ namespace {
|
|||
Position p(pos);
|
||||
SearchStack ss[PLY_MAX_PLUS_2];
|
||||
|
||||
Value alpha;
|
||||
Value beta;
|
||||
|
||||
// searchMoves are verified, copied, scored and sorted
|
||||
RootMoveList rml(p, searchMoves);
|
||||
|
||||
|
@ -729,9 +736,6 @@ namespace {
|
|||
std::cout << "info depth " << Iteration << std::endl;
|
||||
|
||||
//Calculate dynamic search window based on previous iterations.
|
||||
Value alpha;
|
||||
Value beta;
|
||||
|
||||
if (MultiPV == 1 && Iteration >= 6) {
|
||||
Value prevDelta1 = IterationInfo[Iteration - 1].speculated_value() - IterationInfo[Iteration - 2].speculated_value();
|
||||
Value prevDelta2 = IterationInfo[Iteration - 2].speculated_value() - IterationInfo[Iteration - 3].speculated_value();
|
||||
|
@ -750,13 +754,14 @@ namespace {
|
|||
|
||||
// Search to the current depth
|
||||
Value value = root_search(p, ss, rml, alpha, beta);
|
||||
if (AbortSearch)
|
||||
break; //Value cannot be trusted. Break out immediately!
|
||||
|
||||
// Write PV to transposition table, in case the relevant entries have
|
||||
// been overwritten during the search:
|
||||
TT.insert_pv(p, ss[0].pv);
|
||||
|
||||
if (AbortSearch)
|
||||
break; //Value cannot be trusted. Break out immediately!
|
||||
|
||||
//Save info about search result
|
||||
Value speculated_value = value;
|
||||
bool fHigh = false;
|
||||
|
@ -826,7 +831,6 @@ namespace {
|
|||
|
||||
if (stopSearch)
|
||||
{
|
||||
//FIXME: Implement fail-low emergency measures
|
||||
if (!PonderSearch)
|
||||
break;
|
||||
else
|
||||
|
@ -838,6 +842,34 @@ namespace {
|
|||
break;
|
||||
}
|
||||
|
||||
if (FailLow)
|
||||
{
|
||||
//Here we face the rare, but extremely difficult case:
|
||||
//Our aspiration search has failed low and we've run out of time!
|
||||
//So we have no move to play!
|
||||
//Now use the emergency time and try as quickly as possible to
|
||||
//find even one playable move.
|
||||
|
||||
//FIXME: this is only for grepping logs purpose. Remove me when we are sure that this stuff really works!!
|
||||
if (AbortSearch)
|
||||
std::cout << "info depth " << 999 << std::endl;
|
||||
else
|
||||
std::cout << "info depth " << 998 << std::endl;
|
||||
|
||||
//Prepare variables for emergency search
|
||||
AbortSearch = false;
|
||||
FailLow = false;
|
||||
AbsoluteMaxSearchTime = EmergencyMaxSearchTime;
|
||||
MaxSearchTime = EmergencyMaxSearchTime;
|
||||
ExtraSearchTime = 0;
|
||||
rml.sort();
|
||||
|
||||
std::cout << "info depth " << Iteration << std::endl;
|
||||
|
||||
//Cause we failed low, it's _likely_ that we couldn't get over alpha anyway.
|
||||
root_search(p, ss, rml, -VALUE_INFINITE, alpha);
|
||||
}
|
||||
|
||||
rml.sort();
|
||||
|
||||
// If we are pondering, we shouldn't print the best move before we
|
||||
|
@ -891,7 +923,6 @@ namespace {
|
|||
|
||||
Value root_search(Position &pos, SearchStack ss[], RootMoveList &rml, Value alpha, Value beta) {
|
||||
|
||||
//FIXME: Implement bestValue
|
||||
Value oldAlpha = alpha;
|
||||
Value value;
|
||||
Bitboard dcCandidates = pos.discovered_check_candidates(pos.side_to_move());
|
||||
|
|
Loading…
Add table
Reference in a new issue