文件 InvertedLists.h

namespace faiss

实现具有多种变体的 k-means 聚类。

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

此源代码已获得 MIT 许可,该许可位于此源树的根目录下的 LICENSE 文件中。

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

PQ4 SIMD 封装和累积函数

基本内核使用 bbs = nb * 2 * 16 个向量累积 nq 个查询向量,并生成该向量的输出矩阵。 对于 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

定义一些将变换应用于向量集的对象 通常这些是预处理步骤。

类型定义

using ConcatenatedInvertedLists = HStackInvertedLists
struct InvertedListsIterator

公共函数

virtual ~InvertedListsIterator()
virtual bool is_available() const = 0
virtual void next() = 0
virtual std::pair<idx_t, const uint8_t*> get_id_and_codes() = 0
struct InvertedLists
#include <InvertedLists.h>

倒排列表多线程规则表

  • 允许并发读取访问

  • 允许并发更新访问

  • 对于 resize 和 add_entries,仅允许并发访问不同的列表

faiss::ArrayInvertedLists, faiss::BlockInvertedLists, faiss::OnDiskInvertedLists, faiss::ReadOnlyInvertedLists 继承

公共类型

enum subset_type_t

enumerator SUBSET_TYPE_ID_RANGE
enumerator SUBSET_TYPE_ID_MOD
enumerator SUBSET_TYPE_ELEMENT_RANGE
enumerator SUBSET_TYPE_INVLIST_FRACTION
enumerator SUBSET_TYPE_INVLIST

公共函数

InvertedLists(size_t nlist, size_t code_size)
virtual ~InvertedLists()
virtual size_t list_size(size_t list_no) const = 0

获取列表的大小

virtual const uint8_t *get_codes(size_t list_no) const = 0

获取倒排列表的代码,必须由 release_codes 释放

返回值:

代码大小:list_size * code_size

virtual const idx_t *get_ids(size_t list_no) const = 0

获取倒排列表的 ID,必须由 release_ids 释放

返回值:

ID 大小:list_size

virtual void release_codes(size_t list_no, const uint8_t *codes) const

释放 get_codes 返回的代码(默认实现为空操作)

virtual void release_ids(size_t list_no, const idx_t *ids) const

释放 get_ids 返回的 ID

virtual idx_t get_single_id(size_t list_no, size_t offset) const
返回值:

倒排列表中的单个 ID

virtual const uint8_t *get_single_code(size_t list_no, size_t offset) const
返回值:

倒排列表中的单个代码(应该使用 release_codes 释放)

virtual void prefetch_lists(const idx_t *list_nos, int nlist) const

准备以下列表(默认情况下不执行任何操作),列表可以是 -1,因此是有符号的长整型。

virtual bool is_empty(size_t list_no, void *inverted_list_context = nullptr) const

检查列表是否为空。

virtual InvertedListsIterator *get_iterator(size_t list_no, void *inverted_list_context = nullptr) const

获取使用 use_iterator 的列表的可迭代对象。

virtual size_t add_entry(size_t list_no, idx_t theid, const uint8_t *code, void *inverted_list_context = nullptr)

将一个条目添加到倒排列表中。

virtual size_t add_entries(size_t list_no, size_t n_entry, const idx_t *ids, const uint8_t *code) = 0
virtual void update_entry(size_t list_no, size_t offset, idx_t id, const uint8_t *code)
virtual void update_entries(size_t list_no, size_t offset, size_t n_entry, const idx_t *ids, const uint8_t *code) = 0
virtual void resize(size_t list_no, size_t new_size) = 0
virtual void reset()
void merge_from(InvertedLists *oivf, size_t add_id)

移动来自 oivf 的所有条目(输出时为空)。

size_t copy_subset_to(InvertedLists &other, subset_type_t subset_type, idx_t a1, idx_t a2) const

将条目索引的子集复制到另一个索引。

返回值:

复制的条目数。

double imbalance_factor() const

1 = 完美平衡,>1: 不平衡

void print_stats() const

显示关于倒排列表的一些统计信息

