- // Evaluation grain size, must be a power of 2
- const int GrainSize = 8;
-
- // Evaluation weights, initialized from UCI options
- enum { Mobility, PassedPawns, Space, KingDangerUs, KingDangerThem };
- Score Weights[6];
-
- typedef Value V;
- #define S(mg, eg) make_score(mg, eg)
-
- // Internal evaluation weights. These are applied on top of the evaluation
- // weights read from UCI parameters. The purpose is to be able to change
- // the evaluation weights while keeping the default values of the UCI
- // parameters at 100, which looks prettier.
- //
- // Values modified by Joona Kiiski
- const Score WeightsInternal[] = {
- S(289, 344), S(221, 273), S(46, 0), S(271, 0), S(307, 0)
- };
-
- // MobilityBonus[PieceType][attacked] contains mobility bonuses for middle and
- // end game, indexed by piece type and number of attacked squares not occupied
- // by friendly pieces.
- const Score MobilityBonus[][32] = {
- {}, {},
- { S(-38,-33), S(-25,-23), S(-12,-13), S( 0, -3), S(12, 7), S(25, 17), // Knights
- S( 31, 22), S( 38, 27), S( 38, 27) },
- { S(-25,-30), S(-11,-16), S( 3, -2), S(17, 12), S(31, 26), S(45, 40), // Bishops
- S( 57, 52), S( 65, 60), S( 71, 65), S(74, 69), S(76, 71), S(78, 73),
- S( 79, 74), S( 80, 75), S( 81, 76), S(81, 76) },
- { S(-20,-36), S(-14,-19), S( -8, -3), S(-2, 13), S( 4, 29), S(10, 46), // Rooks
- S( 14, 62), S( 19, 79), S( 23, 95), S(26,106), S(27,111), S(28,114),
- S( 29,116), S( 30,117), S( 31,118), S(32,118) },
- { S(-10,-18), S( -8,-13), S( -6, -7), S(-3, -2), S(-1, 3), S( 1, 8), // Queens
- S( 3, 13), S( 5, 19), S( 8, 23), S(10, 27), S(12, 32), S(15, 34),
- S( 16, 35), S( 17, 35), S( 18, 35), S(20, 35), S(20, 35), S(20, 35),
- S( 20, 35), S( 20, 35), S( 20, 35), S(20, 35), S(20, 35), S(20, 35),
- S( 20, 35), S( 20, 35), S( 20, 35), S(20, 35), S(20, 35), S(20, 35),
- S( 20, 35), S( 20, 35) }
- };
-
- // OutpostBonus[PieceType][Square] contains outpost bonuses of knights and
- // bishops, indexed by piece type and square (from white's point of view).
- const Value OutpostBonus[][SQUARE_NB] = {
- {
- // A B C D E F G H
- V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // Knights
- V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0),
- V(0), V(0), V(4), V(8), V(8), V(4), V(0), V(0),
- V(0), V(4),V(17),V(26),V(26),V(17), V(4), V(0),
- V(0), V(8),V(26),V(35),V(35),V(26), V(8), V(0),
- V(0), V(4),V(17),V(17),V(17),V(17), V(4), V(0) },
- {
- V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0), // Bishops
- V(0), V(0), V(0), V(0), V(0), V(0), V(0), V(0),
- V(0), V(0), V(5), V(5), V(5), V(5), V(0), V(0),
- V(0), V(5),V(10),V(10),V(10),V(10), V(5), V(0),
- V(0),V(10),V(21),V(21),V(21),V(21),V(10), V(0),
- V(0), V(5), V(8), V(8), V(8), V(8), V(5), V(0) }
- };
-
- // ThreatBonus[attacking][attacked] contains threat bonuses according to
- // which piece type attacks which one.
- const Score ThreatBonus[][PIECE_TYPE_NB] = {
- {}, {},
- { S(0, 0), S( 7, 39), S( 0, 0), S(24, 49), S(41,100), S(41,100) }, // KNIGHT
- { S(0, 0), S( 7, 39), S(24, 49), S( 0, 0), S(41,100), S(41,100) }, // BISHOP
- { S(0, 0), S( 0, 22), S(15, 49), S(15, 49), S( 0, 0), S(24, 49) }, // ROOK
- { S(0, 0), S(15, 39), S(15, 39), S(15, 39), S(15, 39), S( 0, 0) } // QUEEN
- };
-
- // ThreatenedByPawnPenalty[PieceType] contains a penalty according to which
- // piece type is attacked by an enemy pawn.
- const Score ThreatenedByPawnPenalty[] = {
- S(0, 0), S(0, 0), S(56, 70), S(56, 70), S(76, 99), S(86, 118)
- };
-
- #undef S
-
- const Score BishopPinBonus = make_score(66, 11);
-
- // Bonus for having the side to move (modified by Joona Kiiski)
- const Score Tempo = make_score(24, 11);
-
- // Rooks and queens on the 7th rank
- const Score RookOn7thBonus = make_score(11, 20);
- const Score QueenOn7thBonus = make_score( 3, 8);
-
- // Rooks and queens attacking pawns on the same rank
- const Score RookOnPawnBonus = make_score(10, 28);
- const Score QueenOnPawnBonus = make_score( 4, 20);
-
- // Rooks on open files (modified by Joona Kiiski)
- const Score RookOpenFileBonus = make_score(43, 21);
- const Score RookHalfOpenFileBonus = make_score(19, 10);
-
- // Penalty for rooks trapped inside a friendly king which has lost the
- // right to castle.
- const Value TrappedRookPenalty = Value(180);
-
- // Penalty for bishop with pawns on the same coloured squares
- const Score BishopPawnsPenalty = make_score(8, 12);
-
- // Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
- // a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
- // happen in Chess960 games.
- const Score TrappedBishopA1H1Penalty = make_score(100, 100);
-
- // Penalty for an undefended bishop or knight
- const Score UndefendedMinorPenalty = make_score(25, 10);
-
- // The SpaceMask[Color] contains the area of the board which is considered
- // by the space evaluation. In the middle game, each side is given a bonus
- // based on how many squares inside this area are safe and available for
- // friendly minor pieces.
- const Bitboard SpaceMask[] = {
- (1ULL << SQ_C2) | (1ULL << SQ_D2) | (1ULL << SQ_E2) | (1ULL << SQ_F2) |
- (1ULL << SQ_C3) | (1ULL << SQ_D3) | (1ULL << SQ_E3) | (1ULL << SQ_F3) |
- (1ULL << SQ_C4) | (1ULL << SQ_D4) | (1ULL << SQ_E4) | (1ULL << SQ_F4),
- (1ULL << SQ_C7) | (1ULL << SQ_D7) | (1ULL << SQ_E7) | (1ULL << SQ_F7) |
- (1ULL << SQ_C6) | (1ULL << SQ_D6) | (1ULL << SQ_E6) | (1ULL << SQ_F6) |
- (1ULL << SQ_C5) | (1ULL << SQ_D5) | (1ULL << SQ_E5) | (1ULL << SQ_F5)
- };
-
- // King danger constants and variables. The king danger scores are taken
- // from the KingDangerTable[]. Various little "meta-bonuses" measuring
- // the strength of the enemy attack are added up into an integer, which
- // is used as an index to KingDangerTable[].
- //
- // KingAttackWeights[PieceType] contains king attack weights by piece type
- const int KingAttackWeights[] = { 0, 0, 2, 2, 3, 5 };
-
- // Bonuses for enemy's safe checks
- const int QueenContactCheckBonus = 6;
- const int RookContactCheckBonus = 4;
- const int QueenCheckBonus = 3;
- const int RookCheckBonus = 2;
- const int BishopCheckBonus = 1;
- const int KnightCheckBonus = 1;
-
- // InitKingDanger[Square] contains penalties based on the position of the
- // defending king, indexed by king's square (from white's point of view).
- const int InitKingDanger[] = {
- 2, 0, 2, 5, 5, 2, 0, 2,
- 2, 2, 4, 8, 8, 4, 2, 2,
- 7, 10, 12, 12, 12, 12, 10, 7,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15
- };
-
- // KingDangerTable[Color][attackUnits] contains the actual king danger
- // weighted scores, indexed by color and by a calculated integer number.
- Score KingDangerTable[COLOR_NB][128];
-
- // TracedTerms[Color][PieceType || TracedType] contains a breakdown of the
- // evaluation terms, used when tracing.
- Score TracedScores[COLOR_NB][16];
- std::stringstream TraceStream;
-
- enum TracedType {
- PST = 8, IMBALANCE = 9, MOBILITY = 10, THREAT = 11,
- PASSED = 12, UNSTOPPABLE = 13, SPACE = 14, TOTAL = 15
- };
-
- // Function prototypes
- template<bool Trace>
- Value do_evaluate(const Position& pos, Value& margin, Info& ei);
-
- template<Color Us>
- void init_eval_info(const Position& pos, Info& ei);
-
- template<Color Us, bool Trace>
- Score evaluate_pieces_of_color(const Position& pos, Info& ei, Score& mobility);
-
- template<Color Us, bool Trace>
- Score evaluate_king(const Position& pos, Info& ei, Value margins[]);
-
- template<Color Us>
- Score evaluate_threats(const Position& pos, Info& ei);
-
- template<Color Us>
- int evaluate_space(const Position& pos, Info& ei);
-
- template<Color Us>
- Score evaluate_passed_pawns(const Position& pos, Info& ei);
-
- Score evaluate_unstoppable_pawns(const Position& pos, Info& ei);
-
- Value interpolate(const Score& v, Phase ph, ScaleFactor sf);
- Score weight_option(const std::string& mgOpt, const std::string& egOpt, Score internalWeight);
- double to_cp(Value v);
- void trace_add(int idx, Score term_w, Score term_b = SCORE_ZERO);
- void trace_row(const char* name, int idx);
-}