mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 16:53:09 +00:00
Pass evalMargin through SearchStack as eval
It has more sense to treat the two evaluation metrics in the same way. As a side effect now we use the correct eval margin when pruning in a SplitPoint node. No functional change in single thread. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
a7f4ee7540
commit
19ff8e2902
2 changed files with 13 additions and 11 deletions
|
@ -717,7 +717,7 @@ namespace {
|
||||||
int64_t nodes;
|
int64_t nodes;
|
||||||
Move move;
|
Move move;
|
||||||
Depth depth, ext, newDepth;
|
Depth depth, ext, newDepth;
|
||||||
Value value, evalMargin, alpha, beta;
|
Value value, alpha, beta;
|
||||||
bool isCheck, moveIsCheck, captureOrPromotion, dangerous;
|
bool isCheck, moveIsCheck, captureOrPromotion, dangerous;
|
||||||
int researchCountFH, researchCountFL;
|
int researchCountFH, researchCountFL;
|
||||||
|
|
||||||
|
@ -736,7 +736,8 @@ namespace {
|
||||||
|
|
||||||
// Step 5. Evaluate the position statically
|
// Step 5. Evaluate the position statically
|
||||||
// At root we do this only to get reference value for child nodes
|
// At root we do this only to get reference value for child nodes
|
||||||
ss->eval = isCheck ? VALUE_NONE : evaluate(pos, evalMargin);
|
ss->evalMargin = VALUE_NONE;
|
||||||
|
ss->eval = isCheck ? VALUE_NONE : evaluate(pos, ss->evalMargin);
|
||||||
|
|
||||||
// Step 6. Razoring (omitted at root)
|
// Step 6. Razoring (omitted at root)
|
||||||
// Step 7. Static null move pruning (omitted at root)
|
// Step 7. Static null move pruning (omitted at root)
|
||||||
|
@ -977,7 +978,7 @@ namespace {
|
||||||
Key posKey;
|
Key posKey;
|
||||||
Move ttMove, move, excludedMove, threatMove;
|
Move ttMove, move, excludedMove, threatMove;
|
||||||
Depth ext, newDepth;
|
Depth ext, newDepth;
|
||||||
Value bestValue, value, evalMargin, oldAlpha;
|
Value bestValue, value, oldAlpha;
|
||||||
Value refinedValue, nullValue, futilityBase, futilityValueScaled; // Non-PV specific
|
Value refinedValue, nullValue, futilityBase, futilityValueScaled; // Non-PV specific
|
||||||
bool isCheck, singleEvasion, singularExtensionNode, moveIsCheck, captureOrPromotion, dangerous;
|
bool isCheck, singleEvasion, singularExtensionNode, moveIsCheck, captureOrPromotion, dangerous;
|
||||||
bool mateThreat = false;
|
bool mateThreat = false;
|
||||||
|
@ -1050,19 +1051,19 @@ namespace {
|
||||||
// Step 5. Evaluate the position statically and
|
// Step 5. Evaluate the position statically and
|
||||||
// update gain statistics of parent move.
|
// update gain statistics of parent move.
|
||||||
if (isCheck)
|
if (isCheck)
|
||||||
ss->eval = evalMargin = VALUE_NONE;
|
ss->eval = ss->evalMargin = VALUE_NONE;
|
||||||
else if (tte)
|
else if (tte)
|
||||||
{
|
{
|
||||||
assert(tte->static_value() != VALUE_NONE);
|
assert(tte->static_value() != VALUE_NONE);
|
||||||
|
|
||||||
ss->eval = tte->static_value();
|
ss->eval = tte->static_value();
|
||||||
evalMargin = tte->static_value_margin();
|
ss->evalMargin = tte->static_value_margin();
|
||||||
refinedValue = refine_eval(tte, ss->eval, ply);
|
refinedValue = refine_eval(tte, ss->eval, ply);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
refinedValue = ss->eval = evaluate(pos, evalMargin);
|
refinedValue = ss->eval = evaluate(pos, ss->evalMargin);
|
||||||
TT.store(posKey, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, MOVE_NONE, ss->eval, evalMargin);
|
TT.store(posKey, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, MOVE_NONE, ss->eval, ss->evalMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save gain for the parent non-capture move
|
// Save gain for the parent non-capture move
|
||||||
|
@ -1187,8 +1188,8 @@ split_start:
|
||||||
MovePicker& mp = SplitPoint ? *ss->sp->mp : mpBase;
|
MovePicker& mp = SplitPoint ? *ss->sp->mp : mpBase;
|
||||||
CheckInfo ci(pos);
|
CheckInfo ci(pos);
|
||||||
ss->bestMove = MOVE_NONE;
|
ss->bestMove = MOVE_NONE;
|
||||||
singleEvasion = SplitPoint ? false : isCheck && mp.number_of_evasions() == 1;
|
singleEvasion = !SplitPoint && isCheck && mp.number_of_evasions() == 1;
|
||||||
futilityBase = SplitPoint ? ss->eval : ss->eval + evalMargin;
|
futilityBase = ss->eval + ss->evalMargin;
|
||||||
singularExtensionNode = !SplitPoint
|
singularExtensionNode = !SplitPoint
|
||||||
&& depth >= SingularExtensionDepth[PvNode]
|
&& depth >= SingularExtensionDepth[PvNode]
|
||||||
&& tte
|
&& tte
|
||||||
|
@ -1429,7 +1430,7 @@ split_start:
|
||||||
|
|
||||||
ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT);
|
ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT);
|
||||||
move = (bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove);
|
move = (bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove);
|
||||||
TT.store(posKey, value_to_tt(bestValue, ply), vt, depth, move, ss->eval, evalMargin);
|
TT.store(posKey, value_to_tt(bestValue, ply), vt, depth, move, ss->eval, ss->evalMargin);
|
||||||
|
|
||||||
// Update killers and history only for non capture moves that fails high
|
// Update killers and history only for non capture moves that fails high
|
||||||
if ( bestValue >= beta
|
if ( bestValue >= beta
|
||||||
|
@ -2635,7 +2636,7 @@ split_start:
|
||||||
|
|
||||||
// Initialize search stack
|
// Initialize search stack
|
||||||
init_ss_array(ss, PLY_MAX_PLUS_2);
|
init_ss_array(ss, PLY_MAX_PLUS_2);
|
||||||
ss[0].eval = VALUE_NONE;
|
ss[0].eval = ss[0].evalMargin = VALUE_NONE;
|
||||||
count = 0;
|
count = 0;
|
||||||
|
|
||||||
// Generate all legal moves
|
// Generate all legal moves
|
||||||
|
|
|
@ -57,6 +57,7 @@ struct SearchStack {
|
||||||
Move killers[2];
|
Move killers[2];
|
||||||
Depth reduction;
|
Depth reduction;
|
||||||
Value eval;
|
Value eval;
|
||||||
|
Value evalMargin;
|
||||||
bool skipNullMove;
|
bool skipNullMove;
|
||||||
SplitPoint* sp;
|
SplitPoint* sp;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue