1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 16:23:09 +00:00

Try hard to retrieve a ponder move

In case we stop the search during a fail-high
it is possible we return to GUI without a ponder
move. This patch try harder to find a ponder move
retrieving it from TT. This is important in games
played with 'ponder on'.

bench: 8080602

Resolves #221
This commit is contained in:
Marco Costalba 2015-01-20 09:13:30 +01:00 committed by Joona Kiiski
parent 97a034ad3e
commit 44643c2770
2 changed files with 26 additions and 1 deletions

View file

@ -276,7 +276,7 @@ void Search::think() {
sync_cout << "bestmove " << UCI::move(RootMoves[0].pv[0], RootPos.is_chess960());
if (RootMoves[0].pv.size() > 1)
if (RootMoves[0].pv.size() > 1 || RootMoves[0].extract_ponder_from_tt(RootPos))
std::cout << " ponder " << UCI::move(RootMoves[0].pv[1], RootPos.is_chess960());
std::cout << sync_endl;
@ -1491,6 +1491,30 @@ void RootMove::insert_pv_in_tt(Position& pos) {
}
/// RootMove::extract_ponder_from_tt() is called in case we have no ponder move before
/// exiting the search, for instance in case we stop the search during a fail high at
/// root. We try hard to have a ponder move to return to the GUI, otherwise in case of
/// 'ponder on' we have nothing to think on.
Move RootMove::extract_ponder_from_tt(Position& pos)
{
StateInfo st;
bool found;
assert(pv.size() == 1);
pos.do_move(pv[0], st);
TTEntry* tte = TT.probe(pos.key(), found);
Move m = found ? tte->move() : MOVE_NONE;
if (!MoveList<LEGAL>(pos).contains(m))
m = MOVE_NONE;
pos.undo_move(pv[0]);
pv.push_back(m);
return m;
}
/// Thread::idle_loop() is where the thread is parked when it has no work to do
void Thread::idle_loop() {

View file

@ -60,6 +60,7 @@ struct RootMove {
bool operator<(const RootMove& m) const { return score > m.score; } // Ascending sort
bool operator==(const Move& m) const { return pv[0] == m; }
void insert_pv_in_tt(Position& pos);
Move extract_ponder_from_tt(Position& pos);
Value score;
Value previousScore;