size_t compute_ntotal() const

汇总列表大小

公共成员

size_t nlist

可能的键值的数量

size_t code_size

每个向量的编码大小(字节)

bool use_iterator = false

请求使用迭代器而不是 get_codes / get_ids

公共静态属性

static const size_t INVALID_CODE_SIZE = static_cast<size_t>(-1)

用于 BlockInvertedLists,其中代码被打包成组,并且单个代码大小没有意义

struct ScopedCodes

公共函数

inline ScopedCodes(const InvertedLists *il, size_t list_no)
inline ScopedCodes(const InvertedLists *il, size_t list_no, size_t offset)
inline const uint8_t *get()
inline ~ScopedCodes()

公共成员

const InvertedLists *il
const uint8_t *codes
size_t list_no
struct ScopedIds

公共函数

inline ScopedIds(const InvertedLists *il, size_t list_no)
inline const idx_t *get()
inline idx_t operator[](size_t i) const
inline ~ScopedIds()

公共成员

const InvertedLists *il
const idx_t *ids
size_t list_no
struct ArrayInvertedLists : public faiss::InvertedLists
#include <InvertedLists.h>

作为倒排列表数组的简单(默认)实现

公共类型

enum subset_type_t

enumerator SUBSET_TYPE_ID_RANGE
enumerator SUBSET_TYPE_ID_MOD
enumerator SUBSET_TYPE_ELEMENT_RANGE
enumerator SUBSET_TYPE_INVLIST_FRACTION
enumerator SUBSET_TYPE_INVLIST

公共函数

ArrayInvertedLists(size_t nlist, size_t code_size)
virtual size_t list_size(size_t list_no) const override

获取列表的大小

virtual const uint8_t *get_codes(size_t list_no) const override

获取倒排列表的代码,必须由 release_codes 释放

返回值:

代码大小:list_size * code_size

virtual const idx_t *get_ids(size_t list_no) const override

获取倒排列表的 ID,必须由 release_ids 释放

返回值:

ID 大小:list_size

virtual size_t add_entries(size_t list_no, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void update_entries(size_t list_no, size_t offset, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void resize(size_t list_no, size_t new_size) override
void permute_invlists(const idx_t *map)

置换倒排列表,map 将 new_id 映射到 old_id

virtual bool is_empty(size_t list_no, void *inverted_list_context = nullptr) const override

检查列表是否为空。

~ArrayInvertedLists() override
virtual void release_codes(size_t list_no, const uint8_t *codes) const

释放 get_codes 返回的代码(默认实现为空操作)

virtual void release_ids(size_t list_no, const idx_t *ids) const

释放 get_ids 返回的 ID

virtual idx_t get_single_id(size_t list_no, size_t offset) const
返回值:

倒排列表中的单个 ID

virtual const uint8_t *get_single_code(size_t list_no, size_t offset) const
返回值:

倒排列表中的单个代码(应该使用 release_codes 释放)

virtual void prefetch_lists(const idx_t *list_nos, int nlist) const

准备以下列表(默认情况下不执行任何操作),列表可以是 -1,因此是有符号的长整型。

virtual InvertedListsIterator *get_iterator(size_t list_no, void *inverted_list_context = nullptr) const

获取使用 use_iterator 的列表的可迭代对象。

virtual size_t add_entry(size_t list_no, idx_t theid, const uint8_t *code, void *inverted_list_context = nullptr)

将一个条目添加到倒排列表中。

virtual void update_entry(size_t list_no, size_t offset, idx_t id, const uint8_t *code)
virtual void reset()
void merge_from(InvertedLists *oivf, size_t add_id)

移动来自 oivf 的所有条目(输出时为空)。

将子集复制到另一个倒排索引列表。

将条目索引的子集复制到另一个索引。

返回值:

复制的条目数。

计算不平衡因子。

1 = 完美平衡,>1: 不平衡

打印统计信息。

显示关于倒排列表的一些统计信息

计算总条目数。

汇总列表大小

公共成员

码本(每个倒排列表一个向量的向量)。
id 的向量(每个倒排列表一个向量的向量)。

索引的倒排列表。

倒排列表的数量。

可能的键值的数量

存储向量的字节大小。

每个向量的编码大小(字节)

是否使用迭代器。

请求使用迭代器而不是 get_codes / get_ids

公共静态属性

无效码本大小。

用于 BlockInvertedLists,其中代码被打包成组,并且单个代码大小没有意义

只读的倒排列表,所有写入函数都会失败。
#include <InvertedLists.h>

对于所有写入函数都会失败的 invlist。

faiss::HStackInvertedLists, faiss::MaskedInvertedLists, faiss::SliceInvertedLists, faiss::StopWordsInvertedLists, faiss::VStackInvertedLists 继承。

公共类型

子集类型的枚举。

ID 范围子集类型。
ID 取模子集类型。
元素范围子集类型。
倒排列表分数子集类型。
倒排列表子集类型。

公共函数

构造函数。
添加条目(总是失败)。
virtual void update_entries(size_t list_no, size_t offset, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void resize(size_t list_no, size_t new_size) override
virtual size_t list_size(size_t list_no) const = 0

获取列表的大小

virtual const uint8_t *get_codes(size_t list_no) const = 0

获取倒排列表的代码,必须由 release_codes 释放

返回值:

代码大小:list_size * code_size

virtual const idx_t *get_ids(size_t list_no) const = 0

获取倒排列表的 ID,必须由 release_ids 释放

返回值:

ID 大小:list_size

virtual void release_codes(size_t list_no, const uint8_t *codes) const

释放 get_codes 返回的代码(默认实现为空操作)

virtual void release_ids(size_t list_no, const idx_t *ids) const

释放 get_ids 返回的 ID

virtual idx_t get_single_id(size_t list_no, size_t offset) const
返回值:

倒排列表中的单个 ID

virtual const uint8_t *get_single_code(size_t list_no, size_t offset) const
返回值:

倒排列表中的单个代码(应该使用 release_codes 释放)

virtual void prefetch_lists(const idx_t *list_nos, int nlist) const

准备以下列表(默认情况下不执行任何操作),列表可以是 -1,因此是有符号的长整型。

virtual bool is_empty(size_t list_no, void *inverted_list_context = nullptr) const

检查列表是否为空。

virtual InvertedListsIterator *get_iterator(size_t list_no, void *inverted_list_context = nullptr) const

获取使用 use_iterator 的列表的可迭代对象。

virtual size_t add_entry(size_t list_no, idx_t theid, const uint8_t *code, void *inverted_list_context = nullptr)

将一个条目添加到倒排列表中。

virtual void update_entry(size_t list_no, size_t offset, idx_t id, const uint8_t *code)
virtual void reset()
void merge_from(InvertedLists *oivf, size_t add_id)

移动来自 oivf 的所有条目(输出时为空)。

size_t copy_subset_to(InvertedLists &other, subset_type_t subset_type, idx_t a1, idx_t a2) const

将条目索引的子集复制到另一个索引。

返回值:

复制的条目数。

double imbalance_factor() const

1 = 完美平衡,>1: 不平衡

void print_stats() const

显示关于倒排列表的一些统计信息

size_t compute_ntotal() const

汇总列表大小

公共成员

size_t nlist

可能的键值的数量

size_t code_size

每个向量的编码大小(字节)

bool use_iterator = false

请求使用迭代器而不是 get_codes / get_ids

公共静态属性

static const size_t INVALID_CODE_SIZE = static_cast<size_t>(-1)

用于 BlockInvertedLists,其中代码被打包成组,并且单个代码大小没有意义

struct HStackInvertedLists : public faiss::ReadOnlyInvertedLists
#include <InvertedLists.h>

倒排列表的水平堆叠。

公共类型

enum subset_type_t

enumerator SUBSET_TYPE_ID_RANGE
enumerator SUBSET_TYPE_ID_MOD
enumerator SUBSET_TYPE_ELEMENT_RANGE
enumerator SUBSET_TYPE_INVLIST_FRACTION
enumerator SUBSET_TYPE_INVLIST

公共函数

HStackInvertedLists(int nil, const InvertedLists **ils)

通过连接 nil 个倒排列表来构建 InvertedLists

virtual size_t list_size(size_t list_no) const override

获取列表的大小

virtual const uint8_t *get_codes(size_t list_no) const override

获取倒排列表的代码,必须由 release_codes 释放

返回值:

代码大小:list_size * code_size

virtual const idx_t *get_ids(size_t list_no) const override

获取倒排列表的 ID,必须由 release_ids 释放

返回值:

ID 大小:list_size

virtual void prefetch_lists(const idx_t *list_nos, int nlist) const override

准备以下列表(默认情况下不执行任何操作),列表可以是 -1,因此是有符号的长整型。

virtual void release_codes(size_t list_no, const uint8_t *codes) const override

释放 get_codes 返回的代码(默认实现为空操作)

virtual void release_ids(size_t list_no, const idx_t *ids) const override

释放 get_ids 返回的 ID

virtual idx_t get_single_id(size_t list_no, size_t offset) const override
返回值:

倒排列表中的单个 ID

virtual const uint8_t *get_single_code(size_t list_no, size_t offset) const override
返回值:

倒排列表中的单个代码(应该使用 release_codes 释放)

virtual size_t add_entries(size_t list_no, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void update_entries(size_t list_no, size_t offset, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void resize(size_t list_no, size_t new_size) override
virtual bool is_empty(size_t list_no, void *inverted_list_context = nullptr) const

检查列表是否为空。

virtual InvertedListsIterator *get_iterator(size_t list_no, void *inverted_list_context = nullptr) const

获取使用 use_iterator 的列表的可迭代对象。

virtual size_t add_entry(size_t list_no, idx_t theid, const uint8_t *code, void *inverted_list_context = nullptr)

将一个条目添加到倒排列表中。

更新倒排列表中的一个条目。
重置倒排列表。
从另一个倒排列表合并。

移动来自 oivf 的所有条目(输出时为空)。

size_t copy_subset_to(InvertedLists &other, subset_type_t subset_type, idx_t a1, idx_t a2) const

将条目索引的子集复制到另一个索引。

返回值:

复制的条目数。

double imbalance_factor() const

1 = 完美平衡,>1: 不平衡

void print_stats() const

显示关于倒排列表的一些统计信息

size_t compute_ntotal() const

汇总列表大小

公共成员

std::vector<const InvertedLists*> ils
size_t nlist

可能的键值的数量

size_t code_size

每个向量的编码大小(字节)

bool use_iterator = false

请求使用迭代器而不是 get_codes / get_ids

公共静态属性

static const size_t INVALID_CODE_SIZE = static_cast<size_t>(-1)

用于 BlockInvertedLists,其中代码被打包成组,并且单个代码大小没有意义

struct SliceInvertedLists : public faiss::ReadOnlyInvertedLists
#include <InvertedLists.h>

vertical slice of indexes in another InvertedLists

公共类型

enum subset_type_t

enumerator SUBSET_TYPE_ID_RANGE
enumerator SUBSET_TYPE_ID_MOD
enumerator SUBSET_TYPE_ELEMENT_RANGE
枚举算符 SUBSET_TYPE_INVLIST_FRACTION
枚举算符 SUBSET_TYPE_INVLIST

公共函数

SliceInvertedLists(const InvertedLists *il, idx_t i0, idx_t i1)
virtual size_t list_size(size_t list_no) const override

获取列表的大小

virtual const uint8_t *get_codes(size_t list_no) const override

获取倒排列表的代码,必须由 release_codes 释放

返回值:

代码大小:list_size * code_size

virtual const idx_t *get_ids(size_t list_no) const override

获取倒排列表的 ID,必须由 release_ids 释放

返回值:

ID 大小:list_size

virtual void release_codes(size_t list_no, const uint8_t *codes) const override

释放 get_codes 返回的代码(默认实现为空操作)

virtual void release_ids(size_t list_no, const idx_t *ids) const override

释放 get_ids 返回的 ID

virtual idx_t get_single_id(size_t list_no, size_t offset) const override
返回值:

倒排列表中的单个 ID

virtual const uint8_t *get_single_code(size_t list_no, size_t offset) const override
返回值:

倒排列表中的单个代码(应该使用 release_codes 释放)

virtual void prefetch_lists(const idx_t *list_nos, int nlist) const override

准备以下列表(默认情况下不执行任何操作),列表可以是 -1,因此是有符号的长整型。

virtual size_t add_entries(size_t list_no, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void update_entries(size_t list_no, size_t offset, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void resize(size_t list_no, size_t new_size) override
virtual bool is_empty(size_t list_no, void *inverted_list_context = nullptr) const

检查列表是否为空。

virtual InvertedListsIterator *get_iterator(size_t list_no, void *inverted_list_context = nullptr) const

获取使用 use_iterator 的列表的可迭代对象。

virtual size_t add_entry(size_t list_no, idx_t theid, const uint8_t *code, void *inverted_list_context = nullptr)

将一个条目添加到倒排列表中。

virtual void update_entry(size_t list_no, size_t offset, idx_t id, const uint8_t *code)
virtual void reset()
void merge_from(InvertedLists *oivf, size_t add_id)

移动来自 oivf 的所有条目(输出时为空)。

size_t copy_subset_to(InvertedLists &other, subset_type_t subset_type, idx_t a1, idx_t a2) const

将条目索引的子集复制到另一个索引。

返回值:

复制的条目数。

double imbalance_factor() const

1 = 完美平衡,>1: 不平衡

void print_stats() const

显示关于倒排列表的一些统计信息

size_t compute_ntotal() const

汇总列表大小

公共成员

const InvertedLists *il
idx_t i0
idx_t i1
size_t nlist

可能的键值的数量

size_t code_size

每个向量的编码大小(字节)

bool use_iterator = false

请求使用迭代器而不是 get_codes / get_ids

公共静态属性

static const size_t INVALID_CODE_SIZE = static_cast<size_t>(-1)

用于 BlockInvertedLists,其中代码被打包成组,并且单个代码大小没有意义

struct VStackInvertedLists : public faiss::ReadOnlyInvertedLists

公共类型

enum subset_type_t

enumerator SUBSET_TYPE_ID_RANGE
enumerator SUBSET_TYPE_ID_MOD
enumerator SUBSET_TYPE_ELEMENT_RANGE
enumerator SUBSET_TYPE_INVLIST_FRACTION
enumerator SUBSET_TYPE_INVLIST

公共函数

VStackInvertedLists(int nil, const InvertedLists **ils)

通过连接 nil 个倒排列表来构建 InvertedLists

virtual size_t list_size(size_t list_no) const override

获取列表的大小

virtual const uint8_t *get_codes(size_t list_no) const override

获取倒排列表的代码,必须由 release_codes 释放

返回值:

代码大小:list_size * code_size

virtual const idx_t *get_ids(size_t list_no) const override

获取倒排列表的 ID,必须由 release_ids 释放

返回值:

ID 大小:list_size

virtual void release_codes(size_t list_no, const uint8_t *codes) const override

释放 get_codes 返回的代码(默认实现为空操作)

virtual void release_ids(size_t list_no, const idx_t *ids) const override

释放 get_ids 返回的 ID

virtual idx_t get_single_id(size_t list_no, size_t offset) const override
返回值:

倒排列表中的单个 ID

获取单个码字。(list_no: 列表编号, offset: 偏移量)
返回值:

倒排列表中的单个代码(应该使用 release_codes 释放)

预取列表。(list_nos: 列表编号数组, nlist: 列表数量)

准备以下列表(默认情况下不执行任何操作),列表可以是 -1,因此是有符号的长整型。

添加条目。(list_no: 列表编号, n_entry: 条目数量, ids: ID数组, code: 码字)
更新条目。(list_no: 列表编号, offset: 偏移量, n_entry: 条目数量, ids: ID数组, code: 码字)
virtual void resize(size_t list_no, size_t new_size) override
virtual bool is_empty(size_t list_no, void *inverted_list_context = nullptr) const

检查列表是否为空。

virtual InvertedListsIterator *get_iterator(size_t list_no, void *inverted_list_context = nullptr) const

获取使用 use_iterator 的列表的可迭代对象。

virtual size_t add_entry(size_t list_no, idx_t theid, const uint8_t *code, void *inverted_list_context = nullptr)

将一个条目添加到倒排列表中。

virtual void update_entry(size_t list_no, size_t offset, idx_t id, const uint8_t *code)
virtual void reset()
void merge_from(InvertedLists *oivf, size_t add_id)

移动来自 oivf 的所有条目(输出时为空)。

size_t copy_subset_to(InvertedLists &other, subset_type_t subset_type, idx_t a1, idx_t a2) const

将条目索引的子集复制到另一个索引。

返回值:

复制的条目数。

double imbalance_factor() const

1 = 完美平衡,>1: 不平衡

void print_stats() const

显示关于倒排列表的一些统计信息

size_t compute_ntotal() const

汇总列表大小

公共成员

std::vector<const InvertedLists*> ils
std::vector<idx_t> cumsz
size_t nlist

可能的键值的数量

size_t code_size

每个向量的编码大小(字节)

bool use_iterator = false

请求使用迭代器而不是 get_codes / get_ids

公共静态属性

static const size_t INVALID_CODE_SIZE = static_cast<size_t>(-1)

用于 BlockInvertedLists,其中代码被打包成组,并且单个代码大小没有意义

struct MaskedInvertedLists : public faiss::ReadOnlyInvertedLists
#include <InvertedLists.h>

如果第一个倒排列表非空,则使用它,否则使用第二个。

如果 il1 中有几个倒排列表太长,而 il0 有这些列表的替换列表(其他列表为空),则此方法非常有用。

公共类型

enum subset_type_t

enumerator SUBSET_TYPE_ID_RANGE
enumerator SUBSET_TYPE_ID_MOD
enumerator SUBSET_TYPE_ELEMENT_RANGE
enumerator SUBSET_TYPE_INVLIST_FRACTION
enumerator SUBSET_TYPE_INVLIST

公共函数

MaskedInvertedLists(const InvertedLists *il0, const InvertedLists *il1)
virtual size_t list_size(size_t list_no) const override

获取列表的大小

virtual const uint8_t *get_codes(size_t list_no) const override

获取倒排列表的代码,必须由 release_codes 释放

返回值:

代码大小:list_size * code_size

获取指定列表的ID。

获取倒排列表的 ID,必须由 release_ids 释放

返回值:

ID 大小:list_size

virtual void release_codes(size_t list_no, const uint8_t *codes) const override

释放 get_codes 返回的代码(默认实现为空操作)

virtual void release_ids(size_t list_no, const idx_t *ids) const override

释放 get_ids 返回的 ID

virtual idx_t get_single_id(size_t list_no, size_t offset) const override
返回值:

倒排列表中的单个 ID

virtual const uint8_t *get_single_code(size_t list_no, size_t offset) const override
返回值:

倒排列表中的单个代码(应该使用 release_codes 释放)

virtual void prefetch_lists(const idx_t *list_nos, int nlist) const override

准备以下列表(默认情况下不执行任何操作),列表可以是 -1,因此是有符号的长整型。

virtual size_t add_entries(size_t list_no, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void update_entries(size_t list_no, size_t offset, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void resize(size_t list_no, size_t new_size) override
virtual bool is_empty(size_t list_no, void *inverted_list_context = nullptr) const

检查列表是否为空。

获取倒排列表的迭代器。

获取使用 use_iterator 的列表的可迭代对象。

向倒排列表添加条目。

将一个条目添加到倒排列表中。

更新倒排列表中的条目。
重置倒排列表。
从另一个倒排列表合并。

移动来自 oivf 的所有条目(输出时为空)。

将子集复制到另一个倒排列表。

将条目索引的子集复制到另一个索引。

返回值:

复制的条目数。

计算不平衡因子。

1 = 完美平衡,>1: 不平衡

打印统计信息。

显示关于倒排列表的一些统计信息

计算总条目数。

汇总列表大小

公共成员

第一个倒排列表。
第二个倒排列表。
列表的数量。

可能的键值的数量

代码的大小。

每个向量的编码大小(字节)

是否使用迭代器。

请求使用迭代器而不是 get_codes / get_ids

公共静态属性

无效的代码大小。

用于 BlockInvertedLists,其中代码被打包成组,并且单个代码大小没有意义

停用词倒排列表。
#include <InvertedLists.h>

如果 il 中的倒排列表小于 maxsize,则返回它,否则返回一个空的 invlist。

公共类型

enum subset_type_t

enumerator SUBSET_TYPE_ID_RANGE
enumerator SUBSET_TYPE_ID_MOD
enumerator SUBSET_TYPE_ELEMENT_RANGE
enumerator SUBSET_TYPE_INVLIST_FRACTION
enumerator SUBSET_TYPE_INVLIST

公共函数

StopWordsInvertedLists(const InvertedLists *il, size_t maxsize)
virtual size_t list_size(size_t list_no) const override

获取列表的大小

virtual const uint8_t *get_codes(size_t list_no) const override

获取倒排列表的代码,必须由 release_codes 释放

返回值:

代码大小:list_size * code_size

virtual const idx_t *get_ids(size_t list_no) const override

获取倒排列表的 ID,必须由 release_ids 释放

返回值:

ID 大小:list_size

virtual void release_codes(size_t list_no, const uint8_t *codes) const override

释放 get_codes 返回的代码(默认实现为空操作)

virtual void release_ids(size_t list_no, const idx_t *ids) const override

释放 get_ids 返回的 ID

virtual idx_t get_single_id(size_t list_no, size_t offset) const override
返回值:

倒排列表中的单个 ID

virtual const uint8_t *get_single_code(size_t list_no, size_t offset) const override
返回值:

倒排列表中的单个代码(应该使用 release_codes 释放)

virtual void prefetch_lists(const idx_t *list_nos, int nlist) const override

准备以下列表(默认情况下不执行任何操作),列表可以是 -1,因此是有符号的长整型。

virtual size_t add_entries(size_t list_no, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void update_entries(size_t list_no, size_t offset, size_t n_entry, const idx_t *ids, const uint8_t *code) override
virtual void resize(size_t list_no, size_t new_size) override
virtual bool is_empty(size_t list_no, void *inverted_list_context = nullptr) const

检查列表是否为空。

virtual InvertedListsIterator *get_iterator(size_t list_no, void *inverted_list_context = nullptr) const

获取使用 use_iterator 的列表的可迭代对象。

virtual size_t add_entry(size_t list_no, idx_t theid, const uint8_t *code, void *inverted_list_context = nullptr)

将一个条目添加到倒排列表中。

virtual void update_entry(size_t list_no, size_t offset, idx_t id, const uint8_t *code)
virtual void reset()
void merge_from(InvertedLists *oivf, size_t add_id)

移动来自 oivf 的所有条目(输出时为空)。

size_t copy_subset_to(InvertedLists &other, subset_type_t subset_type, idx_t a1, idx_t a2) const

将条目索引的子集复制到另一个索引。

返回值:

复制的条目数。

double imbalance_factor() const

1 = 完美平衡,>1: 不平衡

void print_stats() const

显示关于倒排列表的一些统计信息

size_t compute_ntotal() const

汇总列表大小

公共成员

const InvertedLists *il0
size_t maxsize
size_t nlist

可能的键值的数量

size_t code_size

每个向量的编码大小(字节)

bool use_iterator = false

请求使用迭代器而不是 get_codes / get_ids

公共静态属性

static const size_t INVALID_CODE_SIZE = static_cast<size_t>(-1)

用于 BlockInvertedLists,其中代码被打包成组,并且单个代码大小没有意义