mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 08:43: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:
parent
97a034ad3e
commit
44643c2770
2 changed files with 26 additions and 1 deletions
|
@ -276,7 +276,7 @@ void Search::think() {
|
||||||
|
|
||||||
sync_cout << "bestmove " << UCI::move(RootMoves[0].pv[0], RootPos.is_chess960());
|
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 << " ponder " << UCI::move(RootMoves[0].pv[1], RootPos.is_chess960());
|
||||||
|
|
||||||
std::cout << sync_endl;
|
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
|
/// Thread::idle_loop() is where the thread is parked when it has no work to do
|
||||||
|
|
||||||
void Thread::idle_loop() {
|
void Thread::idle_loop() {
|
||||||
|
|
|
@ -60,6 +60,7 @@ struct RootMove {
|
||||||
bool operator<(const RootMove& m) const { return score > m.score; } // Ascending sort
|
bool operator<(const RootMove& m) const { return score > m.score; } // Ascending sort
|
||||||
bool operator==(const Move& m) const { return pv[0] == m; }
|
bool operator==(const Move& m) const { return pv[0] == m; }
|
||||||
void insert_pv_in_tt(Position& pos);
|
void insert_pv_in_tt(Position& pos);
|
||||||
|
Move extract_ponder_from_tt(Position& pos);
|
||||||
|
|
||||||
Value score;
|
Value score;
|
||||||
Value previousScore;
|
Value previousScore;
|
||||||
|
|
Loading…
Add table
Reference in a new issue