1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use crate::error::{Error, Result};
use crate::index::{CpuIndex, FromInnerPtr, IndexImpl, NativeIndex};
use faiss_sys::*;
use std::ffi::CString;
use std::ptr;
pub fn write_index<I, P>(index: &I, file_name: P) -> Result<()>
where
I: NativeIndex,
I: CpuIndex,
P: AsRef<str>,
{
unsafe {
let f = file_name.as_ref();
let f = CString::new(f).map_err(|_| Error::BadFilePath)?;
faiss_try!(faiss_write_index_fname(index.inner_ptr(), f.as_ptr()));
Ok(())
}
}
pub fn read_index<P>(file_name: P) -> Result<IndexImpl>
where
P: AsRef<str>,
{
unsafe {
let f = file_name.as_ref();
let f = CString::new(f).map_err(|_| Error::BadFilePath)?;
let mut inner = ptr::null_mut();
faiss_try!(faiss_read_index_fname(f.as_ptr(), 0, &mut inner));
Ok(IndexImpl::from_inner_ptr(inner))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::index::flat::FlatIndex;
use crate::index::Index;
const D: u32 = 8;
#[test]
fn write_read() {
let mut index = FlatIndex::new_l2(D).unwrap();
assert_eq!(index.d(), D);
assert_eq!(index.ntotal(), 0);
let some_data = &[
7.5_f32, -7.5, 7.5, -7.5, 7.5, 7.5, 7.5, 7.5, -1., 1., 1., 1., 1., 1., 1., -1., 4.,
-4., -8., 1., 1., 2., 4., -1., 8., 8., 10., -10., -10., 10., -10., 10., 16., 16., 32.,
25., 20., 20., 40., 15.,
];
index.add(some_data).unwrap();
assert_eq!(index.ntotal(), 5);
let filepath = ::std::env::temp_dir().join("test_write_read.index");
let filename = filepath.to_str().unwrap();
write_index(&index, filename).unwrap();
let index = read_index(&filename).unwrap();
assert_eq!(index.ntotal(), 5);
::std::fs::remove_file(&filepath).unwrap();
}
}