faiss-next 0.6.0

Rust bindings for Faiss (Facebook AI Similarity Search)
Documentation
use std::ptr;

use faiss_next_sys::{self, FaissSearchParameters, FaissSearchParametersIVF};

use crate::error::{check_return_code, Result};

pub trait SearchParams {
    fn as_ptr(&self) -> *const FaissSearchParameters;
}

pub struct SearchParameters {
    ptr: *mut FaissSearchParameters,
}

impl SearchParameters {
    pub fn new() -> Result<Self> {
        unsafe {
            let mut ptr: *mut FaissSearchParameters = ptr::null_mut();
            check_return_code(faiss_next_sys::faiss_SearchParameters_new(
                &mut ptr,
                ptr::null_mut(),
            ))?;
            Ok(Self { ptr })
        }
    }
}

impl SearchParams for SearchParameters {
    fn as_ptr(&self) -> *const FaissSearchParameters {
        self.ptr
    }
}

impl Default for SearchParameters {
    fn default() -> Self {
        Self::new().expect("Failed to create SearchParameters")
    }
}

impl Drop for SearchParameters {
    fn drop(&mut self) {
        if !self.ptr.is_null() {
            unsafe {
                faiss_next_sys::faiss_SearchParameters_free(self.ptr);
            }
        }
    }
}

pub struct SearchParametersIvf {
    ptr: *mut FaissSearchParametersIVF,
}

impl SearchParametersIvf {
    pub fn new() -> Result<Self> {
        unsafe {
            let mut ptr: *mut FaissSearchParametersIVF = ptr::null_mut();
            check_return_code(faiss_next_sys::faiss_SearchParametersIVF_new(&mut ptr))?;
            Ok(Self { ptr })
        }
    }

    pub fn with_params(nprobe: usize, max_codes: usize) -> Result<Self> {
        unsafe {
            let mut ptr: *mut FaissSearchParametersIVF = ptr::null_mut();
            check_return_code(faiss_next_sys::faiss_SearchParametersIVF_new_with(
                &mut ptr,
                ptr::null_mut(),
                nprobe,
                max_codes,
            ))?;
            Ok(Self { ptr })
        }
    }

    pub fn nprobe(&self) -> usize {
        unsafe { faiss_next_sys::faiss_SearchParametersIVF_nprobe(self.ptr) }
    }

    pub fn set_nprobe(&mut self, nprobe: usize) {
        unsafe { faiss_next_sys::faiss_SearchParametersIVF_set_nprobe(self.ptr, nprobe) }
    }

    pub fn max_codes(&self) -> usize {
        unsafe { faiss_next_sys::faiss_SearchParametersIVF_max_codes(self.ptr) }
    }

    pub fn set_max_codes(&mut self, max_codes: usize) {
        unsafe { faiss_next_sys::faiss_SearchParametersIVF_set_max_codes(self.ptr, max_codes) }
    }
}

impl SearchParams for SearchParametersIvf {
    fn as_ptr(&self) -> *const FaissSearchParameters {
        self.ptr as *const FaissSearchParameters
    }
}

impl Default for SearchParametersIvf {
    fn default() -> Self {
        Self::new().expect("Failed to create SearchParametersIvf")
    }
}

impl Drop for SearchParametersIvf {
    fn drop(&mut self) {
        if !self.ptr.is_null() {
            unsafe {
                faiss_next_sys::faiss_SearchParametersIVF_free(self.ptr);
            }
        }
    }
}