uint64_t ZnSphereCodec::search_and_encode()

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