diff --git a/src/eval_constants.hpp b/src/eval_constants.hpp index ae4ec78c..0c8f11a9 100644 --- a/src/eval_constants.hpp +++ b/src/eval_constants.hpp @@ -5,172 +5,172 @@ namespace Clockwork { // clang-format off -inline const PParam PAWN_MAT = S(197, 498); -inline const PParam KNIGHT_MAT = S(820, 1538); -inline const PParam BISHOP_MAT = S(867, 1625); -inline const PParam ROOK_MAT = S(1032, 2551); -inline const PParam QUEEN_MAT = S(2449, 3879); +inline const PParam PAWN_MAT = S(201, 504); +inline const PParam KNIGHT_MAT = S(812, 1582); +inline const PParam BISHOP_MAT = S(863, 1668); +inline const PParam ROOK_MAT = S(1034, 2653); +inline const PParam QUEEN_MAT = S(2402, 4096); -inline const PParam TEMPO_VAL = S(69, 51); +inline const PParam TEMPO_VAL = S(69, 53); inline const PParam BISHOP_XRAY_PAWNS = S(-13, -3); -inline const PParam BISHOP_PAIR_VAL = S(64, 231); -inline const PParam ROOK_OPEN_VAL = S(111, -6); -inline const PParam ROOK_SEMIOPEN_VAL = S(43, 12); -inline const PParam MINOR_BEHIND_PAWN = S(15, 39); +inline const PParam BISHOP_PAIR_VAL = S(61, 239); +inline const PParam ROOK_OPEN_VAL = S(109, -4); +inline const PParam ROOK_SEMIOPEN_VAL = S(43, 11); +inline const PParam MINOR_BEHIND_PAWN = S(15, 41); inline const PParam RESTRICTED_SQUARES = S(19, 7); -inline const PParam DOUBLED_PAWN_VAL = S(-21, -80); -inline const PParam ISOLATED_PAWN_VAL = S(-13, -38); +inline const PParam DOUBLED_PAWN_VAL = S(-21, -81); +inline const PParam ISOLATED_PAWN_VAL = S(-13, -39); -inline const PParam POTENTIAL_CHECKER_VAL = S(-45, -41); -inline const PParam OUTPOST_KNIGHT_VAL = S(51, 42); -inline const PParam OUTPOST_BISHOP_VAL = S(41, 39); +inline const PParam POTENTIAL_CHECKER_VAL = S(-45, -42); +inline const PParam OUTPOST_KNIGHT_VAL = S(49, 44); +inline const PParam OUTPOST_BISHOP_VAL = S(42, 39); -inline const PParam PAWN_PUSH_THREAT_KNIGHT = S(38, 48); -inline const PParam PAWN_PUSH_THREAT_BISHOP = S(41, 4); -inline const PParam PAWN_PUSH_THREAT_ROOK = S(18, 67); -inline const PParam PAWN_PUSH_THREAT_QUEEN = S(62, -49); +inline const PParam PAWN_PUSH_THREAT_KNIGHT = S(39, 50); +inline const PParam PAWN_PUSH_THREAT_BISHOP = S(42, 3); +inline const PParam PAWN_PUSH_THREAT_ROOK = S(17, 70); +inline const PParam PAWN_PUSH_THREAT_QUEEN = S(62, -51); inline const std::array PAWN_PHALANX = { - S(14, -2), S(31, 35), S(60, 64), S(121, 211), S(387, 386), S(618, 743), + S(15, -1), S(33, 35), S(59, 65), S(121, 212), S(386, 402), S(672, 816), }; inline const std::array DEFENDED_PAWN = { - S(46, 33), S(38, 25), S(55, 55), S(96, 177), S(411, 103), + S(48, 32), S(39, 25), S(53, 56), S(90, 180), S(384, 121), }; inline const std::array PASSED_PAWN = { - S(-91, -249), S(-93, -209), S(-67, -80), S(-21, 42), S(88, 201), S(220, 406), + S(-93, -259), S(-94, -217), S(-67, -86), S(-22, 39), S(87, 199), S(227, 404), }; inline const std::array PASSED_CLEAR_STOPPERS = { - S(-85, 50), S(-91, 34), S(-60, 107), S(-92, 229), S(-54, 331), S(53, 207), + S(-80, 53), S(-92, 35), S(-58, 104), S(-88, 228), S(-55, 339), S(51, 221), }; inline const std::array PASSED_CLEAR_FORWARD = { - S(-21, 71), S(-36, 61), S(-55, 103), S(-29, 132), S(74, 156), S(39, 177), + S(-16, 68), S(-28, 59), S(-60, 107), S(-32, 134), S(73, 158), S(34, 192), }; inline const std::array DEFENDED_PASSED_PUSH = { - S(24, -40), S(25, -4), S(17, 35), S(21, 105), S(67, 276), S(327, 224), + S(24, -39), S(24, -2), S(16, 34), S(21, 103), S(70, 270), S(332, 215), }; inline const std::array BLOCKED_PASSED_PAWN = { - S(13, -36), S(2, 7), S(-3, -28), S(-1, -66), S(-11, -175), S(-160, -440), + S(14, -36), S(2, 8), S(-3, -27), S(-0, -68), S(-14, -175), S(-166, -450), }; inline const std::array FRIENDLY_KING_PASSED_PAWN_DISTANCE = { - S(0, 0), S(18, 231), S(6, 179), S(2, 103), S(11, 65), S(22, 68), S(63, 62), S(61, 33), + S(0, 0), S(20, 233), S(9, 181), S(4, 106), S(12, 67), S(20, 72), S(58, 67), S(61, 38), }; inline const std::array ENEMY_KING_PASSED_PAWN_DISTANCE = { - S(0, 0), S(-140, -45), S(17, -5), S(4, 93), S(30, 141), S(44, 176), S(54, 185), S(39, 167), + S(0, 0), S(-132, -47), S(14, -4), S(1, 99), S(27, 149), S(43, 183), S(54, 192), S(40, 172), }; inline const std::array KNIGHT_MOBILITY = { - S(-85, -373), S(-25, -132), S(3, -14), S(28, 32), S(56, 63), S(70, 99), S(88, 106), S(107, 114), S(127, 68), + S(-91, -392), S(-23, -140), S(7, -26), S(30, 23), S(57, 55), S(73, 92), S(90, 99), S(109, 108), S(129, 61), }; inline const std::array BISHOP_MOBILITY = { - S(-63, -285), S(-15, -105), S(33, -30), S(56, 20), S(77, 60), S(88, 90), S(93, 112), S(96, 132), S(100, 144), S(107, 149), S(114, 143), S(134, 124), S(139, 117), S(119, 93), + S(-71, -349), S(-18, -129), S(35, -40), S(59, 14), S(78, 56), S(90, 87), S(95, 110), S(98, 131), S(102, 142), S(109, 148), S(117, 142), S(131, 125), S(131, 130), S(116, 95), }; inline const std::array ROOK_MOBILITY = { - S(109, -181), S(24, 11), S(44, 43), S(60, 60), S(71, 78), S(74, 92), S(79, 107), S(85, 112), S(89, 124), S(95, 131), S(100, 136), S(101, 145), S(104, 149), S(107, 139), S(132, 93), + S(99, -215), S(23, -13), S(44, 21), S(60, 39), S(71, 58), S(75, 72), S(79, 88), S(85, 94), S(90, 106), S(95, 114), S(99, 120), S(99, 130), S(102, 134), S(107, 121), S(127, 82), }; inline const std::array QUEEN_MOBILITY = { - S(-206, -162), S(-52, 7), S(-28, 134), S(-6, 259), S(10, 298), S(17, 351), S(23, 384), S(30, 399), S(34, 424), S(37, 441), S(43, 449), S(47, 457), S(50, 463), S(52, 469), S(53, 470), S(52, 474), S(48, 475), S(53, 465), S(54, 463), S(58, 453), S(55, 436), S(61, 415), S(31, 439), S(-16, 429), S(-43, 426), S(-75, 446), S(-119, 455), S(-90, 396), + S(-192, -206), S(-38, -93), S(-14, 49), S(5, 189), S(22, 231), S(29, 284), S(36, 322), S(43, 339), S(47, 362), S(51, 379), S(57, 387), S(61, 394), S(64, 401), S(67, 406), S(67, 409), S(67, 411), S(63, 414), S(66, 406), S(67, 402), S(71, 394), S(61, 385), S(72, 359), S(38, 387), S(-8, 379), S(-42, 378), S(-76, 400), S(-135, 428), S(-101, 364), }; -inline const PParam PAWN_THREAT_KNIGHT = S(193, 149); -inline const PParam PAWN_THREAT_BISHOP = S(169, 215); -inline const PParam PAWN_THREAT_ROOK = S(189, 151); -inline const PParam PAWN_THREAT_QUEEN = S(154, 21); +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(187, 155); +inline const PParam PAWN_THREAT_QUEEN = S(159, 13); inline const std::array MINOR_THREAT = { - S(7, 54), S(91, 92), S(102, 124), S(202, 125), S(159, 10), S(0, 0), + S(7, 57), S(93, 94), S(103, 125), S(205, 123), S(162, 3), S(0, 0), }; inline const std::array ROOK_THREAT = { - S(8, 55), S(52, 93), S(74, 90), S(16, 13), S(148, -49), S(0, 0), + S(7, 57), S(53, 96), S(74, 95), S(17, 11), S(150, -48), S(0, 0), }; -inline const PParam KING_THREAT = S(-18, 155); -inline const PParam HANGING_PAWN = S(31, 90); -inline const PParam HANGING_NON_PAWN = S(68, 27); +inline const PParam KING_THREAT = S(-11, 156); +inline const PParam HANGING_PAWN = S(31, 93); +inline const PParam HANGING_NON_PAWN = S(69, 28); inline const std::array KNIGHT_ON_QUEEN = { - S(21, -18), S(30, -7), + S(21, -17), S(22, 9), }; inline const std::array BISHOP_ON_QUEEN = { - S(39, 47), S(121, -119), + S(42, 45), S(108, -105), }; inline const std::array ROOK_ON_QUEEN = { - S(37, 11), S(50, -8), + S(37, 11), S(47, -6), }; inline const std::array BISHOP_PAWNS = { - S(3, -15), S(4, -14), S(-0, -20), S(-6, -28), S(-12, -36), S(-17, -43), S(-18, -55), S(-24, -58), S(-28, -73), + S(4, -17), S(4, -15), S(-1, -21), S(-6, -29), S(-12, -37), S(-17, -43), S(-19, -55), S(-25, -56), S(-30, -73), }; -inline const PParam ROOK_LINEUP = S(17, 78); +inline const PParam ROOK_LINEUP = S(17, 80); inline const std::array PAWN_PSQT = { - S(181, 266), S(39, 396), S(71, 371), S(144, 265), S(199, 156), S(135, 213), S(98, 249), S(235, 172), // - S(41, 60), S(53, 106), S(29, 59), S(42, -9), S(33, -42), S(10, -16), S(10, 26), S(-18, 53), // - S(37, -13), S(12, -3), S(41, -46), S(27, -68), S(17, -86), S(-1, -73), S(-38, -40), S(-39, -2), // - S(-7, -71), S(-31, -41), S(2, -61), S(-6, -74), S(-28, -83), S(-37, -72), S(-84, -52), S(-77, -50), // - S(-11, -108), S(22, -106), S(7, -45), S(-8, -50), S(-36, -60), S(-50, -70), S(-79, -68), S(-81, -72), // - S(11, -105), S(85, -94), S(70, -40), S(27, -14), S(-4, -35), S(-23, -60), S(-48, -56), S(-61, -54), // + S(182, 274), S(62, 395), S(68, 383), S(155, 269), S(189, 168), S(142, 209), S(121, 239), S(221, 178), // + S(41, 63), S(55, 108), S(33, 61), S(47, -6), S(39, -42), S(12, -14), S(14, 26), S(-20, 53), // + S(38, -13), S(15, -5), S(44, -45), S(25, -69), S(17, -87), S(3, -75), S(-36, -44), S(-38, -5), // + S(-6, -73), S(-31, -43), S(1, -62), S(-10, -78), S(-31, -87), S(-36, -75), S(-82, -57), S(-76, -52), // + S(-14, -110), S(18, -106), S(3, -45), S(-13, -50), S(-40, -60), S(-53, -71), S(-79, -72), S(-83, -74), // + S(9, -107), S(82, -95), S(71, -40), S(25, -11), S(-5, -32), S(-24, -60), S(-50, -59), S(-62, -58), // }; inline const std::array KNIGHT_PSQT = { - S(-255, -497), S(-250, 52), S(-269, -69), S(30, 22), S(-94, 43), S(-263, 79), S(-362, 112), S(-347, -388), // - S(-5, -7), S(1, 35), S(91, 29), S(80, 57), S(85, 49), S(54, 25), S(-26, 30), S(-31, 21), // - S(48, -26), S(37, 32), S(67, 55), S(70, 74), S(59, 72), S(21, 59), S(8, 36), S(-41, 19), // - S(96, 25), S(89, 51), S(101, 69), S(99, 113), S(104, 113), S(69, 76), S(50, 43), S(38, 35), // - S(77, 18), S(103, 8), S(98, 51), S(91, 84), S(78, 84), S(74, 65), S(63, 11), S(24, 32), // - S(19, -36), S(46, -18), S(50, 22), S(63, 56), S(58, 53), S(31, 16), S(16, -8), S(-23, -33), // - S(42, -23), S(43, -8), S(29, -14), S(36, 14), S(33, 10), S(7, -41), S(-29, 2), S(-40, -78), // - S(-40, -74), S(10, -22), S(29, -41), S(47, -29), S(27, -9), S(-9, -47), S(-17, -21), S(-61, -129), // + S(-259, -499), S(-256, 50), S(-263, -30), S(0, 41), S(-91, 42), S(-265, 82), S(-344, 98), S(-346, -403), // + S(-2, -12), S(2, 27), S(86, 25), S(84, 60), S(89, 48), S(51, 28), S(-16, 24), S(-44, 22), // + S(40, -25), S(42, 28), S(57, 60), S(73, 70), S(57, 71), S(21, 56), S(8, 35), S(-34, 9), // + S(89, 22), S(91, 47), S(101, 68), S(104, 108), S(108, 107), S(72, 71), S(52, 37), S(33, 31), // + S(78, 15), S(101, 2), S(99, 49), S(94, 79), S(81, 82), S(73, 63), S(58, 18), S(24, 24), // + S(19, -42), S(44, -25), S(51, 20), S(63, 52), S(58, 50), S(31, 14), S(15, -18), S(-23, -41), // + S(37, -25), S(39, -11), S(27, -19), S(37, 8), S(34, 6), S(5, -44), S(-30, -1), S(-49, -82), // + S(-44, -92), S(10, -29), S(28, -43), S(44, -33), S(28, -19), S(-9, -51), S(-20, -27), S(-71, -140), // }; inline const std::array BISHOP_PSQT = { - S(-123, 20), S(-176, 106), S(-424, 188), S(-259, 92), S(-297, 149), S(-298, 154), S(-212, 129), S(-121, 71), // - S(-28, -14), S(-73, 92), S(-33, 55), S(-66, 69), S(-67, 80), S(-35, 49), S(-6, 42), S(-44, 27), // - S(38, 26), S(16, 65), S(34, 74), S(28, 64), S(22, 52), S(17, 57), S(15, 49), S(17, 20), // - S(16, 5), S(52, 28), S(63, 44), S(76, 63), S(102, 48), S(45, 28), S(51, 2), S(2, 5), // - S(44, -40), S(46, 11), S(79, 19), S(94, 32), S(78, 46), S(69, 29), S(22, 13), S(20, -30), // - S(60, -23), S(85, -21), S(99, 9), S(66, 37), S(64, 20), S(60, 22), S(66, 0), S(20, -13), // - S(31, -72), S(116, -47), S(71, -12), S(50, 6), S(32, 7), S(53, -38), S(51, -47), S(43, -45), // - S(52, -74), S(22, -10), S(26, -0), S(49, -26), S(31, -15), S(37, 20), S(46, -13), S(43, -53), // + S(-128, 20), S(-189, 101), S(-398, 165), S(-270, 97), S(-300, 139), S(-301, 151), S(-223, 125), S(-126, 70), // + S(-26, -21), S(-64, 86), S(-46, 62), S(-67, 60), S(-65, 74), S(-38, 46), S(-10, 41), S(-51, 24), // + S(35, 18), S(17, 57), S(31, 68), S(28, 53), S(23, 43), S(21, 47), S(10, 42), S(11, 12), // + S(17, -7), S(50, 20), S(61, 35), S(80, 55), S(103, 40), S(42, 19), S(45, -4), S(-1, -3), // + S(37, -45), S(45, 2), S(77, 13), S(92, 26), S(76, 37), S(66, 24), S(21, 4), S(10, -38), // + S(57, -30), S(81, -25), S(96, 5), S(64, 28), S(61, 13), S(57, 13), S(59, -4), S(17, -23), // + S(27, -73), S(113, -57), S(66, -19), S(48, -2), S(31, -2), S(45, -44), S(45, -58), S(38, -50), // + S(43, -72), S(23, -25), S(30, -10), S(44, -32), S(28, -19), S(38, 14), S(44, -17), S(39, -61), // }; inline const std::array ROOK_PSQT = { - S(177, 121), S(204, 140), S(149, 167), S(140, 140), S(205, 92), S(168, 118), S(173, 135), S(150, 139), // - S(85, 170), S(138, 168), S(196, 129), S(143, 125), S(185, 107), S(145, 134), S(93, 168), S(90, 169), // - S(54, 159), S(174, 105), S(202, 81), S(180, 62), S(177, 86), S(117, 127), S(120, 134), S(64, 180), // - S(32, 121), S(93, 125), S(121, 96), S(95, 101), S(124, 86), S(85, 130), S(76, 142), S(20, 168), // - S(2, 57), S(66, 65), S(60, 80), S(29, 91), S(39, 96), S(27, 122), S(10, 120), S(-11, 123), // - S(19, -27), S(85, 0), S(75, 22), S(55, 32), S(65, 38), S(38, 66), S(39, 49), S(-2, 53), // - S(-61, -31), S(66, -67), S(72, -31), S(60, 2), S(64, 0), S(47, 18), S(37, 1), S(9, 3), // - S(-1, -52), S(15, -14), S(86, -30), S(96, -33), S(95, -25), S(72, -1), S(70, -12), S(51, -6), // + S(174, 107), S(201, 128), S(155, 157), S(140, 130), S(201, 84), S(158, 112), S(167, 127), S(151, 125), // + S(87, 149), S(144, 153), S(185, 126), S(140, 112), S(177, 98), S(145, 123), S(98, 155), S(88, 156), // + S(57, 143), S(177, 86), S(202, 71), S(173, 57), S(178, 73), S(120, 114), S(115, 129), S(62, 169), // + S(30, 111), S(92, 118), S(111, 93), S(95, 94), S(122, 76), S(83, 118), S(75, 131), S(20, 157), // + S(5, 44), S(63, 54), S(56, 76), S(25, 85), S(35, 89), S(24, 114), S(7, 111), S(-14, 115), // + S(17, -36), S(84, -10), S(72, 15), S(50, 27), S(59, 35), S(37, 57), S(33, 42), S(-5, 48), // + S(-63, -41), S(61, -77), S(67, -40), S(56, -6), S(59, -6), S(45, 8), S(35, -8), S(4, -5), // + S(0, -63), S(24, -32), S(86, -43), S(95, -43), S(97, -38), S(74, -16), S(68, -22), S(47, -17), // }; inline const std::array QUEEN_PSQT = { - S(73, 181), S(145, 164), S(57, 300), S(-5, 403), S(39, 348), S(71, 260), S(64, 188), S(2, 238), // - S(56, 202), S(75, 251), S(44, 316), S(-92, 450), S(-43, 416), S(6, 315), S(49, 188), S(24, 179), // - S(17, 247), S(51, 287), S(18, 360), S(-20, 397), S(1, 377), S(46, 269), S(78, 168), S(59, 122), // - S(17, 178), S(19, 259), S(-14, 311), S(-25, 379), S(-10, 381), S(19, 250), S(56, 163), S(27, 137), // - S(10, 166), S(7, 186), S(-3, 234), S(-30, 304), S(-18, 324), S(6, 252), S(9, 189), S(33, 95), // - S(3, 67), S(33, 79), S(28, 154), S(7, 172), S(15, 180), S(16, 205), S(37, 135), S(17, 110), // - S(-25, -74), S(5, -72), S(12, -2), S(35, 38), S(31, 76), S(33, 52), S(7, 84), S(21, 55), // - S(-36, -60), S(-19, -209), S(11, -211), S(25, -99), S(33, -23), S(32, -56), S(30, -36), S(1, 14), // + S(89, 154), S(145, 154), S(57, 295), S(-3, 394), S(34, 348), S(72, 255), S(71, 174), S(26, 205), // + S(58, 182), S(77, 237), S(37, 319), S(-81, 434), S(-41, 407), S(19, 286), S(58, 173), S(40, 144), // + S(20, 232), S(59, 260), S(28, 336), S(-9, 370), S(11, 358), S(50, 257), S(81, 154), S(62, 118), // + S(16, 170), S(28, 236), S(-12, 303), S(-12, 356), S(5, 350), S(22, 235), S(60, 153), S(35, 116), // + S(13, 143), S(11, 165), S(3, 215), S(-22, 284), S(-11, 300), S(11, 234), S(16, 173), S(36, 80), // + S(4, 50), S(34, 59), S(31, 134), S(10, 155), S(19, 162), S(22, 185), S(41, 114), S(21, 94), // + S(-24, -94), S(5, -94), S(13, -26), S(40, 13), S(36, 52), S(39, 24), S(12, 63), S(25, 36), // + S(-41, -80), S(-10, -240), S(21, -243), S(33, -134), S(40, -55), S(38, -74), S(36, -61), S(5, -7), // }; inline const std::array KING_PSQT = { - S(109, -512), S(453, 82), S(284, 216), S(-18, 199), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(338, -166), S(347, 197), S(192, 211), S(10, 161), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(187, 48), S(218, 182), S(112, 204), S(-48, 183), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(14, 17), S(90, 124), S(-25, 174), S(-110, 199), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-120, 2), S(-34, 81), S(-98, 149), S(-183, 200), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-51, -37), S(14, 29), S(-74, 114), S(-129, 160), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(27, -95), S(33, -17), S(-32, 46), S(-109, 103), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-14, -213), S(8, -94), S(-75, -28), S(-72, -49), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(167, -550), S(473, 83), S(313, 194), S(20, 190), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(366, -181), S(363, 189), S(209, 203), S(26, 156), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(197, 46), S(230, 175), S(114, 198), S(-49, 179), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(39, 8), S(113, 114), S(-21, 171), S(-117, 201), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-112, -0), S(-22, 78), S(-85, 147), S(-180, 198), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-54, -32), S(12, 34), S(-68, 115), S(-123, 160), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(23, -91), S(29, -11), S(-33, 51), S(-108, 107), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-23, -208), S(3, -90), S(-73, -26), S(-82, -39), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // }; -inline const PParam KS_NO_QUEEN = S(-84, -438); +inline const PParam KS_NO_QUEEN = S(-80, -447); inline const std::array PT_INNER_RING_ATTACKS = { - S(7, -4), S(10, 12), S(10, 5), S(5, 1), S(3, -10), + S(7, -4), S(10, 12), S(10, 5), S(4, 2), S(3, -9), }; inline const std::array PT_OUTER_RING_ATTACKS = { - S(4, -7), S(5, 5), S(2, 2), S(3, -0), S(4, -1), + S(4, -7), S(5, 5), S(2, 2), S(3, -0), S(4, -2), }; inline const PParam KS_FLANK_ATTACK = S(3, -2); @@ -179,30 +179,30 @@ 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(17, -20), S(-6, 5), S(-3, -10), S(8, -17), S(12, -29), S(7, -58), S(-5, -50), }}, - {{ S(2, 1), S(-21, -1), S(-17, 7), S(-10, 16), S(-7, 6), S(-9, -15), S(-21, -23), }}, - {{ S(-4, -1), S(-12, -10), S(-14, 18), S(-9, 18), S(-7, 10), S(-8, -18), S(-25, -43), }}, - {{ S(7, 8), S(-10, 18), S(-7, 40), S(-2, 43), S(-2, 39), S(4, 17), S(8, -15), }}, + {{ S(16, -19), S(-6, 5), S(-3, -9), S(7, -16), S(12, -29), S(7, -53), S(-4, -45), }}, + {{ S(2, 4), S(-21, 2), S(-17, 10), S(-10, 18), S(-6, 8), S(-9, -12), S(-19, -21), }}, + {{ S(-5, -1), S(-13, -8), S(-14, 18), S(-10, 19), S(-8, 10), S(-8, -16), S(-24, -37), }}, + {{ S(6, 9), S(-10, 18), S(-7, 38), S(-2, 43), S(-2, 38), S(3, 19), S(9, -14), }}, }}; inline const std::array BLOCKED_SHELTER_STORM = { - S(0, 0), S(0, 0), S(11, 23), S(-5, 2), S(-7, 10), S(-5, 28), S(1, 51), + S(0, 0), S(0, 0), S(9, 23), S(-6, 3), S(-7, 10), S(-6, 28), S(1, 48), }; inline const std::array, 4> SHELTER_STORM = {{ - {{ S(6, 10), S(-43, -128), S(-8, -43), S(0, 3), S(-2, 3), S(-5, 10), S(-5, 8), }}, - {{ S(10, -1), S(-23, -125), S(-5, -32), S(-3, -1), S(-0, -3), S(-7, 4), S(2, 2), }}, - {{ S(0, 10), S(-9, -81), S(8, -19), S(1, 8), S(-3, 10), S(-9, 18), S(-5, 20), }}, - {{ S(2, -1), S(6, -65), S(-0, 27), S(-2, 25), S(-5, 8), S(-12, 11), S(-9, 19), }}, + {{ S(5, 11), S(-41, -123), S(-9, -39), S(-1, 5), S(-3, 4), S(-6, 11), S(-5, 10), }}, + {{ S(8, -1), S(-25, -125), S(-6, -29), S(-4, 1), S(-2, -3), S(-9, 4), S(1, 3), }}, + {{ S(-0, 11), S(-8, -69), S(7, -15), S(0, 9), S(-4, 11), S(-9, 19), S(-6, 21), }}, + {{ S(0, 0), S(3, -63), S(-1, 25), S(-3, 25), S(-6, 8), S(-12, 11), S(-9, 19), }}, }}; inline TunableSigmoid<32> KING_SAFETY_ACTIVATION( - 1361, 846, -21, 0 + 1422, 904, -21, -4 ); -inline VParam WINNABLE_PAWNS = V(-19); +inline VParam WINNABLE_PAWNS = V(-20); inline VParam WINNABLE_SYM = V(101); -inline VParam WINNABLE_ASYM = V(84); -inline VParam WINNABLE_PAWN_ENDGAME = V(88); -inline VParam WINNABLE_BIAS = V(-387); +inline VParam WINNABLE_ASYM = V(87); +inline VParam WINNABLE_PAWN_ENDGAME = V(75); +inline VParam WINNABLE_BIAS = V(-386); -// Epoch duration: 6.36129s +// Epoch duration: 7.65336s // clang-format on } // namespace Clockwork diff --git a/src/evaltune_main.cpp b/src/evaltune_main.cpp index a8be8859..263cb8f5 100644 --- a/src/evaltune_main.cpp +++ b/src/evaltune_main.cpp @@ -29,6 +29,66 @@ using namespace Clockwork::Autograd; void print_params(); +f64 find_optimal_k(const std::vector& positions, const std::vector& targets) { + constexpr f64 left0 = 0.001; + constexpr f64 right0 = 0.010; + constexpr int zooms = 22; + constexpr f64 phi = 0.6180339887498948482; + + auto evaluate_loss = [&](f64 K) -> f64 { + f64 loss = 0.0; + + for (size_t i = 0; i < positions.size(); ++i) { + // TODO: this can absolutely be optimized by just caching the eval results and just multiplying by K and then doing the sigmoid after. + // Definitely implement this if we try the K tuning every time, not just when we modify the dataset. + ValueHandle output = (evaluate_white_pov(positions[i]) * K).sigmoid(); + + const f64 p = output.get_value(); + const f64 e = p - targets[i]; + loss += e * e; + + Graph::get().cleanup(); + } + + return loss / positions.size(); + }; + + f64 left = left0; + f64 right = right0; + + f64 c = right - phi * (right - left); + f64 d = left + phi * (right - left); + + f64 fc = evaluate_loss(c); + f64 fd = evaluate_loss(d); + + for (int i = 0; i < zooms; ++i) { + std::cout << "Zoom " << i + 1 << "/" << zooms << ": left=" << left << ", right=" << right + << ", c=" << c << ", d=" << d << ", fc=" << fc << ", fd=" << fd << "\n"; + if (fc < fd) { + right = d; + d = c; + fd = fc; + + c = right - phi * (right - left); + fc = evaluate_loss(c); + } else { + left = c; + c = d; + fc = fd; + + d = left + phi * (right - left); + fd = evaluate_loss(d); + } + } + + const f64 best_k = 0.5 * (left + right); + + std::cout << "Best K = " << best_k << " (1/K = " << (1.0 / best_k) << ")\n"; + + return best_k; +} + int main() { // Todo: make these CLI-specifiable @@ -39,8 +99,8 @@ int main() { std::vector results; const std::vector fenFiles = { - "data/v5_25knpm.txt", "data/v4_8knpm.txt", "data/v4_16knpm.txt", - "data/v4.1_8knpm.txt", "data/v4.1_16knpm.txt", "data/dfrcv2.txt", + "data/v5_25knpm.txt", "data/v4_8knpm.txt", "data/v4_16knpm.txt", "data/v4.1_8knpm.txt", + "data/v4.1_16knpm.txt", "data/dfrcv2.txt", "data/dfrcv3.txt", }; const u32 thread_count = std::max(1, std::thread::hardware_concurrency()); @@ -191,7 +251,9 @@ int main() { const i32 epochs = 450; #endif - const f64 K = 1.0 / 400; + const f64 K = find_optimal_k(positions, results); + + std::cout << "K = " << K << "\n"; std::mt19937 rng(std::random_device{}()); std::vector indices(positions.size());