From 19ff8e29026523e2d3c47f6542d564fe9cf537e6 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sat, 16 Oct 2010 11:54:44 +0100 Subject: [PATCH] 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 --- src/search.cpp | 23 ++++++++++++----------- src/search.h | 1 + 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 64b8dd0e..1a63299e 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -717,7 +717,7 @@ namespace { int64_t nodes; Move move; Depth depth, ext, newDepth; - Value value, evalMargin, alpha, beta; + Value value, alpha, beta; bool isCheck, moveIsCheck, captureOrPromotion, dangerous; int researchCountFH, researchCountFL; @@ -736,7 +736,8 @@ namespace { // Step 5. Evaluate the position statically // 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 7. Static null move pruning (omitted at root) @@ -977,7 +978,7 @@ namespace { Key posKey; Move ttMove, move, excludedMove, threatMove; Depth ext, newDepth; - Value bestValue, value, evalMargin, oldAlpha; + Value bestValue, value, oldAlpha; Value refinedValue, nullValue, futilityBase, futilityValueScaled; // Non-PV specific bool isCheck, singleEvasion, singularExtensionNode, moveIsCheck, captureOrPromotion, dangerous; bool mateThreat = false; @@ -1050,19 +1051,19 @@ namespace { // Step 5. Evaluate the position statically and // update gain statistics of parent move. if (isCheck) - ss->eval = evalMargin = VALUE_NONE; + ss->eval = ss->evalMargin = VALUE_NONE; else if (tte) { assert(tte->static_value() != VALUE_NONE); ss->eval = tte->static_value(); - evalMargin = tte->static_value_margin(); + ss->evalMargin = tte->static_value_margin(); refinedValue = refine_eval(tte, ss->eval, ply); } else { - refinedValue = ss->eval = evaluate(pos, evalMargin); - TT.store(posKey, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, MOVE_NONE, ss->eval, evalMargin); + refinedValue = ss->eval = evaluate(pos, ss->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 @@ -1187,8 +1188,8 @@ split_start: MovePicker& mp = SplitPoint ? *ss->sp->mp : mpBase; CheckInfo ci(pos); ss->bestMove = MOVE_NONE; - singleEvasion = SplitPoint ? false : isCheck && mp.number_of_evasions() == 1; - futilityBase = SplitPoint ? ss->eval : ss->eval + evalMargin; + singleEvasion = !SplitPoint && isCheck && mp.number_of_evasions() == 1; + futilityBase = ss->eval + ss->evalMargin; singularExtensionNode = !SplitPoint && depth >= SingularExtensionDepth[PvNode] && tte @@ -1429,7 +1430,7 @@ split_start: ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT); 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 if ( bestValue >= beta @@ -2635,7 +2636,7 @@ split_start: // Initialize search stack init_ss_array(ss, PLY_MAX_PLUS_2); - ss[0].eval = VALUE_NONE; + ss[0].eval = ss[0].evalMargin = VALUE_NONE; count = 0; // Generate all legal moves diff --git a/src/search.h b/src/search.h index 5c635478..4bb8b0ad 100644 --- a/src/search.h +++ b/src/search.h @@ -57,6 +57,7 @@ struct SearchStack { Move killers[2]; Depth reduction; Value eval; + Value evalMargin; bool skipNullMove; SplitPoint* sp; }; -- 2.39.2