@@ -880,11 +880,11 @@ void test_exact_search(std::size_t dataset_count, std::size_t queries_count, std
880880 std::size_t dimensions = 32 ;
881881 metric_punned_t metric (dimensions, metric_kind_t ::cos_k, scalar_kind<scalar_at>());
882882
883- std::random_device rd ;
884- std::mt19937 gen ( rd ());
885- std::uniform_real_distribution<> dis (0.0 , 1.0 );
883+ std::random_device seed_source ;
884+ std::mt19937 generator ( seed_source ());
885+ std::uniform_real_distribution<> distribution (0.0 , 1.0 ); // ! We can't pass `scalar_at` to the distribution
886886 std::vector<scalar_at> dataset (dataset_count * dimensions);
887- std::generate (dataset.begin (), dataset.end (), [&] { return static_cast <scalar_at>(dis (gen )); });
887+ std::generate (dataset.begin (), dataset.end (), [&] { return static_cast <scalar_at>(distribution (generator )); });
888888
889889 exact_search_t search;
890890 auto results = search ( //
@@ -1107,15 +1107,15 @@ void test_filtered_search() {
11071107 constexpr std::size_t dimensions = 32 ;
11081108 metric_punned_t metric (dimensions, metric_kind_t ::cos_k);
11091109
1110- std::random_device rd ;
1111- std::mt19937 gen ( rd ());
1112- std::uniform_real_distribution<> dis (0.0 , 1.0 );
1110+ std::random_device seed_source ;
1111+ std::mt19937 generator ( seed_source ());
1112+ std::uniform_real_distribution<float > distribution (0.0 , 1.0 );
11131113 using vector_of_vectors_t = std::vector<std::vector<float >>;
11141114
11151115 vector_of_vectors_t vector_of_vectors (dataset_count);
11161116 for (auto & vector : vector_of_vectors) {
11171117 vector.resize (dimensions);
1118- std::generate (vector.begin (), vector.end (), [&] { return dis (gen ); });
1118+ std::generate (vector.begin (), vector.end (), [&] { return distribution (generator ); });
11191119 }
11201120
11211121 index_dense_t index = index_dense_t::make (metric);
@@ -1144,6 +1144,41 @@ void test_filtered_search() {
11441144 }
11451145}
11461146
1147+ void test_isolate () {
1148+ constexpr std::size_t dataset_count = 16 ;
1149+ constexpr std::size_t dimensions = 32 ;
1150+ metric_punned_t metric (dimensions, metric_kind_t ::cos_k);
1151+
1152+ std::random_device seed_source;
1153+ std::mt19937 generator (seed_source ());
1154+ std::uniform_real_distribution<float > distribution (0.0 , 1.0 );
1155+ using vector_of_vectors_t = std::vector<std::vector<float >>;
1156+
1157+ vector_of_vectors_t vector_of_vectors (dataset_count);
1158+ for (auto & vector : vector_of_vectors) {
1159+ vector.resize (dimensions);
1160+ std::generate (vector.begin (), vector.end (), [&] { return distribution (generator); });
1161+ }
1162+
1163+ index_dense_t index = index_dense_t::make (metric);
1164+ index.reserve (dataset_count);
1165+ for (std::size_t idx = 0 ; idx < dataset_count; ++idx) {
1166+ index.add (idx, vector_of_vectors[idx].data ());
1167+ }
1168+ expect_eq (index.size (), dataset_count);
1169+
1170+ for (std::size_t idx = 0 ; idx < dataset_count; ++idx) {
1171+ if (idx % 2 == 0 )
1172+ index.remove (idx);
1173+ }
1174+
1175+ auto result = index.isolate ();
1176+ for (std::size_t idx = 0 ; idx < dataset_count; ++idx) {
1177+ auto result = index.search (vector_of_vectors[idx].data (), 16 );
1178+ expect_eq (result.size (), dataset_count / 2 );
1179+ }
1180+ }
1181+
11471182int main (int , char **) {
11481183 test_uint40 ();
11491184 test_cosine<float , std::int64_t , uint40_t >(10 , 10 );
@@ -1221,5 +1256,6 @@ int main(int, char**) {
12211256 test_strings<std::int64_t , slot32_t >();
12221257
12231258 test_filtered_search ();
1259+ test_isolate ();
12241260 return 0 ;
12251261}
0 commit comments