diff --git a/src/eval_constants.hpp b/src/eval_constants.hpp index 0601ec55..9b8cbcf2 100644 --- a/src/eval_constants.hpp +++ b/src/eval_constants.hpp @@ -5,174 +5,175 @@ namespace Clockwork { // clang-format off -inline const PParam PAWN_MAT = S(202, 507); -inline const PParam KNIGHT_MAT = S(821, 1596); -inline const PParam BISHOP_MAT = S(872, 1682); -inline const PParam ROOK_MAT = S(1041, 2670); -inline const PParam QUEEN_MAT = S(2419, 4123); - -inline const PParam TEMPO_VAL = S(69, 58); - -inline const PParam BISHOP_XRAY_PAWNS = S(-13, -2); -inline const PParam BISHOP_PAIR_VAL = S(62, 240); -inline const PParam ROOK_OPEN_VAL = S(109, -4); -inline const PParam ROOK_SEMIOPEN_VAL = S(44, 12); -inline const PParam MINOR_BEHIND_PAWN = S(15, 42); +inline const PParam PAWN_MAT = S(195, 523); +inline const PParam KNIGHT_MAT = S(813, 1620); +inline const PParam BISHOP_MAT = S(863, 1705); +inline const PParam ROOK_MAT = S(1035, 2708); +inline const PParam QUEEN_MAT = S(2411, 4188); + +inline const PParam TEMPO_VAL = S(70, 58); + +inline const PParam BISHOP_XRAY_PAWNS = S(-13, -3); +inline const PParam BISHOP_PAIR_VAL = S(61, 244); +inline const PParam ROOK_OPEN_VAL = S(112, -6); +inline const PParam ROOK_SEMIOPEN_VAL = S(47, 9); +inline const PParam MINOR_BEHIND_PAWN = S(16, 40); inline const PParam RESTRICTED_SQUARES = S(19, 7); +inline const PParam SPACE_VAL = S(80, -72); -inline const PParam DOUBLED_PAWN_VAL = S(-22, -81); -inline const PParam ISOLATED_PAWN_VAL = S(-13, -39); +inline const PParam DOUBLED_PAWN_VAL = S(-15, -89); +inline const PParam ISOLATED_PAWN_VAL = S(-13, -40); -inline const PParam POTENTIAL_CHECKER_VAL = S(-45, -42); -inline const PParam OUTPOST_KNIGHT_VAL = S(49, 43); -inline const PParam OUTPOST_BISHOP_VAL = S(42, 39); +inline const PParam POTENTIAL_CHECKER_VAL = S(-45, -43); +inline const PParam OUTPOST_KNIGHT_VAL = S(50, 43); +inline const PParam OUTPOST_BISHOP_VAL = S(42, 38); -inline const PParam PAWN_PUSH_THREAT_KNIGHT = S(39, 51); -inline const PParam PAWN_PUSH_THREAT_BISHOP = S(42, 3); -inline const PParam PAWN_PUSH_THREAT_ROOK = S(18, 70); -inline const PParam PAWN_PUSH_THREAT_QUEEN = S(62, -51); +inline const PParam PAWN_PUSH_THREAT_KNIGHT = S(37, 55); +inline const PParam PAWN_PUSH_THREAT_BISHOP = S(40, 7); +inline const PParam PAWN_PUSH_THREAT_ROOK = S(18, 71); +inline const PParam PAWN_PUSH_THREAT_QUEEN = S(60, -44); inline const std::array PAWN_PHALANX = { - S(15, -2), S(33, 36), S(60, 66), S(122, 214), S(390, 405), S(680, 823), + S(19, -7), S(35, 34), S(51, 76), S(120, 217), S(397, 403), S(683, 824), }; inline const std::array DEFENDED_PAWN = { - S(48, 33), S(39, 26), S(54, 57), S(91, 181), S(387, 122), + S(53, 28), S(40, 25), S(42, 68), S(88, 183), S(395, 118), }; inline const std::array PASSED_PAWN = { - S(-94, -263), S(-95, -221), S(-68, -88), S(-23, 38), S(87, 198), S(230, 407), + S(-93, -262), S(-94, -220), S(-68, -85), S(-20, 40), S(87, 206), S(225, 421), }; inline const std::array PASSED_CLEAR_STOPPERS = { - S(-81, 54), S(-92, 36), S(-59, 105), S(-89, 230), S(-54, 341), S(51, 224), + S(-78, 50), S(-92, 35), S(-56, 104), S(-91, 234), S(-52, 342), S(52, 226), }; inline const std::array PASSED_CLEAR_FORWARD = { - S(-18, 69), S(-29, 60), S(-60, 108), S(-33, 135), S(73, 160), S(34, 195), + S(-17, 69), S(-28, 59), S(-57, 106), S(-28, 132), S(78, 156), S(34, 197), }; inline const std::array DEFENDED_PASSED_PUSH = { - S(24, -40), S(24, -2), S(16, 35), S(22, 103), S(71, 272), S(335, 219), + S(22, -38), S(23, -0), S(19, 33), S(25, 101), S(74, 273), S(336, 224), }; inline const std::array BLOCKED_PASSED_PAWN = { - S(14, -36), S(2, 8), S(-3, -26), S(-0, -68), S(-14, -176), S(-170, -457), + S(11, -34), S(-0, 11), S(-5, -25), S(-3, -66), S(-16, -177), S(-170, -463), }; inline const std::array FRIENDLY_KING_PASSED_PAWN_DISTANCE = { - S(0, 0), S(20, 233), S(9, 181), S(3, 105), S(11, 66), S(19, 71), S(57, 66), S(61, 36), + S(0, 0), S(24, 232), S(13, 180), S(7, 103), S(14, 65), S(22, 70), S(60, 65), S(65, 34), }; inline const std::array ENEMY_KING_PASSED_PAWN_DISTANCE = { - S(0, 0), S(-131, -46), S(15, 0), S(3, 103), S(29, 153), S(45, 188), S(56, 196), S(42, 177), + S(0, 0), S(-125, -60), S(18, -10), S(5, 96), S(30, 149), S(44, 186), S(54, 195), S(40, 176), }; inline const std::array KNIGHT_MOBILITY = { - S(-95, -396), S(-27, -142), S(4, -27), S(27, 22), S(54, 55), S(70, 92), S(88, 100), S(107, 108), S(127, 61), + S(-87, -411), S(-21, -151), S(6, -29), S(27, 26), S(52, 63), S(67, 102), S(85, 109), S(106, 116), S(126, 68), }; inline const std::array BISHOP_MOBILITY = { - S(-74, -352), S(-20, -130), S(32, -40), S(57, 14), S(77, 57), S(89, 88), S(94, 111), S(96, 132), S(101, 143), S(107, 150), S(116, 144), S(130, 127), S(130, 132), S(115, 96), + S(-68, -360), S(-15, -135), S(38, -43), S(60, 17), S(77, 64), S(87, 98), S(92, 121), S(95, 142), S(99, 154), S(105, 162), S(114, 154), S(128, 138), S(127, 142), S(113, 106), }; inline const std::array ROOK_MOBILITY = { - S(99, -211), S(24, -11), S(45, 23), S(60, 42), S(71, 60), S(75, 74), S(80, 90), S(86, 96), S(90, 108), S(96, 116), S(100, 123), S(100, 132), S(103, 136), S(108, 123), S(128, 85), + S(101, -212), S(22, -6), S(44, 27), S(60, 44), S(71, 63), S(74, 79), S(78, 95), S(84, 102), S(88, 115), S(93, 123), S(97, 129), S(97, 139), S(100, 144), S(106, 130), S(125, 92), }; inline const std::array QUEEN_MOBILITY = { - S(-193, -204), S(-38, -90), S(-14, 51), S(5, 193), S(22, 236), S(30, 289), S(36, 327), S(43, 345), S(48, 368), S(51, 385), S(57, 393), S(62, 400), S(65, 407), S(67, 413), S(68, 415), S(67, 418), S(64, 420), S(66, 412), S(67, 408), S(71, 400), S(61, 391), S(73, 364), S(37, 393), S(-7, 383), S(-40, 382), S(-75, 405), S(-135, 433), S(-100, 368), + S(-195, -203), S(-37, -91), S(-11, 47), S(8, 188), S(26, 232), S(33, 287), S(38, 328), S(43, 350), S(45, 379), S(47, 400), S(52, 411), S(56, 419), S(60, 425), S(63, 430), S(65, 430), S(65, 433), S(62, 434), S(65, 426), S(66, 422), S(70, 414), S(59, 406), S(71, 377), S(36, 407), S(-10, 399), S(-42, 395), S(-77, 417), S(-138, 447), S(-102, 381), }; -inline const PParam PAWN_THREAT_KNIGHT = S(196, 154); -inline const PParam PAWN_THREAT_BISHOP = S(171, 221); -inline const PParam PAWN_THREAT_ROOK = S(190, 153); -inline const PParam PAWN_THREAT_QUEEN = S(160, 21); +inline const PParam PAWN_THREAT_KNIGHT = S(197, 159); +inline const PParam PAWN_THREAT_BISHOP = S(169, 228); +inline const PParam PAWN_THREAT_ROOK = S(191, 156); +inline const PParam PAWN_THREAT_QUEEN = S(156, 33); inline const std::array, 2> MINOR_THREAT = {{ - {{ S(8, 57), S(98, 96), S(104, 125), S(178, 94), S(164, 10), }}, - {{ S(6, 58), S(87, 94), S(103, 124), S(219, 614), S(149, 49), }}, + {{ S(9, 57), S(98, 98), S(104, 127), S(179, 95), S(165, 13), }}, + {{ S(7, 57), S(87, 96), S(103, 126), S(220, 620), S(149, 53), }}, }}; inline const std::array, 2> ROOK_THREAT = {{ - {{ S(10, 64), S(44, 107), S(59, 112), S(12, 12), S(151, -76), }}, - {{ S(4, 49), S(62, 82), S(95, 72), S(23, 12), S(365, 898), }}, + {{ S(10, 66), S(44, 110), S(58, 114), S(13, 11), S(152, -77), }}, + {{ S(3, 51), S(61, 84), S(95, 73), S(23, 13), S(368, 895), }}, }}; -inline const PParam KING_THREAT = S(-10, 157); -inline const PParam HANGING_PAWN = S(32, 92); -inline const PParam HANGING_NON_PAWN = S(72, 31); +inline const PParam KING_THREAT = S(-11, 159); +inline const PParam HANGING_PAWN = S(32, 93); +inline const PParam HANGING_NON_PAWN = S(73, 31); inline const std::array KNIGHT_ON_QUEEN = { - S(21, -17), S(22, 8), + S(21, -15), S(22, 9), }; inline const std::array BISHOP_ON_QUEEN = { - S(42, 45), S(112, -112), + S(44, 43), S(113, -112), }; inline const std::array ROOK_ON_QUEEN = { - S(37, 13), S(49, -7), + S(39, 10), S(50, -8), }; inline const std::array BISHOP_PAWNS = { - S(4, -17), S(4, -15), S(-1, -21), S(-6, -29), S(-12, -37), S(-17, -43), S(-19, -55), S(-25, -57), S(-31, -74), + S(5, -19), S(5, -16), S(0, -22), S(-6, -30), S(-12, -37), S(-18, -42), S(-21, -53), S(-27, -55), S(-36, -69), }; inline const PParam ROOK_LINEUP = S(17, 81); inline const std::array PAWN_PSQT = { - S(184, 277), S(63, 399), S(69, 387), S(158, 271), S(193, 168), S(144, 211), S(123, 240), S(222, 181), // - S(42, 64), S(55, 110), S(35, 62), S(48, -4), S(40, -41), S(13, -12), S(15, 27), S(-20, 54), // - S(39, -13), S(15, -4), S(44, -45), S(26, -69), S(18, -87), S(4, -75), S(-36, -44), S(-37, -5), // - S(-6, -73), S(-30, -43), S(1, -61), S(-10, -77), S(-31, -87), S(-35, -75), S(-82, -57), S(-76, -52), // - S(-13, -111), S(18, -107), S(3, -45), S(-13, -50), S(-40, -60), S(-53, -71), S(-79, -72), S(-83, -74), // - S(9, -107), S(84, -95), S(72, -40), S(25, -11), S(-4, -32), S(-24, -60), S(-49, -59), S(-62, -57), // + S(186, 279), S(59, 407), S(63, 398), S(154, 277), S(189, 173), S(142, 215), S(121, 247), S(224, 182), // + S(41, 66), S(42, 121), S(15, 75), S(23, 13), S(14, -23), S(-6, 0), S(2, 37), S(-20, 54), // + S(38, -13), S(9, -2), S(24, -32), S(-4, -46), S(-14, -63), S(-16, -61), S(-41, -42), S(-38, -6), // + S(-8, -74), S(-35, -42), S(-8, -57), S(-25, -66), S(-47, -75), S(-44, -71), S(-86, -58), S(-78, -54), // + S(-20, -108), S(12, -103), S(-0, -42), S(-15, -50), S(-40, -62), S(-56, -70), S(-86, -69), S(-90, -72), // + S(2, -103), S(76, -89), S(78, -45), S(31, -17), S(2, -40), S(-20, -65), S(-58, -52), S(-70, -53), // }; inline const std::array KNIGHT_PSQT = { - S(-261, -501), S(-258, 51), S(-264, -30), S(1, 42), S(-89, 41), S(-265, 81), S(-346, 100), S(-348, -406), // - S(-0, -11), S(4, 27), S(86, 24), S(84, 60), S(90, 48), S(52, 27), S(-15, 26), S(-41, 20), // - S(41, -25), S(43, 28), S(56, 63), S(75, 71), S(58, 72), S(21, 59), S(10, 35), S(-34, 11), // - S(90, 23), S(92, 47), S(102, 69), S(105, 110), S(109, 108), S(73, 73), S(52, 38), S(33, 32), // - S(79, 15), S(102, 3), S(100, 50), S(95, 81), S(81, 83), S(73, 64), S(58, 19), S(24, 25), // - S(18, -41), S(44, -25), S(51, 20), S(63, 52), S(59, 51), S(31, 14), S(15, -18), S(-24, -41), // - S(36, -23), S(39, -10), S(27, -19), S(37, 9), S(34, 7), S(5, -44), S(-31, 0), S(-49, -84), // - S(-44, -93), S(10, -29), S(28, -43), S(44, -32), S(28, -18), S(-9, -51), S(-21, -27), S(-71, -141), // + S(-267, -496), S(-263, 57), S(-269, -26), S(-0, 44), S(-91, 43), S(-269, 85), S(-351, 106), S(-356, -400), // + S(-1, -10), S(3, 30), S(88, 22), S(85, 61), S(91, 48), S(51, 29), S(-16, 27), S(-44, 24), // + S(41, -23), S(43, 29), S(57, 63), S(77, 70), S(60, 72), S(23, 56), S(11, 33), S(-36, 13), // + S(89, 27), S(90, 50), S(100, 72), S(101, 115), S(106, 113), S(71, 75), S(50, 42), S(32, 35), // + S(79, 17), S(104, 1), S(102, 48), S(95, 82), S(82, 85), S(74, 64), S(61, 16), S(24, 27), // + S(20, -42), S(47, -29), S(52, 19), S(63, 53), S(58, 52), S(31, 15), S(18, -22), S(-22, -42), // + S(40, -27), S(41, -13), S(30, -21), S(39, 7), S(36, 4), S(7, -46), S(-28, -2), S(-49, -82), // + S(-49, -82), S(9, -27), S(28, -41), S(42, -28), S(26, -15), S(-12, -47), S(-24, -22), S(-77, -130), // }; inline const std::array BISHOP_PSQT = { - S(-131, 21), S(-191, 102), S(-400, 166), S(-272, 97), S(-303, 138), S(-304, 152), S(-226, 127), S(-129, 72), // - S(-27, -20), S(-64, 87), S(-46, 61), S(-68, 59), S(-66, 74), S(-40, 48), S(-9, 41), S(-51, 24), // - S(34, 17), S(15, 59), S(29, 68), S(26, 54), S(22, 42), S(20, 46), S(9, 42), S(11, 12), // - S(15, -7), S(48, 20), S(60, 35), S(79, 54), S(103, 39), S(41, 20), S(44, -4), S(-2, -3), // - S(36, -44), S(44, 2), S(76, 13), S(91, 26), S(74, 37), S(64, 24), S(19, 6), S(9, -39), // - S(56, -30), S(79, -26), S(95, 4), S(63, 28), S(59, 12), S(56, 13), S(58, -4), S(15, -23), // - S(25, -74), S(112, -58), S(65, -20), S(46, -2), S(29, -2), S(44, -44), S(44, -58), S(37, -51), // - S(42, -73), S(22, -25), S(29, -11), S(43, -33), S(27, -20), S(36, 14), S(42, -17), S(38, -62), // + S(-131, 23), S(-198, 111), S(-406, 173), S(-277, 103), S(-308, 144), S(-308, 157), S(-233, 134), S(-130, 75), // + S(-26, -20), S(-65, 91), S(-45, 62), S(-68, 61), S(-67, 77), S(-39, 49), S(-9, 43), S(-52, 27), // + S(37, 16), S(15, 61), S(31, 69), S(25, 57), S(21, 44), S(22, 47), S(8, 46), S(13, 13), // + S(15, -3), S(47, 24), S(59, 39), S(77, 59), S(100, 46), S(41, 21), S(42, -0), S(-3, 1), // + S(35, -43), S(43, 3), S(75, 16), S(91, 30), S(74, 41), S(64, 28), S(18, 8), S(7, -35), // + S(55, -29), S(81, -25), S(96, 6), S(62, 32), S(58, 18), S(57, 15), S(59, -3), S(15, -22), // + S(26, -73), S(116, -62), S(67, -20), S(49, -4), S(32, -4), S(45, -44), S(47, -61), S(37, -49), // + S(40, -67), S(21, -21), S(27, -5), S(41, -28), S(25, -16), S(34, 19), S(40, -10), S(35, -54), // }; inline const std::array ROOK_PSQT = { - S(175, 109), S(204, 129), S(157, 159), S(143, 131), S(204, 86), S(162, 113), S(168, 131), S(152, 128), // - S(87, 151), S(145, 155), S(188, 127), S(142, 113), S(179, 99), S(146, 125), S(99, 157), S(89, 159), // - S(57, 145), S(178, 88), S(205, 71), S(176, 57), S(180, 74), S(121, 115), S(115, 132), S(63, 170), // - S(30, 111), S(93, 120), S(113, 94), S(97, 94), S(125, 76), S(85, 118), S(75, 133), S(21, 158), // - S(5, 45), S(63, 55), S(57, 77), S(26, 86), S(35, 91), S(25, 115), S(8, 112), S(-14, 117), // - S(17, -34), S(85, -10), S(73, 16), S(51, 29), S(61, 35), S(38, 58), S(34, 43), S(-4, 48), // - S(-62, -41), S(63, -75), S(68, -38), S(56, -5), S(60, -4), S(46, 9), S(37, -8), S(5, -4), // - S(1, -62), S(24, -30), S(87, -42), S(96, -42), S(98, -37), S(75, -15), S(69, -21), S(48, -16), // + S(172, 111), S(199, 134), S(151, 165), S(136, 137), S(198, 91), S(155, 119), S(165, 133), S(147, 132), // + S(82, 155), S(139, 160), S(183, 131), S(137, 116), S(174, 103), S(141, 128), S(92, 162), S(84, 162), // + S(52, 149), S(173, 92), S(200, 75), S(171, 60), S(175, 77), S(117, 119), S(109, 138), S(57, 175), // + S(26, 115), S(89, 123), S(109, 98), S(92, 98), S(120, 81), S(80, 122), S(71, 136), S(17, 161), // + S(2, 45), S(61, 55), S(53, 79), S(23, 87), S(33, 92), S(22, 116), S(4, 114), S(-16, 117), // + S(15, -36), S(82, -9), S(69, 18), S(47, 30), S(57, 36), S(34, 60), S(32, 42), S(-7, 49), // + S(-66, -41), S(59, -76), S(64, -35), S(53, -4), S(57, -4), S(42, 10), S(33, -7), S(3, -5), // + S(-2, -63), S(21, -31), S(84, -42), S(93, -42), S(95, -37), S(71, -14), S(67, -22), S(46, -17), // }; inline const std::array QUEEN_PSQT = { - S(89, 154), S(146, 154), S(56, 299), S(-2, 396), S(35, 349), S(71, 258), S(72, 175), S(25, 208), // - S(58, 184), S(78, 239), S(37, 322), S(-82, 438), S(-39, 406), S(20, 288), S(58, 175), S(40, 146), // - S(20, 235), S(60, 261), S(29, 338), S(-8, 373), S(11, 362), S(51, 259), S(82, 155), S(63, 119), // - S(16, 172), S(28, 238), S(-13, 307), S(-12, 360), S(5, 353), S(21, 238), S(60, 155), S(35, 117), // - S(13, 145), S(10, 169), S(3, 218), S(-23, 287), S(-11, 303), S(11, 238), S(16, 175), S(36, 81), // - S(4, 51), S(35, 60), S(31, 135), S(10, 157), S(20, 164), S(22, 187), S(41, 116), S(22, 95), // - S(-24, -95), S(4, -93), S(13, -25), S(40, 14), S(37, 54), S(39, 26), S(12, 65), S(25, 37), // - S(-42, -80), S(-10, -240), S(21, -245), S(33, -133), S(40, -55), S(38, -74), S(36, -60), S(5, -5), // + S(87, 153), S(140, 159), S(47, 308), S(-11, 406), S(27, 357), S(62, 266), S(66, 178), S(23, 207), // + S(54, 188), S(70, 248), S(30, 329), S(-88, 443), S(-46, 412), S(12, 295), S(52, 179), S(36, 149), // + S(19, 234), S(54, 266), S(23, 343), S(-19, 386), S(1, 371), S(46, 262), S(77, 158), S(60, 123), // + S(13, 171), S(23, 242), S(-20, 313), S(-18, 364), S(-2, 359), S(15, 243), S(55, 159), S(31, 119), // + S(10, 144), S(7, 168), S(-1, 219), S(-25, 286), S(-13, 302), S(7, 242), S(13, 174), S(34, 80), // + S(2, 49), S(34, 56), S(30, 133), S(8, 157), S(17, 166), S(20, 188), S(41, 112), S(20, 93), // + S(-24, -104), S(7, -105), S(15, -34), S(42, 5), S(39, 45), S(41, 18), S(15, 53), S(27, 25), // + S(-43, -86), S(-11, -246), S(20, -251), S(34, -142), S(42, -67), S(40, -85), S(36, -66), S(3, -10), // }; inline const std::array KING_PSQT = { - S(164, -555), S(473, 84), S(313, 195), S(18, 191), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(367, -183), S(363, 189), S(210, 204), S(25, 156), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(197, 45), S(230, 175), S(114, 199), S(-51, 179), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(37, 9), S(112, 114), S(-22, 172), S(-118, 201), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-114, -1), S(-22, 77), S(-86, 146), S(-182, 198), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-55, -35), S(11, 34), S(-69, 115), S(-125, 160), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(22, -93), S(28, -12), S(-34, 50), S(-110, 107), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-24, -211), S(2, -91), S(-75, -27), S(-84, -40), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(169, -558), S(481, 85), S(319, 197), S(23, 191), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(374, -186), S(368, 193), S(216, 204), S(32, 153), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(203, 44), S(235, 178), S(118, 200), S(-46, 178), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(44, 6), S(119, 113), S(-18, 171), S(-113, 200), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-107, -5), S(-17, 75), S(-80, 143), S(-176, 194), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-51, -37), S(17, 31), S(-63, 112), S(-121, 157), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(24, -93), S(29, -10), S(-34, 52), S(-113, 112), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-22, -214), S(2, -91), S(-78, -24), S(-88, -36), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // }; -inline const PParam KS_NO_QUEEN = S(-80, -449); +inline const PParam KS_NO_QUEEN = S(-81, -447); inline const std::array PT_INNER_RING_ATTACKS = { - S(7, -4), S(10, 12), S(10, 5), S(4, 1), S(3, -9), + S(7, -3), S(10, 12), S(10, 5), S(4, 1), S(3, -10), }; inline const std::array PT_OUTER_RING_ATTACKS = { - S(4, -7), S(5, 5), S(2, 2), S(3, -0), S(4, -2), + S(4, -6), S(5, 4), S(2, 2), S(3, -1), S(4, -2), }; inline const PParam KS_FLANK_ATTACK = S(3, -2); @@ -181,29 +182,29 @@ inline const PParam KS_FLANK_DOUBLE_ATTACK = S(3, -1); inline const PParam KS_FLANK_DOUBLE_DEFENSE = S(-2, 2); inline const std::array, 4> KING_SHELTER = {{ - {{ S(16, -19), S(-7, 5), S(-3, -10), S(6, -16), S(12, -29), S(6, -54), S(-4, -46), }}, - {{ S(2, 3), S(-21, 2), S(-17, 10), S(-10, 17), S(-7, 8), S(-10, -13), S(-19, -21), }}, - {{ S(-3, -1), S(-12, -9), S(-12, 17), S(-8, 18), S(-7, 9), S(-6, -17), S(-22, -38), }}, - {{ S(6, 8), S(-11, 18), S(-7, 38), S(-2, 43), S(-2, 38), S(3, 19), S(9, -14), }}, + {{ S(16, -21), S(-7, 3), S(-3, -12), S(6, -18), S(11, -30), S(6, -55), S(-4, -49), }}, + {{ S(2, 2), S(-21, 0), S(-17, 8), S(-10, 16), S(-7, 7), S(-10, -14), S(-20, -23), }}, + {{ S(-4, -1), S(-12, -8), S(-13, 18), S(-9, 19), S(-8, 10), S(-7, -17), S(-23, -39), }}, + {{ S(5, 10), S(-11, 20), S(-8, 41), S(-3, 45), S(-3, 38), S(3, 20), S(8, -12), }}, }}; inline const std::array BLOCKED_SHELTER_STORM = { - S(0, 0), S(0, 0), S(9, 24), S(-6, 3), S(-8, 10), S(-6, 29), S(1, 49), + S(0, 0), S(0, 0), S(10, 23), S(-6, 3), S(-7, 9), S(-5, 27), S(2, 48), }; inline const std::array, 4> SHELTER_STORM = {{ - {{ S(5, 12), S(-42, -121), S(-9, -39), S(-1, 5), S(-3, 4), S(-6, 11), S(-6, 10), }}, - {{ S(8, -1), S(-25, -124), S(-7, -29), S(-5, 1), S(-2, -2), S(-9, 5), S(0, 4), }}, - {{ S(-0, 12), S(-8, -69), S(6, -15), S(-0, 9), S(-4, 12), S(-10, 19), S(-6, 22), }}, - {{ S(0, 1), S(2, -62), S(-1, 25), S(-3, 26), S(-6, 9), S(-12, 11), S(-9, 19), }}, + {{ S(5, 11), S(-42, -127), S(-9, -42), S(-1, 4), S(-3, 4), S(-6, 11), S(-5, 10), }}, + {{ S(9, -1), S(-25, -132), S(-7, -30), S(-4, 0), S(-2, -2), S(-9, 5), S(1, 4), }}, + {{ S(0, 10), S(-7, -76), S(7, -16), S(0, 8), S(-4, 11), S(-9, 18), S(-6, 20), }}, + {{ S(1, -2), S(3, -71), S(-0, 22), S(-2, 25), S(-6, 8), S(-12, 8), S(-8, 16), }}, }}; inline TunableSigmoid<32> KING_SAFETY_ACTIVATION( - 1427, 910, -21, -4 + 1421, 897, -21, 1 ); inline VParam WINNABLE_PAWNS = V(-20); -inline VParam WINNABLE_SYM = V(102); -inline VParam WINNABLE_ASYM = V(87); -inline VParam WINNABLE_PAWN_ENDGAME = V(75); -inline VParam WINNABLE_BIAS = V(-389); +inline VParam WINNABLE_SYM = V(104); +inline VParam WINNABLE_ASYM = V(89); +inline VParam WINNABLE_PAWN_ENDGAME = V(73); +inline VParam WINNABLE_BIAS = V(-403); // Epoch duration: 9.56388s // Epoch duration: 7.65336s diff --git a/src/eval_types.hpp b/src/eval_types.hpp index cc680ce9..11abdeb4 100644 --- a/src/eval_types.hpp +++ b/src/eval_types.hpp @@ -129,6 +129,19 @@ class PScore { using PParam = PScore; using VParam = Score; + +[[nodiscard]] inline PScore operator/(const PScore& score, i32 divisor) { + return PScore{static_cast(score.mg() / divisor), + static_cast(score.eg() / divisor)}; +} + +[[nodiscard]] inline PScore mul_div(const PScore& score, i32 num, i32 den) { + const i64 mg = i64{score.mg()} * num / den; + const i64 eg = i64{score.eg()} * num / den; + assert(std::numeric_limits::min() <= mg && mg <= std::numeric_limits::max()); + assert(std::numeric_limits::min() <= eg && eg <= std::numeric_limits::max()); + return PScore{static_cast(mg), static_cast(eg)}; +} #else using Score = Autograd::ValueHandle; @@ -136,6 +149,10 @@ using PScore = Autograd::PairHandle; using PParam = Autograd::PairPlaceholder; // Handle for the TUNABLE parameter using VParam = Autograd::ValuePlaceholder; // Handle for the TUNABLE parameter +inline PScore mul_div(const PScore& score, i32 num, i32 den) { + return score * (static_cast(num) / static_cast(den)); +} + #endif diff --git a/src/evaltune_main.cpp b/src/evaltune_main.cpp index bec41de8..572b8d63 100644 --- a/src/evaltune_main.cpp +++ b/src/evaltune_main.cpp @@ -280,6 +280,10 @@ int main() { } std::string result = line.substr(sep + 1); + // Only the second field is the result; ignore any later fields (e.g. stored eval) + if (size_t sep2 = result.find(';'); sep2 != std::string::npos) { + result.resize(sep2); + } result.erase(std::remove_if(result.begin(), result.end(), ::isspace), result.end()); @@ -605,6 +609,7 @@ void print_params() { << std::endl; std::cout << "inline const PParam RESTRICTED_SQUARES = " << RESTRICTED_SQUARES << ";" << std::endl; + std::cout << "inline const PParam SPACE_VAL = " << SPACE_VAL << ";" << std::endl; std::cout << std::endl; std::cout << "inline const PParam DOUBLED_PAWN_VAL = " << DOUBLED_PAWN_VAL << ";" << std::endl; diff --git a/src/evaluation.cpp b/src/evaluation.cpp index 2885ad18..944713f7 100644 --- a/src/evaluation.cpp +++ b/src/evaluation.cpp @@ -615,6 +615,30 @@ PScore evaluate_space(const Position& pos, const EvalData& data) { return eval; } +// SFC-style space +template +PScore evaluate_sf_space(const Position& pos, const EvalData& data, i32 blocked_pawns) { + constexpr Color opp = ~color; + constexpr Bitboard space_mask = + Bitboard::central_files() + & (color == Color::White + ? Bitboard::rank_mask(1) | Bitboard::rank_mask(2) | Bitboard::rank_mask(3) + : Bitboard::rank_mask(6) | Bitboard::rank_mask(5) | Bitboard::rank_mask(4)); + + Bitboard own_pawns = pos.bitboard_for(color, PieceType::Pawn); + Bitboard safe = space_mask & ~own_pawns & ~data.attacked_by(opp, PieceType::Pawn); + + // Squares at most three squares behind one of our pawns + Bitboard behind = own_pawns; + behind |= behind.shift_relative(color, Direction::South); + behind |= behind.shift_relative(color, Direction::South, 2); + + i32 bonus = safe.ipopcount() + (behind & safe & ~data.attacked_by(opp)).ipopcount(); + i32 weight = pos.board().get_color_bitboard(color).ipopcount() - 3 + std::min(blocked_pawns, 9); + + return mul_div(SPACE_VAL, bonus * weight * weight, 1024); +} + template PScore king_safety_activation(PScore& king_safety_score) { // Apply sigmoid activation to king safety score @@ -721,6 +745,24 @@ Score evaluate_white_pov(const Position& pos, const PsqtState& psqt_state) { eval += evaluate_space(pos, eval_data) - evaluate_space(pos, eval_data); + // SFC-style space, phase switch + if (phase >= 18) { + const Bitboard white_pawns = pos.bitboard_for(Color::White, PieceType::Pawn); + const Bitboard black_pawns = pos.bitboard_for(Color::Black, PieceType::Pawn); + const Bitboard white_pawn_double_attacks = + white_pawns.shift(Direction::NorthEast) & white_pawns.shift(Direction::NorthWest); + const Bitboard black_pawn_double_attacks = + black_pawns.shift(Direction::SouthEast) & black_pawns.shift(Direction::SouthWest); + + const i32 blocked_pawns = + (white_pawns.shift(Direction::North) & (black_pawns | black_pawn_double_attacks)) + .ipopcount() + + (black_pawns.shift(Direction::South) & (white_pawns | white_pawn_double_attacks)) + .ipopcount(); + eval += evaluate_sf_space(pos, eval_data, blocked_pawns) + - evaluate_sf_space(pos, eval_data, blocked_pawns); + } + // Threats eval += evaluate_threats(pos, eval_data) - evaluate_threats(pos, eval_data);