mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-19 16:46:30 +08:00
Use arrays
for safe checks, outposts and king protectors in evaluate.cpp Tested for non regression on the safe checks https://tests.stockfishchess.org/tests/view/5ef8b75c020eec13834a9596 LLR: 2.95 (-2.94,2.94) {-1.50,0.50} Total: 22256 W: 4283 L: 4143 D: 13830 Ptnml(0-2): 291, 2439, 5588, 2459, 351 Tested for non regression on the safe checks, outposts and king protectors https://tests.stockfishchess.org/tests/view/5ef8e543020eec13834a95e7 LLR: 2.95 (-2.94,2.94) {-1.50,0.50} Total: 28400 W: 5382 L: 5253 D: 17765 Ptnml(0-2): 394, 3078, 7119, 3223, 386 closes https://github.com/official-stockfish/Stockfish/pull/2785 No functional change
This commit is contained in:
committed by
Joost VandeVondele
parent
110068808b
commit
268c00b648
@@ -80,11 +80,11 @@ namespace {
|
|||||||
// KingAttackWeights[PieceType] contains king attack weights by piece type
|
// KingAttackWeights[PieceType] contains king attack weights by piece type
|
||||||
constexpr int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 81, 52, 44, 10 };
|
constexpr int KingAttackWeights[PIECE_TYPE_NB] = { 0, 0, 81, 52, 44, 10 };
|
||||||
|
|
||||||
// Penalties for enemy's safe checks
|
// SafeCheck[PieceType][single/multiple] contains safe check bonus by piece type,
|
||||||
constexpr int QueenSafeCheck = 772;
|
// higher if multiple safe checks are possible for that piece type.
|
||||||
constexpr int RookSafeCheck = 1084;
|
constexpr int SafeCheck[][2] = {
|
||||||
constexpr int BishopSafeCheck = 645;
|
{}, {}, {792, 1283}, {645, 967}, {1084, 1897}, {772, 1119}
|
||||||
constexpr int KnightSafeCheck = 792;
|
};
|
||||||
|
|
||||||
#define S(mg, eg) make_score(mg, eg)
|
#define S(mg, eg) make_score(mg, eg)
|
||||||
|
|
||||||
@@ -106,6 +106,18 @@ namespace {
|
|||||||
S(110,182), S(114,182), S(114,192), S(116,219) }
|
S(110,182), S(114,182), S(114,192), S(116,219) }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// KingProtector[knight/bishop] contains penalty for each distance unit to own king
|
||||||
|
constexpr Score KingProtector[] = { S(8, 9), S(6, 9) };
|
||||||
|
|
||||||
|
// Outpost[knight/bishop] contains bonuses for each knight or bishop occupying a
|
||||||
|
// pawn protected square on rank 4 to 6 which is also safe from a pawn attack.
|
||||||
|
constexpr Score Outpost[] = { S(56, 36), S(30, 23) };
|
||||||
|
|
||||||
|
// PassedRank[Rank] contains a bonus according to the rank of a passed pawn
|
||||||
|
constexpr Score PassedRank[RANK_NB] = {
|
||||||
|
S(0, 0), S(10, 28), S(17, 33), S(15, 41), S(62, 72), S(168, 177), S(276, 260)
|
||||||
|
};
|
||||||
|
|
||||||
// RookOnFile[semiopen/open] contains bonuses for each rook when there is
|
// RookOnFile[semiopen/open] contains bonuses for each rook when there is
|
||||||
// no (friendly) pawn on the rook file.
|
// no (friendly) pawn on the rook file.
|
||||||
constexpr Score RookOnFile[] = { S(19, 7), S(48, 29) };
|
constexpr Score RookOnFile[] = { S(19, 7), S(48, 29) };
|
||||||
@@ -121,23 +133,14 @@ namespace {
|
|||||||
S(0, 0), S(3, 46), S(37, 68), S(42, 60), S(0, 38), S(58, 41)
|
S(0, 0), S(3, 46), S(37, 68), S(42, 60), S(0, 38), S(58, 41)
|
||||||
};
|
};
|
||||||
|
|
||||||
// PassedRank[Rank] contains a bonus according to the rank of a passed pawn
|
|
||||||
constexpr Score PassedRank[RANK_NB] = {
|
|
||||||
S(0, 0), S(10, 28), S(17, 33), S(15, 41), S(62, 72), S(168, 177), S(276, 260)
|
|
||||||
};
|
|
||||||
|
|
||||||
// Assorted bonuses and penalties
|
// Assorted bonuses and penalties
|
||||||
constexpr Score BishopKingProtector = S( 6, 9);
|
|
||||||
constexpr Score BishopOnKingRing = S( 24, 0);
|
constexpr Score BishopOnKingRing = S( 24, 0);
|
||||||
constexpr Score BishopOutpost = S( 30, 23);
|
|
||||||
constexpr Score BishopPawns = S( 3, 7);
|
constexpr Score BishopPawns = S( 3, 7);
|
||||||
constexpr Score BishopXRayPawns = S( 4, 5);
|
constexpr Score BishopXRayPawns = S( 4, 5);
|
||||||
constexpr Score CorneredBishop = S( 50, 50);
|
constexpr Score CorneredBishop = S( 50, 50);
|
||||||
constexpr Score FlankAttacks = S( 8, 0);
|
constexpr Score FlankAttacks = S( 8, 0);
|
||||||
constexpr Score Hanging = S( 69, 36);
|
constexpr Score Hanging = S( 69, 36);
|
||||||
constexpr Score KnightKingProtector = S( 8, 9);
|
|
||||||
constexpr Score KnightOnQueen = S( 16, 11);
|
constexpr Score KnightOnQueen = S( 16, 11);
|
||||||
constexpr Score KnightOutpost = S( 56, 36);
|
|
||||||
constexpr Score LongDiagonalBishop = S( 45, 0);
|
constexpr Score LongDiagonalBishop = S( 45, 0);
|
||||||
constexpr Score MinorBehindPawn = S( 18, 3);
|
constexpr Score MinorBehindPawn = S( 18, 3);
|
||||||
constexpr Score PassedFile = S( 11, 8);
|
constexpr Score PassedFile = S( 11, 8);
|
||||||
@@ -308,7 +311,7 @@ namespace {
|
|||||||
// Bonus if piece is on an outpost square or can reach one
|
// Bonus if piece is on an outpost square or can reach one
|
||||||
bb = OutpostRanks & attackedBy[Us][PAWN] & ~pe->pawn_attacks_span(Them);
|
bb = OutpostRanks & attackedBy[Us][PAWN] & ~pe->pawn_attacks_span(Them);
|
||||||
if (bb & s)
|
if (bb & s)
|
||||||
score += (Pt == KNIGHT) ? KnightOutpost : BishopOutpost;
|
score += Outpost[Pt == BISHOP];
|
||||||
else if (Pt == KNIGHT && bb & b & ~pos.pieces(Us))
|
else if (Pt == KNIGHT && bb & b & ~pos.pieces(Us))
|
||||||
score += ReachableOutpost;
|
score += ReachableOutpost;
|
||||||
|
|
||||||
@@ -317,8 +320,7 @@ namespace {
|
|||||||
score += MinorBehindPawn;
|
score += MinorBehindPawn;
|
||||||
|
|
||||||
// Penalty if the piece is far from the king
|
// Penalty if the piece is far from the king
|
||||||
score -= (Pt == KNIGHT ? KnightKingProtector
|
score -= KingProtector[Pt == BISHOP] * distance(pos.square<KING>(Us), s);
|
||||||
: BishopKingProtector) * distance(pos.square<KING>(Us), s);
|
|
||||||
|
|
||||||
if (Pt == BISHOP)
|
if (Pt == BISHOP)
|
||||||
{
|
{
|
||||||
@@ -420,41 +422,33 @@ namespace {
|
|||||||
b2 = attacks_bb<BISHOP>(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
|
b2 = attacks_bb<BISHOP>(ksq, pos.pieces() ^ pos.pieces(Us, QUEEN));
|
||||||
|
|
||||||
// Enemy rooks checks
|
// Enemy rooks checks
|
||||||
rookChecks = b1 & safe & attackedBy[Them][ROOK];
|
rookChecks = b1 & attackedBy[Them][ROOK] & safe;
|
||||||
if (rookChecks)
|
if (rookChecks)
|
||||||
kingDanger += more_than_one(rookChecks) ? RookSafeCheck * 175/100
|
kingDanger += SafeCheck[ROOK][more_than_one(rookChecks)];
|
||||||
: RookSafeCheck;
|
|
||||||
else
|
else
|
||||||
unsafeChecks |= b1 & attackedBy[Them][ROOK];
|
unsafeChecks |= b1 & attackedBy[Them][ROOK];
|
||||||
|
|
||||||
// Enemy queen safe checks: we count them only if they are from squares from
|
// Enemy queen safe checks: count them only if the checks are from squares from
|
||||||
// which we can't give a rook check, because rook checks are more valuable.
|
// which opponent cannot give a rook check, because rook checks are more valuable.
|
||||||
queenChecks = (b1 | b2)
|
queenChecks = (b1 | b2) & attackedBy[Them][QUEEN] & safe
|
||||||
& attackedBy[Them][QUEEN]
|
& ~(attackedBy[Us][QUEEN] | rookChecks);
|
||||||
& safe
|
|
||||||
& ~attackedBy[Us][QUEEN]
|
|
||||||
& ~rookChecks;
|
|
||||||
if (queenChecks)
|
if (queenChecks)
|
||||||
kingDanger += more_than_one(queenChecks) ? QueenSafeCheck * 145/100
|
kingDanger += SafeCheck[QUEEN][more_than_one(queenChecks)];
|
||||||
: QueenSafeCheck;
|
|
||||||
|
|
||||||
// Enemy bishops checks: we count them only if they are from squares from
|
// Enemy bishops checks: count them only if they are from squares from which
|
||||||
// which we can't give a queen check, because queen checks are more valuable.
|
// opponent cannot give a queen check, because queen checks are more valuable.
|
||||||
bishopChecks = b2
|
bishopChecks = b2 & attackedBy[Them][BISHOP] & safe
|
||||||
& attackedBy[Them][BISHOP]
|
|
||||||
& safe
|
|
||||||
& ~queenChecks;
|
& ~queenChecks;
|
||||||
if (bishopChecks)
|
if (bishopChecks)
|
||||||
kingDanger += more_than_one(bishopChecks) ? BishopSafeCheck * 3/2
|
kingDanger += SafeCheck[BISHOP][more_than_one(bishopChecks)];
|
||||||
: BishopSafeCheck;
|
|
||||||
else
|
else
|
||||||
unsafeChecks |= b2 & attackedBy[Them][BISHOP];
|
unsafeChecks |= b2 & attackedBy[Them][BISHOP];
|
||||||
|
|
||||||
// Enemy knights checks
|
// Enemy knights checks
|
||||||
knightChecks = attacks_bb<KNIGHT>(ksq) & attackedBy[Them][KNIGHT];
|
knightChecks = attacks_bb<KNIGHT>(ksq) & attackedBy[Them][KNIGHT];
|
||||||
if (knightChecks & safe)
|
if (knightChecks & safe)
|
||||||
kingDanger += more_than_one(knightChecks & safe) ? KnightSafeCheck * 162/100
|
kingDanger += SafeCheck[KNIGHT][more_than_one(knightChecks & safe)];
|
||||||
: KnightSafeCheck;
|
|
||||||
else
|
else
|
||||||
unsafeChecks |= knightChecks;
|
unsafeChecks |= knightChecks;
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,9 @@ namespace {
|
|||||||
constexpr Score WeakLever = S( 0, 56);
|
constexpr Score WeakLever = S( 0, 56);
|
||||||
constexpr Score WeakUnopposed = S(13, 27);
|
constexpr Score WeakUnopposed = S(13, 27);
|
||||||
|
|
||||||
constexpr Score BlockedStorm[RANK_NB] = {S( 0, 0), S( 0, 0), S( 76, 78), S(-10, 15), S(-7, 10), S(-4, 6), S(-1, 2)};
|
constexpr Score BlockedStorm[RANK_NB] = {
|
||||||
|
S(0, 0), S(0, 0), S(76, 78), S(-10, 15), S(-7, 10), S(-4, 6), S(-1, 2)
|
||||||
|
};
|
||||||
|
|
||||||
// Connected pawn bonus
|
// Connected pawn bonus
|
||||||
constexpr int Connected[RANK_NB] = { 0, 7, 8, 12, 29, 48, 86 };
|
constexpr int Connected[RANK_NB] = { 0, 7, 8, 12, 29, 48, 86 };
|
||||||
|
|||||||
Reference in New Issue
Block a user