User Tools

Site Tools


chess:programming:endgame_table-bases:encoding

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
chess:programming:endgame_table-bases:encoding [2022/01/11 16:07] peterchess: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 "together" in 62*61/2 ways. 
-    * If we have 62 squares left, we can place two Rs "together" in 62*63/2 ways. +    * 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.+
  
 </WRAP> </WRAP>
Line 116: Line 115:
 There are special case routines for indexing KKKvNN for suicide chess. There are special case routines for indexing KKKvNN for suicide chess.
  
 +----
 +
 +===== Line by line explanation of the "111" case =====
 +
 +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.
 +
 +<code>
 +i = pos[1] > pos[0];
 +int j = (pos[2] > pos[0]) + (pos[2] > pos[1]);
 +</code>
 +
 +Precalculate the values we will have to deduct from pos[1] and pos[2].
 +
 +<code>
 +if (OffdiagA1H8[pos[0]])
 +  idx = Triangle[pos[0]] * 63*62 + (pos[1] - i) * 62 + (pos[2] - j);
 +</code>
 +
 +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).
 +
 +<code>
 +else 
 +if (OffdiagA1H8[pos[1]])
 +  idx = 6*63*62 + Diag[pos[0]] * 28*62 + Lower[pos[1]] * 62 + pos[2] - j;
 +</code>
 +
 +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).
 +
 +
 +<code>
 +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]];
 +</code>
 +
 +Now wK is on the half-diagonal a1-d4, wR is on the diagonal a1-h8, bK is below the diagonal.
 +
 +<code>
 +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);
 +</code>
 +
 +And the final case: all on the diagonal a1-h8.
 +
 +----
 +
 +==== References ====
 +
 +http://www.talkchess.com/forum3/viewtopic.php?t=59947
  
 +http://www.talkchess.com/forum3/viewtopic.php?t=59904
chess/programming/endgame_table-bases/encoding.1641917244.txt.gz · Last modified: 2022/01/11 16:07 by peter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki