diff --git a/src/eval_constants.hpp b/src/eval_constants.hpp index f14fd393..1d0a188a 100644 --- a/src/eval_constants.hpp +++ b/src/eval_constants.hpp @@ -5,185 +5,185 @@ namespace Clockwork { // clang-format off -inline const PParam PAWN_MAT = S(196, 383); -inline const PParam KNIGHT_MAT = S(909, 1020); -inline const PParam BISHOP_MAT = S(950, 1068); -inline const PParam ROOK_MAT = S(1149, 1716); -inline const PParam QUEEN_MAT = S(2679, 2699); -inline const PParam TEMPO_VAL = S(61, 20); - -inline const PParam BISHOP_XRAY_PAWNS = S(-14, 14); -inline const PParam BISHOP_PAIR_VAL = S(54, 198); -inline const PParam ROOK_OPEN_VAL = S(118, -15); -inline const PParam ROOK_SEMIOPEN_VAL = S(46, 26); -inline const PParam MINOR_BEHIND_PAWN = S(12, 40); -inline const PParam RESTRICTED_SQUARES = S(-24, -5); - -inline const PParam DOUBLED_PAWN_VAL = S(-12, -73); -inline const PParam ISOLATED_PAWN_VAL = S(-18, -18); - -inline const PParam POTENTIAL_CHECKER_VAL = S(-52, -20); -inline const PParam OUTPOST_KNIGHT_VAL = S(50, 54); -inline const PParam OUTPOST_BISHOP_VAL = S(58, 35); - -inline const PParam PAWN_PUSH_THREAT_KNIGHT = S(39, 1); -inline const PParam PAWN_PUSH_THREAT_BISHOP = S(47, -18); -inline const PParam PAWN_PUSH_THREAT_ROOK = S(27, 44); -inline const PParam PAWN_PUSH_THREAT_QUEEN = S(63, -40); +inline const PParam PAWN_MAT = S(183, 436); +inline const PParam KNIGHT_MAT = S(836, 1255); +inline const PParam BISHOP_MAT = S(870, 1315); +inline const PParam ROOK_MAT = S(1037, 2101); +inline const PParam QUEEN_MAT = S(2539, 3257); +inline const PParam TEMPO_VAL = S(60, 21); + +inline const PParam BISHOP_XRAY_PAWNS = S(-13, 14); +inline const PParam BISHOP_PAIR_VAL = S(53, 220); +inline const PParam ROOK_OPEN_VAL = S(114, -12); +inline const PParam ROOK_SEMIOPEN_VAL = S(44, 31); +inline const PParam MINOR_BEHIND_PAWN = S(14, 40); +inline const PParam RESTRICTED_SQUARES = S(-23, -7); + +inline const PParam DOUBLED_PAWN_VAL = S(-13, -77); +inline const PParam ISOLATED_PAWN_VAL = S(-17, -24); + +inline const PParam POTENTIAL_CHECKER_VAL = S(-50, -24); +inline const PParam OUTPOST_KNIGHT_VAL = S(52, 55); +inline const PParam OUTPOST_BISHOP_VAL = S(57, 39); + +inline const PParam PAWN_PUSH_THREAT_KNIGHT = S(37, 5); +inline const PParam PAWN_PUSH_THREAT_BISHOP = S(45, -15); +inline const PParam PAWN_PUSH_THREAT_ROOK = S(24, 53); +inline const PParam PAWN_PUSH_THREAT_QUEEN = S(62, -42); inline const std::array PAWN_PHALANX = { - S(19, -3), S(32, 27), S(61, 48), S(144, 141), S(382, 208), S(438, 527), + S(16, 3), S(29, 35), S(58, 59), S(137, 167), S(364, 257), S(469, 510), }; inline const std::array DEFENDED_PAWN = { - S(47, 33), S(46, 27), S(63, 50), S(121, 141), S(416, 80), + S(44, 42), S(44, 34), S(60, 60), S(117, 162), S(413, 92), }; inline const std::array PASSED_PAWN = { - S(-108, -184), S(-108, -157), S(-81, -51), S(-23, 45), S(72, 181), S(261, 258), + S(-101, -216), S(-102, -183), S(-77, -62), S(-24, 50), S(64, 211), S(246, 301), }; inline const std::array DEFENDED_PASSED_PUSH = { - S(27, -37), S(21, 2), S(15, 32), S(1, 111), S(82, 202), S(256, 255), + S(27, -41), S(23, -2), S(16, 33), S(5, 119), S(75, 236), S(171, 380), }; inline const std::array BLOCKED_PASSED_PAWN = { - S(13, -17), S(-0, 24), S(-3, -9), S(-1, -39), S(-6, -128), S(-251, -212), + S(15, -25), S(4, 19), S(1, -18), S(1, -46), S(-9, -136), S(-242, -244), }; inline const std::array FRIENDLY_KING_PASSED_PAWN_DISTANCE = { - S(0, 0), S(20, 180), S(-5, 153), S(1, 85), S(8, 51), S(15, 51), S(52, 47), S(45, 29), + S(0, 0), S(18, 206), S(-6, 176), S(1, 97), S(8, 58), S(15, 59), S(52, 55), S(43, 38), }; inline const std::array ENEMY_KING_PASSED_PAWN_DISTANCE = { - S(0, 0), S(-273, -36), S(-10, 35), S(-3, 90), S(39, 113), S(60, 131), S(71, 136), S(51, 134), + S(0, 0), S(-265, -48), S(-8, 34), S(-2, 96), S(35, 126), S(55, 150), S(65, 156), S(43, 155), }; inline const std::array KNIGHT_MOBILITY = { - S(-112, -245), S(-47, -75), S(-15, 13), S(11, 43), S(43, 59), S(60, 88), S(83, 83), S(103, 94), S(148, 6), + S(-102, -298), S(-40, -105), S(-11, -4), S(15, 33), S(44, 54), S(60, 88), S(80, 88), S(100, 98), S(132, 26), }; inline const std::array BISHOP_MOBILITY = { - S(-76, -235), S(-29, -75), S(25, -10), S(48, 36), S(70, 68), S(83, 92), S(88, 110), S(98, 120), S(99, 136), S(117, 117), S(118, 121), S(164, 65), S(159, 72), S(191, 20), + S(-68, -274), S(-20, -99), S(31, -24), S(54, 25), S(75, 62), S(87, 90), S(92, 111), S(100, 123), S(102, 139), S(114, 129), S(118, 129), S(154, 80), S(159, 73), S(183, 26), }; inline const std::array ROOK_MOBILITY = { - S(100, -114), S(15, 45), S(37, 73), S(54, 83), S(64, 96), S(69, 107), S(74, 118), S(81, 121), S(86, 131), S(94, 134), S(102, 135), S(106, 140), S(110, 138), S(123, 109), S(208, 4), + S(105, -146), S(24, 26), S(45, 56), S(61, 67), S(71, 82), S(76, 95), S(81, 107), S(88, 110), S(93, 122), S(101, 125), S(108, 129), S(111, 136), S(113, 136), S(121, 112), S(191, 8), }; inline const std::array QUEEN_MOBILITY = { - S(-126, -82), S(14, -22), S(40, 88), S(61, 193), S(76, 232), S(85, 272), S(91, 302), S(99, 311), S(102, 332), S(104, 348), S(110, 352), S(112, 362), S(117, 360), S(118, 365), S(119, 363), S(116, 363), S(112, 365), S(116, 353), S(121, 341), S(123, 333), S(120, 319), S(138, 278), S(114, 291), S(111, 229), S(81, 223), S(75, 188), S(17, 211), S(27, 161), + S(-163, -72), S(-33, 21), S(-8, 144), S(12, 256), S(27, 300), S(36, 344), S(41, 377), S(49, 385), S(52, 410), S(55, 426), S(61, 431), S(63, 441), S(68, 439), S(68, 446), S(70, 442), S(66, 446), S(64, 442), S(69, 428), S(73, 416), S(77, 403), S(75, 386), S(91, 343), S(73, 349), S(56, 299), S(27, 297), S(12, 268), S(-37, 286), S(-26, 222), }; -inline const PParam PAWN_THREAT_KNIGHT = S(213, 85); -inline const PParam PAWN_THREAT_BISHOP = S(197, 139); -inline const PParam PAWN_THREAT_ROOK = S(197, 125); -inline const PParam PAWN_THREAT_QUEEN = S(180, -9); +inline const PParam PAWN_THREAT_KNIGHT = S(205, 106); +inline const PParam PAWN_THREAT_BISHOP = S(192, 157); +inline const PParam PAWN_THREAT_ROOK = S(197, 133); +inline const PParam PAWN_THREAT_QUEEN = S(179, -15); -inline const PParam KNIGHT_THREAT_BISHOP = S(109, 102); -inline const PParam KNIGHT_THREAT_ROOK = S(227, 73); -inline const PParam KNIGHT_THREAT_QUEEN = S(158, -18); +inline const PParam KNIGHT_THREAT_BISHOP = S(108, 114); +inline const PParam KNIGHT_THREAT_ROOK = S(222, 86); +inline const PParam KNIGHT_THREAT_QUEEN = S(153, -7); -inline const PParam BISHOP_THREAT_KNIGHT = S(101, 60); -inline const PParam BISHOP_THREAT_ROOK = S(212, 125); -inline const PParam BISHOP_THREAT_QUEEN = S(172, 92); +inline const PParam BISHOP_THREAT_KNIGHT = S(97, 72); +inline const PParam BISHOP_THREAT_ROOK = S(207, 142); +inline const PParam BISHOP_THREAT_QUEEN = S(167, 112); inline const std::array BISHOP_PAWNS = { - S(13, -32), S(-1, -5), S(-4, -13), S(-7, -23), S(-11, -32), S(-15, -39), S(-17, -50), S(-23, -51), S(-39, -46), + S(8, -26), S(0, -8), S(-3, -17), S(-6, -27), S(-11, -37), S(-14, -44), S(-16, -57), S(-21, -59), S(-34, -57), }; -inline const PParam ROOK_LINEUP = S(14, 63); +inline const PParam ROOK_LINEUP = S(16, 65); inline const std::array PAWN_PSQT = { - S(229, 181), S(65, 237), S(194, 193), S(174, 171), S(220, 104), S(113, 191), S(55, 229), S(196, 174), // - S(48, 19), S(75, 37), S(73, 16), S(47, -33), S(42, -63), S(21, -18), S(3, 32), S(-28, 58), // - S(23, -16), S(-2, -7), S(29, -45), S(18, -69), S(13, -82), S(-10, -55), S(-56, -11), S(-53, 12), // - S(-10, -63), S(-31, -35), S(-3, -59), S(-14, -66), S(-37, -66), S(-42, -51), S(-100, -14), S(-88, -23), // - S(-10, -91), S(24, -91), S(6, -42), S(-6, -46), S(-35, -53), S(-53, -48), S(-86, -32), S(-86, -39), // - S(11, -89), S(90, -90), S(67, -48), S(27, -16), S(-2, -32), S(-23, -44), S(-56, -25), S(-68, -25), // + S(206, 227), S(51, 280), S(194, 212), S(177, 182), S(221, 108), S(117, 201), S(53, 252), S(193, 191), // + S(42, 30), S(70, 44), S(75, 13), S(54, -52), S(48, -83), S(27, -34), S(7, 23), S(-23, 51), // + S(25, -24), S(3, -18), S(34, -59), S(20, -84), S(16, -99), S(-6, -71), S(-51, -24), S(-48, 3), // + S(-7, -77), S(-26, -49), S(2, -73), S(-11, -80), S(-33, -82), S(-38, -67), S(-92, -31), S(-82, -38), // + S(-6, -108), S(28, -110), S(11, -54), S(-4, -58), S(-32, -67), S(-48, -64), S(-80, -50), S(-80, -56), // + S(15, -107), S(94, -110), S(71, -61), S(30, -25), S(2, -45), S(-20, -58), S(-50, -43), S(-62, -42), // }; inline const std::array KNIGHT_PSQT = { - S(-332, -308), S(-269, 20), S(-251, -88), S(-4, 17), S(-77, 18), S(-230, 35), S(-397, 91), S(-407, -202), // - S(-45, -9), S(-18, 18), S(100, -19), S(107, 2), S(102, 11), S(24, 29), S(-42, 34), S(-66, 13), // - S(23, -11), S(57, -17), S(87, 44), S(103, 44), S(65, 75), S(18, 75), S(8, 17), S(-40, 12), // - S(91, 9), S(103, 30), S(108, 62), S(113, 90), S(118, 93), S(72, 81), S(46, 50), S(34, 21), // - S(71, 9), S(114, -10), S(95, 57), S(90, 73), S(70, 78), S(73, 67), S(60, 15), S(14, 27), // - S(7, -22), S(33, 1), S(30, 43), S(46, 61), S(40, 60), S(9, 44), S(4, 8), S(-36, -25), // - S(24, -17), S(33, -16), S(8, 0), S(16, 21), S(14, 19), S(-11, -27), S(-31, -8), S(-45, -93), // - S(-49, -73), S(-0, -12), S(22, -41), S(38, -35), S(20, -15), S(-15, -41), S(-28, -22), S(-69, -115), // + S(-300, -394), S(-283, 45), S(-234, -188), S(-30, 42), S(-99, 38), S(-235, 34), S(-402, 107), S(-376, -272), // + S(-44, -14), S(-28, 31), S(85, -5), S(85, 28), S(88, 24), S(21, 30), S(-43, 35), S(-63, 6), // + S(25, -20), S(36, 11), S(72, 63), S(90, 59), S(61, 83), S(16, 80), S(5, 19), S(-41, 11), // + S(88, 10), S(96, 42), S(105, 70), S(106, 107), S(112, 109), S(71, 87), S(45, 53), S(30, 27), // + S(68, 12), S(108, -4), S(94, 60), S(89, 79), S(70, 81), S(74, 68), S(57, 18), S(13, 31), // + S(10, -33), S(37, -9), S(37, 32), S(50, 58), S(44, 55), S(16, 33), S(7, -1), S(-33, -34), // + S(27, -25), S(36, -26), S(14, -14), S(21, 10), S(19, 8), S(-7, -39), S(-32, -7), S(-44, -102), // + S(-46, -86), S(6, -26), S(24, -51), S(40, -44), S(23, -24), S(-11, -50), S(-23, -33), S(-66, -129), // }; inline const std::array BISHOP_PSQT = { - S(-161, 84), S(-161, 87), S(-442, 142), S(-288, 85), S(-284, 87), S(-309, 84), S(-214, 86), S(-137, 69), // - S(-53, 11), S(-83, 81), S(-41, 25), S(-96, 53), S(-76, 46), S(-57, 43), S(-20, 35), S(-60, 19), // - S(22, 26), S(17, 41), S(35, 44), S(24, 45), S(2, 45), S(9, 43), S(10, 37), S(5, 17), // - S(9, 6), S(45, 19), S(59, 39), S(66, 73), S(98, 58), S(37, 33), S(37, 4), S(-10, 9), // - S(41, -40), S(51, -3), S(73, 23), S(87, 46), S(69, 56), S(58, 40), S(16, 16), S(7, -17), // - S(60, -26), S(81, -11), S(96, 17), S(62, 39), S(58, 21), S(57, 31), S(62, 12), S(8, 3), // - S(27, -58), S(109, -41), S(71, -20), S(47, 2), S(31, 5), S(43, -26), S(41, -33), S(40, -41), // - S(50, -58), S(32, -28), S(27, 6), S(46, -19), S(31, -9), S(36, 26), S(46, -5), S(41, -34), // + S(-149, 73), S(-170, 105), S(-460, 177), S(-310, 111), S(-317, 126), S(-343, 126), S(-236, 119), S(-125, 54), // + S(-46, -5), S(-85, 86), S(-56, 46), S(-112, 76), S(-89, 64), S(-59, 46), S(-21, 36), S(-58, 14), // + S(21, 24), S(7, 57), S(23, 62), S(17, 56), S(0, 47), S(11, 40), S(10, 36), S(4, 15), // + S(9, 2), S(45, 15), S(58, 39), S(68, 71), S(102, 52), S(38, 29), S(40, -6), S(-8, 2), // + S(43, -52), S(51, -7), S(75, 17), S(90, 39), S(72, 51), S(61, 33), S(18, 9), S(9, -28), // + S(62, -37), S(83, -21), S(99, 10), S(65, 33), S(61, 13), S(60, 22), S(64, 3), S(10, -4), // + S(31, -79), S(112, -56), S(72, -29), S(50, -7), S(34, -5), S(46, -38), S(44, -49), S(42, -54), // + S(52, -74), S(34, -38), S(31, -4), S(48, -31), S(34, -19), S(39, 18), S(48, -14), S(44, -49), // }; inline const std::array ROOK_PSQT = { - S(195, 88), S(231, 97), S(187, 111), S(183, 83), S(221, 76), S(179, 94), S(202, 98), S(182, 107), // - S(84, 159), S(170, 151), S(230, 117), S(170, 130), S(208, 122), S(176, 131), S(120, 160), S(102, 165), // - S(48, 157), S(171, 130), S(218, 89), S(185, 92), S(182, 113), S(136, 137), S(138, 139), S(75, 172), // - S(17, 132), S(108, 125), S(136, 99), S(108, 113), S(142, 99), S(95, 136), S(99, 133), S(25, 161), // - S(-6, 64), S(74, 68), S(65, 81), S(34, 87), S(42, 99), S(35, 118), S(8, 117), S(-8, 113), // - S(9, -7), S(84, 12), S(74, 24), S(51, 28), S(62, 34), S(30, 67), S(39, 45), S(-2, 55), // - S(-86, -2), S(55, -38), S(60, -18), S(48, 5), S(51, 9), S(38, 20), S(30, 7), S(-3, 22), // - S(-23, -18), S(4, 0), S(63, -13), S(74, -17), S(73, -5), S(53, 12), S(49, 8), S(28, 14), // + S(187, 99), S(236, 95), S(184, 119), S(184, 84), S(226, 68), S(181, 94), S(203, 98), S(178, 115), // + S(82, 170), S(168, 160), S(225, 127), S(169, 137), S(206, 127), S(168, 145), S(116, 172), S(97, 178), // + S(48, 167), S(180, 125), S(211, 101), S(185, 95), S(182, 115), S(132, 148), S(135, 149), S(68, 190), // + S(24, 132), S(106, 137), S(134, 107), S(111, 116), S(142, 102), S(95, 143), S(99, 139), S(26, 170), // + S(4, 53), S(80, 61), S(70, 77), S(40, 82), S(48, 94), S(36, 121), S(13, 116), S(-3, 111), // + S(20, -32), S(92, -6), S(79, 14), S(58, 14), S(68, 21), S(36, 58), S(45, 33), S(5, 43), // + S(-74, -26), S(64, -64), S(67, -37), S(55, -10), S(57, -5), S(45, 6), S(35, -7), S(4, 7), // + S(-10, -46), S(16, -24), S(71, -35), S(81, -37), S(81, -27), S(61, -6), S(57, -12), S(37, -6), // }; inline const std::array QUEEN_PSQT = { - S(91, 109), S(188, 43), S(112, 142), S(53, 225), S(91, 182), S(85, 166), S(112, 79), S(36, 148), // - S(70, 168), S(84, 248), S(54, 269), S(-73, 337), S(-30, 328), S(13, 286), S(60, 178), S(36, 180), // - S(39, 202), S(64, 257), S(33, 310), S(0, 315), S(8, 322), S(58, 249), S(76, 188), S(84, 108), // - S(60, 99), S(59, 183), S(11, 250), S(-5, 312), S(9, 325), S(45, 213), S(86, 145), S(59, 120), // - S(61, 66), S(42, 133), S(23, 186), S(-3, 250), S(11, 275), S(27, 228), S(52, 141), S(69, 78), // - S(52, 2), S(67, 44), S(62, 118), S(44, 126), S(46, 149), S(48, 182), S(66, 123), S(60, 74), // - S(26, -110), S(41, -56), S(48, -10), S(76, 14), S(67, 62), S(67, 42), S(37, 83), S(58, 49), // - S(11, -101), S(34, -216), S(62, -214), S(77, -117), S(71, -24), S(77, -65), S(72, -37), S(47, -11), // + S(51, 170), S(144, 97), S(71, 199), S(20, 281), S(55, 236), S(53, 212), S(74, 129), S(1, 203), // + S(50, 195), S(59, 290), S(32, 308), S(-95, 390), S(-59, 388), S(-10, 331), S(38, 208), S(16, 206), // + S(17, 237), S(41, 296), S(20, 343), S(-24, 370), S(-16, 374), S(37, 284), S(55, 215), S(62, 132), // + S(34, 134), S(36, 220), S(-12, 296), S(-25, 357), S(-13, 374), S(20, 255), S(62, 176), S(35, 152), // + S(37, 97), S(24, 156), S(1, 222), S(-21, 286), S(-8, 312), S(6, 262), S(30, 172), S(48, 99), // + S(30, 20), S(45, 66), S(40, 147), S(22, 154), S(25, 180), S(28, 211), S(45, 148), S(38, 97), // + S(3, -96), S(19, -43), S(27, 6), S(53, 36), S(45, 85), S(45, 63), S(18, 101), S(35, 72), // + S(-9, -93), S(15, -226), S(40, -213), S(55, -107), S(50, -7), S(56, -54), S(51, -22), S(26, 6), // }; inline const std::array KING_PSQT = { - S(-63, -202), S(302, 245), S(204, 226), S(72, 120), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(235, 25), S(320, 207), S(187, 221), S(133, 100), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(179, 87), S(236, 170), S(155, 186), S(105, 118), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(12, 36), S(134, 101), S(17, 154), S(-11, 165), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-89, -15), S(-1, 51), S(-58, 105), S(-145, 167), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-30, -46), S(29, 9), S(-64, 78), S(-114, 125), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(19, -86), S(29, -24), S(-45, 24), S(-109, 72), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-28, -173), S(1, -86), S(-81, -45), S(-75, -57), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-62, -294), S(275, 288), S(155, 285), S(-18, 194), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(213, 6), S(265, 239), S(108, 287), S(12, 192), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(132, 116), S(170, 220), S(66, 257), S(-14, 196), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-30, 58), S(63, 152), S(-70, 220), S(-104, 232), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-107, -12), S(-31, 72), S(-110, 143), S(-201, 211), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-24, -60), S(31, 5), S(-71, 88), S(-130, 145), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(36, -114), S(44, -42), S(-32, 15), S(-97, 68), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-9, -214), S(16, -110), S(-66, -64), S(-60, -78), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // }; -inline const PParam KS_NO_QUEEN = S(-80, -563); +inline const PParam KS_NO_QUEEN = S(-86, -542); inline const std::array PT_INNER_RING_ATTACKS = { - S(10, -26), S(14, -27), S(14, -7), S(5, -10), S(1, -30), + S(10, -20), S(15, -27), S(14, -4), S(6, -9), S(1, -30), }; inline const std::array PT_OUTER_RING_ATTACKS = { - S(4, -20), S(6, -28), S(4, -18), S(4, -2), S(4, 7), + S(4, -12), S(6, -23), S(4, -13), S(4, -0), S(4, 7), }; inline const PParam KS_FLANK_ATTACK = S(4, -9); -inline const PParam KS_FLANK_DEFENSE = S(-5, 3); -inline const PParam KS_FLANK_DOUBLE_ATTACK = S(3, -6); -inline const PParam KS_FLANK_DOUBLE_DEFENSE = S(-2, -8); +inline const PParam KS_FLANK_DEFENSE = S(-5, 1); +inline const PParam KS_FLANK_DOUBLE_ATTACK = S(3, -4); +inline const PParam KS_FLANK_DOUBLE_DEFENSE = S(-2, -7); inline const std::array, 4> KING_SHELTER = {{ - {{ S(19, 44), S(-3, 56), S(-1, -14), S(10, -26), S(9, -20), S(-2, -6), S(-2, 57), }}, - {{ S(-1, 168), S(-19, -253), S(-20, 3), S(-8, 50), S(-7, 66), S(-19, -7), S(-18, -238), }}, - {{ S(-2, 146), S(-8, -241), S(-9, 130), S(-3, 109), S(-2, 108), S(-9, 135), S(-7, -215), }}, - {{ S(8, 126), S(-10, 81), S(2, 92), S(8, 70), S(6, 73), S(-0, 92), S(-6, 80), }}, + {{ S(17, 44), S(-4, 54), S(-2, -17), S(9, -20), S(8, -8), S(-3, -4), S(-3, 56), }}, + {{ S(-2, 160), S(-21, -235), S(-21, -4), S(-8, 55), S(-8, 77), S(-19, -12), S(-19, -225), }}, + {{ S(-4, 139), S(-9, -221), S(-10, 131), S(-4, 111), S(-3, 110), S(-10, 136), S(-8, -200), }}, + {{ S(6, 124), S(-11, 85), S(0, 95), S(7, 77), S(5, 79), S(-2, 93), S(-8, 85), }}, }}; inline const std::array BLOCKED_SHELTER_STORM = { - S(0, 0), S(0, 0), S(10, 60), S(-11, 52), S(-10, 78), S(-2, 84), S(3, 31), + S(0, 0), S(0, 0), S(9, 61), S(-11, 47), S(-11, 73), S(-1, 78), S(3, 37), }; inline const std::array, 4> SHELTER_STORM = {{ - {{ S(3, 117), S(-8, 36), S(-9, 37), S(-6, 36), S(-6, 30), S(-8, 35), S(-9, 47), }}, - {{ S(9, 4), S(1, -35), S(-8, -23), S(-3, -55), S(-4, -57), S(-7, -25), S(1, -27), }}, - {{ S(0, 60), S(-4, 35), S(-7, 38), S(-4, 36), S(-3, 19), S(-7, 35), S(-3, 24), }}, - {{ S(-1, 56), S(-7, 35), S(-11, 37), S(-5, 45), S(-4, 46), S(-10, 32), S(-8, 36), }}, + {{ S(2, 116), S(-9, 41), S(-9, 43), S(-6, 37), S(-7, 28), S(-8, 41), S(-9, 49), }}, + {{ S(9, 9), S(1, -24), S(-9, -16), S(-3, -54), S(-4, -51), S(-7, -15), S(1, -19), }}, + {{ S(0, 59), S(-4, 36), S(-7, 40), S(-4, 33), S(-3, 17), S(-8, 37), S(-4, 27), }}, + {{ S(-1, 54), S(-7, 37), S(-11, 37), S(-5, 42), S(-4, 41), S(-10, 32), S(-9, 38), }}, }}; inline TunableSigmoid<32> KING_SAFETY_ACTIVATION( - 1074, 248, -14, 94 + 1056, 267, -15, 92 ); -inline VParam WINNABLE_PAWNS = V(-16); -inline VParam WINNABLE_SYM = V(139); -inline VParam WINNABLE_ASYM = V(125); -inline VParam WINNABLE_PAWN_ENDGAME = V(223); -inline VParam WINNABLE_BIAS = V(-653); +inline VParam WINNABLE_PAWNS = V(-24); +inline VParam WINNABLE_SYM = V(126); +inline VParam WINNABLE_ASYM = V(108); +inline VParam WINNABLE_PAWN_ENDGAME = V(191); +inline VParam WINNABLE_BIAS = V(-487); -// Epoch duration: 6.07503s +// Epoch duration: 5.23206s // clang-format on } // namespace Clockwork diff --git a/src/eval_types.hpp b/src/eval_types.hpp index 84ba789e..cc680ce9 100644 --- a/src/eval_types.hpp +++ b/src/eval_types.hpp @@ -101,6 +101,13 @@ class PScore { return static_cast((mg() * alpha + eg() * (max - alpha)) / max); } + // Eg scaling + template + PScore scale_eg(i32 alpha) const { + assert(0 <= alpha && alpha <= max); + return PScore{mg(), static_cast(eg() * alpha / max)}; + } + // complexity_add PScore complexity_add(Score val) { const Score e = eg(); diff --git a/src/evaluation.cpp b/src/evaluation.cpp index 83600339..633d9650 100644 --- a/src/evaluation.cpp +++ b/src/evaluation.cpp @@ -495,6 +495,16 @@ PScore apply_winnable(const Position& pos, PScore& score, usize phase) { return score.complexity_add(winnable); } +PScore apply_eg_scale(const Position& pos, PScore& eval) { + // Strong pawn scaling + const Color strong_side = eval.eg() > 0 ? Color::White : Color::Black; + + const isize strong_pawn_count = pos.ipiece_count(strong_side, PieceType::Pawn); + const isize pcmul = 8 - strong_pawn_count; + + return eval.scale_eg<128>(static_cast(128 - pcmul * pcmul)); // 64 - 128 +} + Score evaluate_white_pov(const Position& pos, const PsqtState& psqt_state) { const Color us = pos.active_color(); usize phase = pos.piece_count(Color::White, PieceType::Knight) @@ -542,6 +552,9 @@ Score evaluate_white_pov(const Position& pos, const PsqtState& psqt_state) { // Winnable eval = apply_winnable(pos, eval, phase); + // Eg scaling + eval = apply_eg_scale(pos, eval); + return static_cast(eval.phase<24>(static_cast(phase))); }; diff --git a/src/tuning/graph.cpp b/src/tuning/graph.cpp index 87d84066..1bfb54d6 100644 --- a/src/tuning/graph.cpp +++ b/src/tuning/graph.cpp @@ -165,6 +165,9 @@ PairHandle Graph::record_pair_scalar(OpType op, PairHandle lhs, f64 scalar) { case OpType::ScalarDivPair: res = f64x2::scalar_div(scalar, l); break; + case OpType::ScaleEg: + res = f64x2::make(l.first(), l.second() * scalar); + break; default: break; } @@ -474,6 +477,12 @@ void Graph::backward() { pair_grads[node.lhs()] = f64x2::add(pair_grads[node.lhs()], update); break; } + case OpType::ScaleEg: { + const f64x2 grad_out = pair_grads[out_idx]; + f64x2 update = f64x2::make(grad_out.first(), grad_out.second() * node.scalar()); + pair_grads[node.lhs()] = f64x2::add(pair_grads[node.lhs()], update); + break; + } case OpType::PairMulValue: case OpType::ValueMulPair: { const f64x2 grad_out = pair_grads[out_idx]; diff --git a/src/tuning/operations.hpp b/src/tuning/operations.hpp index 945ba2f7..36c07e78 100644 --- a/src/tuning/operations.hpp +++ b/src/tuning/operations.hpp @@ -51,6 +51,7 @@ enum class OpType : u32 { PairDivValue, ValueDivPair, PairAddClampedSecond, // For complexity + ScaleEg, // For eg scaling // Pair-Pair Ops PairMulPair, diff --git a/src/tuning/value.cpp b/src/tuning/value.cpp index ebe3763c..98cd42e1 100644 --- a/src/tuning/value.cpp +++ b/src/tuning/value.cpp @@ -331,4 +331,8 @@ PairHandle PairHandle::complexity_add(ValueHandle value) const { return Graph::get().record_pair_value(OpType::PairAddClampedSecond, *this, value); } +PairHandle PairHandle::scale_eg_impl(f64 ratio) const { + return Graph::get().record_pair_scalar(OpType::ScaleEg, *this, ratio); +} + } // namespace Clockwork::Autograd diff --git a/src/tuning/value.hpp b/src/tuning/value.hpp index b24ff6a0..e93eb5b1 100644 --- a/src/tuning/value.hpp +++ b/src/tuning/value.hpp @@ -77,6 +77,14 @@ struct PairHandle { PairHandle sigmoid() const; PairHandle complexity_add(ValueHandle value) const; + + template + PairHandle scale_eg(f64 alpha) const { + return scale_eg_impl(alpha / static_cast(max)); + } + +private: + PairHandle scale_eg_impl(f64 ratio) const; }; // Operation decls