1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 08:43:09 +00:00

Use TT for pruning also in PV nodes

Biggest advantage is be able to analize positions
without "loss of memory" when goind back/forth in
a position.

Patch has proven to fix analysys problems and is even
worths some elo points.

After 5811 games Mod- Orig:
1037 - 902 - 3872 +8 ELO  (+- 3.6) LOS 97%

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2011-01-31 13:05:01 +01:00
parent 2f6788104f
commit b366c7dc38
2 changed files with 20 additions and 10 deletions

View file

@ -297,6 +297,7 @@ namespace {
Value value_to_tt(Value v, int ply); Value value_to_tt(Value v, int ply);
Value value_from_tt(Value v, int ply); Value value_from_tt(Value v, int ply);
bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply); bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply);
bool ok_to_use_TT_PV(const TTEntry* tte, Depth depth, Value alpha, Value beta, int ply);
bool connected_threat(const Position& pos, Move m, Move threat); bool connected_threat(const Position& pos, Move m, Move threat);
Value refine_eval(const TTEntry* tte, Value defaultEval, int ply); Value refine_eval(const TTEntry* tte, Value defaultEval, int ply);
void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount); void update_history(const Position& pos, Move move, Depth depth, Move movesSearched[], int moveCount);
@ -838,14 +839,10 @@ namespace {
tte = TT.retrieve(posKey); tte = TT.retrieve(posKey);
ttMove = tte ? tte->move() : MOVE_NONE; ttMove = tte ? tte->move() : MOVE_NONE;
// At PV nodes, we don't use the TT for pruning, but only for move ordering. // At PV nodes we check for exact scores within (alha, beta) range, while
// This is to avoid problems in the following areas: // at non-PV nodes we check for and return a fail high/low. Biggest advantage
// // at probing at PV nodes is to have a smooth experience in analysis mode.
// * Repetition draw detection if (!Root && tte && (PvNode ? ok_to_use_TT_PV(tte, depth, alpha, beta, ply) : ok_to_use_TT(tte, depth, beta, ply)))
// * Fifty move rule detection
// * Searching for a mate
// * Printing of full PV line
if (!PvNode && tte && ok_to_use_TT(tte, depth, beta, ply))
{ {
TT.refresh(tte); TT.refresh(tte);
ss->bestMove = ttMove; // Can be MOVE_NONE ss->bestMove = ttMove; // Can be MOVE_NONE
@ -1797,7 +1794,9 @@ split_point_start: // At split points actual search starts from here
// ok_to_use_TT() returns true if a transposition table score // ok_to_use_TT() returns true if a transposition table score
// can be used at a given point in search. // can be used at a given point in search. There are two versions
// one to be used in non-PV nodes and one in PV nodes where we look
// for an exact score that falls between (alha, beta) boundaries.
bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply) { bool ok_to_use_TT(const TTEntry* tte, Depth depth, Value beta, int ply) {
@ -1811,6 +1810,17 @@ split_point_start: // At split points actual search starts from here
|| ((tte->type() & VALUE_TYPE_UPPER) && v < beta)); || ((tte->type() & VALUE_TYPE_UPPER) && v < beta));
} }
bool ok_to_use_TT_PV(const TTEntry* tte, Depth depth, Value alpha, Value beta, int ply) {
Value v = value_from_tt(tte->value(), ply);
return tte->depth() >= depth
&& tte->type() == VALUE_TYPE_EXACT
&& tte->move() != MOVE_NONE
&& v < beta
&& v > alpha;
}
// refine_eval() returns the transposition table score if // refine_eval() returns the transposition table score if
// possible otherwise falls back on static position evaluation. // possible otherwise falls back on static position evaluation.

View file

@ -122,7 +122,7 @@ void TranspositionTable::store(const Key posKey, Value v, ValueType t, Depth d,
continue; continue;
c1 = (replace->generation() == generation ? 2 : 0); c1 = (replace->generation() == generation ? 2 : 0);
c2 = (tte->generation() == generation ? -2 : 0); c2 = (tte->generation() == generation || tte->type() == VALUE_TYPE_EXACT ? -2 : 0);
c3 = (tte->depth() < replace->depth() ? 1 : 0); c3 = (tte->depth() < replace->depth() ? 1 : 0);
if (c1 + c2 + c3 > 0) if (c1 + c2 + c3 > 0)