How do find the overlapping index as in:
Code: Select all
struct MagicInit {
unsigned long long factor;
int index; // this one
};
Moderators: hgm, Rebel, chrisw
Code: Select all
struct MagicInit {
unsigned long long factor;
int index; // this one
};
Only the factor is not appropriate to find the index - you'll need the whole context. If you have a homogeneous, two dimensional array indexed by square[0..63] and occupancy[0..4095] index, the usual memory layout iskrismchess wrote: How do find the overlapping index as in:
Code: Select all
struct MagicInit { unsigned long long factor; int index; // this one };
Code: Select all
sq[0] -> offset 0
sq[1] -> offset 4096
sq[i] -> offset i * 4096
Code: Select all
unsigned long long lookup_table[89524];
struct
{
unsigned long long factor;
int position;
}
bishop_magics[64] =
{
{ 0x0000404040404040u, 33104 },
{ 0x0000a060401007fcu, 4094 },
{ 0x0000401020200000u, 24764 },
{ 0x0000806004000000u, 13882 },
{ 0x0000440200000000u, 23090 },
{ 0x0000080100800000u, 32640 },
{ 0x0000104104004000u, 11558 },
{ 0x0000020020820080u, 32912 },
{ 0x0000040100202004u, 13674 },
{ 0x0000020080200802u, 6109 },
{ 0x0000010040080200u, 26494 },
{ 0x0000008060040000u, 17919 },
{ 0x0000004402000000u, 25757 },
{ 0x00000021c100b200u, 17338 },
{ 0x0000000400410080u, 16983 },
{ 0x000003f7f05fffc0u, 16659 },
{ 0x0004228040808010u, 13610 },
{ 0x0000200040404040u, 2224 },
{ 0x0000400080808080u, 60405 },
{ 0x0000200200801000u, 7983 },
{ 0x0000240080840000u, 17 },
{ 0x000018000c03fff8u, 34321 },
{ 0x00000a5840208020u, 33216 },
{ 0x0000058408404010u, 17127 },
{ 0x0002022000408020u, 6397 },
{ 0x0000402000408080u, 22169 },
{ 0x0000804000810100u, 42727 },
{ 0x000100403c0403ffu, 155 },
{ 0x00078402a8802000u, 8601 },
{ 0x0000101000804400u, 21101 },
{ 0x0000080800104100u, 29885 },
{ 0x0000400480101008u, 29340 },
{ 0x0001010102004040u, 19785 },
{ 0x0000808090402020u, 12258 },
{ 0x0007fefe08810010u, 50451 },
{ 0x0003ff0f833fc080u, 1712 },
{ 0x007fe08019003042u, 78475 },
{ 0x0000202040008040u, 7855 },
{ 0x0001004008381008u, 13642 },
{ 0x0000802003700808u, 8156 },
{ 0x0000208200400080u, 4348 },
{ 0x0000104100200040u, 28794 },
{ 0x0003ffdf7f833fc0u, 22578 },
{ 0x0000008840450020u, 50315 },
{ 0x0000020040100100u, 85452 },
{ 0x007fffdd80140028u, 32816 },
{ 0x0000202020200040u, 13930 },
{ 0x0001004010039004u, 17967 },
{ 0x0000040041008000u, 33200 },
{ 0x0003ffefe0c02200u, 32456 },
{ 0x0000001010806000u, 7762 },
{ 0x0000000008403000u, 7794 },
{ 0x0000000100202000u, 22761 },
{ 0x0000040100200800u, 14918 },
{ 0x0000404040404000u, 11620 },
{ 0x00006020601803f4u, 15925 },
{ 0x0003ffdfdfc28048u, 32528 },
{ 0x0000000820820020u, 12196 },
{ 0x0000000010108060u, 32720 },
{ 0x0000000000084030u, 26781 },
{ 0x0000000001002020u, 19817 },
{ 0x0000000040408020u, 24732 },
{ 0x0000004040404040u, 25468 },
{ 0x0000404040404040u, 10186 }
},
rook_magics[64] =
{
{ 0x00280077ffebfffeu, 41305 },
{ 0x2004010201097fffu, 14326 },
{ 0x0010020010053fffu, 24477 },
{ 0x0030002ff71ffffau, 8223 },
{ 0x7fd00441ffffd003u, 49795 },
{ 0x004001d9e03ffff7u, 60546 },
{ 0x004000888847ffffu, 28543 },
{ 0x006800fbff75fffdu, 79282 },
{ 0x000028010113ffffu, 6457 },
{ 0x0020040201fcffffu, 4125 },
{ 0x007fe80042ffffe8u, 81021 },
{ 0x00001800217fffe8u, 42341 },
{ 0x00001800073fffe8u, 14139 },
{ 0x007fe8009effffe8u, 19465 },
{ 0x00001800602fffe8u, 9514 },
{ 0x000030002fffffa0u, 71090 },
{ 0x00300018010bffffu, 75419 },
{ 0x0003000c0085fffbu, 33476 },
{ 0x0004000802010008u, 27117 },
{ 0x0002002004002002u, 85964 },
{ 0x0002002020010002u, 54915 },
{ 0x0001002020008001u, 36544 },
{ 0x0000004040008001u, 71854 },
{ 0x0000802000200040u, 37996 },
{ 0x0040200010080010u, 30398 },
{ 0x0000080010040010u, 55939 },
{ 0x0004010008020008u, 53891 },
{ 0x0000040020200200u, 56963 },
{ 0x0000010020020020u, 77451 },
{ 0x0000010020200080u, 12319 },
{ 0x0000008020200040u, 88500 },
{ 0x0000200020004081u, 51405 },
{ 0x00fffd1800300030u, 72878 },
{ 0x007fff7fbfd40020u, 676 },
{ 0x003fffbd00180018u, 83122 },
{ 0x001fffde80180018u, 22206 },
{ 0x000fffe0bfe80018u, 75186 },
{ 0x0001000080202001u, 681 },
{ 0x0003fffbff980180u, 36453 },
{ 0x0001fffdff9000e0u, 20369 },
{ 0x00fffeebfeffd800u, 1981 },
{ 0x007ffff7ffc01400u, 13343 },
{ 0x0000408104200204u, 10650 },
{ 0x001ffff01fc03000u, 57987 },
{ 0x000fffe7f8bfe800u, 26302 },
{ 0x0000008001002020u, 58357 },
{ 0x0003fff85fffa804u, 40546 },
{ 0x0001fffd75ffa802u, 0 },
{ 0x00ffffec00280028u, 14967 },
{ 0x007fff75ff7fbfd8u, 80361 },
{ 0x003fff863fbf7fd8u, 40905 },
{ 0x001fffbfdfd7ffd8u, 58347 },
{ 0x000ffff810280028u, 20381 },
{ 0x0007ffd7f7feffd8u, 81868 },
{ 0x0003fffc0c480048u, 59381 },
{ 0x0001ffffafd7ffd8u, 84404 },
{ 0x00ffffe4ffdfa3bau, 45811 },
{ 0x007fffef7ff3d3dau, 62898 },
{ 0x003fffbfdfeff7fau, 45796 },
{ 0x001fffeff7fbfc22u, 66994 },
{ 0x0000020408001001u, 67204 },
{ 0x0007fffeffff77fdu, 32448 },
{ 0x0003ffffbf7dfeecu, 62946 },
{ 0x0001ffff9dffa333u, 17005 }
};
Thanks Volker. Can you please share the code that is used to generate the lookup table i.e. the one you've generated above?Volker Annuss wrote:First I create the magic numbers as described in the wiki. For each square and each piece type I create up to three magic numbers, one that uses a small lookup table for that square and two others that have gaps (consecutive unused entries) in their tables. Larger gaps are preferred over many small ones.
Second I try to build a compact global lookup table. This is done by inserting the per square tables into the global one. They are always inserted into the first position that fits. Threshold accepting is used as optimization algorithm to get an insertion order that gives a small global table.
Starting with a random insertion sequence some modifications are done to the insertion order or another magic number is chosen for a square. These modifications are accepted if the global table becomes smaller and even if it grows by less than a threshold. The threshold is large at the beginning and is lowered step by step during the optimization until it reaches zero and only improvements are accepted.
Here is the smallest table I got so far. You may use this one or any other one in your engine.Code: Select all
unsigned long long lookup_table[89524]; struct { unsigned long long factor; int position; } bishop_magics[64] = { { 0x0000404040404040u, 33104 }, { 0x0000a060401007fcu, 4094 }, { 0x0000401020200000u, 24764 }, { 0x0000806004000000u, 13882 }, { 0x0000440200000000u, 23090 }, { 0x0000080100800000u, 32640 }, { 0x0000104104004000u, 11558 }, { 0x0000020020820080u, 32912 }, { 0x0000040100202004u, 13674 }, { 0x0000020080200802u, 6109 }, { 0x0000010040080200u, 26494 }, { 0x0000008060040000u, 17919 }, { 0x0000004402000000u, 25757 }, { 0x00000021c100b200u, 17338 }, { 0x0000000400410080u, 16983 }, { 0x000003f7f05fffc0u, 16659 }, { 0x0004228040808010u, 13610 }, { 0x0000200040404040u, 2224 }, { 0x0000400080808080u, 60405 }, { 0x0000200200801000u, 7983 }, { 0x0000240080840000u, 17 }, { 0x000018000c03fff8u, 34321 }, { 0x00000a5840208020u, 33216 }, { 0x0000058408404010u, 17127 }, { 0x0002022000408020u, 6397 }, { 0x0000402000408080u, 22169 }, { 0x0000804000810100u, 42727 }, { 0x000100403c0403ffu, 155 }, { 0x00078402a8802000u, 8601 }, { 0x0000101000804400u, 21101 }, { 0x0000080800104100u, 29885 }, { 0x0000400480101008u, 29340 }, { 0x0001010102004040u, 19785 }, { 0x0000808090402020u, 12258 }, { 0x0007fefe08810010u, 50451 }, { 0x0003ff0f833fc080u, 1712 }, { 0x007fe08019003042u, 78475 }, { 0x0000202040008040u, 7855 }, { 0x0001004008381008u, 13642 }, { 0x0000802003700808u, 8156 }, { 0x0000208200400080u, 4348 }, { 0x0000104100200040u, 28794 }, { 0x0003ffdf7f833fc0u, 22578 }, { 0x0000008840450020u, 50315 }, { 0x0000020040100100u, 85452 }, { 0x007fffdd80140028u, 32816 }, { 0x0000202020200040u, 13930 }, { 0x0001004010039004u, 17967 }, { 0x0000040041008000u, 33200 }, { 0x0003ffefe0c02200u, 32456 }, { 0x0000001010806000u, 7762 }, { 0x0000000008403000u, 7794 }, { 0x0000000100202000u, 22761 }, { 0x0000040100200800u, 14918 }, { 0x0000404040404000u, 11620 }, { 0x00006020601803f4u, 15925 }, { 0x0003ffdfdfc28048u, 32528 }, { 0x0000000820820020u, 12196 }, { 0x0000000010108060u, 32720 }, { 0x0000000000084030u, 26781 }, { 0x0000000001002020u, 19817 }, { 0x0000000040408020u, 24732 }, { 0x0000004040404040u, 25468 }, { 0x0000404040404040u, 10186 } }, rook_magics[64] = { { 0x00280077ffebfffeu, 41305 }, { 0x2004010201097fffu, 14326 }, { 0x0010020010053fffu, 24477 }, { 0x0030002ff71ffffau, 8223 }, { 0x7fd00441ffffd003u, 49795 }, { 0x004001d9e03ffff7u, 60546 }, { 0x004000888847ffffu, 28543 }, { 0x006800fbff75fffdu, 79282 }, { 0x000028010113ffffu, 6457 }, { 0x0020040201fcffffu, 4125 }, { 0x007fe80042ffffe8u, 81021 }, { 0x00001800217fffe8u, 42341 }, { 0x00001800073fffe8u, 14139 }, { 0x007fe8009effffe8u, 19465 }, { 0x00001800602fffe8u, 9514 }, { 0x000030002fffffa0u, 71090 }, { 0x00300018010bffffu, 75419 }, { 0x0003000c0085fffbu, 33476 }, { 0x0004000802010008u, 27117 }, { 0x0002002004002002u, 85964 }, { 0x0002002020010002u, 54915 }, { 0x0001002020008001u, 36544 }, { 0x0000004040008001u, 71854 }, { 0x0000802000200040u, 37996 }, { 0x0040200010080010u, 30398 }, { 0x0000080010040010u, 55939 }, { 0x0004010008020008u, 53891 }, { 0x0000040020200200u, 56963 }, { 0x0000010020020020u, 77451 }, { 0x0000010020200080u, 12319 }, { 0x0000008020200040u, 88500 }, { 0x0000200020004081u, 51405 }, { 0x00fffd1800300030u, 72878 }, { 0x007fff7fbfd40020u, 676 }, { 0x003fffbd00180018u, 83122 }, { 0x001fffde80180018u, 22206 }, { 0x000fffe0bfe80018u, 75186 }, { 0x0001000080202001u, 681 }, { 0x0003fffbff980180u, 36453 }, { 0x0001fffdff9000e0u, 20369 }, { 0x00fffeebfeffd800u, 1981 }, { 0x007ffff7ffc01400u, 13343 }, { 0x0000408104200204u, 10650 }, { 0x001ffff01fc03000u, 57987 }, { 0x000fffe7f8bfe800u, 26302 }, { 0x0000008001002020u, 58357 }, { 0x0003fff85fffa804u, 40546 }, { 0x0001fffd75ffa802u, 0 }, { 0x00ffffec00280028u, 14967 }, { 0x007fff75ff7fbfd8u, 80361 }, { 0x003fff863fbf7fd8u, 40905 }, { 0x001fffbfdfd7ffd8u, 58347 }, { 0x000ffff810280028u, 20381 }, { 0x0007ffd7f7feffd8u, 81868 }, { 0x0003fffc0c480048u, 59381 }, { 0x0001ffffafd7ffd8u, 84404 }, { 0x00ffffe4ffdfa3bau, 45811 }, { 0x007fffef7ff3d3dau, 62898 }, { 0x003fffbfdfeff7fau, 45796 }, { 0x001fffeff7fbfc22u, 66994 }, { 0x0000020408001001u, 67204 }, { 0x0007fffeffff77fdu, 32448 }, { 0x0003ffffbf7dfeecu, 62946 }, { 0x0001ffff9dffa333u, 17005 } };