From 9b6bce8634a711268e66b29fdd48a35bb17ca523 Mon Sep 17 00:00:00 2001 From: TheRealGioviok <425gioviok@gmail.com> Date: Mon, 18 May 2026 12:35:16 +0200 Subject: [PATCH] Bench: 15576368 --- src/eval_constants.hpp | 234 ++++++++++++++++++++--------------------- src/evaluation.cpp | 41 +++++--- 2 files changed, 144 insertions(+), 131 deletions(-) diff --git a/src/eval_constants.hpp b/src/eval_constants.hpp index 7777e754..1e90426b 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(188, 452); -inline const PParam KNIGHT_MAT = S(851, 1362); -inline const PParam BISHOP_MAT = S(892, 1443); -inline const PParam ROOK_MAT = S(1069, 2334); -inline const PParam QUEEN_MAT = S(2581, 3690); -inline const PParam TEMPO_VAL = S(63, 22); - -inline const PParam BISHOP_XRAY_PAWNS = S(-14, 15); -inline const PParam BISHOP_PAIR_VAL = S(56, 227); -inline const PParam ROOK_OPEN_VAL = S(122, -13); -inline const PParam ROOK_SEMIOPEN_VAL = S(46, 32); -inline const PParam MINOR_BEHIND_PAWN = S(15, 43); -inline const PParam RESTRICTED_SQUARES = S(-24, -7); - -inline const PParam DOUBLED_PAWN_VAL = S(-15, -80); -inline const PParam ISOLATED_PAWN_VAL = S(-16, -26); - -inline const PParam POTENTIAL_CHECKER_VAL = S(-50, -25); -inline const PParam OUTPOST_KNIGHT_VAL = S(56, 58); -inline const PParam OUTPOST_BISHOP_VAL = S(57, 42); - -inline const PParam PAWN_PUSH_THREAT_KNIGHT = S(38, 6); -inline const PParam PAWN_PUSH_THREAT_BISHOP = S(45, -16); -inline const PParam PAWN_PUSH_THREAT_ROOK = S(24, 56); -inline const PParam PAWN_PUSH_THREAT_QUEEN = S(61, -38); +inline const PParam PAWN_MAT = S(185, 470); +inline const PParam KNIGHT_MAT = S(785, 1489); +inline const PParam BISHOP_MAT = S(823, 1583); +inline const PParam ROOK_MAT = S(987, 2514); +inline const PParam QUEEN_MAT = S(2315, 3791); +inline const PParam TEMPO_VAL = S(61, 24); + +inline const PParam BISHOP_XRAY_PAWNS = S(-13, 13); +inline const PParam BISHOP_PAIR_VAL = S(61, 223); +inline const PParam ROOK_OPEN_VAL = S(118, -11); +inline const PParam ROOK_SEMIOPEN_VAL = S(45, 32); +inline const PParam MINOR_BEHIND_PAWN = S(16, 40); +inline const PParam RESTRICTED_SQUARES = S(-23, -7); + +inline const PParam DOUBLED_PAWN_VAL = S(-21, -72); +inline const PParam ISOLATED_PAWN_VAL = S(-13, -38); + +inline const PParam POTENTIAL_CHECKER_VAL = S(-44, -40); +inline const PParam OUTPOST_KNIGHT_VAL = S(57, 53); +inline const PParam OUTPOST_BISHOP_VAL = S(57, 38); + +inline const PParam PAWN_PUSH_THREAT_KNIGHT = S(35, 11); +inline const PParam PAWN_PUSH_THREAT_BISHOP = S(41, -8); +inline const PParam PAWN_PUSH_THREAT_ROOK = S(22, 60); +inline const PParam PAWN_PUSH_THREAT_QUEEN = S(58, -39); inline const std::array PAWN_PHALANX = { - S(17, 0), S(32, 33), S(61, 62), S(130, 178), S(438, 239), S(569, 607), + S(13, -1), S(28, 36), S(57, 67), S(124, 196), S(416, 290), S(575, 614), }; inline const std::array DEFENDED_PAWN = { - S(46, 41), S(44, 37), S(64, 65), S(123, 165), S(466, 83), + S(45, 44), S(41, 39), S(60, 72), S(103, 201), S(408, 170), }; inline const std::array PASSED_PAWN = { - S(-96, -237), S(-97, -203), S(-73, -76), S(-24, 43), S(82, 213), S(243, 324), + S(-90, -252), S(-87, -216), S(-67, -84), S(-25, 44), S(71, 225), S(219, 355), }; inline const std::array DEFENDED_PASSED_PUSH = { - S(28, -42), S(21, 1), S(13, 38), S(9, 118), S(84, 230), S(172, 392), + S(24, -40), S(23, -5), S(13, 34), S(10, 112), S(73, 239), S(112, 461), }; inline const std::array BLOCKED_PASSED_PAWN = { - S(14, -24), S(3, 20), S(-5, -17), S(-2, -47), S(-16, -138), S(-213, -266), + S(18, -34), S(6, 10), S(-4, -20), S(-1, -51), S(-9, -159), S(-180, -308), }; inline const std::array FRIENDLY_KING_PASSED_PAWN_DISTANCE = { - S(0, 0), S(15, 219), S(-11, 186), S(-7, 105), S(7, 60), S(20, 59), S(61, 54), S(48, 41), + S(0, 0), S(17, 216), S(-3, 174), S(-3, 98), S(6, 59), S(18, 61), S(57, 60), S(47, 43), }; inline const std::array ENEMY_KING_PASSED_PAWN_DISTANCE = { - S(0, 0), S(-221, -51), S(-5, 38), S(1, 106), S(38, 134), S(52, 164), S(63, 171), S(39, 167), + S(0, 0), S(-103, -164), S(15, 21), S(2, 110), S(26, 157), S(36, 192), S(48, 199), S(29, 186), }; inline const std::array KNIGHT_MOBILITY = { - S(-99, -322), S(-35, -124), S(-3, -18), S(23, 19), S(54, 40), S(69, 74), S(90, 74), S(109, 83), S(143, 8), + S(-83, -360), S(-23, -150), S(5, -34), S(28, 10), S(55, 38), S(70, 74), S(88, 81), S(106, 90), S(124, 43), }; inline const std::array BISHOP_MOBILITY = { - S(-66, -275), S(-16, -119), S(35, -54), S(57, -3), S(79, 36), S(92, 64), S(98, 85), S(105, 98), S(105, 115), S(117, 105), S(121, 102), S(158, 50), S(162, 46), S(181, -26), + S(-54, -296), S(-8, -133), S(39, -63), S(59, -7), S(81, 34), S(93, 62), S(98, 86), S(101, 105), S(104, 116), S(108, 120), S(115, 110), S(127, 92), S(129, 93), S(101, 68), }; inline const std::array ROOK_MOBILITY = { - S(115, -189), S(23, -11), S(45, 19), S(61, 32), S(72, 48), S(76, 60), S(82, 73), S(88, 77), S(93, 88), S(101, 92), S(109, 95), S(112, 101), S(112, 103), S(119, 80), S(191, -30), + S(111, -194), S(27, -20), S(47, 13), S(63, 27), S(73, 45), S(77, 59), S(82, 73), S(88, 78), S(93, 89), S(101, 94), S(108, 98), S(111, 103), S(110, 107), S(112, 91), S(136, 40), }; inline const std::array QUEEN_MOBILITY = { - S(-189, -133), S(-42, -35), S(-15, 86), S(7, 199), S(24, 236), S(31, 282), S(38, 314), S(44, 327), S(47, 351), S(50, 367), S(55, 374), S(58, 383), S(62, 384), S(63, 387), S(63, 388), S(60, 390), S(55, 389), S(59, 375), S(60, 367), S(65, 353), S(65, 331), S(77, 295), S(56, 307), S(29, 275), S(6, 264), S(-17, 255), S(-58, 257), S(-58, 211), + S(-212, -143), S(-70, -33), S(-44, 86), S(-23, 205), S(-8, 247), S(-1, 296), S(5, 329), S(11, 344), S(14, 368), S(16, 387), S(21, 395), S(23, 406), S(26, 409), S(26, 416), S(25, 420), S(19, 426), S(15, 427), S(16, 417), S(16, 412), S(19, 403), S(12, 390), S(16, 365), S(-12, 387), S(-55, 373), S(-86, 376), S(-123, 399), S(-163, 407), S(-136, 335), }; -inline const PParam PAWN_THREAT_KNIGHT = S(208, 121); -inline const PParam PAWN_THREAT_BISHOP = S(191, 178); -inline const PParam PAWN_THREAT_ROOK = S(210, 130); -inline const PParam PAWN_THREAT_QUEEN = S(177, 3); +inline const PParam PAWN_THREAT_KNIGHT = S(195, 143); +inline const PParam PAWN_THREAT_BISHOP = S(182, 192); +inline const PParam PAWN_THREAT_ROOK = S(197, 150); +inline const PParam PAWN_THREAT_QUEEN = S(168, 24); -inline const PParam KNIGHT_THREAT_BISHOP = S(109, 118); -inline const PParam KNIGHT_THREAT_ROOK = S(225, 88); -inline const PParam KNIGHT_THREAT_QUEEN = S(159, -4); +inline const PParam KNIGHT_THREAT_BISHOP = S(109, 121); +inline const PParam KNIGHT_THREAT_ROOK = S(222, 94); +inline const PParam KNIGHT_THREAT_QUEEN = S(160, -20); -inline const PParam BISHOP_THREAT_KNIGHT = S(98, 75); -inline const PParam BISHOP_THREAT_ROOK = S(212, 152); -inline const PParam BISHOP_THREAT_QUEEN = S(178, 101); +inline const PParam BISHOP_THREAT_KNIGHT = S(95, 82); +inline const PParam BISHOP_THREAT_ROOK = S(207, 160); +inline const PParam BISHOP_THREAT_QUEEN = S(176, 105); inline const std::array BISHOP_PAWNS = { - S(8, -28), S(0, -9), S(-2, -19), S(-6, -30), S(-11, -40), S(-15, -47), S(-16, -60), S(-21, -62), S(-28, -72), + S(-0, -10), S(2, -14), S(-1, -22), S(-5, -32), S(-10, -42), S(-15, -48), S(-16, -61), S(-21, -64), S(-24, -80), }; -inline const PParam ROOK_LINEUP = S(17, 73); +inline const PParam ROOK_LINEUP = S(16, 76); inline const std::array PAWN_PSQT = { - S(207, 223), S(54, 312), S(129, 259), S(157, 203), S(197, 130), S(111, 215), S(75, 255), S(222, 194), // - S(31, 47), S(37, 83), S(33, 13), S(43, -57), S(32, -85), S(-4, -26), S(-17, 35), S(-36, 61), // - S(25, -20), S(5, -15), S(32, -62), S(23, -89), S(14, -102), S(-11, -72), S(-52, -27), S(-54, 8), // - S(-10, -78), S(-33, -52), S(-1, -73), S(-8, -82), S(-29, -88), S(-41, -67), S(-96, -34), S(-87, -40), // - S(-9, -111), S(25, -110), S(11, -49), S(-4, -56), S(-31, -66), S(-50, -62), S(-84, -50), S(-87, -56), // - S(12, -107), S(90, -104), S(70, -52), S(29, -18), S(1, -43), S(-22, -54), S(-52, -39), S(-66, -41), // + S(189, 241), S(42, 341), S(72, 317), S(137, 229), S(193, 138), S(118, 204), S(83, 242), S(229, 183), // + S(36, 41), S(47, 75), S(26, 23), S(39, -41), S(34, -77), S(4, -37), S(-1, 14), S(-25, 44), // + S(27, -22), S(4, -14), S(33, -56), S(20, -79), S(12, -98), S(-8, -82), S(-42, -49), S(-46, -10), // + S(-13, -75), S(-35, -43), S(-1, -64), S(-11, -76), S(-30, -88), S(-39, -78), S(-86, -58), S(-80, -56), // + S(-15, -104), S(20, -103), S(7, -44), S(-9, -50), S(-35, -63), S(-49, -72), S(-77, -71), S(-81, -75), // + S(9, -99), S(83, -88), S(70, -38), S(24, -13), S(-4, -37), S(-23, -60), S(-46, -56), S(-60, -56), // }; inline const std::array KNIGHT_PSQT = { - S(-284, -449), S(-267, 29), S(-297, -85), S(17, 21), S(-88, 35), S(-258, 49), S(-396, 100), S(-375, -330), // - S(-30, -18), S(-21, 27), S(85, 1), S(84, 40), S(97, 27), S(36, 20), S(-32, 20), S(-43, -7), // - S(41, -35), S(39, 14), S(79, 54), S(86, 76), S(71, 85), S(19, 82), S(6, 20), S(-41, 6), // - S(100, 12), S(101, 46), S(109, 70), S(113, 109), S(118, 106), S(77, 85), S(54, 43), S(38, 24), // - S(75, 4), S(113, -5), S(103, 55), S(90, 81), S(78, 79), S(76, 69), S(65, 8), S(21, 17), // - S(17, -51), S(44, -17), S(43, 26), S(57, 55), S(50, 53), S(24, 24), S(14, -6), S(-28, -47), // - S(35, -37), S(39, -25), S(20, -25), S(25, 3), S(22, 0), S(-1, -50), S(-30, -19), S(-37, -121), // - S(-38, -99), S(10, -42), S(30, -65), S(47, -54), S(29, -36), S(-9, -66), S(-20, -39), S(-61, -145), // + S(-259, -497), S(-281, 57), S(-295, -88), S(-10, 26), S(-117, 46), S(-284, 72), S(-409, 125), S(-350, -371), // + S(-29, -17), S(-19, 29), S(76, 6), S(61, 48), S(74, 33), S(35, 16), S(-28, 20), S(-46, 3), // + S(35, -25), S(30, 25), S(71, 57), S(77, 76), S(68, 80), S(24, 69), S(10, 17), S(-41, 10), // + S(95, 17), S(97, 50), S(105, 70), S(109, 108), S(116, 102), S(81, 73), S(58, 40), S(38, 27), // + S(72, 12), S(106, 3), S(101, 53), S(90, 76), S(78, 73), S(79, 63), S(64, 8), S(23, 19), // + S(17, -44), S(47, -15), S(51, 20), S(64, 49), S(58, 46), S(33, 13), S(21, -12), S(-23, -50), // + S(38, -33), S(44, -29), S(26, -26), S(33, -3), S(30, -6), S(5, -53), S(-28, -13), S(-35, -116), // + S(-39, -92), S(11, -38), S(33, -60), S(51, -47), S(31, -28), S(-5, -62), S(-15, -39), S(-58, -143), // }; inline const std::array BISHOP_PSQT = { - S(-132, 22), S(-180, 96), S(-488, 189), S(-305, 103), S(-314, 124), S(-317, 118), S(-208, 100), S(-133, 50), // - S(-51, -15), S(-96, 82), S(-47, 33), S(-100, 71), S(-86, 60), S(-46, 30), S(-26, 26), S(-50, -3), // - S(34, 12), S(19, 42), S(31, 52), S(24, 49), S(15, 34), S(11, 36), S(15, 28), S(17, -7), // - S(11, -8), S(53, 9), S(70, 28), S(77, 65), S(104, 53), S(49, 22), S(48, -9), S(-0, -9), // - S(52, -62), S(54, -13), S(83, 7), S(96, 34), S(83, 44), S(71, 25), S(23, 4), S(21, -40), // - S(66, -39), S(90, -31), S(103, -1), S(73, 24), S(70, 6), S(67, 14), S(75, -7), S(23, -23), // - S(41, -96), S(118, -64), S(77, -36), S(52, -13), S(37, -12), S(56, -52), S(54, -57), S(49, -67), // - S(59, -93), S(35, -44), S(31, -14), S(53, -41), S(38, -33), S(42, 4), S(53, -30), S(49, -63), // + S(-129, 23), S(-190, 113), S(-496, 195), S(-320, 107), S(-332, 137), S(-345, 153), S(-230, 135), S(-129, 58), // + S(-48, -15), S(-96, 85), S(-58, 49), S(-112, 79), S(-100, 75), S(-53, 45), S(-29, 35), S(-55, 13), // + S(29, 16), S(10, 58), S(23, 63), S(19, 53), S(16, 33), S(13, 35), S(13, 36), S(15, -3), // + S(9, -5), S(52, 12), S(64, 33), S(75, 60), S(104, 48), S(49, 19), S(50, -12), S(0, -11), // + S(52, -59), S(50, -9), S(83, 7), S(95, 29), S(82, 41), S(72, 20), S(24, 2), S(21, -41), // + S(65, -38), S(90, -28), S(102, 1), S(74, 22), S(69, 4), S(68, 10), S(76, -11), S(25, -27), // + S(38, -96), S(119, -67), S(78, -34), S(55, -17), S(40, -16), S(56, -53), S(56, -62), S(50, -68), // + S(55, -89), S(27, -29), S(32, -16), S(56, -40), S(38, -31), S(45, 2), S(52, -28), S(50, -67), // }; inline const std::array ROOK_PSQT = { - S(192, 85), S(232, 84), S(182, 105), S(171, 80), S(228, 55), S(179, 83), S(204, 90), S(183, 100), // - S(91, 160), S(156, 155), S(235, 106), S(168, 131), S(213, 119), S(174, 135), S(112, 164), S(101, 166), // - S(55, 153), S(186, 106), S(220, 82), S(199, 66), S(193, 92), S(130, 135), S(134, 135), S(70, 176), // - S(31, 110), S(108, 120), S(136, 94), S(108, 97), S(143, 82), S(99, 128), S(96, 130), S(26, 153), // - S(2, 35), S(78, 48), S(66, 66), S(34, 69), S(46, 78), S(36, 105), S(15, 100), S(-5, 96), // - S(16, -50), S(95, -29), S(77, -5), S(56, -4), S(66, 5), S(38, 39), S(47, 16), S(-1, 25), // - S(-74, -51), S(67, -91), S(65, -55), S(50, -23), S(56, -23), S(41, -10), S(34, -29), S(2, -19), // - S(-12, -77), S(5, -44), S(70, -56), S(80, -58), S(80, -46), S(59, -24), S(58, -36), S(40, -30), // + S(201, 76), S(234, 85), S(178, 112), S(170, 85), S(236, 42), S(189, 70), S(213, 76), S(193, 84), // + S(93, 158), S(162, 148), S(230, 110), S(171, 125), S(215, 110), S(173, 133), S(115, 155), S(102, 159), // + S(59, 150), S(193, 96), S(215, 84), S(201, 61), S(198, 84), S(136, 124), S(139, 124), S(73, 171), // + S(30, 115), S(104, 127), S(130, 99), S(109, 99), S(141, 86), S(99, 128), S(93, 135), S(25, 156), // + S(3, 41), S(78, 52), S(65, 70), S(39, 69), S(49, 78), S(37, 106), S(14, 104), S(-6, 102), // + S(13, -40), S(89, -19), S(76, 3), S(55, 5), S(66, 10), S(37, 44), S(43, 24), S(-6, 36), // + S(-73, -45), S(62, -86), S(62, -51), S(50, -17), S(56, -19), S(40, -6), S(31, -22), S(1, -15), // + S(-12, -77), S(1, -37), S(71, -55), S(80, -54), S(80, -44), S(59, -22), S(59, -35), S(41, -29), // }; inline const std::array QUEEN_PSQT = { - S(49, 141), S(155, 66), S(64, 181), S(9, 265), S(48, 225), S(72, 168), S(67, 111), S(-9, 175), // - S(49, 181), S(54, 261), S(33, 275), S(-105, 371), S(-58, 366), S(-6, 288), S(34, 184), S(14, 176), // - S(20, 196), S(45, 267), S(10, 323), S(-26, 339), S(-11, 338), S(34, 264), S(65, 179), S(62, 102), // - S(39, 97), S(29, 199), S(-15, 273), S(-36, 344), S(-18, 360), S(19, 232), S(62, 150), S(36, 127), // - S(26, 89), S(16, 132), S(-3, 195), S(-28, 269), S(-16, 304), S(8, 239), S(20, 160), S(45, 79), // - S(27, 2), S(42, 35), S(36, 121), S(12, 141), S(19, 164), S(21, 200), S(42, 136), S(36, 75), // - S(-5, -128), S(18, -78), S(20, -18), S(44, 17), S(37, 65), S(39, 45), S(15, 71), S(34, 34), // - S(-16, -118), S(4, -260), S(26, -238), S(39, -127), S(41, -28), S(47, -80), S(44, -52), S(18, -14), // + S(26, 180), S(123, 123), S(27, 264), S(-35, 365), S(1, 326), S(41, 229), S(39, 154), S(-29, 207), // + S(37, 181), S(43, 256), S(5, 328), S(-142, 463), S(-88, 433), S(-31, 324), S(22, 181), S(5, 165), // + S(-10, 240), S(18, 293), S(-17, 370), S(-62, 416), S(-39, 399), S(13, 284), S(48, 178), S(48, 99), // + S(10, 143), S(-2, 249), S(-37, 316), S(-60, 395), S(-41, 400), S(0, 256), S(44, 154), S(23, 113), // + S(3, 128), S(-7, 168), S(-24, 232), S(-46, 303), S(-31, 327), S(-5, 245), S(6, 163), S(34, 70), // + S(6, 23), S(27, 50), S(20, 134), S(-3, 155), S(6, 165), S(11, 193), S(33, 121), S(24, 74), // + S(-21, -133), S(8, -115), S(9, -31), S(32, 5), S(25, 54), S(30, 29), S(4, 59), S(22, 32), // + S(-34, -105), S(-15, -258), S(14, -255), S(29, -146), S(34, -60), S(37, -97), S(34, -67), S(8, -29), // }; inline const std::array KING_PSQT = { - S(37, -296), S(322, 305), S(203, 331), S(-23, 225), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(246, 0), S(270, 277), S(118, 315), S(-13, 209), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(143, 121), S(167, 239), S(62, 276), S(-64, 225), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-29, 63), S(61, 158), S(-80, 233), S(-144, 245), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-101, -16), S(-40, 75), S(-129, 156), S(-236, 224), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-20, -68), S(31, 0), S(-87, 97), S(-158, 158), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(41, -126), S(47, -49), S(-34, 13), S(-111, 72), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // - S(-4, -225), S(20, -119), S(-73, -62), S(-58, -86), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(145, -563), S(491, -5), S(323, 131), S(62, 90), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(337, -154), S(367, 119), S(217, 157), S(45, 121), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(178, 63), S(213, 180), S(118, 198), S(-22, 164), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(2, 25), S(73, 144), S(-33, 179), S(-91, 191), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-124, 8), S(-49, 94), S(-115, 155), S(-188, 195), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-54, -27), S(-0, 46), S(-84, 120), S(-129, 156), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(23, -85), S(25, -5), S(-36, 53), S(-106, 100), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // + S(-19, -189), S(4, -79), S(-77, -20), S(-69, -44), S(0, 0), S(0, 0), S(0, 0), S(0, 0), // }; -inline const PParam KS_NO_QUEEN = S(-84, -541); +inline const PParam KS_NO_QUEEN = S(-100, -435); inline const std::array PT_INNER_RING_ATTACKS = { - S(8, -7), S(14, -24), S(13, -3), S(6, -8), S(1, -25), + S(8, -7), S(9, 10), S(10, 5), S(4, 0), S(3, -10), }; inline const std::array PT_OUTER_RING_ATTACKS = { - S(3, -11), S(6, -24), S(4, -13), S(4, -0), S(4, 4), + S(4, -7), S(4, 3), S(3, 1), S(3, -0), S(3, -2), }; -inline const PParam KS_FLANK_ATTACK = S(4, -8); -inline const PParam KS_FLANK_DEFENSE = S(-4, 1); -inline const PParam KS_FLANK_DOUBLE_ATTACK = S(3, -5); -inline const PParam KS_FLANK_DOUBLE_DEFENSE = S(-2, -8); +inline const PParam KS_FLANK_ATTACK = S(3, -2); +inline const PParam KS_FLANK_DEFENSE = S(-4, 0); +inline const PParam KS_FLANK_DOUBLE_ATTACK = S(2, -1); +inline const PParam KS_FLANK_DOUBLE_DEFENSE = S(-2, 2); inline const std::array, 4> KING_SHELTER = {{ - {{ S(15, 27), S(-6, 24), S(-5, -55), S(6, -35), S(7, -23), S(-11, 11), S(-23, 9), }}, - {{ S(-2, 129), S(-20, -264), S(-20, -52), S(-9, 34), S(-8, 61), S(-21, 95), S(-39, 91), }}, - {{ S(-4, 111), S(-9, -228), S(-9, 105), S(-3, 77), S(-3, 69), S(-13, 73), S(-40, 55), }}, - {{ S(4, 119), S(-11, 81), S(-2, 90), S(4, 73), S(2, 60), S(5, 73), S(-0, 71), }}, + {{ S(18, -19), S(-6, 5), S(-2, -8), S(9, -16), S(14, -30), S(9, -55), S(-2, -47), }}, + {{ S(1, 3), S(-22, 4), S(-18, 11), S(-10, 17), S(-7, 8), S(-8, -20), S(-19, -24), }}, + {{ S(-2, -2), S(-10, -10), S(-12, 17), S(-7, 17), S(-6, 9), S(-6, -20), S(-22, -39), }}, + {{ S(7, 6), S(-9, 14), S(-6, 35), S(-2, 40), S(-2, 35), S(7, 8), S(11, -20), }}, }}; inline const std::array BLOCKED_SHELTER_STORM = { - S(0, 0), S(0, 0), S(14, 121), S(-8, 79), S(-10, 97), S(-3, 110), S(13, 73), + S(0, 0), S(0, 0), S(8, 28), S(-4, 4), S(-6, 10), S(-5, 28), S(2, 49), }; inline const std::array, 4> SHELTER_STORM = {{ - {{ S(3, 145), S(-53, -443), S(-11, -357), S(8, -382), S(-5, 64), S(-9, 87), S(-8, 89), }}, - {{ S(8, 55), S(-27, -515), S(-2, -364), S(-3, -32), S(-3, 13), S(-10, 38), S(0, 35), }}, - {{ S(-1, 81), S(-10, -445), S(4, -4), S(2, 9), S(-4, 41), S(-9, 62), S(-4, 56), }}, - {{ S(-1, 72), S(-3, -141), S(6, -8), S(4, 31), S(-6, 49), S(-13, 59), S(-10, 61), }}, + {{ S(6, 10), S(-45, -148), S(-9, -49), S(1, 4), S(-1, 3), S(-5, 10), S(-4, 8), }}, + {{ S(11, -2), S(-26, -157), S(-5, -33), S(-2, 0), S(1, -4), S(-6, 3), S(3, 1), }}, + {{ S(1, 10), S(-10, -86), S(7, -18), S(1, 9), S(-2, 10), S(-9, 18), S(-5, 19), }}, + {{ S(3, 1), S(4, -69), S(-2, 30), S(-3, 27), S(-5, 10), S(-11, 13), S(-9, 20), }}, }}; inline TunableSigmoid<32> KING_SAFETY_ACTIVATION( - 1150, 290, -14, 71 + 1409, 878, -16, -5 ); -inline VParam WINNABLE_PAWNS = V(-24); -inline VParam WINNABLE_SYM = V(131); -inline VParam WINNABLE_ASYM = V(113); -inline VParam WINNABLE_PAWN_ENDGAME = V(186); -inline VParam WINNABLE_BIAS = V(-508); +inline VParam WINNABLE_PAWNS = V(-21); +inline VParam WINNABLE_SYM = V(101); +inline VParam WINNABLE_ASYM = V(83); +inline VParam WINNABLE_PAWN_ENDGAME = V(121); +inline VParam WINNABLE_BIAS = V(-365); -// Epoch duration: 7.10261s +// Epoch duration: 8.37148s // clang-format on } // namespace Clockwork diff --git a/src/evaluation.cpp b/src/evaluation.cpp index 633d9650..0ca22aa1 100644 --- a/src/evaluation.cpp +++ b/src/evaluation.cpp @@ -495,28 +495,41 @@ PScore apply_winnable(const Position& pos, PScore& score, usize phase) { return score.complexity_add(winnable); } -PScore apply_eg_scale(const Position& pos, PScore& eval) { +PScore apply_eg_scale(const Position& pos, PScore& eval, isize strong_phase, isize weak_phase) { // Strong pawn scaling const Color strong_side = eval.eg() > 0 ? Color::White : Color::Black; + // Swap phases if we're in the weak side's perspective + if (strong_side == Color::Black) { + std::swap(strong_phase, weak_phase); + } const isize strong_pawn_count = pos.ipiece_count(strong_side, PieceType::Pawn); - const isize pcmul = 8 - strong_pawn_count; + + // Pawnless position scaling: if our material advantage is very thin and we have no pawns, scale down the eval significantly, as trading can lead to KBK or KNK draws + if (strong_pawn_count == 0) { + if (strong_phase - weak_phase <= 1) { + return eval.scale_eg<128>(strong_phase < 2 ? 0 : weak_phase <= 1 ? 8 : 28); + } + } + + 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) - + pos.piece_count(Color::Black, PieceType::Knight) - + pos.piece_count(Color::White, PieceType::Bishop) - + pos.piece_count(Color::Black, PieceType::Bishop) - + 2 - * (pos.piece_count(Color::White, PieceType::Rook) - + pos.piece_count(Color::Black, PieceType::Rook)) - + 4 - * (pos.piece_count(Color::White, PieceType::Queen) - + pos.piece_count(Color::Black, PieceType::Queen)); + const Color us = pos.active_color(); + const isize white_phase = pos.ipiece_count(Color::White, PieceType::Knight) + + pos.ipiece_count(Color::White, PieceType::Bishop) + + pos.ipiece_count(Color::White, PieceType::Rook) * 2 + + pos.ipiece_count(Color::White, PieceType::Queen) * 4; + + const isize black_phase = pos.ipiece_count(Color::Black, PieceType::Knight) + + pos.ipiece_count(Color::Black, PieceType::Bishop) + + pos.ipiece_count(Color::Black, PieceType::Rook) * 2 + + pos.ipiece_count(Color::Black, PieceType::Queen) * 4; + + usize phase = std::min(white_phase + black_phase, 24); phase = std::min(phase, 24); @@ -553,7 +566,7 @@ Score evaluate_white_pov(const Position& pos, const PsqtState& psqt_state) { eval = apply_winnable(pos, eval, phase); // Eg scaling - eval = apply_eg_scale(pos, eval); + eval = apply_eg_scale(pos, eval, white_phase, black_phase); return static_cast(eval.phase<24>(static_cast(phase))); };