faiss-next 0.6.0

Rust bindings for Faiss (Facebook AI Similarity Search)
Documentation
use faiss_next_sys;

pub fn pairwise_l2_sqr(d: usize, x: &[f32], y: &[f32]) -> Vec<f32> {
    let nq = x.len() / d;
    let nb = y.len() / d;
    let mut dis = vec![0.0f32; nq * nb];
    unsafe {
        faiss_next_sys::faiss_pairwise_L2sqr_with_defaults(
            d as i64,
            nq as i64,
            x.as_ptr(),
            nb as i64,
            y.as_ptr(),
            dis.as_mut_ptr(),
        );
    }
    dis
}

pub fn pairwise_l2_sqr_with_stride(
    d: usize,
    x: &[f32],
    y: &[f32],
    ldq: i64,
    ldb: i64,
    ldd: i64,
) -> Vec<f32> {
    let nq = x.len() / if ldq > 0 { ldq as usize } else { d };
    let nb = y.len() / if ldb > 0 { ldb as usize } else { d };
    let mut dis = vec![0.0f32; nq * if ldd > 0 { ldd as usize } else { nb }];
    unsafe {
        faiss_next_sys::faiss_pairwise_L2sqr(
            d as i64,
            nq as i64,
            x.as_ptr(),
            nb as i64,
            y.as_ptr(),
            dis.as_mut_ptr(),
            ldq,
            ldb,
            ldd,
        );
    }
    dis
}

pub fn inner_products(d: usize, x: &[f32], y: &[f32]) -> Vec<f32> {
    let ny = y.len() / d;
    let mut ip = vec![0.0f32; ny];
    unsafe {
        faiss_next_sys::faiss_fvec_inner_products_ny(
            ip.as_mut_ptr(),
            x.as_ptr(),
            y.as_ptr(),
            d,
            ny,
        );
    }
    ip
}

pub fn l2_sqr_ny(d: usize, x: &[f32], y: &[f32]) -> Vec<f32> {
    let ny = y.len() / d;
    let mut dis = vec![0.0f32; ny];
    unsafe {
        faiss_next_sys::faiss_fvec_L2sqr_ny(dis.as_mut_ptr(), x.as_ptr(), y.as_ptr(), d, ny);
    }
    dis
}

pub fn norm_l2_sqr(x: &[f32], d: usize) -> f32 {
    unsafe { faiss_next_sys::faiss_fvec_norm_L2sqr(x.as_ptr(), d) }
}

pub fn norms_l2(x: &[f32], d: usize) -> Vec<f32> {
    let nx = x.len() / d;
    let mut norms = vec![0.0f32; nx];
    unsafe {
        faiss_next_sys::faiss_fvec_norms_L2(norms.as_mut_ptr(), x.as_ptr(), d, nx);
    }
    norms
}

pub fn norms_l2_sqr(x: &[f32], d: usize) -> Vec<f32> {
    let nx = x.len() / d;
    let mut norms = vec![0.0f32; nx];
    unsafe {
        faiss_next_sys::faiss_fvec_norms_L2sqr(norms.as_mut_ptr(), x.as_ptr(), d, nx);
    }
    norms
}

pub fn renorm_l2(x: &mut [f32], d: usize) {
    let nx = x.len() / d;
    unsafe {
        faiss_next_sys::faiss_fvec_renorm_L2(d, nx, x.as_mut_ptr());
    }
}

pub fn set_distance_compute_blas_threshold(value: i32) {
    unsafe {
        faiss_next_sys::faiss_set_distance_compute_blas_threshold(value as std::os::raw::c_int);
    }
}

pub fn get_distance_compute_blas_threshold() -> i32 {
    unsafe { faiss_next_sys::faiss_get_distance_compute_blas_threshold() }
}

pub fn set_distance_compute_blas_query_bs(value: i32) {
    unsafe {
        faiss_next_sys::faiss_set_distance_compute_blas_query_bs(value as std::os::raw::c_int);
    }
}

pub fn get_distance_compute_blas_query_bs() -> i32 {
    unsafe { faiss_next_sys::faiss_get_distance_compute_blas_query_bs() }
}

pub fn set_distance_compute_blas_database_bs(value: i32) {
    unsafe {
        faiss_next_sys::faiss_set_distance_compute_blas_database_bs(value as std::os::raw::c_int);
    }
}

pub fn get_distance_compute_blas_database_bs() -> i32 {
    unsafe { faiss_next_sys::faiss_get_distance_compute_blas_database_bs() }
}