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