File ResultHandler.h

定义

DISPATCH_C_SEL(C, use_sel)
DISPATCH_C_SEL(C, use_sel)
namespace faiss

实现了 k-means 聚类算法的多种变体。

版权所有 (c) Facebook, Inc. 及其附属公司。

本源代码基于 MIT 许可证,可以在源代码树根目录的 LICENSE 文件中找到该许可证。

IDSelector 旨在定义要处理的向量子集(用于删除或作为搜索子集)

PQ4 SIMD 打包和累加函数

基本内核累加 nq 个查询向量,其中 bbs = nb * 2 * 16 个向量,并为该结果生成一个输出矩阵。 当 nq * nb <= 4 时,它很有用,否则寄存器溢出变得太大。

这些函数的实现分布在 3 个 cpp 文件中,以减少并行编译时间。 模板被显式实例化。

此文件包含用于计算距离的内核的回调。

在整个库中,向量以 float * 指针的形式提供。 当在一个批次中一起处理(添加/搜索)多个向量时,大多数算法都可以得到优化。 在这种情况下,它们作为矩阵传递。 当大小为 d 的 n 个向量作为 float * x 提供时,向量 i 的分量 j 为

x[ i * d + j ]

其中 0 <= i < n 且 0 <= j < d。换句话说,矩阵始终是紧凑的。 当指定矩阵的大小时,我们将其称为 n*d 矩阵,这意味着行优先存储。

I/O 函数可以读取/写入到文件名、文件句柄或抽象媒介的对象。

读取函数返回的对象应该使用 delete 进行释放。 这些对象中的所有引用都归该对象所有。

反向列表的定义 + 几个实现该接口的常见类。

由于 IVF(反向文件)索引对于大规模用例非常有用,因此我们将与它们相关的一些函数分组到这个小库中。 大多数函数都可以在 IndexIVF 和嵌入在 IndexPreTransform 中的 IndexIVF 上工作。

在此文件中,实现了除 L2 和内积之外的额外度量。

实现了一些神经网络层,主要用于支持 QINCo

定义了一些对一组向量应用转换的对象。通常这些是预处理步骤。

函数

template<class Consumer, class ...Types>
Consumer::T dispatch_knn_ResultHandler(size_t nx, float *vals, int64_t *ids, size_t k, MetricType metric, const IDSelector *sel, Consumer &consumer, Types... args)
template<class Consumer, class ...Types>
Consumer::T dispatch_range_ResultHandler(RangeSearchResult *res, float radius, MetricType metric, const IDSelector *sel, Consumer &consumer, Types... args)

变量

FAISS_API int distance_compute_min_k_reservoir
template<class C>
struct ResultHandler

继承自 faiss::HeapBlockResultHandler< C, use_sel >::SingleResultHandler, faiss::RangeSearchBlockResultHandler< C, use_sel >::SingleResultHandler, faiss::ReservoirTopN< C >, faiss::Top1BlockResultHandler< C, use_sel >::SingleResultHandler

公共函数

virtual bool add_result(typename C::T dis, typename C::TI idx) = 0
inline virtual ~ResultHandler()

公共成员

C::T threshold = C::neutral()
template<class C, bool use_sel = false>
struct BlockResultHandler

公共函数

inline explicit BlockResultHandler(size_t nq, const IDSelector *sel = nullptr)
inline virtual void begin_multiple(size_t i0_2, size_t i1_2)
inline virtual void add_results(size_t, size_t, const typename C::T*)
inline virtual void end_multiple()
inline virtual ~BlockResultHandler()
inline bool is_in_selection(idx_t i) const

公共成员

size_t nq
const IDSelector *sel
size_t i0 = 0
size_t i1 = 0
template<class C, bool use_sel = false>
struct Top1BlockResultHandler : public faiss::BlockResultHandler<C, false>

公共类型

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

公共函数

inline Top1BlockResultHandler(size_t nq, T *dis_tab, TI *ids_tab, const IDSelector *sel = nullptr)
inline virtual void begin_multiple(size_t i0, size_t i1) final

开始

inline void add_results(size_t j0, size_t j1, const T *dis_tab_2) final

为查询 i0..i1 和 j0..j1 添加结果

inline void add_result(const size_t i, const T dis, const TI idx)
inline virtual void add_results(size_t, size_t, const typename C::T*)
inline virtual void end_multiple()
inline bool is_in_selection(idx_t i) const

公共成员

T *dis_tab
TI *ids_tab
size_t nq
const IDSelector *sel
size_t i0
size_t i1
struct SingleResultHandler : public faiss::ResultHandler<C>

公共函数

inline explicit SingleResultHandler(Top1BlockResultHandler &hr)
inline void begin(const size_t current_idx_2)

开始查询 # i 的结果

inline virtual bool add_result(T dis, TI idx) final

为查询 i 添加一个结果

inline void end()

查询 i 的一系列结果已完成

公共成员

Top1BlockResultHandler &hr
TI min_idx
size_t current_idx = 0
C::T threshold = C::neutral()
template<class C, bool use_sel = false>
struct HeapBlockResultHandler : public faiss::BlockResultHandler<C, false>

公共类型

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

公共函数

