It will be more clear when we will go to add stuff
apart from king danger itself.
No functional change.
Signed-off-by: Marco Costalba <mcostalba@gmail.com>
attackUnits = Min(99, Max(0, attackUnits));
// Finally, extract the king danger score from the KingDangerTable[]
attackUnits = Min(99, Max(0, attackUnits));
// Finally, extract the king danger score from the KingDangerTable[]
- // array and subtract the score from evaluation. Set also ei.kingDanger[]
+ // array and subtract the score from evaluation. Set also ei.margin[]
// value that will be used for pruning because this value can sometimes
// be very big, and so capturing a single attacking piece can therefore
// result in a score change far bigger than the value of the captured piece.
ei.value -= Sign[Us] * KingDangerTable[Us][attackUnits];
// value that will be used for pruning because this value can sometimes
// be very big, and so capturing a single attacking piece can therefore
// result in a score change far bigger than the value of the captured piece.
ei.value -= Sign[Us] * KingDangerTable[Us][attackUnits];
- ei.kingDanger[Us] = mg_value(KingDangerTable[Us][attackUnits]);
+ ei.margin[Us] = mg_value(KingDangerTable[Us][attackUnits]);
- ei.kingDanger[Us] = VALUE_ZERO;
+ ei.margin[Us] = VALUE_ZERO;
- EvalInfo() { kingDanger[0] = kingDanger[1] = VALUE_ZERO; }
+ EvalInfo() { margin[WHITE] = margin[BLACK] = VALUE_ZERO; }
// Middle game and endgame evaluations
Score value;
// Middle game and endgame evaluations
Score value;
// 2 to kingAdjacentZoneAttacksCount[BLACK].
int kingAdjacentZoneAttacksCount[2];
// 2 to kingAdjacentZoneAttacksCount[BLACK].
int kingAdjacentZoneAttacksCount[2];
- // Value of the danger for the king of the given color
- Value kingDanger[2];
+ // Value of the score margin we should consider for the given color
+ Value margin[2];
if (!PvNode && tte && ok_to_use_TT(tte, depth, beta, ply))
{
// Refresh tte entry to avoid aging
if (!PvNode && tte && ok_to_use_TT(tte, depth, beta, ply))
{
// Refresh tte entry to avoid aging
- TT.store(posKey, tte->value(), tte->type(), tte->depth(), ttMove, tte->static_value(), tte->king_danger());
+ TT.store(posKey, tte->value(), tte->type(), tte->depth(), ttMove, tte->static_value(), tte->static_value_margin());
ss->bestMove = ttMove; // Can be MOVE_NONE
return value_from_tt(tte->value(), ply);
ss->bestMove = ttMove; // Can be MOVE_NONE
return value_from_tt(tte->value(), ply);
assert(tte->static_value() != VALUE_NONE);
ss->eval = tte->static_value();
assert(tte->static_value() != VALUE_NONE);
ss->eval = tte->static_value();
- ei.kingDanger[pos.side_to_move()] = tte->king_danger();
+ ei.margin[pos.side_to_move()] = tte->static_value_margin();
refinedValue = refine_eval(tte, ss->eval, ply);
}
else
{
refinedValue = ss->eval = evaluate(pos, ei);
refinedValue = refine_eval(tte, ss->eval, ply);
}
else
{
refinedValue = ss->eval = evaluate(pos, ei);
- TT.store(posKey, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, MOVE_NONE, ss->eval, ei.kingDanger[pos.side_to_move()]);
+ TT.store(posKey, VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, MOVE_NONE, ss->eval, ei.margin[pos.side_to_move()]);
}
// Save gain for the parent non-capture move
}
// Save gain for the parent non-capture move
ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT);
move = (bestValue <= oldAlpha ? MOVE_NONE : ss->bestMove);
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, ei.kingDanger[pos.side_to_move()]);
+ TT.store(posKey, value_to_tt(bestValue, ply), vt, depth, move, ss->eval, ei.margin[pos.side_to_move()]);
// Update killers and history only for non capture moves that fails high
if ( bestValue >= beta
// Update killers and history only for non capture moves that fails high
if ( bestValue >= beta
{
assert(tte->static_value() != VALUE_NONE);
{
assert(tte->static_value() != VALUE_NONE);
- ei.kingDanger[pos.side_to_move()] = tte->king_danger();
+ ei.margin[pos.side_to_move()] = tte->static_value_margin();
bestValue = tte->static_value();
}
else
bestValue = tte->static_value();
}
else
if (bestValue >= beta)
{
if (!tte)
if (bestValue >= beta)
{
if (!tte)
- TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, DEPTH_NONE, MOVE_NONE, ss->eval, ei.kingDanger[pos.side_to_move()]);
+ TT.store(pos.get_key(), value_to_tt(bestValue, ply), VALUE_TYPE_LOWER, DEPTH_NONE, MOVE_NONE, ss->eval, ei.margin[pos.side_to_move()]);
deepChecks = (depth == -ONE_PLY && bestValue >= beta - PawnValueMidgame / 8);
// Futility pruning parameters, not needed when in check
deepChecks = (depth == -ONE_PLY && bestValue >= beta - PawnValueMidgame / 8);
// Futility pruning parameters, not needed when in check
- futilityBase = bestValue + FutilityMarginQS + ei.kingDanger[pos.side_to_move()];
+ futilityBase = bestValue + FutilityMarginQS + ei.margin[pos.side_to_move()];
enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
}
enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
}
// Update transposition table
Depth d = (depth == DEPTH_ZERO ? DEPTH_ZERO : DEPTH_ZERO - ONE_PLY);
ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT);
// Update transposition table
Depth d = (depth == DEPTH_ZERO ? DEPTH_ZERO : DEPTH_ZERO - ONE_PLY);
ValueType vt = (bestValue <= oldAlpha ? VALUE_TYPE_UPPER : bestValue >= beta ? VALUE_TYPE_LOWER : VALUE_TYPE_EXACT);
- TT.store(pos.get_key(), value_to_tt(bestValue, ply), vt, d, ss->bestMove, ss->eval, ei.kingDanger[pos.side_to_move()]);
+ TT.store(pos.get_key(), value_to_tt(bestValue, ply), vt, d, ss->bestMove, ss->eval, ei.margin[pos.side_to_move()]);
// Update killers only for checking moves that fails high
if ( bestValue >= beta
// Update killers only for checking moves that fails high
if ( bestValue >= beta
if (!tte || tte->move() != pv[i])
{
v = (p.is_check() ? VALUE_NONE : evaluate(p, ei));
if (!tte || tte->move() != pv[i])
{
v = (p.is_check() ? VALUE_NONE : evaluate(p, ei));
- TT.store(p.get_key(), VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, pv[i], v, ei.kingDanger[pos.side_to_move()]);
+ TT.store(p.get_key(), VALUE_NONE, VALUE_TYPE_NONE, DEPTH_NONE, pv[i], v, ei.margin[pos.side_to_move()]);
}
p.do_move(pv[i], st);
}
}
p.do_move(pv[i], st);
}
/// bit 64-79: value
/// bit 80-95: depth
/// bit 96-111: static value
/// bit 64-79: value
/// bit 80-95: depth
/// bit 96-111: static value
-/// bit 112-127: king danger value
+/// bit 112-127: margin of static value
///
/// the 32 bits of the data field are so defined
///
///
/// the 32 bits of the data field are so defined
///
value16 = int16_t(v);
depth16 = int16_t(d);
staticValue = int16_t(statV);
value16 = int16_t(v);
depth16 = int16_t(d);
staticValue = int16_t(statV);
- kingDanger = int16_t(kd);
+ staticValueMargin = int16_t(kd);
}
uint32_t key() const { return key32; }
}
uint32_t key() const { return key32; }
ValueType type() const { return ValueType((data >> 21) & 3); }
int generation() const { return data >> 23; }
Value static_value() const { return Value(staticValue); }
ValueType type() const { return ValueType((data >> 21) & 3); }
int generation() const { return data >> 23; }
Value static_value() const { return Value(staticValue); }
- Value king_danger() const { return Value(kingDanger); }
+ Value static_value_margin() const { return Value(staticValueMargin); }
int16_t value16;
int16_t depth16;
int16_t staticValue;
int16_t value16;
int16_t depth16;
int16_t staticValue;
+ int16_t staticValueMargin;