10 #ifndef FAISS_PRODUCT_QUANTIZER_H
11 #define FAISS_PRODUCT_QUANTIZER_H
17 #include "Clustering.h"
67 void train (
int n,
const float *x);
69 ProductQuantizer(
size_t d,
82 void compute_code (
const float * x, uint8_t * code)
const ;
97 void decode (
const uint8_t *code,
float *x)
const;
98 void decode (
const uint8_t *code,
float *x,
size_t n)
const;
103 uint8_t *code)
const;
120 float * dis_table)
const;
122 void compute_inner_prod_table (
const float * x,
123 float * dis_table)
const;
133 float * dis_tables)
const;
135 void compute_inner_prod_tables (
size_t nx,
137 float * dis_tables)
const;
148 void search (
const float * x,
150 const uint8_t * codes,
152 float_maxheap_array_t *res,
153 bool init_finalize_heap =
true)
const;
158 const uint8_t * codes,
160 float_minheap_array_t *res,
161 bool init_finalize_heap =
true)
const;
168 void compute_sdc_table ();
170 void search_sdc (
const uint8_t * qcodes,
172 const uint8_t * bcodes,
175 bool init_finalize_heap =
true)
const;
186 void encode(uint64_t x);
197 void encode(uint64_t x);
205 void encode(uint64_t x);
230 const uint16_t *code;
void set_params(const float *centroids, int m)
Define the centroids for subquantizer m.
intialize centroids with nbits-D hypercube
size_t nbits
number of bits per quantization index
void decode(const uint8_t *code, float *x) const
decode a vector from a given code (or n vectors if third argument)
intialize centroids with nbits-D hypercube
void set_derived_values()
compute derived values when d, M and nbits have been set
std::vector< float > sdc_table
Symmetric Distance Table.
share dictionary accross PQ segments
size_t dsub
dimensionality of each subvector
void compute_distance_tables(size_t nx, const float *x, float *dis_tables) const
void compute_code_from_distance_table(const float *tab, uint8_t *code) const
void compute_codes(const float *x, uint8_t *codes, size_t n) const
same as compute_code for several vectors
long idx_t
all indices are this type
void compute_distance_table(const float *x, float *dis_table) const
void search(const float *x, size_t nx, const uint8_t *codes, const size_t ncodes, float_maxheap_array_t *res, bool init_finalize_heap=true) const
size_t code_size
byte per indexed vector
uint8_t * code
code for this vector
const int nbits
number of bits per subquantizer index
size_t ksub
number of centroids for each subquantizer
void search_ip(const float *x, size_t nx, const uint8_t *codes, const size_t ncodes, float_minheap_array_t *res, bool init_finalize_heap=true) const
void compute_code(const float *x, uint8_t *code) const
Quantize one vector with the product quantizer.
the centroids are already initialized
ClusteringParameters cp
parameters used during clustering
size_t M
number of subquantizers
void compute_codes_with_assign_index(const float *x, uint8_t *codes, size_t n)
float * get_centroids(size_t m, size_t i)
return the centroids associated with subvector m
size_t d
size of the input vectors
bool verbose
verbose during training?
std::vector< float > centroids
Centroid table, size M * ksub * dsub.
train_type_t
initialization