float ZnSphereSearch::search()

in lattices/lattice_Zn.cpp [90:130]


float ZnSphereSearch::search(const float *x, float *c,
                             float *tmp, // size 2 *dim
                             int *tmp_int, // size dim
                             int *ibest_out
                             ) const {
    int dim = dimS;
    assert (natom > 0);
    int *o = tmp_int;
    float *xabs = tmp;
    float *xperm = tmp + dim;

    // argsort
    for (int i = 0; i < dim; i++) {
        o[i] = i;
        xabs[i] = fabsf(x[i]);
    }
    std::sort(o, o + dim, [xabs](int a, int b) {
            return xabs[a] > xabs[b];
        });
    for (int i = 0; i < dim; i++) {
        xperm[i] = xabs[o[i]];
    }
    // find best
    int ibest = -1;
    float dpbest = -100;
    for (int i = 0; i < natom; i++) {
        float dp = fvec_inner_product (voc.data() + i * dim, xperm, dim);
        if (dp > dpbest) {
            dpbest = dp;
            ibest = i;
        }
    }
    // revert sort
    const float *cin = voc.data() + ibest * dim;
    for (int i = 0; i < dim; i++) {
        c[o[i]] = copysignf (cin[i], x[o[i]]);
    }
    if (ibest_out)
        *ibest_out = ibest;
    return dpbest;
}