/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #include #include #include "faiss/Index.h" #include "faiss/IndexHNSW.h" #include "faiss/index_factory.h" #include "faiss/index_io.h" #include "test_util.h" pthread_mutex_t temp_file_mutex = PTHREAD_MUTEX_INITIALIZER; TEST(IO, TestReadHNSWPQ_whenSDCDisabledFlagPassed_thenDisableSDCTable) { // Create a temp file name with a randomized component for stress runs std::random_device rd; std::mt19937 mt(rd()); std::uniform_real_distribution dist(0, 9999999); std::string temp_file_name = "/tmp/faiss_TestReadHNSWPQ" + std::to_string(int(dist(mt))); Tempfilename index_filename(&temp_file_mutex, temp_file_name); // Create a HNSW index with PQ encoding int d = 32, n = 256; std::default_random_engine rng(123); std::uniform_real_distribution u(0, 100); std::vector vectors(n * d); for (int i = 0; i < n * d; i++) { vectors[i] = u(rng); } // Build the index and write it to the temp file { std::unique_ptr index_writer( faiss::index_factory(d, "HNSW8,PQ4np", faiss::METRIC_L2)); index_writer->train(n, vectors.data()); index_writer->add(n, vectors.data()); faiss::write_index(index_writer.get(), index_filename.c_str()); } // Load index from disk. Confirm that the sdc table is equal to 0 when // disable sdc is set { std::unique_ptr index_reader_read_write( dynamic_cast( faiss::read_index(index_filename.c_str()))); std::unique_ptr index_reader_sdc_disabled( dynamic_cast(faiss::read_index( index_filename.c_str(), faiss::IO_FLAG_PQ_SKIP_SDC_TABLE))); ASSERT_NE( dynamic_cast(index_reader_read_write->storage) ->pq.sdc_table.size(), 0); ASSERT_EQ( dynamic_cast( index_reader_sdc_disabled->storage) ->pq.sdc_table.size(), 0); } }