Skip to main content

Crate faiss_next_sys

Crate faiss_next_sys 

Source
Expand description

§faiss-next-sys

Crates.io License: MIT

Raw FFI bindings to Faiss C API.

This crate provides unsafe Rust bindings to the Faiss C library. For a safe, idiomatic API, use faiss-next.

§Features

  • Pre-generated bindings for common platforms
  • Automatic Faiss version detection
  • Multi-version binding support (1.14.x, 1.15.x, …)
  • Optional runtime binding generation via bindgen
  • CUDA support (Linux and Windows)

§Supported Platforms

OSArchitectureCPUCUDA
macOS (Apple Silicon)aarch64 (M1/M2/M3)
Linuxx86_64
Windowsx86_64

Legend:

  • ✅ Fully supported with pre-generated bindings
  • ❌ Not supported

Notes:

  • CUDA is supported on Linux x86_64 and Windows x86_64

§Getting Started

§Prerequisites

Install Faiss with C API enabled:

macOS (Homebrew):

brew install faiss

Linux (from source):

git clone https://github.com/facebookresearch/faiss.git
cd faiss
mkdir build && cd build
cmake -DFAISS_ENABLE_C_API=ON -DBUILD_SHARED_LIBS=ON ..
make -j$(nproc)
sudo make install
sudo ldconfig

Windows:

Build Faiss from source with C API enabled. A pre-configured build is available at:

git clone -b windows-build https://github.com/yexiangyu/faiss.git
cd faiss
mkdir build && cd build
cmake -A x64 -DFAISS_ENABLE_C_API=ON -DBUILD_SHARED_LIBS=ON ^
      -DFAISS_ENABLE_GPU=ON ^
      -DCMAKE_INSTALL_PREFIX=C:/tools/faiss ..
cmake --build . --config Release
cmake --install . --config Release

After installation, set environment variables:

set FAISS_INCLUDE_DIR=C:\tools\faiss\include
set FAISS_LIB_DIR=C:\tools\faiss\lib

Alternatively, place Faiss in the default location:

  • C:\tools\faiss (include: C:\tools\faiss\include, lib: C:\tools\faiss\lib)

Or other supported locations:

  • C:\faiss
  • C:\Program Files\faiss
  • C:\Program Files (x86)\faiss

§Installation

This crate is typically used as a dependency of faiss-next. Add to Cargo.toml:

[dependencies]
faiss-next-sys = "0.6"

§Environment Variables

VariableDescription
FAISS_INCLUDE_DIRDirect path to Faiss include directory (e.g., C:\faiss\include)
FAISS_LIB_DIRDirect path to Faiss lib directory (e.g., C:\faiss\lib)
FAISS_DIRPath to Faiss installation root (must contain include/ and lib/)
LD_LIBRARY_PATHLinux library search path
DYLD_LIBRARY_PATHmacOS library search path
PATHWindows DLL search path

Priority order:

  1. FAISS_INCLUDE_DIR + FAISS_LIB_DIR (direct paths, recommended for Windows)
  2. FAISS_DIR (installation root)
  3. Platform-specific default paths

§Feature Flags

FlagDescription
cudaEnable CUDA support (Linux x86_64 and Windows x86_64 only)
bindgenGenerate bindings at compile time

Platform restrictions:

  • cuda feature is only available on Linux x86_64 and Windows x86_64
  • Using cuda feature on macOS will result in a compile error

Note: The bindgen feature requires LLVM/Clang to be installed:

  • Linux: sudo apt install llvm-dev libclang-dev (Ubuntu/Debian)
  • macOS: brew install llvm
  • Windows: Install LLVM from https://llvm.org/builds/ and ensure libclang is in your PATH

§Version Detection

The build script automatically detects the installed Faiss version by parsing include/faiss/Index.h:

#define FAISS_VERSION_MAJOR 1
#define FAISS_VERSION_MINOR 14
#define FAISS_VERSION_PATCH 0

§Version Compatibility

  • Minimum version: 1.14.0
  • Loose mode: Versions newer than tested versions work with a compile warning

When a newer Faiss version is detected, the build system:

  1. Emits a warning about compatibility
  2. Uses the closest available binding version
  3. Attempts to compile and run

§Binding Generation

§Pre-generated Bindings

Bindings are pre-generated and committed to the repository:

