11 #include "AuxIndexStructures.h"
13 #include "FaissAssert.h"
26 lims =
new size_t [nq + 1];
27 memset (
lims, 0,
sizeof(*
lims) * (nq + 1));
40 for (
int i = 0; i <
nq; i++) {
50 RangeSearchResult::~RangeSearchResult () {
61 BufferList::BufferList (
size_t buffer_size):
62 buffer_size (buffer_size)
67 BufferList::~BufferList ()
69 for (
int i = 0; i < buffers.size(); i++) {
70 delete [] buffers[i].ids;
71 delete [] buffers[i].dis;
77 void BufferList::append_buffer ()
79 Buffer buf = {
new idx_t [buffer_size],
new float [buffer_size]};
80 buffers.push_back (buf);
87 idx_t * dest_ids,
float *dest_dis)
89 size_t bno = ofs / buffer_size;
90 ofs -= bno * buffer_size;
92 size_t ncopy = ofs + n < buffer_size ? n : buffer_size - ofs;
93 Buffer buf = buffers [bno];
94 memcpy (dest_ids, buf.ids + ofs, ncopy *
sizeof(*dest_ids));
95 memcpy (dest_dis, buf.dis + ofs, ncopy *
sizeof(*dest_dis));
117 RangeSearchPartialResult::QueryResult &
121 queries.push_back (qres);
122 return queries.back();
126 void RangeSearchPartialResult::finalize ()
142 for (
int i = 0; i < queries.size(); i++) {
144 res->
lims[qres.qno] = qres.nres;
152 for (
int i = 0; i < queries.size(); i++) {
159 res->
lims[qres.qno] += qres.nres;
170 IDSelectorRange::IDSelectorRange (idx_t imin, idx_t imax):
171 imin (imin), imax (imax)
175 bool IDSelectorRange::is_member (idx_t
id)
const
177 return id >= imin &&
id < imax;
185 IDSelectorBatch::IDSelectorBatch (
long n,
const idx_t *indices)
188 while (n > (1L << nbits)) nbits++;
192 mask = (1L << nbits) - 1;
193 bloom.resize (1UL << (nbits - 3), 0);
194 for (
long i = 0; i < n; i++) {
195 long id = indices[i];
198 bloom[
id >> 3] |= 1 << (
id & 7);
202 bool IDSelectorBatch::is_member (idx_t i)
const
205 if(!(bloom[im>>3] & (1 << (im & 7)))) {
217 int IOReader::fileno ()
219 FAISS_THROW_MSG (
"IOReader does not support memory mapping");
222 int IOWriter::fileno ()
224 FAISS_THROW_MSG (
"IOWriter does not support memory mapping");
228 size_t VectorIOWriter::operator()(
229 const void *ptr,
size_t size,
size_t nitems)
231 size_t o = data.size();
232 data.resize(o + size * nitems);
233 memcpy (&data[o], ptr, size * nitems);
237 size_t VectorIOReader::operator()(
238 void *ptr,
size_t size,
size_t nitems)
240 if (rp >= data.size())
return 0;
241 size_t nremain = (data.size() - rp) / size;
242 if (nremain < nitems) nitems = nremain;
243 memcpy (ptr, &data[rp], size * nitems);
result structure for a single query
void copy_range(size_t ofs, size_t n, idx_t *dest_ids, float *dest_dis)
void set_result(bool incremental=false)
called by range_search after do_allocation
void set_lims()
called by range_search before do_allocation
RangeSearchResult(idx_t nq, bool alloc_lims=true)
lims must be allocated on input to range_search.
size_t wp
write pointer in the last buffer.
float * distances
corresponding distances (not sorted)
QueryResult & new_result(idx_t qno)
begin a new result
virtual void do_allocation()
size_t buffer_size
size of the result buffers used
size_t * lims
size (nq + 1)
idx_t * labels
result for query i is labels[lims[i]:lims[i+1]]