@@ -51,42 +51,47 @@ namespace detail::flat {
5151 *
5252 * @todo Unify out of core and not out of core versions.
5353 */
54- template <class T , class DB , class Q , class Index >
54+ template <class T , class DB , class Q , class ID >
5555auto vq_query_heap (
5656 T,
5757 DB& db,
58- Q& q,
59- const std::vector<Index> & ids,
58+ const Q& q,
59+ const ID & ids,
6060 int k_nn,
6161 unsigned nthreads);
6262
6363template <class DB , class Q >
64- auto vq_query_heap (DB& db, Q& q, int k_nn, unsigned nthreads) {
64+ auto vq_query_heap (DB& db, const Q& q, int k_nn, unsigned nthreads) {
6565 return vq_query_heap (
6666 without_ids{}, db, q, std::vector<size_t >{}, k_nn, nthreads);
6767}
6868
69- template <class DB , class Q , class Index >
69+ template <class DB , class Q , class ID >
7070auto vq_query_heap (
71- DB& db, Q& q, const std::vector<Index> & ids, int k_nn, unsigned nthreads) {
71+ DB& db, const Q& q, const ID & ids, int k_nn, unsigned nthreads) {
7272 return vq_query_heap (with_ids{}, db, q, ids, k_nn, nthreads);
7373}
7474
7575// @todo Support out of core
76- template <class T , class DB , class Q , class Index >
76+ template <class T , class DB , class Q , class ID >
7777auto vq_query_heap (
7878 T,
7979 DB& db,
80- Q& q,
81- const std::vector<Index> & ids,
80+ const Q& q,
81+ const ID & ids,
8282 int k_nn,
8383 unsigned nthreads) {
8484 // @todo Need to get the total number of queries, not just the first block
8585 // @todo Use Matrix here rather than vector of vectors
86- std::vector<std::vector<fixed_min_pair_heap<float , Index>>> scores (
86+
87+ // using feature_type = typename std::remove_reference_t<decltype(db)>::value_type;
88+ using id_type = typename std::remove_reference_t <decltype (ids)>::value_type;
89+ using score_type = float ;
90+
91+ std::vector<std::vector<fixed_min_pair_heap<score_type, id_type>>> scores (
8792 nthreads,
88- std::vector<fixed_min_pair_heap<float , Index >>(
89- size (q), fixed_min_pair_heap<float , Index >(k_nn)));
93+ std::vector<fixed_min_pair_heap<score_type, id_type >>(
94+ size (q), fixed_min_pair_heap<score_type, id_type >(k_nn)));
9095
9196 unsigned size_q = size (q);
9297 auto par = stdx::execution::indexed_parallel_policy{nthreads};
@@ -138,7 +143,7 @@ auto vq_query_heap(
138143 }
139144
140145 consolidate_scores (scores);
141- auto top_k = get_top_k_with_scores<fixed_min_pair_heap< float , Index>, Index> (scores, k_nn);
146+ auto top_k = get_top_k_with_scores (scores, k_nn);
142147
143148 return top_k;
144149}
@@ -153,41 +158,46 @@ auto vq_query_heap(
153158 * @param nthreads
154159 * @return
155160 */
156- template <class T , class DB , class Q , class Index >
161+ template <class T , class DB , class Q , class ID >
157162auto vq_query_heap_tiled (
158163 T,
159164 DB& db,
160- Q& q,
161- const std::vector<Index> & ids,
165+ const Q& q,
166+ const ID & ids,
162167 int k_nn,
163168 unsigned nthreads);
164169
165170template <class DB , class Q >
166- auto vq_query_heap_tiled (DB& db, Q& q, int k_nn, unsigned nthreads) {
171+ auto vq_query_heap_tiled (DB& db, const Q& q, int k_nn, unsigned nthreads) {
167172 return vq_query_heap_tiled (
168173 without_ids{}, db, q, std::vector<size_t >{}, k_nn, nthreads);
169174}
170175
171- template <class DB , class Q , class Index >
176+ template <class DB , class Q , class ID >
172177auto vq_query_heap_tiled (
173- DB& db, Q& q, const std::vector<Index> & ids, int k_nn, unsigned nthreads) {
178+ DB& db, const Q& q, const ID & ids, int k_nn, unsigned nthreads) {
174179 return vq_query_heap_tiled (with_ids{}, db, q, ids, k_nn, nthreads);
175180}
176181
177- template <class T , class DB , class Q , class Index >
182+ template <class T , class DB , class Q , class ID >
178183auto vq_query_heap_tiled (
179184 T,
180185 DB& db,
181- Q& q,
182- const std::vector<Index> & ids,
186+ const Q& q,
187+ const ID & ids,
183188 int k_nn,
184189 unsigned nthreads) {
185190 // @todo Need to get the total number of queries, not just the first block
186191 // @todo Use Matrix here rather than vector of vectors
187- std::vector<std::vector<fixed_min_pair_heap<float , Index>>> scores (
192+
193+ // using feature_type = typename std::remove_reference_t<decltype(db)>::value_type;
194+ using id_type = typename std::remove_reference_t <decltype (ids)>::value_type;
195+ using score_type = float ;
196+
197+ std::vector<std::vector<fixed_min_pair_heap<score_type, id_type>>> scores (
188198 nthreads,
189- std::vector<fixed_min_pair_heap<float , Index >>(
190- size (q), fixed_min_pair_heap<float , Index >(k_nn)));
199+ std::vector<fixed_min_pair_heap<score_type, id_type >>(
200+ size (q), fixed_min_pair_heap<score_type, id_type >(k_nn)));
191201
192202 unsigned size_q = size (q);
193203 auto par = stdx::execution::indexed_parallel_policy{nthreads};
@@ -223,48 +233,53 @@ auto vq_query_heap_tiled(
223233 } while (load (db));
224234
225235 consolidate_scores (scores);
226- auto top_k = get_top_k_with_scores<fixed_min_pair_heap< float , Index>, Index> (scores, k_nn);
236+ auto top_k = get_top_k_with_scores (scores, k_nn);
227237
228238 return top_k;
229239}
230240
231241// ====================================================================================================
232242
233- template <class T , class DB , class Q , class Index >
243+ template <class T , class DB , class Q , class ID >
234244auto vq_query_heap_2 (
235245 T,
236246 DB& db,
237- Q& q,
238- const std::vector<Index> & ids,
247+ const Q& q,
248+ const ID & ids,
239249 int k_nn,
240250 unsigned nthreads);
241251
242252template <class DB , class Q >
243- auto vq_query_heap_2 (DB& db, Q& q, int k_nn, unsigned nthreads) {
253+ auto vq_query_heap_2 (DB& db, const Q& q, int k_nn, unsigned nthreads) {
244254 return vq_query_heap_2 (
245255 without_ids{}, db, q, std::vector<size_t >{}, k_nn, nthreads);
246256}
247257
248- template <class DB , class Q , class Index >
258+ template <class DB , class Q , class ID >
249259auto vq_query_heap_2 (
250- DB& db, Q& q, const std::vector<Index> & ids, int k_nn, unsigned nthreads) {
260+ DB& db, const Q& q, const ID & ids, int k_nn, unsigned nthreads) {
251261 return vq_query_heap_2 (with_ids{}, db, q, ids, k_nn, nthreads);
252262}
253263
254- template <class T , class DB , class Q , class Index >
264+ template <class T , class DB , class Q , class ID >
255265auto vq_query_heap_2 (
256266 T,
257267 DB& db,
258- Q& q,
259- const std::vector<Index> & ids,
268+ const Q& q,
269+ const ID & ids,
260270 int k_nn,
261271 unsigned nthreads) {
262272 // @todo Need to get the total number of queries, not just the first block
263273 // @todo Use Matrix here rather than vector of vectors
264- std::vector<std::vector<fixed_min_pair_heap<float , Index>>> scores (
274+
275+ // using feature_type = typename std::remove_reference_t<decltype(db)>::value_type;
276+ using id_type = typename std::remove_reference_t <decltype (ids)>::value_type;
277+ using score_type = float ;
278+
279+ std::vector<std::vector<fixed_min_pair_heap<score_type, id_type>>> scores (
265280 nthreads,
266- std::vector<fixed_min_pair_heap<float , Index >>(
267- size (q), fixed_min_pair_heap<float , Index >(k_nn)));
281+ std::vector<fixed_min_pair_heap<score_type, id_type >>(
282+ size (q), fixed_min_pair_heap<score_type, id_type >(k_nn)));
268283
269284 unsigned size_q = size (q);
270285 auto par = stdx::execution::indexed_parallel_policy{nthreads};
@@ -300,7 +315,7 @@ auto vq_query_heap_2(
300315 } while (load (db));
301316
302317 consolidate_scores (scores);
303- auto top_k = get_top_k_with_scores<fixed_min_pair_heap< float , Index>, Index> (scores, k_nn);
318+ auto top_k = get_top_k_with_scores (scores, k_nn);
304319
305320 return top_k;
306321}
0 commit comments