src/bindings/
├── mod.rs              # Version selection
└── v1_14/
    ├── mod.rs          # Platform selection
    ├── macos_aarch64.rs
    ├── linux_x86_64.rs
    ├── linux_x86_64_cuda.rs
    ├── windows_x86_64.rs
    └── windows_x86_64_cuda.rs

§Generate New Bindings

To generate bindings for your platform (e.g., when using a custom Faiss version):

cargo build --features bindgen

§API Structure

// Types
pub type idx_t = i64;

// Index operations
pub fn faiss_IndexFlat_new(...) -> *mut FaissIndexFlat;
pub fn faiss_Index_add(...);
pub fn faiss_Index_search(...);

// IVF operations
pub fn faiss_IndexIVF_new(...);
pub fn faiss_IndexIVF_set_nprobe(...);

// Distance computations
pub fn faiss_pairwise_L2sqr(...);
pub fn faiss_fvec_inner_products_ny(...);

// ... and more

§Linking

The crate links against:

  • libfaiss - Core Faiss library
  • libfaiss_c - C API wrapper

Ensure these libraries are in your library search path.

§Documentation

§License

MIT License

Structs§

FaissBuffer
FaissBufferList_H
FaissClusteringIterationStats_H
FaissClusteringParameters
FaissClustering_H
FaissCustomIOReader_H
FaissCustomIOWriter_H
FaissDistanceComputer_H
FaissIDSelectorAnd_H
FaissIDSelectorBatch_H
FaissIDSelectorBitmap_H
FaissIDSelectorNot_H
FaissIDSelectorOr_H
FaissIDSelectorRange_H
FaissIDSelectorXOr_H
FaissIDSelector_H
FaissIOReader_H
FaissIOWriter_H
FaissIndexBinary_H
FaissIndexIVFStats
FaissIndex_H
FaissParameterRange_H
FaissParameterSpace_H
FaissRangeQueryResult_H
FaissRangeSearchPartialResult_H
FaissRangeSearchResult_H
FaissSearchParameters_H
FaissVectorTransform_H

Enums§

FaissErrorCode
FaissMetricType
FaissQuantizerType

Constants§

BINDING_VERSION
FAISS_OK
MAX_TESTED_VERSION
MIN_VERSION

Functions§

