in lattices/lattice_Zn.cpp [319:351]
uint64_t ZnSphereCodecRec::encode_centroid(const float *c) const
{
uint64_t codes[dim];
int norm2s[dim];
for(int i = 0; i < dim; i++) {
if (c[i] == 0) {
codes[i] = 0;
norm2s[i] = 0;
} else {
int r2i = int(c[i] * c[i]);
norm2s[i] = r2i;
codes[i] = c[i] >= 0 ? 0 : 1;
}
}
int dim2 = dim / 2;
for(int ld = 1; ld <= log2_dim; ld++) {
for (int i = 0; i < dim2; i++) {
int r2a = norm2s[2 * i];
int r2b = norm2s[2 * i + 1];
uint64_t code_a = codes[2 * i];
uint64_t code_b = codes[2 * i + 1];
codes[i] =
get_nv_cum(ld, r2a + r2b, r2a) +
code_a * get_nv(ld - 1, r2b) +
code_b;
norm2s[i] = r2a + r2b;
}
dim2 /= 2;
}
return codes[0];
}