void HeapArray<C>::addn_with_ids ( size_t nj, const T *vin, const TI *id_in, long id_stride, size_t i0, long ni) { if (id_in == nullptr) { addn (nj, vin, 0, i0, ni); return; } if (ni == -1) ni = nh; assert (i0 >= 0 && i0 + ni <= nh); #pragma omp parallel for for (size_t i = i0; i < i0 + ni; i++) { T * __restrict simi = get_val(i); TI * __restrict idxi = get_ids (i); const T *ip_line = vin + (i - i0) * nj; const TI *id_line = id_in + (i - i0) * id_stride; for (size_t j = 0; j < nj; j++) { T ip = ip_line [j]; if (C::cmp(simi[0], ip)) { heap_pop<C> (k, simi, idxi); heap_push<C> (k, simi, idxi, ip, id_line [j]); } } } }
void add_mod_n(int N,int a,int width, quantum_reg *reg){//add a to register reg (mod N) and clear the scratch bits addn(N, a, width, reg); addn_inv(N, a, width, reg); }