#pragma once #include "index.h" #include "abstract_graph_store.h" #include "in_mem_graph_store.h" #include "pq_data_store.h" namespace diskann { class IndexFactory { public: DISKANN_DLLEXPORT explicit IndexFactory(const IndexConfig &config); DISKANN_DLLEXPORT std::unique_ptr create_instance(); DISKANN_DLLEXPORT static std::unique_ptr construct_graphstore( const GraphStoreStrategy stratagy, const size_t size, const size_t reserve_graph_degree); template DISKANN_DLLEXPORT static std::shared_ptr> construct_datastore(DataStoreStrategy stratagy, size_t num_points, size_t dimension, Metric m); // For now PQDataStore incorporates within itself all variants of quantization that we support. In the // future it may be necessary to introduce an AbstractPQDataStore class to spearate various quantization // flavours. template DISKANN_DLLEXPORT static std::shared_ptr> construct_pq_datastore(DataStoreStrategy strategy, size_t num_points, size_t dimension, Metric m, size_t num_pq_chunks, bool use_opq); template static Distance *construct_inmem_distance_fn(Metric m); private: void check_config(); template std::unique_ptr create_instance(); std::unique_ptr create_instance(const std::string &data_type, const std::string &tag_type, const std::string &label_type); template std::unique_ptr create_instance(const std::string &tag_type, const std::string &label_type); template std::unique_ptr create_instance(const std::string &label_type); std::unique_ptr _config; }; } // namespace diskann