mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 08:43:09 +00:00
Move magic random to RKISS
When initializing the magic numbers used to compute sliding attacks, we endless generate a random and test it as a possible magic. In the general case this takes a lot of iterations, but here, insteaad of picking a casual random, we rotate it a couple of times and generate a number that we know has a good probability to be a magic candidate. This is becuase the quantities by which we rotate the number are known in advance to produce quickly a good canidate. The patch, inspired by DON, just moves the shuffle to RKISS changing the boosters to take in account a left rotation instead of a right rotation as in the original. No functional change.
This commit is contained in:
parent
b534176d4a
commit
e6523e56b8
2 changed files with 12 additions and 17 deletions
|
@ -246,20 +246,6 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Bitboard pick_random(RKISS& rk, int booster) {
|
|
||||||
|
|
||||||
// Values s1 and s2 are used to rotate the candidate magic of a
|
|
||||||
// quantity known to be optimal to quickly find the magics.
|
|
||||||
int s1 = booster & 63, s2 = (booster >> 6) & 63;
|
|
||||||
|
|
||||||
Bitboard m = rk.rand<Bitboard>();
|
|
||||||
m = (m >> s1) | (m << (64 - s1));
|
|
||||||
m &= rk.rand<Bitboard>();
|
|
||||||
m = (m >> s2) | (m << (64 - s2));
|
|
||||||
return m & rk.rand<Bitboard>();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// init_magics() computes all rook and bishop attacks at startup. Magic
|
// init_magics() computes all rook and bishop attacks at startup. Magic
|
||||||
// bitboards are used to look up attacks of sliding pieces. As a reference see
|
// bitboards are used to look up attacks of sliding pieces. As a reference see
|
||||||
// chessprogramming.wikispaces.com/Magic+Bitboards. In particular, here we
|
// chessprogramming.wikispaces.com/Magic+Bitboards. In particular, here we
|
||||||
|
@ -268,8 +254,9 @@ namespace {
|
||||||
void init_magics(Bitboard table[], Bitboard* attacks[], Bitboard magics[],
|
void init_magics(Bitboard table[], Bitboard* attacks[], Bitboard magics[],
|
||||||
Bitboard masks[], unsigned shifts[], Square deltas[], Fn index) {
|
Bitboard masks[], unsigned shifts[], Square deltas[], Fn index) {
|
||||||
|
|
||||||
int MagicBoosters[][8] = { { 3191, 2184, 1310, 3618, 2091, 1308, 2452, 3996 },
|
int MagicBoosters[][8] = { { 969, 1976, 2850, 542, 2069, 2852, 1708, 164 },
|
||||||
{ 1059, 3608, 605, 3234, 3326, 38, 2029, 3043 } };
|
{ 3101, 552, 3555, 926, 834, 4122, 2131, 1117 } };
|
||||||
|
|
||||||
RKISS rk;
|
RKISS rk;
|
||||||
Bitboard occupancy[4096], reference[4096], edges, b;
|
Bitboard occupancy[4096], reference[4096], edges, b;
|
||||||
int i, size, booster;
|
int i, size, booster;
|
||||||
|
@ -309,7 +296,7 @@ namespace {
|
||||||
// Find a magic for square 's' picking up an (almost) random number
|
// Find a magic for square 's' picking up an (almost) random number
|
||||||
// until we find the one that passes the verification test.
|
// until we find the one that passes the verification test.
|
||||||
do {
|
do {
|
||||||
do magics[s] = pick_random(rk, booster);
|
do magics[s] = rk.magic_rand<Bitboard>(booster);
|
||||||
while (popcount<Max15>((magics[s] * masks[s]) >> 56) < 6);
|
while (popcount<Max15>((magics[s] * masks[s]) >> 56) < 6);
|
||||||
|
|
||||||
std::memset(attacks[s], 0, size * sizeof(Bitboard));
|
std::memset(attacks[s], 0, size * sizeof(Bitboard));
|
||||||
|
|
|
@ -68,6 +68,14 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T> T rand() { return T(rand64()); }
|
template<typename T> T rand() { return T(rand64()); }
|
||||||
|
|
||||||
|
/// Special generator used to fast init magic numbers. Here the
|
||||||
|
/// trick is to rotate the randoms of a given quantity 's' known
|
||||||
|
/// to be optimal to quickly find a good magic candidate.
|
||||||
|
template<typename T> T magic_rand(int s) {
|
||||||
|
return rotate_L(rotate_L(rand<T>(), (s >> 0) & 0x3F) & rand<T>()
|
||||||
|
, (s >> 6) & 0x3F) & rand<T>();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // #ifndef RKISS_H_INCLUDED
|
#endif // #ifndef RKISS_H_INCLUDED
|
||||||
|
|
Loading…
Add table
Reference in a new issue