uint64_t ZnSphereCodecRec::encode_centroid()

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];
}