X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Ftt.cpp;h=c1a8b1b950b24edbc514fdb43baaae2dc6909288;hp=3651cbb294901529ba9089fc80700cba526a9613;hb=2fff532f4e80c8e2e61d8b3955447f13124d40f0;hpb=da854fe83a64b2181c372f7b51f8b2190f67840d diff --git a/src/tt.cpp b/src/tt.cpp index 3651cbb2..c1a8b1b9 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -26,6 +26,7 @@ #include #include +#include "movegen.h" #include "tt.h" @@ -185,6 +186,38 @@ void TranspositionTable::insert_pv(const Position& pos, Move pv[]) { } +/// TranspositionTable::extract_pv() extends a PV by adding moves from the +/// transposition table at the end. This should ensure that the PV is almost +/// always at least two plies long, which is important, because otherwise we +/// will often get single-move PVs when the search stops while failing high, +/// and a single-move PV means that we don't have a ponder move. + +void TranspositionTable::extract_pv(const Position& pos, Move pv[]) { + + int ply; + Position p(pos); + StateInfo st[100]; + + for (ply = 0; pv[ply] != MOVE_NONE; ply++) + p.do_move(pv[ply], st[ply]); + + bool stop; + const TTEntry* tte; + for (stop = false, tte = retrieve(p.get_key()); + tte && tte->move() != MOVE_NONE && !stop; + tte = retrieve(p.get_key()), ply++) + { + if (!move_is_legal(p, tte->move(), p.pinned_pieces(p.side_to_move()))) + break; + pv[ply] = tte->move(); + p.do_move(pv[ply], st[ply]); + for (int j = 0; j < ply; j++) + if (st[j].key == p.get_key()) stop = true; + } + pv[ply] = MOVE_NONE; +} + + /// TranspositionTable::full() returns the permill of all transposition table /// entries which have received at least one write during the current search. /// It is used to display the "info hashfull ..." information in UCI.