结构体 faiss::simd_result_handlers::ReservoirHandler

template<class C, bool with_id_map = false>
struct ReservoirHandler : public faiss::simd_result_handlers::ResultHandlerCompare<C, false>

使用水库的简单 top-N 实现。

结果在低于阈值时存储,直到达到容量。然后使用分区排序来更新阈值。 从几个 ReservoirTopN(每个查询一个)构建的处理程序

公开类型

using T = typename C::T
using TI = typename C::TI
using RHC = ResultHandlerCompare<C, with_id_map>

公共函数

inline ReservoirHandler(size_t nq, size_t ntotal, size_t k, size_t cap, float *dis, int64_t *ids, const IDSelector *sel_in)
inline virtual void handle(size_t q, size_t b, simd16uint16 d0, simd16uint16 d1) final

当计算出 32 个距离并在两个 simd16uint16 中提供时调用。(q, b) 指示它在块中的哪个条目。

inline virtual void end() override
inline virtual void set_block_origin(size_t i0_in, size_t j0_in) final

设置正在计算的子矩阵

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)

返回 (d0, d1) 中低于 thr 的元素的二进制掩码。inverse_test 返回高于 thr 的元素。

inline virtual void begin(const float *norms)

公共成员

size_t capacity
float *dis
int64_t *ids
std::vector<TI> all_ids
AlignedTable<T> all_vals
std::vector<ReservoirTopN<C>> reservoirs
bool disable
int64_t i0
int64_t j0
const IDSelector *sel
size_t nq
size_t ntotal
const idx_t *id_map = nullptr

这些字段主要用于 IVF 变体 (with_id_map=true)

const int *q_map = nullptr
const uint16_t *dbias = nullptr
const float *normalizers = nullptr
bool is_CMax = false
uint8_t sizeof_ids = 0
bool with_fields = false