inline HeapBlockResultHandler(size_t nq, T *heap_dis_tab, TI *heap_ids_tab, size_t k, const IDSelector *sel = nullptr)
inline virtual void begin_multiple(size_t i0_2, size_t i1_2) final

开始

inline void add_results(size_t j0, size_t j1, const T *dis_tab) final

为查询 i0..i1 和 j0..j1 添加结果

inline virtual void end_multiple() final

查询 i0..i1 的一系列结果已完成

inline virtual void add_results(size_t, size_t, const typename C::T*)
inline bool is_in_selection(idx_t i) const

公共成员

T *heap_dis_tab
TI *heap_ids_tab
int64_t k
size_t nq
const IDSelector *sel
size_t i0
size_t i1
struct SingleResultHandler : public faiss::ResultHandler<C>

公共函数

inline explicit SingleResultHandler(HeapBlockResultHandler &hr)
inline void begin(size_t i)

开始查询 # i 的结果

inline virtual bool add_result(T dis, TI idx) final

为查询 i 添加一个结果

inline void end()

查询 i 的一系列结果已完成

公共成员

HeapBlockResultHandler &hr
size_t k
T *heap_dis
TI *heap_ids
C::T threshold = C::neutral()
template<class C>
struct ReservoirTopN : public faiss::ResultHandler<C>
#include <ResultHandler.h>

单次查询的储存器。

faiss::ReservoirBlockResultHandler< C, use_sel >::SingleResultHandler 子类化

公共类型

using T = typename C::T
使用 TI = C::TI

公共函数

内联 ReservoirTopN()
内联 ReservoirTopN(大小 n, 大小 capacity, T *vals, TI *ids)
内联 虚函数 bool add_result(T val, TI id) final
内联 void add(T val, TI id)
内联 void shrink_fuzzy()
内联 void shrink()
内联 void to_result(T *heap_dis, TI *heap_ids) const

公共成员

T *vals
TI *ids
大小 i
大小 n
大小 capacity
C::T threshold = C::neutral()
template <class C, bool use_sel = false>
struct ReservoirBlockResultHandler : public faiss::BlockResultHandler<C, false>

公共类型

使用 T = C::T
使用 TI = C::TI

公共函数

     构造函数ReservoirBlockResultHandler(size_t nq, T *heap_dis_tab, TI *heap_ids_tab, size_t k, const IDSelector *sel = nullptr)
     虚函数:开始处理多个查询结果块,范围从索引 i0_2i1_2

开始

     内联函数:添加结果,范围从索引 j0j1 ,距离值存储在 dis_tab 中。

为查询 i0..i1 和 j0..j1 添加结果

     虚函数:结束处理多个查询结果块。

查询 i0..i1 的一系列结果已完成

     虚函数:添加结果,距离值类型为 C::T 的指针。
     内联函数:检查索引 i 是否在选择器中。

公共成员

     堆距离表。
     堆 ID 表。
int64_t k
size_t capacity
std::vector<T> reservoir_dis
std::vector<TI> reservoir_ids
std::vector<ReservoirTopN<C>> reservoirs
size_t nq
const IDSelector *sel
size_t i0
size_t i1
struct SingleResultHandler : public faiss::ReservoirTopN<C>

公共类型

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

公共函数

inline explicit SingleResultHandler(ReservoirBlockResultHandler &hr)
inline void begin(size_t qno_2)

开始查询 # i 的结果

inline void end()

查询 qno 的一系列结果已完成

inline virtual bool add_result(T val, TI id) final
inline void add(T val, TI id)
inline void shrink_fuzzy()
inline void shrink()
inline void to_result(T *heap_dis, TI *heap_ids) const

公共成员

ReservoirBlockResultHandler &hr
std::vector<T> reservoir_dis
std::vector<TI> reservoir_ids
size_t qno
T *vals
TI *ids
size_t i
size_t n
size_t capacity
C::T threshold = C::neutral()
template<class C, bool use_sel = false>
struct RangeSearchBlockResultHandler : public faiss::BlockResultHandler<C, false>

公共类型

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

公共函数

inline RangeSearchBlockResultHandler(RangeSearchResult *res, float radius, const IDSelector *sel = nullptr)
inline virtual void begin_multiple(size_t i0_2, size_t i1_2)

开始

inline void add_results(size_t j0, size_t j1, const T *dis_tab)

为查询 i0..i1 和 j0..j1 添加结果

inline ~RangeSearchBlockResultHandler()
inline virtual void add_results(size_t, size_t, const typename C::T*)
inline virtual void end_multiple()
inline bool is_in_selection(idx_t i) const

公共成员

RangeSearchResult *res
T radius
std::vector<RangeSearchPartialResult*> partial_results
std::vector<size_t> j0s
int pr = 0
size_t nq
const IDSelector *sel
size_t i0
size_t i1
struct SingleResultHandler : public faiss::ResultHandler<C>

公共函数

inline explicit SingleResultHandler(RangeSearchBlockResultHandler &rh)
inline void begin(size_t i)

开始查询 # i 的结果

inline virtual bool add_result(T dis, TI idx) final

为查询 i 添加一个结果

inline void end()

查询 i 的一系列结果已完成

inline ~SingleResultHandler()

公共成员

RangeSearchPartialResult pres
RangeQueryResult *qr = nullptr
C::T threshold = C::neutral()