-/// RootMove::extract_pv_from_tt() builds a PV by adding moves from the TT table.
-/// We also consider both failing high nodes and BOUND_EXACT nodes here to
-/// ensure that we have a ponder move even when we fail high at root. This
-/// results in a long PV to print that is important for position analysis.
-
-void RootMove::extract_pv_from_tt(Position& pos) {
-
- StateInfo state[MAX_PLY_PLUS_6], *st = state;
- const TTEntry* tte;
- int ply = 1; // At root ply is 1...
- Move m = pv[0]; // ...instead pv[] array starts from 0
- Value expectedScore = score;
-
- pv.clear();
-
- do {
- pv.push_back(m);
-
- assert(MoveList<LEGAL>(pos).contains(pv[ply - 1]));
-
- pos.do_move(pv[ply++ - 1], *st++);
- tte = TT.probe(pos.key());
- expectedScore = -expectedScore;
-
- } while ( tte
- && expectedScore == value_from_tt(tte->value(), ply)
- && pos.pseudo_legal(m = tte->move()) // Local copy, TT could change
- && pos.legal(m, pos.pinned_pieces(pos.side_to_move()))
- && ply < MAX_PLY
- && (!pos.is_draw() || ply <= 2));
-
- pv.push_back(MOVE_NONE); // Must be zero-terminating
-
- while (--ply) pos.undo_move(pv[ply - 1]);
-}
-
-
-/// RootMove::insert_pv_in_tt() is called at the end of a search iteration, and
-/// inserts the PV back into the TT. This makes sure the old PV moves are searched
-/// first, even if the old TT entries have been overwritten.
-
-void RootMove::insert_pv_in_tt(Position& pos) {
-
- StateInfo state[MAX_PLY_PLUS_6], *st = state;
- const TTEntry* tte;
- int idx = 0; // Ply starts from 1, we need to start from 0
-
- do {
- tte = TT.probe(pos.key());
-
- if (!tte || tte->move() != pv[idx]) // Don't overwrite correct entries
- TT.store(pos.key(), VALUE_NONE, BOUND_NONE, DEPTH_NONE, pv[idx], VALUE_NONE);
-
- assert(MoveList<LEGAL>(pos).contains(pv[idx]));
-
- pos.do_move(pv[idx++], *st++);
-
- } while (pv[idx] != MOVE_NONE);
-
- while (idx) pos.undo_move(pv[--idx]);
-}
-
-
-/// Thread::idle_loop() is where the thread is parked when it has no work to do
-
-void Thread::idle_loop() {