X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fsearch.cpp;h=a6db7a3ef8883b41701200f7d5e0124bb33be5ea;hp=3838375fa5517029f5c9d6e1b38018d83a490249;hb=5c81602d14539f8259a715477315e28b5de7cb54;hpb=39f2eda2851e5f468de6edc3313801c25a8b716a diff --git a/src/search.cpp b/src/search.cpp index 3838375f..a6db7a3e 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1,7 +1,7 @@ /* Stockfish, a UCI chess playing engine derived from Glaurung 2.1 Copyright (C) 2004-2008 Tord Romstad (Glaurung author) - Copyright (C) 2008 Marco Costalba + Copyright (C) 2008-2009 Marco Costalba Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -359,10 +359,11 @@ void SearchStack::initKillers() { //// /// think() is the external interface to Stockfish's search, and is called when -/// the program receives the UCI 'go' command. It initializes various -/// search-related global variables, and calls root_search() +/// the program receives the UCI 'go' command. It initializes various +/// search-related global variables, and calls root_search(). It returns false +/// when a quit command is received during the search. -void think(const Position &pos, bool infinite, bool ponder, int side_to_move, +bool 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[]) { @@ -371,15 +372,13 @@ void think(const Position &pos, bool infinite, bool ponder, int side_to_move, { Move bookMove; if (get_option_value_string("Book File") != OpeningBook.file_name()) - { - OpeningBook.close(); OpeningBook.open("book.bin"); - } + bookMove = OpeningBook.get_move(pos); if (bookMove != MOVE_NONE) { std::cout << "bestmove " << bookMove << std::endl; - return; + return true; } } @@ -543,14 +542,8 @@ void think(const Position &pos, bool infinite, bool ponder, int side_to_move, if (UseLogFile) LogFile.close(); - if (Quit) - { - OpeningBook.close(); - stop_threads(); - quit_eval(); - exit(0); - } Idle = true; + return !Quit; } @@ -1055,7 +1048,7 @@ namespace { // Transposition table lookup. At PV nodes, we don't use the TT for // pruning, but only for move ordering. - const TTEntry* tte = TT.retrieve(pos); + const TTEntry* tte = TT.retrieve(pos.get_key()); Move ttMove = (tte ? tte->move() : MOVE_NONE); // Go with internal iterative deepening if we don't have a TT move @@ -1188,7 +1181,7 @@ namespace { return bestValue; if (bestValue <= oldAlpha) - TT.store(pos, value_to_tt(bestValue, ply), VALUE_TYPE_UPPER, depth, MOVE_NONE); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_UPPER, depth, MOVE_NONE); else if (bestValue >= beta) { @@ -1199,10 +1192,10 @@ namespace { update_history(pos, m, depth, movesSearched, moveCount); update_killers(m, ss[ply]); } - TT.store(pos, value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, depth, m); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, depth, m); } else - TT.store(pos, value_to_tt(bestValue, ply), VALUE_TYPE_EXACT, depth, ss[ply].pv[ply]); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_EXACT, depth, ss[ply].pv[ply]); return bestValue; } @@ -1244,7 +1237,7 @@ namespace { return beta - 1; // Transposition table lookup - const TTEntry* tte = TT.retrieve(pos); + const TTEntry* tte = TT.retrieve(pos.get_key()); Move ttMove = (tte ? tte->move() : MOVE_NONE); if (tte && ok_to_use_TT(tte, depth, beta, ply)) @@ -1449,7 +1442,7 @@ namespace { return bestValue; if (bestValue < beta) - TT.store(pos, value_to_tt(bestValue, ply), VALUE_TYPE_UPPER, depth, MOVE_NONE); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_UPPER, depth, MOVE_NONE); else { BetaCounter.add(pos.side_to_move(), depth, threadID); @@ -1459,7 +1452,7 @@ namespace { update_history(pos, m, depth, movesSearched, moveCount); update_killers(m, ss[ply]); } - TT.store(pos, value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, depth, m); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, depth, m); } assert(bestValue > -VALUE_INFINITE && bestValue < VALUE_INFINITE); @@ -1497,7 +1490,7 @@ namespace { bool pvNode = (beta - alpha != 1); if (!pvNode) { - tte = TT.retrieve(pos); + tte = TT.retrieve(pos.get_key()); if (tte && ok_to_use_TT(tte, depth, beta, ply)) { assert(tte->type() != VALUE_TYPE_EVAL); @@ -1538,7 +1531,7 @@ namespace { { // Store the score to avoid a future costly evaluation() call if (!isCheck && !tte && ei.futilityMargin == 0) - TT.store(pos, value_to_tt(bestValue, ply), VALUE_TYPE_EVAL, Depth(-127*OnePly), MOVE_NONE); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_EVAL, Depth(-127*OnePly), MOVE_NONE); return bestValue; } @@ -1631,9 +1624,9 @@ namespace { { Depth d = (depth == Depth(0) ? Depth(0) : Depth(-1)); if (bestValue < beta) - TT.store(pos, value_to_tt(bestValue, ply), VALUE_TYPE_UPPER, d, MOVE_NONE); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_UPPER, d, MOVE_NONE); else - TT.store(pos, value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, d, m); + TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, d, m); } // Update killers only for good check moves @@ -2457,6 +2450,7 @@ namespace { AbortSearch = true; PonderSearch = false; Quit = true; + return; } else if(command == "stop") { @@ -2554,20 +2548,21 @@ namespace { // after which the bestmove and pondermove will be printed (in id_loop()). void wait_for_stop_or_ponderhit() { + std::string command; - while(true) { - if(!std::getline(std::cin, command)) - command = "quit"; - - if(command == "quit") { - OpeningBook.close(); - stop_threads(); - quit_eval(); - exit(0); - } - else if(command == "ponderhit" || command == "stop") - break; + while (true) + { + if (!std::getline(std::cin, command)) + command = "quit"; + + if (command == "quit") + { + Quit = true; + break; + } + else if(command == "ponderhit" || command == "stop") + break; } }