Namespace faiss::simd_result_handlers

namespace simd_result_handlers
struct DummyResultHandler
#include <simd_result_handlers.h>

Dummy structure that just computes a checksum on results (to avoid the computation to be optimized away)

Public Functions

inline void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1)
inline void set_block_origin(size_t, size_t)

Public Members

size_t cs = 0
struct StoreResultHandler
#include <simd_result_handlers.h>

memorize results in a nq-by-nb matrix.

j0 is the current upper-left block of the matrix

Public Functions

inline StoreResultHandler(uint16_t *data, size_t ld)
inline void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1)
inline void set_block_origin(size_t i0, size_t j0)

Public Members

uint16_t *data
size_t ld
size_t i0 = 0
size_t j0 = 0
template<int NQ, int BB>
struct FixedStorageHandler
#include <simd_result_handlers.h>

stores results in fixed-size matrix.

Public Functions

inline void handle(int q, int b, simd16uint16 d0, simd16uint16 d1)
inline void set_block_origin(size_t i0, size_t j0)
template<class OtherResultHandler>
inline void to_other_handler(OtherResultHandler &other) const

Public Members

simd16uint16 dis[NQ][BB]
int i0 = 0
template<class C, bool with_id_map>
struct SIMDResultHandler
#include <simd_result_handlers.h>

Record origin of current block

Public Types

using TI = typename C::TI

Public Functions

inline explicit SIMDResultHandler(size_t ntotal)
inline void set_block_origin(size_t i0, size_t j0)
inline void adjust_with_origin(size_t &q, simd16uint16 &d0, simd16uint16 &d1)
inline int64_t adjust_id(size_t b, size_t j)
inline uint32_t get_lt_mask(uint16_t thr, size_t b, simd16uint16 d0, simd16uint16 d1)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above

virtual void to_flat_arrays(float *distances, int64_t *labels, const float *normalizers = nullptr) = 0
inline virtual ~SIMDResultHandler()

Public Members

bool disable = false
int64_t i0 = 0
int64_t j0 = 0
size_t ntotal
const TI *id_map

these fields are used mainly for the IVF variants (with_id_map=true)

const int *q_map
const uint16_t *dbias
template<class C, bool with_id_map = false>
struct SingleResultHandler : public faiss::simd_result_handlers::SIMDResultHandler<C, false>
#include <simd_result_handlers.h>

Special version for k=1

Public Types

using T = typename C::T
using TI = typename C::TI

Public Functions

inline SingleResultHandler(size_t nq, size_t ntotal)
inline void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1)
inline virtual void to_flat_arrays(float *distances, int64_t *labels, const float *normalizers = nullptr) override
inline void set_block_origin(size_t i0, size_t j0)
inline void adjust_with_origin(size_t &q, simd16uint16 &d0, simd16uint16 &d1)
inline int64_t adjust_id(size_t b, size_t j)
inline uint32_t get_lt_mask(uint16_t thr, size_t b, simd16uint16 d0, simd16uint16 d1)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above

Public Members

std::vector<Result> results
bool disable
int64_t i0
int64_t j0
size_t ntotal
const TI *id_map

these fields are used mainly for the IVF variants (with_id_map=true)

const int *q_map
const uint16_t *dbias
struct Result

Public Members

T val
TI id
template<class C, bool with_id_map = false>
struct HeapHandler : public faiss::simd_result_handlers::SIMDResultHandler<C, false>
#include <simd_result_handlers.h>

Structure that collects results in a min- or max-heap

Public Types

using T = typename C::T
using TI = typename C::TI

Public Functions

inline HeapHandler(int nq, T *heap_dis_tab, TI *heap_ids_tab, size_t k, size_t ntotal)
inline void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1)
inline virtual void to_flat_arrays(float *distances, int64_t *labels, const float *normalizers = nullptr) override
inline void set_block_origin(size_t i0, size_t j0)
inline void adjust_with_origin(size_t &q, simd16uint16 &d0, simd16uint16 &d1)
inline int64_t adjust_id(size_t b, size_t j)
inline uint32_t get_lt_mask(uint16_t thr, size_t b, simd16uint16 d0, simd16uint16 d1)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above

Public Members

int nq
T *heap_dis_tab
TI *heap_ids_tab
int64_t k
bool disable
int64_t i0
int64_t j0
size_t ntotal
const TI *id_map

these fields are used mainly for the IVF variants (with_id_map=true)

const int *q_map
const uint16_t *dbias
template<class C>
struct ReservoirTopN

Public Types

using T = typename C::T
using TI = typename C::TI

Public Functions

inline ReservoirTopN(size_t n, size_t capacity, T *vals, TI *ids)
inline void add(T val, TI id)
inline void shrink_xx()

shrink number of stored elements to n

inline void shrink()
inline void shrink_fuzzy()

Public Members

T *vals
TI *ids
size_t i
size_t n
size_t capacity
size_t cycles = 0
T threshold
template<class C, bool with_id_map = false>
struct ReservoirHandler : public faiss::simd_result_handlers::SIMDResultHandler<C, false>
#include <simd_result_handlers.h>

Handler built from several ReservoirTopN (one per query)

Public Types

using T = typename C::T
using TI = typename C::TI

Public Functions

inline ReservoirHandler(size_t nq, size_t ntotal, size_t n, size_t capacity_in)
inline void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1)
inline virtual void to_flat_arrays(float *distances, int64_t *labels, const float *normalizers = nullptr) override
inline void set_block_origin(size_t i0, size_t j0)
inline void adjust_with_origin(size_t &q, simd16uint16 &d0, simd16uint16 &d1)
inline int64_t adjust_id(size_t b, size_t j)
inline uint32_t get_lt_mask(uint16_t thr, size_t b, simd16uint16 d0, simd16uint16 d1)

return binary mask of elements below thr in (d0, d1) inverse_test returns elements above

Public Members

size_t capacity
std::vector<TI> all_ids
AlignedTable<T> all_vals
std::vector<ReservoirTopN<C>> reservoirs
uint64_t times[4]
bool disable
int64_t i0
int64_t j0
size_t ntotal
const TI *id_map

these fields are used mainly for the IVF variants (with_id_map=true)

const int *q_map
const uint16_t *dbias