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
//! # mih-rs
//!
//! Rust implementation of multi-index hashing (MIH) for neighbor searches on 64-bit codes in the Hamming space, described in the paper
//! > Norouzi, Punjani, and Fleet, **Fast exact search in Hamming space with multi-index hashing**, *IEEE TPAMI*, 36(6):1107– 1119, 2014.
//!
//! ## Features
//! - **Two types of neighbor searches:** mih-rs provides the two search operations:
//!     - *Range search* finds neighbor codes whose Hamming distances to a given code are within a radius.
//!     - *Top-K search* finds the top-K codes that are closest to a given code.
//! - **Fast and memory-efficient implementation:** The data structure is built on sparse hash tables, following the original implementation.
//! - **Parameter free:** mih-rs automatically sets an optimal parameter of MIH depending on a given database (although you can set this manually).
//!
//! ## Example
//!
//! ```rust
//! use mih_rs::Index;
//!
//! fn main() {
//!     // Database of codes
//!     let codes: [u64; 8] = [
//!         0b1111111111111111111111011111111111111111111111111011101111111111, // #zeros = 3
//!         0b1111111111111111111111111111111101111111111011111111111111111111, // #zeros = 2
//!         0b1111111011011101111111111111111101111111111111111111111111111111, // #zeros = 4
//!         0b1111111111111101111111111111111111111000111111111110001111111110, // #zeros = 8
//!         0b1101111111111111111111111111111111111111111111111111111111111111, // #zeros = 1
//!         0b1111111111111111101111111011111111111111111101001110111111111111, // #zeros = 6
//!         0b1111111111111111111111111111111111101111111111111111011111111111, // #zeros = 2
//!         0b1110110101011011011111111111111101111111111111111000011111111111, // #zeros = 11
//!     ];
//!
//!     // Query code
//!     let qcode: u64 = 0b1111111111111111111111111111111111111111111111111111111111111111;
//!
//!     // Construct the index
//!     let index = Index::new(&codes).unwrap();
//!
//!     // Find the ids of neighbor codes whose Hamming distances are within 2
//!     let answers = index.range_search(qcode, 2);
//!     println!("{:?}", answers); // [1, 4, 6]
//!
//!     // Find the ids of the top-4 nearest neighbor codes
//!     let answers = index.topk_search(qcode, 4);
//!     println!("{:?}", answers); // [4, 1, 6, 0]
//! }
//! ```
pub mod ls;
pub mod mih;
pub mod sparsehash;
pub mod utils;

pub use mih::Index;