mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Better document init()
This commit is contained in:
parent
6a802b2473
commit
5cbbeaf28e
1 changed files with 53 additions and 44 deletions
|
@ -791,21 +791,21 @@ int get_pfactor(const T& p, File f, typename T::Pawn = 0)
|
||||||
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
uint64_t set_factors(T& p, int num, int order, int order2, File f)
|
uint64_t set_factors(T& p, int num, int order[], File f)
|
||||||
{
|
{
|
||||||
int i = p.norm[0];
|
int i = p.norm[0];
|
||||||
|
|
||||||
if (order2 < 0xF)
|
if (order[1] < 0xF)
|
||||||
i += p.norm[i];
|
i += p.norm[i];
|
||||||
|
|
||||||
int n = 64 - i;
|
int n = 64 - i;
|
||||||
uint64_t result = 1;
|
uint64_t result = 1;
|
||||||
|
|
||||||
for (int k = 0; i < num || k == order || k == order2; ++k) {
|
for (int k = 0; i < num || k == order[0] || k == order[1]; ++k) {
|
||||||
if (k == order) {
|
if (k == order[0]) {
|
||||||
p.factor[0] = (int)result;
|
p.factor[0] = (int)result;
|
||||||
result *= get_pfactor(p, f);
|
result *= get_pfactor(p, f);
|
||||||
} else if (k == order2) {
|
} else if (k == order[1]) {
|
||||||
p.factor[p.norm[0]] = (int)result;
|
p.factor[p.norm[0]] = (int)result;
|
||||||
result *= Binomial[p.norm[p.norm[0]]][48 - p.norm[0]];
|
result *= Binomial[p.norm[p.norm[0]]][48 - p.norm[0]];
|
||||||
} else {
|
} else {
|
||||||
|
@ -859,18 +859,14 @@ void calc_symlen(PairsData* d, int s, std::vector<char>& tmp)
|
||||||
tmp[s] = 1;
|
tmp[s] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
PairsData* set_pairs(uint8_t** dataPtr, uint64_t tb_size, uint8_t* flags = nullptr)
|
PairsData* set_pairs(uint8_t** dataPtr, uint64_t tb_size)
|
||||||
{
|
{
|
||||||
uint8_t* data = *dataPtr;
|
uint8_t* data = *dataPtr;
|
||||||
|
|
||||||
if (flags)
|
|
||||||
*flags = data[0];
|
|
||||||
|
|
||||||
if (data[0] & 0x80) {
|
if (data[0] & 0x80) {
|
||||||
PairsData* d = new PairsData();
|
PairsData* d = new PairsData();
|
||||||
d->idxbits = 0;
|
d->min_len = data[1];
|
||||||
d->min_len = !flags ? data[1] : 0;
|
*dataPtr += 2;
|
||||||
*dataPtr = data + 2;
|
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -925,32 +921,36 @@ void WDLEntry::do_init(T& e, uint8_t* data)
|
||||||
PairsData* d;
|
PairsData* d;
|
||||||
uint64_t tb_size[8];
|
uint64_t tb_size[8];
|
||||||
|
|
||||||
int split = *data & 1;
|
enum { Split = 1, HasPawns = 2 };
|
||||||
File maxFile = has_pawns && (*data & 2) ? FILE_D : FILE_A;
|
|
||||||
bool p = (has_pawns && pawn.pawns[1] > 0);
|
|
||||||
|
|
||||||
data++;
|
uint8_t flags = *data++;
|
||||||
|
|
||||||
for (File f = FILE_A; f <= (has_pawns ? FILE_D : FILE_A); ++f) {
|
int split = (flags & Split);
|
||||||
|
File maxFile = (flags & HasPawns) ? FILE_D : FILE_A;
|
||||||
|
|
||||||
int order1[] = { *data & 0xF, *data >> 4 };
|
assert(!!has_pawns == !!(flags & HasPawns));
|
||||||
|
assert(!!symmetric != !!(flags & Split));
|
||||||
|
|
||||||
data++;
|
bool pp = (flags & HasPawns) && pawn.pawns[1]; // Pawns on both sides
|
||||||
|
|
||||||
int order2[] = { p ? *data & 0xF : 0xF,
|
assert(!pp || pawn.pawns[0]);
|
||||||
p ? *data >> 4 : 0xF };
|
|
||||||
data += p;
|
for (File f = FILE_A; f <= maxFile; ++f) {
|
||||||
|
|
||||||
|
int order[][2] = { { *data & 0xF, pp ? *(data + 1) & 0xF : 0xF },
|
||||||
|
{ *data >> 4, pp ? *(data + 1) >> 4 : 0xF } };
|
||||||
|
data += 1 + pp;
|
||||||
|
|
||||||
for (int i = 0; i < num; ++i, ++data) {
|
for (int i = 0; i < num; ++i, ++data) {
|
||||||
item(e, 0, f).pieces[i] = *data & 0xF;
|
item(e, 0, f).pieces[i] = *data & 0xF;
|
||||||
item(e, 1, f).pieces[i] = *data >> 4;
|
item(e, 1, f).pieces[i] = *data >> 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t pn[] = { uint8_t(piece[0].hasUniquePieces ? 3 : 2), 0 };
|
uint8_t pn[] = { uint8_t(piece[0].hasUniquePieces ? 3 : 2), 0 };
|
||||||
|
|
||||||
for (int i = 0; i < 2; ++i) {
|
for (int i = 0; i < 2; ++i) {
|
||||||
set_norms(item(e, i, f), num, has_pawns ? pawn.pawns : pn);
|
set_norms(item(e, i, f), num, (flags & HasPawns) ? pawn.pawns : pn);
|
||||||
tb_size[2 * f + i] = set_factors(item(e, i, f), num, order1[i], order2[i], f);
|
tb_size[2 * f + i] = set_factors(item(e, i, f), num, order[i], f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -963,20 +963,20 @@ void WDLEntry::do_init(T& e, uint8_t* data)
|
||||||
for (File f = FILE_A; f <= maxFile; ++f)
|
for (File f = FILE_A; f <= maxFile; ++f)
|
||||||
for (int k = 0; k <= split; k++) {
|
for (int k = 0; k <= split; k++) {
|
||||||
(d = item(e, k, f).precomp)->indextable = (char*)data;
|
(d = item(e, k, f).precomp)->indextable = (char*)data;
|
||||||
data += d->idxbits ? 6ULL * d->num_indices : 0;
|
data += 6ULL * d->num_indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (File f = FILE_A; f <= maxFile; ++f)
|
for (File f = FILE_A; f <= maxFile; ++f)
|
||||||
for (int k = 0; k <= split; k++) {
|
for (int k = 0; k <= split; k++) {
|
||||||
(d = item(e, k, f).precomp)->sizetable = (uint16_t*)data;
|
(d = item(e, k, f).precomp)->sizetable = (uint16_t*)data;
|
||||||
data += d->idxbits ? 2ULL * d->num_blocks : 0;
|
data += 2ULL * d->num_blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (File f = FILE_A; f <= maxFile; ++f)
|
for (File f = FILE_A; f <= maxFile; ++f)
|
||||||
for (int k = 0; k <= split; k++) {
|
for (int k = 0; k <= split; k++) {
|
||||||
data = (uint8_t*)(((uintptr_t)data + 0x3F) & ~0x3F);
|
data = (uint8_t*)(((uintptr_t)data + 0x3F) & ~0x3F);
|
||||||
(d = item(e, k, f).precomp)->data = data;
|
(d = item(e, k, f).precomp)->data = data;
|
||||||
data += d->idxbits ? (1ULL << d->blocksize) * d->real_num_blocks : 0;
|
data += (1ULL << d->blocksize) * d->real_num_blocks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1002,34 +1002,43 @@ void DTZEntry::do_init(T& e, uint8_t* data)
|
||||||
PairsData* d;
|
PairsData* d;
|
||||||
uint64_t tb_size[8];
|
uint64_t tb_size[8];
|
||||||
|
|
||||||
File maxFile = has_pawns && (*data & 2) ? FILE_D : FILE_A;
|
enum { Split = 1, HasPawns = 2 };
|
||||||
bool p = (has_pawns && pawn.pawns[1] > 0);
|
|
||||||
|
|
||||||
data++;
|
uint8_t flags = *data++;
|
||||||
|
|
||||||
for (File f = FILE_A; f <= (has_pawns ? FILE_D : FILE_A); ++f) {
|
File maxFile = (flags & HasPawns) ? FILE_D : FILE_A;
|
||||||
|
|
||||||
int order1 = *data & 0xF;
|
assert(!!has_pawns == !!(flags & HasPawns));
|
||||||
|
assert(!!symmetric != !!(flags & Split));
|
||||||
|
|
||||||
data++;
|
bool pp = (flags & HasPawns) && pawn.pawns[1]; // Pawns on both sides
|
||||||
|
|
||||||
int order2 = p ? *data & 0xF : 0xF;
|
assert(!pp || pawn.pawns[0]);
|
||||||
|
|
||||||
data += p;
|
for (File f = FILE_A; f <= maxFile; ++f) {
|
||||||
|
|
||||||
|
int order[][2] = { { *data & 0xF, pp ? *(data + 1) & 0xF : 0xF },
|
||||||
|
{ *data >> 4, pp ? *(data + 1) >> 4 : 0xF } };
|
||||||
|
data += 1 + pp;
|
||||||
|
|
||||||
for (int i = 0; i < num; ++i, ++data)
|
for (int i = 0; i < num; ++i, ++data)
|
||||||
item(e, f).pieces[i] = *data & 0xF;
|
item(e, f).pieces[i] = *data & 0xF;
|
||||||
|
|
||||||
uint8_t pn[] = { uint8_t(piece.hasUniquePieces ? 3 : 2), 0 };
|
uint8_t pn[] = { uint8_t(piece.hasUniquePieces ? 3 : 2), 0 };
|
||||||
|
|
||||||
set_norms(item(e, f), num, has_pawns ? pawn.pawns : pn);
|
set_norms(item(e, f), num, (flags & HasPawns) ? pawn.pawns : pn);
|
||||||
tb_size[f] = set_factors(item(e, f), num, order1, order2, f);
|
tb_size[f] = set_factors(item(e, f), num, order[0], f);
|
||||||
}
|
}
|
||||||
|
|
||||||
data += (uintptr_t)data & 1;
|
data += (uintptr_t)data & 1;
|
||||||
|
|
||||||
for (File f = FILE_A; f <= maxFile; ++f)
|
for (File f = FILE_A; f <= maxFile; ++f) {
|
||||||
item(e, f).precomp = set_pairs(&data, tb_size[f], &item(e, f).flags);
|
item(e, f).flags = *data;
|
||||||
|
|
||||||
|
assert(!(*data & 0x80));
|
||||||
|
|
||||||
|
item(e, f).precomp = set_pairs(&data, tb_size[f]);
|
||||||
|
}
|
||||||
|
|
||||||
e.map = data;
|
e.map = data;
|
||||||
|
|
||||||
|
@ -1037,7 +1046,7 @@ void DTZEntry::do_init(T& e, uint8_t* data)
|
||||||
if (item(e, f).flags & 2)
|
if (item(e, f).flags & 2)
|
||||||
for (int i = 0; i < 4; ++i) {
|
for (int i = 0; i < 4; ++i) {
|
||||||
item(e, f).map_idx[i] = (uint16_t)(data + 1 - e.map);
|
item(e, f).map_idx[i] = (uint16_t)(data + 1 - e.map);
|
||||||
data += 1 + data[0];
|
data += 1 + *data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1045,18 +1054,18 @@ void DTZEntry::do_init(T& e, uint8_t* data)
|
||||||
|
|
||||||
for (File f = FILE_A; f <= maxFile; ++f) {
|
for (File f = FILE_A; f <= maxFile; ++f) {
|
||||||
(d = item(e, f).precomp)->indextable = (char*)data;
|
(d = item(e, f).precomp)->indextable = (char*)data;
|
||||||
data += d->idxbits ? 6ULL * d->num_indices : 0;
|
data += 6ULL * d->num_indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (File f = FILE_A; f <= maxFile; ++f) {
|
for (File f = FILE_A; f <= maxFile; ++f) {
|
||||||
(d = item(e, f).precomp)->sizetable = (uint16_t*)data;
|
(d = item(e, f).precomp)->sizetable = (uint16_t*)data;
|
||||||
data += d->idxbits ? 2ULL * d->num_blocks : 0;
|
data += 2ULL * d->num_blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (File f = FILE_A; f <= maxFile; ++f) {
|
for (File f = FILE_A; f <= maxFile; ++f) {
|
||||||
data = (uint8_t*)(((uintptr_t)data + 0x3F) & ~0x3F);
|
data = (uint8_t*)(((uintptr_t)data + 0x3F) & ~0x3F);
|
||||||
(d = item(e, f).precomp)->data = data;
|
(d = item(e, f).precomp)->data = data;
|
||||||
data += d->idxbits ? (1ULL << d->blocksize) * d->real_num_blocks : 0;
|
data += (1ULL << d->blocksize) * d->real_num_blocks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue