1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 00:33:09 +00:00

Compute KK_idx[] at init time

This commit is contained in:
Marco Costalba 2016-05-08 13:52:49 +02:00
parent f68df60fe5
commit 6f11b0438d

View file

@ -162,7 +162,7 @@ auto item(DTZPiece& e, int , int ) -> decltype(e)& { return e; }
auto item(WDLPawn& e, int stm, int f) -> decltype(e.file[stm][f])& { return e.file[stm][f]; }
auto item(DTZPawn& e, int , int f) -> decltype(e.file[f])& { return e.file[f]; }
const uint8_t MapA1D1D4[] = {
const uint8_t MapA1D1D4[64] = {
6, 0, 1, 2, 0, 0, 0, 0,
0, 7, 3, 4, 0, 0, 0, 0,
0, 0, 8, 5, 0, 0, 0, 0,
@ -208,108 +208,7 @@ const uint8_t Invflap[] = {
11, 19, 27, 35, 43, 51
};
const short KK_idx[10][64] = {
{
-1, -1, -1, 0, 1, 2, 3, 4,
-1, -1, -1, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57
},
{
58, -1, -1, -1, 59, 60, 61, 62,
63, -1, -1, -1, 64, 65, 66, 67,
68, 69, 70, 71, 72, 73, 74, 75,
76, 77, 78, 79, 80, 81, 82, 83,
84, 85, 86, 87, 88, 89, 90, 91,
92, 93, 94, 95, 96, 97, 98, 99,
100,101,102,103,104,105,106,107,
108,109,110,111,112,113,114,115
},
{
116,117, -1, -1, -1,118,119,120,
121,122, -1, -1, -1,123,124,125,
126,127,128,129,130,131,132,133,
134,135,136,137,138,139,140,141,
142,143,144,145,146,147,148,149,
150,151,152,153,154,155,156,157,
158,159,160,161,162,163,164,165,
166,167,168,169,170,171,172,173
},
{
174, -1, -1, -1,175,176,177,178,
179, -1, -1, -1,180,181,182,183,
184, -1, -1, -1,185,186,187,188,
189,190,191,192,193,194,195,196,
197,198,199,200,201,202,203,204,
205,206,207,208,209,210,211,212,
213,214,215,216,217,218,219,220,
221,222,223,224,225,226,227,228
},
{
229,230, -1, -1, -1,231,232,233,
234,235, -1, -1, -1,236,237,238,
239,240, -1, -1, -1,241,242,243,
244,245,246,247,248,249,250,251,
252,253,254,255,256,257,258,259,
260,261,262,263,264,265,266,267,
268,269,270,271,272,273,274,275,
276,277,278,279,280,281,282,283
},
{
284,285,286,287,288,289,290,291,
292,293, -1, -1, -1,294,295,296,
297,298, -1, -1, -1,299,300,301,
302,303, -1, -1, -1,304,305,306,
307,308,309,310,311,312,313,314,
315,316,317,318,319,320,321,322,
323,324,325,326,327,328,329,330,
331,332,333,334,335,336,337,338
},
{
-1, -1,339,340,341,342,343,344,
-1, -1,345,346,347,348,349,350,
-1, -1,441,351,352,353,354,355,
-1, -1, -1,442,356,357,358,359,
-1, -1, -1, -1,443,360,361,362,
-1, -1, -1, -1, -1,444,363,364,
-1, -1, -1, -1, -1, -1,445,365,
-1, -1, -1, -1, -1, -1, -1,446
},
{
-1, -1, -1,366,367,368,369,370,
-1, -1, -1,371,372,373,374,375,
-1, -1, -1,376,377,378,379,380,
-1, -1, -1,447,381,382,383,384,
-1, -1, -1, -1,448,385,386,387,
-1, -1, -1, -1, -1,449,388,389,
-1, -1, -1, -1, -1, -1,450,390,
-1, -1, -1, -1, -1, -1, -1,451
},
{
452,391,392,393,394,395,396,397,
-1, -1, -1, -1,398,399,400,401,
-1, -1, -1, -1,402,403,404,405,
-1, -1, -1, -1,406,407,408,409,
-1, -1, -1, -1,453,410,411,412,
-1, -1, -1, -1, -1,454,413,414,
-1, -1, -1, -1, -1, -1,455,415,
-1, -1, -1, -1, -1, -1, -1,456
},
{
457,416,417,418,419,420,421,422,
-1,458,423,424,425,426,427,428,
-1, -1, -1, -1, -1,429,430,431,
-1, -1, -1, -1, -1,432,433,434,
-1, -1, -1, -1, -1,435,436,437,
-1, -1, -1, -1, -1,459,438,439,
-1, -1, -1, -1, -1, -1,460,440,
-1, -1, -1, -1, -1, -1, -1,461
}
};
int KK_idx[10][64];
const uint8_t WDL_MAGIC[] = { 0x71, 0xE8, 0x23, 0x5D };
const uint8_t DTZ_MAGIC[] = { 0xD7, 0x66, 0x0C, 0xA5 };
@ -1689,6 +1588,34 @@ void Tablebases::init(const std::string& paths)
}
}
// Compute KK_idx[] that encodes all the 461 possible legal positions of a couple of
// kings where first king is on a1-d1-d4 triangle. When first king is on the a1-d4
// diagonal, second king is assumed not to be above the a1-h8 diagonal.
int code = 0;
std::vector<std::pair<int, Square>> bothOnDiagonal;
for (int idx = 0; idx < 10; idx++)
for (Square s1 = SQ_A1; s1 <= SQ_H8; ++s1)
if (idx == MapA1D1D4[s1] && (idx || s1 == SQ_B1)) // SQ_B1 is mapped to 0
for (Square s2 = SQ_A1; s2 <= SQ_H8; ++s2)
{
if ((StepAttacksBB[KING][s1] | s1) & s2) // Illegal position
KK_idx[idx][s2] = -1;
else if (!off_A1H8(s1) && off_A1H8(s2) > 0)
KK_idx[idx][s2] = -1; // First king on diagonal, second above
else if (!off_A1H8(s1) && !off_A1H8(s2))
bothOnDiagonal.push_back(std::make_pair(idx, s2));
else
KK_idx[idx][s2] = code++;
}
// Legal positions with both kings on diagonal are encoded as last ones
for (auto p : bothOnDiagonal)
KK_idx[p.first][p.second] = code++;
for (PieceType p1 = PAWN; p1 < KING; ++p1) {
WDLHash.insert({KING, p1, KING});