mirror of
https://github.com/opelly27/Stockfish.git
synced 2026-05-20 14:27:45 +00:00
100% accurate PV display
This gives SF accurate PVs, such that the evaluation of the leaf node in the PV matches the score backed up to the root (99% of the time. q-search will use the value stored in the hash table instead of the eval value sometimes). One drawback is that fail-high/low only get a minimal 2 move PV. It doesn't add any additional overhead to the non-PV codepath except an extra eight bytes to the SearchStack structure in multi-threaded searches. A core part of this is not pruning based on TT score in PV nodes. This was measured as not being a regression at multiple TCs, except for one exception, fast TC with huge hash, which is not realistic for longer searches. STC - 1 thread, 128 mb hash ELO: 1.42 +-3.1 (95%) LOS: 81.9% Total: 20000 W: 4078 L: 3996 D: 11926 STC - 3 thread, 128 mb hash ELO: -3.60 +-2.9 (95%) LOS: 0.8% Total: 20000 W: 3575 L: 3782 D: 12643 STC - 3 thread, 8 mb hash ELO: 0.12 +-2.9 (95%) LOS: 53.3% Total: 20000 W: 3654 L: 3647 D: 12699 LTC - 3 thread, 32mb hash ELO: 2.29 +-2.0 (95%) LOS: 98.8% Total: 35740 W: 5618 L: 5382 D: 24740 Bench: 6984058 Resolves #102
This commit is contained in:
+14
-1
@@ -32,12 +32,26 @@ struct SplitPoint;
|
||||
|
||||
namespace Search {
|
||||
|
||||
struct PVEntry {
|
||||
Move pv[MAX_PLY+1];
|
||||
|
||||
void update(Move move, PVEntry* child) {
|
||||
pv[0] = move;
|
||||
|
||||
int i = 1;
|
||||
for (; child && i < MAX_PLY && child->pv[i - 1] != MOVE_NONE; ++i)
|
||||
pv[i] = child->pv[i - 1];
|
||||
pv[i] = MOVE_NONE;
|
||||
}
|
||||
};
|
||||
|
||||
/// The Stack struct keeps track of the information we need to remember from
|
||||
/// nodes shallower and deeper in the tree during the search. Each search thread
|
||||
/// has its own array of Stack objects, indexed by the current ply.
|
||||
|
||||
struct Stack {
|
||||
SplitPoint* splitPoint;
|
||||
PVEntry* pv;
|
||||
int ply;
|
||||
Move currentMove;
|
||||
Move ttMove;
|
||||
@@ -62,7 +76,6 @@ struct RootMove {
|
||||
bool operator<(const RootMove& m) const { return score > m.score; } // Ascending sort
|
||||
bool operator==(const Move& m) const { return pv[0] == m; }
|
||||
|
||||
void extract_pv_from_tt(Position& pos);
|
||||
void insert_pv_in_tt(Position& pos);
|
||||
|
||||
Value score;
|
||||
|
||||
Reference in New Issue
Block a user