Esta es una biblioteca muy básica de algoritmos ANNS SOTA. Está escrito en Liblary estándar C ++/C ++ y puede usarse para construir y consultar un índice de puntos en el espacio de alta dimensión. La biblioteca proporciona una variedad de algoritmos para construir y consultar el índice. La biblioteca está diseñada para ser fácil de usar y para proporcionar un rendimiento relativamente alto.
Es una herramienta muy útil para que construya su propio ANNS Index Alogrithm sin demasiado esfuerzo.
Este es un ejemplo de cómo usar la Biblioteca ANNS para construir y consultar un índice.
DataSetWrapper< data_t > base, query;
GroundTruth gt;
base.load( " data/sift-128-euclidean.train.fvecs " );
query.load( " data/sift-128-euclidean.test.fvecs " );
gt.load( " data/sift-128-euclidean.cover.uniform-0-1.ivecs " );
const size_t k = 1 ;
utils::Timer timer;
// build index
HNSW< data_t , metrics::euclidean> index ( 32 , 128 );
index.set_num_threads( 24 );
timer.start();
index.build(base);
timer.stop();
cout << " Build time: " << timer.get() << endl;
// query with different parameters
ofstream out ( " hnsw_postfilter.csv " );
for ( size_t ef = 1 ; ef <= 128 ; ef++)
{
timer. reset ();
matrix_id_t knn;
matrix_di_t dis;
timer. start ();
index . search (query, k, ef, knn, dis);
timer. stop ();
out << timer. get () << " , " << gt. recall (k, knn) << endl;
}Todos los conjuntos de datos utilizados en esta biblioteca están en el formato VECS , que puede descargar desde aquí. He creado una base de marco en Ann -Benchmark, para descargar los conjuntos de datos y convertirlos en VECS -Format. Puede encontrar el código en ANNS/DataSet.
Si está interesado en el desarrollo delta del algoritmo ANN, puede invertir de una clase basada en índices e implementar su propio algoritmo para mantener la API original. Por ejemplo
template < typename data_t , typename label_t , float (*distance)( const data_t *, const data_t *, size_t )>
class PostFilterHCNNG : public HCNNG < data_t , distance>
/* ... */