Skip to content

Commit

Permalink
Tuned values after 505k games
Browse files Browse the repository at this point in the history
Various king and pawn tuned eval values after 505k 60 sec 600 nodes time
SPSA games. Adjusted passed rank and file values to be symmetrical.

Passed LTC (after passed rank/file adjustment):
LLR: 2.95 (-2.94,2.94) [0.00,4.00]
Total: 37906 W: 6953 L: 6668 D: 24285
http://tests.stockfishchess.org/tests/view/5b2790960ebc5902b8d17ba1

A previous, very similar version with raw tuned values passed STC and LTC:

STC:
LLR: 2.95 (-2.94,2.94) [0.00,4.00]
Total: 39515 W: 9227 L: 8900 D: 21388
http://tests.stockfishchess.org/tests/view/5b277e3e0ebc5902b8d17ac9

LTC:
LLR: 2.95 (-2.94,2.94) [0.00,4.00]
Total: 14618 W: 2743 L: 2537 D: 9338
http://tests.stockfishchess.org/tests/view/5b2785020ebc5902b8d17b98

Closes #1654

bench: 4777396
  • Loading branch information
candirufish authored and snicolet committed Jun 21, 2018
1 parent 06a853e commit 062eb07
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 31 deletions.
36 changes: 17 additions & 19 deletions src/evaluate.cpp
Expand Up @@ -142,45 +142,45 @@ namespace {

// ThreatByKing[on one/on many] contains bonuses for king attacks on
// pawns or pieces which are not pawn-defended.
constexpr Score ThreatByKing[] = { S(3, 65), S(9, 145) };
constexpr Score ThreatByKing[] = { S(25, 57), S(4, 139) };

// PassedRank[Rank] contains a bonus according to the rank of a passed pawn
constexpr Score PassedRank[RANK_NB] = {
S(0, 0), S(5, 7), S(5, 13), S(18, 23), S(74, 58), S(164, 166), S(268, 243)
S(0, 0), S(7, 10), S(7, 26), S(14, 31), S(42, 63), S(178, 167), S(279, 244)
};

// PassedFile[File] contains a bonus according to the file of a passed pawn
constexpr Score PassedFile[FILE_NB] = {
S( 15, 7), S(-5, 14), S( 1, -5), S(-22,-11),
S(-22,-11), S( 1, -5), S(-5, 14), S( 15, 7)
S( 17, 6), S(-4, 7), S( 2,-12), S(-17,-14),
S(-17,-14), S( 2,-12), S(-4, 7), S( 17, 6)
};

// PassedDanger[Rank] contains a term to weight the passed score
constexpr int PassedDanger[RANK_NB] = { 0, 0, 0, 3, 6, 12, 21 };

// KingProtector[PieceType-2] contains a penalty according to distance from king
constexpr Score KingProtector[] = { S(3, 5), S(4, 3), S(3, 0), S(1, -1) };
constexpr Score KingProtector[] = { S(3, 5), S(5, 3), S(3, 0), S(0, -2) };

// Assorted bonuses and penalties
constexpr Score BishopPawns = S( 3, 5);
constexpr Score CloseEnemies = S( 7, 0);
constexpr Score CloseEnemies = S( 8, 0);
constexpr Score Connectivity = S( 3, 1);
constexpr Score CorneredBishop = S( 50, 50);
constexpr Score Hanging = S( 52, 30);
constexpr Score HinderPassedPawn = S( 8, 1);
constexpr Score HinderPassedPawn = S( 5, 2);
constexpr Score KnightOnQueen = S( 21, 11);
constexpr Score LongDiagonalBishop = S( 22, 0);
constexpr Score MinorBehindPawn = S( 16, 0);
constexpr Score Overload = S( 10, 5);
constexpr Score PawnlessFlank = S( 20, 80);
constexpr Score RookOnPawn = S( 8, 24);
constexpr Score SliderOnQueen = S( 42, 21);
constexpr Score ThreatByPawnPush = S( 47, 26);
constexpr Score ThreatByPawnPush = S( 49, 30);
constexpr Score ThreatByRank = S( 16, 3);
constexpr Score ThreatBySafePawn = S(175,168);
constexpr Score ThreatBySafePawn = S(186,140);
constexpr Score TrappedRook = S( 92, 0);
constexpr Score WeakQueen = S( 50, 10);
constexpr Score WeakUnopposedPawn = S( 5, 25);
constexpr Score WeakUnopposedPawn = S( 14, 19);

#undef S

Expand Down Expand Up @@ -428,7 +428,7 @@ namespace {
// Main king safety evaluation
if (kingAttackersCount[Them] > 1 - pos.count<QUEEN>(Them))
{
int kingDanger = 0;
int kingDanger = -mg_value(score);
unsafeChecks = 0;

// Attacked squares defended at most once by our queen or king
Expand Down Expand Up @@ -474,12 +474,11 @@ namespace {
unsafeChecks &= mobilityArea[Them];

kingDanger += kingAttackersCount[Them] * kingAttackersWeight[Them]
+ 102 * kingAttacksCount[Them]
+ 191 * popcount(kingRing[Us] & weak)
+ 143 * popcount(pos.blockers_for_king(Us) | unsafeChecks)
- 848 * !pos.count<QUEEN>(Them)
- 9 * mg_value(score) / 8

This comment has been minimized.

Copy link
@hazzl

hazzl Jun 22, 2018

I know that the new factor 8 cancelled out with the existing divisor, but the term - mg_value(score) seems to be missing in the commited version.

This comment has been minimized.

Copy link
@snicolet

snicolet Jun 22, 2018

Member

It is now in line 431

+ 40;
+ 64 * kingAttacksCount[Them]
+ 182 * popcount(kingRing[Us] & weak)
+ 128 * popcount(pos.blockers_for_king(Us) | unsafeChecks)
- 857 * !pos.count<QUEEN>(Them)
+ 31 ;

// Transform the kingDanger units into a Score, and subtract it from the evaluation
if (kingDanger > 0)
Expand Down Expand Up @@ -804,10 +803,9 @@ namespace {
if ( pos.opposite_bishops()
&& pos.non_pawn_material(WHITE) == BishopValueMg
&& pos.non_pawn_material(BLACK) == BishopValueMg)
// Endgame with opposite-colored bishops and no other pieces is almost a draw
sf = 31;
else
sf = std::min(40 + (pos.opposite_bishops()? 2 : 7) * pos.count<PAWN>(strongSide), sf);
sf = std::min(40 + (pos.opposite_bishops() ? 2 : 7) * pos.count<PAWN>(strongSide), sf);
}

return ScaleFactor(sf);
Expand Down
24 changes: 12 additions & 12 deletions src/pawns.cpp
Expand Up @@ -32,35 +32,35 @@ namespace {
#define S(mg, eg) make_score(mg, eg)

// Pawn penalties
constexpr Score Isolated = S(13, 16);
constexpr Score Backward = S(17, 11);
constexpr Score Doubled = S(13, 40);
constexpr Score Isolated = S( 6, 16);
constexpr Score Backward = S(15, 21);
constexpr Score Doubled = S( 8, 44);

// Connected pawn bonus by opposed, phalanx, #support and rank
Score Connected[2][2][3][RANK_NB];

// Strength of pawn shelter for our king by [distance from edge][rank].
// RANK_1 = 0 is used for files where we have no pawn, or pawn is behind our king.
constexpr Value ShelterStrength[int(FILE_NB) / 2][RANK_NB] = {
{ V( 7), V(76), V( 84), V( 38), V( 7), V( 30), V(-19) },
{ V(-13), V(83), V( 42), V(-27), V( 2), V(-32), V(-45) },
{ V(-26), V(63), V( 5), V(-44), V( -5), V( 2), V(-59) },
{ V(-19), V(53), V(-11), V(-22), V(-12), V(-51), V(-60) }
{ V( 28), V(79), V( 75), V( 46), V( 14), V( 31), V(-14) },
{ V(-48), V(50), V( 29), V(-21), V(-41), V(-23), V(-45) },
{ V(-25), V(50), V( 17), V(-33), V( -5), V( 9), V(-35) },
{ V(-29), V(57), V(-25), V(-48), V( -4), V(-46), V(-64) }
};

// Danger of enemy pawns moving toward our king by [distance from edge][rank].
// RANK_1 = 0 is used for files where the enemy has no pawn, or their pawn
// is behind our king.
constexpr Value UnblockedStorm[int(FILE_NB) / 2][RANK_NB] = {
{ V( 25), V( 79), V(107), V( 51), V( 27), V( 0), V( 0) },
{ V( 5), V( 35), V(121), V( -2), V( 15), V(-10), V(-10) },
{ V(-20), V( 22), V( 98), V( 36), V( 7), V(-20), V(-20) },
{ V(-27), V( 24), V( 80), V( 25), V( -4), V(-30), V(-30) }
{ V( 34), V( 58), V(113), V( 61), V(37), V( 24), V( 21) },
{ V( 23), V( 46), V( 93), V( 10), V( 2), V(-20), V( 6) },
{ V( -6), V( 22), V(106), V( 28), V( 6), V(-33), V( -1) },
{ V(-17), V( 33), V( 71), V( 14), V(-9), V(-21), V(-16) }
};

// Danger of blocked enemy pawns storming our king, by rank
constexpr Value BlockedStorm[RANK_NB] =
{ V( 0), V( 0), V( 75), V(-10), V(-20), V(-20), V(-20) };
{ V(0), V(0), V( 58), V(-13), V(-22), V(-3), V(-5) };

#undef S
#undef V
Expand Down

1 comment on commit 062eb07

@nickolasreynolds
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than manually adjusting values after the fact, would it be more reasonable to structurally impose the desired symmetries prior to tuning? (Indeed, it seems like the major devs and maintainer agree that certain symmetries must philosophically be correct, so why not make the code reflect that knowledge?)

Please sign in to comment.