in lattices/lattice_utils.cpp [129:156]
long Repeats::encode(const float *c) const
{
if (dim < 64)
return repeats_encode_64 (repeats, dim, c);
std::vector<bool> coded(dim, false);
int nfree = dim;
uint64_t code = 0, shift = 1;
for (auto r = repeats.begin(); r != repeats.end(); ++r) {
int rank = 0, occ = 0;
uint64_t code_comb = 0;
for (int i = 0; i < dim; i++) {
if (!coded[i]) {
if (c[i] == r->val) {
code_comb += comb(rank, occ + 1);
occ++;
coded[i] = true;
if (occ == r->n) break;
}
rank++;
}
}
uint64_t max_comb = comb(nfree, r->n);
code += shift * code_comb;
shift *= max_comb;
nfree -= r->n;
}
return code;
}