////
#include <cassert>
-#include <cstdio>
#include <fstream>
#include <iostream>
#include <sstream>
// Time managment variables
int SearchStartTime;
int MaxNodes, MaxDepth;
- int MaxSearchTime, AbsoluteMaxSearchTime, ExtraSearchTime;
+ int MaxSearchTime, AbsoluteMaxSearchTime, ExtraSearchTime, TimeAdvantage;
Move BestRootMove, PonderMove, EasyMove;
int RootMoveNumber;
bool InfiniteSearch;
/// the program receives the UCI 'go' command. It initializes various
/// search-related global variables, and calls root_search()
-void think(const Position &pos, bool infinite, bool ponder, int time,
- int increment, int movesToGo, int maxDepth, int maxNodes,
- int maxTime, Move searchMoves[]) {
+void think(const Position &pos, bool infinite, bool ponder, int side_to_move,
+ int time[], int increment[], int movesToGo, int maxDepth,
+ int maxNodes, int maxTime, Move searchMoves[]) {
// Look for a book move:
if(!infinite && !ponder && get_option_value_bool("OwnBook")) {
TT.set_size(get_option_value_int("Hash"));
if(button_was_pressed("Clear Hash"))
TT.clear();
- PonderingEnabled = get_option_value_int("Ponder");
+ PonderingEnabled = get_option_value_bool("Ponder");
MultiPV = get_option_value_int("MultiPV");
CheckExtension[1] = Depth(get_option_value_int("Check Extension (PV nodes)"));
init_eval(ActiveThreads);
}
- // Write information to search log file:
- if(UseLogFile) {
- LogFile << "Searching: " << pos.to_fen() << '\n';
- LogFile << "infinite: " << infinite << " ponder: " << ponder
- << " time: " << time << " increment: " << increment
- << " moves to go: " << movesToGo << '\n';
- }
-
// Wake up sleeping threads:
wake_sleeping_threads();
assert(thread_is_available(i, 0));
// Set thinking time:
+ int myTime = time[side_to_move];
+ int myIncrement = increment[side_to_move];
+ int oppTime = time[1 - side_to_move];
+
+ TimeAdvantage = myTime - oppTime;
+
if(!movesToGo) { // Sudden death time control
if(increment) {
- MaxSearchTime = time / 30 + increment;
- AbsoluteMaxSearchTime = Max(time / 4, increment - 100);
+ MaxSearchTime = myTime / 30 + myIncrement;
+ AbsoluteMaxSearchTime = Max(myTime / 4, myIncrement - 100);
}
else { // Blitz game without increment
- MaxSearchTime = time / 40;
- AbsoluteMaxSearchTime = time / 8;
+ MaxSearchTime = myTime / 40;
+ AbsoluteMaxSearchTime = myTime / 8;
}
}
else { // (x moves) / (y minutes)
if(movesToGo == 1) {
- MaxSearchTime = time / 2;
- AbsoluteMaxSearchTime = Min(time / 2, time - 500);
+ MaxSearchTime = myTime / 2;
+ AbsoluteMaxSearchTime = Min(myTime / 2, myTime - 500);
}
else {
- MaxSearchTime = time / Min(movesToGo, 20);
- AbsoluteMaxSearchTime = Min((4 * time) / movesToGo, time / 3);
+ MaxSearchTime = myTime / Min(movesToGo, 20);
+ AbsoluteMaxSearchTime = Min((4 * myTime) / movesToGo, myTime / 3);
}
}
if(PonderingEnabled) {
else
NodesBetweenPolls = 30000;
+
+ // Write information to search log file:
+ if(UseLogFile) {
+ LogFile << "Searching: " << pos.to_fen() << '\n';
+ LogFile << "infinite: " << infinite << " ponder: " << ponder
+ << " time: " << myTime << " increment: " << myIncrement
+ << " moves to go: " << movesToGo << '\n';
+ }
+
// We're ready to start thinking. Call the iterative deepening loop
// function:
id_loop(pos, searchMoves);
BestMoveChangesByIteration[Iteration] * (MaxSearchTime / 2) +
BestMoveChangesByIteration[Iteration-1] * (MaxSearchTime / 3);
+ // If we need some more and we are in time advantage take it.
+ if (ExtraSearchTime > 0 && TimeAdvantage > 2 * MaxSearchTime)
+ ExtraSearchTime += MaxSearchTime / 2;
+
// Stop search if most of MaxSearchTime is consumed at the end of the
// iteration. We probably don't have enough time to search the first
// move at the next iteration anyway.
}
}
// Null move search not allowed, try razoring
- else if ( depth < RazorDepth
- && approximateEval < beta - RazorMargin
- && evaluate(pos, ei, threadID) < beta - RazorMargin)
+ else if (depth < RazorDepth && approximateEval < beta - RazorMargin)
{
Value v = qsearch(pos, ss, beta-1, beta, Depth(0), ply, threadID);
if (v < beta)
// search.
void poll() {
- int t, data;
- static int lastInfoTime;
- t = current_search_time();
+ static int lastInfoTime;
+ int t = current_search_time();
// Poll for input
- data = Bioskey();
- if(data) {
- char input[256];
- if(fgets(input, 255, stdin) == NULL)
- strcpy(input, "quit\n");
- if(strncmp(input, "quit", 4) == 0) {
- AbortSearch = true;
- PonderSearch = false;
- Quit = true;
- }
- else if(strncmp(input, "stop", 4) == 0) {
- AbortSearch = true;
- PonderSearch = false;
- }
- else if(strncmp(input, "ponderhit", 9) == 0)
- ponderhit();
- }
+ if (Bioskey())
+ {
+ // We are line oriented, don't read single chars
+ std::string command;
+ if (!std::getline(std::cin, command))
+ command = "quit";
- // Print search information
- if(t < 1000)
- lastInfoTime = 0;
- else if(lastInfoTime > t)
- // HACK: Must be a new search where we searched less than
- // NodesBetweenPolls nodes during the first second of search.
- lastInfoTime = 0;
- else if(t - lastInfoTime >= 1000) {
- lastInfoTime = t;
- lock_grab(&IOLock);
- std::cout << "info nodes " << nodes_searched() << " nps " << nps()
- << " time " << t << " hashfull " << TT.full() << std::endl;
- lock_release(&IOLock);
- if(ShowCurrentLine)
- Threads[0].printCurrentLine = true;
+ if (command == "quit")
+ {
+ AbortSearch = true;
+ PonderSearch = false;
+ Quit = true;
+ }
+ else if(command == "stop")
+ {
+ AbortSearch = true;
+ PonderSearch = false;
+ }
+ else if(command == "ponderhit")
+ ponderhit();
}
+ // Print search information
+ if (t < 1000)
+ lastInfoTime = 0;
+
+ else if (lastInfoTime > t)
+ // HACK: Must be a new search where we searched less than
+ // NodesBetweenPolls nodes during the first second of search.
+ lastInfoTime = 0;
+ else if (t - lastInfoTime >= 1000)
+ {
+ lastInfoTime = t;
+ lock_grab(&IOLock);
+ std::cout << "info nodes " << nodes_searched() << " nps " << nps()
+ << " time " << t << " hashfull " << TT.full() << std::endl;
+ lock_release(&IOLock);
+ if (ShowCurrentLine)
+ Threads[0].printCurrentLine = true;
+ }
// Should we stop the search?
- if(!PonderSearch && Iteration >= 2 &&
- (!InfiniteSearch && (t > AbsoluteMaxSearchTime ||
- (RootMoveNumber == 1 &&
- t > MaxSearchTime + ExtraSearchTime) ||
- (!FailHigh && !fail_high_ply_1() && !Problem &&
- t > 6*(MaxSearchTime + ExtraSearchTime)))))
- AbortSearch = true;
+ if (PonderSearch)
+ return;
- if(!PonderSearch && ExactMaxTime && t >= ExactMaxTime)
- AbortSearch = true;
+ bool overTime = t > AbsoluteMaxSearchTime
+ || (RootMoveNumber == 1 && t > MaxSearchTime + ExtraSearchTime)
+ || ( !FailHigh && !fail_high_ply_1() && !Problem
+ && t > 6*(MaxSearchTime + ExtraSearchTime));
- if(!PonderSearch && Iteration >= 3 && MaxNodes
- && nodes_searched() >= MaxNodes)
- AbortSearch = true;
+ if ( (Iteration >= 2 && (!InfiniteSearch && overTime))
+ || (ExactMaxTime && t >= ExactMaxTime)
+ || (Iteration >= 3 && MaxNodes && nodes_searched() >= MaxNodes))
+ AbortSearch = true;
}