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;
// When failing high/low give some update (without cluttering
// the UI) before a re-search.
- if ( (bestValue <= alpha || bestValue >= beta)
+ if ( multiPV == 1
+ && (bestValue <= alpha || bestValue >= beta)
&& Time::now() - SearchTime > 3000)
sync_cout << uci_pv(pos, depth, alpha, beta) << sync_endl;
newDepth = depth - ONE_PLY + extension;
// Step 13. Pruning at shallow depth
- if ( !captureOrPromotion
+ if ( !RootNode
+ && !captureOrPromotion
&& !inCheck
&& !dangerous
&& bestValue > VALUE_MATED_IN_MAX_PLY)
}
+/// 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() {