faiss_BufferList_add
faiss_BufferList_append_buffer
faiss_BufferList_buffer_size
faiss_BufferList_copy_range
faiss_BufferList_free
faiss_BufferList_new
faiss_BufferList_wp
faiss_CenteringTransform_free
faiss_CenteringTransform_new_with
faiss_ClusteringIterationStats_imbalance_factor
faiss_ClusteringIterationStats_nsplit
faiss_ClusteringIterationStats_obj
faiss_ClusteringIterationStats_time
faiss_ClusteringIterationStats_time_search
faiss_ClusteringParameters_init
faiss_Clustering_centroids
faiss_Clustering_d
faiss_Clustering_decode_block_size
faiss_Clustering_free
faiss_Clustering_frozen_centroids
faiss_Clustering_int_centroids
faiss_Clustering_iteration_stats
faiss_Clustering_k
faiss_Clustering_max_points_per_centroid
faiss_Clustering_min_points_per_centroid
faiss_Clustering_new
faiss_Clustering_new_with_params
faiss_Clustering_niter
faiss_Clustering_nredo
faiss_Clustering_seed
faiss_Clustering_spherical
faiss_Clustering_train
faiss_Clustering_update_index
faiss_Clustering_verbose
faiss_CustomIOReader_free
faiss_CustomIOReader_new
faiss_CustomIOWriter_free
faiss_CustomIOWriter_new
faiss_DistanceComputer_free
faiss_DistanceComputer_set_query
faiss_DistanceComputer_symmetric_dis
faiss_DistanceComputer_vector_to_query_dis
faiss_IDSelectorAnd_new
faiss_IDSelectorBatch_mask
faiss_IDSelectorBatch_nbits
faiss_IDSelectorBatch_new
faiss_IDSelectorBitmap_bitmap
faiss_IDSelectorBitmap_free
faiss_IDSelectorBitmap_n
faiss_IDSelectorBitmap_new
faiss_IDSelectorNot_new
faiss_IDSelectorOr_new
faiss_IDSelectorRange_free
faiss_IDSelectorRange_imax
faiss_IDSelectorRange_imin
faiss_IDSelectorRange_new
faiss_IDSelectorXOr_new
faiss_IDSelector_free
faiss_IDSelector_is_member
faiss_IOReader_free
faiss_IOWriter_free
faiss_ITQMatrix_free
faiss_ITQMatrix_new_with
faiss_ITQTransform_do_pca
faiss_ITQTransform_free
faiss_ITQTransform_new_with
faiss_IndexBinary_add
faiss_IndexBinary_add_with_ids
faiss_IndexBinary_assign
faiss_IndexBinary_d
faiss_IndexBinary_free
faiss_IndexBinary_is_trained
faiss_IndexBinary_metric_type
faiss_IndexBinary_ntotal
faiss_IndexBinary_range_search
faiss_IndexBinary_reconstruct
faiss_IndexBinary_reconstruct_n
faiss_IndexBinary_remove_ids
faiss_IndexBinary_reset
faiss_IndexBinary_search
faiss_IndexBinary_search_with_params
faiss_IndexBinary_set_verbose
faiss_IndexBinary_train
faiss_IndexBinary_verbose
faiss_IndexFlat1D_cast
faiss_IndexFlat1D_free
faiss_IndexFlat1D_new
faiss_IndexFlat1D_new_with
faiss_IndexFlat1D_update_permutation
faiss_IndexFlatIP_cast
faiss_IndexFlatIP_free
faiss_IndexFlatIP_new
faiss_IndexFlatIP_new_with
faiss_IndexFlatL2_cast
faiss_IndexFlatL2_free
faiss_IndexFlatL2_new
faiss_IndexFlatL2_new_with
faiss_IndexFlat_cast
faiss_IndexFlat_compute_distance_subset
faiss_IndexFlat_free
faiss_IndexFlat_new
faiss_IndexFlat_new_with
faiss_IndexFlat_xb
faiss_IndexIDMap2_cast
faiss_IndexIDMap2_construct_rev_map
faiss_IndexIDMap2_id_map
faiss_IndexIDMap2_new
faiss_IndexIDMap2_own_fields
faiss_IndexIDMap2_set_own_fields
faiss_IndexIDMap2_sub_index
faiss_IndexIDMap_cast
faiss_IndexIDMap_id_map
faiss_IndexIDMap_new
faiss_IndexIDMap_own_fields
faiss_IndexIDMap_set_own_fields
faiss_IndexIDMap_sub_index
faiss_IndexIVFFlat_add_core
faiss_IndexIVFFlat_cast
faiss_IndexIVFFlat_free
faiss_IndexIVFFlat_new
faiss_IndexIVFFlat_new_with
faiss_IndexIVFFlat_new_with_metric
faiss_IndexIVFFlat_nlist
faiss_IndexIVFFlat_nprobe
faiss_IndexIVFFlat_own_fields
faiss_IndexIVFFlat_quantizer
faiss_IndexIVFFlat_quantizer_trains_alone
faiss_IndexIVFFlat_set_nprobe
faiss_IndexIVFFlat_set_own_fields
faiss_IndexIVFFlat_update_vectors
faiss_IndexIVFScalarQuantizer_add_core
faiss_IndexIVFScalarQuantizer_cast
faiss_IndexIVFScalarQuantizer_free
faiss_IndexIVFScalarQuantizer_new
faiss_IndexIVFScalarQuantizer_new_with
faiss_IndexIVFScalarQuantizer_new_with_metric
faiss_IndexIVFScalarQuantizer_nlist
faiss_IndexIVFScalarQuantizer_nprobe
faiss_IndexIVFScalarQuantizer_own_fields
faiss_IndexIVFScalarQuantizer_quantizer
faiss_IndexIVFScalarQuantizer_set_nprobe
faiss_IndexIVFScalarQuantizer_set_own_fields
faiss_IndexIVFStats_reset
faiss_IndexIVF_cast
faiss_IndexIVF_copy_subset_to
faiss_IndexIVF_free
faiss_IndexIVF_get_list_size
faiss_IndexIVF_imbalance_factor
faiss_IndexIVF_invlists_get_ids
faiss_IndexIVF_make_direct_map
faiss_IndexIVF_merge_from
faiss_IndexIVF_nlist
faiss_IndexIVF_nprobe
faiss_IndexIVF_own_fields
faiss_IndexIVF_print_stats
faiss_IndexIVF_quantizer
faiss_IndexIVF_quantizer_trains_alone
faiss_IndexIVF_search_preassigned
faiss_IndexIVF_set_nprobe
faiss_IndexIVF_set_own_fields
faiss_IndexIVF_train_encoder
faiss_IndexLSH_cast
faiss_IndexLSH_code_size
faiss_IndexLSH_free
faiss_IndexLSH_nbits
faiss_IndexLSH_new
faiss_IndexLSH_new_with_options
faiss_IndexLSH_rotate_data
faiss_IndexLSH_train_thresholds
faiss_IndexPreTransform_cast
faiss_IndexPreTransform_free
faiss_IndexPreTransform_index
faiss_IndexPreTransform_new
faiss_IndexPreTransform_new_with
faiss_IndexPreTransform_new_with_transform
faiss_IndexPreTransform_own_fields
faiss_IndexPreTransform_prepend_transform
faiss_IndexPreTransform_set_own_fields
faiss_IndexRefineFlat_cast
faiss_IndexRefineFlat_free
faiss_IndexRefineFlat_k_factor
faiss_IndexRefineFlat_new
faiss_IndexRefineFlat_own_fields
faiss_IndexRefineFlat_set_k_factor
faiss_IndexRefineFlat_set_own_fields
faiss_IndexReplicas_add_replica
faiss_IndexReplicas_at
faiss_IndexReplicas_free
faiss_IndexReplicas_new
faiss_IndexReplicas_new_with_options
faiss_IndexReplicas_own_fields
faiss_IndexReplicas_remove_replica
faiss_IndexReplicas_set_own_fields
faiss_IndexScalarQuantizer_cast
faiss_IndexScalarQuantizer_free
faiss_IndexScalarQuantizer_new
faiss_IndexScalarQuantizer_new_with
faiss_IndexShards_add_shard
faiss_IndexShards_at
faiss_IndexShards_free
faiss_IndexShards_new
faiss_IndexShards_new_with_options
faiss_IndexShards_own_fields
faiss_IndexShards_remove_shard
faiss_IndexShards_set_own_fields
faiss_IndexShards_set_successive_ids
faiss_IndexShards_successive_ids
faiss_Index_add
faiss_Index_add_with_ids
faiss_Index_assign
faiss_Index_compute_residual
faiss_Index_compute_residual_n
faiss_Index_d
faiss_Index_free
faiss_Index_is_trained
faiss_Index_metric_type
faiss_Index_ntotal
faiss_Index_range_search
faiss_Index_reconstruct
faiss_Index_reconstruct_n
faiss_Index_remove_ids
faiss_Index_reset
faiss_Index_sa_code_size
faiss_Index_sa_decode
faiss_Index_sa_encode
faiss_Index_search
faiss_Index_search_with_params
faiss_Index_set_verbose
faiss_Index_train
faiss_Index_verbose
faiss_LinearTransform_free
faiss_LinearTransform_have_bias
faiss_LinearTransform_is_orthonormal
faiss_LinearTransform_set_is_orthonormal
faiss_LinearTransform_transform_transpose
faiss_NormalizationTransform_free
faiss_NormalizationTransform_new_with
faiss_NormalizationTransform_norm
faiss_OPQMatrix_free
faiss_OPQMatrix_new_with
faiss_OPQMatrix_niter
faiss_OPQMatrix_niter_pq
faiss_OPQMatrix_set_niter
faiss_OPQMatrix_set_niter_pq
faiss_OPQMatrix_set_verbose
faiss_OPQMatrix_verbose
faiss_PCAMatrix_balanced_bins
faiss_PCAMatrix_eigen_power
faiss_PCAMatrix_free
faiss_PCAMatrix_new_with
faiss_PCAMatrix_random_rotation
faiss_PCAMatrix_set_balanced_bins
faiss_ParameterRange_name
faiss_ParameterRange_values
faiss_ParameterSpace_add_range
faiss_ParameterSpace_combination_name
faiss_ParameterSpace_display
faiss_ParameterSpace_free
faiss_ParameterSpace_n_combinations
faiss_ParameterSpace_new
faiss_ParameterSpace_set_index_parameter
faiss_ParameterSpace_set_index_parameter_binary
faiss_ParameterSpace_set_index_parameters
faiss_ParameterSpace_set_index_parameters_binary
faiss_ParameterSpace_set_index_parameters_cno
faiss_ParameterSpace_set_index_parameters_cno_binary
faiss_RandomRotationMatrix_free
faiss_RandomRotationMatrix_new_with
faiss_RangeQueryResult_add
faiss_RangeQueryResult_nres
faiss_RangeQueryResult_pres
faiss_RangeQueryResult_qno
faiss_RangeSearchPartialResult_finalize
faiss_RangeSearchPartialResult_new
faiss_RangeSearchPartialResult_new_result
faiss_RangeSearchPartialResult_res
faiss_RangeSearchPartialResult_set_lims
faiss_RangeSearchResult_buffer_size
faiss_RangeSearchResult_do_allocation
faiss_RangeSearchResult_free
faiss_RangeSearchResult_labels
faiss_RangeSearchResult_lims
faiss_RangeSearchResult_new
faiss_RangeSearchResult_new_with
faiss_RangeSearchResult_nq
faiss_RemapDimensionsTransform_free
faiss_RemapDimensionsTransform_new_with
faiss_SearchParametersIVF_cast
faiss_SearchParametersIVF_free
faiss_SearchParametersIVF_max_codes
faiss_SearchParametersIVF_new
faiss_SearchParametersIVF_new_with
faiss_SearchParametersIVF_nprobe
faiss_SearchParametersIVF_sel
faiss_SearchParametersIVF_set_max_codes
faiss_SearchParametersIVF_set_nprobe
faiss_SearchParameters_free
faiss_SearchParameters_new
faiss_VectorTransform_apply
faiss_VectorTransform_apply_noalloc
faiss_VectorTransform_d_in
faiss_VectorTransform_d_out
faiss_VectorTransform_free
faiss_VectorTransform_is_trained
faiss_VectorTransform_reverse_transform
faiss_VectorTransform_train
faiss_clone_index
faiss_clone_index_binary
faiss_fvec_L2sqr_ny
faiss_fvec_inner_products_ny
faiss_fvec_norm_L2sqr
faiss_fvec_norms_L2
faiss_fvec_norms_L2sqr
faiss_fvec_renorm_L2
faiss_get_distance_compute_blas_database_bs
faiss_get_distance_compute_blas_query_bs
faiss_get_distance_compute_blas_threshold
faiss_get_distance_compute_min_k_reservoir
faiss_get_indexIVF_stats
faiss_get_last_error
faiss_index_binary_factory
faiss_index_factory
faiss_kmeans_clustering
faiss_pairwise_L2sqr
faiss_pairwise_L2sqr_with_defaults
faiss_read_VectorTransform_fname
faiss_read_index
faiss_read_index_binary
faiss_read_index_binary_custom
faiss_read_index_binary_fname
faiss_read_index_custom
faiss_read_index_fname
faiss_set_distance_compute_blas_database_bs
faiss_set_distance_compute_blas_query_bs
faiss_set_distance_compute_blas_threshold
faiss_set_distance_compute_min_k_reservoir
faiss_write_index
faiss_write_index_binary
faiss_write_index_binary_custom
faiss_write_index_binary_fname
faiss_write_index_custom
faiss_write_index_fname
version_tuple

