#pragma once #include #include #include "opencv2/opencv.hpp" namespace libhnsw { enum MODE { BRUTE_FORCE_KNN = 0, BRUTE_FORCE_KNN_CF = 1, HNSW_FORCE_KNN = 2, HNSW_FORCE_KNN_CF = 3, MNN_MATMUL_CF = 4, OPENCV_MATMUL_CF = 5 }; enum SPACE_TYPE { INNER_PRODUCT=0, L1_DISTANCE=1, L2_DISTANCE=2, }; struct RequireSample //查询向量结构体 { float* data=NULL; int d; // 向量维度,如果是0表示未查询到 }; class Index { public: // 构造函数1:初始化 Index(int d, int n, MODE md,SPACE_TYPE st=L2_DISTANCE, size_t M = 16, size_t ef_construction = 200, size_t random_seed = 100); ~Index(); // 构造函数2:初始化load index(废弃20211224) //Index(const std::string index_path,int d, int n, MODE md,SPACE_TYPE st=L2_DISTANCE); // 加载Index:成功:1;失败:0(新增20211224) int loadIndex(const std::string& location); // 增加一个样本 int Addsample(float *sample, int label); // 删除一个样本 int Removesample(int label); // 检索一个样本 std::vector> Search(float* sample, int k); // 查询一个样本(仅支持BRUTE模式) int Selectsample(RequireSample& sample, int label); // 释放一个查询样本 int freeSelectsample(RequireSample* sample); // 保存index void saveIndex(const std::string &location); // 获取index的最大容量 int get_max_elements(); // 获取index的当前容量 int get_cur_element_count(); // 该值等于fea_dim_*sizeof(float) int get_data_size(); private: int fea_dim_; // 特征维度 int num_; // 最大容量 MODE md_; // 算法类型 SPACE_TYPE st_; // 计算方式 }; }