chess:programming:endgame_table-bases:encoding
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
chess:programming:endgame_table-bases:encoding [2022/01/11 16:02] – created peter | chess:programming:endgame_table-bases:encoding [2022/01/11 16:18] (current) – peter | ||
---|---|---|---|
Line 59: | Line 59: | ||
* For example KRRvK. | * For example KRRvK. | ||
* We do not want to have one index value for R1 on a1, R2 on b1 and another index value for R1 on b1, R2 on a1. | * We do not want to have one index value for R1 on a1, R2 on b1 and another index value for R1 on b1, R2 on a1. | ||
- | * What we do is place the two Rs **together**. | + | * We can place two Rs " |
- | * If we have 62 squares left, we can place two Rs " | + | * If we have 3 Rs, it is 62*61*60/6 ways. |
- | * If we have 3 Rs, it is 62*63*64/6 ways. | + | * If we have 4 Rs, it is 62*61*60*59/24 ways." |
- | * If we have 4 Rs, it is 62*63*64*65/24 ways. | + | |
</ | </ | ||
Line 84: | Line 83: | ||
---- | ---- | ||
+ | The usual case is " | ||
+ | |||
+ | * If we have three different piece types (j >= 3), each occuring only once, we are in this case. | ||
+ | * We always have at least two of these: the white king and the black king. | ||
+ | * So we are in this case unless we have something like KRRvK, KRRvKBB, KRRRvK, KRRBBvK, KNNNNvK. | ||
+ | * Otherwise we are in case " | ||
+ | |||
+ | The "only for suicide" | ||
+ | |||
+ | * So the code can be cleaned up a bit. | ||
+ | |||
+ | This also means that the " | ||
+ | |||
+ | In principle, " | ||
+ | |||
+ | * However, " | ||
+ | * The order in which pieces are indexed has a big impact on compression efficiency, so the more possibilities for reordering, the better the compression. | ||
+ | * Also, what the increase in index space that " | ||
+ | |||
+ | It was initially thought the " | ||
+ | |||
+ | After the switch(), we place groups of like pieces (RR, RRR, RRRR) together. | ||
+ | |||
+ | * The norm[] array tells us how many like pieces we have. | ||
+ | * Their positions are sorted and then mapped to an index using a formula involving binomials. The "j += (p > pos[l]);" | ||
+ | |||
+ | The factor[] values have to do with the " | ||
+ | |||
+ | Similar story for encode_pawn(). | ||
+ | |||
+ | There are special case routines for indexing KKKvNN for suicide chess. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ===== Line by line explanation of the " | ||
+ | |||
+ | We are calculating an index for wK, wR, bK (pos[0], pos[1], pos[2]). | ||
+ | |||
+ | * We do not make use of the fact that the two Ks cannot be on adjacent squares. | ||
+ | * (So this also works for indexing wQ, wR, wB, for example.) | ||
+ | |||
+ | The wK has been mapped to the a1-d1-d4 triangle. | ||
+ | |||
+ | * If wK is on the diagonal, then wR is on or below the diagonal. | ||
+ | * If wK and wR are on the diagonal, then bK is on or below the diagonal. | ||
+ | |||
+ | < | ||
+ | i = pos[1] > pos[0]; | ||
+ | int j = (pos[2] > pos[0]) + (pos[2] > pos[1]); | ||
+ | </ | ||
+ | |||
+ | Precalculate the values we will have to deduct from pos[1] and pos[2]. | ||
+ | |||
+ | < | ||
+ | if (OffdiagA1H8[pos[0]]) | ||
+ | idx = Triangle[pos[0]] * 63*62 + (pos[1] - i) * 62 + (pos[2] - j); | ||
+ | </ | ||
+ | |||
+ | wK is below the diagonal. | ||
+ | |||
+ | * Triangle[pos[0]] maps the b1-d1-d3 triangle to 0...5. | ||
+ | * There are 63 squares for wR (pos[1] - i is in 0...62) and 62 squares for bK (pos[2] - j is in 0...61). | ||
+ | * Here, idx wil be in 0...(6*63*62-1). | ||
+ | |||
+ | < | ||
+ | else | ||
+ | if (OffdiagA1H8[pos[1]]) | ||
+ | idx = 6*63*62 + Diag[pos[0]] * 28*62 + Lower[pos[1]] * 62 + pos[2] - j; | ||
+ | </ | ||
+ | |||
+ | wK is on the half-diagonal a1-d4, wR is below the diagonal. | ||
+ | |||
+ | * Diag[pos[0]] maps a1-d4 to 0...3. | ||
+ | * Lower[pos[1]] maps the b1-h1-h7 triangle to 0..27. 62 squares remain for bK. | ||
+ | * Here, idx will be in (6*63*62)...(6*63*62 + 4*28*62-1). | ||
+ | |||
+ | |||
+ | < | ||
+ | else | ||
+ | if (OffdiagA1H8[pos[2]]) | ||
+ | idx = 6*63*62 + 4*28*62 + (Diag[pos[0]]) * 7*28 + (Diag[pos[1]] - i) * 28 + Lower[pos[2]]; | ||
+ | </ | ||
+ | |||
+ | Now wK is on the half-diagonal a1-d4, wR is on the diagonal a1-h8, bK is below the diagonal. | ||
+ | |||
+ | < | ||
+ | else | ||
+ | idx = 6*63*62 + 4*28*62 + 4*7*28 + (Diag[pos[0]] * 7*6) + (Diag[pos[1]] - i) * 6 + (Diag[pos[2]] - j); | ||
+ | </ | ||
+ | |||
+ | And the final case: all on the diagonal a1-h8. | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ==== References ==== | ||
+ | |||
+ | http:// | ||
+ | |||
+ | http:// |
chess/programming/endgame_table-bases/encoding.1641916972.txt.gz · Last modified: 2022/01/11 16:02 by peter