in lattices/lattice_Zn.cpp [172:194]
uint64_t ZnSphereCodec::search_and_encode(const float *x) const {
float tmp[dim * 2];
int tmp_int[dim];
int ano; // atom number
float c[dim];
search(x, c, tmp, tmp_int, &ano);
uint64_t signs = 0;
float cabs[dim];
int nnz = 0;
for (int i = 0; i < dim; i++) {
cabs[i] = fabs(c[i]);
if (c[i] != 0) {
if (c[i] < 0)
signs |= 1UL << nnz;
nnz ++;
}
}
const CodeSegment &cs = code_segments[ano];
assert(nnz == cs.signbits);
uint64_t code = cs.c0 + signs;
code += cs.encode(cabs) << cs.signbits;
return code;
}