| 917 | } |
| 918 | |
| 919 | void parallelSearchInOneStep( |
| 920 | py::array_t<float> queries, |
| 921 | BatchResults &results, |
| 922 | size_t size |
| 923 | ) { |
| 924 | const py::buffer_info &qinfo = queries.request(); |
| 925 | const std::vector<long int> &qshape = qinfo.shape; |
| 926 | auto nOfQueries = qshape[0]; |
| 927 | size_t dimension = qshape[1]; |
| 928 | size_t pseudoDimension = QBG::Index::getQuantizer().globalCodebookIndex.getObjectSpace().getPaddedDimension(); |
| 929 | auto *queryPtr = static_cast<float*>(qinfo.ptr); |
| 930 | |
| 931 | size = size > 0 ? size : defaultNumOfSearchObjects; |
| 932 | |
| 933 | results.results.clear(); |
| 934 | results.resultList.clear(); |
| 935 | results.results.resize(nOfQueries); |
| 936 | |
| 937 | size_t exactResultSize = 0; |
| 938 | if (defaultResultExpansion >= 1.0) { |
| 939 | size = static_cast<float>(size) * defaultResultExpansion; |
| 940 | exactResultSize = size; |
| 941 | } |
| 942 | #pragma omp parallel for schedule(dynamic) |
| 943 | for (int idx = 0; idx < nOfQueries; idx++) { |
| 944 | float *qptr = queryPtr + idx * dimension; |
| 945 | vector<float> query(pseudoDimension, 0); |
| 946 | memcpy(query.data(), qptr, dimension * sizeof(float)); |
| 947 | QBG::SearchContainer sc; |
| 948 | sc.setObjectVector(query); |
| 949 | sc.setSize(size); |
| 950 | sc.setExactResultSize(exactResultSize); |
| 951 | sc.setEpsilon(defaultEpsilon); |
| 952 | sc.setBlobEpsilon(defaultBlobEpsilon); |
| 953 | sc.setEdgeSize(defaultEdgeSize); |
| 954 | sc.setGraphExplorationSize(defaultExplorationSize); |
| 955 | QBG::Index::search(sc); |
| 956 | results.results[idx] = std::move(sc.getWorkingResult()); |
| 957 | //QBG::Index::getQuantizer().globalCodebookIndex.deleteObject(queryObject); |
| 958 | } |
| 959 | results.size = results.results.size(); |
| 960 | return; |
| 961 | } |
| 962 | |
| 963 | void batchSearch( |
| 964 | py::array_t<float> queries, |
nothing calls this directly
no test coverage detected