Type Aliases§

FILE
FaissBufferList
FaissCenteringTransform
FaissClustering
FaissClusteringIterationStats
FaissCustomIOReader
FaissCustomIOWriter
FaissDistanceComputer
FaissIDSelector
FaissIDSelectorAnd
FaissIDSelectorBatch
FaissIDSelectorBitmap
FaissIDSelectorNot
FaissIDSelectorOr
FaissIDSelectorRange
FaissIDSelectorXOr
FaissIOReader
FaissIOWriter
FaissITQMatrix
FaissITQTransform
FaissIndex
FaissIndexBinary
FaissIndexFlat
FaissIndexFlat1D
FaissIndexFlatIP
FaissIndexFlatL2
FaissIndexIDMap
FaissIndexIDMap2
FaissIndexIVF
FaissIndexIVFFlat
FaissIndexIVFScalarQuantizer
FaissIndexLSH
FaissIndexPreTransform
FaissIndexRefineFlat
FaissIndexReplicas
FaissIndexScalarQuantizer
FaissIndexShards
FaissLinearTransform
FaissNormalizationTransform
FaissOPQMatrix
FaissPCAMatrix
FaissParameterRange
FaissParameterSpace
FaissRandomRotationMatrix
FaissRangeQueryResult
FaissRangeSearchPartialResult
FaissRangeSearchResult
FaissRemapDimensionsTransform
FaissSearchParameters
FaissSearchParametersIVF
FaissVectorTransform
faiss_idx_t
idx_t