summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
32dfaa5)
In particular don't use an array of StateInfo, this
avoids a possible overflow and is in any case redundant.
Also pass as argument the pv[] array size to avoid a second
possible overflow on this one.
Fix suggested by Joona.
No functional change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
// Update PV
rml.set_move_score(i, value);
update_pv(ss, 0);
// Update PV
rml.set_move_score(i, value);
update_pv(ss, 0);
- TT.extract_pv(pos, ss[0].pv);
+ TT.extract_pv(pos, ss[0].pv, PLY_MAX);
rml.set_move_pv(i, ss[0].pv);
if (MultiPV == 1)
rml.set_move_pv(i, ss[0].pv);
if (MultiPV == 1)
/// 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.
/// 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[]) {
+void TranspositionTable::extract_pv(const Position& pos, Move pv[], int pvSize) {
- 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;
- for (stop = false, tte = retrieve(p.get_key());
- tte && tte->move() != MOVE_NONE && !stop;
- tte = retrieve(p.get_key()), ply++)
+ StateInfo st;
+ Position p(pos);
+ int ply = 0;
+
+ // Update position to the end of current PV
+ while (pv[ply] != MOVE_NONE)
+ p.do_move(pv[ply++], st);
+
+ // Try to add moves from TT until possible
+ while ( (tte = retrieve(p.get_key())) != NULL
+ && tte->move() != MOVE_NONE
+ && move_is_legal(p, tte->move())
+ && (!p.is_draw() || ply < 2)
+ && ply < pvSize)
- if (!move_is_legal(p, tte->move()))
- break;
- p.do_move(pv[ply], st[ply]);
- for (int j = 0; j < ply; j++)
- if (st[j].key == p.get_key()) stop = true;
+ p.do_move(pv[ply++], st);
void prefetch(const Key posKey) const;
void new_search();
void insert_pv(const Position& pos, Move pv[]);
void prefetch(const Key posKey) const;
void new_search();
void insert_pv(const Position& pos, Move pv[]);
- void extract_pv(const Position& pos, Move pv[]);
+ void extract_pv(const Position& pos, Move pv[], int pvSize);
int full() const;
private:
int full() const;
private: