结构体 faiss::ScalarQuantizer

struct ScalarQuantizer : public faiss::Quantizer

均匀量化器具有范围 [vmin, vmax]。 该范围对于所有维度可以相同(均匀),或者对于每个维度可以不同(默认)。

公共类型

enum QuantizerType

enumerator QT_8bit

每个分量 8 位

enumerator QT_4bit

每个分量 4 位

enumerator QT_8bit_uniform

相同,所有维度共享范围

enumerator QT_4bit_uniform
enumerator QT_fp16
enumerator QT_8bit_direct

uint8 的快速索引

enumerator QT_6bit

每个分量 6 位

enumerator QT_bf16
enumerator QT_8bit_direct_signed

范围从 [-128 到 127] 的有符号 int8 的快速索引

enum RangeStat

均匀编码器可以使用不同的统计信息来估计 unform 编码器的可表示值的范围。这里 rs = rangestat_arg

enumerator RS_minmax

[min - rs*(max-min), max + rs*(max-min)]

enumerator RS_meanstd

[mean - std * rs, mean + std * rs]

enumerator RS_quantiles

[Q(rs), Q(1-rs)]

enumerator RS_optim

重建误差的交替优化

公共函数

ScalarQuantizer(size_t d, QuantizerType qtype)
ScalarQuantizer()
void set_derived_sizes()

基于 qtype 和 d 更新内部值

virtual void train(size_t n, const float *x) override

训练量化器

参数:

x – 训练向量,大小 n * d

virtual void compute_codes(const float *x, uint8_t *codes, size_t n) const override

编码一组向量

参数:
  • x – 要编码的向量,大小 n * d

  • codes – 输出代码,大小 n * code_size

virtual void decode(const uint8_t *code, float *x, size_t n) const override

解码一组向量

参数:
  • codes – 要解码的代码,大小为 n * code_size

  • x – 输出向量,大小为 n * d

SQuantizer *select_quantizer() const
SQDistanceComputer *get_distance_computer(MetricType metric = METRIC_L2) const
InvertedListScanner *select_InvertedListScanner(MetricType mt, const Index *quantizer, bool store_pairs, const IDSelector *sel, bool by_residual = false) const

公共成员

QuantizerType qtype = QT_8bit
RangeStat rangestat = RS_minmax
float rangestat_arg = 0
size_t bits = 0

每个标量代码的比特数

std::vector<float> trained

训练后的值(包括范围)

size_t d

输入向量的大小

size_t code_size

每个索引向量的字节数

struct SQDistanceComputer : public faiss::FlatCodesDistanceComputer

公共函数

inline SQDistanceComputer()
virtual float query_to_code(const uint8_t *code) const = 0
inline virtual float distance_to_code(const uint8_t *code) final

计算当前查询到编码向量的距离

inline virtual float operator()(idx_t i) override

计算向量 i 到当前查询的距离

virtual void set_query(const float *x) = 0

在计算距离之前调用。指针 x 在调用 operator () 时应保持有效。

inline virtual void distances_batch_4(const idx_t idx0, const idx_t idx1, const idx_t idx2, const idx_t idx3, float &dis0, float &dis1, float &dis2, float &dis3)

计算当前查询与 4 个存储向量之间的距离。某些 DistanceComputer 实现可能会从中受益匪浅。

virtual float symmetric_dis(idx_t i, idx_t j) = 0

计算两个存储向量之间的距离

公共成员

const float *q
const uint8_t *codes
size_t code_size
struct SQuantizer

公共函数

virtual void encode_vector(const float *x, uint8_t *code) const = 0
virtual void decode_vector(const uint8_t *code, float *x) const = 0
inline virtual ~SQuantizer()