- // update_history() registers a good move that produced a beta-cutoff
- // in history and marks as failures all the other moves of that ply.
-
- void update_history(const Position& pos, Move move, Depth depth,
- Move movesSearched[], int moveCount) {
- Move m;
- Value bonus = Value(int(depth) * int(depth));
-
- H.update(pos.piece_on(move_from(move)), move_to(move), bonus);
-
- for (int i = 0; i < moveCount - 1; i++)
- {
- m = movesSearched[i];
-
- assert(m != move);
-
- H.update(pos.piece_on(move_from(m)), move_to(m), -bonus);
- }
- }
-
-
- // update_killers() add a good move that produced a beta-cutoff
- // among the killer moves of that ply.
-
- void update_killers(Move m, Move killers[]) {
-
- if (m != killers[0])
- {
- killers[1] = killers[0];
- killers[0] = m;
- }
- }
-
-
- // update_gains() updates the gains table of a non-capture move given
- // the static position evaluation before and after the move.
-
- void update_gains(const Position& pos, Move m, Value before, Value after) {
-
- if ( m != MOVE_NULL
- && before != VALUE_NONE
- && after != VALUE_NONE
- && pos.captured_piece_type() == PIECE_TYPE_NONE
- && !move_is_special(m))
- H.update_gain(pos.piece_on(move_to(m)), move_to(m), -(before + after));
- }
-
- // current_search_time() returns the number of milliseconds which have passed
- // since the beginning of the current search.
-
- int current_search_time() {
-
- return get_system_time() - SearchStartTime;
- }
-
-
- // value_to_uci() converts a value to a string suitable for use with the UCI
- // protocol specifications:
- //
- // cp <x> The score from the engine's point of view in centipawns.
- // mate <y> Mate in y moves, not plies. If the engine is getting mated
- // use negative values for y.
-
- std::string value_to_uci(Value v) {
-
- std::stringstream s;
-
- if (abs(v) < VALUE_MATE - PLY_MAX * ONE_PLY)
- s << "cp " << int(v) * 100 / int(PawnValueMidgame); // Scale to centipawns
- else
- s << "mate " << (v > 0 ? (VALUE_MATE - v + 1) / 2 : -(VALUE_MATE + v) / 2);
-
- return s.str();
- }
-
-
- // speed_to_uci() returns a string with time stats of current search suitable
- // to be sent to UCI gui.
-
- std::string speed_to_uci(int64_t nodes) {
-
- std::stringstream s;
- int t = current_search_time();
-
- s << " nodes " << nodes
- << " nps " << (t > 0 ? int(nodes * 1000 / t) : 0)
- << " time " << t;
-
- return s.str();
- }
-
-
- // poll() performs two different functions: It polls for user input, and it
- // looks at the time consumed so far and decides if it's time to abort the
- // search.
-
- void poll(const Position& pos) {
-
- static int lastInfoTime;
- int t = current_search_time();
-
- // Poll for input
- if (input_available())
- {
- // We are line oriented, don't read single chars
- std::string command;
-
- if (!std::getline(std::cin, command))
- command = "quit";
-
- if (command == "quit")
- {
- // Quit the program as soon as possible
- Pondering = false;
- QuitRequest = StopRequest = true;
- return;
- }
- else if (command == "stop")
- {
- // Stop calculating as soon as possible, but still send the "bestmove"
- // and possibly the "ponder" token when finishing the search.
- Pondering = false;
- StopRequest = true;
- }
- else if (command == "ponderhit")
- {
- // The opponent has played the expected move. GUI sends "ponderhit" if
- // we were told to ponder on the same move the opponent has played. We
- // should continue searching but switching from pondering to normal search.
- Pondering = false;
-
- if (StopOnPonderhit)
- StopRequest = true;
- }
- }
-
- // 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;
-
- if (dbg_show_mean)
- dbg_print_mean();
-
- if (dbg_show_hit_rate)
- dbg_print_hit_rate();
-
- // Send info on searched nodes as soon as we return to root
- SendSearchedNodes = true;
- }
-
- // Should we stop the search?
- if (Pondering)
- return;
-
- bool stillAtFirstMove = FirstRootMove
- && !AspirationFailLow
- && t > TimeMgr.available_time();