From 98a7f4e1e00e0250d88fcbe50192a921386be8f2 Mon Sep 17 00:00:00 2001 From: Aditi Date: Wed, 30 Jun 2021 13:44:28 +0000 Subject: [PATCH 1/5] Adding all files --- CMakeLists.txt | 2 +- CompilerOptions.cmake | 21 + LICENSE | 1 + README.md | 160 ++ dependencies/windows/dll/LIBEAY32.dll | Bin 0 -> 2282496 bytes dependencies/windows/dll/SSLEAY32.dll | Bin 0 -> 361984 bytes .../dll/boost_date_time-vc141-mt-x64-1_70.dll | Bin 0 -> 55296 bytes dependencies/windows/dll/cpprest_2_10.dll | Bin 0 -> 1934336 bytes dependencies/windows/dll/zlib1.dll | Bin 0 -> 85504 bytes include/Neighbor_Tag.h | 33 + include/aligned_file_reader.h | 9 +- include/ann_exception.h | 1 + include/aux_utils.h | 57 +- include/cached_io.h | 54 +- include/content_buf.h | 26 + include/cosine_similarity.h | 15 +- include/ctpl_stl.h | 272 ++ include/distance.h | 422 +-- include/exceptions.h | 2 +- include/file_content.h | 14 + include/index.h | 281 +- include/linux_aligned_file_reader.h | 6 +- include/logger_impl.h | 2 +- include/memory_mapper.h | 2 +- include/neighbor.h | 1 + include/parameters.h | 5 +- include/partition_and_pq.h | 20 +- include/percentile_stats.h | 6 +- include/pq_flash_index.h | 169 +- include/pq_table.h | 345 ++- include/simd_utils.h | 105 + include/tcmalloc/LICENSE.txt | 201 ++ include/tcmalloc/malloc_extension.h | 446 +++ include/threadpool.h | 115 + include/timer.h | 2 +- include/tsl/CMakeLists.txt | 78 + include/tsl/LICENSE | 21 + include/tsl/README.md | 483 ++++ include/tsl/include/tsl/robin_growth_policy.h | 348 +++ include/tsl/include/tsl/robin_hash.h | 1451 ++++++++++ include/tsl/include/tsl/robin_map.h | 715 +++++ include/tsl/include/tsl/robin_set.h | 582 ++++ include/utils.h | 508 +++- include/v2/aux_dist.h | 5 + include/v2/delete_set.h | 37 + include/v2/fs_allocator.h | 30 + include/v2/graph_delta.h | 36 + include/v2/index_merger.h | 184 ++ include/v2/merge_insert.h | 156 ++ include/windows_aligned_file_reader.h | 5 +- src/CMakeLists.txt | 4 +- src/ann_exception.cpp | 6 +- src/aux_utils.cpp | 839 ++++-- src/convert/convert.cpp | 72 + src/distance.cpp | 233 ++ src/dll/CMakeLists.txt | 37 +- src/index.cpp | 2486 +++++++++++------ src/linux_aligned_file_reader.cpp | 107 +- src/math_utils.cpp | 51 +- src/partition_and_pq.cpp | 379 ++- src/pq_flash_index.cpp | 1117 ++++++-- src/utils.cpp | 153 +- src/v2/delete_set.cpp | 103 + src/v2/fs_allocator.cpp | 65 + src/v2/graph_delta.cpp | 105 + src/v2/index_merger.cpp | 1636 +++++++++++ src/v2/merge_insert.cpp | 582 ++++ src/windows_aligned_file_reader.cpp | 7 +- tests/CMakeLists.txt | 47 + tests/align_query_file.cpp | 44 + tests/build_disk_index.cpp | 42 +- tests/build_memory_index.cpp | 109 +- tests/build_stream_merger_disk_index.cpp | 60 + tests/lazy_reinsert_batch.cpp | 250 ++ tests/search_disk_index.cpp | 161 +- tests/search_memory_index.cpp | 164 +- tests/search_memory_index_recovery.cpp | 200 ++ tests/test_concurr_insert_search.cpp | 172 ++ tests/test_concurr_merge_insert.cpp | 745 +++++ tests/test_delete_insert_cycles.cpp | 174 ++ tests/test_diskpriority_io.cpp | 106 + tests/test_incr_intf.cpp | 102 + tests/test_incr_ramp_up.cpp | 196 ++ tests/test_incremental_index.cpp | 140 +- tests/test_index_merger.cpp | 98 + tests/test_index_merger_steady_state.cpp | 549 ++++ tests/test_merge_insert.cpp | 625 +++++ tests/utils/CMakeLists.txt | 97 +- tests/utils/bin_to_fvecs.cpp | 77 +- tests/utils/calculate_recall.cpp | 21 +- tests/utils/compute_groundtruth.cpp | 110 +- tests/utils/convert_axon_to_bin.cpp | 314 +++ tests/utils/create_disk_layout.cpp | 40 +- tests/utils/extract_rows.cpp | 143 + tests/utils/fvecs_to_bin.cpp | 11 +- tests/utils/gen_random_slice.cpp | 25 +- tests/utils/generate_pq.cpp | 22 +- tests/utils/int8_to_float.cpp | 2 +- tests/utils/ivecs_to_bin.cpp | 10 +- tests/utils/merge_shards.cpp | 2 +- tests/utils/normalize_data.cpp | 70 + tests/utils/partition_data.cpp | 16 +- tests/utils/partition_with_ram_budget.cpp | 16 +- tests/utils/prep_index_merger.sh | 21 + tests/utils/script.sh | 56 + tests/utils/seed_index_merger.cpp | 219 ++ tests/utils/test_l2_avx.cpp | 482 ++++ tests/utils/test_partitioning.cpp | 35 + tests/utils/test_pq.cpp | 27 + tests/utils/test_pq_from_pivots.cpp | 25 + tests/utils/tsv_to_bin.cpp | 59 +- tests/utils/uint32_to_uint8.cpp | 3 +- tests/utils/uint8_to_float.cpp | 22 + tests/utils/update_metadata.cpp | 56 + 114 files changed, 18724 insertions(+), 2657 deletions(-) create mode 100644 CompilerOptions.cmake create mode 100644 dependencies/windows/dll/LIBEAY32.dll create mode 100644 dependencies/windows/dll/SSLEAY32.dll create mode 100644 dependencies/windows/dll/boost_date_time-vc141-mt-x64-1_70.dll create mode 100644 dependencies/windows/dll/cpprest_2_10.dll create mode 100644 dependencies/windows/dll/zlib1.dll create mode 100644 include/Neighbor_Tag.h create mode 100644 include/content_buf.h create mode 100644 include/ctpl_stl.h create mode 100644 include/file_content.h create mode 100644 include/simd_utils.h create mode 100644 include/tcmalloc/LICENSE.txt create mode 100644 include/tcmalloc/malloc_extension.h create mode 100644 include/threadpool.h create mode 100644 include/tsl/CMakeLists.txt create mode 100644 include/tsl/LICENSE create mode 100644 include/tsl/README.md create mode 100644 include/tsl/include/tsl/robin_growth_policy.h create mode 100644 include/tsl/include/tsl/robin_hash.h create mode 100644 include/tsl/include/tsl/robin_map.h create mode 100644 include/tsl/include/tsl/robin_set.h create mode 100644 include/v2/aux_dist.h create mode 100644 include/v2/delete_set.h create mode 100644 include/v2/fs_allocator.h create mode 100644 include/v2/graph_delta.h create mode 100644 include/v2/index_merger.h create mode 100644 include/v2/merge_insert.h create mode 100644 src/convert/convert.cpp create mode 100644 src/distance.cpp create mode 100644 src/v2/delete_set.cpp create mode 100644 src/v2/fs_allocator.cpp create mode 100644 src/v2/graph_delta.cpp create mode 100644 src/v2/index_merger.cpp create mode 100644 src/v2/merge_insert.cpp create mode 100644 tests/align_query_file.cpp create mode 100644 tests/build_stream_merger_disk_index.cpp create mode 100644 tests/lazy_reinsert_batch.cpp create mode 100644 tests/search_memory_index_recovery.cpp create mode 100644 tests/test_concurr_insert_search.cpp create mode 100644 tests/test_concurr_merge_insert.cpp create mode 100644 tests/test_delete_insert_cycles.cpp create mode 100644 tests/test_diskpriority_io.cpp create mode 100644 tests/test_incr_intf.cpp create mode 100644 tests/test_incr_ramp_up.cpp create mode 100644 tests/test_index_merger.cpp create mode 100644 tests/test_index_merger_steady_state.cpp create mode 100644 tests/test_merge_insert.cpp create mode 100644 tests/utils/convert_axon_to_bin.cpp create mode 100644 tests/utils/extract_rows.cpp create mode 100644 tests/utils/normalize_data.cpp create mode 100644 tests/utils/prep_index_merger.sh create mode 100644 tests/utils/script.sh create mode 100644 tests/utils/seed_index_merger.cpp create mode 100644 tests/utils/test_l2_avx.cpp create mode 100644 tests/utils/test_partitioning.cpp create mode 100644 tests/utils/test_pq.cpp create mode 100644 tests/utils/test_pq_from_pivots.cpp create mode 100644 tests/utils/uint8_to_float.cpp create mode 100644 tests/utils/update_metadata.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 6bd3886f5b..49210886ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ else() endif() project(diskann) -include_directories(${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/include/dll) +include_directories(${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/include/tsl/include ${PROJECT_SOURCE_DIR}/include/dll ${PROJECT_SOURCE_DIR}/include/ols) #OpenMP find_package(OpenMP) diff --git a/CompilerOptions.cmake b/CompilerOptions.cmake new file mode 100644 index 0000000000..c3266cdb44 --- /dev/null +++ b/CompilerOptions.cmake @@ -0,0 +1,21 @@ +if(MSVC) + #changing default target to X64 + string(REGEX REPLACE "/[M|m][A|a][C|c][H|h][I|i][N|n][E|e]:[X|x]86" "/MACHINE:X64" CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT}") + string(REGEX REPLACE "/[M|m][A|a][C|c][H|h][I|i][N|n][E|e]:[X|x]86" "/MACHINE:X64" CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_MODULE_LINKER_FLAGS_INIT}") + string(REGEX REPLACE "/[M|m][A|a][C|c][H|h][I|i][N|n][E|e]:[X|x]86" "/MACHINE:X64" CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_SHARED_LINKER_FLAGS_INIT}") + string(REGEX REPLACE "/[M|m][A|a][C|c][H|h][I|i][N|n][E|e]:[X|x]86" "/MACHINE:X64" CMAKE_STATIC_LINKER_FLAGS_INIT "${CMAKE_STATIC_LINKER_FLAGS_INIT}") + string(REGEX REPLACE "/[M|m][A|a][C|c][H|h][I|i][N|n][E|e]:[X|x]86" "/MACHINE:X64" CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT}") + string(REGEX REPLACE "/[M|m][A|a][C|c][H|h][I|i][N|n][E|e]:[X|x]86" "/MACHINE:X64" CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_MODULE_LINKER_FLAGS_INIT}") + string(REGEX REPLACE "/[M|m][A|a][C|c][H|h][I|i][N|n][E|e]:[X|x]86" "/MACHINE:X64" CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_SHARED_LINKER_FLAGS_INIT}") + string(REGEX REPLACE "/[M|m][A|a][C|c][H|h][I|i][N|n][E|e]:[X|x]86" "/MACHINE:X64" CMAKE_STATIC_LINKER_FLAGS_INIT "${CMAKE_STATIC_LINKER_FLAGS_INIT}") + string(REGEX REPLACE "Debug" "Release" CMAKE_BUILD_TYPE_INIT "${CMAKE_BUILD_TYPE_INIT}") +endif() + + +get_cmake_property(_varNames VARIABLES) +list (REMOVE_DUPLICATES _varNames) +list (SORT _varNames) +foreach (_varName ${_varNames}) + message(STATUS "${_varName}=${${_varName}}") +endforeach() + diff --git a/LICENSE b/LICENSE index b7a909e5c0..81b23d8c7d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,4 @@ +<<<<<<< HEAD DiskANN MIT License diff --git a/README.md b/README.md index 7fd3007d97..7045ab168a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,164 @@ # DiskANN +##Linux build: + +Install the following packages through apt-get, and Intel MKL either by downloading the installer or using [apt](https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-apt-repo) (we tested with build 2019.4-070). +``` +sudo apt install cmake g++ libaio-dev libgoogle-perftools-dev clang-format-4.0 +``` + +Build +``` +mkdir build && cd build && cmake .. && make -j +``` + +##Windows build: + +The Windows version has been tested with the enterprise editions of Visual Studio 2017 and Visual Studio 2019 + +**Prerequisites:** + +* Install CMAKE (v3.15.2 or later) from https://cmake.org +* Install MKL from https://software.intel.com/en-us/mkl +* Download boost (v1.71.0, later versions are not tested) from boost.org + +* Environment variables: + * Set a new System environment variable, called INTEL_ROOT to the "windows" folder under your MKL installation + (For instance, if your install folder is "C:\Program Files (x86)\IntelSWtools", set INTEL_ROOT to "C:\Program Files (x86)\IntelSWtools\compilers_and_libraries\windows") + * Set BOOST_ROOT to your boost download folder + +**Build steps:** +- Open a new developer command prompt +- Create a "build" directory under diskann +- Change to the "build" directory and run +``` +cmake -B. -A x64 .. +``` +**Note: Since VS comes with its own (older) version of cmake, you have to specify the full path to cmake to ensure that the right version is used.** +- This will create a “diskann” solution file. +- Open the "diskann" solution and build the "diskpriority_io" and “nsg_dll” projects in order. +- Then build all the other binaries using the ALL_BUILD project that is part of the solution +- Generated binaries are stored in the diskann/x64/Debug or diskann/x64/Release directories. + +To build from command line, change to the "build" directory and use msbuild to first build the "diskpriority_io" and "nsg_dll" projects. And then build the entire solution, as shown below. +``` +msbuild src\dll\diskpriority_io.vcxproj +msbuild src\dll\nsg_dll.vcxproj +msbuild diskann.sln +``` +Check msbuild docs for additional options including choosing between debug and release builds. + + +##Usage: + +We now detail the main binaries using which one can build and search indices which reside in memory as well as SSD-resident indices. + +**Usage for SSD-based indices** +=============================== + +To generate an SSD-friendly index, use the `tests/build_disk_index` program. +---------------------------------------------------------------------------- + +``` +./tests/build_disk_index [data_type] [data_file.bin] [index_prefix_path] [R] [L] [B] [M] [T]. +``` + +The arguments are as follows: + +(i) data_type: The datatype is the type of dataset you wish to build an index. We support byte indices (signed int8 or unsigned uint8) or float indices. + +(ii) data_file: The input data over which to build an index, in .bin format. The first 4 bytes represent number of points as integer. The next 4 bytes represent the dimension of data as integer. The following n*d*sizeof(T) bytes contain the contents of the data one data point in time. sizeof(T) is 1 for byte indices, and 4 for float indices. This will be read by the program as int8_t for signed indices, uint8_t for unsigned indices or float for float indices. + +(iii) index_prefix_path: the index will generate a few files, all beginning with the specified prefix path. For example, if you provide ~/index_test as the prefix path, build generates files such as ~/index_test_pq_pivots.bin, ~/index_test_pq_compressed.bin, ~/index_test_disk.index, etc. There may be between 8 and 10 files generated with this prefix depending on how we construct the index. + +(iv) R: the degree of our graph index, typically between 60 and 150. Again, larger values will result in bigger indices (with longer indexing times), but better search quality. Try to ensure that the L value is at least the R value unless you need to build indices really quickly, but can somewhat compromise on quality. + +(v) L: the size of search list we maintain during index building. Typical values are between 75 to 200. Larger values will take more time to build but result in indices that provide higher recall for the same search parameters. + +(vi) B: bound on the memory footprint of the index at search time. Once built, the index will use up only the specified RAM limit, the rest will reside on disk. This will dictate how aggressively we compress the data vectors to store in memory. Larger will yield better performance at search time. + +(vii) M: Limit on the memory allowed for building the index. If you specify a value less than what is required to build the index in one pass, the index is built using a divide and conquer approach so that sub-graphs will fit in the RAM budget. The sub-graphs are stitched together to build the overall index. This approach can be upto 1.5 times slower than building the index in one shot. Try to allocate as much memory as possible for index build as your RAM allows. + +(viii) T: number of threads used by the index build process. Since the code is highly parallel, the indexing time improves almost linearly with the number of threads (subject to the cores available on the machine). + +To search the SSD-index, use the `tests/search_disk_index` program. +---------------------------------------------------------------------------- + +``` +./tests/search_disk_index [index_type] [index_prefix_path] [num_nodes_to_cache] [num_threads] [beamwidth (use 0 to optimize internally)] [query_file.bin] [truthset.bin (use "null" for none)] [K] [result_output_prefix] [L1] [L2] etc. +``` + +The arguments are as follows: + +(i) data type: same as (i) above in building index. + +(ii) index_prefix_path: same as (iii) above in building index. + +(iii) num_nodes_to_cache: our program stores the entire graph on disk. For faster search performance, we provide the support to cache a few nodes (which are closest to the starting point) in memory. + +(iv) num_threads: search using specified number of threads in parallel, one thread per query. More will result in more IOs, so find the balance depending on the bandwidth of the SSD. + +(v) beamwidth: maximum number of IO requests each query will issue per iteration of search code. Larger beamwidth williult in fewer IO round-trips per query, but might result in slightly higher number of IO requests to SSD per query. Specifying 0 will optimize the beamwidth depending on the number of threads performing search. + +(vi) query_file.bin: search on these queries, same format as data file (ii) above. The query file must be the same type as specified in (i). + +(vii) truthset.bin file. Must be in the following format, or specify "null": n, the number of queries (4 bytes) followed by d, the number of ground truth elements per query (4 bytes), followed by n*d entries per query representing the d closest IDs per query in integer format, followed by n*d entries representing the corresponding distances (float). Total file size is 8 + 4*n*d + 4*n*d. The groundtruth file, if not available, can be calculated using our program, tests/utils/compute_groundtruth. If you just want to measure the latency numbers of search and output the nearest neighbors without calculating recall, enter "null". + +(viii) K: measure recall@k, meaning the accuracy of retrieving top-k nearest neighbors. + +(ix) result output prefix: search results will be stored in files with specified prefix, in bin format. + +(x, xi, ...) various search_list sizes to perform search with. Larger will result in slower latencies, but higher accuracies. Must be atleast the recall@ value in (vi). + + +**Usage for in-memory indices** +================================ + +To generate index, use the `tests/build_memory_index` program. +-------------------------------------------------------------- + +``` +./tests/build_memory_index [data_type] [data_file.bin] [output_index_file] [R] [L] [alpha] [num_threads_to_use] +``` + +The arguments are as follows: + +(i) data_type: same as (i) above in building disk index. + +(ii) data_file: same as (ii) above in building disk index, the input data file in .bin format of type int8/uint8/float. + +(iii) output_index_file: memory index will be saved here. + +(iv) R: max degree of index: larger is typically better, range (50-150). Preferrably ensure that L is at least R. + +(v) L: candidate_list_size for building index, larger is better (typical range: 75 to 200) + +(vi) alpha: float value which determines how dense our overall graph will be, and diameter will be log of n base alpha (roughly). Typical values are between 1 to 1.5. 1 will yield sparsest graph, 1.5 will yield denser graphs. + +(vii) number of threads to use: indexing uses specified number of threads. + + +To search the generated index, use the `tests/search_memory_index` program: +--------------------------------------------------------------------------- + +``` +./tests/search_memory_index [index_type] [data_file.bin] [memory_index_path] [query_file.bin] [truthset.bin (use "null" for none)] [K] [result_output_prefix] [L1] [L2] etc. +``` + +The arguments are as follows: + +(i) data type: same as (i) above in building index. + +(ii) memory_index_path: enter path of index built (argument (iii) above in building memory index). + +(iii) query_bin: search on these queries, same format as data file (ii) above. The query file must be the same type as specified in (i). + +(iv) Truthset file. Must be in the following format: n, the number of queries (4 bytes) followed by d, the number of ground truth elements per query (4 bytes), followed by n*d entries per query representing the d closest IDs per query in integer format, followed by n*d entries representing the corresponding distances (float). Total file size is 8 + 4*n*d + 4*n*d. The groundtruth file, if not available, can be calculated using our program, tests/utils/compute_groundtruth. + +(v) K: search for recall@k, meaning accuracy of retrieving top-k nearest neighbors. + +(vi) result output prefix: will search and store the computed results in the files with specified prefix in bin format. + +(vii, viii, ...) various search_list sizes to perform search with. Larger will result in slower latencies, but higher accuracies. Must be atleast the recall@ value in (vi). The goal of the project is to build scalable, performant and cost-effective approximate nearest neighbor search algorithms. The initial release has the in-memory version of the [DiskANN paper](https://papers.nips.cc/paper/9527-rand-nsg-fast-accurate-billion-point-nearest-neighbor-search-on-a-single-node.pdf) published in NeurIPS 2019. diff --git a/dependencies/windows/dll/LIBEAY32.dll b/dependencies/windows/dll/LIBEAY32.dll new file mode 100644 index 0000000000000000000000000000000000000000..7311c2b3ed3cca8dd21d6290ab70848251875b9d GIT binary patch literal 2282496 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 z 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

p{_+W07 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ⅅ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

w;7awkfW`hBG}4eH;Rz4c_hO<|`S`We<+ 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ɤ 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�mFSKz*Y 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

!AuIYus*B0j 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

>TRWaOzV5gc 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¥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%0AuTG0U#Jr4ujZ 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 z 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඘M`GtJ<7FzeDAr@UzPvCMk(CM(a$-p#B}Z-(+_vQJ_* zpf^W(DeP034e2dXUOM{>W+QkH`pIIS!)(m?Em!l)XK$TpY#%$l)yj)zAIoe)?`h>Z z*(WfY(%Y)MB=+gdX7FVHvQv54?DLt;>FraV?MW^_vjx3F%5$<$WVWPtTzP5iGnuXE zy`;Qc_SRX({m0VFRGyuEJhL^u^U6zNpU!-Q-bLkQvoBz_q4%-!qGub+Ka*rzic^a_-h&Ax!yk>0<`i=JaFR~)kw zy<*Atzb|;$r!qU!E3Uju_Ib=M^vWvFHkXe-vn##I%5$?%W_F`jU3p&i+05?r>MAdv zeZ)MjH$A)Z9PAUAJ?OPkUJCmRW>0$Um6yxjHs844Ui7*u&%xfq>`kw?^3vF6F#FIO zsJv|UdCb1_hA7Xpz*w#bWI8j`LmJKChTh&^x2N81`|@;q+cpUIP0>rkmay%1dUS${a!OE#;-N&ti_Gm!-Ts_SVJ5 z`i!FYp7LVY$1+FLyQsW4_HO1FdLJk+k$nntEWOLhOJ|?S97pd{<>j!?XC~15OnKHN z#(G9G$J4u}yjb?}%n9^zl{b_9eC9-YH4 zd0Fgpm{aNfsJuM(1xydUd&;ve<@267jovTHi(&6zPN!F(ymM(GV1)FP6QVc@Um_j@esz$?Uz%=jjblUJiTH8smNs(Ti7J z40|W@Fuf;~m&iVi`2sw7y^U607W)F`5zcS2@?zE+%N5T&N^geplG$f4z4YcNFOPl1 zI%B@a=q*xS9Q%0Yad;2X)nab+C_TX3$%&yhQdX%$MkGQ=XT7Ci7)_dzF{NK9BhdJbC|pL3!2`V?867 zXXs@pFP42A^DMnLl{X20{43uTD(^$`SjhK$%D)kizt@*z5Ba`P`HoO|f0Xa+l=mTd zEadw(<=+U%-|NeGEl$>Sj3c`5%sK>k)=jyvSLH|6^>&-?`FA2!kn-;Yo(54EM}zvHEocv_fd-%* z*Z^lE=zwuU-~{tAubIeBU>fKKI)l2HJ_;$HwS>zufCZRV9n)%nnxGMo|F^aL|ET5P zn8?2$34&J=*X6Sp{AV)bHgZff9SjF@?6VBhRss3`;MSNn1z8Fy|9@`ze`?Re_0mZB zyA%1F6502p19{FL1RKEy@I2TAHiIr81w0LQgRWo?SOjE$JremGs0HeP+8_qV?}bJH zIp#@3&INP8Jn$r#56S>Jj#z``lFxtKAOXw<^*~231MI@G?f^T%vp|kh3XkECVZaJP zL0z~Guoq4mkiVaozl}eGX$Qb)U<2!ceCMJ3$m?k?#^Ff$|9Za!76AFqw`!m&SPPeCO z29e_nId+ia0(sAu_j7r#miJ+KkCpdN`3|t5$P>6P`TJ=3+hX~v8M^|k!ENNc zcB0G!Den>TeiDi6^8P6Aee%90?^*JGB=7z5zAo?C@_sDuwQ@YV5c8UioDYuRw(?!1 z@_mN#U5fI3h4LL>uLJqcMEO3%WN;2thhGC!0BN{h5m^aT29Y2F*fGCl;7N>^!$|^% zaXl6+1T%4c6gv5y%EypzA>}*ecA%5**lLVv^}#^U5Htb}zyJ^h_QI=ztO}w*H6Y*7 zdjuQ>@;$ur9eVP8it=5PbI{9o#+F3Jg4W;>&;~RE?Lb@59yAB7Kz|SidVrpw7w8Qh z1>Hdt-~b&#C(s#m0bM~i&;j%TeL+9q1WiFp&;rx}E)W9-fqI|>2*q-a0wcj_upW#7 zV}TdzodjnQC<_*YrCVP1A*5|%dtSsIiBk)RZ)49bAApb{t# zDu9Z>3WnhJk0V2X8;k%$!Ei7P9L0QtkO81LC<#gc8`y&FlM0>z+dvqmjRS#TA8xlF zw8pqC=m6S-cEADJfJZkpKU;{J+d|z-90;_z`>wa=}+16Z{0^|M~kH_yybr_rTBKbx;6a1s{Ts zKsLAp-Up?z4L?9$1Q)=Y;9p?Edi{-%{|E11;2&@noC9xxcforg3%mo)gSWvOK>q)} zzXSPqRqtay^7o-*aDAmD?r$B&wK2U8hyjn{dH|;1!T2ol6>tV@!SsRP8m3Nk3d~`6TvBT&A=i|D*%6h-$5Qo#`Kk71$YV^0;@nWmPh{0=vQ!F!1e7IPs4a4 zh{N^XpeJ|)^aI^NU(g2h0zJTL&cfA-@6HU^u!Lk*C2a z@FmCsFM%^41DpqE0cL4>8B_+ZfU=+*s0b>73LpZM2U|g7@HB2Gf4BPt?q?X-jPW6m zfbn=>2V3B51KYtfUC21`H^2m)ph04!iQ@PJ8RHkb-#f?426Fd57PiC_+x z3ub`nU<#NB#(@Md0gMNuzzE<5Bf%Ij7K{dwzyTfs2((?Lb8k4;ld{Xbk#;!QfHQ1#|_`pc<$Sx`FN>4%7fOK`qb&R05?zd(Z(?26oUA zGy?;{AkZAN04~rI^a8a(9S{S0gFc`ys0-?W`k)_Z1xkP>AQS|H5MTujKtm7)%7SoE z9K?dwpbRJn27spE3Gf&g0)~Re!7$Jq&xg11e8>k&!6r;|VVW7wnRU260ONbeyI?M+ zO#mA(b|XiE5#T*suLYLFodBN4JZ9tiNsx%X6{a--9*jT0w5iA^kzjcGtV5p)_ZX&6#`P$00%JKAei>u{ z-|_2GOqXM>g>aI=GF)GdOae23923g%og8a526DV7$9Qt=C&yQE%qPc8vX7Sijy`6R zV=*~y@?u^`z)^4v$m`<2?+>zXKMkJ2^le}zkoOST&o2YA&)*GXAMe}0%f3Dy^Y-oM z+$IJd*_VdTVbli3-m; zIX3YfN67wkEAAU%Lio?m~f=%Jb@5xI-`=490D(|7&aeX7^@ih1jW7)s^p3Cw)PKB3&d4#U7u z@C4X~Y1_dwU~FcqYN{pf?h3^*-ueJi}xU=F4&#I)j=X2!TFvIQsswt<=GYJ*zfXZUY| zAHi|30?fnos_>TLwpEZR$frRR#?hcYXbakdYM=pV2R6Xj2s&Wg5KIK)FfS+a1oAkD z#P|i|5pWcE!7-2y4ua>wA#fOk!JUic`QMxe&xgMfoC7m)`_7;fmX>g0P#69G z=^Qx`>+&SrSln(D@*-~Y7WfwIz_i)u|HfF}TSnn}BRGRWI4BOHz+OzRf~*RnK{ap- zx48m71io|M1sKPo`=6Zq#=+|WdV*e{H|P!=pd;u6I)ney`EE-%EkG#ldlVQ6MuYWW z3>XW%SbpERY&p1c4qG0q1jW!VKz2rU16@HEuo~0WfVChT*T;hiAOZBp{L-<#f-&w3 zhJc>H3HpJ7U;u~%JwSgD4;}-9K_B1(kAgvG=x zZ4iVE0L4K`Py*P%7Hpd^7eTm$*w3itwC z1$p2$_yK$mz6CeHH{cGq1-=89Zcp5wpx`3Z>+iyTN_}`qjzKq*e2Csm!pd6?ODuD_h0{r)!^;>HRNsMQM z6pSZhS|;)mD1&Lmz%p#hIk>(RT?&|wY1eW68DtG)bx;%R!u9`K&U5EsnWtb`LqHg? zf>1CX%Qy{PASebFf(2kcSOgY>B_Ih{z;NIJlfXKqt@{R0ZuoMGy}f0Vik-`h&sX zQP2f+1<{}ys1CY;?jR1-05w4^&;wKgr9pep0aONd&=NEQ1HmBB9JBx~&=d3mwLu*a z1A2o#pf9Kk>Vf*8A7}+ifF>Xm1cMM@1r0z$5C+PEa8Mk?g4Uo6C z@whs`4A2qm#k5@@4eS8B!A`ITJPYcb3pbZr*Tz|wf5usQ%E^Rmi3m`iX0!ye%-fyWZx_M zU0HuQmX+80P%sQ^#_eUlCi_j$=kgvf3dnoa-&jsL=Rbn69FNL=QI3h_aggIjdHm#|x z7!QCy5DWq?Am@vNK|ELsj=)=oTmu5&2ZHTbFFE&o419<25Tu+_E|h8L?_k;nT;C}7 zfpGu`1Qrkkih%=QA$mD)PXdd<60j6319DC$=P9z!bpv^C{1&%ahxyBEL|z~AI+53m zygq!d4S6le{zLW`vY(LGue?s=^&_tp*}wSqDYCzi*SNf{WgjH_7TK@J{^Y;=i2v>v z{`~~~8A+Kq9UCO?~w~vs0hrH%}uVLBe`Sx|P5A*G792m>~&bN>A z?Yp{RT6ZA(s~(^y=mmNM-#$k6E3*HSeV^I|120MFZb{tsBO&ZXg1#f^i!Q0?G$O7+x_rL}4Ik*b0fiHjuOas%w3@{Ts z31)#M;7gDTz5>_54R8~D4Q_#NKpwaaYGT{S@q`>p)&Vh~E~p3Ug9e}>XbkK?K4WVN zu&D|^w^@Xg<3u@Llw+8K=$;3Mz+rF%90gt==hU-tpNU`&m<#3s*@rhr*9`OleL+9q z1adAY=Y*|*J{N6^Y3)FJ&;d9=N6-oAbItCU_MmfA+DNk|J)&Yk4kQ_dl+K+dy5ft)vmgDtotFWf&d{tL9m_#USH z1AYNNfq%iT;AddM{rrY}5w09N`HrLH7-|r3fdOD3=nozR`WU#eF`L5Ue+$M@aP}hg zxxXB<%5kcEW+KO^OL4#H;4pXr905mx7aRk}!3l5@ya-N#(;x%91YQQOfHUAMcon<` zwqaeigJ-}FuoFBBc7cjmwo0Hfhy-#DD(9ba9%=)nKxt40lm+ELc~AjFfQq0Js0<>( zF|0=vQjXE9f@n|;$g#2#zaP}X^~J~~U@2GzYGYa*5CfLu`bkh1 z<9eVzXaE|5MxZgUgC?LUXa<^t7N8|)1!92>>)0Ck2;HU;r2h1_2j%6buIO;4v@+JT8g*8;TqTh66Vk0Y-vRU^Ey5#)9==97q7; z!32;hj~{pj9LM^f0248N5-5dvhlAqa5ln9bPGS0KkO5u-lQ7K#O28=zcp)GZ$hqY~@I2@Ox`N$c4=4xZe6IqC0KRiU zJH|~wQ_u{^F=z|W60`!b;4nA<&VU_2&aDsPzMlt&z-}yaJeF+*@^N%+kZnOb&>nOE z4$u*F0+YcMFco;fG%y{^05idpU>2ASwqd^8!85Y%U?+GM>;h?EH`oLAf_-2=cn+k4 z7r-9OV=veT_5=BxY!OHTi@|f4b^xS40lH&5#DN~5C+G!wgFc`y=m%DVcQMcRzyq=6LhG}r((f=ysEI0ROJl^_|c0#C^pkHac(8jnK;cnQ1=e#EqVa2Kq`^)+BE zIEUN31>OedK^AxiybIm~7r^`ABDe&y!3W?&@DV7Dd6WT{G5#2Q0zL&f;0pK*d=9RH zYv2p;CCCL|f$QJ~xCy=n{||590v~r(<$orR$z<~Av`y2b&q-ToD5Xq8fXYLMrvZ5k zC17={4iF?@DMJYmeC>#=Mg$!zYS%@bWl^j0*NE=g71V)^S`}r)sMSRsF=|y@M~u5g zQU2d^?>UqEyUirU6n~%I+&Smm^SG~bpTA#!f$&R&{RqE8_%*_B5S~Q%EyDjG{0^av z@Oy-(5dMHLiSS2+|3&yegg0=2T?Y_9jqoRgKO;PY@E3%?B0P&gsEhX^dLP0rgnveO zKf=EttU`DIG9E^r%?@^7BY@WZ@3r_tX$26Gz5^H|I>`8SWrER%op*vvBdH}`!`&o;9U;Pm`^Eq?PH zlIM>)pX7NY&s!MJ^A?`J@Nb^Ku%G9LZDT){M0`Kuk0G#p{>^hrme0R=ZprrWZ=Pea zJ^Y*fAM<_&G0!`hmw)s8lX>~~C<62HZ=R1bFaJ)Q*O^6@=oE=>lekafw8Z@q-!1Vr ziE|PcB;Iwtl{YT&u;6z~{8@<~kvJvk;u4Qa{G`PDB;9&}AC&lj#1lf_B=BB|>n^Z% zl!bn#;M*j=SK^YyTO}Tpcu3-`#3&;3oOb#dXP$NTi~G(w_a*0@f5C;Ri#A`}f61jU z-SV=RUv~Kw16RKKs==$TdCj(Kw_lgJe#Z?%H{Nvf@GY-RZ0tF%_xKY|-1LH@d1@MX zp4F#Re)ielD=-z8rhdNg*{7a;k(G1O$)}tO0&xh{)YjF98zPO-rskH`d9nEm7Pc*F zU)<4YIhQP5wtU6Pc-N}cYmPW_ZTC^@j$VJvhGW?zLqF@%R6KLpj-mKraC(md$ z^!#ZyPJAYqPSdZz4{nbtzt)pq`u8B;h%g?id|vaq^6NbLu{qkm+_9Za3wiRhUcR5J z{W-{U?f1*4_#bmCpLfk7KecCW@_F9KbsLj7ikP3=e_FXki7gg$D^7^VuV0Hj`0p!# z;_^}XO_D_A=RY5`|GCP4r6<4HlV5&dZt}N6o|X@bZuI1*=O}-bBcJt1^Q71ptljA^ z2JPp$4L^rk{;QGJEq@F#=27{v!rbI<@Z|G6f*+Ni_|n|uuYoML{5dcDsQjXolf~M( zAOAko@;Mr5RlX_z1y)k*A!~PLENDN^ucv$B4+qno`=fi--?G1}{uCq*l)oo`^vglM zLzS;KywHz|?D4+K|xJbBv zaeTPj5AWBjd@h>9-G2Bifa_Q7Kiuty&lz0#hr9he?aSvv!gILV&oi^gpKJT!Ju|M~ zIKuPMe)x<> zmk*acKRi~N=R4MKCM8yML?`fym?gdpbe7M0_&MD2`3!+=*P#A0Cw6DYgZ@9l#yp3o zn*2h^%FR46H~D-HqPDYH>YvsA!W`|dCSUC@&(VH9zu_X)JZS$_`(xjoTlrLzulCPX zKA%0g_N#wT`_pr@znXltf3EUx7yqE;uj_ZUKmNVBm47w)YX4m2-#Lr@g*ldgHTi1) zT;-3*_@(8qeoo6j^ZmJ%e>M4P|6JvN6pf#4*ZJGw_Mg?{SL~mo|KW3Dwg36>pVj26 z{d4u7yT$)#`5$ioSxvs$KUe?BXY=@1X+MYCe^!&P_RrOSzFqu}mjB`QpVj26{d4u7 z@0i8@x%#(i^40#i%72^qPc8q$?LVu@SNrGcKlu&{`=2-h$A{a0R+C?`e~$i>@6o9J zF#oX6KdZ@C`{(LE`Th_7Rm%Tx`_F3f)&9BqPrke4+JCtHXEph1|6Kj&9pZoDr~__C zhueQvldtyA)qlQo7W?Pw->S)1`{yeEcJZHD{)gLtR+F#x&((kOoj-2>+;;eE_NKN3 z{-Qtcv-9TE4{V(MnT`3r?{rUD=svBQ{M7!#BcJaivi&@MJs`PO(1;h0llm z)#M*8`?F%d_TQV^_!sU_O1T$*94yzAtsaxc{ge1jFrCt>$*14i^mCQZ_le#9d${ed zCjW5R&-b0({(HFXuO|O++0XaBc~6*I4aYrlK3kUh&Hj(qE~>O2Z7+Vz_r_T+`{(CF zKHocMx$);oek0^_*=W%9MfQL#mr;q4#5`Gv4>f9nd@fRzuk%lppM5%5{?AoDzX#;X z*ZH~1FaBw6@*__9aGrJlT;(U{C_e?6Zu`;Uqx@%Ucj}p-{W&%Q&!OHgIs$1~K9@ho z=OXZv{)?3xBYXeSVsSnu?Y|)O^j~ed+_OPDH2qrq(DG;bFA;*uFU?VYw zhuS{3BfZ;x^nRww&(#IX|GCP)&Xdn`P<~W?seW$quZ1kP{pkHnm7kiUd}FNhr_dA0 za(Vf&ljJ%5WZT_`->cyFE4aS-i8a{rNl2WM*ixtdW?HRXrI?NR9R_}H!+nwf23!Pw z^Kq|ReyT4kdh&-^AHR#T4xtT!pQ6YwOB{;?+k;Jo_tg$De}l>(aT4)q2&|9Wp6W}A zp7deX$M1UR`+=-4EAk5xm*%K%7&6@_4}JXJO&mzpmw%r1@jEO0Zcjq=QKPM|q{L~7 zK@L2JQh!-+lmcA#y%>IfC<#30FaA91x8{ejbQn!lGme#b10p#Cf^<(HK>U!^=# zi){XK?bZDm`>k#S_u+Tc_+2&5A3s{2MbT5PqVG`JXA<)K^320mb9k=hIeJAj3pN_P z(#HHAoBt$%@bz(;X_8jPqu2?5d;4VB{O}mc?-g-ZC~lpS$8!(H^O)h{&jif#tfYrO z3$T6Z>Dgyvubz^V1D@wgNrd>%=9_ZBPxG$nWr&jqE`BHA_0!AM8a?-uIA_;rFm3bFs3;62xP52t4t9Hx7& z0FwPQm&0O&lO-^Yf9o@o3{Jyx4n-EXBP#Hp=^x$~;HUI0`~T+D%<>FVh+Rr77NgEi z{B@qj##m#FDODa@CRK<)vl%s0?;hGW7a7S9*S9_v2!%q=n(%BLU&5{Obo{{PEB{za z)-BVBr0*7b`OzslTap;D?_>Is)lY8{KDTYM$Uecx*IRjvW4rSrkKyT_EyCy11_hri zP4zoYqxKJbbj~B&Sf0iHkt+IFHb0}sPT6lU)BoKia@_oKO0_Sq^kT4lb8iclZ(3k& zkE2!W%m25n&uaR13%%sjx2dz+gZeZ#TA!oBr+B~KQzuVf9$emRGrxB})1!I{YQNa0 zJeu#lLQkI))EAe8MYXfX(%&w4?v(uO6ME^?V0jlL|Jq(N0w*jR?N_-1Yji;HNiY9e zzmdnMuMf>{OzB?zXWnk>LtX4Hu_rEypJCziZ5vT}r(1cfj{R-y z9af&GKPbuxpY{h$aIfG;`-1Y)v&b72K9!SvvG6-`n3fYe(`Q+FM(AvZwqcdQ@u;VF zuct@T`sJedl>U&I+s85l?RSL>rt-;2-o<~MC-r0L-=4qH`rJ~5u6Y?$x-%ZKcVdR+Vy)442@Lf`Gtd5+9w*C+Hn zLXS1IR^}I+_slzO`_ui%xWH-Q+pBg7tkFKfk9zf@<-K3+@yb)nyR3B2-f9=nA3Qg@vdvx_bYR{n1li#)NOzB$x8KLWV&GI=-T=WbJ zUB`Q-neu&?&5v)dwu`Lr`RzF;_;SkH!*rIZ`Pt>sRbO(a)#vv!&1YWt#Oz8mD)@Mn z{!ixEkWuH~oYkP>?FWi}t&fB8w+h_(pbFW=m|ZGG#! zE-7%I@C^!|fR*TRDfg1-Q-ZdyVd2yEtaPpKtkS*yo4+gAe+R{$VG)q4Vo&O)GOmmN zQ+;aB7NHlvZOcd7d*VGaxA#Gns{$n+7JTZ;V7pO$S)o_Ue@^Ls{>2`@y=yzkSFuOU z%e*>hkK+A!ROG0?)ApkF?-9EC4=u0sdxPbb5LoNAP{qD|f>-~i?OXMgs^}|v`ZOP^ zZ~t`qc#`2d0#59QxQ8>|(fUYcWf5$f(UZiFto7CM(N{sjA9K?4-p_1L+)3}BTTRECaMJ5u z?{w)D*XN{fSL6)w7AO7E8PX|f&`HnxUb8(}C%yLZnRs$e`Xw_Z6xwblJf0ssYV(1-(A8dU53F-k^!vVF+wW)i$yeHBF>!_z*0vH6I4&phu*c+ZL6v!#Az zmdk+c;y5iZ&wCjjbm;6mG6Hixxor3JL<5tx5-7;^Y|oV-h5{>>pTFze@W z;%+BB!@C8Zhu>V+dz|zP7o7B*r@aF6y&Z;3+4xQm$0<(OEcRMhT0F^8ugf zz%^)LC5NBk*E{qO;Icz!m>O(-us!vFBMuw}9CP3Xz#R@;2RJS;w}lAcJ48O`m*FFh z*|_Nj{MKhnlhv1&cu?Yu#94`R67P~YFYz9U$0ROFT#~pfF*RE~F^S_6CnVk~>5>Ac zBu-15kvJ=HPU2k>@0NIv#Cs*)C-HuX4@i94#TRVY_?*79X-kaT75j}OLbw}$@U$YZ zZ*T**Urv`r&~)5hd>pqKUmmwRAD3`=Sq|&kC^+_~?PALb)8I~YaB9mHf@1>}H!uzE z%4u*{3oeOR^L#gcvmN~K;K%s?hrs!8b$k+_P4%of)#P+Tf~rcF|w-hQImpH#ZH-=_BW30=!a&ky6GD`&TU-1z6 zIX~`mK<#(-Bbl!4pWYN~|JwgbADh`fMTGCgqD;?wT-}HAd-T6-xs)E7zI<|`M`d07 zJnM_UIoO`xDEdafGrfIkSGBl2Zuts_$e)o4e7^Phel z>`}Gxx|*WYy}^E)lZ5Kuw+LP5C+gn|pPJdfr-korp5lz)OLG3qbe5_5vL0RaB}Qk~ zmlM7b&;GpN3ym=|elp$FH!5`X15D?!S?wuIL+5c@=|z<<_h-2L*f%P@By>GbW%;~s zqx7=MckHukUnJt^!?u20`*^Lb{Bfb{`hn#$P3Z}tt6%24@spSGY_wqIZ)M&pe7>Jg z34T=UWkzn>iD*hjZGBV}AL5TvtL2L=n3@05!=xv_aArNV+!*l8H9uC$ z?0+{)60PsqIMPR0`?C_ymfoko90=0}Zkf3pd_INa-IlK;vEr-6{X$5r|J(HWa+9;j z@%>Z&6Slu4WWMYBr%{it{;Bxcnf+5i__m0Fac{lo+pTc1W^Uzh$KP4slj2~WYyL9F z{B8NXQ}S2z&Ih#o{5bbq_1tIMgUWd)ewhBS;cv57<eez?Mr%%TN)t47~O!A@nO0(#@SNL8gdUD6lu{=diN#qna1?8#T zn!nPgY&qr~y*!TX*)#Jvc0l-4jvvQHMXvO39_#th@`?+6RP<_j#r|{V`bh|%l{O_W zDR`Zq-Kz;CR=s_aPUjIHu99wxq$@b(;wH^|c4h^3)40C}MP6S09Wu=2tZ6c8|H-z# zv^?UUpSe7;!pG^|Cnxx#Q@%{sa>xrk@x9=AYHk*NyM@oy#lQD>^0b|)zP&=%{;K(- z2WHOSKH0aa?%$B)4xpSJAZF`%KvWr)d7hs_5L3gACp+; zw{d|J5{ucC6nKloT3;D~vl45+%?Z3)VxF7xQxLc$G0(~QDGMC=oV82aL0sU3#BLw3 zoc6Dd*UFca^g7?Z9mzQFN>2$rE9d!||MVAv?Q5U3H{Ew06h6Lh>psJRPf2_6=RYGt z*Zn#ke_5xl8*)Ndd$qk6#U8B()ftx`dEwLgQ2MCglTQ2RvP*x_=1BT0##$T1BpYr^ZWO0r~&_=BKpn@U+ij6+5gJ`+r62Z;nR_wm+97 zzdZi2N!p)tLf8Jx{-4JW?YFyx?#~CyW46EhaT3ooxrXzm;F? z@Y}QIf3HX9vf;d!zdW-)D+!}$WllaF&v(KhJ_-|79<8OLyat??c zZhL3x+8*e?tet-TwLe5Wy5^tu&fFhj!l(N`nxnYNll=JobCX9`eL2x5#i`;d{Wc|h z6@vVTkJ(QjOnaX>B(v6+ys@Lnug9*sr0naQ(w3BUg^J&*z(hLJXp-5erHhl6tD8Kf{%;5 z5lNu*T|(FXton+gPhpj-`bIr{O5ZDZt*>{9BGtD~=%eC4c>TvRli!@aedv6lTt%Pi z%}M?gt`=v%F@1m1^sz^!eOGy(U|iZw#?zsc|eGdATEnnT&8I|(R3SUO}1gu0^!E1f8E`GE=cM09^f3ZiW zuTL$f-JU*`HzD<$z1;3+jzE{&zxJv=uYY7`(O2~JnM~kMS@8P)h_-jN=YY_)K9x`N z5i8pEk`;Rns&ApE9XjVHE`l}*oupl={%)Zsg&q@r?Js4?ufKny?I0z5YLAGcbQOCv zzZuUSww3c*D$ZP=!^)?MB+dz5+mDh}UtZ{1zB=F3@+}D6_ZO*eTYLOraFZz5SH+$K zg4g=??U|gVf77>ZeXG67ul>72=;}`^jAa5TliF-#(jd<@?&}YX!&gsy5IkD zkIh_P=_>k$1@GGL>dOgT_Z!q6t*>1|Pf2^${L^=)uP-gPyl0Q*uORqptZxX!Uo>X6- z(!KZ9GoC(`r}^9B=~HQGmB6Q6k)42|no)>z-EANunrn65~{z0K<9lE=o$*6qC-*6o&|FF<=!ms|iEcwy?vP=4l<|iwB z5EXcK3BFo==Y<}Z{Hi{cJ1X>q*sH>|z6(khew}~ECE-4y>-=8lYlR;K`@hQVmLFx| zQ@qBJ@7i{v`KjRLM@;B`f71NKg|72c<=6c53SHZ;+MD~~^!+U^0+Pa~@-*He_-gj1 zg`V)rPwgF6du08h_9Xw?+T)KenvYx+dv<&F`2BxW=+)XoLFm=mLs9wVeJJi9+<)Ry zASI73=*oAK%R<-s;r7IBG9d{g-?R1a*Y75wH_Q4&>yP=ljFLj{@c6Yni&CDAl1`&O z`Oz(Wiq|+P_-ggr=jl^Et*5lmHNR?4{72K*Z(IZn3tvuP^&dIGt3O;M^qeHnbh{*- zt|RzeYJU85c}W+O_Q~&r^W&!*m2}B(+WAPQO?FVaf}~4HI{kKtFRv)+(vt3*RpgZ< zT}IL^kPhL?J0R(@l1{``qN0>{Wj{dRN`fjs@>S$%^4Rxnd)4uaI|H9@C_OIpoXFAo zPyWQ#zxv}2fz>Z0gpbp^Pg3yeZ<)sWMup!^>;6s&AK!zR?+^y7$fJ_A&q*5iIV^l5 zg4K4H6TJ2pz7OM$ue*h=_pLSmDbc5}D%0}VBYcY2xF~q_2Z~pF_6t4nE!%E&KBaOG zc=oWZOe=^z)%r3;edgJmV zBYcY2I4gMdw|d`3%WuTf$8@eEwRe|CS9|D*>HVALW4G{~ap47LKZn;)iPOJo;L2AY zDo_8G{#TuO`k|(t`d(*T3aHQ?&vKr8f2;evnr^S8^Zl)#t|;l^x7zQ}tH1Tr?UQs# zNvGxJr`s>-Qj$*nvY(C?+kB)Yo%&@zU0l*-Bpnxn>gM0cpV@j%Nw4s^I{9~>;N!ABQGV?o zDW!YwhpXHzLeGjldfuu1XF%wB{-X11&F_TNukH`4{ANEljdiS@=JMWel39mim#GY#7S-OfnYImwizf`)$8P9&jtNp`5FIQW?By{!r>Tl>*)*ipS;MZ|pb0_N#nx`LSE%a(egKBY4-J@_1Mfd2U+wcTxEK^+2hLyx5c0K39hO z`+)GdIQ~6+Qm{QMUCS#gbS*EQYw@G?dx!G>*p4?$XWq2fNxq z(o|nw=vqH&kJ`Ii?eY9ic@}#{g)b)xRbN5yI=}p&(EW5p&#ruxbR{p{hpMD2OS+=m zlb2+bDF54_|H=wnNl@*_$+o`p>Q7OC?))qw^psbhssEX|zjg?pUoPE(*YbO>*yX3& zq;|=7f!fP*}d63mk6wNyt78fxlhIkN*F4N%?;r({ud)BL}V6%HO^6Yxkfn-%*Km9`iM! z?-%?5iMb5;`MQm0LhzfewsMsJ8$wSDJ|nU6KO*#k;ENtz_aWogSh?L2tNd>X|5m{d zO8gwFRixm1k=I&1y8ogCt>=Q$>ptf^l81SJk7@z;nV#vr4I^T?Pog6RDBtt>wRj?kIKyoJ?YrXHfZ_egznp$_~Xpw zvs?JoPL1~nJ|p@xKWgt@p{Iqe)U)yk(-MPFI)c^&`75Y1+}OZ~6SUp0Ll z!l(JtxLff0{Qy6In}nY5@>iHeU!U;hpvbM?ErQqm0H(9en!iDzYx~#yB>r#a{0$4A z=1b!d!RvhoKYzP~uKCyU%+I24kMNC%BDH^?;4@NxOn39YU+6I@Po}&1Kj86e{$mGh z{&oJK`O|(8$=G(Gc#WGyp7w9WtGyk{C-x{^<#r3*FF);Xn>;%E56*8~1oa8s?~i%O zkB-Zdys}RD zt)FW7*(-c%ug3cXANR^%^Rr*+-gu(lRn`)+A1N9lLQuf-%!S-9xq>**<J~Vs21~qaMB2C0o;VN6m-pz*@3yzyLf7#`>p%UM>HVp;w^8Bq?J0QrcwOt- zQxtmE`Ch1L-=a^;Te4T_7o{rt%AP*9$JKYh)92@(-e$|M_^9=VOy@e&d`5&`5PGG2 z{yK|)5WbYygUCE_!IwlHBYFK9d)CUcsSf^|5I(lgeNGX)`g^9k`R|*C?$&=w>Ea*# z{BIRH6{pIF+i+Zr7!>+J%KioSHnmS?s6MQ*qK!Y|Jb z!B;EKxX`tKGr!y3x`nR&jmJN?za@kotJ2;!O{1UNn6|5=&~^M|`Rr2@2>kRZzsP4g zpBZdoBA%4e#h>#0hJ9%gfuAiZU-;D@6s0_?-TxXCz7%A*Wu6s$Qsl7?_6PCWncI6# z_&B}$?E0jP2i|;0$AjHM_uG3$^traN+?WX8BYdtd{=HZANqH$<^%aGlIc}lpzuJdY zZb|5Q;a9r)-zPo!N{@@8147sDrRaIEwui{4Y$6K{q+ew@7sXnF01+VR2 z&+9b5-P6!nhUPcn(Un%Lv-Pd>1=XkJuu1q7uW_FzPw{F`O6Xd?N>_W*Lf86Hy6W9l zMSffo4hdcRo0gZBe^%&Oul}{1b3)hpQ-1A_cYFG|zw(nbe~CUT^{@LOT>mViPw2aa z->?64y)AEl!kH4jJ!+T08jX4O==i4P{fN;0|36jBd!O=q@1GRIGuQwAD)y*dc`09o ztHlRIPR^?jwZCrE_7~mH*7lieu=c5cNDHj(Bqn@1zg7Jmg4g;{yy}Y!UHg;jqexJn z@@YAC3!maOK1J{)&!4EiKIQA3@<%K)GmE}0!sq92Q1CI4=eLJpq3d@9HGid9^o

tNqnE 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 z
qr23Y8Z`Gae*$w;nkj%g;ZI|S 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 literal 0 HcmV?d00001 diff --git a/dependencies/windows/dll/boost_date_time-vc141-mt-x64-1_70.dll b/dependencies/windows/dll/boost_date_time-vc141-mt-x64-1_70.dll new file mode 100644 index 0000000000000000000000000000000000000000..3473c5b70fce54122db0fcf03253154c4293e407 GIT binary patch literal 55296 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 %kPFoZ;IOQdu1B*qwZBs;?(cu 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

}RpFnxf|n#X<(G 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

pn9Ww*E2G+wtEH!J(v3~JO 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⋘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

x}ECS%Nb@!}UsVR)^t+ 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�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

H zC+9DM;o|yg!-DD`=QRcnA?mh8)!+>)un^@`r$3eDp=yS4iXGtK$3Qq+ghWOV>(F#@ z_5-6NZ9HU3-?{f|6<0e$C^gLlRNzN5|L*rDFY11+BK(&ii%SjvyVB%E;lGG~m6%ow z-T#z8-gNLJf52g!fmp|ga_`Y&uE?w7Y^@dG%(mv?oT~7AwpH~46XEd@=iJ4yl0`#T z2Q|d&h9w_1#f9f%b$Yy7bxmrxhs(nwgb1exM)*H2elZ4 zD339e=PC;RBk!3GFZkg$y8%ADfasi^EnH{ncH7G9reldsRbN)#ny)`FaY#t18hGjb zUSTBQagB=l=y(8k%6ObK`pSIWK?Ugz9upAfs}m@?lSb`XcsS6^_P?zBI5(0m4}lEj zm^JVzCFR!jk)jp!j?v1M4@+@0i&U6 zD+t1Bz19kg_6v{zU{D`agBEOsTv$5c&KJ|bWh|}-!+gEIK*F!%;vf%K?%)CiSisx3 z&Bt!Q;s-Y&crZEg3jHNeya5|03->m-*y8xD8lt;fu%(ARehr-{YCoJS0y_$Dc?k@Z z8WHY%Xa!Zf1@kHN0uBL1<#ELe?su)@4wWXof5^h6OBeyO*{s9ZrXFeSWh6hqqBK5V zo_h*q&ZpUx)2f@p6N`NTJ+t=Ft?7KLXKEtl@gIqg`M{+QEfnx_7C-IH({m#M6)40K zrYW1d?y@6)XS<#&!{BS`p6ilFm0F~w+r_!4W<1jR?YS{>d5ASp>z6yk^9oODev~(u z^YSM3Vaa?9XgPa@x#xsxHZDM4J$JjlV~3#BY|-DGkjqas`|J4^a}2j)9h+~$AX5Jl zHrHwe@%_I3d0wNB*VdW6k+=iES9# zxVxfeyvfKLFHL_+Y)j{#L=x#Uw6Dardv2OYZ(=wpvj66_7i1W=DQcE6)&gO9@HOLE zVw*lUzT!zcL;FgoAr?2u746%7`F1Jvk-Lb`7`%0Ex|k4pHTX~OKlAJ}=57+5plK0m zX;bzAFeIg9f*c`OF`mG0LLP`sqvjsCG%d}}4@;;Wmqrosx-6HJJpAeSd9m7a$w-%t zN2+SS)Gt??Fn(!4w+;7YD9Nk1Xd1WV+PInCz;)}@!gx5QXwN8P^h9;NoN}VQDRz7AUq~c4ZPg*!7RC{J!9pLAl1Fxd8FxI z3AQoYd0)eBxd>L}+f^9oRegAR!#CeXe6MC;)O}MMKT7gL81}+LJFpOQ%4oSE?m@#L zS1W4b()uPYoY(QQv3(>C_;9)y8t@LcjH-bE3t+IdpoNGF4a+XPuiQm`-0&U-HN+?L z%rG$F=xrj>L(8s5u3ZSf+C=Cq)3d6G_Z1;3MGI$c2rS^&BhPNann-tEC+U&xkHC+( z_&Y%rDSICMp$1<sw1hb}l1^si%TdX0 z7r8^=O5ElpbAFUXeGb3=PDbehRszL5$U}B^U{sr-Y@Wh6w;;WlWP^gaz!m~c|I+e7 z?tU@bolCjPr3fNtH>Q*q!HrV;u`EJT3$Fs-ae2*pTVh#T5Yt!l>%#UGFWaXlNl`2o zdHBfa`zG+3;_S2USN-B;e|?(v&&wamE#QS*qq;n%kq{vj<460yVE%DQqhx-jl8?`L z{;~NmRy{0hK9mq+$NHO6jVRea4gV`47Eg&34WFYrjD!|qtkTfrcQ%;nL)yz1=Rdl$ z%^*ZG2>-W2%+fx-$)_!iniT0+-tDzT_hr`DV@OK8C1lhA)lX5)!J0qtbIRm$MCX_;r3Lh+k6Vd^c z*_8F2@AQKH`JrZzcSfCVXCy;k-~0^_LSiAZjev{SNBJiB!C zl8HaO{1)ZXfs~&${J#X6r_(oq!iNaA9F7uH?{_*g`CHsb~baIPA}@?Ka}HQ9_50GHRlc|2MM>W`!H^h zVje8A1uFdIbw!y!?uG0Zny+a02FD_klHwv6j3~=-e9NV#%?C6AYm6;5+%q8}Gva1| zOg&;Oa;sCeCrME;a}~?XX8{ra!m}Q6dPzdz0;oc?HG0s(s1&%f#yf?*vhduWncbigDBc+k7e zn(JCE__#t{Zo1W`T^Rq^f;PJehZ=gp1J*bM5op*=xT4^^)U|59RzDvzRfls~hbpMk z5}l6ys>VOFT8(S(^boHNB9OBc4u>ve6iuzMJg8VSHRGAkd(*o>W`J2*-*Kuot{oh0 z7_vZ}J40P>7I8NTtwV6Heh{{CI3{)Z8hpg_yVU#}cWAyLid!}2$eQ-C@zTf>CCK>n ze1kl0o{E0s{k*1qC8p`=OMpn4VzL@D&A&Fu&y^rfJd%umU9_*NdY@by5)bXg#aY2=;V#YfaVYkR@#ea2Sr)BqY z@#ia|V3&X@w@4+R7t0&@@rvhd%^3R=ct6ciH1QrspRuqT8_DoJ%=UJvc-Wc!Os5B( zUMFy%J2}_!L#KZp(rsEmOKfXY?E!rh?`KMYiTjli;`6pOiuUOCGjp^+O((?_D$8Z? zFY)enF%Z{%39h`MIeH8!Uh0x!jYPr;2KCvvy;Z*gv6#h5#U}iykUVAk7 zpP>bSqM|o#SJe44{9sZmFX^0iN(HYJKTuRV3t|=Ub@-eDBJCOfr>;NC4=#r8AfFH9 z)K`ig+2qlHnFVh-?a|$drBG@7rj?Nxb>I=<=3ky;N zZGlOx9r`W|UFb!(K7!Ifhi7Ty&q(g(j4p16?M|QG8Vdd8D8=pc^a*-$_Tgv`yM~j_ zNt|K~5FwQBY>u_)-88{=A4c%)lOr4y4!8S*5d{!+&anE0j<79Wr7+GL5EmPt*3jWt zUt6PQ3Byfy5C+cn2xlf>1pQtQ`_c}a6BY~(F5MH*_%{5!+ZnlDH*}~N103LxlFIRr z$#KP}zd7jl`WzdS(IKyc4s{^m>ocYh4{{WXPaS%?)B?nsl(vjznyiFskLmST1c!{y z&uq8vJhr~JVbxIW8vbaSENSt?rpZ3E*g3Y@-dm;qZsX0WoXkj7^I<-E7wlh{YRTn=V^Gp^c&;E`ZlLY&mfq#nmaFVVBxr{QklqxZw zTrH=o4qQ*Wp0H)4zO?lt)&C-5oB;<@RXH~vRP$5HbGRwguhZjK*TrcsZc=SPl7zFA z56?~C_6qMGMJPXnGQ@?WEyO^q;@YgJ?i&Uq!2n`rqg5zR);(N(2kFy7c;u?ltXYkQ zg)4CpJKeDB2+dw3kK(G<2p3)&kb#>G9AQI}Z9+oD6||ApFbti&R4fl85+b}+arta3 zY~oTgTyyN>CQvV`g`wB-8-?)<5!g9$&9K&hI~9!rZ}_dSVZh}ISLx#ZQ>}lM#DBw! zEIYt?xm6EboS<8{xYn)W`iz!o;RfBpc#K}ltm58b5Ao_fgsZQ&>V_A1wQ3XLD5F;K z{i7zl&~R~a)5ayHEqZIPfk2Ke(`_|s*kwe8;|H%`uN8O}{OMY-R%_He#IiJTnK3T( zZGni2#?M3%gxrrP!9<7yX}Y)ow;8#9!)vy1nQ~G28sd1`&1%Cp>b1I6w{5S5$eJeN zdE#OY1g0!1-*9o|ZxeeN5Bn$FxQttCgQgkQgV3s1n|@*YJ)Z{Gc0&($-{Rh8*M(c3 zi94XF6(8<^ErjpmzE%^#IPHetsMisav|7g{wv7mwE|(g3 zbmNL6EUG3!Byw(p)9L%$PGU1FtdCL~D8;)JG~NCt3vUQy`6CAhILvrYQLPer+Wpf+ z{d5l;AJM7mQoW;HQLQie`?I7_5O2K~xnoxlN7)VQ#14FUjb$sl*cI!9>q`^AX^qGO zS-MV}Qnv5BpN4;JgDFLnRB#E-uWz66r#h-jaLg%RmH(D8{zW?wwuHs3S*aD>T^>76 zgG=(+OB~O}}Xv1~d_x{SSJZcb=6LIhoR|sH^eLN1j?KG-tUOo*oKUOQ}w8RQOtU ze^1r0k%XZ>d^@FWyH!)^50`<3wNubNFlZ`t%(*{eBa?SPv6!(h4M9Kdi{Y2k_jiF~ zKOGhd#yt-ol7HYPw}uy*E!#j;rmEjCpo#OKJgkOw!>pUy`(tH!=!~e7s0(8N+ilh@ zKWrjQRNXS8mRk+I!t%Ix#ckpS9J2`_rq0d8nDz_d&qi0qN%R}XAHfna&gcjK_ zysFhej4IqC6WC~nWoh+K%jO5C^M(4E*quCtTmXM7O=t8>rA%K+SBU8=`;kYVh>nrb zcdhOXU~|yzz^RlOAxL9xdOZp=t`sH*8@R7;D{OD~hn)*7r!=ifNfIhulIk68<8I?y zv37DRhH~Z#_kVk7Y)DOulLi-tf)*Bp??uQfnjU1ScOmpKe|zV^`2y&BG3{T5Y?Rh$ zl_9@NWBwH5Vj7m4>^HS@O8%ahhH844)wXIZ*9vdQ6xzQ%|q>6zl zW|w+hqDoU9sesO2UW*Q}3T`~-^G_WmX=&RJn^|V^nZTHw#=Lnf#=v~%o2vH9@k%tG z%HmQ+)V7z4oIkP??u4m84-#)7tFbqZosl9&ol%zqqHGlWB=!XG84eR^)ZnBBp6R8;LQ zrsqp*|5ALKKW~4FAt;FgU{&}9moBglC~B|tq-4akQCy#{b?Wvd)+?+g-cCd<>Bm0f z2l%c*JhX!CjhZ1bpsX*B55Vgh*UjPwl&qOUP}NU;Aee)II3gUyfKob0i3gdg%5M+)KD=QQ;rQCTruakp%#qfmswdM9 z&50#%iK;yGP&dU(veL034x_JxUtE5S%3}DS+4G@$mU)_-79=a9rbuj-!UJ0tb;wY) zLu?^pbn@SPzUbUkClL>|{8~`|GXIV_fGnxOT=$`^! zduC9I`hkS;!cy$kFwUF6Lmc=-U4L>NN#mT&&&-&u?v(+>HZXk7)({cK+#Ujq!T-Ap zufDeU>_C)>@G{ko{ErhutY~iv-wEa6OgLB6ufTT#3VKXkGt+(2<6K>T3g2;6kR$PFxcs$GV1umgZ*o42Wma0CFn=;mADb5Gt5gfik3+XlOqA3F z5xvmVmyZ88|F(tUDyRQxcqgf4ec)_{U25Gg2Mb}6n0AuJ9HV~>l@}TcNSc1#6z?yb zqiMvJEeG16;Vs+F(KPtXI)UYzgRwfK=e?z36X<` zRNeoC#+2$OFSS7{Z2y>lwyB7eBjF~hVt=afk44Sq+c#V@*8H5@9qj>1P%4aobRGme0_>5@A9p)6Xg^c5#!G z7<5JdsQiYdXVmHKxHM7+mE{gXfr(Qd=P+$~Ec)!-yVh7cO;7JR&QMZ&o2H52BPU=M zbDX(i^#?QFrm1Of`TK3|?=H-FJB_CQn(;b4A)QPNAB|VZulAskh8gLf&b`MOx1Y^4 zmh0*DSJ0rQKk4zDXkiYCUcy~2HS~4KFf-y(KE5>LKY=*K^aVvQ0cj#{dc0VS8tnw1 z^}h8i>7`+!&!y-i_ddKVhzAx5O3_Tt4S5>;Y3Sv&b9911I7h(`7+=ti{sLKoroCx? z;2h0k0QYMjc6Yq!retEk#+R=u_B=BT<=XIK&!<9wkmNFq3Hv?1!8$xKdCSh<-0{4W z`#A4tEBPA+G@*}>?0I4=Rl8ATeK~W*If@(9vjQF4>CQkWSs2)QRe(+YQf!-FCNshMGy! zB=tS9!%~bl?O&{4DhCgHiUq;r_h&$#e&Hgb`i@+1H*~WgW?_+fKJP?1feSk7MfjMh zeR1`#Ja+mm6O-nHBWX%aOoyVLK+o;B>PJ%de*u zi<^d{+r7mJ=Iz7w1AxYH^BQ#C> z$KykfJ9ZE;wGEew)6<0BNso)9>LPeCzk??xRhrLwJU)W^anAgS`$ypkJ-y`Yb3)D- zgl5p7>A#9zq#1UJFi9$XS_ZHffEnPI2=la5_$9(rso>LrO&B^X@z6Y}GMxdxCBk^A z`Zv}19&vGyv`O#N0a|u?9he@=ki?^%ZD=-Qjds-xEd+)Os<>4Rk;y{WLOd}ytoxoD z!bg(^b>omBf(Bva?sP{Y78k90*2-dUvTUzrz-NiDYIEZ=Z@!iY3%6AGCBoXN;6GsI zONp?5s{Umui!($GeU+ataC@$W2zlt*p4+G){$Sm!`yrxPBFwtq2x$` zcZ%_u0$+Iwv6P~t9Ii@Nw>&&a2D&hO6U!Xk*H1$BxcH&G^Og@>suj|518U394zYO5V%oue;7Kk{a{a%PtiMdma`A zP7OIAtw8&>IH3@~dLnnHAh+x+z%Tq@W^F4gZPxB|q;3>!AiH z4)ga;ikXa+Y3x#xY%YeXhPQdq>);Nxd7ay|^MTdhTyp)b<<@Ul%dJ1ge-Yc(JG+&` z|FY_r_+L`}G5(iOzjD8uzuqTV=yV6xRQkU(!;Tg$c3S${b^IxI+Y{o->?6dtsZ39l zzFe{xL2CZG2>cY0{lva~fiyN1Y=*tu@U}TZWSo#`<25PiS=uX<2y2c;@Z+S6&UVtpP(u%~e1s4+@Y2;?3OsqnQe2;O-;{p7 z%8-cZ$PAtBOmGHieKO5{SVU2AeLvi$SGi9c5Q4+h^l$q8NRoRletY?CsR7GfffkQL z&Sz8iB2ULl=%(N@y-ePNotn(!nZD5LtsfZIm}D2~Osf?;%m)@dMX-uum$7qC&diF> zH`mk|F!O;P?%a=)efn8WXFC74i{mq^3hDCNz!*@j1$5pC#X{DF%k<&~2>FU=N@v?V z`~jCGA0TVPtaEQh+R?8I4;+58yKBKB256RbKrC3t1NZ}@`p|=I}w`fo%^t)yHJXNJw{P`41^jp*4c)e(gXxwEraGLs5_>=m? z64!(|N2QnI4E2||#%xL_%LId%p*8VB`I-j%?zQq)Zv>{^Nmr-u_KALvG_dqdy~;=pz9cd=L?j{K(smG zb9DX7>r9Djhb}ez?@E&wg@3R)<@wu`{C28&t>qt@i}q$?mU?+!wSMh-e-jq{GBg4|R<0S%yr*`a`_Ag+3@;0FpvhM_{>H5ED zTBJjEsrFaf+X7mgqCZmpF0q~_HVlH!WikW263lpNc&YhyF7(*}d-kN?345c#MdiVJ z_DV!d$*~m$esI%hX)-WHMSQrD|K*rd;f=>X-|qLjZGX@o4!67RNM0l>)BN0U zbakzIAu<}Zs^6;SltXtS8gD)ps3M~k)dSzOP0RJIsM@eYH?nJCh^waEsNSM3&Sheq z)1E2X8N;#RL~S(vs^2sMR2&$g@3!i8=oyC9w3=1GQI)6i7L{y-b?oM7v`xK?xBETZ zL`HwnkUVi5-c0m1NvASZwJ*t^Rra{kK};_S8h9#xD(7PfG)*@@WW{FF@)|*-WrmR# zdA8B;0=Lm}T^sjt%LlQWEx*}x?M4)YwvPVd_Pf4eTP@qO1Kg2Wx4mj$*U_4~ z<+&~2vuWsz-2O+Q2Sjbl%zZHh5LRS3%3N$2 zUwJm3iW)v3>k*QG+@6S^sp4|FD)EW=y5H^jVHf<7#&7PQ4SV~+uIc5CW3JY)8yMlB zin~#pVdMuOu*eKt(+_;VX1gJJt2V5UVbeeI<}Vfn1XhuzZkh0q^8Lv^?hIhRV2K;`N)KPnD&VG_TDWueg5L z6HZIbDIf~`(e-J+I-Yo0WGSLlCZe1!fU=6hT~^zTc6!rZ(ks7g57TiV#x$dS{n)#GN?^DLIP4lQ?8qLOKFG-_dfta6@cQNJkFGGKM@t7YNeO?ST zDA&UrdMG_Nr-{HJsith@bp0!)txKB!<cySBY(v#7h?ZhM7gc4E-;$EnI5< zOKfZ7{%eGC;3bO)Mh!}ST{Ir8;%$0Sdv=w6OQNCZ z)=l3Ip*^Ywp5Jt#FZErjMQD$~%?-~qEU)Pq^{QK|LN(MdBhSNCV=d2)8n)?D9oItP zHCv6KUI#$WGg_A0@XVUw`%Nf=TTP>7vJ1`@**_x+O(Vd7H|woxSgnOkH}dVsG6K`9 z2TTW5)ITb3=ABQMAhYyVx75WBOSKQ!l_oFhe7Xq#CD_EJhW}k@@}lrxw0@T$rs>WP z3gq1q$eRwHTyGFv*KNAhs2K$={^5iII$S7m8;u}r;W|d$dJ&hmt-xxu8kS`>j7B{Q z>vfzrKy_|}whc|VuDrvv-NSHj4z~isPnKOTDc75fnp&~G(D^ZWUd2@BNqw)ZFs+(U z)VGmnPOPyGFF>t~`fc7t~|IxMd+Xxe-cFT?86B7l!6!EJP z(_A+IlSHe5AM5{f&UdpjBA#oh8Jd|T8hClzviO`NWRY1e9jVb@wstJ-Qrh3C_?(6R!rS+6&| z`v1?}yTHj<{{R2io)4j^w%t_@Q;99A!7jTF8Rf8vx+`fDnPpd-<5Wv3has}$aAUEB znrdTn$Oxgxh$4p?S*MUuV$;gxP%GsBe9v6@{y!b??f3b7e}~8C@p?R8U7zc|uJ`r6 z4);Cx4C<#hYLMDJJw3erlsaEbE*7TB2~Vz{LAzG_xv|zwsITTa(krb^xzK37oYXhax&7>a`}YFt+TrTS0hQLSNGF7IRHk{;cAHfoq_Ygj*dmye)wNM z9$k22{CAi9VVPX&6O-+qePFu0-hV#~;9unX&!49*`tMo)&8Ncu%Tsh&pRX?V2X+3@ z=kedC?@wpIWn}YD*Zj|}xJz{Z`;z;&t+zk*_kVqg{w+)HFY18nY+tv;=jGx|M&xv%X%U8&!YK#@&7x{+slpM|M8UmTQeeW)t?Tvf6)JBycWIC|NrtK_z&W{jMu&w;`>kJr}3pYC!D3d8*b6w2hVA*l8GM$=WZ zwRgbr+M95d_Fi~Y`v9z7O~(&AXm7wF+PmNa?LBax_I_Box{e<<*WM2MYVU-zw0FZT z+WX)+?NtrpN5S}ESM42ey!IwsrM(v()jj~L*VOUD4%!=Vi1seHKzk3|r@bFmw(9s{ zbM5W0ul7zjOM5rmqP-8E(_Y;`{3sYd?5e#3j@RCVtF-sRquK{x^&55ku!Hsn9HPAo zF3{cs_i68kQ8(#pVF&FEI7E9FT%f%N?$h26E7#Ivht0LO!@k-(;VkXlaEtancusqD zGh;`=vBR#~JK%WjO}I*XFFdM!09LQ9MZT7(EHD?zd^zC`?fuZaTPe$E?yWGhl~Q>H%okjN%1q`I8m;Mf9OZCz z8>O1jmlvKw60>Tn)YT~crNkhe_(JLnpF$;g7hHc2_jJ4uwrNLSwC{v7(1uBgL4Mwz z@!*AJs2m@FHSQ-4ycM1_lsb!74=Af` zt&b=bOSugmLdnDsfVCb~YS*ij!yixUSZZv~P#I(XJx$3|DnkO6AigJc1;* zmdBNvk4(xv@OvcX0obb>^~Vq!jBqIB8%lk+8X2Q#2R@O_JU&Mqcmib(B8KitJ&J;R z4VL#%D)2mQ!gq4%YdU?wV@T>)dn(lpiFd(Ykz)kyJfTz?l5#uDMlQS)j?YudPi!Wf zazk?9Yj0Rh#z)Ca;*c-MRKhNKK2~rW$X^P8)b=qfw7|i^BaKG28XV-!gtU( z)}#++4Pl+XPJP%PN&CXLQJ(>cLC(Xw@E&;OP~8qJN4{CK53hBF+O)#9sD%0k?1rRG z;Z&5&9udw!_3&=!m2&1(c*StqWSj2DR$FMJTK#0w{(&3HFlj*3`&Uf5wIagtjDPC+s*H~dX|HHti= zUF6&fJBa6;G2oL(#wdIp)xrxuKKha+9iF#HlvlQ^a381A(=Z%0qrBt zvy{XBNaAtA0+fR{;ovc$`Yw0^NgXwoGXb4_k$Hzb$B_rtsuO;Lr2PQAWxP^@*t2%{ z6q0LQ@Z$-bQIlCeFli!dj4@haIz4JTewbpAG~>%juSqBq`m{XQGmT8 z+@#BW@Qn8AHKkIKv}uQDkeu7)2pN6s!XawRgkWXb|^P;YY}Y z7oJ2#cwwbCxKH4PH=>nz8_Yq{rW4LUG8W-hl*d{X?nHy}e%S0yr4)PC4rd^_)(tlz zxmMWZEzTX*gRl)M#T#%U+RNTI;YQ>oS3daB+nh6e*!04BbMWj(8+;R$u?O8H+_UC! zb`7Hr44WV7*8=m9>?s#qs>{9bQ&ciBG06RR4_kFXfU?cmQSLE$@*l zB>6O;6BXgT@N2Z3JteHUnE3I+JJ4Rd4W33z*lTJDYX+rLE?l;hzVO17WlD9y3-3Zs zyzpVilo;e%d>_1U=!fhXyzmp`#tSzi z4_>$(ZNU5C%vIc1+~gCs|A;PW-vi@UbAHmV2ln(b2h6(@u3y7?ppFk#Ud!HLomgPa zb&QufR(LCtyqRzf+92}?Cw|JhB|j$YxSstynDN578+d+TJ$v9SpRvYh(*^gU;QYe7 zHio9#tDoI9zq2#lmG2X-HD{!4re0i*A1`Q5%N|z9Tju72nXzBzvG2dkq_^N zb#~MDtE?Y5;Vb5pauX))Q7Qp1T!m8b!fmJ-UicMij~DuNxiE4c|4q3CKJ+!`A!BjC zv-@d>dAImEW0Ayfz(SP5T)W{OUG9h1AJAimk7@6MQ@-Vyifi3)|99jB?}s%G>H4ty zVb&h`bi(RotQou&wnJ`mWxxq2xK7|U?fvkk??dG___X#exLW%FyyHmd`OpSm`+;@H z-f_djNX8O?x0G}5W9&Bg-cinw>8u&p>Nt6xN(^v13XUBf);<6mp9q!PVcS#8S0VM` z%SiHO!cE%y;9Ea)=J1^9fj=Or6M%Jp33(gLL$aQoaEkUG_zRL4RE1KDPm?RoH!tk) zYv^1x;M_ChjdkLI@0_De@o>a%jEnVb!h6mWr+kisg(x^Kcu@NQOjTjQayuM~Bu*E+ zCOk~p7^4-|jtEl)cpK~#h38qw0r$s-DKG2a56_|s)|jwLT$qaFJ|Z;Y!&EX}_%O2J zg^wdUUf3HMcqc4CK5}Bh&ymFAgZ;0d9nKjid>2W%2VPq_EV#C<@EMd&-dwP-N?7o- zn;V8*Nxzg^;9(2(`OFo7fvdxm$>$Vd-D^T^+F$^cNja>RKy1V#d=Sm#d=O?K58eSy zBz1(JqhQRi%C#YHfj1)`&z!=1vm>vnJe$WPbf{e$|k-To@ zYGJArFZ>Xl#Cu`w8ln8#;1HBW9$YZKCjGui&fy?b@J3>gJMnJ3u!oht@J_fJ$+dp? z6Owa4-9T(Nl9RWH2lha_xHk!Bql0+idQ^e;!4WsnFKwD|8%iMtp`{jUK;nUIQ7gQ# zgZ9EsD2s9re64nvYDPOAcowb03$L$39`M3ps0=R*OCe6K6~>?h=?l8*(I)W=OHeHJ zg+C(;UU!_26@P>dXT-0WRDndvi5FR<)P3yV1Yxmcfnd6L-lR2Mkm%A z?O5U3N66b;&hxA=b^l|mTf70U=)(LmUp9Czk~j_6TYD#bS$h-C)7}F+c4h6+z5~AW zI5}ZX{qQFwd)d-0OdaS!PUf(F;61sVcO|qB?|y>%;^7n|_1$pDljNVdcEN;RoLAgm ztnl`MoPn$j8@vw%=k3rv!UKoR=KMd&oWlF(5dUw)0Be>|j<>?Y z@31~Uq#fv(OHT2^AxJ)R36G+5e`1ho9{I!z??dUtX}~GS9?pAsm^h!jS4vV=*blj> zcb5I+WMCG;g`qx|18WAOgY6o zRv~6M;%DMKOl32E#ggb5sR~yKuA0EGv{yrzpo5Iz%DEPbq zht{ILml)t`6g*d9{LS?H3^Bw0NXkt(xOTV-tfD^5s6z~RJA6w#x$?joDdE9;q7}AB za;*Vf$RXFlYPW_%yr2P%KMSE0h`rhZeqv- z+>27A5xa1xR>h2`Q`CIu3?<-&TTm^$5AHy6t+497}#pys$Z1hquEvNUjx*K?U58 zgsYJoFWiZi;DtxgI(z{BjO1Ej#{J6|Uec70Q1zE;rnX@;;(I%zuothJ4IH><2?ZAU5_;~?3yVEA;gRo5w{j$dm*rq3IHJay1xH>Of zrLa%E@cmxwowImo@5A0_9|;@vBcJRGJ4|%aK5N?w6Q2%O$*f5$bU#Cz<-`vM4j|8` zIL8KZwxGc`B`M1b;i};f_Tz5aggenVa_)x_F4|v3eb{gWYm%|s;ma?vAIX&oKS7co zAB-9u@)nqgN+xnn!aGnAeF<}s2QSP=>+r&Hs1$F)GWlVETBHQ61GNr z@xqQMfEV^biuVvnBAvY*^{=-E`-lcfquSlLB z)Yx!UA4$0ZhoWG8xJZ|K;fj};3!cxtaN;=D1J45{+=!$dA3TeSq|Nc+stJ;E15QA} zJq4F(?}a}h=~qn%R}Uen)C(@k%RqZE#!WIx9H>zNkP6gHC$EVJ}&$YrQn6-C><|6g$%r!#vVrw z_K0vb%Et>2p#ppWCKb^>YtIX>dxcz)Hz(YPHiUDw!zQmX7UFlouTY7U!zMGxvwSX_ z$+HT|316R0znj@R@N*QL zFSxFRb@BmgY##Tl`JuIHgRK{YyaB&JF7}8I-t#UwUqN5+;f1urvzY_dSVUjdi3fg) z?7OHBH@wGssL33`fs4rxKH$Me7rTd~6G2 z+(J1_^078HGNmNz?Lf~q>JWpl-*$3HzfO357tar$k-lt6y-o2N0Y14qeAV1}5U$|O~oRoXvtNYofwBv?t{LD4|8gTCc@B%koX6O3gWdk}6%wo>AU zDJMg5+F%xvJ??<>Q3YqI2lfk#;D<=$9G*lQ_zbARBUF=!2vvl)!*$4s_rZ>l5z3Bt z!1hsGi#K4U=m_N{ehYjwCPFP||2p7&R6zV5m>3tK0#?==%tR@yD+4Z1ics!#>^r#c z#t4uvUSJ@*}GWSO-T!WlEEBfG5 zEy)S@M;E-|t_WrFdCCU2A}`OtemMN@2<71U(1i6{F)lt&*hO8W35(j}lURGO;e+H3Z@{4_c;>_U4@IbS#$tzWbtKPnuEMQZl#@e0T0P5o*WN@$G1K|Y=E4V1;6^1%3k%zM5(+eD~gNPbJ{f?JV;_34MHgIEvp3C&3LB-e?V@00M2`v`0*b2{&@17!P=e>q0Xc9bk3iN5vnH2 zx;rVzCip&hVKtLH;DxEE5HDPTit%1pWfFCoa~8pe(DFN3=Wqw|wPfwV+b5F;>e%2j z$l8K?I{X}!QSO7+Od+>iYlZhB`Ms`i=v3k-W?>PEZ9@ET=XAzM{C>FVRobWA3+K#W zPo*+mc;{=h$=L1iK{s`1#{r*ylR6RuoLtO)VJvPKn8SJ1fV@HbJkBw^(0rGxmMzb4L>2DcX2J;ww^sn9X~AI$k|0a9(eZ_;-=hyuYAs$vk?Pq;3J+} zD2JI_(am_6^(AWn?|{{|v6gNk2DlO>+lc{oDW!fZ>cF$eMQ+u0_RcPHejD+_Cs3CZ z)*dvG{BBUV2Nlq-@D!Sf7sl@|>7b!nWunUf2~yGS?2+6Unv0cTgVdP`Dqt@WNkEAzoPdYvRCLU?P%hg^!|= z)=5E5#C!3=Ij9sbT!jwez3?QGGfM4e-jR4a%-7xp-#~JPcwlco`pYW+M4*hVTPqV?7AhqW1Uz zYpLRZx#Quv#qblXELfh>uhOuC>AqRU(yF+J_CVA|A@^up5$jcfhc#iJy72z@yhh zDkpn30M8{5hwRyFBh@05LSJ6kKPgiAZ)Psw?aA~d^A0;#r4F$<;Hc~93va@;sF?Fa zc*FIPYB^rm7;VN2o1?vWJ3NX^ys8$d8X@`IDjb1oab5{uMa}TS*O7sDLsxa?fNO=# zYDB7JX%j}@7|Cxd$O+tBD^l%ZEIv5==17%=H{m=aIq|@qD8RMCI<=V#+81V^1iT%t zN{LiuZOI92d<%KQ8*n(1nBA~)UD|I$ZsFkDnQy!cmfsPnPO{$v@R0_z-+{cr^{LEh zdt!sr)0lU>8$Qt}Qf0Oy=dc2K?jt{qsf!G*HK9F&@l!`QqA5Adq#S;Zg8KzlX%_Mp z*h+f?j{Lp6d8BH3Cvnog9rkX)xM<%A7otqs^uqJnD|@7R6Lq9qwWMui@0t{3JL-4m zS~$Bs<#-S5dq27EPt5QTTGEd^!zT>dq%S92h$>M>c<4da6<(+wA~w7*24&$b@KYqe z@AARYPOJ^u^uuXc%z=|Rf}f*4k0%9LsWUO)g;%4Qcq_aY$(bzt3}sR-`~r2s`{4R6 zw4aBEk9T8?wC{ievZ?jzHm!5Jd`!lk*4k-T}~_9s}|)bYbpPqNp@x#~q5y~!bM z+Tp`}Shu;f3BT<}{P+Mo@Dy|RARZpbXD=9dxa8SLRmgmK;k4)3N7Q%2l`oK=2PlX8 z2NN^b`eDZ*^ozF)ja2i|*GY(I?i$dU!wVIwDlx0r$ShKDnQA`1DxzV-9(PFCn=v3qM01`W2o>8}P!U zm$@D_XOOZ}utdIgRy6o}IAKE5y&5alaa=_RM4rus;3p5R!Mc!t=-^eqq`y z%JIThXeD0Q1#QN=;3Cva);7#~ow;DYJK!ngWUVT9q_QFzi!l5R`sFOLz_*c``X2Z_ zlIMW{-1H{7WsE*}>swq)J02Kc%>I>YVJ~E(-10VKUBEncCg;$)i1~VivjUbbX5V&V zjPRYM{D0K(z^^`Lk5k7Fzg>ralxyMPjnsJ<5AWN;9^_gBKJ*3U)OWzgcT@ft9%g;T zet!rL=OHWJ1CJxQ52`&pZ|o(X50ESP(>~%S=jv^0%Q{p1!ed<~W1 z-LR#fX9MQcfIlIhRp<_nQp;V$3BQVnQu)KU7H*A>;?L;eVR2lP+C{ks zj;R!-GO2IEQ^-1y_A7H8s-V6LMpwa;e+!(CT%)-bw!bopKO;sCVL8ehK_1{ZOO)~s zp-ou%Dq@psVIq>fFMJevxK=n3ZNLlXpuKqEDpZd5!cUQ0D~!9E_zRMPY=IBpg^!>} zawzPJ67Wtq5XrT|705G+@15Z>v;i-SxrTo6!s@6TZ-upyTq}GMrI0t_>&T85E<+vh z!YwEV?}L#EQNi=X0$XWsz>(UUaGmx(IQ!ZtRYcxA@F0@2C;&$$MR6Y^pRm()%ojOv zz)sc3Ib(OgCN-i|*+|w;%_ueA8l_^HI}>`4s;f+zslywN3 z-bDM%uN|I7cH&XBn4_DcRJybYk07tC)!I>NEJ~risuQJV)TO@{SbK0!BjSIK^#(^Y zWv#HTOc>TYia)!-9)XKc3DZW5nK$)h}dBMy_7%88isx(`4o=2kA5c;54`OGayW(huye;KRS)lgUm0gZ5$G7T-r9>c#}g-(do?7A_pYIGH(W2C`4w7*MyWn{;p509^A1ap zJP&x_G3^5|ZdfQb;q%BKe&Gs~gZIMiNa7dPaIv0gQ`i+1OZ#vyvf=H+*^elPwd#e5 zBSLXnVGkr@bi(zz+y~pd$T>rO1AdG)o2)n3dL(Ot`Ud<&dmkJ-inID<_677KX;b*{ zORO=<9dH^NOgmoqv-Za5DD@JOavzK?2ze{)q`d>$#zd)7=2Z9wT8H<*^s%9G15QB_ zn;W)#nekFbct0A17k+}q;f32!FVp^FHj#S}^CiqerFda6D#HukK^*=;uE1OHUbx>3oguDCoV`ds;|q7866y%g zqLp~-WX6kRUkHaFH*+U6(Gt9HK9V&fjGw|DpSrHZw}yFpGN(?c3lpXdJn9!5K*6 zRIf#;pOAM3_oLTYdv4-+o&5zzy-E2j@(ddka~8cuIc)tl=MLV0J!eO$Lc9|`KZm)Q zO8YRbg#E=m#R5&_pdBB){hd(1HaJOpFYG%vG%hD>IWM$M3}{;ry1xkDU&Ok4g|!4H zzRwvxjo4t5Wua^Bu-b|!Rf%#d{Q85?wSKs375x^GXL#1jz9vq!CQ79u$%7pZ&|ZB^ zK2h+`2*APX*zd10F4*T&+MLdKVZvtOq1*~*Ze@&=yJ6;bM4Se!wwpC9@xZJ0us&zv zh5N`MUKqBYJwpC1@CPKH3j%P9KjeL|@F0B?zZ*IaGpDpE9E~J?6VB1z1J`Ts6MoOU zGG1ZQ59G9v7+_gB=Ndi$Up~sY&7UbS;c>K*xl=zzsqRR;6HW+ljhmdqg~wUXZ*pG2 z!$|h2@QoAXfpXy@l#ds-uHd;4Z@}TmiWgS-m34&|jz>Z_|RSP8E4(|(#R?Delz}WC;Wx-qECRE0n_rY5t zqSY?E4UW;?grlOP`Lj{P2DimV^XI3C2UdxT4!*Mz=EO(yXV;U0?1eAEJK<|6WiG$l zfn`@j^XEH~g8UJmg%7}r%F)WXfU#7GRxe*ez4`P7D_12>$}R9{4X(upU{0-Q{!9by z!~M5JD?8o~d*2bwpQWN4o=&Aryh@8!FE%0`t~KGb^k|j*4r>XnL9%{)u&7D2%A8F( zjA|OKti|*THzEt(2hX8Cj7v3(Rzr|n>w=B%A}1xRXSg3p&iyc>6*;F(JKTmg(2gGt zYE6H57km{-J8pQgEn}fvWk##%$U)5Bd!p6n9T@Lh!~k=QXjN+-V}xruMXNk==!31g zL@SeW1NKLD>I>JP_IP2nu3V279zlcg!e5Yy7gl~eTDkGUYmf(Tg~>gLXAT~=$zcuQ z4LB{A`ICG?e^1)M3vbF}ym%WN(Th5a%Y;XsV(f1-kFdkj#7TY(c+&v#O#C)Db|7nJ z5%uBy&r!!i9cX!hYw^M=L+DRDoINy}-!aK^S2TY&4fWrX=cQ<_Ag+(^yP$0$3zGJP7*IX zkEBgCHd?hq6?g+qL{e_TuXMQ|s&V9V3G)tLM8P`n>j|vMW#kj?GMPK^Fn?0CvQgg! zPfp=l;!%asYElugQtpP&zQvxEI`FMx=8>_e*~E$FFJ>$-YYutCJK)ZF(Q2H;Fdr_A zR!bO{39EUScWD!jUqs&UCUm^V`oVkPF_b|2!YdXtcX(l=rOX9h_|5xVgBM0E<668h z1-bDy*cQpy4furiPB>M2H(auUxFvpg%?IQHFC6q?v>J&QjzKf=)|HF}715?^RkT{~ zr4Bjt!4{ve9`JVf2$Fss(5=1jQ#4rW!%^!wf0i?L=tsdl4r^`*U2BECkj%9cZbVYY z2h%pPPPo>9tC5s@VTVm2Z@|ggyJ7n+oPqRfz?z>&tBzc2g)P2de(`qLW-I-!qYm7< zjXbYrZNR3bcd%}$Z-MDMiHCAKd}w#HTFJEzxDh2&#|NA4VVoaR z2lhlMt61mo3`(YbwU^wYEH62M8T(jE+z0LO2jr%H0518O{;2PRx9ks%*9M1cZ^CmZ zmioN#QvHx~C4Iqt$SUK4YY)hILO$W6-*BGOuLCYbcDx6EgYrHkSKmgf50Q;FeXzqp zJ-^V@UihB&URdqBP#q_nq`e!iI>i3`fb|B$4~OEnz!9iG#tti$>2lZ<$y&0*w{*D& z9@IVnZ~k8A0j@hjepV1C98k{Ok#jfn|42?K7dAbn+k{T-g(Cy3ZRX2_y?-L-)OW(k z$MLk|hr3R&W{A@dUp>iK$d4QThGZS8Q_-qAl9;Wqy?F9wz#^2%T=-y(pF?Zg3U{1l zJ&=7OG2p73VpPdS z)+Fp)D@Hl+4w!N?@zACX_C~TFh09RUXT0--E75$s@Jr;y`(b_^^24=$*!-3leiKVP zFzQxvPRtf~1`QHlH%5Jc+|>8NxO&7;#GfsKFCsZlB@Of3saD+2VoPGOq@a|s)rX2Ms~cg5E*zkyfPz3EhmQ- zIHG9`e+Liq4o5X(J!^yPqc?I?|FcE=*RIRxxUB z8}jB!R*tr`jpXyV@GQ!IB{|6W%otUGx4`~L>IfGjwK6%#HTVR)58iN3sE#lfSr#M* z`3$}m-UW9dX-8PC9r>bt;jL&s-UcTksUzHm5;i0Uc>te+55Si9hUy4MA^W?@K~BMU z#Jge5_Mx?8g>#U9ZZhAM$EZ6xgvxDj8FEqXg>CN(l^bxU_I~KOpRp|GTG-Yg&*avC zi_qYCTni69$hD)14K9C(bv1=@82d1Jo=Og3ZYN@%k*u6>50Z86hvp;fE1o5U_N ze()&Q4x}BJ(OH+n7212@vyTzqw>&Swu*W$EhSC>&w_A)_a*neCy0cklU$Bj5y()JsJC+WMzl%qZ0mNX)nyqBmT6i$_cOT#XN3F z=I;TBQMLOJ^KRx5M)i|@N<1*jNiM!(y}^>F(N6LSC*;!(>(hii2F9qF<@5`?4`Rj@P*k}|vrC&RYDxmxa`hstdVJ*#PTyXL@%B3CnBTD~} zwE<_3k5QQ$sRL_Ip#C@H3YH+_IOXs+wCe-LH8Dorjoj2X;A?0Q&)hVcsOlf1(^7Ld&Hb_M05T@1-e+vr%9N{lY3!n5Qop3oJp#KFVR6LiXJ@ zVu0@=*IvruZ^%o1H8n;(j>;%^z>kngeJ{+K#u}4y_%m|QubNJMl*zhsz;{sv^*yjk z5%WU11&&4~E66{zy+X{J$rbz@l`>yG*!ETO@Hw%;^~gege9$?AzNjy(GLwBpI~F(^ z*;uP444cKeWnL_BE^=|Uc;Fr+zo8XYanlZY7N(#8oN!JtV| zW!ix^ub`c=)Q7DZS|6jPZDfwfts7R~6nYM^!q>HT!;>iZ=fXDA9x{I5?1Fafh56dMV9w{P zlLnl1@NHy|t*Sh*z{gxyt*T7;F_Lm0-1Q|nxvr}6!|zI&uWD6Q0Iu6X`ETS6HrPoH z0r5AYn4a&;_5UG)?FQf`GEkdzy643gMP_?h-T7|aFR5K)P+TmdBU2vuLUicFV#&$AB)kos(u%Gr$_=ff#ctHCAyx~-+ zz71w;?}Tq??|}!j55Ug9kVEFq0f(Pvo=&lb;aVj9`rybjm+9dOpc1>x5BJ{cvDQQN~hcg?~036 z1$YDYjF08Fw5)&l(iN2BO}ML4ta2Wp9oV!=tXht@!{JxPD!-qxz=Iarr#t{luBHyp z1|E1-Laa*Q-eHBquccq^ttNaVF*f)tJo>&qzM_b=6p9_t7sLbv@++ zxE7{WkL5dBVt~)qk5xt=o;l&N*0i6;I)QE4#HzuQ85gYGHkLov%y{9onY8%@eZhP0 ziB*|ApBS)hyI7UK9S=>E`6_+EUiUI~yc4cKD>>`D@Kk$p%6X_d5YK(o!Q0^)B=4hq zaI`@@b;uzc@E~o5vA^Jej^vF!=z{$_#i~KkCF;$fx&d6o{Xwwb1JVD;BWzWJ_p5$6NE8uIr zV^tY_x#5$2>6>yV%;+DhHeAF0f_?nV6aEkgb`E8$#FhU!3T@zi+OawUr{D?)GNd` zi*d0Y0xc17Ox>#d9ZIn(Yz}jCkoy`O`A)1#rH%eSoWnXFGS_$;T($~NeJ^b5ja6r- zvIgKLRKZ^G!PaYt|2fLx5+wIWFYNYltn%(BeyG;ssV}Uxjy&-B!UmsM&-$d?39~=L zAH&1?8_A(OOTZ1AXp?>IgKamHlj`&Z*K6;CZMW!hxL$i7Z239!!n*|ndcGk3?>PtH zRa=?I3icg*V;g70QK=M%M${rfd}>qj{Z zKfoOIC!etRTfDRhCm&+$`Q#Q>I>OkWrw$xn9;=$+P5AUN_8rd>F1X=1Yxo7m3*R|K z`%c<{1 zJZzD7O|fbwlFy88c+L5cx583X#v1d(b}BAd$ABMe?}NR=Lgh~QjrIXJD?CnZ2qP!3 zW<;EF;H~h^$Ttq zoWkVF_(_ZlmLNOlg9oNp;s0a5+u;UO#985kSyyts$$o)l;yITBaF8WVRSah=aAE@2 zSEGISdNSo5$RRvZm3CsO4?ns-PI>NR&%%1u<5a4T9KzfhdM@CLH_%@b+JSRx(N_;* zgN~cY8}SP*weiF+^ddLsq0m`}m^crG))ZpkJQVs+8RwzUbqk*H3T?O27x4@Gpo((d zJHZX;;QHhsE7grt0le@!6uE&m;UFY+gey@O%7q(|6Yqol>V@V-_#SetNeHE#|vBD9v3{j40!V$A#a1jw0FV%+WX-xHeCmf(cXl;>yyW?$PYY) zlE3D?WrH|10#%fgbNE~;IXO&z;8EmE<$eV7(&E%E?oCd32IWU^<~NE{eNiTLobU%! zB=up}# zFYLPgTvYq=k3G*4`kx6q8vWZE>4ZKP#>>{mz6*okHFUCu#47H$0-(30#bdI9I*!ye_w9#i?#c z+Ht@oDEMw4E_jrD@}ArSkD=ga&(3k`ek9(2%^wTZvBSD%<9QF^(d0(1P9!%z0oU9 z&F;f^kC1;j^C`wv#`{b-A)me|H{r~I#QZ(w@UcOh^LPiW{v7M)5c!1e=c)4@bzrk0 zv~!Sof%Aq^pK=d;W*F-e?}AH^#Oa0Shm)V}oFOCP)O{m4yTVzw@EauGxddRss8D@j zJLKYdOlY7&c{YQK90_*H;?oDtr zDp*Xv@al=7^UVs=Cv$#r54FRQNbP0bVY4ZrG1_6d_Np+Bzl$eS?t%NX_ruClL*-W3 z7|Ga$eNh7A6%Iowc$bt-3(boimj3RiQy)ogop6@+ZkSrc8s-eN!&32b2EzPT*oT~B zE|~Btdy0Fv6)r*PoPl20aR&X$vj;pWo-Jzm)Q-OyMJSY=V@S_}MfamWW?%lCC1_{Q>(_rUlS%(0y9u$Oqo z<%Ani0ps$)TR&irFfJP$i~Ky3nD7Yl@k|nc?LNeFFEHR-WM^Dn_|Qt`n)e|Nc=M`I zzczSEd+SGWsyixTeLA6Kb*PT;C)9`UJCv6*2L*pu4=b-BxBK{A5NwKC;f433EW80n zBmYmVC7AGWoI1OcvjT2JGQU2Ux0Z95&x}sE6-l{T$Fm0#Z-cLD?}lr&_rVj|t54$8 zO(<9&jzL*mYeEl_btpW9VtH31tU%T9>Qi!sWLzG&4M{tGsMhOvpcP3w!cM4!`@S#_ zt;9Q_iR4W(^ zv==^tTw%#Uj>i|`g|DL$yl@3tj`zdbn?h~c;5|t0Yr?n0Ge^R2P(6GAKDIej--N5Q z_rf|`bUSdm_C7fD^U%6-!SBA%>(IvC18@6Mw*wzUgZSL!gu`^Xa49lb zpTZAOG2REeZwuwq2`8dp`*2t(b1!QW?nF`^fQ`3@yd93#-h{`rx9*5jgHdo@!JSC1 z^}{+lL*53*A*thmm3D=^1wMkLz5}k*V&8L30HhWp1Hq!;T|O85?=K!>y2_@5-OBu0GN;DS{Iy)Qn=T9VBIqI zRRm`m?1fz17ldwP;)N?wG2RP*L@B&i6h?hdPVmB}C=)Lpu;3N0ZvVcnxV^WcT)XfIya z5|!f(nDZlfkoQ0E)?iP3C0M2IKerOS103CTm@(NOzsQt*lF73{Y(JX zILEWZ)7;~r=Qqa2^N%q4JY!*u7FdLq(q#D;!Z;4l#d^YjJgnG0| z9V=9~6Z1`+;n05v|9vCxVBysI@v7hq>jysEFkUS`OZ%{X8gW(-54@@|eg8^3@IZPz z@1p1zuE~g36?`u6!GX=P$wet2Gcb!WV) ziKLDdw$R=VyJ_!$!?bt7*R^-U)7q;R@#;|&JVW3L?Y*$7UAGUP)7}MlYww2{Ekkwe z@D=R?cgL%rk*sH7Mk~hnR&tR2@jkq8G&+bE&O#^gZa5pswZiXFGS9BUnyurN4KHkr zTH%EqP)EE0JE7ot1z$l~JfjM~Ku)~yFdB&$oGK9XyNr;%+=a*%hlWsTv5ZBZAzuq*0=cfg)Vt`)w6%y*K5+>bB83x7c? z@xscP@oF>P0uzy3D|{4LmL>-|5ubt=&Oy!a!d0j}-V5XJ3GEjP?5w>57HaQ?rP}*p zLc36XE9|Jf0~TuUhNas3VZyz-KJ2Ky0~TuUhHH?lJsOtzGV0}12dlQ~S z@_AN06tA8~;$83@GDfksJI1Ra$l&?k1L)UVV-;4@Zm>8-T@1d#P5cs+WX-ZokQ(dU{mew zu($S3_#TpLy)f*tkhj2A+8c1D_HO7!@^|A1t97CMSNPo;9Efu8E;vuhC4P7UN&BiR zXB`snf~U3TAK6mRp

Yt-b0-ISQ7;)7mQsIlUQgW@d<;o_2b{0VJuo^iURjCF0(&4k&tOhijHDe8{1xruv%h+h^9dDE zE-davIp1e_;Ost}lbrt^=&8M7q z6n;2)AkP>}I9G?ptB+jlN1kWA@D!4G)bMzfhQ!<90PS6HsrFv@DU!dhL--vkdoMZ2 z>ql@d@UBCcj*{_01Et`Fose8B9Dvd(7tTW+@xl!#4=?niL3rUI6#RQaVAP9@YZK3+ zuqjH|%(E!WLMeEm6Q$#Y1Cd-SoQS%}`42xq`FLR|D!>cN|G)O$1kR2r@BcqcLepDy zXX{8%)@f_XOqeD?+1oPaBBV)hLlPZXT(am$a1k^~s6;{!5!L(cy^utQ;ARAkFxL`# zBq)Pu5?my-N$`7rtB#qmK4zZz{pOkf|C!h8Gw)B1Q>V^eRp*@UMiqE9i*`hEt#DUV zxQ6E}JQLY?;b=4rFPtg=#>e4OB=wnuPasK0_zo)N43cob_4H@Fun1M)g%Om%3$I6# zjstI(aMBSjMgFpafE(~z@xqK7=uhl*3QZAS_&X$hH3F~JJ`UTo_h8nI%uA$Wz%xFowHmn1T*}P%lmRbC>R##}wx9~i>%sR?H(uSsd)KYh zCvj|eDUxgB@Luhcu*snw=-VFbH;;bKnxPHPLqQ(k)2NtqQtm8#3x*}?Wl4+`XS*4d>`3z zExhL5FmDbt?hD@mgts91Mt0z@?J!pH9Ut}!I0^6L zg|DM-ywLfSIgWb?AKpa!$vzP*`iy(CmSw{^Nah3wj_W4P+Zd;C$X|%V^V)`AZebkx z9E_@B8KJOQB)*+dy z3oooeTk#(3Gc=QSrcU62M`o&-tY2BM-~`eiLZ62jzatN$86z=TtwleCA1OOI&jX} z)QRkS!mJVGll6Q9t{%ztoI^{&H_j!W+p-P=ho4V4J_=_!ofZl zlKxke3%)&?IHZ$?`;4W`xty}Z%T}*xsAsjwAo;Kp#Yzk&h zq;D0nP6eNuL_OnEaCj_J74J)YxcJgcwWxqR!0gH7nRE}~aoGY+lVg_a5+_DEVuB6@B>o?#HR}qi+4m>1I89AR|!?o8? z|9Br3T}K)DxepueeLd~V`3DPj-#|K)UEP?et}16NuqGCVn{T53Qx9@I}zT7r`*N8NHYQ_EuzivF*smxCS#6siE!aPI-!t=yMB=E6tXXs}KB^yBcjwd99&%Lr_KopN!u#DjaiN!~bfV!`gWWL}~_yq&3b zT~9wDjtR$i(N7NGzVMOvsR#OG63+Pm&)E_Oo}VU;oIimdd_uW6f0Bk*ZpITQ4xjyu zILviE{Q7g|2!1aIf6PP;*_x>aG7s2r@t1`24V#3&{VJS$Bd`p~JQIhHBai2P3Kps? zWiX%kaLBe<>}QY;EJd=nD4Z|)|mtuNU{lyRf(qek|<*?S5IRTs&NY{fNA%B9U7Vwc!uyfT&q>%gAdA0)K>vp$ zcFs~RJ_=VLGszh+_yV%r4@H~kC&D99hOBkK^O3!vAYe8A6uhwdpez*?4-=>i zFI?!%AI$x@xX8>F-4y!aGM%UuV*{;hNFZ z;}N6-`;^kJ=-Vc|djfrLC*r_mm(nh$(AF?#3V9&hfagsk9m1n<;pMcEB0ju$I`zQ4 zV(_pTq&bX!3!j}y-^(Ts@Z77iRQzbJh2?SbK)3_*H;VJla6a9pIs^%;; zXeD{0PAvGYRUfO2R@LW&F^|84{&+!Y*kEn5-#tX&F^}}!%H_aSCuJ*-@2M2DPR>?EeESHWM@|)K!fQ?;d@=E1{;AoVPb1H; z>UZ3CJ>v^L93g#|Ji}3^5udfn7|c7JbZdwYSE5ucZ3HhpgZr``7>Cafr;QHbUhtri z#2-Z)!Q~fbtCHW4COmXJ_myzCX)4ziQP0z8t9Z6@FCY$Fb0hgVm~`OgTd2<{ac<34 zcO#h}TzI$>dK`DNZlo{_Bcr{Eq7sDJ88_!ug{3!g_8-iI&W zPMwQ~op(?!@$hb!{NP- z>rTQQn`jIAi2?f~>4(CTP#0$%g~QNRIrj)3M6!<{{2Fz?%!2^b*$!d$w>dyaA6C-@%xL{n}_p`lkuUEv0T>CmmRh<1*6u z3%`F4_CsBG6JFX*+cS3JunkS&`&~GHIoIQb^~lA0aK$6^^Ihm0aP?!f7vIGxc--T} zXT2)|Z$y%R;c8Syo`vhs9J~*=d4e{;3s<9Ni38W6RT2mOgI1a2@&%HQz>cI_2p1Hz7?~)Gjg@>c9axMH2xm=rui@V4h-i1{gsQ=BR z1K;?FvUgK1nDa5|kWT|nMJ4p5ILzHj{tx1r1@GA|M+YK=Ka<491TjK3siBj!MfK4t)O5991sQDfs5l9Mxr$XZXfZ zIjT69aF{wiM|H?^2VQ$hj&kLB2ai5Ihre$?e}g^G$O*>20nZ%9wX}N_I!NBHglQ!2 zy~4AG6TXQ!aM{^8DvNqZ!Y4=Ms3`BuDY))j%3_iSxbgfPRmig}4IdbtqdK3Z-r#3r za#Rocsv4W4`k_+#wr~)df)@@(<#^#dv)xEc9);q-|)Y7<^qi83gQunraAh09SP zUic^~!YARolgI<(G!4}yVciNRBaiVYoQ^v1ari2dIoXHZNZLYpU@S)&pY;nk7{4dp zhNmOhn-Gpe5!N4s_n=a|a5^+(E@xnt;8D4lgD#u6R#YnCdUV{|t z62c{@H(vNMD#QyvK}C2qh5AInc!XbQuci`?f^hhS_G(%Ve`hVcmvA>!$eM|87#fNf zPD2sAa6XFSUD${upTd=BC|>w6ir|I4E~mVB;UF{xZ^5IH)U9wTvZznt-RM}n3kQ{j zdA8uA+9%;D)5GuxT&KMcXI&A7J8?9vcsR1g_KGhZC*|!((u(_Uc;t zDU$Yb;I7w&-h^%1dvNHiFx-Z#wNJq**N5S8xaSR_x8Mrxlkl7ynHyQRiNdj{qN^a_ zwGxgO8s+pkyzl^&!V8C>xADReXcImP*CWYu8cw@O=K;Q_eHxy9a~K|luWRqaQM1GF z7@US=TnleO&U^g+6WD}m@WMAyJ6`x1T8$U>m_z;Ig?pflcnjW+ByTP}c5dh+aFh1x zmK=2>3hEs8yEXJC+#5+>6&`^StRo5IXoajP!6uZ#3!g?lJ_TP!a;@+~6lYyaXgTx` zyl@0c;DuM9c6=P}HZRPB1(#@_geT0``G+5CuWqAmkmTQk!xn@-3g6W}4KH69hR5Lz zNb)9JjN<&Pw9rQj@WRa7$s1m{FKWkI@DL=|3Qt9G*0_WYT7VZmgc5k+tEgSp!Qjq! zFxRn8Wx;c`kHNdO_uy;Vr{T^OIzBvC`xv}idk?;*y$?S}vcIE#pQA28lFv9?eh+15 ztv(6gcbPMJPfNp|)%1VD4Y&!(->6bG^iR~y-kc8?Hc&4+GcUn2TbUnzN1unEwUOo! z-eElY*uCU)G;!bqOQ@5cJR{&QA7T#wHEj*=Sjn^dJmSEco}zv%-cR84=egHN+8q|X znxpLPcsGORBl(-2!i=@dS3E0)d1y4=49J|E!MD}A9JTZ{#;<&n!k%x0-h?Okyf5(% z6M+}MLm77L2p>i(@WPk0_u)HVGxu@dG#sXKgP#!-HlZ@&3!g_0Uf895 z8s4@o@#&u~?D>n_@azG64mr>9z6Yy&=BjSi@jQ6k_PNU7eLDiTWaI|#FlvWfwcC!l z!FY_oQ?qkb(LTI?!c&c0l^BkPY0>4B9S-c3t0JUh!i{JZ`)g@+MTcp4Z{oTQ7PVoNhIrv!hLtj zRh@XDg*M`aZ=-hBd(-f%U2@f)yxXf?bJd-whHsXD_;!2^ybrC$3yaKL<>Q4T&?daF z0rlX!K)4e1#tWZ8d*X#3=dA<=>a@CirAA_bMSBXrDp54r2U5?_AJ|yHo~S&A|%`Cy{@=1(gQ4x5@%v|LX--Z3I@&g+REkf*{jTP| zq;J8aufbnH-rxn-QQix=FTD18t|8okyWL2Ao=1FGQcn7(lTX-q6Zye=u=Zx^oishz zG@Cl*S`XfTORicFW$z4bJD;{bm%T!G{6gyaZ0-vORWMG6lRiA>F6LJY9#Jxa+l9NElVH^UTqd1&&1$KL%g*=nsd} zpW(IlF;|>JKH+bdP|uVr0*wc#tC7?X9P%LZ195D4*dvsy1P`N0=7+P$4_xyH#>EKI zgx5SqKcTK1IIV;Ed>HixZ+;3-90xx8N805K`T*P}MSSYYfPIm?hYQa}C6rfqD~jQT z^=KAe_%K?4Pr@gVTr1q+dFDgvO?V_K#tVm|k$B-mGyxxj(@^mK50|6%i}-$rAE6Xp zxcv(}hw#Fk(I&hJhaq_fj=}}nyYMCLeYnkwVf`C0>m~BWcroCeNUn9^OWONz%FDC` zbrR{Mz5YZVq`lyJBxf~+U!&fPFX6$j=BoYi!efz*7mh>`d=!pFa;@-cG?TImm!buD z;VP8C3)i7`ybt@V4fAQjGqsPxu_#CrUX3~=O}G^Kk|tb*Hc6Ur9qK`T(s0*xy5GW^ zw0Gc2By&*;?)X|b{~PcqB;gTwvkrIQ&aX3PQZ5sogXDP;h4YZacj2o#+=qE@gyAN9 z8F@0ly~%j_Gjl8TY{4;aF+WJ3d^=a|gHp5l2D}zu%9s+iqnUW&6Ue~}-$O1w4G(*d zd!52~fh8Mw7dnx)fE}OEpHHIy!#zI@>%oEzo0(^hV!nb+-Sk`W@aQj?&q*@^lUau9 zIF&vR@6R^WKpPLA$Td_3aZ>PL!wCA74fo75RD?JdZ0=QYQg!2>bi{dVde#rCT$1Tp~$7ghrbwYC@V%dd=r)9({Ruj;*bX$ zcAze= z$KhHe?~`gA?TF;QHr(c7Bk1P_JaathOe3H0fk}pnQuZV~@=~syM7zMglPM2nH{r%9 z)RmMMmQSOfOrdV!LzifsLV3*Ud5d8&#upE1<>)ud0HH0*kodZVAGVXr^ZKd+=d;UFaC z6^=m}luI}s4aCRbwyCfW8*mnq_zv9vdCJm6-r#D~PFtklgcs-oja&=6QQV{KFH(P~ zly-OE{x4BKGq@Ih^)mNeOq^FJ6O!~T7}Y)wTeMHY)7R49uA;7B8It(I7F0m}2$!M# zrF~)fI?|uZec|BO`M1<9EP8|SMI0Oc$|tYXzYSa8q`s&_4;t^#zSM(o+jr?>cj4h> z?{VMX(~fYL4fIdi(S%i~owo4cG9>Rp!Y@!sOaFj_HqyWG!V}OeyzpGK03U^8kz6Zm zKpE7h@C{_*g`cCrcwzPj%n5h{_C<27@NATzjfA(NBwkpLUcw6>MsMSj@ChW>3U~OB zIdCTLe(*@tg%=J-Tk*n)D2u)ngRMyBSPy=veH!lhQ5bH)(b~sgjrJaVTl+NJGp*yp z(b~u0gpUn=4>$LMH7K|jT#KX+_%QR6&>OI?_QK35TJ9c;N)Jzs!fQ76oO8?`WTfd;KB|x8Pju z9k>$7`C> z!dH>R_hH`lVH^{FjDlxzMjpTKHBWWk&+`RNLeh3Ic#rljEXX9Ed>5OrEsHqR8-IjX zor9u0N22gS6vsz$$S1Pp`2rW@Qnzy$%XxStb>+hLe7sBh!gqS*adv~YfLnX#@i)In zzfYces&Ag^k~r|90zC6l4EEoNd)>nrhxZ~WOA^`x@`Cdu!bgz&OhFQ!FfcE8?nmGm zyX2{InXllR`*E*pxG(H+0QtO;F$+&Qko?V~EN})YCjY`0&@jC4buF2RQ0*`fxLK0`rc@Q$BOP30I;x^G^zHIg+}SIp5Ax`yEBune#1p_|eoq z86_j0afzd(3e8S(K^IBz=j zL%Xm1nsDy}W3?C^xEX&2Irz@4to<7X=ghu5MK!X5Y!it-L4 z{0oZVg;_V`sabg8!Ds>AhHFsK684&JroB)pekNRkBtPctJT(%D9}VwDQlBn-NqgaY z+HZut=Y(;D`)I#EoP(r42v_KEVM=>p|GDA42Et89z7vIWZ=v1En**01$&c_2?R_}t z)-c?HCm_jZF|2jy|6H4ZDJ0=SH7|@WjA}1@Qu_{AFh7hhycNlP9oVA7J(zhL`K;=z zvfymg!M$9#68ZR5@FOJGrs0SMdFpM#N5Y3u)>8U2v=`DA_+mH{NqpgNZ>QY}kH8C& z+T{y z%lfNXa3zv)x(fbcQJ9}S;f31If;C9aj|o?4FT8Sbo*GIz3*hVba4p`4b6n~gFKk1S zpO@fA+IPdjmEl|}jA?II<*B1ljBDet89CE=UchzQr{TcrFx-TvXdi*)sADnl;mbPQ zhdpYjcm6(t0nZmdm$?Eyf#P%MCvY?Bbcj=%r+$OliEqP;P|1A80$hzGKPmWu_OUwp zEs}5-KCFEj?ouCy+i;xr4s6jr1=A?w3i=E*63i#e`9@=&Isi$URug>#iBCdb`&e_H zdH^MPcBJ6fNaC0+jAhjRd!B>vPE>duabOxroJbpe35k!xyO2ARzmp4>X)oNtBR_=O za4eGeKHTBn&>Qd&?PKuw+Pm-x?bUsGYHuXh+HkD)F?hT7E_@M17E%vz|N9vuZr^~V z+6(X3-dviejz^NFTE=q$`K{CyjG$y2WrQ(QjCY`ita{RiJ3SCyYr?~|x8cRw$KYJ; z9k@*UBrIzuUH(3rv7E9a$wN%2y$h4tCzCt}QBd}kT#L+n_SE1z$WiQ_!9IUrjBLx^ z96S#BS?nRgsi>PcaafBi;&^ZkO7~#@2=;u8v9=9+eDGk@fw$opWM%R!h6_iRlM(^3gTPvOym(Bg$~N_>D%xL`M0#=n zgA0D9z3`})C>!AsI1$OUsWrqw;=Pxde~@?|?(jDUf9bI!%a96 zW$f55V1@R=x3o{g{omyJjm#CWRD0q5+9%;wWPZ^%V9}pLFT75B2d+l(&-(_Q?s zVYm&iM((No0zRU>FzeGW+=R!X!V9QFc)Ns;rA^`E;wMv|a5G9yp-nf@rYHk%!Qsf| z+9z1t*}cXup67?S-FepZqjkd(`YW3_kS zBj5OK^3`foQqGxwn6Yi>g=c6Vg^N(e7k;X}>XEO8 zqJpdY1uWBE_?Y(5p82W{soQwRfIYX%SB3K_7qmsU(yw3)nYZv>0bS(GrH{df#Y;QF zFSR$e&sPVapdR44+Q;Br?LC;%-pt5XC!>ygxEFL#!D8kX_#%qqeVDmJKEMBidWJUY zB3u|l{zB$7=pb_e*FsNpH}Q9*U6AA_3UAQfhudX_;U+9WUM1ZM5V+rvh&p;D5wWGR{I!Sti6##93*if@G9-&uugjqzO20u zd*_DnEqFERSVp@*7Zp9g`yTugk~B?&xxB`v{C_@4_UCw{vE)U%pz4VpnrssDSoFD#g49D^T>0 z^k?`4lJsLc<*Nm#_#@6B!B@r4=gbxCF@XBHkF(8iFe-S1^HFd-D!hvGOYnYF+Qj)Q zxZObR^#bwX?@)xZVNqC(41RvcgKJS|GwH*gJLjwNhlmdkM$Xfu567U+Ka)OOh!USr zF8DYqBz_8RMrq=!UGmjlsN+G-w!t$|Gb&EMp!Q;~!_utj?hroIU;%2&&g z#IX*eevtU+arx>>B;Guca-;Yb=0@1}BpnWq*FFL#YVW`n?X8pZ)p;mL6VB7#g%4|= zf}d%xPRUn$qaZ%KL3;--`^KM2`bgraNWL0?ydM1i0eFb^-f8)23-T|a51-DwiX^@T z&(_|9pCfMy{bv~c2NiN2Rh>y5P!J!UrM(AV*4~F-YVVvyevrgZ!uPaK56@TqOTzF7 zyheNXZ01-b@y&B+BP2cs@6RPhv6nXRr?s6tGxp~?bC3V@j5;{T>B*aPYP5es2cs)?Rqb%rHCx=b$d;7Ga0>!d_Q~;U+vE6|CoXP{7673pZ+ST*dPg z6~9{$@D}Zb>$Labz^kc;N`99qEYV(At-S{~qOL?iz`}Uwg_E_9!xgBrhH}Af?S;o& z6NX3N98^|ExnPI(!d};g;U*l3N|qD^tk7QgmiB4b|GKa~O?aaA5jb7@IBd|~gRg6^ zX637WkhFyb&(=N)Z_(a?%e7C!_q0#L{@3gK!V|TR!dtX=;BxJgaJ}|vn0-TdZ46dw zuWn>MK|#NQS81Pu+mwgl4tzv=2aiMQV)kg@ zR8)eG!&>CwJ@~4Gk0SnU%wtII>%o-v{LqyuLeVIBgG*822=--Q?}dz=vq>K&Q2H$L z057_oamN|sI9!7i;pQFmaTFiPejI!fbqr&lw1PT7a$jK-C8-np_xb$27}7nxe@N{U zaGmx-@M0J1@#77wD;gMsQuLb0oQ9U+-6Z29)Y)_V$MSfpVMAA@a{0&gy*Bg zMg0RV)?T<#dv7uQ2T2}$xWhf6H{fZgi1U!b`P!#l##Ch(CkB@xYXbcNrcuXu_NJ?N zpGA_U3*SK2RLE+8 ztDtIm$3`WxKMv1C7U5BNJ?bF71DBvK&VC3#K;8H>Jfe=a;hd5UFGd-177i{z2|0_E z$XDApFo(;TC3sRJWnMsEg0oQkZqkQMO{9N&|9}TJhdv7LKpBh3KYU3%=catP1sQVo z%;UbOh;s!VOd+X5p}LoR5^lipsE|GJBs}y!;&7HA4p*Q~&JqZ_wHF?9e;6Ktb5J?w zYJ?ry3wtdI!%a966*jSN3oEo2zNLK{4q8fiX$#>b?S(6}Pr|QJjB^XZBbJ3;I7fR2 zu0|&3d4w4cgkE@t_EC5xl6r`>^R2p^`*M~b0?U!dxdq{X2N{ESVXOAS%}CA@`IHV&C zw_%g^9vtvg7;eJZ+B;mI$A z;Suu z#JVs}6h5PU3J!TK47XvE_8uJYdKhlP+1fjBi}vab@{fZ2!?oJ`@MJ#>kHCktPs07) z48tvWm-a5q{Bsy?z!}=d;Rfx~aKu|-oG5%o`xG4Vb{KBMCha{q;GHnsgtN7G;1=!G zdh(Bg{KK`{`|#v}gW z0w2;o3HSRr47cE2+Pg6GlQ7(XGqjJx4ce#Sh)=^fQTUAZDL706e8#hhwP;}udI@j9{g9ju7G93pS)&$SiB{uXnEAQRGu$0Xn!*xv z>?8dGo+tmto87#JAgL<{Zqi8lg3{1GgJF@cpXs5C1JE3L|+O1rYSGE!Mm z8Lcd>j8&FZ#w*J!oyv+zw=z-bRkl|qD?2Jvm7SG-Wmjdovb$1MWmFke1yyEMVU<-? zRApBcS4FBys-jh;Rk5nFs(4j-l~YwwWpfm zx}e&uF08hyi>mGF;_66sNp-Zkv^rK@RvoV{uXd^{s@>{DwO8FFVxkRg+O;)D+a1HH9@+O;L?qQ(P0NDXEFpl-9&*%4*^@?u2T{XfPWJ8?1)nhDbw6L$sl^A=XgVP~PA)v^OLh zIvP?9oeh3NS3|m?yFoQ(G#ZTsjb>wEqt#f{Xg3x&MjE4yrH!%1vc`C0d85-<(dafN z8okDJV|Sx!DrhpB3Y&_XB26Vt(WcU-SW{V3ys5m&X{u;)n-Wc4Q+rdgsiP^?)Y;@W zbv31%x|>vUMzhge&}=prHe1a_&31EfbELVXIoe#>9BVFXjyIP#JIxi%ZgZm9Yi@5& zHg`0qnme2Q=C0;+b9b|9$!IZJ3R=vT!WOHgsKst6Zi%#%v_xA+^%V;y&3VxtB(*{;AHIg<6du#mvO7HyfzWMF`Bt7GA z?N-tlwvN?Q)MWn)THv3pHM6a-&1x%RJ}CajW(0n|pqJt|4hM6BiuF?KcxZfoynHi0 zWK_5{iJJDBWKBm+s;0BXuj#5u*L2sY+KgJGwxHImEv&U_i)!uK;@U`UNo};Yv^G{- zRvWJ^uXSoGYTepItykM#o2>1qP1SbR`n6rP>DumERhLm`)D_g3b%k|ST~VD~S6mmV zE2)dtmDa`T%Ie~E<#kS7MV(uhsPpRD>ymXHb*Z|}I=`-~E?w7MS6=VbSJb=piF&WT zy*^prQJ<>stoQ4?>eKbz^(v8(FcJj`Gf|kZ5=99+QJjb*N)pjTX(E;=OT>fGU6F7T zi60%~Mni!f=S22x2hRuXKR6>8tp%-SYhkO^TJ%rP4*!jQ9`B_}{v)4#DV}`Y|AJ@UPtUvmbj>=w zRJ)!(jDP5zBK2>5qu>|rtAbxJ?fw7!9Y zr{9&oTe9xpZTZ{JMh+FK9=wMY{ae0_e(0U4{bzp1eD{q;HT`G2wptK9>NA6Ni*NVLu5b;^?akkW z`hH)ue`F1;<2x%?)_-fgDi*9R{nQun_rHgK>TCG>-@@H>|5aZOd*1iIlz-|wx%7Kq z$?ZS54iHSB(GZ7ls0D`VeZ7yJ9(`OQjK zdyDdVtD*FtjQ8f`KW|=& z|5tl?K6OczhI2{DxAxvD*mrB^J*kuZw(iQ*5A3r1?ae4H`-17-D)QI0(S+W!`$t#c z|IvC){y$rz|M8uxpVt=u=sp&|1S{B6NwN2;j6SOUA9&yVXVxSC74!6u@2vdm+V!X2 z84KAz{q9?1S;J4gH>Q7dH}(7Pj&87@`oH@sKep@oxB1|k{X=E;QTsE!wCmk}KiK;Z z-+H?%4R-Hcy*p2&(X4 z`+e=~-J9em!M?o7*KRxe>``{oP3HP^bClg|n;mPv)#5yb&-}O(e?x<{N8Zmo*Q-ob znVd23tE23C`nAREO(yy3vRR`}veRg@o0v=(oB>ES80_$Qq#a>LKEkegj6L!g=|o?fdkGDqJlsQ1zBpGw<$|xr^oNBMeWQW(F zE|T?5!lPat_An#lDngzt&I_a|dy4!-Ih~@cFfSH4F*q5bIH8fQN!I$5RO->D4sB}C zW-nCHBjTKKkX*Q&Q7}1wkZQ5WN2=B4v7_~AVw1A_Gj`Z#A{?4agiRW^MfRb!LB zMJrjfkiovPNv`9hC3!YTNs-eesl;gq6&(<)>qSY!uT0YJF8MU6f1f_<(&A>lpNLa? z$)HU=YTqJ19{ti`tvDuYA+Z7ct!w`0n$&xwHeP4bCrnz*X|%a#l%5usc=7OF5pwKQ zMyM6(xux_orzTZvlVg)H;j&9^vi8?OpS2rPO7vx8MI<4CszEwmM21w zu!Fi$oLZo6+ySbDY@6gaM$eQsRMbpD*Ku)hk91v}U44^&s+etDN*!mH++_UvO*W@m zOwOhx>8CDdN-WMrQ3mgudT{CU4(E~5l~z@ZvqkADRcq9{37dMe8T(0U&Zc)Isp)TW zrrRw!Aeavor={Y|iHeg>ex=PUsA`mqnud6jT<5h?j#SuJJU2;Sv^md|q@AM77G7

l3J7;HX&c>v_se6Bb8cBVW(60@0t%5uooOALRv2o5| zWN^x&oRbs=bDYZ@6o52Cb@ zLmN5Ff=*+Mew<_mNw&D;fHpA(2K5ub1Xw4{d%|JQF zs9gF)j6Q5}x+~4t_L#FGb+LLckqYJsgAtc*GFz1u#*ev1m0c6BGkE$KjB=?Fzft;0 zv^hdeJJfVs@?wYOiMVk}6Rox>f3nuAbLu0^K?Y+v-Pq2`r%CThF_XE$Ea(JtS%fD< zO6nvsFgTNEFt=7vrYN;((ZdY-aIz*^XV=FP$%ZKNfy2z=Fv3#IqFfmr7_@POHcs&@ zaDrC$tKva_@hM+YKU-3arzrVx7)er2OV0`xPZf`mWHC2*LEninzfvmZiGjhKWpS#{ zqpd9ZtQYkCIJKyFYKHZgWaf_7I(6xKMGYkz6*En`B@*-%M^cIp4Ejoh97?&OoWzUK m0uJ@>(B4j+LC>?OV~^Zf%s>%FQXzdh)zOnUDbjdr+bgQAUY1IH=LknlPxdlRab)Oh_;wse;6!X*{5YWQGK} zCG1RLcR7{sSWA0qYkPXLwcpo^JrKalOai%q+)@#>7eHGlj9Q>A1W@Mty=(26OfKj- z-}(Qa=X;)y=Lvi5z1LprUGI8t>wVv~ru2a=CX2~rvf?iuHi?&0{M5pS?hS`MB*<{={@1c{cY;I?`^>KMALOA8u|U7-)rF4KfNd3 zzy02N++Q>MU4C8bc=yD8xIgLr(|h&&`p$dn`1Pg};(CGgoW7EdlO~1#JRpRNvqqy36xe3D;H=`$TW5$j+B26ld0;qxdLvwJOv6={3B8o3}TmWayQ z@Jx+F?^P`aA8R`eDI9b4QyS-Y!IdF%x?F!4G<_pxI652=~p@+8OkkxiKJrnJqfyi;YJhqEP+STCU zfHhQPZpZibdM~izzgC*k!pTUMwxyMZ?lW7u6bssqngbs-pBGJY$oP0^1Y*3)+a%c% z0g&?8aJ#p;|JPY2leFaVfX}M8t7nOgo|7(#4-7D1py}rOT_u%u;Y7>I2bI%P5SO z@Gfn94G8zLgKFfYRbAe83doSAmmyci7PGUe6VnF^YN1zx3G5kVIahPK#!6N)l z0kwl5m9gD2C^Esl`}V2YhXtKVjsva7qY^NrYP$a+JgIwp) zoup*ckPmg=l_k$x(XU(ukWS&lF$`ZYG#A@}(kxy_)<;E8Pc@meOJ-S8&an<(==q!` zwBThAI=pOou9wy4dD(mNQu(2!DZ}5#BJ5BkIvzZC@|s9rrln1bjI*R55b}`N+mat{ z@3TW!jVKRkNI>7(oa}{aXhqIJATSSPsj~F{m;?2l4-|UkWv29vXX$NdL5_o_ z#-X)-q=rg=fN~C=n{drVPjsD5NWe9ZL@=&1NCV?q;1JhYZgF)tiK{}Y9q(0AZ@BtM zRpVN2LIb!iAQg^lrOCmsi%o8RtumnjJb#3216*rJKjONAbUm)MCNzL6ECD-R8%<~c z*R`aqJ3aWg36~ZVKJWBw#wD%OL)MD5)3XH^Tc_unxY#>A-^Rt!>3JR(ck~ntO*ORe z2Yd#jCvaE2g=2-V5j~81_t{Rf|Hk}oHRSn0@Lm5^)mvEa*>CN;hP>gRUK_n`mpv!$928^kbve=@MqxTb1<3x--cl_l%69AhcPYa{2+V!8JbG*Dm(w_tu&eWnKYN-{HOU; zs$B1V_^B|q?4TZN-J(*q*Bj|e^Dd8k!imNt=Z`@jRt0j+pqZ3jjOLBbM(o9_^_c@Z zOTjQVaeg5hCi{ic@o*wOcJ2_1qzcreuzc^6cpPd-4W+Ms%VbLO47VSB>>XdoYxOzb z2FvUM1DKNbN-8&S;wL#s!bfZ zmYG*l##%+KY-x(yG;&SZYE-p-W`nZLsFo?Jkvtk1zD%Q{{j=Kx(_C^4poV#S(?74h=|;u8&u$MYowqmR z^V*wXR4n-H_6odO#4Q-D-e5Fal61LIr7y^_S1i0=*h$)lxlGPx7ubA73tx1#`SeF} z8ddhT4|b13ntf1yja(=yGsBR=hgD3q!3?S;I!wrSrcJz>s*Kgbw?z6aY-P6Vl(bQU z+ELh#NNGAxDb62}W|dh7^V(#~KH0S&>jhVbH2ak6O#OAivw_iC+$sg<;iF(&YN6Gy z>$DWS2UolZjB%X~j8Z}yK8;xbhld>i4)PDHY;SbKzd<3+&1FYaR&3Y$tdWy8_vRU9 zJQ5EqnoisdR^xzzS5bwq}c;sXGUiJh&dm}pMTTnafiEO3t@mxik z{dle?_>un(l`RA@&4U=TboM|%)5ogikfLk!B6>K2Z+Jsme_FjQ9@hB{!N9*%E!5W@qlX`(w)rLcknt|q zT!m?wfWq13>eD&Gq}gv+x^zYlW1~bZz*_ihHXhWE()krb^ygBK%b5lg*-=4JMn&Gk=d_QxQo>)1g;28hAS zx}&RZPhx}Ps*o9jZ+fFl}I|V z&Hcc@eZaofh{1bZJq;dL4?8WDoS~OjCSD9?E-XL6Uj!8=xxLZrwsMLyzf5C}J~JI` zeD2TJhP7j9gYccQUV|x^4e_!-UWkR5_MwB;Q02bRt;_y|^*z=Zl?pon5%W4p7O?Yc zWbvo0_nAhv_1&~8uKxn@_;;rfW(OXQ24hJrlQ8A9dd|aD>$gZ7$yx`818zZVtfEE^ zdDCFCTFtDuma!&O=skvctWxsB%GBbutk~z9+NJ2lwMEi)Yf*KP4kcRb!>kik%B)MB z+JzRYr0o;&RV|7&)rxL~f#AQfv_>gsA3Pr&}kX)@^=Eg;YgU1Sd2W2nN| zKd=Clo1zw#Y5gcl+d1J^JD;URMYTRrt+u=+YN19HHI&U(b6n$}!Hg=BwzcH`I@fHf zj<;atKn=82yN=Y4#fztNe?84?ij9K-m?3U&F`HmUd)Ql4``2)^GDh$)?Gzf0cNOwx z1zu(8n{CdB&T;HwFQQgM0ASbEhUB;yOq`=61--1o=bd`!a}Z1zOQ6?Xty|}_3Se<= zjkKLNM^7}4qhcUQ#eaaJ|Qea`U@ljQ_sFK3`c~WI3xNKSTLFo9+q0lp<;!M z2!;IC_TR)JX^5ROaa#Y-P*7b9pTaqsGaCf2#!m9+g37d86+ zH-whZr$$@D78 zn@~gAfc-KcTDZJ%-b8>5JcPV~HvKuUMe^oZ$Qy-q5_>$7!Vl{IvA8j`UymVd;AXZa zr42-a!L>)2MnXboKcN3L5_bB_oFTA!ct|j9{ryR)1a*)QOR@~Q1b&s96OxG?)cVsK zrfIu=jaJP5Y>Xvvt(Z?I@8xcCvaGU+4%iV$GU`=Gve$t<8LDQ}HWF!EfRRWO45hH| z65b3>leP9w70Wx2Zv<|2yoZZ8+4ANf?i()S9K&SXn?lAp2Fp0duZ4_D2sln0jAO_d zVK0%KQ`pNyeepNUd_qI=C7q8&F(8jahx0LbT)hoom*R3cG$)NFQz1t+BgxADqNohq zljQQGG$h~!agj)LhG`7_Umre(8Db1V#tM1M$FmsXtj`IKkB2)oLLCVr@m|=SeKS!* zj0RH1Q2xc`@$TWG|8s{UCP#pa^-0kw{bjN~WwMy&F-A5}up5&8kdX8kn=_ISjeKO+ zk1(MLXIOV$p`u zzJ2Zr*j{9JaWm_@8tj%@dZ7MQZFL@`=N&ng**zQR_y-TDdAz z?ucC%7}MH>H&mX`8a7H9tYfDG<*{9bFO%8nPlw?-wx=~{FS4CG4z9F2dk*zkdLn(+ zctlwqnSzxoB)V9%#*1@}r7lTP6yp(nZm!Xg7pkOW9<^|p`uLiv_*ey6Bum#G>9cLl zOdH%P?)Y*$zdQQF6Y;oS;=^oo7TZ<=*ysj;jv11IWr*;DXte%9DR?W;oA_k?2mBKQ z$_}e}%0TP5V}tH&xbv~%Jj`w`g~ozELLYnpSkn*Gq!s>u{tj)48R59m`bP(>zfFrx zG-hnwXqqVNorhy-zlGi{wv#cK#3~>hgVEwaV!+>+Vhs2pg#R(%J~t@A%iMYDxuY_3 z&zf|&>4g2>TWuomUaj)aA&7G8^5EHHSLgGm?u3KPJ?d71R1?nz$z@xgZhW3 z+-==#9YdfDdYC@a!%^ZPeama}&ol7w|7h%ko5>W-&_j+uwXoLipAPV{Ap`;FNL^ne z9*RlNE3BR6zXB@N4(?!OzUcD5aFS^CU~={P0-dPFBL&a!xt^P+7Ou2QEq}lrt0(|{ zuFh6ieXioXz?Nr&r|)s?S+z!H`;-1wg3Q^6x^OR`3#_Qi?a>mrIOqigSvD30xdg)` zkE>%<79j9AVOJl41h+^3{62@pyu5%!%x|tUCb!uN5##)n?MI&qJFB=pZTL0@3+$qo z`F0w&%sy5vZ+KW|^j(-y=!Z|8$I>~tI~q6oL$9jk&1kLY4x?`M(&%aEUMct=eCU|? z!di#aA{Ih(b3H6Vem2EboE?}+gE0mXF$NKlxf-%ZCy7>R1b>@sjNo-{rtZfgp3TMB zh^X8SQixbOf!Xz9dPu}hkjwEfLEUmV@UNfM&u`!3$Rg+;OhEtOAn5a?mha;Y@h_kk z@v6^<{{hi1!GC)K{y1ca!Un^i_uqv7j1XU7<*x$BSi08#)xeX90nY=>Avq1mUIo|4 zf#^@JB?+Gk?HQ~GEYh|TA7ol8%_mu{q!jd?e;B+985tTTBOgRdTt+(44(Y4w3txU7 z00ge$j*N3CHm|X9W!iEQH|jD*3PfhVha(5#XK&Pt%!pV4(?DpXSH#2LUx6`9CEK0X z`R7F3V!04OB>RRxqZLaSpUUxxVb&FLUqW6;Lk31p-JFZSM8uNjTM%8^d2^sqaUB

3`(TA6-K^O`uH!9%S!}MKJg>zy@$PDUh6?KOgBxn(cvq<<96j|7BO}!LY2VuZcpSr&f}1d2V3}|~ zAZo;e(xDHa=n}$6)F>PJAam%0aYG-#gOkz*-Joj;lN%Gd6!gFsQ&5!LXFQ-N_#);% zt4;|Iv#&7*y*~ZiQN4IN2*fRYvx9Z?tv?6bupv8u*>aQBn;-65jz=(3?!)Sp8!52! z;z@%<2|aMHLJ2@IxX6n#66_cqPY{ORNifhXRCJP`jn z?Sk1qR&IrUH1*L6Rb_IX+zM(nsaUJ7R<%aE$!}AbI~zcPV#^)mQJa)lk0aehMYs+! zsU;jZLm#6`9#y%T$Mc52*BWP;{5PPnwAi)U4l<%lt(0shU{EAanBoRuZM7-|zM!pc zlmZSJ2xC2wljE_5i$pVJ%fU$BHCi~sa>&vqTiV*8XtLYoQ1PhtedJ%rzMnfX5vHe+ z-U%L3wWr9MzF8CrnUkr=>VV9%Qj0`4g;zcHBAvNH0d2^Psd$1Y6(N!p7X(u86M?(ukT9`4<^cb~z7@}2n7bOw*hLA~yH z1#s67tOu?Pm3*SYj>Y|ASle(0J=89mC!-s>;E1ZPfd)Ge9rp_WyhxF`cSzNz811Ay zDoM1>7Wos^N~#j|w$id&ZiNCRTCGWfQC99_r|`tiiR~D@);3fDZ*PiX4T?QfBqvJ* z1y-WK5mv5*tfpw=&q*8b2UUB)MTNnp&|ujmQ4LG2fbC-G`DvIUY|Ij&h^vV(H`APf}Ddr?j5<2cM5@wjT_$K@kFCW0%-5APuDf^Joq6p{jm;bM>-C~hfo zQ&3EzzzDh{{{)Lw$NIv5cJV5$fhgvu{FCZZ=;RcG$=$J{JY{$6; zfw6cvnLjKp&@RMZB^fMvP6p4ehST-*xj)6mYnP<;qvhAomPz{<<}!kVa>xU9Ym+wp z5-?(MZS~03x4Wo2S>Rp3v+xMOQID z2tSngkcQWLOfT`ryY!N^tuOuJ7r)TU8nsB;x#NdU>RX%e9T~zx+(Asy*Wm6HA!R(N zGU}kiQHs8u;%jp62Y6{!^w+u6BCu0L)!dn@+-(tRS>iJ z_90Ouo~@u_!ofsAeePho8wI#;{!=QE{45~k*90M-(Jp}wKLxyd<^!0uQte z*(P{s$N|J-QNn2eCt%A)yoC-e7O`!J&%%6sW)>#%5;DWb!7NS~#k06kOh$6jEPnmp zK{~rA!mhu}iDcP+fQMXjWq+Eky@=*fw(i%p--)8K->Pe^iSj62`!UKoA7XwumM$a@ z7pou|h-yDnItWSS&B72XA|~b;D%DrdWOv8Tv<<}JVBVyaxU9U86dK5Ly9SfZ4dO{( zy1e|elpayxw{+`sE8{&xTUdV0&p$k50k-f5_(-fD)lk-iL%6eagU)&kIs=*Y2r{FG z29;6KAToxG=a;vj=ft{=)TUUy>GiclX?dL*`rxS|oji6+szi*Lt3_@v+Y{sA6MdX& z2;p!<6ltRO^6yr|n!!?(hOHJ#!kNIzlEUFLCt9bE2s=9ohWxX7g{s$2*6TBIai|QY zCK-7p)Afd2Z1bRXR>^c%TOeacA*#nF>?D;F4DTRErsU~i2lX;ap3Cn>N^W3u{^4lb zVc2aMDE#~lI6jKW@2NMqqu&kCfN4^~DdXlvG0g%Gi79rAWGg}Yr&M+_Av31{Y6C43 zMUl`lnu-bf|0E$Z|2|k|ekNKv>7(FBKq?CGolTduOKC6|afgx_xmM)C{vmF)T{OM$ z;eQi1l==nl`-+@Oa=};es^iIT#omm*xQ}~&K!cwAj}(3Rbl2%RFJjdJSE@fi(Weh} z2<-VD@vWlhFMSgo;nE^5JkRGeoKvS&OH^SSY+x=QyIF5Q9{=sppOZ70N8GjZ$n1Cy z-wf;rF=A?=m6trB2hysyfYr-IrT}c#8t{V;IRcp$Pv}7k-6aw}c+gG+>?m}X60}Pu zc1%>|c$?M{5ByI6V}u1edDxK1D>`uyP+9;wZ`dbfef!+4pL4^Zfd_qwEwVZ{{bHs9VGeZ zdtr0K9!oL0hboJd_NQWR1N6j3QeOFCS^rnkZXSIj2{w=Zb<%IiP7}<6tGj~CXKp-$ z7~K@b0*|Y(nMqui!)W9oBE|4CWnr?SjnL@E1L0X32m>l2zB)V>sK9+SC=fj?4a5jr zii{cfBa9@FE+cR&GH9e=9VlUV*wc%+c`{~edxDsH#1xP}K2A)!4k;k(DFtLbQb6LA zY?w#^>6BSK+6d=LA_YV-uS50+KA5(CX!b`fvOnI(3X{UW+^z(^2I5$PuH?lJwo_)} zyFiQxZ6fPq;mGg{$~NMgB652Vz!i@NQa_%8b*574M{PDzKRRR>;C*X=6wC-u{g{(% z9jg%RYO2Q?i-({^Kp2>!IedS`@Rl8-WfAE70-6+o&g)T1QVirPPc{=2Ly^1CcSzXe zf0Rfz6W_eoRu8?Y(S#Am39#X9{%dLT%Lu&fW^7O!zkUDB+ z`KZ9vAvI%Wc?Q;iTG+8f~$Cq_;bdn3Mys?nwo%Cth7#U`G0wk=&fM)@2q+%qB;NJuE- zl^O3%`esC+W*Wz~nPVlkm_0+-fo2w2SsaK21fKx_dfNI5J{;T=`iMV6IFIwzF>M_6 zSd3(Y1=uFiG>NRNMaas69!oIffoQ|O(CpmBEIO~}Wvk!>*&i*(V-H(D0yB!tUohjJ zqp@#M=I=wu$9f2vzw43tiw}k{V@6>OeB5NUs-YJMu09Q`EB#kVjw>A*Krsjpdjp^n zK^}N4K~pM|1gz1qAX1f44@f826Y`|R78L%9Gnyya=qN1BEKh>ZI8qXc7jIINYe#63 zoPB7L_>AJudtzxqgj5+>WW-glYIypXp@x$DH)MUtEkCvrzPq;-rqlf7e?(!dWW3JE zcUn^kyTEy&IdTEBB|Fbs_PY*A8%bxvxCP)HinCJUi)T;w_Pryr$B1p#BlY!#x&0C9eJT zH#;w}{jDU_T>Vl>zexG+gblsxSz0&UrE9bZkKG#j8n4q;Kh=5OdD^(^lxC-Vq2miP zU$c{Kok#07W34;Lz&7X)`xlKx2NGJy#kM!Pu^P;?KD%&Dt~7g1F4XF+un-+8a`-WU z(Hu07<&Jqa7`fO1J_Z|4Tf5K4B2%THndgQl0ZmVbxL z9;7#`%Xa(#B?KIp45sK)*l)=4aUS%shs&GW2)jP^Sd|jmOpM@h9rCcfWg+X0v!!hd zGO%yEvR{) zzN}ed&K1IJa&n!yA3IL3+zB*MB4T{JJn#NK5TNFiVfl07nefC{dpDgi6R)D z6-EI~S+4B5NVEci!PLQ|`ZF!e-7;&Z%>g9B2DvB1dX>Ajgy;gK?2PQf-V90^1q}z| zfh!VAJ??7Z)S$8n&Q6^w?sf!Y&0j-?y`U&LsrcxOn8%yLfdyEg>K2 z9E7BF=j#oe4Ip1?Z(f~UHW}tX%Pnwu^?mU=goPRUXJY;_y;gj5A6QSu+nZ)xPpyT@Ei{f?jPRK-8npBxwyskN zK2%4v*G51MZV`B+`O2mc0G9}4m150Y%1&YDIXmxRf8j2XS}5Ed2Qez(fndea2xK&V zne;HIshp%rrP|p^qtzQL6}=|6(>>kf0Hf$NwYWuAOU+{Zxxvw+TJY)fU?RADF8vab z{nxst=gk`3fK}i@y|^;=xE6U+J73!HC}*RVw8aa-UQch#!$r09#E*9t^NEdlQ25Pi zNatB7pgB`4Uw(yOot?#tdErJB0HY~(4GK_trkEWCD-|eSO?3d!YzUAJ040`2#o08p zPw?t)qMyJ7rEs}h3dZoj_(Z#ODL@wi zX->+_@vP%ifh06F{3Eo(8=xS~6~0gjHccXP5>)W-s200c*_<1@s+1kT-2EJGCN;DO zk&3Qp7A@zCvjs@7dESiW+)abuL9VTxm|9aSh{7Z(hp+(HVa5Ve@s9IuWc^26*(vy;P%CgJY#B#9YZ}4J_QtauD3B=OS^0d0HjtXn zMH6!Ki;<6Q4%`UW9te`{k7qq7zBVQ&x(}d%Xk$AB=#%pgBc=lDA)a+7Rn&{&1_t7+ zK7F}LS`ZI;eVu5v3cW*oB_!cP?bTbhF2MOY6(-YH@wXa(3jP-2?;-r%i9Z+qO7Yi( zKhv1Y{xhe%NgHEHxf^4poAfcGlFu@zWE(An43}?Q^g>y(w+$(y7X~s^eRa9MTG3b6 zkoX|sVb|6O;qewNi1jtK`kEEE*!5jae3WD+aOpf)e)(_1CP$7ge+HlAz;)W{Tocw& z)+?Zi>|!UxL8-V+m#32}gxD@21F2sh94;R^(1_uM$jgt5=0=O=Zj4z8*kNGirGN<~ z#DNoDoB;q0dt$(T!4V7E`MCf79amyZ@vMJ*hvtu>`2J!AUb0a7$z7mOdP#I#3g+{{ zk=9GLeG{S=xI&!7vwp|F6ERn=3I%3}3b^NTs9lqQh{iiUfve5X8xi?k zLpwUjyr6hN??p61SG)g6^9C-!0;Ab8oDQ53by=6{ib%>)IuKznRk-7zz!i^@@F@%5glA*I2zFb$n3#(wKGhlB5n*6`B>Xddf4~(^V~~8_pn>yeea3; zLH)Z7au3`I++l{1lXfwHT`2Qah(mx9&svfI!cNS50BTIIFr0(b%b>0~1fbMhb=l!) z4kwU<9219lT}f#}_1u)Xqz{JC-vxmiq`c-Hc*0_|d-DkNyFo)3?Hxn7SXg%laki*-1jL&?Klw{+_D5Cz3{{bf!9 zeA3APBm}{T3dUDoYXI;Nvh3}Rm4wb(Obku%+{6T5%f_m%14z6q>tqL=U8=dlhCjRN zyr7RI{W7+*xCX-|*;8foE9fhwE8ew17z2+D>Hxkw+xWzR#3dXgCFVy`4zjlPp~QHM z;}O~KGCCu4CFz=K(<4$QgB}Y0yme?xlX*)pFz2Hs>>Ngl6I~Idq>=#EpbH8RXZsK^ zc2M8~)KozB8xDnORAIrf^U<+qL3S`wkgC0(Y;g)A10^QDVF6}-cUnB_04z3yR%oD- zO3YG_^j{152f2gH5)@ydtu8kO{)OpHXa{qggN0fiGQk_g`9~%!=gpgWS{SY2KQcB3 z!p`>Lc%3|UNC87yDA{RmGz9fc`p-Dki?b;l(RpT#+Qyvafl3+^JTyT6iTJkIxN4+t zDC~zY=<(HgxSi!!QFLz+G6u6($4ZE01ryK#aM}h8qLMwCoBytlZOBWk$I2!nD_L>2 zvtEyD4;E^Byq34(SwF!-F&JKNvmAB(vF=?ssvd!%n$cNOPUK~Np^0}}l4nRXy`&Ln z`7-7!RMr?>O%4Wj3f{tV5sFu1_XetK{jih?T&@38|C4MJ6#?Hp6v>f-9@LB72|MLk zFg5Izf8y$6VJ@m-4bUpD{0FoOwML5Mu78jVjapEg$7Hro2dQ$;o(fFsB{m)%0<;Qh zz@mv2<29|?(9ZAB4wThS$^!CH?%gCjyq6m1c~F_SdyMW#CQ?`X{tmY;%D7n!!xy#@ zSks@93qgApQ)E_BekSlcR{?4YaO#KuE41d4K^7nc3wEE2xkIY6*u)y0AlN-{eTwKL zni)-#2Qd)U)+i?by_(Aun5nHPH~D|0al^tC__qYXP`b2_GBPR(JUqiT3fag%ehIXN zo{A9#A0(6w`I?|F;V~U6n{-c{pD6%46&`(H%70`<8%vg zGq)g~^${i!rM!67dnlo?fBY7;>(Lkz8uv!OaXKCk&E~X&K@G@zvj2aZ{Pacf=?;9# zsgS;0fG?ADm-;Q^k^%|H^*FC@Z`22#AmZp1&uPg4y8}~hUWJ%Jabr`#lz_9T(aZuj z(XgT`?jVlnELLcpq}RKL>W9L5ci;vwT&l)r1qyDc!lJZ&eXcFhseckkt`SE@L{~In z8aRl$MKpuHNN5;~Dc%xIa}pUz)x!&e>CrJr-eH;QW2FCizTr4x3)1A*klyH&YtV@) zI$1D_)bcUzJo)d_uG)A!B|Zz)P$jc}%Iu?3*FWoV<^lF`fuFHqf>}TpH@NoHTd^FD zVn8^J<^Y5v`!xEk4VY&08rw8y>|xG&qYc*cuZN!)489nQX9>HabroQ8%uC=}lKpVy zc3`;|-3r-4leB~+M{J77VepA921ZXu^Og$Pv+fGfXZvX#^h-Po zzB_;c$bN~K@5A>rFUE&s5Wh1GL^_qy8rlOf|?{9lHGqy*HL zkfkQj`d~Xn`Twpmo|u|XYk|Y~YHk+h9xaIs&7^*AqPSJ23r;^+iJe4U#t= z%KAl)zsP&;13B>A=3^-E#l+J`P)d?ZH*Um0gw3@B_rvAWT0z%hLqaM0Sl0e#7U{#x zLi__Wi}U;Mu&IKi!YVcvsCv-Hmf2+20hx8~9D{bH*%2?p*{Wf7DmrQn5mS_uS_b5r z^B?gJE_QzJ1%+LTzWWrwviL0LNPanSG7tO_7R7l9S=Kn_WeYjRxCntX^pBQ1MnRVF z0NY?$Qbn_v@XI7*3868S9{uwYGwMm1(L%_R)kHS)e`%0Sv;jMY5)%a4#2JuLD~J_i zhxd5}#ydtkf6G&f$8YL8_G0$k;U!mUUgm4UyfKr zT#a|D@gA%wTyqN=pq6k{kwpy^VOdj*^P>tNA4UX(E1~gKjM`nj#r1|%@&?~32|3oVnQWoP zsiHO(q~BJ}C9sSZHR{IqfdkkeL{X%8)`?A+7?}2x@KM6F@B0&46_$K{H}3&dJc*q` z@|H+!g(YvLlrSt2>N(nZ>HvDMsji+?cTs*-#Mz@d+f>&csVoWDpU@Wo`?|Ue(}=n{ z{+Rd_2Mz6I+hK8;kRWy=E6LUQLIPobSTtf0!HXp}QH%Cs(yFF70%_WXd|dwx0$`jY z7MzFa79jFE2ab>|j9mk2*!OdT*l7{53EPYXF()HG!)CysaGF0m>1Q{Sr$h8`6ZRPp zHJP;F@xYB}{FxVNPWFb%KZ#BsXnHZ0CfaWIQaEYdG>zpj26^y|&4pP!SF}+;a$<4* zSuBeSDhZ>oe}SxoQmq)prOS7HtTX5bldNr8Al!p~HC^Cy_q?R2VtNK!GzZ z4~TN@G~`su=W!jZTi%A*$PGq_AFj^>s(@2?Q1HkU{Rh2( z{C$e-7fiLr@Br(5_G}XhII$K>PO(^LU7+UJ7~HYBjkG@;2VZqq4q-PQ2op!i&5p1h zuceFiLtIm~;+y~lj;R&Z@;4I4s`H%GvKIH0mAyAg=S7fN^qd$fZ2x3rIb|`Fus$&*da`;Sc7}0jn z*O(Ye6ZOME6Mb5=BDK)oF0qe<7_Pf+fURpSi)VZGit9bq_>8Oz6u8&>%@E|C|BY^dA3mQKRhIhfpZ=A$D*> zEFIH``=!ma1Q;xul47Zw+pvO>>Cj^-2Qn7SZ8!WR57xU z>G-b*8N+k(=T~UzFJYa)WfDo4rI0XQ=f_Ar2FVJFa1%wSoEu1l6E6tWytqA{wRWSB zvcJQ1C%y&49iY{=6}y-@+r?f1Ti*7Q6zSB5J;CDD4-J0e>jNI|;8yXEF-T~3;a`RO z(^R;+#y^o(T?l?ed!X}(UM+0R3UR13h$~>&_ViF&lWX!%)z-L8IM$8Upf7e4ShRfp zU(JMck{3TliQCJ>0*e3<9>Zh~;W3=A@hmIG!yR_yH$RU`@vN2f4z_Yq6Z2v+DOFf0 z1NH)6Ig;I3VvHql4}t-v0Jb7o8}hlOhHTA&mE;+NrN&UaZg2EQ{bWtUvj5EP40~w6 zzP^X-Yr%+q>>v=yi=7lWl`Nv1LtVe_8MzE}f0#WGz%>gGVH@C5E z*&VfD!OtyYL(v$Qq`q+^@FO3-)qFHX~1al&xU;D@$^ZEr(?kr z{S~Mdkf&qS6G$Vs7pj87z+YID4g^zD?cX8#hjR`*W{G8kzdixQzi=oXam}y9VWBR0 zv40^aIXF%RNN$5LO9Sa3wAekIZ*UG4Vaepb!q^wIH+l^`+@zY2#)BNRxs6EQINO6j ze0`<9X7Ocr;P62Ze-F}v~0W}#=W z^~#KGbKHYXHICLT%s;GeA{+x|=h5gc_?AhWUC#%|&E%odmWE1tj4jHg^F={8tB`k0 zPgLyv(?#1Iu?XhkRgNPelMGo+Uk}hLF(^^%O$j60yIE@Q7_;g>lLy1q;}R=m!g(cYN$PpJ>|c#k1(8mQSzZ zMcUnQ21TTMA)6liGyZ}bZ(%7I|6P=1w$K*ZxDNqEt$&KNsf*Y2Lei8*;YL6*DITco z4kX3|M&pE1Dfm-7Xufdoy^ws_a;L}UMrkMghrL~P)TA$wH7|N7gp)(-pAz+ioUK=>%U&wR6%`wTMdod{&mRWr<;EX?F;+$=eVQ1n&W`c4$Ev@ zqPxDwM}dMb+Uuv#CLXH|2Hdt$Y;W(e_yNUoN{x4D?KZrwJASq;&0i@uUz&mj17)(d zF3%LOp_M$^lE}3Zj?TF61=#vHI2Xs@AFb~69G$|%_Hr3V+DE@=yu`*?B;gVOU&K)R z-cKjroF~_#ugfOGdu*qhpPE3Bo^8Xz{{T8bO3Hp5K8(Y^Bgbv{O%8Fk64o_shoTnj z|F8T_2>G=p&tO?7zV&6R{r7u%!|R0y@wacnV^jP%gh9N$d;Qfi2?p#SToO~ z8Tnj?=@d2Dn&en7xuxB9PF zHV2N-4naygF#eGS;HW!JvrRLNUAwhb`J5-) z1ikB@CHng!;Gr%t)x1{^dIh{_y#t8P#!nDz_Pm1%?{b??iv8Ypy)d<0|qF1 z00lJu@gT7dy$JqnPp+9UKlK{s7;RPbkSw z_I-;$$<)LYaLVJUE_m`bN5HY~4j=&dAD6@}eiFq_GgHVx;&VDi(w^a%EJb!U5;c)o zd7c&=b%Y7RL4l9mXQypKw<~N;w&Lt&b0#DCS#m{IrDJD8%!1!h!2$xwkT|f_Yw3yp z`&T(L34)mGFfCm2cMkmgaA6_nYOMR@5><$gY*j-B+zs`0-!SqP$CA% zApZuEMypVP{C)Iwyc2n(IZ(xdbYK#QLq{f1Yc4gn-llBMnIOkK<(`)J{ppG;Ue}ex z;|P$w_-_Jl1CX`6F9odvq`_!(Bp`GpAhZL*bp+w>LAcdhE(0H25r_Q-d z_Xzp}$_B%SF#Dsb!WLE$7H9G4UWgevF}nUfB0t9#g7g-Ac^Uc>)8;@Hs>h+YPWi8b z(D>mGhe)TGBE)uL0wzW-jMh$=_3~Nt1R@*ePf`ucB`Ha=k;_FuMJkRU^s&-ts+NSp z`giCLg?avfVJU1$dEdQc3MGVyAFYlAHG~L+7eoSnrK}b-yt9R7y=g^W#UFVX2Fp&7%hIC z%U?wQO{3m|Ry@LV-0}lHoHVX5a3(AD%eC1{Sn*<3GvFMppGYw*?&xoDzhN;onuj*^1p=P}w+*rSzfVY!d3!y39Y$~;wGz05A_CD~s6 zE*V=Lfq@y=FTTXbmiz&-OASnuT}!cF#y$>hFpuqSf=&vVaeFr*XzggMAf=YmnWT9Z zA$z~w<3wX{UQC(99T6=@@QUEM54HK}2z?=H3r}Q%P>iu}7tB1iH-T=VlN+izea`{n zN5VCyln&7L{&NSRJ6v5{C!XPmNHq(p(J<71xuMUBs80}-2E?>{ED&ld<_}4D`OA@F z)ahXtq}dVK)doS@&yN`1jhaIA(c-k_D}w4F`iSs7&bJ^bu$xSQ-3D1m)*Z>izLQu* z(?E&N`u<2u>WkwA1^Ln5NTV9h>0fI<1H7bb$EUyn+Z>@}SAKs2_Z=9_TJ4yG2UeUk z9&eNN=bC7Obx&jSc{;jF+BAje?E-l4Dil2Wt1Sjec=$Mjbc=lCCz=4A%hOo@6(Z~# z;qM`N@(%Dd5@ejV`KN^QYMQCY#}<&Mw7sQh3nI_RYJZylAd?&y)tI=Thq~`;{a4oC z0(r_GCBN|KuMGM^)Fib&=BIC$l9cW}F30f;X*j{Kn|47k>(}{Vpm2Rk+wcQw zQM>Lr=GwdJZbEZCs9^}2$zpAX)fQ2wM)2{*kv?u{$2x|N6r*1l>ZwK~&R%~fT1VrM zQ?PWpoiHClG{cyWmQq4faz6OuK3e8hYv=8O$58#S)|Tdar#?sQx8m~;91H;rP`Tcz zJ0Wc=g?Qt`M<=}>!*R&ZXvJCRTKgp#k`5GstqNgFyvrkP7sSv9h9o1uonW01n2W^y z!TtTqXZF_$YK)^VoJvDSu4~6KsC}Zmm=Y?_KvUNf&^LW{BhWm&5ox>8$_BJD7OiAB zBNm(uDi}zhO|~ptD_gn{DS0wMuhpIeWs52yFQhw1CYp(py_O^oELArCl_U;UjLjFg ztZexMoM#yQt6M-ZCIs0+>Ay$r@nDi{MIF5O?ywgx;Dv{I)*9U4)q}(brJT7uK2*b?FXLV_u-BeMdXts2(Zo#@QVcn{z}oY>6AHNbl{&;V;Y z%~-+kBMAi4?Vw>{J0Ry|ujS3?k(+o=3Ofc4OmsGFSZ90SOo1vQ9wSwyU4TG-1T#g@ zaht*OhlK5;();+RI=|d}fp#R-EhptgQABXP9l>A^R{qdnGje2PD%ePGkqV3YkgFg! zujBH!6hG>RWBaKdLp}H-u$n_XEVub;9HLta76K-@Gx+|sh}q#^-!!@hlk>CNh{t9dd6}v4rt^RT~+#iFy%_C8D_6 zS3Q6uT9=$4c+v;p5lzAcfSqCoAj;e02OvM-4?xQ#e)w-Td``;^FM*?ROcV?wFajZg zcMS+-Gr#5Xfu6y%C@sfff!r-oifQcI|Ic{*MTZ|tm;p5ZmY%t}0>1{v%3#*`9$sSL zSj-ctcu6elrIlc?N?76Uganw1nHqv|Lu|1go-xsT%=r#N+k~%=WwWPTHa{n34@Er~ zrHMrIbEtV%>Q78~P3nXXndy9PpZo%Ds39GH##I0RH^ny&!14d}6pJ|}W*ljnjfrdG z)~J%=kclFDlokL9I#@6;i*pChVlig%2E+b%fKT^OPZjB(ktcFNVj?knJ~Zp0q=+mu z0$H^HYEpLgV3j)`XTiHX1*@h)4j;o@3lGZs&kZHE8Gsq{KMS9X!Y8bB281tu4ufIu zXP4Kq(2ax#7=>Li9MiWjO7D;tk5~Bl9voVUpOC^2{=&8Aq_k(U2EEQh9^F%J_}gi( z{up^PwqQjlS(+P)a$#w?6bvIDl<1EnUEj;N;lr2*cPuy!6w1Gm<2?ycm8`poKGfFH z!R~u8tmFdgN_;wmEWrqR59FZ7{-V|YB}#j{1H*NA*&!UJfI*>A z>^RSeRx%_fr$^Msz}>^9KYxPb3F;CuZt$19Sy){P#e^%^KD`WtNtb z(%{aPk<~`uM?mBN4CMp^-)q;`M#z4JOp?CsRCF%Q23NfAaW1lX%!@K*^U}$(c}Wgm zcLO)?`}2`OcDu1IBJ9G8KY-awI>+n>EgZA&3(V4)dSp6~O7z>CFVK3$5BG344sDK& zmRn6wf4IZEWu80Q+5||i?beRFg|k_alrEf{h@VmJ@>oiJ9=%Kj9R;j_VwAQHr&VNP z!yHf4LrrLq-H8LswB41-{HBK#clAT2{`0Mqy^yEMLB**#cmA> zv4v)T5-X%IkURe)6+15d_aY38D!nK88netDUxa~1sqRhGCOmHOMFk-b(yHm0GGvjc zbc#$l4}L#{Up|oR8AiXf*$lt4FkzHr$GTpcFb{{)mcRuxVKz>sEz6@PIF`1=O;6}t z+OqO9^sGGk>k2aJzNCgUjywDmm+I=OE5ZFAXgqM6yHw|1HPrlT3Pu98YC5IP;TXlQ z;U|u&5ZA0xo$UjdAN0BgKRYAl<}x+D#@`|*FAJDJ?9`3pAMtyCKu7dy0H*3sxRH{t zugdK^kCk&W%#E{`2C_Sc!{TuPn#C|~>oQnPGM8s#b%%|9N8 zQsp8&zQ|437<5b&jb9uk$V0$9@u(Y>WPXh5>r~Rt;|NvkF(IZ2jK|(}0?$o2rLZCn zl%_m9a0O)?tNLRO;sGR1q#u&;iT;>d)#W_)21QIUQH9I-xvE*a`OAs|ZnX(Upwn|{ zV`dd=O@cU4L2p19&ma{pwP_q$NY$$3zPmZX7 z#5Qu1dQLeh(MWsqd9rH)S?ud%rHYr%#7l9T-z}=P(z<0J!0MsB>z{kRq&zUiv#@Ig zB!qNhwOzYl-+RdAcbaF9n}Pfz3`LK-#ns53r$(@PJ(r=l&eCv%f_?wQ76t zvyFM{EZPSWSj`qHp#ym7SE=rY+&JvF7p~9qk0qLfsPO5l-1-xCeSMw}yKemX_`iV8 zH^C2|Vlr~n!fOHupC$O&);iqW3f@nQ^^GWa>3 zr525f2CknXTnAEdU4!7Kq8H^Tx;z_7C>MWf=SDKDF>|I)PQSE(9wZ%xvFop`Ap@%e>4(^py&5;JVuwG2 zdzNB%z;SUKe|aGK1UxFl_MOE8zG^x{VIqy`^HNLrjJWxx%-lpm$xra1F*E-riey+k zL&XFkl0Cr*aWx8b7=2<;(x$KC2@Y1b!88v{(AN8G*sl|EU!>dz{7xXTf=a@&oQ_g+ zfMlD`S77*3%MSr9yWa^!QApUP@EjCLi@{&*YKJ2?8Ju1o(0wMK(d+0|-@-$ggk$e+xdR${Y6ksoE2 z^d~d5*Qlb^e=VOS;(>A!y|8*PRs#cU>0})8oClRv*ihhi!cOA+b)#BX7`QH#zw872 zbs*XezbiV(59>=O11;p4kG+sk=7iV*=_TZs%xBO)lk=4yo56(qx`lY^ra|)i>gMwl z(FkN}Px(xNQCv*Yj`{&fM*LqW+PhP<2e3tZ0DBC;PO)e00}REnkkU>9MryA}wC57- z%}D5PC+Y7m4AS4(IDOJi$p9C%ZYxY*rHhV!RP6%|bNR~5`R{tzK_49wwwLC-SnIde z-wD4`8aCeTpy`%yzL6_}*$&5~9acQR??twRu{GP%F2^Hkyba6YI^|=+pVZaTWJn$tLgg67+%yoP32``%i8G9e>gkrZ3 zUTz{*Zggi2Ybi7VT zp(D|kRM28EgmL|>SOuF4iG0L)-u0YT*WhFN$JpGuN4>Iram1T;foQ8hY?0r8sHlSG~4adRfkV^!y+k1DwAqk z$WN;=l9(Dx2{k8x9WMF5ix{VmtwzQYTzucajjC53MRKHGdr;LIyHtI?!;6#3d6ZLM zRDdJg(XCn4Jz=tS(~))*OJf&gup>4}c-d0-tyI;+%4WcP)0ZHeRobfcUm4q9Q5MgUlRwDDhz(l8#GTeLSZn8CWeb0;~SD z6i>aI{=?6?nF9gXiEl%JQy9Xl7df;J#8XQ|JoSBwLQhyBsb%^oiA2vpeFv?$fcvEp5LzaFh{R#|^hL#*xCYtl;Uq#->8Fq%Bhxr2lZTOo~ z`j0Qn6Zq~Q3ow_oBFQsXW=m%vVC!WiZurwxtb0HkUHXz%SzlTZU+AXH@B^q0S65hZ zeZboB(*V-!eQ?lsx%MJJYV5)~8ufcn$-E@&v%E*s<-F+AAMH|{dp!(*Io~5XA{eFM za@YhaThc|~6Rq`m(Y$tP{AbXI$^p0xeT+|~kNsN5<-(>EJJQS6B7Vf5$%tUQhNu#u} z9(cv!*a)(Ik)I=$IDbsENb%MYo6ugTaq)QTCNlSk<|*3h4Q&+Fv54%Q z9}ThR1XH*K{Z!=2egmbWAjf%MMg)_A86PTLbP?E7onUsb$r7#xlR7fzEhm|14D;P^Jsp5fKZ>XeJ zaFzxl0B2>Q=`c0@Lo|&OWt-5XH&o^~m{UY%z0AyY78=B%d#X1yu>?>IPL$v=+vu&F zv;>o)bWJnM5c*{;VahQOBf)1 zw*Ue_R} zRfLG*U5MWf58I+H>UUcXxsI%A06jnc8jptsaLz?(0Rf*>;CBsy9P6;%GV2{?JxSa4 zB98&uWKZu2^40XnQ;+nXv>X(|bBhtmJA~g?a~)}T&c_}v005-i^C+-;IvMIq+#r-& zMxosMkVDoAOCvB9>K);+-DEim`=J+FK4Ca~3rs?8Iw*VmQeXLI3pSg`acsdLyYkUi zvH-X#rJx?-!SLP>m<6OY`fj5aZoi#gVE#>rIrRM;GQfx;>SdMwueeUv&;1~vj6!l;EeYamEmQci-r%+C$pQns{);aJLrsfq~nz!Hdp?pZXF0Nn(w zMxOx<+yd}&3%~~pfZ8VFU0M@A(0dG;hqhiH5oD$fG~4iVBCqa2&M_(g-gY!d%(AQhg9I5c~g%=nBbhZbugP^cTA@cdQ@@*2TFNB55M=7xO^G1~G0l;ac8dDzixz$IU?8&fc?4i zyoU{*U<8O4E#Q+p18d>JvI3%QL9<1>on5X&tEP~c0{QJg7|g@=4U&zd*ohHt_)JC! zp%!L(0XPLqtr-x4uHE%xXp4O>4ibuuQW3IoBIsIDuHa-_aLep2#EzZEAuADF?j>eP zoF|L$@g&Yj6g}okG{6kAx&h`NfFn?8HOH56ShzLJCa$K%#G`qAvkRU^mi3}v57KW_xy11 zed;?Ze*=HN!XNoS2A#hE;Djq>ii%(5qZRH|DS`2KE_*YAuQlN3lY^|Zy~M$m&bLX5*(yVt@4o0FyBXU zF09-S^u`&TZtkPSkGD~X10Ddl9%6fhzia4MbT48Xe2Xo2qa-{{;_Bx6s>I>BICZX1 zZT>LK$C!Q#eC=xfZje_7GKU-RLm+J328A8*=}TVsvhzND-OqgNB(fKNg&(_<5th&w zZr4kn;nx1Z`9$~;82W8ot=}POYe~(;+p2YcdMBa}(y9|a{l_^x{Eex-87>4c&XDh= z?PfLPO{O#M#6Um50W>LC_wTZ&*IB7zZ zri6+viIRlVmoI8<7h&j|>tBgw;r5dlJ;dp^`2SK2$7k&GxM29=cf)3PdEm4{tWly< z0^ATvIN{ELvs|D1is2p^Y=w}-3&A~?Gd|#tY@-L2_A^ z8uD~k7v=>ru zRvda@!E(%MMs)`synr9|GRHEgDuO1!Va|<24l*_vIC~IwkolysUb*)K(i3xFo*j{$ zhh^Qm6-hdQf5@S^al`K!?Dc1CIdn4E8@TYl*?SYP7{B)qc&3{6no1Fcp=>2eBti|9 ziIQYZXkU~{i)2Zeq8fulvV4_YUnEP4lFE{VHdK}tOD3U^ed+z2XP&{=Z~ZUt^?%>% z`aN^qb3gal&waN0oaa90;Cqu2s;OR`^gYwEHW|}0vQlfqKi|~_mSP=WaLGE+hVR3i zi7Kvx3c`+i4kh(kx$)3GsS(#N8w^dA$Oklsu0vhHqCRX0L|uCQgJKYBn_*Rab+igvFOnl&jiwR$ zl%&vF5U~l~s4}Z*v6ja9Kjh9UZtOQwHf<_YiKu`iMZ#Y1gaim2*5eD!1*9LcH8cWN zpTJ!h)(M(Y1d)U%*h?|($etuNIsOo831G6i6v!8=2;5 z3rg%D7U22;R4NRnHX{?`^b?SCyy6S=Oj2*|!YGY0x=N%jhw!fJ)YJqcj2f(nM3Shf zkKGOIus+a^LPf*pS>aS1Wl4_yu4$64d0J&DyY@eYP^L zDBRi_N)V90-j}FF*uF2ZV#kxtLqO@7V>SdWSiKtQN_gH%d4_99bCiGLiwYy+5>Zr5 zU|_AK^%e@0|A-wv#2T7@>XL*(=@i=6P)kE+Be+WPfv?GJ*3y;MhPWjA-^juSD#MUE z^sWhHHqj};3{0F7qyjTBDhm_D`t4Lk)*>yxXG9>g{U7@dzlNlfgb$J=oTM3?#933n zW`{D7WaoR$GqeUn)VZz-y)Ps~(w}PDaPh{v`D9F}fN;5iD#>NI>r1SX$c~pm(&Ar6 zjIb7LpbFmFu*^Zaf@^V|%|Aw30BREZEE5+BFvWZ&V&KcxL|6%~7#3T!hB-@o8s3Bs znAmSvIQ%&nUPJ#jiF8dry>{T}b*{zpFlTb7%^lePozUCxbyO0NAp)XCT!}pTciam~ z9iRkZcnw3g)G|A+aLPC8T3B)+tZ)kRxAB_z$3+O=kR-f9jUd5_NnWJv_{Gv7fQzK< z3~xo?+apx9pczIbkw`vt&9cFCIhgiKYFe8I`J8i&N3v^$1uh~FAS8@%CEpP6cM=0R zWl9n_NoHgnLJ!x6V|#SMlr;NG=-tH$qXNf{eZ(wwWr3pv!WKE;R0kJ}E@Tn?sv`~hu;Gs&?@zAGf8(xJI+$+zmX(30zcHJVT@?5@ zg-yy37qfA@tT5}C4r3k^&d$cD!)=0$;yE=W50k|hDkQiuK%Jn7w?5pO);8$=NMjhf z&P}8YAvPqCSl|QQC1u3_s1Q9u65%fqNg^Q;A|fh&amXJa+^XQJcsfknx`DcYq{fht zTPI+_=&$l@tKnabsPCWTd!!n5QUs-+0Evi;3s0cAN6!7Jw;q#Bnj(8+ESPF9fB+c9 zlZse%ZcS0wTj@0Qai1IY2}PJf(neHF-m6olZc3C}a)Y|)F^u4kT%0cY0Kxmb2HfI{-_%IbSN>R! zC;H1wAASM<5I$-!BBp`1W_JBFu%HaS|1=mt8GQR`fNRlOW%$o!c)06qb#|LF|G9LV z9RImgn^f0zfj|buB$Szj#4w~w_{EA$J_9CLWEW5`{31oPfMSufpbGnJCRc(9xP47f zg=?ZMN+Na0k$&B+$wp?P>p^n*6})Pli$8vTHp0X{#atkCr*S8M1p-nvt%Z|iP!9!? zDh`#2NvOxUm8kkq*+K2E@<~h~w&W7RNrMICPWGu7;`qN-bapOv=`8FGuJNf?Qp-hc z>Zs*-X%gQ_>tmx-4Dp(}sMZGEA`Ge z`oBmn=A#Rt5sW%f3k6`p+~K6I0YAf9E>S-eEyU5=bd_pT!rV*~1W6lR+tAICsy7vSmp2(%p^4!iJkd;kQmV}iH0#10d56T z6CJ=bl(`aVqYCq<(x`x9F-|bWw!?@C?6VZ#aqAIWI$_9^QS0Ik#v%+l=vdM?u>2zK zpt(plS6n{mjVWK3z<^c5XvZX{zc`lo=klreKK}6YOZ@WDeM!W08h(kNj=N16T8EKgP_q{L zNLeTD*o`S_X>11m$5R4b^c;FT@Ua=An;Jd%=(0G1O-3gx$Rk zfNqn;fasbkg&qN4jCmG!R$UUL5QmUgRxgssUzow-eg@$*Cffl!p&iN*;6yq=o@Yto z20jTAHwz&w{dEXhn*`k@Ae|~X3_=;*ob_6%A$-#B{s?|mCO+E8|z&`>yk;)qS3f$6) zKt=JSEqkVj6DJ^ig4V3P=S?BEE0Isg!~($qD&>^rPvfm(W6Yj0uP*fAO3S4BOiGm5 z$UeKZFUcB;JC4fZ*h==q%I_uIgsnY^Ig$c*f$OA@G8BDap;Y2g5_{Jb(I*Ul;v7Ji zjV&BY3f7ZK1a(zWIaKcGMB&nTc$t_O$0unMZN@N(UOEBqg1b0v_7`0qtjSF$lHy!Q zTJ+&`txK_Kl3uSQ+cdRtv>sUzly?v`K|9GlahyKtlZ|kpn)R5I)Xko8(U@?NJD=6; zg+`YqLb}8|R`Ez{#B9%s$hSN}!pH6mhApP_OYu%F2gNGArYg7VDpsMyhvrPeWo+AV z_)CrWDtN=1$#A_LeIF&iSzM3ygzSc%ub2!|Jcv{nq)O0NQ8JS?>3FQLL|}#XGaZ9o z0%_OW1Z6ddn}W@x!-X}!q{D!^XI{DnfwaOiCCVjI_O08{24LJQ)a;3%um5Hn30pxP z2?&#uV+PrSnGB(j2&^b#-A(ul-$cecsGgAYAyyx2B`Rr#w=6zI+aT>!n*W{jiqrUO zs(otOr0=%LA(lF!=4f$xeG=11kHHn}KAvsJ#PQVPvsi5mw;t!<))m2Zc5a^7L5*Pz z*f(9wKHTp{v(H+o^zX2bW*y-o%|3B*z&`kVE}YuIq*&Mn(Hb(hwNkBgc_L+kz^I}k zd&|Y*UziejwRK4L5GDhwk%F?~R=L<>A{Rp15*tG!LYz;YP?vmvK(bLuH1)9fvr112 zrA;OGS8i5VR7G3=*SU%0iz6bLKs{)aLEx3rwKOm3q}vL%8XDs)U1}B=kL1`IZZOQC zxk=Fn0HF}sg9I2gP-^qdi@7OsrqSckxjL!?3lPG$eb>q$WYSur^2|EkGO(IJOf z^Nb?ZcJralo<{+NMJd0AcFa?#3bYtc?6Q6WrR?-y?!fdLq zx7Rmz5RP0&jR$s~-E9Q*_CkH~C4{tS>yZ#Z?AJ+=D^-b3aG5oG8ZL62RzgO*ky2Pj zvZz_Zv-7-UTIR#;inAiA=UUXRQsNrcVnpK#?Bhu=nj^8xO$jHobD1$@Fe8$`1_^$s zlytG!m<(xl{HvH~;E3^fq8~*{%ZikiIaLiSNs5F~UEF-KZaP({$-{Zdp6F%x1w0Zh zBSK>{j-tlk2@@(IjPQ1lT+CK{Y?!+#BiO}RCBe0nk2P~A@rJP1;Olrq$lx$ zhh)6AgLiiBR>~{J-zg5l&4g!;Ld~5tzb1Zl5YG5&*HvzDY0V&>aNIg%3hc5d4)1}6 zj#Z6ZIrfQbTxJ5vHY%1Q=1th)ca@7f2O=`a7{nu=-*BT3k!f)59cnU5xEm}YA7`){ zh4@kJs!*AEQqo1Bc(Pb2A}iBUHq!Whk!vNxl_rxEdwm({B74t!VoOZ#poU(%5 z1)ISp%towG$?&b|4Jc{~Lw#Z(#2LsI1n1GXfW}2MzD(n5G`>OON*dp$aUG2x(71`l zPiQQn@e3Mv(72PvA8GuR#tg_`BwaEzmZz~Yjn!zZNn>pq>(ZD*V|^Nvxfu!X2#t@? zIGe_2Xq-pm0vZ?5_%e;J(f9_9D`|Y2#&tA)K;tGFKcTUR#xDp?j4dD%T4F4sVuvVH0*#Vcv-uTp9v1cuXvylJ~-G+rw#@Kogco2PE54kDNB@F6CP68#Zc&jj*MCayC6q8%Dg1X zVwFC}nr(B1CtM+mU1Gv8CUM5zR>Uu&?r%U=@lDSLAL7`#J)l~!n#HxK4i84sS1X}| z+>lIaN}DlSXLoCh`{DAqJ)Sc1>53&~*oJHBJ}ItI07;6nO%5-lEUEp@_Yo65dtyCB zoR~IkgpI4jASGiB$4a^lgV_~o>j{rviWd0_-F_g&E+m@p2O>A}_3L&`$@%Hv9ktYl z^#Kf5;`ITt4dElQan)W(Edrp!#Jvnk(KD#4M}4dfi~i0!5jRoeFKY!T+=)zx(A2p5 zw@XCtFu;r2dI`BK@l^gt&@gYJ){1NriLiF<$4XTfNdh#E|7L~izZEkUr&uJaA8Qn3 zqWDXMHo{3?`Ja^kHzMq$vWf_0{!WCDu{Wlp7{%GN7pmO$zzQqoH{c%=We`WLH=@^< zB5Tl2c#$m5DOD0)U`qG*`JPACps}_`ge!Vg&Y&3U9MCNiq!2?oRZikHIgm7p$96 z+g;eXp`2wHkvd?d5c%qd4ca)~)*==$trOKZ?1oNc-nkfEf)#$m{!i%{+VkGVG-=FT&J(y(1Z*X1w z!Q~A?X>IL``GRnYlz2u$P9?*H3p4#zIWo7Wyx;>bdUp1vkEG3D>49|bgfq|ozrq=n z|834tAGumtsII~((yh(-;!pBTMl+J{SN})(#wbiLCa`m>#S23GPYTh~NuBsnA*_{3 zNd5TRC6(XSF#g)0Nll=?!nH}}+)%>5`PX?W`a2uJU7VAxB%CH0$a`44icmTy9>=*D z$87{xs7-}-7{~4SFVF>ygu>!46K)LS)U2DHu2cOcS*ga<_^;>ZRrEhVEDC^tf>{kW2u;(VqwW%XS`*0e>+-v#a6(D&mo^Q!iBLkAJYleubU7{sXeZyJ#W~;!cI%TVG_=(S*QoEwuHsqe z&moUGWCv^;%_UxOnOf^;vF{%`tEOdLT1p6#tcz=X z*2VIQmOVvYJFg(afZiMydcX~1Vn*iNWHNsaG7CfGjEN~!?&PRX^*4ury?n$fx{l6< zeD=rsFl+HfyrU-ISdSuXt6+VG1FQr%6XQhIPmJv-y4xj@B$m?zrHa3qG8jps)u}0Gip+X z=SavRa-5*Jyoi(uCTC-?oDn{l{B`GlW`-;NY+E8l2(LH| z>^@{j_E}O#2V?taCBd!a)Dxlty$zZQAaNoriU51RsoAsmQyRU?`whBP+$pdEVPQXs zHrWhKx^K+U(4v1{c`JH}F(IiAs+3k%xlI1}ZJQ7SJN^v*OIh(CNKuN+krXJbIf}NU zGKp5ei)aV_&^r$#OcSc~01~~&fQx=|i0BUN;G6^d_k?vqm1jUAveZz@GDe`JW?PNu zN-7uaM8&j@_ zi**65jp7}3dh|Imkro|9FyyMKpL0)bYVK*3^jg5$01u|PaC(i#FFdgVJMj@67ecZE zVK1shWL8NZ!4`A=_*j@oMT`Gs0t}Ht+qRTR^;4| zA6CimF1Ese6oK=QB5;4jFIF6!W-JdT`v;y`!kZD*OzT%40*QHgeElEY2tm%DX3q?az)a57-D;zupQR8R* zrpgfKJ&|kJU!&1PutXTBkkV4>K(1dZI4R85P3TtWI>4DFzMzDIE02gLaqJcPw4;aESvi(MGLHD;t!ch-X6H$)XnCg$^7s{esZsvJM9| zXt-iA6Yr)rYCO|o-Z|7|JP1h-gz3+ycx-FTJz4G~3CJan_n{Kx6hb1&3#c)dWK506 zAHUxPd5e(k((*(^KYIs^&norkL@{bjgasL|RmwoO2BJ=4?7oS2Djbm~7P5GJc^MHd z#Un4!DkowY>3>9QI7Wxo&l}Rh0AoaiS&Doc3n!3;Ynm2y@Yp9+wj!X2S0lvzPd2md z1K}m{TZ76>Mn;h=DtcQ_Q9fuiRT*)RG9!xGQtrW39y}^6!&$5Z>0O43$Y7h3e_!A@-3u8QVxq+N5C(Y*JsEg@`{f_^kB+ISJmA?&j(M|h4eqxNR8tuH08EJ2H|lK$j1)mu;; z&=ir|T)++m@T;CM_jwZ7N4`ZNzf@ROG2><6l_98S$7chRJq7De;6*fEoYKKKa{#iW zN=qWlR#RrEO+uAdgkBdId&LX+3G9-g8KUo)K%8N?uWw_6rrxN7WgX59{)_LOs(c$BKMmxMBng7 z>J+;7;yee`cb_q=@p@fd5m7u(RtR1&fEZCoSuJ+VbQ@I2MR`i-fPKbrwIgQQ8IhYgY}yzYfYgDgT$55n`y@xKU*ZplAg-wchU91Qgva!)F#94qeZUt% zy;wA>LY#>47B9iz()p5gUHC+p>0hqc8xJzpd!o;9Pq)LQmjdmxr>0oaK zLoml8kTtX+Pkg77_p>-bNpB<@J*C$J1E>=&<2gC*mvBBa6g_DMom|@gW5DVr75&3Wc=7{N z*!zpaG_3`!NAZxW_}7@$iL6?@wqXMZ>lR+1G2b)x8H3%yj_qQoyD>tQ;0pKcuuj4< z4_!Z&J3CelGA(28L&~fLWGt5<=_09OpMR`?gSGhApt!|~fd}^a7R|7rQkK^mF^5W7 z3-N{yli28l&BVWM*fa#jtmG9x;_$Epjc_2nq94+i9VZ(xLclVH5B@dzQdVEQpdBz0 zS-tVbeSe7)-i?2aQ_7MB$)YS|@J5Q8Iuj_6>gCnM(go(fB>$*CrbS~|9ngNq5Jj5) zkEd(E6gJ`KQ0l)A^*@;UH=zCxQ2(jae**Qtg8C1n{ufgJ)2aWl)PI30=@2dVrZ!H!S!yF9x&-4FR4)mW+ zDm2u89L3m;#^E&HOyfA(T@a0D(Ab>DBWQQZH2sFA@6x!0##uC$@N1}pINts=Hly)0 z8f(*7;{Mog^iG=I_nUbPxl;qrE!y0VrtN8LKw~u;f2ZAb(D(_B>u4;Azl5gqXuO5? ze}KljX&gh_C(*RTe@G)EhNP^hS&Sv-|6Ob{Y{W1VlfU{-HI|DU>aP0gypzI?o|l)% zZR%VcGU}jb>;7$CdqyPOS3QvTAgWL6ou-8P>g|U1XB952IvFizl=m#T_r=X#YPr4N zaIzQkmY#dtz%7hhefwUowkHplIOW{#ERC<>&rS>MR&*r5YsDvzZ!gNclN?={n)QLQ zo}S~`pWms-3$Jm4EEcNy+dtvD-3eXlyRYhr^tj2lWu|_MSE&xjQ9SthNY1Fhv{MuB zmgV2K`c!c2abVqu2-ilN3YEJL=8dm9dd#?f;8;e3Q;bvXweIef7jrt#^wYb1diIWO z=PTF;FXZjXlNv0az*=;wUiqqitJ2B!tAdBC+xyKu+S|Q&yphk@&D;meWS8D&7I3Q5 z4AkzlC&r&#+BfH{?7=4&(@k&ZiT0JrEg$&_n?;T&q-v+BHs`A>USl+ViTw6JuVkjH zXG^D3K!AsPpl+S9cll+eYW@X)?AI}d4+;i3Fp2x z_I~JLXLL{N?W&p$-uAb@%ymEIaLXxYY&fG}|0Co4+uVbVQ);)>jbC!P>cE%IyEThj z{U?2`4;pEk;Cs9>&+T5Ak&N}z-qNOv>=pkkTcz@F+)~!`Ke5Ds+ADxxnS$#5m%;Y=IPefM#p*8Tn48Qw>FbyTo$8i>3TPG}DqH@G#@d~91)hB;+ zDWnX_Vkn;6Be&W*h22rTUw*yc8)l#HC9?ht=6HN4_w|lhY8Ke@nQTDNGM(Gsn+$6b zT~^#vyD{aVZ*b$ePoLTgH%=nNUhKSkQiZG{Z?QoCE@tVZ7>?Hhwkq6+OXuSYgVDf`748!E}Yupa>h_*@oCq?U9}}96_q)HJ@rF- zXEn^vF7etm@Qvq--TN0uD5flt%9K^uZE2?37Vj$;+HDSlwRXzIZJI0c9%UJxTxqUz zR(aRP>MbgTcb?|9KUmeT@xIdS>Y8;EAKiZa@$^H#ApX6+H@g?c&L4R0eRE`XaOC7% z?G_jLgpkGTuIm=EKCVhk^{zeMoBXppKGt*vxZ6|&c3=KTG2>OWO6^R(%(Rlz(qr5Q z`X2t!-L2ALvcKK^$e;;R7FT6GaJgIWqts~CVNo~QIjbP^%AWj&H5I2Ow|3%O^g zA*tm2b>o!N&WHA&(Px=eo==gjy*Xq~!_14m^?Jir_?*t0;(l35$8W(_!(fBag-U1k zZdAUc)5vlWwo4h2o`7qj({rtd*@#QdMusw10=;ZHBUi6G>@vGFmFp;D4>egmf<7!fkh-Rhu77c7Wu(G3jjYP96u-lOVrbDw_Pw#QoO8#uP74!cKY z79MIAy?$2tR;15wxa586%Dq3c7A$B>x3wO8BOuuSTgbAk0FyE8E(V;T3UW$I%yl*1 zn%OpCBLq#@+#)AKn_|pDi)j7m=)+I5I3?kqjkNJW64$BnfIAVT3fC1RfT+!-l39u^NT81GR*Be z^ZRW&oT_*$RoG2|al@5oQfnjd_#AZIxjAy?g8cJZff@VnS_%`ktEMJTPpfTE&%9Au z{ki!?O8Mt^uC*Say<4IJ8ggb@rN=qWo2#MPy{DcQ`(B8-{w}WG_`?C;yjxsaRt-=n zpW|g-IcN#1JL5CT zZ+tdO;^)gH?_55!;N%$Z!$+p3@hucH)B2Zv&QVAx&r)+-(7s4Du+#RYW&M&3swLr* zG+f?F>2aSIhXfYKa3kv`*P3mYZ86$-C5Le^E>5SQR}y#W{CpR`G*RTF`uaeZK8{9O zi=xexcN^&pdZ^2oputEx=WN2y*zA!dsB+HP()~*3!#SPpm$x1+X}^P?D+R zn;d66Fe80PUe=W-pVAw?jlJ>q?#geXih_X5m~Sqpc1%!6Kefg@?r65Y?$Fm-a-&Ar z8uST^G?6>g9Kw578Q^5bw_Oo=YJump+Rx?emgedkIX6BD<7%6xXr!J{(i5J&7LxHt zA~!$Ic7dL>T%dWc%a&Ru@v5qWC#E_2N@vcDF8UlbE4JLjzV8+D*oB>XX@4A6J^dh6 z>rWlV%%?6Uj$e0pc+}Q8N8Re-*lagD`t$T{Mzt$%>)!C_mLxQqk)Jv;S(M+mvOYuh z#oOqG$4k5?2PN|Yhi5oPh|Dy`X38n(EuN__Z|H5Q{v_&f>Oo$?CLf*T1A`2bE;JRC zzu7CSZ1ZUNR;1V7Qh%YjK=W(mVHHb$(!l6b$(HBzD?>hNmHS)RwoF_R`E7nqfcJw= zm*^{_6`Wr!Gv|FcnWd1|k*=}V^oC_p=r{co(*8#;E@1}Uj+35OXe;&Lh=N>ONxAH) zRYIBg?vAWHr*5j7EUMUdh~LbX1PJ%hVzEDZeNEiRh%%mQ+KJ+rDdmw?!5MH*ztX%hZhNVhJ1K7cWKtVK4Cjd zAB5@-NQpFbbXperx<|Opt~(LSA0$RQo}Id;yS&QkejXL84ur=qLUIpwvy9(%RyruB868WoW|<*R3dW4VIvv@N+V_6HxPIi&5p zY%`km-PC()QkE{)Ed`RiW#%saXMz}%6^Z40Eo3~_a_30}Bl`0+(CI-{C% zmwsq^RdMoB{lT!uuBXSf1k`_jHo`aWDNAL=6Z0tp+u58auV(Mr_rkr??d6k4!$ma- zFI$t$j<#KJ^?%-x*X>(rb=B8Bf!n`l%FgNg(1jN5i;-`bkuZ6fueBPSfn)30noNtIoDt*%rSE@ypX(vo#Id({+G z7@d>4WtDm&Ir8h0&BG=dZs|F=HD&jNL#an+dToF6y#KZDn38X@YjxGzoyMaQg>s9gZdll?ve92qvFXJhF-iA7OcboOlS$0c zyPA;TwUd8Qb?(}h>^?D7_a4N~ypa;;dB`b#tagv}Dxr7QWmG=O+@VsC)uYx*mfspc?+`r`q$tG${o1T)t&Yx6GNo$|15@f*{~#-`b7o^#XZ^ql_L_@GELUG4MIkH;onD_Yrj z{BWu7B>B*Yfx)+KhO9ZhO-ozd=u7Sa%RQCa>j#M{dQIFEw(l6{YIfP=74j2KjL4XO zZKHOMuZ3bIWBnmsWlkoj&gUXxMQ%eLK&54s(ldgj*OqHxofWF5xujUdz;jJ*qgYxVwooU$n|5* za%&3X+%Cyhhh!|w?V;N;FE6umT%(qK{Iim(rkH4d)#2qU19*{__OVsUOZ`rU4Jnmz zx6jC{f0q_)y}7IAYxH!VS30Bb&2|`cPIa&q>+IF`>;wA~ly!S$-;Z5W>pLcSd9`6@ z-=Gxf4+AZHHt*yoSPoBqIX7j~jIbZSm(2K?`-xKqO+4}a_HB%~N z(2IOt$I^!3_GQK~pYG3kX5+a#!!qDgDZi$NpILDzJ1MGs^nxc@)08$MN>67pDe9;xy z&%#5&cKy9)ts}0j-MBI2_MVr6PkwURylD25wPQ`@j^!(CI@}Uu+E>1Koyw9!V{;BP zTU{t#_mwq#h+U5<)83tUyR83+RP{Yc%L@(Dde?8~OfBnNJ}iq@RK)yNeb9%ySa)IS zho~_Ij@why7rc3`_mtH$z`-rL_T9!Rk7sRX8y3yjs8BMxHD^V=EyJ&%UqR(_lg5Ni zvptR7Ki%ywvuE+n3x_Vq)fF=@ngyLX?yMlMwR2i%@2(-Y4yvzPnH%0*%D!2zw&h6S zF#}ump5}VX4#q_IT&+`Mu5kOFRS~+YEbMy!*9YcIPStMD9CQ5JjfLtqvacMLc_zNT zB^+q|K*as%-=x? zTJ6#%%zE8Vc5R@w`-Izn-V$7`$Q&JQ&RuhN!N5yFrxTa0y8G(-<>0%$=P91t+x(=D z=G)k)BU5Yr%e$RYjXdhQx8&TItI^Du@0q)w?$FX#GRrUva?;&+xVz7~lBM@13~dM= zYIm+?Ye%e%!nT&YlPm31_V*cfQinI8dXmw+pf8u+-)}vX?CaDwGyBGhTgu^E-Ou^F zmSr`N_8%!{occ=DedrDar}J`4F82&s+_|aM^WdmGUfcGo-cJ}2^&sy+)1B5n+pFsn z6wcZkMxR`D;aQ%M+~$kDlY8f?c`eT7ym@i7)LI zm^Rxh;7HLok54O-yvtr_GF=@#WdrL!v&VZ1QRyVmuyL+tQlhug2z{fU?t`QIJs#F}U8b5Dfz40-p z2FBQHwN5b?E8V;IJJXpn`}AeKiu2oc zuU_ol`{-F8qw&iga5ppWFO^NJ<`lHwQ8QS2GCooEY);?wi%$-U@@|_hmn*|9*q=tG zDjeC^teU31X0b}X{F3oT$zFlmTRdHv0Rc{(x`FN<@!rODZ#)>&0%fM>v7)%+k0+#mDVywVW!f(pZ=+6zv!XL zs

pOrrQNICpu_0H#aCXe}}I`V|f{efCx54!Uo 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 la;kM|?Ns~JmZ{)W?^Jkdcxvq +#include +#include +#include +#include +#include +#include +#include +#include "tsl/robin_set.h" + +#include "parameters.h" + +namespace diskann { + + template + struct Neighbor_Tag { + TagT tag; + float dist; + + Neighbor_Tag() = default; + + Neighbor_Tag(TagT tag, float dist) : tag{tag}, dist{dist} { + } + inline bool operator<(const Neighbor_Tag &other) const { + return (dist < other.dist); + } + inline bool operator==(const Neighbor_Tag &other) const { + return (tag == other.tag); + } + }; +} // namespace diskann diff --git a/include/aligned_file_reader.h b/include/aligned_file_reader.h index c33bacd666..6f18aa2eee 100644 --- a/include/aligned_file_reader.h +++ b/include/aligned_file_reader.h @@ -16,9 +16,10 @@ typedef io_context_t IOContext; #else #include #include +#include #ifndef USE_BING_INFRA -struct IOContext{ +struct IOContext { HANDLE fhandle = NULL; HANDLE iocp = NULL; std::vector reqs; @@ -77,7 +78,7 @@ struct AlignedRead { class AlignedFileReader { protected: tsl::robin_map ctx_map; - std::mutex ctx_mut; + std::mutex ctx_mut; public: // returns the thread-specific context @@ -91,9 +92,11 @@ class AlignedFileReader { // de-register thread-id for a context virtual void deregister_thread() = 0; + virtual void deregister_all_threads() = 0; // Open & close ops // Blocking calls - virtual void open(const std::string& fname) = 0; + virtual void open(const std::string& fname, bool enable_writes, + bool enable_create) = 0; virtual void close() = 0; // process batch of aligned requests in parallel diff --git a/include/ann_exception.h b/include/ann_exception.h index 7939c135a8..bd350dbcac 100644 --- a/include/ann_exception.h +++ b/include/ann_exception.h @@ -19,6 +19,7 @@ namespace diskann { unsigned int lineNum); DISKANN_DLLEXPORT std::string message() const; + DISKANN_DLLEXPORT int errorCode() const; private: int _errorCode; diff --git a/include/aux_utils.h b/include/aux_utils.h index 031a64ba8b..3b94609617 100644 --- a/include/aux_utils.h +++ b/include/aux_utils.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. #pragma once @@ -27,23 +27,41 @@ typedef int FileHandle; #include "cached_io.h" #include "common_includes.h" +#include "tsl/robin_set.h" #include "utils.h" #include "windows_customizations.h" namespace diskann { - const size_t TRAINING_SET_SIZE = 1500000; + + const size_t MAX_PQ_TRAINING_SET_SIZE = 256000; + const size_t MAX_SAMPLE_POINTS_FOR_WARMUP = 1000000; + const double PQ_TRAINING_SET_FRACTION = 0.1; const double SPACE_FOR_CACHED_NODES_IN_GB = 0.25; const double THRESHOLD_FOR_CACHING_IN_GB = 1.0; const uint32_t NUM_NODES_TO_CACHE = 250000; const uint32_t WARMUP_L = 20; - template + template class PQFlashIndex; + DISKANN_DLLEXPORT double get_memory_budget(const std::string &mem_budget_str); + DISKANN_DLLEXPORT double get_memory_budget(double search_ram_budget_in_gb); + DISKANN_DLLEXPORT void add_new_file_to_single_index(std::string index_file, + std::string new_file); + + DISKANN_DLLEXPORT size_t calculate_num_pq_chunks(double final_index_ram_limit, + size_t points_num, + uint32_t dim); + DISKANN_DLLEXPORT double calculate_recall( unsigned num_queries, unsigned *gold_std, float *gs_dist, unsigned dim_gs, unsigned *our_results, unsigned dim_or, unsigned recall_at); + DISKANN_DLLEXPORT double calculate_recall( + unsigned num_queries, unsigned *gold_std, float *gs_dist, unsigned dim_gs, + unsigned *our_results, unsigned dim_or, unsigned recall_at, + const tsl::robin_set &active_tags); + DISKANN_DLLEXPORT void read_idmap(const std::string & fname, std::vector &ivecs); @@ -70,26 +88,29 @@ namespace diskann { template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric _compareMetric, unsigned L, - unsigned R, double sampling_rate, double ram_budget, - std::string mem_index_path, std::string medoids_file, - std::string centroids_file); + std::string base_file, diskann::Metric _compareMetric, + bool single_index_file, unsigned L, unsigned R, double sampling_rate, + double ram_budget, std::string mem_index_path, std::string medoids_file, + std::string centroids_file, const char *tag_file = nullptr); - template + template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( - std::unique_ptr> &_pFlashIndex, T *tuning_sample, - _u64 tuning_sample_num, _u64 tuning_sample_aligned_dim, uint32_t L, - uint32_t nthreads, uint32_t start_bw = 2); + std::unique_ptr> &_pFlashIndex, + T *tuning_sample, _u64 tuning_sample_num, _u64 tuning_sample_aligned_dim, + uint32_t L, uint32_t nthreads, uint32_t start_bw = 2); - template + template DISKANN_DLLEXPORT bool build_disk_index(const char * dataFilePath, const char * indexFilePath, const char * indexBuildParameters, - diskann::Metric _compareMetric); - - template - DISKANN_DLLEXPORT void create_disk_layout(const std::string base_file, - const std::string mem_index_file, - const std::string output_file); + diskann::Metric _compareMetric, + bool single_file_index, + const char * tag_file = nullptr); + template + DISKANN_DLLEXPORT void create_disk_layout( + const std::string &mem_index_file, const std::string &base_file, + const std::string &tag_file, const std::string &pq_pivots_file, + const std::string &pq_compressed_vectors_file, bool single_file_index, + const std::string &output_file); } // namespace diskann diff --git a/include/cached_io.h b/include/cached_io.h index f9d23c4f99..9b8a4cce58 100644 --- a/include/cached_io.h +++ b/include/cached_io.h @@ -9,34 +9,44 @@ #include "logger.h" #include "ann_exception.h" +#include "utils.h" // sequential cached reads class cached_ifstream { public: cached_ifstream() { } - cached_ifstream(const std::string& filename, uint64_t cacheSize) + cached_ifstream(const std::string& filename, uint64_t cacheSize, + uint32_t initial_offset = 0) : cache_size(cacheSize), cur_off(0) { - this->open(filename, cache_size); + this->open(filename, cache_size, initial_offset); } ~cached_ifstream() { - delete[] cache_buf; - reader.close(); + // delete[] cache_buf; + if (reader.is_open()) + reader.close(); } - void open(const std::string& filename, uint64_t cacheSize) { + void close() { + if (reader.is_open()) + reader.close(); + } + + void open(const std::string& filename, uint64_t cacheSize, + size_t initial_offset = 0) { this->cur_off = 0; reader.open(filename, std::ios::binary | std::ios::ate); fsize = reader.tellg(); - reader.seekg(0, std::ios::beg); + reader.seekg(initial_offset, reader.beg); assert(reader.is_open()); assert(cacheSize > 0); - cacheSize = (std::min)(cacheSize, fsize); + cacheSize = (std::min)(cacheSize, fsize - initial_offset); + diskann::cout << "Opened: " << filename.c_str() << ", size: " << fsize + << ", cache_size: " << cacheSize << std::endl; this->cache_size = cacheSize; cache_buf = new char[cacheSize]; + // cache_buf = std::make_unique(cacheSize); reader.read(cache_buf, cacheSize); - diskann::cout << "Opened: " << filename.c_str() << ", size: " << fsize - << ", cache_size: " << cacheSize << std::endl; } size_t get_file_size() { @@ -97,24 +107,42 @@ class cached_ifstream { // sequential cached writes class cached_ofstream { public: - cached_ofstream(const std::string& filename, uint64_t cache_size) + cached_ofstream() { + } + cached_ofstream(const std::string& filename, uint64_t cache_size, + size_t initial_offset = 0) : cache_size(cache_size), cur_off(0) { - writer.open(filename, std::ios::binary); + open(filename, cache_size, initial_offset); + } + void open(const std::string& filename, uint64_t cache_size, + size_t initial_offset = 0) { + open_file_to_write(writer, filename); assert(writer.is_open()); assert(cache_size > 0); + writer.seekp(initial_offset, writer.beg); cache_buf = new char[cache_size]; + fsize = initial_offset; diskann::cout << "Opened: " << filename.c_str() << ", cache_size: " << cache_size << std::endl; } ~cached_ofstream() { + this->close(); + } + + void close() { // dump any remaining data in memory if (cur_off > 0) { this->flush_cache(); } - delete[] cache_buf; - writer.close(); + if (cache_buf != nullptr) { + delete[] cache_buf; + cache_buf = nullptr; + } + + if (writer.is_open()) + writer.close(); diskann::cout << "Finished writing " << fsize << "B" << std::endl; } diff --git a/include/content_buf.h b/include/content_buf.h new file mode 100644 index 0000000000..eafebbc3ba --- /dev/null +++ b/include/content_buf.h @@ -0,0 +1,26 @@ +#pragma once + +#ifdef EXEC_ENV_OLS + +namespace diskann { + class ContentBuf : public std::basic_streambuf { + public: + ContentBuf(char* p, size_t n) { + setg(p, p, p + n); + } + + virtual pos_type seekoff( + off_type off, std::ios_base::seekdir dir, + std::ios_base::openmode which = std::ios_base::in) { + if (dir == std::ios_base::cur) + gbump((int) off); + else if (dir == std::ios_base::end) + setg(eback(), egptr() + off, egptr()); + else if (dir == std::ios_base::beg) + setg(eback(), eback() + off, egptr()); + return gptr() - eback(); + } + }; +} // namespace diskann + +#endif \ No newline at end of file diff --git a/include/cosine_similarity.h b/include/cosine_similarity.h index 375db26591..939f291f66 100644 --- a/include/cosine_similarity.h +++ b/include/cosine_similarity.h @@ -2,17 +2,28 @@ // Licensed under the MIT license. #pragma once + +#include +#include +#include #include #include #include #include +#include +#include +#include + +#include "simd_utils.h" + +extern bool Avx2SupportedCPU; namespace diskann { template inline float compute_l2_norm(const T* vector, uint64_t ndims) { float norm = 0.0f; for (uint64_t i = 0; i < ndims; i++) { - norm += vector[i] * vector[i]; + norm += (float) (vector[i] * vector[i]); } return std::sqrt(norm); } @@ -24,7 +35,7 @@ namespace diskann { float right_norm = compute_l2_norm(right, ndims); float dot = 0.0f; for (uint64_t i = 0; i < ndims; i++) { - dot += left[i] * right[i]; + dot += (float) (left[i] * right[i]); } float cos_sim = dot / (left_norm * right_norm); return cos_sim; diff --git a/include/ctpl_stl.h b/include/ctpl_stl.h new file mode 100644 index 0000000000..7edd6c74fe --- /dev/null +++ b/include/ctpl_stl.h @@ -0,0 +1,272 @@ + +/********************************************************* + * + * Copyright (C) 2014 by Vitaliy Vitsentiy + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *********************************************************/ + +#ifndef __ctpl_stl_thread_pool_H__ +#define __ctpl_stl_thread_pool_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// thread pool to run user's functors with signature +// ret func(int id, other_params) +// where id is the index of the thread that runs the functor +// ret is some return type + +namespace ctpl { + + namespace detail { + template + class Queue { + public: + bool push(T const &value) { + std::unique_lock lock(this->mutex); + this->q.push(value); + return true; + } + // deletes the retrieved element, do not use for non integral types + bool pop(T &v) { + std::unique_lock lock(this->mutex); + if (this->q.empty()) + return false; + v = this->q.front(); + this->q.pop(); + return true; + } + bool empty() { + std::unique_lock lock(this->mutex); + return this->q.empty(); + } + + private: + std::queue q; + std::mutex mutex; + }; + } // namespace detail + + class thread_pool { + public: + thread_pool() { + this->init(); + } + thread_pool(int nThreads) { + this->init(); + this->resize(nThreads); + } + + // the destructor waits for all the functions in the queue to be finished + ~thread_pool() { + this->stop(true); + } + + // get the number of running threads in the pool + int size() { + return static_cast(this->threads.size()); + } + + // number of idle threads + int n_idle() { + return this->nWaiting; + } + std::thread &get_thread(int i) { + return *this->threads[i]; + } + + // change the number of threads in the pool + // should be called from one thread, otherwise be careful to not interleave, + // also with this->stop() nThreads must be >= 0 + void resize(int nThreads) { + if (!this->isStop && !this->isDone) { + int oldNThreads = static_cast(this->threads.size()); + if (oldNThreads <= nThreads) { // if the number of threads is increased + this->threads.resize(nThreads); + this->flags.resize(nThreads); + + for (int i = oldNThreads; i < nThreads; ++i) { + this->flags[i] = std::make_shared>(false); + this->set_thread(i); + } + } else { // the number of threads is decreased + for (int i = oldNThreads - 1; i >= nThreads; --i) { + *this->flags[i] = true; // this thread will finish + this->threads[i]->detach(); + } + { + // stop the detached threads that were waiting + std::unique_lock lock(this->mutex); + this->cv.notify_all(); + } + this->threads.resize( + nThreads); // safe to delete because the threads are detached + this->flags.resize( + nThreads); // safe to delete because the threads have copies of + // shared_ptr of the flags, not originals + } + } + } + + // empty the queue + void clear_queue() { + std::function *_f; + while (this->q.pop(_f)) + delete _f; // empty the queue + } + + // pops a functional wrapper to the original function + std::function pop() { + std::function *_f = nullptr; + this->q.pop(_f); + std::unique_ptr> func( + _f); // at return, delete the function even if an exception occurred + std::function f; + if (_f) + f = *_f; + return f; + } + + // wait for all computing threads to finish and stop all threads + // may be called asynchronously to not pause the calling thread while + // waiting if isWait == true, all the functions in the queue are run, + // otherwise the queue is cleared without running the functions + void stop(bool isWait = false) { + if (!isWait) { + if (this->isStop) + return; + this->isStop = true; + for (int i = 0, n = this->size(); i < n; ++i) { + *this->flags[i] = true; // command the threads to stop + } + this->clear_queue(); // empty the queue + } else { + if (this->isDone || this->isStop) + return; + this->isDone = true; // give the waiting threads a command to finish + } + { + std::unique_lock lock(this->mutex); + this->cv.notify_all(); // stop all waiting threads + } + for (int i = 0; i < static_cast(this->threads.size()); + ++i) { // wait for the computing threads to finish + if (this->threads[i]->joinable()) + this->threads[i]->join(); + } + // if there were no threads in the pool but some functors in the queue, + // the functors are not deleted by the threads therefore delete them here + this->clear_queue(); + this->threads.clear(); + this->flags.clear(); + } + + template + auto push(F &&f, Rest &&... rest) -> std::future { + auto pck = + std::make_shared>( + std::bind(std::forward(f), std::placeholders::_1, + std::forward(rest)...)); + auto _f = new std::function([pck](int id) { (*pck)(id); }); + this->q.push(_f); + std::unique_lock lock(this->mutex); + this->cv.notify_one(); + return pck->get_future(); + } + + // run the user's function that excepts argument int - id of the running + // thread. returned value is templatized operator returns std::future, where + // the user can get the result and rethrow the catched exceptins + template + auto push(F &&f) -> std::future { + auto pck = std::make_shared>( + std::forward(f)); + auto _f = new std::function([pck](int id) { (*pck)(id); }); + this->q.push(_f); + std::unique_lock lock(this->mutex); + this->cv.notify_one(); + return pck->get_future(); + } + + private: + // deleted + thread_pool(const thread_pool &); // = delete; + thread_pool(thread_pool &&); // = delete; + thread_pool &operator=(const thread_pool &); // = delete; + thread_pool &operator=(thread_pool &&); // = delete; + + void set_thread(int i) { + std::shared_ptr> flag( + this->flags[i]); // a copy of the shared ptr to the flag + auto f = [this, i, flag /* a copy of the shared ptr to the flag */]() { + std::atomic & _flag = *flag; + std::function *_f; + bool isPop = this->q.pop(_f); + while (true) { + while (isPop) { // if there is anything in the queue + std::unique_ptr> func( + _f); // at return, delete the function even if an exception + // occurred + (*_f)(i); + if (_flag) + return; // the thread is wanted to stop, return even if the queue + // is not empty yet + else + isPop = this->q.pop(_f); + } + // the queue is empty here, wait for the next command + std::unique_lock lock(this->mutex); + ++this->nWaiting; + this->cv.wait(lock, [this, &_f, &isPop, &_flag]() { + isPop = this->q.pop(_f); + return isPop || this->isDone || _flag; + }); + --this->nWaiting; + if (!isPop) + return; // if the queue is empty and this->isDone == true or *flag + // then return + } + }; + this->threads[i].reset( + new std::thread(f)); // compiler may not support std::make_unique() + } + + void init() { + this->nWaiting = 0; + this->isStop = false; + this->isDone = false; + } + + std::vector> threads; + std::vector>> flags; + detail::Queue *> q; + std::atomic isDone; + std::atomic isStop; + std::atomic nWaiting; // how many threads are waiting + + std::mutex mutex; + std::condition_variable cv; + }; + +} // namespace ctpl + +#endif // __ctpl_stl_thread_pool_H__ \ No newline at end of file diff --git a/include/distance.h b/include/distance.h index 3d403d1e56..65ee4ce1f8 100644 --- a/include/distance.h +++ b/include/distance.h @@ -1,6 +1,9 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + #pragma once -#include +#include "windows_customizations.h" #ifdef _WINDOWS #include #include @@ -106,132 +109,56 @@ namespace diskann { } }; - template - class DistanceCosine : public Distance { - float compare(const T *a, const T *b, unsigned length) const { - return diskann::compute_cosine_similarity(a, b, length); - } + class DistanceCosineInt8 : public Distance { + public: + virtual float compare(const int8_t *a, const int8_t *b, + uint32_t length) const; }; - class DistanceL2Int8 : public Distance { + class DistanceCosineFloat : public Distance { public: - float compare(const int8_t *a, const int8_t *b, unsigned size) const { - int32_t result = 0; + virtual float compare(const float *a, const float *b, + uint32_t length) const; + }; -#ifdef _WINDOWS -#ifdef USE_AVX2 - __m256 r = _mm256_setzero_ps(); - char * pX = (char *) a, *pY = (char *) b; - while (size >= 32) { - __m256i r1 = _mm256_subs_epi8(_mm256_loadu_si256((__m256i *) pX), - _mm256_loadu_si256((__m256i *) pY)); - r = _mm256_add_ps(r, _mm256_mul_epi8(r1, r1)); - pX += 32; - pY += 32; - size -= 32; - } - while (size > 0) { - __m128i r2 = _mm_subs_epi8(_mm_loadu_si128((__m128i *) pX), - _mm_loadu_si128((__m128i *) pY)); - r = _mm256_add_ps(r, _mm256_mul32_pi8(r2, r2)); - pX += 4; - pY += 4; - size -= 4; - } - r = _mm256_hadd_ps(_mm256_hadd_ps(r, r), r); - return r.m256_f32[0] + r.m256_f32[4]; -#else -#pragma omp simd reduction(+ : result) aligned(a, b : 8) - for (_s32 i = 0; i < (_s32) size; i++) { - result += ((int32_t)((int16_t) a[i] - (int16_t) b[i])) * - ((int32_t)((int16_t) a[i] - (int16_t) b[i])); - } - return (float) result; -#endif -#else -#pragma omp simd reduction(+ : result) aligned(a, b : 8) - for (_s32 i = 0; i < (_s32) size; i++) { - result += ((int32_t)((int16_t) a[i] - (int16_t) b[i])) * - ((int32_t)((int16_t) a[i] - (int16_t) b[i])); - } - return (float) result; -#endif - } + class SlowDistanceCosineUInt8 : public Distance { + public: + virtual float compare(const uint8_t *a, const uint8_t *b, + uint32_t length) const; + }; + + class DistanceL2Int8 : public Distance { + public: + virtual float compare(const int8_t *a, const int8_t *b, + uint32_t size) const; }; class DistanceL2UInt8 : public Distance { public: - float compare(const uint8_t *a, const uint8_t *b, unsigned size) const { - uint32_t result = 0; -#ifndef _WINDOWS -#pragma omp simd reduction(+ : result) aligned(a, b : 8) -#endif - for (_s32 i = 0; i < (_s32) size; i++) { - result += ((int32_t)((int16_t) a[i] - (int16_t) b[i])) * - ((int32_t)((int16_t) a[i] - (int16_t) b[i])); - } - return (float) result; - } + virtual float compare(const uint8_t *a, const uint8_t *b, + uint32_t size) const; }; class DistanceL2 : public Distance { public: -#ifndef _WINDOWS - float compare(const float *a, const float *b, unsigned size) const - __attribute__((hot)) { - a = (const float *) __builtin_assume_aligned(a, 32); - b = (const float *) __builtin_assume_aligned(b, 32); -#else - float compare(const float *a, const float *b, unsigned size) const { -#endif - - float result = 0; -#ifdef USE_AVX2 - // assume size is divisible by 8 - _u16 niters = size / 8; - __m256 sum = _mm256_setzero_ps(); - for (_u16 j = 0; j < niters; j++) { - // scope is a[8j:8j+7], b[8j:8j+7] - // load a_vec - if (j < (niters - 1)) { - _mm_prefetch((char *) (a + 8 * (j + 1)), _MM_HINT_T0); - _mm_prefetch((char *) (b + 8 * (j + 1)), _MM_HINT_T0); - } - __m256 a_vec = _mm256_load_ps(a + 8 * j); - // load b_vec - __m256 b_vec = _mm256_load_ps(b + 8 * j); - // a_vec - b_vec - __m256 tmp_vec = _mm256_sub_ps(a_vec, b_vec); - /* - // (a_vec - b_vec)**2 - __m256 tmp_vec2 = _mm256_mul_ps(tmp_vec, tmp_vec); - // accumulate sum - sum = _mm256_add_ps(sum, tmp_vec2); - */ - // sum = (tmp_vec**2) + sum - sum = _mm256_fmadd_ps(tmp_vec, tmp_vec, sum); - } - - // horizontal add sum - result = _mm256_reduce_add_ps(sum); +#ifdef _WINDOWS + virtual float compare(const float *a, const float *b, uint32_t size) const; #else -#ifndef _WINDOWS -#pragma omp simd reduction(+ : result) aligned(a, b : 32) -#endif - for (_s32 i = 0; i < (_s32) size; i++) { - result += (a[i] - b[i]) * (a[i] - b[i]); - } + virtual float compare(const float *a, const float *b, uint32_t size) const + __attribute__((hot)); #endif - return result; - } }; - // Slow implementations of the distance functions for machines without AVX2 + // Slow implementations of the distance functions to get diskann to + // work in pre-AVX machines. Performance here is not a concern, so we are + // using the simplest possible implementation. template class SlowDistanceL2Int : public Distance { - virtual float compare(const T *a, const T *b, unsigned length) const { + public: + // Implementing here because this is a template function + virtual float compare(const T *a, const T *b, uint32_t length) const { uint32_t result = 0; - for (_u32 i = 0; i < length; i++) { + for (uint32_t i = 0; i < length; i++) { result += ((int32_t)((int16_t) a[i] - (int16_t) b[i])) * ((int32_t)((int16_t) a[i] - (int16_t) b[i])); } @@ -240,291 +167,22 @@ namespace diskann { }; class SlowDistanceL2Float : public Distance { + public: virtual float compare(const float *a, const float *b, - unsigned length) const { - float result = 0.0f; - for (_u32 i = 0; i < length; i++) { - result += (a[i] - b[i]) * (a[i] - b[i]); - } - return result; - } + uint32_t length) const; }; + // AVX implementations. Borrowed from HNSW code. class AVXDistanceL2Int8 : public Distance { public: virtual float compare(const int8_t *a, const int8_t *b, - unsigned int length) const { -#ifndef _WINDOWS - std::cout << "AVX only supported in Windows build."; - return 0; - } -#else - __m128 r = _mm_setzero_ps(); - __m128i r1; - while (length >= 16) { - r1 = _mm_subs_epi8(_mm_load_si128((__m128i *) a), - _mm_load_si128((__m128i *) b)); - r = _mm_add_ps(r, _mm_mul_epi8(r1)); - a += 16; - b += 16; - length -= 16; - } - r = _mm_hadd_ps(_mm_hadd_ps(r, r), r); - float res = r.m128_f32[0]; - - if (length >= 8) { - __m128 r2 = _mm_setzero_ps(); - __m128i r3 = _mm_subs_epi8(_mm_load_si128((__m128i *) (a - 8)), - _mm_load_si128((__m128i *) (b - 8))); - r2 = _mm_add_ps(r2, _mm_mulhi_epi8(r3)); - a += 8; - b += 8; - length -= 8; - r2 = _mm_hadd_ps(_mm_hadd_ps(r2, r2), r2); - res += r2.m128_f32[0]; - } - - if (length >= 4) { - __m128 r2 = _mm_setzero_ps(); - __m128i r3 = _mm_subs_epi8(_mm_load_si128((__m128i *) (a - 12)), - _mm_load_si128((__m128i *) (b - 12))); - r2 = _mm_add_ps(r2, _mm_mulhi_epi8_shift32(r3)); - res += r2.m128_f32[0] + r2.m128_f32[1]; - } - - return res; - } -#endif + uint32_t length) const; }; class AVXDistanceL2Float : public Distance { public: virtual float compare(const float *a, const float *b, - unsigned int length) const { -#ifndef _WINDOWS - std::cout << "AVX only supported in Windows build."; - return 0; - } -#else - __m128 diff, v1, v2; - __m128 sum = _mm_set1_ps(0); - - while (length >= 4) { - v1 = _mm_loadu_ps(a); - a += 4; - v2 = _mm_loadu_ps(b); - b += 4; - diff = _mm_sub_ps(v1, v2); - sum = _mm_add_ps(sum, _mm_mul_ps(diff, diff)); - length -= 4; - } - - return sum.m128_f32[0] + sum.m128_f32[1] + sum.m128_f32[2] + - sum.m128_f32[3]; - } -#endif + uint32_t length) const; }; - template - class DistanceInnerProduct : public Distance { - public: - float compare(const T *a, const T *b, unsigned size) const { - float result = 0; -#ifdef __GNUC__ -#ifdef __AVX__ -#define AVX_DOT(addr1, addr2, dest, tmp1, tmp2) \ - tmp1 = _mm256_loadu_ps(addr1); \ - tmp2 = _mm256_loadu_ps(addr2); \ - tmp1 = _mm256_mul_ps(tmp1, tmp2); \ - dest = _mm256_add_ps(dest, tmp1); - - __m256 sum; - __m256 l0, l1; - __m256 r0, r1; - unsigned D = (size + 7) & ~7U; - unsigned DR = D % 16; - unsigned DD = D - DR; - const float *l = (float *) a; - const float *r = (float *) b; - const float *e_l = l + DD; - const float *e_r = r + DD; - float unpack[8] __attribute__((aligned(32))) = {0, 0, 0, 0, 0, 0, 0, 0}; - - sum = _mm256_loadu_ps(unpack); - if (DR) { - AVX_DOT(e_l, e_r, sum, l0, r0); - } - - for (unsigned i = 0; i < DD; i += 16, l += 16, r += 16) { - AVX_DOT(l, r, sum, l0, r0); - AVX_DOT(l + 8, r + 8, sum, l1, r1); - } - _mm256_storeu_ps(unpack, sum); - result = unpack[0] + unpack[1] + unpack[2] + unpack[3] + unpack[4] + - unpack[5] + unpack[6] + unpack[7]; - -#else -#ifdef __SSE2__ -#define SSE_DOT(addr1, addr2, dest, tmp1, tmp2) \ - tmp1 = _mm128_loadu_ps(addr1); \ - tmp2 = _mm128_loadu_ps(addr2); \ - tmp1 = _mm128_mul_ps(tmp1, tmp2); \ - dest = _mm128_add_ps(dest, tmp1); - __m128 sum; - __m128 l0, l1, l2, l3; - __m128 r0, r1, r2, r3; - unsigned D = (size + 3) & ~3U; - unsigned DR = D % 16; - unsigned DD = D - DR; - const float *l = a; - const float *r = b; - const float *e_l = l + DD; - const float *e_r = r + DD; - float unpack[4] __attribute__((aligned(16))) = {0, 0, 0, 0}; - - sum = _mm_load_ps(unpack); - switch (DR) { - case 12: - SSE_DOT(e_l + 8, e_r + 8, sum, l2, r2); - case 8: - SSE_DOT(e_l + 4, e_r + 4, sum, l1, r1); - case 4: - SSE_DOT(e_l, e_r, sum, l0, r0); - default: - break; - } - for (unsigned i = 0; i < DD; i += 16, l += 16, r += 16) { - SSE_DOT(l, r, sum, l0, r0); - SSE_DOT(l + 4, r + 4, sum, l1, r1); - SSE_DOT(l + 8, r + 8, sum, l2, r2); - SSE_DOT(l + 12, r + 12, sum, l3, r3); - } - _mm_storeu_ps(unpack, sum); - result += unpack[0] + unpack[1] + unpack[2] + unpack[3]; -#else - - float dot0, dot1, dot2, dot3; - const float *last = a + size; - const float *unroll_group = last - 3; - - /* Process 4 items with each loop for efficiency. */ - while (a < unroll_group) { - dot0 = a[0] * b[0]; - dot1 = a[1] * b[1]; - dot2 = a[2] * b[2]; - dot3 = a[3] * b[3]; - result += dot0 + dot1 + dot2 + dot3; - a += 4; - b += 4; - } - /* Process last 0-3 pixels. Not needed for standard vector lengths. */ - while (a < last) { - result += *a++ * *b++; - } -#endif -#endif -#endif - return result; - } - }; - - template - class DistanceFastL2 : public DistanceInnerProduct { - public: - float norm(const T *a, unsigned size) const { - float result = 0; -#ifdef __GNUC__ -#ifdef __AVX__ -#define AVX_L2NORM(addr, dest, tmp) \ - tmp = _mm256_loadu_ps(addr); \ - tmp = _mm256_mul_ps(tmp, tmp); \ - dest = _mm256_add_ps(dest, tmp); - - __m256 sum; - __m256 l0, l1; - unsigned D = (size + 7) & ~7U; - unsigned DR = D % 16; - unsigned DD = D - DR; - const float *l = (float *) a; - const float *e_l = l + DD; - float unpack[8] __attribute__((aligned(32))) = {0, 0, 0, 0, 0, 0, 0, 0}; - - sum = _mm256_loadu_ps(unpack); - if (DR) { - AVX_L2NORM(e_l, sum, l0); - } - for (unsigned i = 0; i < DD; i += 16, l += 16) { - AVX_L2NORM(l, sum, l0); - AVX_L2NORM(l + 8, sum, l1); - } - _mm256_storeu_ps(unpack, sum); - result = unpack[0] + unpack[1] + unpack[2] + unpack[3] + unpack[4] + - unpack[5] + unpack[6] + unpack[7]; -#else -#ifdef __SSE2__ -#define SSE_L2NORM(addr, dest, tmp) \ - tmp = _mm128_loadu_ps(addr); \ - tmp = _mm128_mul_ps(tmp, tmp); \ - dest = _mm128_add_ps(dest, tmp); - - __m128 sum; - __m128 l0, l1, l2, l3; - unsigned D = (size + 3) & ~3U; - unsigned DR = D % 16; - unsigned DD = D - DR; - const float *l = a; - const float *e_l = l + DD; - float unpack[4] __attribute__((aligned(16))) = {0, 0, 0, 0}; - - sum = _mm_load_ps(unpack); - switch (DR) { - case 12: - SSE_L2NORM(e_l + 8, sum, l2); - case 8: - SSE_L2NORM(e_l + 4, sum, l1); - case 4: - SSE_L2NORM(e_l, sum, l0); - default: - break; - } - for (unsigned i = 0; i < DD; i += 16, l += 16) { - SSE_L2NORM(l, sum, l0); - SSE_L2NORM(l + 4, sum, l1); - SSE_L2NORM(l + 8, sum, l2); - SSE_L2NORM(l + 12, sum, l3); - } - _mm_storeu_ps(unpack, sum); - result += unpack[0] + unpack[1] + unpack[2] + unpack[3]; -#else - float dot0, dot1, dot2, dot3; - const float *last = a + size; - const float *unroll_group = last - 3; - - /* Process 4 items with each loop for efficiency. */ - while (a < unroll_group) { - dot0 = a[0] * a[0]; - dot1 = a[1] * a[1]; - dot2 = a[2] * a[2]; - dot3 = a[3] * a[3]; - result += dot0 + dot1 + dot2 + dot3; - a += 4; - } - /* Process last 0-3 pixels. Not needed for standard vector lengths. */ - while (a < last) { - result += (*a) * (*a); - a++; - } -#endif -#endif -#endif - return result; - } - using DistanceInnerProduct::compare; - float compare(const T *a, const T *b, float norm, - unsigned size) const { // not implement - float result = -2 * DistanceInnerProduct::compare(a, b, size); - result += norm; - return result; - } - }; } // namespace diskann diff --git a/include/exceptions.h b/include/exceptions.h index 0323ac3dcb..eefb0f69cc 100644 --- a/include/exceptions.h +++ b/include/exceptions.h @@ -12,4 +12,4 @@ namespace diskann { : std::logic_error("Function not yet implemented.") { } }; -} +} // namespace diskann diff --git a/include/file_content.h b/include/file_content.h new file mode 100644 index 0000000000..157d988a25 --- /dev/null +++ b/include/file_content.h @@ -0,0 +1,14 @@ +#pragma once + +#ifdef EXEC_ENV_OLS +namespace diskann { + struct FileContent { + public: + FileContent(void* content, size_t size) : _content(content), _size(size) { + } + + void* _content; + size_t _size; + }; +} // namespace diskann +#endif diff --git a/include/index.h b/include/index.h index eedbb1491f..a88335a4a5 100644 --- a/include/index.h +++ b/include/index.h @@ -3,13 +3,16 @@ #pragma once +#include #include #include +#include #include #include #include #include #include "tsl/robin_set.h" +#include "tsl/robin_map.h" #include "distance.h" #include "neighbor.h" @@ -17,98 +20,183 @@ #include "utils.h" #include "windows_customizations.h" +#include "Neighbor_Tag.h" + #define SLACK_FACTOR 1.3 -#define ESTIMATE_RAM_USAGE(size, dim, datasize, degree) \ - (1.30 * (((double) size * dim) * datasize + \ - ((double) size * degree) * sizeof(unsigned) * SLACK_FACTOR)) +#define ESTIMATE_RAM_USAGE(size, dim, datasize, degree) \ + (SLACK_FACTOR * (((double) size * (double) dim) * (double) datasize + \ + ((double) size * (double) degree) * \ + (double) sizeof(unsigned) * SLACK_FACTOR)) namespace diskann { - template + template class Index { public: - DISKANN_DLLEXPORT Index(Metric m, const char *filename, - const size_t max_points = 0, const size_t nd = 0, - const size_t num_frozen_pts = 0, - const bool enable_tags = false, - const bool store_data = true, - const bool support_eager_delete = false); + DISKANN_DLLEXPORT Index(Metric m, const size_t dim, const size_t max_points, + const bool dynamic_index, + const bool save_index_in_one_file, + const bool enable_tags = false, + const bool support_eager_delete = false); + + // DISKANN_DLLEXPORT Index(Index *index); // deep copy DISKANN_DLLEXPORT ~Index(); + // Public Functions for Static Support + // checks if data is consolidated, saves graph, metadata and associated // tags. DISKANN_DLLEXPORT void save(const char *filename); - DISKANN_DLLEXPORT void load(const char *filename, - const bool load_tags = false, - const char *tag_filename = NULL); - // generates one or more frozen points that will never get deleted from the - // graph - DISKANN_DLLEXPORT int generate_random_frozen_points( - const char *filename = NULL); + + DISKANN_DLLEXPORT _u64 save_graph(std::string filename, size_t offset = 0); + DISKANN_DLLEXPORT _u64 save_data(std::string filename, size_t offset = 0); + DISKANN_DLLEXPORT _u64 save_tags(std::string filename, size_t offset = 0); + DISKANN_DLLEXPORT _u64 save_delete_list(const std::string &filename, + size_t offset = 0); + + DISKANN_DLLEXPORT void load(const char *index_file); + + DISKANN_DLLEXPORT size_t load_graph(const std::string filename, + size_t expected_num_points, + size_t offset = 0); + + DISKANN_DLLEXPORT size_t load_data(std::string filename, size_t offset = 0); + + DISKANN_DLLEXPORT size_t load_tags(const std::string tag_file_name, + size_t offset = 0); + DISKANN_DLLEXPORT size_t load_delete_set(const std::string &filename, + size_t offset = 0); + + DISKANN_DLLEXPORT size_t get_num_points(); + + DISKANN_DLLEXPORT size_t return_max_points(); DISKANN_DLLEXPORT void build( + const char *filename, const size_t num_points_to_load, Parameters & parameters, const std::vector &tags = std::vector()); - // Gopal. Added search overload that takes L as parameter, so that we + DISKANN_DLLEXPORT void build(const char * filename, + const size_t num_points_to_load, + Parameters & parameters, + const char * tag_filename); + // Added search overload that takes L as parameter, so that we // can customize L on a per-query basis without tampering with "Parameters" - DISKANN_DLLEXPORT std::pair search(const T *query, - const size_t K, - const unsigned L, - unsigned *indices); + DISKANN_DLLEXPORT std::pair search( + const T *query, const size_t K, const unsigned L, unsigned *indices, + float *distances = nullptr); DISKANN_DLLEXPORT std::pair search( const T *query, const uint64_t K, const unsigned L, std::vector init_ids, uint64_t *indices, float *distances); - DISKANN_DLLEXPORT std::pair search_with_tags( - const T *query, const size_t K, const unsigned L, TagT *tags, - unsigned frozen_pts, unsigned *indices_buffer = NULL); + DISKANN_DLLEXPORT size_t search_with_tags(const T *query, const uint64_t K, + const unsigned L, TagT *tags, + float * distances, + std::vector &res_vectors); - // repositions frozen points to the end of _data - if they have been moved - // during deletion - DISKANN_DLLEXPORT void readjust_data(unsigned _num_frozen_pts); + DISKANN_DLLEXPORT size_t search_with_tags(const T *query, const size_t K, + const unsigned L, TagT *tags, + float *distances); + + DISKANN_DLLEXPORT std::pair search( + const T *query, const size_t K, const unsigned L, + std::vector> &best_L_tags); + + DISKANN_DLLEXPORT void optimize_graph(); + + DISKANN_DLLEXPORT void search_with_opt_graph(const T *query, size_t K, + size_t L, unsigned *indices); + + DISKANN_DLLEXPORT void clear_index(); + + // Public Functions for Incremental Support /* insertions possible only when id corresponding to tag does not already * exist in the graph */ - DISKANN_DLLEXPORT int insert_point(const T * point, - const Parameters & parameter, - std::vector & pool, - std::vector & tmp, - tsl::robin_set & visited, - std::vector &cut_graph, - const TagT tag); - + DISKANN_DLLEXPORT int insert_point( + const T *point, const Parameters ¶meter, + const TagT tag); // only keep point, tag, parameters // call before triggering deleteions - sets important flags required for // deletion related operations DISKANN_DLLEXPORT int enable_delete(); - // call after all delete requests have been served, checks if deletions were - // executed correctly, rearranges metadata in case of lazy deletes - DISKANN_DLLEXPORT int disable_delete(const Parameters ¶meters, - const bool consolidate = false); - // Record deleted point now and restructure graph later. Return -1 if tag // not found, 0 if OK. Do not call if _eager_delete was called earlier and // data was not consolidated - DISKANN_DLLEXPORT int delete_point(const TagT tag); + DISKANN_DLLEXPORT int lazy_delete(const TagT &tag); + + // Record deleted points now and restructure graph later. Add to failed_tags + // if tag not found. Do not call if _eager_delete was called earlier and + // data was not consolidated. Return -1 if + DISKANN_DLLEXPORT int lazy_delete(const tsl::robin_set &tags, + std::vector & failed_tags); // Delete point from graph and restructure it immediately. Do not call if // _lazy_delete was called earlier and data was not consolidated DISKANN_DLLEXPORT int eager_delete(const TagT tag, - const Parameters ¶meters); + const Parameters ¶meters, + int delete_mode = 1); + // return _data and tag_to_location offset + DISKANN_DLLEXPORT int extract_data( + T *ret_data, std::unordered_map &tag_to_location); + + DISKANN_DLLEXPORT void get_location_to_tag( + std::unordered_map &ret_loc_to_tag); + + DISKANN_DLLEXPORT void prune_all_nbrs(const Parameters ¶meters); + + DISKANN_DLLEXPORT void compact_data_for_insert(); + + DISKANN_DLLEXPORT bool hasIndexBeenSaved(); + // diskv2 API + void iterate_to_fixed_point(const T *node_coords, const unsigned Lindex, + std::vector &expanded_nodes_info, + tsl::robin_map &coord_map, + bool return_frozen_pt = true); + // convenient access to graph + data (aligned) + const std::vector> *get_graph() const { + return &this->_final_graph; + } + T * get_data(); + const std::unordered_map *get_tags() const { + return &this->_location_to_tag; + }; + // repositions frozen points to the end of _data - if they have been moved + // during deletion + DISKANN_DLLEXPORT void reposition_frozen_point_to_end(); + DISKANN_DLLEXPORT void reposition_point(unsigned old_location, + unsigned new_location); - DISKANN_DLLEXPORT void optimize_graph(); + DISKANN_DLLEXPORT void compact_frozen_point(); + DISKANN_DLLEXPORT void compact_data_for_search(); - DISKANN_DLLEXPORT void search_with_opt_graph(const T *query, size_t K, - size_t L, unsigned *indices); + DISKANN_DLLEXPORT void consolidate(Parameters ¶meters); + + // DISKANN_DLLEXPORT void save_index_as_one_file(bool flag); + + DISKANN_DLLEXPORT void get_active_tags(tsl::robin_set &active_tags); + + DISKANN_DLLEXPORT int get_vector_by_tag(TagT &tag, T *vec); + DISKANN_DLLEXPORT const T *get_vector_by_tag(const TagT &tag); + + // TODO: Debugging ONLY + DISKANN_DLLEXPORT void print_status() const; + DISKANN_DLLEXPORT void are_deleted_points_in_graph() const; + DISKANN_DLLEXPORT void print_delete_set() const; + + // This variable MUST be updated if the number of entries in the metadata + // change. + DISKANN_DLLEXPORT static const int METADATA_ROWS = 5; /* Internals of the library */ protected: - typedef std::vector vecNgh; - typedef std::vector> CompactGraph; - CompactGraph _final_graph; - CompactGraph _in_graph; + std::vector> _final_graph; + std::vector> _in_graph; + + // generates one frozen point that will never get deleted from the + // graph + int generate_frozen_point(); // determines navigating node of the graph by calculating medoid of data unsigned calculate_entry_point(); @@ -120,7 +208,7 @@ namespace diskann { const std::vector &init_ids, std::vector & expanded_nodes_info, tsl::robin_set & expanded_nodes_ids, - std::vector & best_L_nodes); + std::vector &best_L_nodes, bool ret_frozen = true); void get_expanded_nodes(const size_t node, const unsigned Lindex, std::vector init_ids, @@ -150,60 +238,85 @@ namespace diskann { void link(Parameters ¶meters); - // WARNING: Do not call reserve_location() without acquiring change_lock_ - unsigned reserve_location(); + // Support for Incremental Indexing + int reserve_location(); + void release_location(); - // get new location corresponding to each undeleted tag after deletions - std::vector get_new_location(unsigned &active); + // Support for resizing the index + // This function must be called ONLY after taking the _change_lock and + // _update_lock. + // Anything else in a MT environment will lead to an inconsistent index. + void resize(uint32_t new_max_points); // renumber nodes, update tag and location maps and compact the graph, mode - // = _consolidated_order in case of lazy deletion and _compacted_order in + // = _compacted_lazy_deletions in case of lazy deletion and + // _compacted_eager_deletions in // case of eager deletion - void compact_data(std::vector new_location, unsigned active, - bool &mode); + void compact_data(); // WARNING: Do not call consolidate_deletes without acquiring change_lock_ // Returns number of live points left after consolidation size_t consolidate_deletes(const Parameters ¶meters); private: - size_t _dim; - size_t _aligned_dim; - T * _data; - size_t _nd; // number of active points i.e. existing in the graph - size_t _max_points; // total number of points in given data set - size_t _num_frozen_pts; - bool _has_built; - Distance *_distance; - unsigned _width; - unsigned _ep; - bool _saturate_graph = false; - std::vector _locks; // Per node lock, cardinality=max_points_ + // DEBUG ONLY + void printTagToLocation(); + + std::shared_timed_mutex _tag_lock; // reader-writer lock on + // _tag_to_location and + std::mutex _change_lock; // Lock taken to synchronously modify _nd + + T *_data = nullptr; // coordinates of all base points + // T *_pq_data = + // nullptr; // coordinates of pq centroid corresponding to every point + Distance * _distance = nullptr; + diskann::Metric _dist_metric; + + size_t _dim; + size_t _aligned_dim; + size_t _nd = 0; // number of active points i.e. existing in the graph + size_t _max_points = 0; // total number of points in given data set + size_t _num_frozen_pts = 0; + unsigned _width = 0; + unsigned _ep = 0; + bool _has_built = false; + bool _saturate_graph = false; + bool _save_as_one_file = false; + bool _dynamic_index = false; + bool _enable_tags = false; char * _opt_graph; size_t _node_size; size_t _data_len; size_t _neighbor_len; - bool _can_delete; - bool _eager_done; // true if eager deletions have been made - bool _lazy_done; // true if lazy deletions have been made - bool _compacted_order; // true if after eager deletions, data has been - // consolidated - bool _enable_tags; - bool _consolidated_order; // true if after lazy deletions, data has been - // consolidated - bool _support_eager_delete; //_support_eager_delete = activates extra data - // structures and functions required for eager - // deletion - bool _store_data; - + // flags for dynamic indexing std::unordered_map _tag_to_location; std::unordered_map _location_to_tag; tsl::robin_set _delete_set; tsl::robin_set _empty_slots; - std::mutex _change_lock; // Allow only 1 thread to insert/delete + bool _support_eager_delete = + false; //_support_eager_delete = activates extra data + // bool _can_delete = false; // only true if deletes can be done (if + // enabled) + bool _eager_done = false; // true if eager deletions have been made + bool _lazy_done = false; // true if lazy deletions have been made + bool _data_compacted = true; // true if data has been consolidated + bool _is_saved = false; // Gopal. Checking if the index is already saved. + + std::vector _locks; // Per node lock, cardinality=max_points_ + std::vector _locks_in; // Per node lock + std::shared_timed_mutex _delete_lock; // Lock on _delete_set and + // _empty_slots when reading and + // writing to them + // _location_to_tag, has a shared lock + // and exclusive lock associated with + // it. + std::shared_timed_mutex _update_lock; // coordinate save() and any change + // being done to the graph. + + const float INDEX_GROWTH_FACTOR = 1.5f; }; } // namespace diskann diff --git a/include/linux_aligned_file_reader.h b/include/linux_aligned_file_reader.h index f9815697cc..d0cb9c9548 100644 --- a/include/linux_aligned_file_reader.h +++ b/include/linux_aligned_file_reader.h @@ -24,15 +24,19 @@ class LinuxAlignedFileReader : public AlignedFileReader { // de-register thread-id for a context void deregister_thread(); + void deregister_all_threads(); + // Open & close ops // Blocking calls - void open(const std::string &fname); + void open(const std::string &fname, bool enable_writes, bool enable_create); void close(); // process batch of aligned requests in parallel // NOTE :: blocking call void read(std::vector &read_reqs, IOContext &ctx, bool async = false); + + void sequential_write(AlignedRead &write_req, IOContext &ctx); }; #endif diff --git a/include/logger_impl.h b/include/logger_impl.h index 035406f50d..794938a287 100644 --- a/include/logger_impl.h +++ b/include/logger_impl.h @@ -66,7 +66,7 @@ namespace diskann { // This implies calling code _must_ either print std::endl or std::flush // to ensure that the message is written immediately. #ifdef EXEC_ENV_OLS - static const int BUFFER_SIZE = 1024; + static const int BUFFER_SIZE = 2048; #else static const int BUFFER_SIZE = 0; #endif diff --git a/include/memory_mapper.h b/include/memory_mapper.h index 4ebe6ec62e..4ccbf6f286 100644 --- a/include/memory_mapper.h +++ b/include/memory_mapper.h @@ -38,4 +38,4 @@ namespace diskann { ~MemoryMapper(); }; -} \ No newline at end of file +} // namespace diskann diff --git a/include/neighbor.h b/include/neighbor.h index 5c37df38e5..7dbf1a3c79 100644 --- a/include/neighbor.h +++ b/include/neighbor.h @@ -6,6 +6,7 @@ #include #include #include +#include #include "utils.h" namespace diskann { diff --git a/include/parameters.h b/include/parameters.h index 42e7d3a463..31a15a1fa0 100644 --- a/include/parameters.h +++ b/include/parameters.h @@ -21,6 +21,10 @@ namespace diskann { // ParamType *ptr = (ParamType *) malloc(sizeof(ParamType)); ParamType *ptr = new ParamType; *ptr = value; + if (params.find(name) != params.end()) { + free(params[name]); + } + params[name] = (void *) ptr; } @@ -54,7 +58,6 @@ namespace diskann { for (auto iter = params.begin(); iter != params.end(); iter++) { if (iter->second != nullptr) free(iter->second); - // delete iter->second; } } diff --git a/include/partition_and_pq.h b/include/partition_and_pq.h index 45b1e26e6d..05dd63a964 100644 --- a/include/partition_and_pq.h +++ b/include/partition_and_pq.h @@ -15,9 +15,18 @@ #include "windows_customizations.h" +const uint32_t NUM_PQ_CENTERS = 256; +const uint32_t NUM_K_MEANS_ITERS = 15; + template void gen_random_slice(const std::string base_file, - const std::string output_prefix, double sampling_rate); + const std::string output_prefix, double sampling_rate, + size_t offset = 0); + +template +void gen_random_slice(const std::string data_file, double p_val, + std::unique_ptr &sampled_data, + size_t &slice_size, size_t &ndims); template void gen_random_slice(const std::string data_file, double p_val, @@ -49,6 +58,12 @@ int partition_with_ram_budget(const std::string data_file, size_t graph_degree, const std::string prefix_path, size_t k_base); +template +DISKANN_DLLEXPORT int generate_pq_pivots( + const std::unique_ptr &passed_train_data, size_t num_train, + unsigned dim, unsigned num_centers, unsigned num_pq_chunks, + unsigned max_k_means_reps, std::string pq_pivots_path); + DISKANN_DLLEXPORT int generate_pq_pivots(const float *train_data, size_t num_train, unsigned dim, unsigned num_centers, @@ -60,4 +75,5 @@ template int generate_pq_data_from_pivots(const std::string data_file, unsigned num_centers, unsigned num_pq_chunks, std::string pq_pivots_path, - std::string pq_compressed_vectors_path); + std::string pq_compressed_vectors_path, + size_t offset = 0); diff --git a/include/percentile_stats.h b/include/percentile_stats.h index 808546c165..8c6be913cc 100644 --- a/include/percentile_stats.h +++ b/include/percentile_stats.h @@ -44,7 +44,7 @@ namespace diskann { vals.begin(), vals.end(), [](const double &left, const double &right) { return left < right; }); - auto retval = vals[(uint64_t)(percentile * len)]; + auto retval = vals[(uint64_t)(percentile * ((float) len))]; vals.clear(); return retval; } @@ -56,6 +56,6 @@ namespace diskann { for (uint64_t i = 0; i < len; i++) { avg += member_fn(stats[i]); } - return avg / len; + return avg / ((double) len); } -} +} // namespace diskann diff --git a/include/pq_flash_index.h b/include/pq_flash_index.h index c7601851c6..23e545dcaa 100644 --- a/include/pq_flash_index.h +++ b/include/pq_flash_index.h @@ -49,13 +49,25 @@ namespace diskann { } }; + template + struct DiskNode { + uint32_t id = 0; + T * coords = nullptr; + uint32_t nnbrs; + uint32_t *nbrs; + + // id : id of node + // sector_buf : sector buf containing `id` data + DiskNode(uint32_t id, T *coords, uint32_t *nhood); + }; + template struct ThreadData { QueryScratch scratch; IOContext ctx; }; - template + template class PQFlashIndex { public: // Gopal. Adapting to the new Bing interface. Since the DiskPriorityIO is @@ -65,26 +77,31 @@ namespace diskann { // created the way we need. Linux will create a simple AlignedFileReader // and pass it. Regular Windows code should create a BingFileReader using // the DiskPriorityIOInterface class, and for running on XTS, create a - // BingFileReader - // using the object passed by the XTS environment. - // Freeing the reader object is now the client's (DiskANNInterface's) - // responsibility. + // BingFileReader using the object passed by the XTS environment. Freeing + // the + // reader object is now the client's (DiskANNInterface's) responsibility. DISKANN_DLLEXPORT PQFlashIndex( - std::shared_ptr &fileReader); + diskann::Metric m, std::shared_ptr &fileReader, + bool single_file_index, bool tags = false); + DISKANN_DLLEXPORT ~PQFlashIndex(); #ifdef EXEC_ENV_OLS - DISKANN_DLLEXPORT int load(diskann::MemoryMappedFiles &files, - uint32_t num_threads, const char *pq_prefix, - const char *disk_index_file); + DISKANN_DLLEXPORT int load(const char *index_prefix, _u32 num_threads, + diskann::MemoryMappedFiles &files, + bool new_index_format = true); #else // load compressed data, and obtains the handle to the disk-resident index - DISKANN_DLLEXPORT int load(uint32_t num_threads, const char *pq_prefix, - const char *disk_index_file); + DISKANN_DLLEXPORT int load(const char *index_prefix, uint32_t num_threads, + bool new_index_format = true); #endif + DISKANN_DLLEXPORT void load_tags(const std::string &tag_file, + size_t offset = 0); DISKANN_DLLEXPORT void load_cache_list(std::vector &node_list); + DISKANN_DLLEXPORT _u64 return_nd(); + #ifdef EXEC_ENV_OLS DISKANN_DLLEXPORT void generate_cache_list_from_sample_queries( MemoryMappedFiles &files, std::string sample_bin, _u64 l_search, @@ -110,18 +127,86 @@ namespace diskann { // setting up thread-specific data // implemented - DISKANN_DLLEXPORT void cached_beam_search( - const T *query, const _u64 k_search, const _u64 l_search, _u64 *res_ids, - float *res_dists, const _u64 beam_width, QueryStats *stats = nullptr, - Distance *output_dist_func = nullptr); - std::shared_ptr &reader; + DISKANN_DLLEXPORT size_t + cached_beam_search(const T *query, const _u64 k_search, const _u64 l_search, + TagT *res_tags, float *res_dists, const _u64 beam_width, + QueryStats *stats = nullptr); - protected: - DISKANN_DLLEXPORT void use_medoids_data_as_centroids(); - DISKANN_DLLEXPORT void setup_thread_data(_u64 nthreads); - DISKANN_DLLEXPORT void destroy_thread_data(); + DISKANN_DLLEXPORT size_t cached_beam_search_ids( + const T *query, const _u64 k_search, const _u64 l_search, + uint64_t *res_ids, float *res_dists, const _u64 beam_width, + QueryStats *stats = nullptr); + + DISKANN_DLLEXPORT size_t cached_beam_search_vectors( + const T *query, const _u64 k_search, const _u64 l_search, + TagT *res_tags, float *res_dists, std::vector &res_vectors, + const _u64 beam_width, QueryStats *stats = nullptr); + + /* diskv2 extra API requirements */ + /* -------------------------------------------------------------------------------------------- + */ + DISKANN_DLLEXPORT void disk_iterate_to_fixed_point( + const T *vec, const uint32_t Lsize, const uint32_t beam_width, + std::vector & expanded_nodes_info, + tsl::robin_map *coord_map = nullptr, + QueryStats *stats = nullptr, ThreadData *passthrough_data = nullptr, + tsl::robin_set *exclude_nodes = nullptr); + std::vector get_init_ids() { + return std::vector(this->medoids, + this->medoids + this->num_medoids); + } + // gives access to backing thread data buf for easy parallelization + std::vector> &get_thread_data() { + return this->thread_data_backing_buf; + } + + // computes PQ dists between src->[ids] into fp_dists (merge, insert) + DISKANN_DLLEXPORT void compute_pq_dists(const _u32 src, const _u32 *ids, + float *fp_dists, const _u32 count, + uint8_t *aligned_scratch = nullptr); + // computes PQ dists between aligned_query->[ids] into fp_dists (search) + DISKANN_DLLEXPORT void compute_pq_dists(const T *query, const _u32 *ids, + float *fp_dists, const _u32 count); + // read/write [start_id:end_id-1] points from disk + // WARNING -- ensure (start_id,end_id) % nnodes_per_sector = 0, + // aligned_scratch is SECTOR_LEN aligned + // WARNING -- ensure aligned_scratch size is >((end_id - + // start_id)/nnodes_per_sector) * SECTOR_LEN bytes + DISKANN_DLLEXPORT _u32 merge_read(std::vector> &disk_nodes, + _u32 &start_id, const _u32 sector_count, + char *scratch); + DISKANN_DLLEXPORT void scan_deleted_nodes( + const tsl::robin_set &delete_set, + std::vector> &deleted_nodes, char *buf, char *backing_buf, + const uint32_t sectors_per_scan); + DISKANN_DLLEXPORT void reload_index(const std::string &new_disk_index_path, + const std::string &new_pq_coords_path, + const std::string &new_tags_file_path); + // DISKANN_DLLEXPORT void passthrough_write(char *buf, const uint64_t + // offset, + // const uint64_t size); + + // deflates `vec` into PQ ids + DISKANN_DLLEXPORT std::vector<_u8> deflate_vector(const T *vec); + std::pair<_u8 *, _u32> get_pq_config() { + return std::make_pair(this->data, (uint32_t) this->n_chunks); + } + DISKANN_DLLEXPORT TagT *get_tags() { + return this->tags; + } + + DISKANN_DLLEXPORT _u64 get_num_frozen_points() { + return this->num_frozen_points; + } + + DISKANN_DLLEXPORT _u64 get_frozen_loc() { + return this->frozen_location; + } + + DISKANN_DLLEXPORT void get_active_tags(tsl::robin_set &active_tags); + + DISKANN_DLLEXPORT int get_vector_by_tag(const TagT &tag, T *vector); - private: // index info // nhood of node `i` is in sector: [i / nnodes_per_sector] // offset in sector: [(i % nnodes_per_sector) * max_node_len] @@ -129,14 +214,24 @@ namespace diskann { // nbrs of node `i`: ((unsigned*)buf) + 1 _u64 max_node_len = 0, nnodes_per_sector = 0, max_degree = 0; + protected: + DISKANN_DLLEXPORT void use_medoids_data_as_centroids(); + DISKANN_DLLEXPORT void setup_thread_data(_u64 nthreads); + DISKANN_DLLEXPORT void destroy_thread_data(); + + private: // data info _u64 num_points = 0; + _u64 num_frozen_points = 0; + _u64 frozen_location = 0; _u64 data_dim = 0; _u64 aligned_dim = 0; - std::string disk_index_file; + std::string _disk_index_file; std::vector> node_visit_counter; + std::shared_ptr &reader; + // PQ data // n_chunks = # of chunks ndims is split into // data: _u8 * n_chunks @@ -148,8 +243,15 @@ namespace diskann { FixedChunkPQTable pq_table; // distance comparator - Distance * dist_cmp = nullptr; - Distance *dist_cmp_float = nullptr; + std::shared_ptr> dist_cmp; + std::shared_ptr> dist_cmp_float; + + // Are we dealing with normalized data? This will be true + // if distance == COSINE and datatype == float. Required + // because going forward, we will normalize vectors when + // asked to search with COSINE similarity. Of course, this + // will be done only for floating point vectors. + bool data_is_normalized = false; // medoid/start info uint32_t *medoids = @@ -162,19 +264,34 @@ namespace diskann { // closest centroid as the starting point of search // nhood_cache - unsigned *nhood_cache_buf = nullptr; + unsigned * nhood_cache_buf = nullptr; tsl::robin_map<_u32, std::pair<_u32, _u32 *>> nhood_cache; // coord_cache - T *coord_cache_buf = nullptr; + T * coord_cache_buf = nullptr; tsl::robin_map<_u32, T *> coord_cache; // thread-specific scratch ConcurrentQueue> thread_data; + std::vector> thread_data_backing_buf; _u64 max_nthreads; bool load_flag = false; bool count_visited_nodes = false; + bool single_index_file; // For fresh + static. Save + // everything in a single file + + // support for tags and dynamic indexing + + bool enable_tags = false; + TagT *tags = nullptr; + + /* diskv2 extra API requirements */ + // ids that don't have disk nhoods, but have in-mem PQ + tsl::robin_set<_u32> invalid_ids; + std::mutex invalid_ids_lock; + +// tags #ifdef EXEC_ENV_OLS // Set to a larger value than the actual header to accommodate // any additions we make to the header. This is an outer limit diff --git a/include/pq_table.h b/include/pq_table.h index 3cac23c15a..cf3059f4d6 100644 --- a/include/pq_table.h +++ b/include/pq_table.h @@ -5,6 +5,9 @@ #include "utils.h" +#define NUM_PQ_CENTROIDS 256 +#define NUM_PQ_OFFSETS 5 + namespace diskann { template class FixedChunkPQTable { @@ -19,6 +22,8 @@ namespace diskann { _u32* rearrangement = nullptr; float* centroid = nullptr; float* tables_T = nullptr; // same as pq_tables, but col-major + float* all_to_all_dists = nullptr; + public: FixedChunkPQTable() { } @@ -35,95 +40,277 @@ namespace diskann { delete[] chunk_offsets; if (centroid != nullptr) delete[] centroid; + if (all_to_all_dists != nullptr) + delete[] all_to_all_dists; #endif } + _u64 get_dim() { + return ndims; + } + #ifdef EXEC_ENV_OLS - void load_pq_centroid_bin(MemoryMappedFiles& files, - const char* pq_table_file, size_t num_chunks){ + void load_pq_pivots_old(MemoryMappedFiles& files, + const std::string& pq_pivots_path, + size_t num_chunks) { +#else + void load_pq_pivots_old(const std::string& pq_pivots_path, + size_t num_chunks) { +#endif + _u64 nr, nc; +// Load the pq pivots. +#ifdef EXEC_ENV_OLS + diskann::load_bin(files, pq_pivots_path.c_str(), tables, nr, nc); +#else + diskann::load_bin(pq_pivots_path.c_str(), tables, nr, nc); +#endif + + if ((nr != NUM_PQ_CENTROIDS)) { + diskann::cout << "Error reading pq_pivots file " << pq_pivots_path + << ". file_num_centers = " << nr << " but expecting " + << NUM_PQ_CENTROIDS << " centers"; + throw diskann::ANNException( + "Error reading pq_pivots file at pivots data.", -1, __FUNCSIG__, + __FILE__, __LINE__); + } + + this->ndims = nc; + +// Load the PQ centroids +//_pq_pivots.bin_centroid.bin +//_chunk_offsets.bin +//_rearrangement_perm.bin +#ifdef EXEC_ENV_OLS + diskann::load_bin(files, pq_pivots_path + "_centroid.bin", + centroid, nr, nc); +#else + diskann::load_bin(pq_pivots_path + "_centroid.bin", centroid, nr, + nc); +#endif + + if ((nr != this->ndims) || (nc != 1)) { + diskann::cerr << "Error reading centroids from pq_pivots file " + << pq_pivots_path << ". file_dim = " << nr + << ", file_cols = " << nc << " but expecting " + << this->ndims << " entries in 1 dimension."; + throw diskann::ANNException( + "Error reading pq_pivots file at centroid data.", -1, __FUNCSIG__, + __FILE__, __LINE__); + } + +#ifdef EXEC_ENV_OLS + diskann::load_bin(files, + pq_pivots_path + "_rearrangement_perm.bin", + rearrangement, nr, nc); #else - void load_pq_centroid_bin(const char* pq_table_file, size_t num_chunks) { + diskann::load_bin(pq_pivots_path + "_rearrangement_perm.bin", + rearrangement, nr, nc); #endif - std::string rearrangement_file = std::string(pq_table_file) + - "_rearrangement_perm.bin"; - std::string chunk_offset_file = - std::string(pq_table_file) + "_chunk_offsets.bin"; - std::string centroid_file = std::string(pq_table_file) + "_centroid.bin"; + if ((nr != this->ndims) || (nc != 1)) { + diskann::cerr << "Error reading re-arrangement data pq_pivots file " + << pq_pivots_path << ". file_dim = " << nr + << ", file_cols = " << nc << " but expecting " + << this->ndims << " entries in 1 dimension."; + throw diskann::ANNException( + "Error reading pq_pivots file at re-arrangement data.", -1, + __FUNCSIG__, __FILE__, __LINE__); + } - // bin structure: [256][ndims][ndims(float)] - uint64_t numr, numc; - size_t npts_u64, ndims_u64; #ifdef EXEC_ENV_OLS - diskann::load_bin(files, pq_table_file, tables, npts_u64, ndims_u64); + diskann::load_bin(files, pq_pivots_path + "_chunk_offsets.bin", + chunk_offsets, nr, nc); #else - diskann::load_bin(pq_table_file, tables, npts_u64, ndims_u64); + diskann::load_bin(pq_pivots_path + "_chunk_offsets.bin", + chunk_offsets, nr, nc); #endif - this->ndims = ndims_u64; - if (file_exists(chunk_offset_file)) { + if (nr != (uint64_t) num_chunks + 1 || nc != 1) { + diskann::cerr + << "Error reading pq_pivots file at chunk offsets; file has nr=" + << nr << ",nc=" << nc << ", expecting nr=" << num_chunks + 1 + << ", nc=1." << std::endl; + throw diskann::ANNException( + "Error reading pq_pivots file at chunk offsets.", -1, __FUNCSIG__, + __FILE__, __LINE__); + } + + this->n_chunks = num_chunks; + diskann::cout << "Loaded PQ Pivots: #ctrs: " << NUM_PQ_CENTROIDS + << ", #dims: " << this->ndims + << ", #chunks: " << this->n_chunks << std::endl; + } + #ifdef EXEC_ENV_OLS - diskann::load_bin<_u32>(files, rearrangement_file, rearrangement, numr, - numc); + void load_pq_pivots_new(MemoryMappedFiles& files, + const std::string& pq_pivots_path, + size_t num_chunks, size_t offset) { #else - diskann::load_bin<_u32>(rearrangement_file, rearrangement, numr, numc); + void load_pq_pivots_new(const std::string& pq_pivots_path, + size_t num_chunks, size_t offset) { #endif - if (numr != ndims_u64 || numc != 1) { - diskann::cerr << "Error loading rearrangement file" << std::endl; - throw diskann::ANNException("Error loading rearrangement file", -1, - __FUNCSIG__, __FILE__, __LINE__); + + _u64 nr, nc; +#ifdef EXEC_ENV_OLS + _u64* file_offset_data; // since load_bin only sets the pointer, no need + // to delete. + diskann::load_bin<_u64>(files, pq_pivots_path, file_offset_data, nr, nc, + offset); +#else + std::unique_ptr<_u64[]> file_offset_data; + diskann::load_bin<_u64>(pq_pivots_path, file_offset_data, nr, nc, offset); +#endif + + if (nr != NUM_PQ_OFFSETS) { + diskann::cout << "Error reading pq_pivots file " << pq_pivots_path + << ". Offsets dont contain correct metadata, # offsets = " + << nr << ", but expecting " << NUM_PQ_OFFSETS; + throw diskann::ANNException( + "Error reading pq_pivots file at offsets data.", -1, __FUNCSIG__, + __FILE__, __LINE__); } + diskann::cout << "Offsets: " << file_offset_data[0] << " " + << file_offset_data[1] << " " << file_offset_data[2] << " " + << file_offset_data[3] << " " << file_offset_data[4] + << std::endl; + #ifdef EXEC_ENV_OLS - diskann::load_bin<_u32>(files, chunk_offset_file, chunk_offsets, numr, - numc); + diskann::load_bin(files, pq_pivots_path.c_str(), tables, nr, nc, + file_offset_data[0] + offset); #else - diskann::load_bin<_u32>(chunk_offset_file, chunk_offsets, numr, numc); -#endif - if (numc != 1 || numr != num_chunks + 1) { - diskann::cerr << "Error loading chunk offsets file. numc: " << numc - << " (should be 1). numr: " << numr << " (should be " - << num_chunks + 1 << ")" << std::endl; - throw diskann::ANNException("Error loading chunk offsets file", -1, - __FUNCSIG__, __FILE__, __LINE__); + diskann::load_bin(pq_pivots_path.c_str(), tables, nr, nc, + file_offset_data[0] + offset); +#endif + + if ((nr != NUM_PQ_CENTROIDS)) { + diskann::cout << "Error reading pq_pivots file " << pq_pivots_path + << ". file_num_centers = " << nr << " but expecting " + << NUM_PQ_CENTROIDS << " centers"; + throw diskann::ANNException( + "Error reading pq_pivots file at pivots data.", -1, __FUNCSIG__, + __FILE__, __LINE__); } - this->n_chunks = numr - 1; + this->ndims = nc; + +#ifdef EXEC_ENV_OLS + diskann::load_bin(files, pq_pivots_path.c_str(), centroid, nr, nc, + file_offset_data[1] + offset); +#else + diskann::load_bin(pq_pivots_path.c_str(), centroid, nr, nc, + file_offset_data[1] + offset); +#endif + + if ((nr != this->ndims) || (nc != 1)) { + diskann::cerr << "Error reading centroids from pq_pivots file " + << pq_pivots_path << ". file_dim = " << nr + << ", file_cols = " << nc << " but expecting " + << this->ndims << " entries in 1 dimension."; + throw diskann::ANNException( + "Error reading pq_pivots file at centroid data.", -1, __FUNCSIG__, + __FILE__, __LINE__); + } #ifdef EXEC_ENV_OLS - diskann::load_bin(files, centroid_file, centroid, numr, numc); + diskann::load_bin(files, pq_pivots_path.c_str(), rearrangement, + nr, nc, file_offset_data[2] + offset); #else - diskann::load_bin(centroid_file, centroid, numr, numc); + diskann::load_bin(pq_pivots_path.c_str(), rearrangement, nr, nc, + file_offset_data[2] + offset); #endif - if (numc != 1 || numr != ndims_u64) { - diskann::cerr << "Error loading centroid file" << std::endl; - throw diskann::ANNException("Error loading centroid file", -1, - __FUNCSIG__, __FILE__, __LINE__); + if ((nr != this->ndims) || (nc != 1)) { + diskann::cerr << "Error reading re-arrangement data pq_pivots file " + << pq_pivots_path << ". file_dim = " << nr + << ", file_cols = " << nc << " but expecting " + << this->ndims << " entries in 1 dimension."; + throw diskann::ANNException( + "Error reading pq_pivots file at re-arrangement data.", -1, + __FUNCSIG__, __FILE__, __LINE__); } - } else { + +#ifdef EXEC_ENV_OLS + diskann::load_bin(files, pq_pivots_path.c_str(), chunk_offsets, + nr, nc, file_offset_data[3] + offset); +#else + diskann::load_bin(pq_pivots_path.c_str(), chunk_offsets, nr, nc, + file_offset_data[3] + offset); +#endif + + if (nr != (uint64_t) num_chunks + 1 || nc != 1) { + diskann::cerr + << "Error reading pq_pivots file at chunk offsets; file has nr=" + << nr << ",nc=" << nc << ", expecting nr=" << num_chunks + 1 + << ", nc=1." << std::endl; + throw diskann::ANNException( + "Error reading pq_pivots file at chunk offsets.", -1, __FUNCSIG__, + __FILE__, __LINE__); + } + this->n_chunks = num_chunks; - rearrangement = new uint32_t[ndims]; - - uint64_t chunk_size = DIV_ROUND_UP(ndims, num_chunks); - for (uint32_t d = 0; d < ndims; d++) - rearrangement[d] = d; - chunk_offsets = new uint32_t[num_chunks + 1]; - for (uint32_t d = 0; d <= num_chunks; d++) - chunk_offsets[d] = (_u32)(std::min)(ndims, d * chunk_size); - centroid = new float[ndims]; - std::memset(centroid, 0, ndims * sizeof(float)); + diskann::cout << "Loaded PQ Pivots: #ctrs: " << NUM_PQ_CENTROIDS + << ", #dims: " << this->ndims + << ", #chunks: " << this->n_chunks << std::endl; + } + +#ifdef EXEC_ENV_OLS + void load_pq_centroid_bin(MemoryMappedFiles& files, + const char* pq_table_file, size_t num_chunks, + size_t offset = 0){ +#else + void load_pq_centroid_bin(const char* pq_table_file, size_t num_chunks, + size_t offset = 0) { +#endif + + std::string pq_pivots_path(pq_table_file); + _u64 nr, nc; + +#ifdef EXEC_ENV_OLS + get_bin_metadata(files, pq_table_file, nr, nc, offset); +#else + get_bin_metadata(pq_table_file, nr, nc, offset); +#endif + + if (nr == NUM_PQ_OFFSETS) { +#ifdef EXEC_ENV_OLS + load_pq_pivots_new(files, pq_table_file, num_chunks, offset); +#else + load_pq_pivots_new(pq_table_file, num_chunks, offset); +#endif + } else if (nr == NUM_PQ_CENTROIDS) { +#ifdef EXEC_ENV_OLS + load_pq_pivots_old(files, pq_table_file, num_chunks); +#else + load_pq_pivots_old(pq_table_file, num_chunks); +#endif } - diskann::cout << "PQ Pivots: #ctrs: " << npts_u64 - << ", #dims: " << ndims_u64 << ", #chunks: " << n_chunks - << std::endl; - // assert((_u64) ndims_u32 == n_chunks * chunk_size); // alloc and compute transpose - tables_T = new float[256 * ndims_u64]; + tables_T = new float[256 * ndims]; for (_u64 i = 0; i < 256; i++) { - for (_u64 j = 0; j < ndims_u64; j++) { - tables_T[j * 256 + i] = tables[i * ndims_u64 + j]; + for (_u64 j = 0; j < ndims; j++) { + tables_T[j * 256 + i] = tables[i * ndims + j]; + } + } + + // added this for easy PQ-PQ squared-distance calculations + // TODO: Create only for StreamingMerger. + all_to_all_dists = new float[256 * 256 * n_chunks]; + std::memset(all_to_all_dists, 0, 256 * 256 * n_chunks * sizeof(float)); + // should perhaps optimize later + for (_u32 i = 0; i < 256; i++) { + for (_u32 j = 0; j < 256; j++) { + for (_u32 c = 0; c < n_chunks; c++) { + for (_u64 d = chunk_offsets[c]; d < chunk_offsets[c + 1]; d++) { + float diff = (tables[i * ndims + d] - tables[j * ndims + d]); + all_to_all_dists[i * 256 * n_chunks + j * n_chunks + c] += + diff * diff; + } + } } } + diskann::cout << "Finished optimizing for PQ-PQ distance compuation " + << std::endl; + } void @@ -137,7 +324,7 @@ namespace diskann { _u64 permuted_dim_in_query = rearrangement[j]; const float* centers_dim_vec = tables_T + (256 * j); for (_u64 idx = 0; idx < 256; idx++) { - // Gopal. Fixing crash in v14 machines. + // Fixing crash in v14 machines. // float diff = centers_dim_vec[idx] - // ((float) query_vec[permuted_dim_in_query] - // centroid[permuted_dim_in_query]); @@ -150,5 +337,45 @@ namespace diskann { } } } -}; + + // computes PQ distance between comp_src and comp_dsts in efficient manner + // comp_src: [nchunks] + // comp_dsts: count * [nchunks] + // dists: [count] + // TODO (perf) :: re-order computation to get better locality + void compute_distances(const _u8* comp_src, const _u8* comp_dsts, + float* dists, const _u32 count) { + std::memset(dists, 0, count * sizeof(float)); + for (_u64 i = 0; i < count; i++) { + for (_u64 c = 0; c < n_chunks; c++) { + dists[i] += + all_to_all_dists[(_u64) comp_src[c] * 256 * n_chunks + + (_u64) comp_dsts[i * n_chunks + c] * n_chunks + c]; + } + } + } + + // fp_vec: [ndims] + // out_pq_vec : [nchunks] + void deflate_vec(const float* fp_vec, _u8* out_pq_vec) { + // permute the vector according to PQ rearrangement, compute all distances + // to 256 centroids and choose the closest (for each chunk) + for (_u32 c = 0; c < n_chunks; c++) { + float closest_dist = std::numeric_limits::max(); + for (_u32 i = 0; i < 256; i++) { + float cur_dist = 0; + for (_u64 d = chunk_offsets[c]; d < chunk_offsets[c + 1]; d++) { + float diff = + (tables[i * ndims + d] - + ((float) fp_vec[rearrangement[d]] - centroid[rearrangement[d]])); + cur_dist += diff * diff; + } + if (cur_dist < closest_dist) { + closest_dist = cur_dist; + out_pq_vec[c] = (_u8) i; + } + } + } + } +}; // namespace diskann } // namespace diskann diff --git a/include/simd_utils.h b/include/simd_utils.h new file mode 100644 index 0000000000..c219485621 --- /dev/null +++ b/include/simd_utils.h @@ -0,0 +1,105 @@ +#pragma once + +#ifdef _WINDOWS +#include +#include +#include +#include +#else +#include +#endif + +namespace diskann { + static inline __m256 _mm256_mul_epi8(__m256i X) { + __m256i zero = _mm256_setzero_si256(); + + __m256i sign_x = _mm256_cmpgt_epi8(zero, X); + + __m256i xlo = _mm256_unpacklo_epi8(X, sign_x); + __m256i xhi = _mm256_unpackhi_epi8(X, sign_x); + + return _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_madd_epi16(xlo, xlo), + _mm256_madd_epi16(xhi, xhi))); + } + + static inline __m128 _mm_mulhi_epi8(__m128i X) { + __m128i zero = _mm_setzero_si128(); + __m128i sign_x = _mm_cmplt_epi8(X, zero); + __m128i xhi = _mm_unpackhi_epi8(X, sign_x); + + return _mm_cvtepi32_ps( + _mm_add_epi32(_mm_setzero_si128(), _mm_madd_epi16(xhi, xhi))); + } + + static inline __m128 _mm_mulhi_epi8_shift32(__m128i X) { + __m128i zero = _mm_setzero_si128(); + X = _mm_srli_epi64(X, 32); + __m128i sign_x = _mm_cmplt_epi8(X, zero); + __m128i xhi = _mm_unpackhi_epi8(X, sign_x); + + return _mm_cvtepi32_ps( + _mm_add_epi32(_mm_setzero_si128(), _mm_madd_epi16(xhi, xhi))); + } + static inline __m128 _mm_mul_epi8(__m128i X, __m128i Y) { + __m128i zero = _mm_setzero_si128(); + + __m128i sign_x = _mm_cmplt_epi8(X, zero); + __m128i sign_y = _mm_cmplt_epi8(Y, zero); + + __m128i xlo = _mm_unpacklo_epi8(X, sign_x); + __m128i xhi = _mm_unpackhi_epi8(X, sign_x); + __m128i ylo = _mm_unpacklo_epi8(Y, sign_y); + __m128i yhi = _mm_unpackhi_epi8(Y, sign_y); + + return _mm_cvtepi32_ps( + _mm_add_epi32(_mm_madd_epi16(xlo, ylo), _mm_madd_epi16(xhi, yhi))); + } + static inline __m128 _mm_mul_epi8(__m128i X) { + __m128i zero = _mm_setzero_si128(); + __m128i sign_x = _mm_cmplt_epi8(X, zero); + __m128i xlo = _mm_unpacklo_epi8(X, sign_x); + __m128i xhi = _mm_unpackhi_epi8(X, sign_x); + + return _mm_cvtepi32_ps( + _mm_add_epi32(_mm_madd_epi16(xlo, xlo), _mm_madd_epi16(xhi, xhi))); + } + + static inline __m128 _mm_mul32_pi8(__m128i X, __m128i Y) { + __m128i xlo = _mm_cvtepi8_epi16(X), ylo = _mm_cvtepi8_epi16(Y); + return _mm_cvtepi32_ps( + _mm_unpacklo_epi32(_mm_madd_epi16(xlo, ylo), _mm_setzero_si128())); + } + + static inline __m256 _mm256_mul_epi8(__m256i X, __m256i Y) { + __m256i zero = _mm256_setzero_si256(); + + __m256i sign_x = _mm256_cmpgt_epi8(zero, X); + __m256i sign_y = _mm256_cmpgt_epi8(zero, Y); + + __m256i xlo = _mm256_unpacklo_epi8(X, sign_x); + __m256i xhi = _mm256_unpackhi_epi8(X, sign_x); + __m256i ylo = _mm256_unpacklo_epi8(Y, sign_y); + __m256i yhi = _mm256_unpackhi_epi8(Y, sign_y); + + return _mm256_cvtepi32_ps(_mm256_add_epi32(_mm256_madd_epi16(xlo, ylo), + _mm256_madd_epi16(xhi, yhi))); + } + + static inline __m256 _mm256_mul32_pi8(__m128i X, __m128i Y) { + __m256i xlo = _mm256_cvtepi8_epi16(X), ylo = _mm256_cvtepi8_epi16(Y); + return _mm256_blend_ps(_mm256_cvtepi32_ps(_mm256_madd_epi16(xlo, ylo)), + _mm256_setzero_ps(), 252); + } + + static inline float _mm256_reduce_add_ps(__m256 x) { + /* ( x3+x7, x2+x6, x1+x5, x0+x4 ) */ + const __m128 x128 = + _mm_add_ps(_mm256_extractf128_ps(x, 1), _mm256_castps256_ps128(x)); + /* ( -, -, x1+x3+x5+x7, x0+x2+x4+x6 ) */ + const __m128 x64 = _mm_add_ps(x128, _mm_movehl_ps(x128, x128)); + /* ( -, -, -, x0+x1+x2+x3+x4+x5+x6+x7 ) */ + const __m128 x32 = _mm_add_ss(x64, _mm_shuffle_ps(x64, x64, 0x55)); + /* Conversion to float is a no-op on x86-64 */ + return _mm_cvtss_f32(x32); + } +} // namespace diskann diff --git a/include/tcmalloc/LICENSE.txt b/include/tcmalloc/LICENSE.txt new file mode 100644 index 0000000000..26c3f72caa --- /dev/null +++ b/include/tcmalloc/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/include/tcmalloc/malloc_extension.h b/include/tcmalloc/malloc_extension.h new file mode 100644 index 0000000000..1be138a538 --- /dev/null +++ b/include/tcmalloc/malloc_extension.h @@ -0,0 +1,446 @@ +// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- +// Copyright (c) 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Sanjay Ghemawat +// +// Extra extensions exported by some malloc implementations. These +// extensions are accessed through a virtual base class so an +// application can link against a malloc that does not implement these +// extensions, and it will get default versions that do nothing. +// +// NOTE FOR C USERS: If you wish to use this functionality from within +// a C program, see malloc_extension_c.h. + +#ifndef BASE_MALLOC_EXTENSION_H_ +#define BASE_MALLOC_EXTENSION_H_ + +#include +// I can't #include config.h in this public API file, but I should +// really use configure (and make malloc_extension.h a .in file) to +// figure out if the system has stdint.h or not. But I'm lazy, so +// for now I'm assuming it's a problem only with MSVC. +#ifndef _MSC_VER +#include +#endif +#include +#include + +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef PERFTOOLS_DLL_DECL +# ifdef _WIN32 +# define PERFTOOLS_DLL_DECL __declspec(dllimport) +# else +# define PERFTOOLS_DLL_DECL +# endif +#endif + +static const int kMallocHistogramSize = 64; + +// One day, we could support other types of writers (perhaps for C?) +typedef std::string MallocExtensionWriter; + +namespace base { +struct MallocRange; +} + +// Interface to a pluggable system allocator. +class PERFTOOLS_DLL_DECL SysAllocator { + public: + SysAllocator() { + } + virtual ~SysAllocator(); + + // Allocates "size"-byte of memory from system aligned with "alignment". + // Returns NULL if failed. Otherwise, the returned pointer p up to and + // including (p + actual_size -1) have been allocated. + virtual void* Alloc(size_t size, size_t *actual_size, size_t alignment) = 0; +}; + +// The default implementations of the following routines do nothing. +// All implementations should be thread-safe; the current one +// (TCMallocImplementation) is. +class PERFTOOLS_DLL_DECL MallocExtension { + public: + virtual ~MallocExtension(); + + // Call this very early in the program execution -- say, in a global + // constructor -- to set up parameters and state needed by all + // instrumented malloc implemenatations. One example: this routine + // sets environemnt variables to tell STL to use libc's malloc() + // instead of doing its own memory management. This is safe to call + // multiple times, as long as each time is before threads start up. + static void Initialize(); + + // See "verify_memory.h" to see what these routines do + virtual bool VerifyAllMemory(); + virtual bool VerifyNewMemory(const void* p); + virtual bool VerifyArrayNewMemory(const void* p); + virtual bool VerifyMallocMemory(const void* p); + virtual bool MallocMemoryStats(int* blocks, size_t* total, + int histogram[kMallocHistogramSize]); + + // Get a human readable description of the following malloc data structures. + // - Total inuse memory by application. + // - Free memory(thread, central and page heap), + // - Freelist of central cache, each class. + // - Page heap freelist. + // The state is stored as a null-terminated string + // in a prefix of "buffer[0,buffer_length-1]". + // REQUIRES: buffer_length > 0. + virtual void GetStats(char* buffer, int buffer_length); + + // Outputs to "writer" a sample of live objects and the stack traces + // that allocated these objects. The format of the returned output + // is equivalent to the output of the heap profiler and can + // therefore be passed to "pprof". This function is equivalent to + // ReadStackTraces. The main difference is that this function returns + // serialized data appropriately formatted for use by the pprof tool. + // + // Since gperftools 2.8 heap samples are not de-duplicated by the + // library anymore. + // + // NOTE: by default, tcmalloc does not do any heap sampling, and this + // function will always return an empty sample. To get useful + // data from GetHeapSample, you must also set the environment + // variable TCMALLOC_SAMPLE_PARAMETER to a value such as 524288. + virtual void GetHeapSample(MallocExtensionWriter* writer); + + // Outputs to "writer" the stack traces that caused growth in the + // address space size. The format of the returned output is + // equivalent to the output of the heap profiler and can therefore + // be passed to "pprof". This function is equivalent to + // ReadHeapGrowthStackTraces. The main difference is that this function + // returns serialized data appropriately formatted for use by the + // pprof tool. (This does not depend on, or require, + // TCMALLOC_SAMPLE_PARAMETER.) + virtual void GetHeapGrowthStacks(MallocExtensionWriter* writer); + + // Invokes func(arg, range) for every controlled memory + // range. *range is filled in with information about the range. + // + // This is a best-effort interface useful only for performance + // analysis. The implementation may not call func at all. + typedef void (RangeFunction)(void*, const base::MallocRange*); + virtual void Ranges(void* arg, RangeFunction func); + + // ------------------------------------------------------------------- + // Control operations for getting and setting malloc implementation + // specific parameters. Some currently useful properties: + // + // generic + // ------- + // "generic.current_allocated_bytes" + // Number of bytes currently allocated by application + // This property is not writable. + // + // "generic.heap_size" + // Number of bytes in the heap == + // current_allocated_bytes + + // fragmentation + + // freed memory regions + // This property is not writable. + // + // "generic.total_physical_bytes" + // Estimate of total bytes of the physical memory usage by the + // allocator == + // current_allocated_bytes + + // fragmentation + + // metadata + // This property is not writable. + // + // tcmalloc + // -------- + // "tcmalloc.max_total_thread_cache_bytes" + // Upper limit on total number of bytes stored across all + // per-thread caches. Default: 16MB. + // + // "tcmalloc.current_total_thread_cache_bytes" + // Number of bytes used across all thread caches. + // This property is not writable. + // + // "tcmalloc.central_cache_free_bytes" + // Number of free bytes in the central cache that have been + // assigned to size classes. They always count towards virtual + // memory usage, and unless the underlying memory is swapped out + // by the OS, they also count towards physical memory usage. + // This property is not writable. + // + // "tcmalloc.transfer_cache_free_bytes" + // Number of free bytes that are waiting to be transfered between + // the central cache and a thread cache. They always count + // towards virtual memory usage, and unless the underlying memory + // is swapped out by the OS, they also count towards physical + // memory usage. This property is not writable. + // + // "tcmalloc.thread_cache_free_bytes" + // Number of free bytes in thread caches. They always count + // towards virtual memory usage, and unless the underlying memory + // is swapped out by the OS, they also count towards physical + // memory usage. This property is not writable. + // + // "tcmalloc.pageheap_free_bytes" + // Number of bytes in free, mapped pages in page heap. These + // bytes can be used to fulfill allocation requests. They + // always count towards virtual memory usage, and unless the + // underlying memory is swapped out by the OS, they also count + // towards physical memory usage. This property is not writable. + // + // "tcmalloc.pageheap_unmapped_bytes" + // Number of bytes in free, unmapped pages in page heap. + // These are bytes that have been released back to the OS, + // possibly by one of the MallocExtension "Release" calls. + // They can be used to fulfill allocation requests, but + // typically incur a page fault. They always count towards + // virtual memory usage, and depending on the OS, typically + // do not count towards physical memory usage. This property + // is not writable. + // ------------------------------------------------------------------- + + // Get the named "property"'s value. Returns true if the property + // is known. Returns false if the property is not a valid property + // name for the current malloc implementation. + // REQUIRES: property != NULL; value != NULL + virtual bool GetNumericProperty(const char* property, size_t* value); + + // Set the named "property"'s value. Returns true if the property + // is known and writable. Returns false if the property is not a + // valid property name for the current malloc implementation, or + // is not writable. + // REQUIRES: property != NULL + virtual bool SetNumericProperty(const char* property, size_t value); + + // Mark the current thread as "idle". This routine may optionally + // be called by threads as a hint to the malloc implementation that + // any thread-specific resources should be released. Note: this may + // be an expensive routine, so it should not be called too often. + // + // Also, if the code that calls this routine will go to sleep for + // a while, it should take care to not allocate anything between + // the call to this routine and the beginning of the sleep. + // + // Most malloc implementations ignore this routine. + virtual void MarkThreadIdle(); + + // Mark the current thread as "busy". This routine should be + // called after MarkThreadIdle() if the thread will now do more + // work. If this method is not called, performance may suffer. + // + // Most malloc implementations ignore this routine. + virtual void MarkThreadBusy(); + + // Gets the system allocator used by the malloc extension instance. Returns + // NULL for malloc implementations that do not support pluggable system + // allocators. + virtual SysAllocator* GetSystemAllocator(); + + // Sets the system allocator to the specified. + // + // Users could register their own system allocators for malloc implementation + // that supports pluggable system allocators, such as TCMalloc, by doing: + // alloc = new MyOwnSysAllocator(); + // MallocExtension::instance()->SetSystemAllocator(alloc); + // It's up to users whether to fall back (recommended) to the default + // system allocator (use GetSystemAllocator() above) or not. The caller is + // responsible to any necessary locking. + // See tcmalloc/system-alloc.h for the interface and + // tcmalloc/memfs_malloc.cc for the examples. + // + // It's a no-op for malloc implementations that do not support pluggable + // system allocators. + virtual void SetSystemAllocator(SysAllocator *a); + + // Try to release num_bytes of free memory back to the operating + // system for reuse. Use this extension with caution -- to get this + // memory back may require faulting pages back in by the OS, and + // that may be slow. (Currently only implemented in tcmalloc.) + virtual void ReleaseToSystem(size_t num_bytes); + + // Same as ReleaseToSystem() but release as much memory as possible. + virtual void ReleaseFreeMemory(); + + // Sets the rate at which we release unused memory to the system. + // Zero means we never release memory back to the system. Increase + // this flag to return memory faster; decrease it to return memory + // slower. Reasonable rates are in the range [0,10]. (Currently + // only implemented in tcmalloc). + virtual void SetMemoryReleaseRate(double rate); + + // Gets the release rate. Returns a value < 0 if unknown. + virtual double GetMemoryReleaseRate(); + + // Returns the estimated number of bytes that will be allocated for + // a request of "size" bytes. This is an estimate: an allocation of + // SIZE bytes may reserve more bytes, but will never reserve less. + // (Currently only implemented in tcmalloc, other implementations + // always return SIZE.) + // This is equivalent to malloc_good_size() in OS X. + virtual size_t GetEstimatedAllocatedSize(size_t size); + + // Returns the actual number N of bytes reserved by tcmalloc for the + // pointer p. The client is allowed to use the range of bytes + // [p, p+N) in any way it wishes (i.e. N is the "usable size" of this + // allocation). This number may be equal to or greater than the number + // of bytes requested when p was allocated. + // p must have been allocated by this malloc implementation, + // must not be an interior pointer -- that is, must be exactly + // the pointer returned to by malloc() et al., not some offset + // from that -- and should not have been freed yet. p may be NULL. + // (Currently only implemented in tcmalloc; other implementations + // will return 0.) + // This is equivalent to malloc_size() in OS X, malloc_usable_size() + // in glibc, and _msize() for windows. + virtual size_t GetAllocatedSize(const void* p); + + // Returns kOwned if this malloc implementation allocated the memory + // pointed to by p, or kNotOwned if some other malloc implementation + // allocated it or p is NULL. May also return kUnknownOwnership if + // the malloc implementation does not keep track of ownership. + // REQUIRES: p must be a value returned from a previous call to + // malloc(), calloc(), realloc(), memalign(), posix_memalign(), + // valloc(), pvalloc(), new, or new[], and must refer to memory that + // is currently allocated (so, for instance, you should not pass in + // a pointer after having called free() on it). + enum Ownership { + // NOTE: Enum values MUST be kept in sync with the version in + // malloc_extension_c.h + kUnknownOwnership = 0, + kOwned, + kNotOwned + }; + virtual Ownership GetOwnership(const void* p); + + // The current malloc implementation. Always non-NULL. + static MallocExtension* instance(); + + // Change the malloc implementation. Typically called by the + // malloc implementation during initialization. + static void Register(MallocExtension* implementation); + + // Returns detailed information about malloc's freelists. For each list, + // return a FreeListInfo: + struct FreeListInfo { + size_t min_object_size; + size_t max_object_size; + size_t total_bytes_free; + const char* type; + }; + // Each item in the vector refers to a different freelist. The lists + // are identified by the range of allocations that objects in the + // list can satisfy ([min_object_size, max_object_size]) and the + // type of freelist (see below). The current size of the list is + // returned in total_bytes_free (which count against a processes + // resident and virtual size). + // + // Currently supported types are: + // + // "tcmalloc.page{_unmapped}" - tcmalloc's page heap. An entry for each size + // class in the page heap is returned. Bytes in "page_unmapped" + // are no longer backed by physical memory and do not count against + // the resident size of a process. + // + // "tcmalloc.large{_unmapped}" - tcmalloc's list of objects larger + // than the largest page heap size class. Only one "large" + // entry is returned. There is no upper-bound on the size + // of objects in the large free list; this call returns + // kint64max for max_object_size. Bytes in + // "large_unmapped" are no longer backed by physical memory + // and do not count against the resident size of a process. + // + // "tcmalloc.central" - tcmalloc's central free-list. One entry per + // size-class is returned. Never unmapped. + // + // "debug.free_queue" - free objects queued by the debug allocator + // and not returned to tcmalloc. + // + // "tcmalloc.thread" - tcmalloc's per-thread caches. Never unmapped. + virtual void GetFreeListSizes(std::vector* v); + + // Get a list of stack traces of sampled allocation points. Returns + // a pointer to a "new[]-ed" result array, and stores the sample + // period in "sample_period". + // + // The state is stored as a sequence of adjacent entries + // in the returned array. Each entry has the following form: + // uintptr_t count; // Number of objects with following trace + // uintptr_t size; // Total size of objects with following trace + // uintptr_t depth; // Number of PC values in stack trace + // void* stack[depth]; // PC values that form the stack trace + // + // The list of entries is terminated by a "count" of 0. + // + // It is the responsibility of the caller to "delete[]" the returned array. + // + // May return NULL to indicate no results. + // + // This is an internal extension. Callers should use the more + // convenient "GetHeapSample(string*)" method defined above. + virtual void** ReadStackTraces(int* sample_period); + + // Like ReadStackTraces(), but returns stack traces that caused growth + // in the address space size. + virtual void** ReadHeapGrowthStackTraces(); + + // Returns the size in bytes of the calling threads cache. + virtual size_t GetThreadCacheSize(); + + // Like MarkThreadIdle, but does not destroy the internal data + // structures of the thread cache. When the thread resumes, it wil + // have an empty cache but will not need to pay to reconstruct the + // cache data structures. + virtual void MarkThreadTemporarilyIdle(); +}; + +namespace base { + +// Information passed per range. More fields may be added later. +struct MallocRange { + enum Type { + INUSE, // Application is using this range + FREE, // Range is currently free + UNMAPPED, // Backing physical memory has been returned to the OS + UNKNOWN + // More enum values may be added in the future + }; + + uintptr_t address; // Address of range + size_t length; // Byte length of range + Type type; // Type of this range + double fraction; // Fraction of range that is being used (0 if !INUSE) + + // Perhaps add the following: + // - stack trace if this range was sampled + // - heap growth stack trace if applicable to this range + // - age when allocated (for inuse) or freed (if not in use) +}; + +} // namespace base + +#endif // BASE_MALLOC_EXTENSION_H_ diff --git a/include/threadpool.h b/include/threadpool.h new file mode 100644 index 0000000000..bfaaeffe1f --- /dev/null +++ b/include/threadpool.h @@ -0,0 +1,115 @@ +/***************************************************************************** + +Copyright (c) 2012 Jakob Progsch, Vclav Zeman + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source + distribution. + + *******************************************************************************/ + +#ifndef THREAD_POOL_H +#define THREAD_POOL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class ThreadPool { + public: + ThreadPool(size_t); + template + auto enqueue(F&& f, Args&&... args) + -> std::future::type>; + ~ThreadPool(); + + private: + // need to keep track of threads so we can join them + std::vector workers; + // the task queue + std::queue> tasks; + + // synchronization + std::mutex queue_mutex; + std::condition_variable condition; + bool stop; +}; + +// the constructor just launches some amount of workers +inline ThreadPool::ThreadPool(size_t threads) : stop(false) { + for (size_t i = 0; i < threads; ++i) + workers.emplace_back([this] { + for (;;) { + std::function task; + + { + std::unique_lock lock(this->queue_mutex); + this->condition.wait( + lock, [this] { return this->stop || !this->tasks.empty(); }); + if (this->stop && this->tasks.empty()) + return; + task = std::move(this->tasks.front()); + this->tasks.pop(); + } + + task(); + } + }); +} + +// add new work item to the pool +template +auto ThreadPool::enqueue(F&& f, Args&&... args) + -> std::future::type> { + using return_type = typename std::result_of::type; + + auto task = std::make_shared>( + std::bind(std::forward(f), std::forward(args)...)); + + std::future res = task->get_future(); + { + std::unique_lock lock(queue_mutex); + + // don't allow enqueueing after stopping the pool + if (stop) + throw std::runtime_error("enqueue on stopped ThreadPool"); + + tasks.emplace([task]() { (*task)(); }); + } + condition.notify_one(); + return res; +} + +// the destructor joins all threads +inline ThreadPool::~ThreadPool() { + { + std::unique_lock lock(queue_mutex); + stop = true; + } + condition.notify_all(); + for (std::thread& worker : workers) + worker.join(); +} + +#endif \ No newline at end of file diff --git a/include/timer.h b/include/timer.h index 4671c33beb..bf52ed8835 100644 --- a/include/timer.h +++ b/include/timer.h @@ -22,4 +22,4 @@ namespace diskann { .count(); } }; -} +} // namespace diskann diff --git a/include/tsl/CMakeLists.txt b/include/tsl/CMakeLists.txt new file mode 100644 index 0000000000..924f38f022 --- /dev/null +++ b/include/tsl/CMakeLists.txt @@ -0,0 +1,78 @@ +cmake_minimum_required(VERSION 3.1) +include(GNUInstallDirs) + + +project(tsl-robin-map VERSION 0.6.3) + +add_library(robin_map INTERFACE) +# Use tsl::robin_map as target, more consistent with other libraries conventions (Boost, Qt, ...) +add_library(tsl::robin_map ALIAS robin_map) + +target_include_directories(robin_map INTERFACE + "$" + "$") + +list(APPEND headers "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/robin_growth_policy.h" + "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/robin_hash.h" + "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/robin_map.h" + "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl/robin_set.h") +target_sources(robin_map INTERFACE "$") + +if(MSVC) + target_sources(robin_map INTERFACE + "$" + "$") +endif() + + + + +# Installation (only compatible with CMake version >= 3.3) +if(${CMAKE_VERSION} VERSION_GREATER "3.2") + include(CMakePackageConfigHelpers) + + ## Install include directory and potential natvis file + install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/tsl" + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") + + if(MSVC) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/tsl-robin-map.natvis" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}") + endif() + + + + ## Create and install tsl-robin-mapConfig.cmake + configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/tsl-robin-mapConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/tsl-robin-mapConfig.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/tsl-robin-map") + + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tsl-robin-mapConfig.cmake" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/tsl-robin-map") + + + + ## Create and install tsl-robin-mapTargets.cmake + install(TARGETS robin_map + EXPORT tsl-robin-mapTargets) + + install(EXPORT tsl-robin-mapTargets + NAMESPACE tsl:: + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/tsl-robin-map") + + + + ## Create and install tsl-robin-mapConfigVersion.cmake + # tsl-robin-map is header-only and does not depend on the architecture. + # Remove CMAKE_SIZEOF_VOID_P from tsl-robin-mapConfigVersion.cmake so that a + # tsl-robin-mapConfig.cmake generated for a 64 bit target can be used for 32 bit + # targets and vice versa. + set(CMAKE_SIZEOF_VOID_P_BACKUP ${CMAKE_SIZEOF_VOID_P}) + unset(CMAKE_SIZEOF_VOID_P) + write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/tsl-robin-mapConfigVersion.cmake" + COMPATIBILITY SameMajorVersion) + set(CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P_BACKUP}) + + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tsl-robin-mapConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/tsl-robin-map") +endif() diff --git a/include/tsl/LICENSE b/include/tsl/LICENSE new file mode 100644 index 0000000000..e9c5ae95f3 --- /dev/null +++ b/include/tsl/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Thibaut Goetghebuer-Planchon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/include/tsl/README.md b/include/tsl/README.md new file mode 100644 index 0000000000..612b277b13 --- /dev/null +++ b/include/tsl/README.md @@ -0,0 +1,483 @@ +[![Build Status](https://travis-ci.org/Tessil/robin-map.svg?branch=master)](https://travis-ci.org/Tessil/robin-map) [![Build status](https://ci.appveyor.com/api/projects/status/lo79n4ya4nta79q4/branch/master?svg=true)](https://ci.appveyor.com/project/Tessil/robin-map/branch/master) + +## A C++ implementation of a fast hash map and hash set using robin hood hashing + +The robin-map library is a C++ implementation of a fast hash map and hash set using open-addressing and linear robin hood hashing with backward shift deletion to resolve collisions. + +Four classes are provided: `tsl::robin_map`, `tsl::robin_set`, `tsl::robin_pg_map` and `tsl::robin_pg_set`. The first two are faster and use a power of two growth policy, the last two use a prime growth policy instead and are able to cope better with a poor hash function. Use the prime version if there is a chance of repeating patterns in the lower bits of your hash (e.g. you are storing pointers with an identity hash function). See [GrowthPolicy](#growth-policy) for details. + +A **benchmark** of `tsl::robin_map` against other hash maps may be found [here](https://tessil.github.io/2016/08/29/benchmark-hopscotch-map.html). This page also gives some advices on which hash table structure you should try for your use case (useful if you are a bit lost with the multiple hash tables implementations in the `tsl` namespace). + +### Key features + +- Header-only library, just add the [include](include/) directory to your include path and you are ready to go. If you use CMake, you can also use the `tsl::robin_map` exported target from the [CMakeLists.txt](CMakeLists.txt). +- Fast hash table, check the [benchmark](https://tessil.github.io/2016/08/29/benchmark-hopscotch-map.html) for some numbers. +- Support for move-only and non-default constructible key/value. +- Support for heterogeneous lookups allowing the usage of `find` with a type different than `Key` (e.g. if you have a map that uses `std::unique_ptr` as key, you can use a `foo*` or a `std::uintptr_t` as key parameter to `find` without constructing a `std::unique_ptr`, see [example](#heterogeneous-lookups)). +- No need to reserve any sentinel value from the keys. +- Possibility to store the hash value alongside the stored key-value for faster rehash and lookup if the hash or the key equal functions are expensive to compute. Note that hash may be stored even if not asked explicitly when the library can detect that it will have no impact on the size of the structure in memory due to alignment. See the [StoreHash](https://tessil.github.io/robin-map/classtsl_1_1robin__map.html#details) template parameter for details. +- If the hash is known before a lookup, it is possible to pass it as parameter to speed-up the lookup (see `precalculated_hash` parameter in [API](https://tessil.github.io/robin-map/classtsl_1_1robin__map.html#a35021b11aabb61820236692a54b3a0f8)). +- Support for efficient serialization and deserialization (see [example](#serialization) and the `serialize/deserialize` methods in the [API](https://tessil.github.io/robin-map/classtsl_1_1robin__map.html) for details). +- The library can be used with exceptions disabled (through `-fno-exceptions` option on Clang and GCC, without an `/EH` option on MSVC or simply by defining `TSL_NO_EXCEPTIONS`). `std::terminate` is used in replacement of the `throw` instruction when exceptions are disabled. +- API closely similar to `std::unordered_map` and `std::unordered_set`. + +### Differences compared to `std::unordered_map` + +`tsl::robin_map` tries to have an interface similar to `std::unordered_map`, but some differences exist. +- The **strong exception guarantee only holds** if the following statement is true `std::is_nothrow_swappable::value && std::is_nothrow_move_constructible::value` (where `value_type` is `Key` for `tsl::robin_set` and `std::pair` for `tsl::robin_map`). Otherwise if an exception is thrown during the swap or the move, the structure may end up in a undefined state. Note that per the standard, a `value_type` with a noexcept copy constructor and no move constructor also satisfies this condition and will thus guarantee the strong exception guarantee for the structure (see [API](https://tessil.github.io/robin-map/classtsl_1_1robin__map.html#details) for details). +- The type `Key`, and also `T` in case of map, must be swappable. They must also be copy and/or move constructible. +- Iterator invalidation doesn't behave in the same way, any operation modifying the hash table invalidate them (see [API](https://tessil.github.io/robin-map/classtsl_1_1robin__map.html#details) for details). +- References and pointers to keys or values in the map are invalidated in the same way as iterators to these keys-values. +- For iterators of `tsl::robin_map`, `operator*()` and `operator->()` return a reference and a pointer to `const std::pair` instead of `std::pair` making the value `T` not modifiable. To modify the value you have to call the `value()` method of the iterator to get a mutable reference. Example: +```c++ +tsl::robin_map map = {{1, 1}, {2, 1}, {3, 1}}; +for(auto it = map.begin(); it != map.end(); ++it) { + //it->second = 2; // Illegal + it.value() = 2; // Ok +} +``` +- No support for some buckets related methods (like `bucket_size`, `bucket`, ...). + +These differences also apply between `std::unordered_set` and `tsl::robin_set`. + +Thread-safety guarantees are the same as `std::unordered_map/set` (i.e. possible to have multiple readers with no writer). + +### Growth policy + +The library supports multiple growth policies through the `GrowthPolicy` template parameter. Three policies are provided by the library but you can easily implement your own if needed. + +* **[tsl::rh::power_of_two_growth_policy.](https://tessil.github.io/robin-map/classtsl_1_1rh_1_1power__of__two__growth__policy.html)** Default policy used by `tsl::robin_map/set`. This policy keeps the size of the bucket array of the hash table to a power of two. This constraint allows the policy to avoid the usage of the slow modulo operation to map a hash to a bucket, instead of hash % 2n, it uses hash & (2n - 1) (see [fast modulo](https://en.wikipedia.org/wiki/Modulo_operation#Performance_issues)). Fast but this may cause a lot of collisions with a poor hash function as the modulo with a power of two only masks the most significant bits in the end. +* **[tsl::rh::prime_growth_policy.](https://tessil.github.io/robin-map/classtsl_1_1rh_1_1prime__growth__policy.html)** Default policy used by `tsl::robin_pg_map/set`. The policy keeps the size of the bucket array of the hash table to a prime number. When mapping a hash to a bucket, using a prime number as modulo will result in a better distribution of the hash across the buckets even with a poor hash function. To allow the compiler to optimize the modulo operation, the policy use a lookup table with constant primes modulos (see [API](https://tessil.github.io/robin-map/classtsl_1_1rh_1_1prime__growth__policy.html#details) for details). Slower than `tsl::rh::power_of_two_growth_policy` but more secure. +* **[tsl::rh::mod_growth_policy.](https://tessil.github.io/robin-map/classtsl_1_1rh_1_1mod__growth__policy.html)** The policy grows the map by a customizable growth factor passed in parameter. It then just use the modulo operator to map a hash to a bucket. Slower but more flexible. + + +To implement your own policy, you have to implement the following interface. + +```c++ +struct custom_policy { + // Called on hash table construction and rehash, min_bucket_count_in_out is the minimum buckets + // that the hash table needs. The policy can change it to a higher number of buckets if needed + // and the hash table will use this value as bucket count. If 0 bucket is asked, then the value + // must stay at 0. + explicit custom_policy(std::size_t& min_bucket_count_in_out); + + // Return the bucket [0, bucket_count()) to which the hash belongs. + // If bucket_count() is 0, it must always return 0. + std::size_t bucket_for_hash(std::size_t hash) const noexcept; + + // Return the number of buckets that should be used on next growth + std::size_t next_bucket_count() const; + + // Maximum number of buckets supported by the policy + std::size_t max_bucket_count() const; + + // Reset the growth policy as if the policy was created with a bucket count of 0. + // After a clear, the policy must always return 0 when bucket_for_hash() is called. + void clear() noexcept; +} +``` + +### Installation + +To use robin-map, just add the [include](include/) directory to your include path. It is a **header-only** library. + +If you use CMake, you can also use the `tsl::robin_map` exported target from the [CMakeLists.txt](CMakeLists.txt) with `target_link_libraries`. +```cmake +# Example where the robin-map project is stored in a third-party directory +add_subdirectory(third-party/robin-map) +target_link_libraries(your_target PRIVATE tsl::robin_map) +``` + +If the project has been installed through `make install`, you can also use `find_package(tsl-robin-map REQUIRED)` instead of `add_subdirectory`. + +The library is available in [vcpkg](https://github.com/Microsoft/vcpkg/tree/master/ports/robin-map) and [conan](https://bintray.com/tessil/tsl/tsl-robin-map%3Atessil). It's also present in [Debian](https://packages.debian.org/buster/robin-map-dev), [Ubuntu](https://packages.ubuntu.com/disco/robin-map-dev) and [Fedora](https://apps.fedoraproject.org/packages/robin-map-devel) package repositories. + +The code should work with any C++11 standard-compliant compiler and has been tested with GCC 4.8.4, Clang 3.5.0 and Visual Studio 2015. + +To run the tests you will need the Boost Test library and CMake. + +```bash +git clone https://github.com/Tessil/robin-map.git +cd robin-map/tests +mkdir build +cd build +cmake .. +cmake --build . +./tsl_robin_map_tests +``` + +### Usage + +The API can be found [here](https://tessil.github.io/robin-map/). + +All methods are not documented yet, but they replicate the behavior of the ones in `std::unordered_map` and `std::unordered_set`, except if specified otherwise. + + +### Example + +```c++ +#include +#include +#include +#include +#include + +int main() { + tsl::robin_map map = {{"a", 1}, {"b", 2}}; + map["c"] = 3; + map["d"] = 4; + + map.insert({"e", 5}); + map.erase("b"); + + for(auto it = map.begin(); it != map.end(); ++it) { + //it->second += 2; // Not valid. + it.value() += 2; + } + + // {d, 6} {a, 3} {e, 7} {c, 5} + for(const auto& key_value : map) { + std::cout << "{" << key_value.first << ", " << key_value.second << "}" << std::endl; + } + + + if(map.find("a") != map.end()) { + std::cout << "Found \"a\"." << std::endl; + } + + const std::size_t precalculated_hash = std::hash()("a"); + // If we already know the hash beforehand, we can pass it in parameter to speed-up lookups. + if(map.find("a", precalculated_hash) != map.end()) { + std::cout << "Found \"a\" with hash " << precalculated_hash << "." << std::endl; + } + + + /* + * Calculating the hash and comparing two std::string may be slow. + * We can store the hash of each std::string in the hash map to make + * the inserts and lookups faster by setting StoreHash to true. + */ + tsl::robin_map, + std::equal_to, + std::allocator>, + true> map2; + + map2["a"] = 1; + map2["b"] = 2; + + // {a, 1} {b, 2} + for(const auto& key_value : map2) { + std::cout << "{" << key_value.first << ", " << key_value.second << "}" << std::endl; + } + + + + + tsl::robin_set set; + set.insert({1, 9, 0}); + set.insert({2, -1, 9}); + + // {0} {1} {2} {9} {-1} + for(const auto& key : set) { + std::cout << "{" << key << "}" << std::endl; + } +} +``` + +#### Heterogeneous lookups + +Heterogeneous overloads allow the usage of other types than `Key` for lookup and erase operations as long as the used types are hashable and comparable to `Key`. + +To activate the heterogeneous overloads in `tsl::robin_map/set`, the qualified-id `KeyEqual::is_transparent` must be valid. It works the same way as for [`std::map::find`](http://en.cppreference.com/w/cpp/container/map/find). You can either use [`std::equal_to<>`](http://en.cppreference.com/w/cpp/utility/functional/equal_to_void) or define your own function object. + +Both `KeyEqual` and `Hash` will need to be able to deal with the different types. + +```c++ +#include +#include +#include +#include + + +struct employee { + employee(int id, std::string name) : m_id(id), m_name(std::move(name)) { + } + + // Either we include the comparators in the class and we use `std::equal_to<>`... + friend bool operator==(const employee& empl, int empl_id) { + return empl.m_id == empl_id; + } + + friend bool operator==(int empl_id, const employee& empl) { + return empl_id == empl.m_id; + } + + friend bool operator==(const employee& empl1, const employee& empl2) { + return empl1.m_id == empl2.m_id; + } + + + int m_id; + std::string m_name; +}; + +// ... or we implement a separate class to compare employees. +struct equal_employee { + using is_transparent = void; + + bool operator()(const employee& empl, int empl_id) const { + return empl.m_id == empl_id; + } + + bool operator()(int empl_id, const employee& empl) const { + return empl_id == empl.m_id; + } + + bool operator()(const employee& empl1, const employee& empl2) const { + return empl1.m_id == empl2.m_id; + } +}; + +struct hash_employee { + std::size_t operator()(const employee& empl) const { + return std::hash()(empl.m_id); + } + + std::size_t operator()(int id) const { + return std::hash()(id); + } +}; + + +int main() { + // Use std::equal_to<> which will automatically deduce and forward the parameters + tsl::robin_map> map; + map.insert({employee(1, "John Doe"), 2001}); + map.insert({employee(2, "Jane Doe"), 2002}); + map.insert({employee(3, "John Smith"), 2003}); + + // John Smith 2003 + auto it = map.find(3); + if(it != map.end()) { + std::cout << it->first.m_name << " " << it->second << std::endl; + } + + map.erase(1); + + + + // Use a custom KeyEqual which has an is_transparent member type + tsl::robin_map map2; + map2.insert({employee(4, "Johnny Doe"), 2004}); + + // 2004 + std::cout << map2.at(4) << std::endl; +} +``` + + +#### Serialization + +The library provides an efficient way to serialize and deserialize a map or a set so that it can be saved to a file or send through the network. +To do so, it requires the user to provide a function object for both serialization and deserialization. + +```c++ +struct serializer { + // Must support the following types for U: std::int16_t, std::uint32_t, + // std::uint64_t, float and std::pair if a map is used or Key for + // a set. + template + void operator()(const U& value); +}; +``` + +```c++ +struct deserializer { + // Must support the following types for U: std::int16_t, std::uint32_t, + // std::uint64_t, float and std::pair if a map is used or Key for + // a set. + template + U operator()(); +}; +``` + +Note that the implementation leaves binary compatibility (endianness, float binary representation, size of int, ...) of the types it serializes/deserializes in the hands of the provided function objects if compatibility is required. + +More details regarding the `serialize` and `deserialize` methods can be found in the [API](https://tessil.github.io/robin-map/classtsl_1_1robin__map.html). + +```c++ +#include +#include +#include +#include +#include + + +class serializer { +public: + serializer(const char* file_name) { + m_ostream.exceptions(m_ostream.badbit | m_ostream.failbit); + m_ostream.open(file_name, std::ios::binary); + } + + template::value>::type* = nullptr> + void operator()(const T& value) { + m_ostream.write(reinterpret_cast(&value), sizeof(T)); + } + + void operator()(const std::pair& value) { + (*this)(value.first); + (*this)(value.second); + } + +private: + std::ofstream m_ostream; +}; + +class deserializer { +public: + deserializer(const char* file_name) { + m_istream.exceptions(m_istream.badbit | m_istream.failbit | m_istream.eofbit); + m_istream.open(file_name, std::ios::binary); + } + + template + T operator()() { + T value; + deserialize(value); + + return value; + } + +private: + template::value>::type* = nullptr> + void deserialize(T& value) { + m_istream.read(reinterpret_cast(&value), sizeof(T)); + } + + void deserialize(std::pair& value) { + deserialize(value.first); + deserialize(value.second); + } + +private: + std::ifstream m_istream; +}; + + +int main() { + const tsl::robin_map map = {{1, -1}, {2, -2}, {3, -3}, {4, -4}}; + + + const char* file_name = "robin_map.data"; + { + serializer serial(file_name); + map.serialize(serial); + } + + { + deserializer dserial(file_name); + auto map_deserialized = tsl::robin_map::deserialize(dserial); + + assert(map == map_deserialized); + } + + { + deserializer dserial(file_name); + + /** + * If the serialized and deserialized map are hash compatibles (see conditions in API), + * setting the argument to true speed-up the deserialization process as we don't have + * to recalculate the hash of each key. We also know how much space each bucket needs. + */ + const bool hash_compatible = true; + auto map_deserialized = + tsl::robin_map::deserialize(dserial, hash_compatible); + + assert(map == map_deserialized); + } +} +``` + +##### Serialization with Boost Serialization and compression with zlib + +It is possible to use a serialization library to avoid the boilerplate. + +The following example uses Boost Serialization with the Boost zlib compression stream to reduce the size of the resulting serialized file. The example requires C++20 due to the usage of the template parameter list syntax in lambdas, but it can be adapted to less recent versions. + +```c++ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace boost { namespace serialization { + template + void serialize(Archive & ar, tsl::robin_map& map, const unsigned int version) { + split_free(ar, map, version); + } + + template + void save(Archive & ar, const tsl::robin_map& map, const unsigned int /*version*/) { + auto serializer = [&ar](const auto& v) { ar & v; }; + map.serialize(serializer); + } + + template + void load(Archive & ar, tsl::robin_map& map, const unsigned int /*version*/) { + auto deserializer = [&ar]() { U u; ar & u; return u; }; + map = tsl::robin_map::deserialize(deserializer); + } +}} + + +int main() { + tsl::robin_map map = {{1, -1}, {2, -2}, {3, -3}, {4, -4}}; + + + const char* file_name = "robin_map.data"; + { + std::ofstream ofs; + ofs.exceptions(ofs.badbit | ofs.failbit); + ofs.open(file_name, std::ios::binary); + + boost::iostreams::filtering_ostream fo; + fo.push(boost::iostreams::zlib_compressor()); + fo.push(ofs); + + boost::archive::binary_oarchive oa(fo); + + oa << map; + } + + { + std::ifstream ifs; + ifs.exceptions(ifs.badbit | ifs.failbit | ifs.eofbit); + ifs.open(file_name, std::ios::binary); + + boost::iostreams::filtering_istream fi; + fi.push(boost::iostreams::zlib_decompressor()); + fi.push(ifs); + + boost::archive::binary_iarchive ia(fi); + + tsl::robin_map map_deserialized; + ia >> map_deserialized; + + assert(map == map_deserialized); + } +} +``` + +### License + +The code is licensed under the MIT license, see the [LICENSE file](LICENSE) for details. diff --git a/include/tsl/include/tsl/robin_growth_policy.h b/include/tsl/include/tsl/robin_growth_policy.h new file mode 100644 index 0000000000..ed17c840c4 --- /dev/null +++ b/include/tsl/include/tsl/robin_growth_policy.h @@ -0,0 +1,348 @@ +/** + * MIT License + * + * Copyright (c) 2017 Thibaut Goetghebuer-Planchon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef TSL_ROBIN_GROWTH_POLICY_H +#define TSL_ROBIN_GROWTH_POLICY_H + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef TSL_DEBUG +# define tsl_rh_assert(expr) assert(expr) +#else +# define tsl_rh_assert(expr) (static_cast(0)) +#endif + + +/** + * If exceptions are enabled, throw the exception passed in parameter, otherwise call std::terminate. + */ +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || (defined (_MSC_VER) && defined (_CPPUNWIND))) && !defined(TSL_NO_EXCEPTIONS) +# define TSL_RH_THROW_OR_TERMINATE(ex, msg) throw ex(msg) +#else +# define TSL_RH_NO_EXCEPTIONS +# ifdef NDEBUG +# define TSL_RH_THROW_OR_TERMINATE(ex, msg) std::terminate() +# else +# include +# define TSL_RH_THROW_OR_TERMINATE(ex, msg) do { std::cerr << msg << std::endl; std::terminate(); } while(0) +# endif +#endif + + +#if defined(__GNUC__) || defined(__clang__) +# define TSL_RH_LIKELY(exp) (__builtin_expect(!!(exp), true)) +#else +# define TSL_RH_LIKELY(exp) (exp) +#endif + + +namespace tsl { +namespace rh { + +/** + * Grow the hash table by a factor of GrowthFactor keeping the bucket count to a power of two. It allows + * the table to use a mask operation instead of a modulo operation to map a hash to a bucket. + * + * GrowthFactor must be a power of two >= 2. + */ +template +class power_of_two_growth_policy { +public: + /** + * Called on the hash table creation and on rehash. The number of buckets for the table is passed in parameter. + * This number is a minimum, the policy may update this value with a higher value if needed (but not lower). + * + * If 0 is given, min_bucket_count_in_out must still be 0 after the policy creation and + * bucket_for_hash must always return 0 in this case. + */ + explicit power_of_two_growth_policy(std::size_t& min_bucket_count_in_out) { + if(min_bucket_count_in_out > max_bucket_count()) { + TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); + } + + if(min_bucket_count_in_out > 0) { + min_bucket_count_in_out = round_up_to_power_of_two(min_bucket_count_in_out); + m_mask = min_bucket_count_in_out - 1; + } + else { + m_mask = 0; + } + } + + /** + * Return the bucket [0, bucket_count()) to which the hash belongs. + * If bucket_count() is 0, it must always return 0. + */ + std::size_t bucket_for_hash(std::size_t hash) const noexcept { + return hash & m_mask; + } + + /** + * Return the number of buckets that should be used on next growth. + */ + std::size_t next_bucket_count() const { + if((m_mask + 1) > max_bucket_count() / GrowthFactor) { + TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); + } + + return (m_mask + 1) * GrowthFactor; + } + + /** + * Return the maximum number of buckets supported by the policy. + */ + std::size_t max_bucket_count() const { + // Largest power of two. + return (std::numeric_limits::max() / 2) + 1; + } + + /** + * Reset the growth policy as if it was created with a bucket count of 0. + * After a clear, the policy must always return 0 when bucket_for_hash is called. + */ + void clear() noexcept { + m_mask = 0; + } + +private: + static std::size_t round_up_to_power_of_two(std::size_t value) { + if(is_power_of_two(value)) { + return value; + } + + if(value == 0) { + return 1; + } + + --value; + for(std::size_t i = 1; i < sizeof(std::size_t) * CHAR_BIT; i *= 2) { + value |= value >> i; + } + + return value + 1; + } + + static constexpr bool is_power_of_two(std::size_t value) { + return value != 0 && (value & (value - 1)) == 0; + } + +protected: + static_assert(is_power_of_two(GrowthFactor) && GrowthFactor >= 2, "GrowthFactor must be a power of two >= 2."); + + std::size_t m_mask; +}; + + +/** + * Grow the hash table by GrowthFactor::num / GrowthFactor::den and use a modulo to map a hash + * to a bucket. Slower but it can be useful if you want a slower growth. + */ +template> +class mod_growth_policy { +public: + explicit mod_growth_policy(std::size_t& min_bucket_count_in_out) { + if(min_bucket_count_in_out > max_bucket_count()) { + TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); + } + + if(min_bucket_count_in_out > 0) { + m_mod = min_bucket_count_in_out; + } + else { + m_mod = 1; + } + } + + std::size_t bucket_for_hash(std::size_t hash) const noexcept { + return hash % m_mod; + } + + std::size_t next_bucket_count() const { + if(m_mod == max_bucket_count()) { + TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); + } + + const double next_bucket_count = std::ceil(double(m_mod) * REHASH_SIZE_MULTIPLICATION_FACTOR); + if(!std::isnormal(next_bucket_count)) { + TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); + } + + if(next_bucket_count > double(max_bucket_count())) { + return max_bucket_count(); + } + else { + return std::size_t(next_bucket_count); + } + } + + std::size_t max_bucket_count() const { + return MAX_BUCKET_COUNT; + } + + void clear() noexcept { + m_mod = 1; + } + +private: + static constexpr double REHASH_SIZE_MULTIPLICATION_FACTOR = 1.0 * GrowthFactor::num / GrowthFactor::den; + static const std::size_t MAX_BUCKET_COUNT = + std::size_t(double( + std::numeric_limits::max() / REHASH_SIZE_MULTIPLICATION_FACTOR + )); + + static_assert(REHASH_SIZE_MULTIPLICATION_FACTOR >= 1.1, "Growth factor should be >= 1.1."); + + std::size_t m_mod; +}; + + + +namespace detail { + +#if SIZE_MAX >= ULLONG_MAX +#define TSL_RH_NB_PRIMES 51 +#elif SIZE_MAX >= ULONG_MAX +#define TSL_RH_NB_PRIMES 40 +#else +#define TSL_RH_NB_PRIMES 23 +#endif + +static constexpr const std::array PRIMES = {{ + 1u, 5u, 17u, 29u, 37u, 53u, 67u, 79u, 97u, 131u, 193u, 257u, 389u, 521u, 769u, 1031u, + 1543u, 2053u, 3079u, 6151u, 12289u, 24593u, 49157u, +#if SIZE_MAX >= ULONG_MAX + 98317ul, 196613ul, 393241ul, 786433ul, 1572869ul, 3145739ul, 6291469ul, 12582917ul, + 25165843ul, 50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul, 1610612741ul, + 3221225473ul, 4294967291ul, +#endif +#if SIZE_MAX >= ULLONG_MAX + 6442450939ull, 12884901893ull, 25769803751ull, 51539607551ull, 103079215111ull, 206158430209ull, + 412316860441ull, 824633720831ull, 1649267441651ull, 3298534883309ull, 6597069766657ull, +#endif +}}; + +template +static constexpr std::size_t mod(std::size_t hash) { return hash % PRIMES[IPrime]; } + +// MOD_PRIME[iprime](hash) returns hash % PRIMES[iprime]. This table allows for faster modulo as the +// compiler can optimize the modulo code better with a constant known at the compilation. +static constexpr const std::array MOD_PRIME = {{ + &mod<0>, &mod<1>, &mod<2>, &mod<3>, &mod<4>, &mod<5>, &mod<6>, &mod<7>, &mod<8>, &mod<9>, &mod<10>, + &mod<11>, &mod<12>, &mod<13>, &mod<14>, &mod<15>, &mod<16>, &mod<17>, &mod<18>, &mod<19>, &mod<20>, + &mod<21>, &mod<22>, +#if SIZE_MAX >= ULONG_MAX + &mod<23>, &mod<24>, &mod<25>, &mod<26>, &mod<27>, &mod<28>, &mod<29>, &mod<30>, &mod<31>, &mod<32>, + &mod<33>, &mod<34>, &mod<35>, &mod<36>, &mod<37> , &mod<38>, &mod<39>, +#endif +#if SIZE_MAX >= ULLONG_MAX + &mod<40>, &mod<41>, &mod<42>, &mod<43>, &mod<44>, &mod<45>, &mod<46>, &mod<47>, &mod<48>, &mod<49>, + &mod<50>, +#endif +}}; + +} + +/** + * Grow the hash table by using prime numbers as bucket count. Slower than tsl::rh::power_of_two_growth_policy in + * general but will probably distribute the values around better in the buckets with a poor hash function. + * + * To allow the compiler to optimize the modulo operation, a lookup table is used with constant primes numbers. + * + * With a switch the code would look like: + * \code + * switch(iprime) { // iprime is the current prime of the hash table + * case 0: hash % 5ul; + * break; + * case 1: hash % 17ul; + * break; + * case 2: hash % 29ul; + * break; + * ... + * } + * \endcode + * + * Due to the constant variable in the modulo the compiler is able to optimize the operation + * by a series of multiplications, substractions and shifts. + * + * The 'hash % 5' could become something like 'hash - (hash * 0xCCCCCCCD) >> 34) * 5' in a 64 bits environment. + */ +class prime_growth_policy { +public: + explicit prime_growth_policy(std::size_t& min_bucket_count_in_out) { + auto it_prime = std::lower_bound(detail::PRIMES.begin(), + detail::PRIMES.end(), min_bucket_count_in_out); + if(it_prime == detail::PRIMES.end()) { + TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); + } + + m_iprime = static_cast(std::distance(detail::PRIMES.begin(), it_prime)); + if(min_bucket_count_in_out > 0) { + min_bucket_count_in_out = *it_prime; + } + else { + min_bucket_count_in_out = 0; + } + } + + std::size_t bucket_for_hash(std::size_t hash) const noexcept { + return detail::MOD_PRIME[m_iprime](hash); + } + + std::size_t next_bucket_count() const { + if(m_iprime + 1 >= detail::PRIMES.size()) { + TSL_RH_THROW_OR_TERMINATE(std::length_error, "The hash table exceeds its maximum size."); + } + + return detail::PRIMES[m_iprime + 1]; + } + + std::size_t max_bucket_count() const { + return detail::PRIMES.back(); + } + + void clear() noexcept { + m_iprime = 0; + } + +private: + unsigned int m_iprime; + + static_assert(std::numeric_limits::max() >= detail::PRIMES.size(), + "The type of m_iprime is not big enough."); +}; + +} +} + +#endif diff --git a/include/tsl/include/tsl/robin_hash.h b/include/tsl/include/tsl/robin_hash.h new file mode 100644 index 0000000000..e8bc5e68fb --- /dev/null +++ b/include/tsl/include/tsl/robin_hash.h @@ -0,0 +1,1451 @@ +/** + * MIT License + * + * Copyright (c) 2017 Thibaut Goetghebuer-Planchon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef TSL_ROBIN_HASH_H +#define TSL_ROBIN_HASH_H + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "robin_growth_policy.h" + + +namespace tsl { + +namespace detail_robin_hash { + +template +struct make_void { + using type = void; +}; + +template +struct has_is_transparent: std::false_type { +}; + +template +struct has_is_transparent::type>: std::true_type { +}; + +template +struct is_power_of_two_policy: std::false_type { +}; + +template +struct is_power_of_two_policy>: std::true_type { +}; + +// Only available in C++17, we need to be compatible with C++11 +template +const T& clamp( const T& v, const T& lo, const T& hi) { + return std::min(hi, std::max(lo, v)); +} + +template +static T numeric_cast(U value, const char* error_message = "numeric_cast() failed.") { + T ret = static_cast(value); + if(static_cast(ret) != value) { + TSL_RH_THROW_OR_TERMINATE(std::runtime_error, error_message); + } + + const bool is_same_signedness = (std::is_unsigned::value && std::is_unsigned::value) || + (std::is_signed::value && std::is_signed::value); + if(!is_same_signedness && (ret < T{}) != (value < U{})) { + TSL_RH_THROW_OR_TERMINATE(std::runtime_error, error_message); + } + + return ret; +} + + +using truncated_hash_type = std::uint_least32_t; + +/** + * Helper class that stores a truncated hash if StoreHash is true and nothing otherwise. + */ +template +class bucket_entry_hash { +public: + bool bucket_hash_equal(std::size_t /*hash*/) const noexcept { + return true; + } + + truncated_hash_type truncated_hash() const noexcept { + return 0; + } + +protected: + void set_hash(truncated_hash_type /*hash*/) noexcept { + } +}; + +template<> +class bucket_entry_hash { +public: + bool bucket_hash_equal(std::size_t hash) const noexcept { + return m_hash == truncated_hash_type(hash); + } + + truncated_hash_type truncated_hash() const noexcept { + return m_hash; + } + +protected: + void set_hash(truncated_hash_type hash) noexcept { + m_hash = truncated_hash_type(hash); + } + +private: + truncated_hash_type m_hash; +}; + + +/** + * Each bucket entry has: + * - A value of type `ValueType`. + * - An integer to store how far the value of the bucket, if any, is from its ideal bucket + * (ex: if the current bucket 5 has the value 'foo' and `hash('foo') % nb_buckets` == 3, + * `dist_from_ideal_bucket()` will return 2 as the current value of the bucket is two + * buckets away from its ideal bucket) + * If there is no value in the bucket (i.e. `empty()` is true) `dist_from_ideal_bucket()` will be < 0. + * - A marker which tells us if the bucket is the last bucket of the bucket array (useful for the + * iterator of the hash table). + * - If `StoreHash` is true, 32 bits of the hash of the value, if any, are also stored in the bucket. + * If the size of the hash is more than 32 bits, it is truncated. We don't store the full hash + * as storing the hash is a potential opportunity to use the unused space due to the alignment + * of the bucket_entry structure. We can thus potentially store the hash without any extra space + * (which would not be possible with 64 bits of the hash). + */ +template +class bucket_entry: public bucket_entry_hash { + using bucket_hash = bucket_entry_hash; + +public: + using value_type = ValueType; + using distance_type = std::int_least16_t; + + + bucket_entry() noexcept: bucket_hash(), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), + m_last_bucket(false) + { + tsl_rh_assert(empty()); + } + + bucket_entry(bool last_bucket) noexcept: bucket_hash(), m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), + m_last_bucket(last_bucket) + { + tsl_rh_assert(empty()); + } + + bucket_entry(const bucket_entry& other) noexcept(std::is_nothrow_copy_constructible::value): + bucket_hash(other), + m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), + m_last_bucket(other.m_last_bucket) + { + if(!other.empty()) { + ::new (static_cast(std::addressof(m_value))) value_type(other.value()); + m_dist_from_ideal_bucket = other.m_dist_from_ideal_bucket; + } + } + + /** + * Never really used, but still necessary as we must call resize on an empty `std::vector`. + * and we need to support move-only types. See robin_hash constructor for details. + */ + bucket_entry(bucket_entry&& other) noexcept(std::is_nothrow_move_constructible::value): + bucket_hash(std::move(other)), + m_dist_from_ideal_bucket(EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET), + m_last_bucket(other.m_last_bucket) + { + if(!other.empty()) { + ::new (static_cast(std::addressof(m_value))) value_type(std::move(other.value())); + m_dist_from_ideal_bucket = other.m_dist_from_ideal_bucket; + } + } + + bucket_entry& operator=(const bucket_entry& other) + noexcept(std::is_nothrow_copy_constructible::value) + { + if(this != &other) { + clear(); + + bucket_hash::operator=(other); + if(!other.empty()) { + ::new (static_cast(std::addressof(m_value))) value_type(other.value()); + } + + m_dist_from_ideal_bucket = other.m_dist_from_ideal_bucket; + m_last_bucket = other.m_last_bucket; + } + + return *this; + } + + bucket_entry& operator=(bucket_entry&& ) = delete; + + ~bucket_entry() noexcept { + clear(); + } + + void clear() noexcept { + if(!empty()) { + destroy_value(); + m_dist_from_ideal_bucket = EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET; + } + } + + bool empty() const noexcept { + return m_dist_from_ideal_bucket == EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET; + } + + value_type& value() noexcept { + tsl_rh_assert(!empty()); + return *reinterpret_cast(std::addressof(m_value)); + } + + const value_type& value() const noexcept { + tsl_rh_assert(!empty()); + return *reinterpret_cast(std::addressof(m_value)); + } + + distance_type dist_from_ideal_bucket() const noexcept { + return m_dist_from_ideal_bucket; + } + + bool last_bucket() const noexcept { + return m_last_bucket; + } + + void set_as_last_bucket() noexcept { + m_last_bucket = true; + } + + template + void set_value_of_empty_bucket(distance_type dist_from_ideal_bucket, + truncated_hash_type hash, Args&&... value_type_args) + { + tsl_rh_assert(dist_from_ideal_bucket >= 0); + tsl_rh_assert(empty()); + + ::new (static_cast(std::addressof(m_value))) value_type(std::forward(value_type_args)...); + this->set_hash(hash); + m_dist_from_ideal_bucket = dist_from_ideal_bucket; + + tsl_rh_assert(!empty()); + } + + void swap_with_value_in_bucket(distance_type& dist_from_ideal_bucket, + truncated_hash_type& hash, value_type& value) + { + tsl_rh_assert(!empty()); + + using std::swap; + swap(value, this->value()); + swap(dist_from_ideal_bucket, m_dist_from_ideal_bucket); + + // Avoid warning of unused variable if StoreHash is false + (void) hash; + if(StoreHash) { + const truncated_hash_type tmp_hash = this->truncated_hash(); + this->set_hash(hash); + hash = tmp_hash; + } + } + + static truncated_hash_type truncate_hash(std::size_t hash) noexcept { + return truncated_hash_type(hash); + } + +private: + void destroy_value() noexcept { + tsl_rh_assert(!empty()); + value().~value_type(); + } + +public: + static const distance_type DIST_FROM_IDEAL_BUCKET_LIMIT = 4096; + static_assert(DIST_FROM_IDEAL_BUCKET_LIMIT <= std::numeric_limits::max() - 1, + "DIST_FROM_IDEAL_BUCKET_LIMIT must be <= std::numeric_limits::max() - 1."); + +private: + using storage = typename std::aligned_storage::type; + + static const distance_type EMPTY_MARKER_DIST_FROM_IDEAL_BUCKET = -1; + + distance_type m_dist_from_ideal_bucket; + bool m_last_bucket; + storage m_value; +}; + + + +/** + * Internal common class used by `robin_map` and `robin_set`. + * + * ValueType is what will be stored by `robin_hash` (usually `std::pair` for map and `Key` for set). + * + * `KeySelect` should be a `FunctionObject` which takes a `ValueType` in parameter and returns a + * reference to the key. + * + * `ValueSelect` should be a `FunctionObject` which takes a `ValueType` in parameter and returns a + * reference to the value. `ValueSelect` should be void if there is no value (in a set for example). + * + * The strong exception guarantee only holds if the expression + * `std::is_nothrow_swappable::value && std::is_nothrow_move_constructible::value` is true. + * + * Behaviour is undefined if the destructor of `ValueType` throws. + */ +template +class robin_hash: private Hash, private KeyEqual, private GrowthPolicy { +private: + template + using has_mapped_type = typename std::integral_constant::value>; + + static_assert(noexcept(std::declval().bucket_for_hash(std::size_t(0))), "GrowthPolicy::bucket_for_hash must be noexcept."); + static_assert(noexcept(std::declval().clear()), "GrowthPolicy::clear must be noexcept."); + +public: + template + class robin_iterator; + + using key_type = typename KeySelect::key_type; + using value_type = ValueType; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using hasher = Hash; + using key_equal = KeyEqual; + using allocator_type = Allocator; + using reference = value_type&; + using const_reference = const value_type&; + using pointer = value_type*; + using const_pointer = const value_type*; + using iterator = robin_iterator; + using const_iterator = robin_iterator; + + +private: + /** + * Either store the hash because we are asked by the `StoreHash` template parameter + * or store the hash because it doesn't cost us anything in size and can be used to speed up rehash. + */ + static constexpr bool STORE_HASH = StoreHash || + ( + (sizeof(tsl::detail_robin_hash::bucket_entry) == + sizeof(tsl::detail_robin_hash::bucket_entry)) + && + (sizeof(std::size_t) == sizeof(truncated_hash_type) || + is_power_of_two_policy::value) + && + // Don't store the hash for primitive types with default hash. + (!std::is_arithmetic::value || + !std::is_same>::value) + ); + + /** + * Only use the stored hash on lookup if we are explicitly asked. We are not sure how slow + * the KeyEqual operation is. An extra comparison may slow things down with a fast KeyEqual. + */ + static constexpr bool USE_STORED_HASH_ON_LOOKUP = StoreHash; + + /** + * We can only use the hash on rehash if the size of the hash type is the same as the stored one or + * if we use a power of two modulo. In the case of the power of two modulo, we just mask + * the least significant bytes, we just have to check that the truncated_hash_type didn't truncated + * more bytes. + */ + static bool USE_STORED_HASH_ON_REHASH(size_type bucket_count) { + (void) bucket_count; + if(STORE_HASH && sizeof(std::size_t) == sizeof(truncated_hash_type)) { + return true; + } + else if(STORE_HASH && is_power_of_two_policy::value) { + tsl_rh_assert(bucket_count > 0); + return (bucket_count - 1) <= std::numeric_limits::max(); + } + else { + return false; + } + } + + using bucket_entry = tsl::detail_robin_hash::bucket_entry; + using distance_type = typename bucket_entry::distance_type; + + using buckets_allocator = typename std::allocator_traits::template rebind_alloc; + using buckets_container_type = std::vector; + + +public: + /** + * The 'operator*()' and 'operator->()' methods return a const reference and const pointer respectively to the + * stored value type. + * + * In case of a map, to get a mutable reference to the value associated to a key (the '.second' in the + * stored pair), you have to call 'value()'. + * + * The main reason for this is that if we returned a `std::pair&` instead + * of a `const std::pair&`, the user may modify the key which will put the map in a undefined state. + */ + template + class robin_iterator { + friend class robin_hash; + + private: + using bucket_entry_ptr = typename std::conditional::type; + + + robin_iterator(bucket_entry_ptr bucket) noexcept: m_bucket(bucket) { + } + + public: + using iterator_category = std::forward_iterator_tag; + using value_type = const typename robin_hash::value_type; + using difference_type = std::ptrdiff_t; + using reference = value_type&; + using pointer = value_type*; + + + robin_iterator() noexcept { + } + + // Copy constructor from iterator to const_iterator. + template::type* = nullptr> + robin_iterator(const robin_iterator& other) noexcept: m_bucket(other.m_bucket) { + } + + robin_iterator(const robin_iterator& other) = default; + robin_iterator(robin_iterator&& other) = default; + robin_iterator& operator=(const robin_iterator& other) = default; + robin_iterator& operator=(robin_iterator&& other) = default; + + const typename robin_hash::key_type& key() const { + return KeySelect()(m_bucket->value()); + } + + template::value && IsConst>::type* = nullptr> + const typename U::value_type& value() const { + return U()(m_bucket->value()); + } + + template::value && !IsConst>::type* = nullptr> + typename U::value_type& value() const { + return U()(m_bucket->value()); + } + + reference operator*() const { + return m_bucket->value(); + } + + pointer operator->() const { + return std::addressof(m_bucket->value()); + } + + robin_iterator& operator++() { + while(true) { + if(m_bucket->last_bucket()) { + ++m_bucket; + return *this; + } + + ++m_bucket; + if(!m_bucket->empty()) { + return *this; + } + } + } + + robin_iterator operator++(int) { + robin_iterator tmp(*this); + ++*this; + + return tmp; + } + + friend bool operator==(const robin_iterator& lhs, const robin_iterator& rhs) { + return lhs.m_bucket == rhs.m_bucket; + } + + friend bool operator!=(const robin_iterator& lhs, const robin_iterator& rhs) { + return !(lhs == rhs); + } + + private: + bucket_entry_ptr m_bucket; + }; + + +public: +#if defined(__cplusplus) && __cplusplus >= 201402L + robin_hash(size_type bucket_count, + const Hash& hash, + const KeyEqual& equal, + const Allocator& alloc, + float min_load_factor = DEFAULT_MIN_LOAD_FACTOR, + float max_load_factor = DEFAULT_MAX_LOAD_FACTOR): + Hash(hash), + KeyEqual(equal), + GrowthPolicy(bucket_count), + m_buckets_data( + [&]() { + if(bucket_count > max_bucket_count()) { + TSL_RH_THROW_OR_TERMINATE(std::length_error, + "The map exceeds its maximum bucket count."); + } + + return bucket_count; + }(), alloc + ), + m_buckets(m_buckets_data.empty()?static_empty_bucket_ptr():m_buckets_data.data()), + m_bucket_count(bucket_count), + m_nb_elements(0), + m_grow_on_next_insert(false), + m_try_shrink_on_next_insert(false) + { + if(m_bucket_count > 0) { + tsl_rh_assert(!m_buckets_data.empty()); + m_buckets_data.back().set_as_last_bucket(); + } + + this->min_load_factor(min_load_factor); + this->max_load_factor(max_load_factor); + } +#else + /** + * C++11 doesn't support the creation of a std::vector with a custom allocator and 'count' default-inserted elements. + * The needed contructor `explicit vector(size_type count, const Allocator& alloc = Allocator());` is only + * available in C++14 and later. We thus must resize after using the `vector(const Allocator& alloc)` constructor. + * + * We can't use `vector(size_type count, const T& value, const Allocator& alloc)` as it requires the + * value T to be copyable. + */ + robin_hash(size_type bucket_count, + const Hash& hash, + const KeyEqual& equal, + const Allocator& alloc, + float min_load_factor = DEFAULT_MIN_LOAD_FACTOR, + float max_load_factor = DEFAULT_MAX_LOAD_FACTOR): + Hash(hash), + KeyEqual(equal), + GrowthPolicy(bucket_count), + m_buckets_data(alloc), + m_buckets(static_empty_bucket_ptr()), + m_bucket_count(bucket_count), + m_nb_elements(0), + m_grow_on_next_insert(false), + m_try_shrink_on_next_insert(false) + { + if(bucket_count > max_bucket_count()) { + TSL_RH_THROW_OR_TERMINATE(std::length_error, "The map exceeds its maximum bucket count."); + } + + if(m_bucket_count > 0) { + m_buckets_data.resize(m_bucket_count); + m_buckets = m_buckets_data.data(); + + tsl_rh_assert(!m_buckets_data.empty()); + m_buckets_data.back().set_as_last_bucket(); + } + + this->min_load_factor(min_load_factor); + this->max_load_factor(max_load_factor); + } +#endif + + robin_hash(const robin_hash& other): Hash(other), + KeyEqual(other), + GrowthPolicy(other), + m_buckets_data(other.m_buckets_data), + m_buckets(m_buckets_data.empty()?static_empty_bucket_ptr():m_buckets_data.data()), + m_bucket_count(other.m_bucket_count), + m_nb_elements(other.m_nb_elements), + m_load_threshold(other.m_load_threshold), + m_min_load_factor(other.m_min_load_factor), + m_max_load_factor(other.m_max_load_factor), + m_grow_on_next_insert(other.m_grow_on_next_insert), + m_try_shrink_on_next_insert(other.m_try_shrink_on_next_insert) + { + } + + robin_hash(robin_hash&& other) noexcept(std::is_nothrow_move_constructible::value && + std::is_nothrow_move_constructible::value && + std::is_nothrow_move_constructible::value && + std::is_nothrow_move_constructible::value) + : Hash(std::move(static_cast(other))), + KeyEqual(std::move(static_cast(other))), + GrowthPolicy(std::move(static_cast(other))), + m_buckets_data(std::move(other.m_buckets_data)), + m_buckets(m_buckets_data.empty()?static_empty_bucket_ptr():m_buckets_data.data()), + m_bucket_count(other.m_bucket_count), + m_nb_elements(other.m_nb_elements), + m_load_threshold(other.m_load_threshold), + m_min_load_factor(other.m_min_load_factor), + m_max_load_factor(other.m_max_load_factor), + m_grow_on_next_insert(other.m_grow_on_next_insert), + m_try_shrink_on_next_insert(other.m_try_shrink_on_next_insert) + { + other.clear_and_shrink(); + } + + robin_hash& operator=(const robin_hash& other) { + if(&other != this) { + Hash::operator=(other); + KeyEqual::operator=(other); + GrowthPolicy::operator=(other); + + m_buckets_data = other.m_buckets_data; + m_buckets = m_buckets_data.empty()?static_empty_bucket_ptr(): + m_buckets_data.data(); + m_bucket_count = other.m_bucket_count; + m_nb_elements = other.m_nb_elements; + + m_load_threshold = other.m_load_threshold; + m_min_load_factor = other.m_min_load_factor; + m_max_load_factor = other.m_max_load_factor; + + m_grow_on_next_insert = other.m_grow_on_next_insert; + m_try_shrink_on_next_insert = other.m_try_shrink_on_next_insert; + } + + return *this; + } + + robin_hash& operator=(robin_hash&& other) { + other.swap(*this); + other.clear(); + + return *this; + } + + allocator_type get_allocator() const { + return m_buckets_data.get_allocator(); + } + + + /* + * Iterators + */ + iterator begin() noexcept { + std::size_t i = 0; + while(i < m_bucket_count && m_buckets[i].empty()) { + i++; + } + + return iterator(m_buckets + i); + } + + const_iterator begin() const noexcept { + return cbegin(); + } + + const_iterator cbegin() const noexcept { + std::size_t i = 0; + while(i < m_bucket_count && m_buckets[i].empty()) { + i++; + } + + return const_iterator(m_buckets + i); + } + + iterator end() noexcept { + return iterator(m_buckets + m_bucket_count); + } + + const_iterator end() const noexcept { + return cend(); + } + + const_iterator cend() const noexcept { + return const_iterator(m_buckets + m_bucket_count); + } + + + /* + * Capacity + */ + bool empty() const noexcept { + return m_nb_elements == 0; + } + + size_type size() const noexcept { + return m_nb_elements; + } + + size_type max_size() const noexcept { + return m_buckets_data.max_size(); + } + + /* + * Modifiers + */ + void clear() noexcept { + if(m_min_load_factor > 0.0f) { + clear_and_shrink(); + } + else { + for(auto& bucket: m_buckets_data) { + bucket.clear(); + } + + m_nb_elements = 0; + m_grow_on_next_insert = false; + } + } + + + + template + std::pair insert(P&& value) { + return insert_impl(KeySelect()(value), std::forward

(value)); + } + + template + iterator insert_hint(const_iterator hint, P&& value) { + if(hint != cend() && compare_keys(KeySelect()(*hint), KeySelect()(value))) { + return mutable_iterator(hint); + } + + return insert(std::forward

(value)).first; + } + + template + void insert(InputIt first, InputIt last) { + if(std::is_base_of::iterator_category>::value) + { + const auto nb_elements_insert = std::distance(first, last); + const size_type nb_free_buckets = m_load_threshold - size(); + tsl_rh_assert(m_load_threshold >= size()); + + if(nb_elements_insert > 0 && nb_free_buckets < size_type(nb_elements_insert)) { + reserve(size() + size_type(nb_elements_insert)); + } + } + + for(; first != last; ++first) { + insert(*first); + } + } + + + + template + std::pair insert_or_assign(K&& key, M&& obj) { + auto it = try_emplace(std::forward(key), std::forward(obj)); + if(!it.second) { + it.first.value() = std::forward(obj); + } + + return it; + } + + template + iterator insert_or_assign(const_iterator hint, K&& key, M&& obj) { + if(hint != cend() && compare_keys(KeySelect()(*hint), key)) { + auto it = mutable_iterator(hint); + it.value() = std::forward(obj); + + return it; + } + + return insert_or_assign(std::forward(key), std::forward(obj)).first; + } + + + template + std::pair emplace(Args&&... args) { + return insert(value_type(std::forward(args)...)); + } + + template + iterator emplace_hint(const_iterator hint, Args&&... args) { + return insert_hint(hint, value_type(std::forward(args)...)); + } + + + + template + std::pair try_emplace(K&& key, Args&&... args) { + return insert_impl(key, std::piecewise_construct, + std::forward_as_tuple(std::forward(key)), + std::forward_as_tuple(std::forward(args)...)); + } + + template + iterator try_emplace_hint(const_iterator hint, K&& key, Args&&... args) { + if(hint != cend() && compare_keys(KeySelect()(*hint), key)) { + return mutable_iterator(hint); + } + + return try_emplace(std::forward(key), std::forward(args)...).first; + } + + /** + * Here to avoid `template size_type erase(const K& key)` being used when + * we use an `iterator` instead of a `const_iterator`. + */ + iterator erase(iterator pos) { + erase_from_bucket(pos); + + /** + * Erase bucket used a backward shift after clearing the bucket. + * Check if there is a new value in the bucket, if not get the next non-empty. + */ + if(pos.m_bucket->empty()) { + ++pos; + } + + m_try_shrink_on_next_insert = true; + + return pos; + } + + iterator erase(const_iterator pos) { + return erase(mutable_iterator(pos)); + } + + iterator erase(const_iterator first, const_iterator last) { + if(first == last) { + return mutable_iterator(first); + } + + auto first_mutable = mutable_iterator(first); + auto last_mutable = mutable_iterator(last); + for(auto it = first_mutable.m_bucket; it != last_mutable.m_bucket; ++it) { + if(!it->empty()) { + it->clear(); + m_nb_elements--; + } + } + + if(last_mutable == end()) { + m_try_shrink_on_next_insert = true; + return end(); + } + + + /* + * Backward shift on the values which come after the deleted values. + * We try to move the values closer to their ideal bucket. + */ + std::size_t icloser_bucket = static_cast(first_mutable.m_bucket - m_buckets); + std::size_t ito_move_closer_value = static_cast(last_mutable.m_bucket - m_buckets); + tsl_rh_assert(ito_move_closer_value > icloser_bucket); + + const std::size_t ireturn_bucket = ito_move_closer_value - + std::min(ito_move_closer_value - icloser_bucket, + std::size_t(m_buckets[ito_move_closer_value].dist_from_ideal_bucket())); + + while(ito_move_closer_value < m_bucket_count && m_buckets[ito_move_closer_value].dist_from_ideal_bucket() > 0) { + icloser_bucket = ito_move_closer_value - + std::min(ito_move_closer_value - icloser_bucket, + std::size_t(m_buckets[ito_move_closer_value].dist_from_ideal_bucket())); + + + tsl_rh_assert(m_buckets[icloser_bucket].empty()); + const distance_type new_distance = distance_type(m_buckets[ito_move_closer_value].dist_from_ideal_bucket() - + (ito_move_closer_value - icloser_bucket)); + m_buckets[icloser_bucket].set_value_of_empty_bucket(new_distance, + m_buckets[ito_move_closer_value].truncated_hash(), + std::move(m_buckets[ito_move_closer_value].value())); + m_buckets[ito_move_closer_value].clear(); + + + ++icloser_bucket; + ++ito_move_closer_value; + } + + m_try_shrink_on_next_insert = true; + + return iterator(m_buckets + ireturn_bucket); + } + + + template + size_type erase(const K& key) { + return erase(key, hash_key(key)); + } + + template + size_type erase(const K& key, std::size_t hash) { + auto it = find(key, hash); + if(it != end()) { + erase_from_bucket(it); + m_try_shrink_on_next_insert = true; + + return 1; + } + else { + return 0; + } + } + + + + + + void swap(robin_hash& other) { + using std::swap; + + swap(static_cast(*this), static_cast(other)); + swap(static_cast(*this), static_cast(other)); + swap(static_cast(*this), static_cast(other)); + swap(m_buckets_data, other.m_buckets_data); + swap(m_buckets, other.m_buckets); + swap(m_bucket_count, other.m_bucket_count); + swap(m_nb_elements, other.m_nb_elements); + swap(m_load_threshold, other.m_load_threshold); + swap(m_min_load_factor, other.m_min_load_factor); + swap(m_max_load_factor, other.m_max_load_factor); + swap(m_grow_on_next_insert, other.m_grow_on_next_insert); + swap(m_try_shrink_on_next_insert, other.m_try_shrink_on_next_insert); + } + + + /* + * Lookup + */ + template::value>::type* = nullptr> + typename U::value_type& at(const K& key) { + return at(key, hash_key(key)); + } + + template::value>::type* = nullptr> + typename U::value_type& at(const K& key, std::size_t hash) { + return const_cast(static_cast(this)->at(key, hash)); + } + + + template::value>::type* = nullptr> + const typename U::value_type& at(const K& key) const { + return at(key, hash_key(key)); + } + + template::value>::type* = nullptr> + const typename U::value_type& at(const K& key, std::size_t hash) const { + auto it = find(key, hash); + if(it != cend()) { + return it.value(); + } + else { + TSL_RH_THROW_OR_TERMINATE(std::out_of_range, "Couldn't find key."); + } + } + + template::value>::type* = nullptr> + typename U::value_type& operator[](K&& key) { + return try_emplace(std::forward(key)).first.value(); + } + + + template + size_type count(const K& key) const { + return count(key, hash_key(key)); + } + + template + size_type count(const K& key, std::size_t hash) const { + if(find(key, hash) != cend()) { + return 1; + } + else { + return 0; + } + } + + + template + iterator find(const K& key) { + return find_impl(key, hash_key(key)); + } + + template + iterator find(const K& key, std::size_t hash) { + return find_impl(key, hash); + } + + + template + const_iterator find(const K& key) const { + return find_impl(key, hash_key(key)); + } + + template + const_iterator find(const K& key, std::size_t hash) const { + return find_impl(key, hash); + } + + + template + bool contains(const K& key) const { + return contains(key, hash_key(key)); + } + + template + bool contains(const K& key, std::size_t hash) const { + return count(key, hash) != 0; + } + + + template + std::pair equal_range(const K& key) { + return equal_range(key, hash_key(key)); + } + + template + std::pair equal_range(const K& key, std::size_t hash) { + iterator it = find(key, hash); + return std::make_pair(it, (it == end())?it:std::next(it)); + } + + + template + std::pair equal_range(const K& key) const { + return equal_range(key, hash_key(key)); + } + + template + std::pair equal_range(const K& key, std::size_t hash) const { + const_iterator it = find(key, hash); + return std::make_pair(it, (it == cend())?it:std::next(it)); + } + + /* + * Bucket interface + */ + size_type bucket_count() const { + return m_bucket_count; + } + + size_type max_bucket_count() const { + return std::min(GrowthPolicy::max_bucket_count(), m_buckets_data.max_size()); + } + + /* + * Hash policy + */ + float load_factor() const { + if(bucket_count() == 0) { + return 0; + } + + return float(m_nb_elements)/float(bucket_count()); + } + + float min_load_factor() const { + return m_min_load_factor; + } + + float max_load_factor() const { + return m_max_load_factor; + } + + void min_load_factor(float ml) { + m_min_load_factor = clamp(ml, float(MINIMUM_MIN_LOAD_FACTOR), + float(MAXIMUM_MIN_LOAD_FACTOR)); + } + + void max_load_factor(float ml) { + m_max_load_factor = clamp(ml, float(MINIMUM_MAX_LOAD_FACTOR), + float(MAXIMUM_MAX_LOAD_FACTOR)); + m_load_threshold = size_type(float(bucket_count())*m_max_load_factor); + } + + void rehash(size_type count) { + count = std::max(count, size_type(std::ceil(float(size())/max_load_factor()))); + rehash_impl(count); + } + + void reserve(size_type count) { + rehash(size_type(std::ceil(float(count)/max_load_factor()))); + } + + /* + * Observers + */ + hasher hash_function() const { + return static_cast(*this); + } + + key_equal key_eq() const { + return static_cast(*this); + } + + + /* + * Other + */ + iterator mutable_iterator(const_iterator pos) { + return iterator(const_cast(pos.m_bucket)); + } + +private: + template + std::size_t hash_key(const K& key) const { + return Hash::operator()(key); + } + + template + bool compare_keys(const K1& key1, const K2& key2) const { + return KeyEqual::operator()(key1, key2); + } + + std::size_t bucket_for_hash(std::size_t hash) const { + const std::size_t bucket = GrowthPolicy::bucket_for_hash(hash); + tsl_rh_assert(bucket < m_bucket_count || (bucket == 0 && m_bucket_count == 0)); + + return bucket; + } + + template::value>::type* = nullptr> + std::size_t next_bucket(std::size_t index) const noexcept { + tsl_rh_assert(index < bucket_count()); + + return (index + 1) & this->m_mask; + } + + template::value>::type* = nullptr> + std::size_t next_bucket(std::size_t index) const noexcept { + tsl_rh_assert(index < bucket_count()); + + index++; + return (index != bucket_count())?index:0; + } + + + + template + iterator find_impl(const K& key, std::size_t hash) { + return mutable_iterator(static_cast(this)->find(key, hash)); + } + + template + const_iterator find_impl(const K& key, std::size_t hash) const { + std::size_t ibucket = bucket_for_hash(hash); + distance_type dist_from_ideal_bucket = 0; + + while(dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) { + if(TSL_RH_LIKELY((!USE_STORED_HASH_ON_LOOKUP || m_buckets[ibucket].bucket_hash_equal(hash)) && + compare_keys(KeySelect()(m_buckets[ibucket].value()), key))) + { + return const_iterator(m_buckets + ibucket); + } + + ibucket = next_bucket(ibucket); + dist_from_ideal_bucket++; + } + + return cend(); + } + + void erase_from_bucket(iterator pos) { + pos.m_bucket->clear(); + m_nb_elements--; + + /** + * Backward shift, swap the empty bucket, previous_ibucket, with the values on its right, ibucket, + * until we cross another empty bucket or if the other bucket has a distance_from_ideal_bucket == 0. + * + * We try to move the values closer to their ideal bucket. + */ + std::size_t previous_ibucket = static_cast(pos.m_bucket - m_buckets); + std::size_t ibucket = next_bucket(previous_ibucket); + + while(m_buckets[ibucket].dist_from_ideal_bucket() > 0) { + tsl_rh_assert(m_buckets[previous_ibucket].empty()); + + const distance_type new_distance = distance_type(m_buckets[ibucket].dist_from_ideal_bucket() - 1); + m_buckets[previous_ibucket].set_value_of_empty_bucket(new_distance, m_buckets[ibucket].truncated_hash(), + std::move(m_buckets[ibucket].value())); + m_buckets[ibucket].clear(); + + previous_ibucket = ibucket; + ibucket = next_bucket(ibucket); + } + } + + template + std::pair insert_impl(const K& key, Args&&... value_type_args) { + const std::size_t hash = hash_key(key); + + std::size_t ibucket = bucket_for_hash(hash); + distance_type dist_from_ideal_bucket = 0; + + while(dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) { + if((!USE_STORED_HASH_ON_LOOKUP || m_buckets[ibucket].bucket_hash_equal(hash)) && + compare_keys(KeySelect()(m_buckets[ibucket].value()), key)) + { + return std::make_pair(iterator(m_buckets + ibucket), false); + } + + ibucket = next_bucket(ibucket); + dist_from_ideal_bucket++; + } + + if(rehash_on_extreme_load()) { + ibucket = bucket_for_hash(hash); + dist_from_ideal_bucket = 0; + + while(dist_from_ideal_bucket <= m_buckets[ibucket].dist_from_ideal_bucket()) { + ibucket = next_bucket(ibucket); + dist_from_ideal_bucket++; + } + } + + + if(m_buckets[ibucket].empty()) { + m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket, bucket_entry::truncate_hash(hash), + std::forward(value_type_args)...); + } + else { + insert_value(ibucket, dist_from_ideal_bucket, bucket_entry::truncate_hash(hash), + std::forward(value_type_args)...); + } + + + m_nb_elements++; + /* + * The value will be inserted in ibucket in any case, either because it was + * empty or by stealing the bucket (robin hood). + */ + return std::make_pair(iterator(m_buckets + ibucket), true); + } + + + template + void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket, + truncated_hash_type hash, Args&&... value_type_args) + { + value_type value(std::forward(value_type_args)...); + insert_value_impl(ibucket, dist_from_ideal_bucket, hash, value); + } + + void insert_value(std::size_t ibucket, distance_type dist_from_ideal_bucket, + truncated_hash_type hash, value_type&& value) + { + insert_value_impl(ibucket, dist_from_ideal_bucket, hash, value); + } + + /* + * We don't use `value_type&& value` as last argument due to a bug in MSVC when `value_type` is a pointer, + * The compiler is not able to see the difference between `std::string*` and `std::string*&&` resulting in + * a compilation error. + * + * The `value` will be in a moved state at the end of the function. + */ + void insert_value_impl(std::size_t ibucket, distance_type dist_from_ideal_bucket, + truncated_hash_type hash, value_type& value) + { + m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket, hash, value); + ibucket = next_bucket(ibucket); + dist_from_ideal_bucket++; + + while(!m_buckets[ibucket].empty()) { + if(dist_from_ideal_bucket > m_buckets[ibucket].dist_from_ideal_bucket()) { + if(dist_from_ideal_bucket >= bucket_entry::DIST_FROM_IDEAL_BUCKET_LIMIT) { + /** + * The number of probes is really high, rehash the map on the next insert. + * Difficult to do now as rehash may throw an exception. + */ + m_grow_on_next_insert = true; + } + + m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket, hash, value); + } + + ibucket = next_bucket(ibucket); + dist_from_ideal_bucket++; + } + + m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket, hash, std::move(value)); + } + + + void rehash_impl(size_type count) { + robin_hash new_table(count, static_cast(*this), static_cast(*this), + get_allocator(), m_min_load_factor, m_max_load_factor); + + const bool use_stored_hash = USE_STORED_HASH_ON_REHASH(new_table.bucket_count()); + for(auto& bucket: m_buckets_data) { + if(bucket.empty()) { + continue; + } + + const std::size_t hash = use_stored_hash?bucket.truncated_hash(): + new_table.hash_key(KeySelect()(bucket.value())); + + new_table.insert_value_on_rehash(new_table.bucket_for_hash(hash), 0, + bucket_entry::truncate_hash(hash), std::move(bucket.value())); + } + + new_table.m_nb_elements = m_nb_elements; + new_table.swap(*this); + } + + void clear_and_shrink() noexcept { + GrowthPolicy::clear(); + m_buckets_data.clear(); + m_buckets = static_empty_bucket_ptr(); + m_bucket_count = 0; + m_nb_elements = 0; + m_load_threshold = 0; + m_grow_on_next_insert = false; + m_try_shrink_on_next_insert = false; + } + + void insert_value_on_rehash(std::size_t ibucket, distance_type dist_from_ideal_bucket, + truncated_hash_type hash, value_type&& value) + { + while(true) { + if(dist_from_ideal_bucket > m_buckets[ibucket].dist_from_ideal_bucket()) { + if(m_buckets[ibucket].empty()) { + m_buckets[ibucket].set_value_of_empty_bucket(dist_from_ideal_bucket, hash, std::move(value)); + return; + } + else { + m_buckets[ibucket].swap_with_value_in_bucket(dist_from_ideal_bucket, hash, value); + } + } + + dist_from_ideal_bucket++; + ibucket = next_bucket(ibucket); + } + } + + + + /** + * Grow the table if m_grow_on_next_insert is true or we reached the max_load_factor. + * Shrink the table if m_try_shrink_on_next_insert is true (an erase occurred) and + * we're below the min_load_factor. + * + * Return true if the table has been rehashed. + */ + bool rehash_on_extreme_load() { + if(m_grow_on_next_insert || size() >= m_load_threshold) { + rehash_impl(GrowthPolicy::next_bucket_count()); + m_grow_on_next_insert = false; + + return true; + } + + if(m_try_shrink_on_next_insert) { + m_try_shrink_on_next_insert = false; + if(m_min_load_factor != 0.0f && load_factor() < m_min_load_factor) { + reserve(size() + 1); + + return true; + } + } + + return false; + } + + +public: + static const size_type DEFAULT_INIT_BUCKETS_SIZE = 0; + + static constexpr float DEFAULT_MAX_LOAD_FACTOR = 0.5f; + static constexpr float MINIMUM_MAX_LOAD_FACTOR = 0.2f; + static constexpr float MAXIMUM_MAX_LOAD_FACTOR = 0.95f; + + static constexpr float DEFAULT_MIN_LOAD_FACTOR = 0.0f; + static constexpr float MINIMUM_MIN_LOAD_FACTOR = 0.0f; + static constexpr float MAXIMUM_MIN_LOAD_FACTOR = 0.15f; + + static_assert(MINIMUM_MAX_LOAD_FACTOR < MAXIMUM_MAX_LOAD_FACTOR, + "MINIMUM_MAX_LOAD_FACTOR should be < MAXIMUM_MAX_LOAD_FACTOR"); + static_assert(MINIMUM_MIN_LOAD_FACTOR < MAXIMUM_MIN_LOAD_FACTOR, + "MINIMUM_MIN_LOAD_FACTOR should be < MAXIMUM_MIN_LOAD_FACTOR"); + static_assert(MAXIMUM_MIN_LOAD_FACTOR < MINIMUM_MAX_LOAD_FACTOR, + "MAXIMUM_MIN_LOAD_FACTOR should be < MINIMUM_MAX_LOAD_FACTOR"); + +private: + /** + * Return an always valid pointer to an static empty bucket_entry with last_bucket() == true. + */ + bucket_entry* static_empty_bucket_ptr() noexcept { + static bucket_entry empty_bucket(true); + return &empty_bucket; + } + +private: + buckets_container_type m_buckets_data; + + /** + * Points to m_buckets_data.data() if !m_buckets_data.empty() otherwise points to static_empty_bucket_ptr. + * This variable is useful to avoid the cost of checking if m_buckets_data is empty when trying + * to find an element. + * + * TODO Remove m_buckets_data and only use a pointer instead of a pointer+vector to save some space in the robin_hash object. + * Manage the Allocator manually. + */ + bucket_entry* m_buckets; + + /** + * Used a lot in find, avoid the call to m_buckets_data.size() which is a bit slower. + */ + size_type m_bucket_count; + + size_type m_nb_elements; + + size_type m_load_threshold; + + float m_min_load_factor; + float m_max_load_factor; + + bool m_grow_on_next_insert; + + /** + * We can't shrink down the map on erase operations as the erase methods need to return the next iterator. + * Shrinking the map would invalidate all the iterators and we could not return the next iterator in a meaningful way, + * On erase, we thus just indicate on erase that we should try to shrink the hash table on the next insert + * if we go below the min_load_factor. + */ + bool m_try_shrink_on_next_insert; +}; + +} + +} + +#endif diff --git a/include/tsl/include/tsl/robin_map.h b/include/tsl/include/tsl/robin_map.h new file mode 100644 index 0000000000..86761f5308 --- /dev/null +++ b/include/tsl/include/tsl/robin_map.h @@ -0,0 +1,715 @@ +/** + * MIT License + * + * Copyright (c) 2017 Thibaut Goetghebuer-Planchon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef TSL_ROBIN_MAP_H +#define TSL_ROBIN_MAP_H + + +#include +#include +#include +#include +#include +#include +#include "robin_hash.h" + + +namespace tsl { + + +/** + * Implementation of a hash map using open-addressing and the robin hood hashing algorithm with backward shift deletion. + * + * For operations modifying the hash map (insert, erase, rehash, ...), the strong exception guarantee + * is only guaranteed when the expression `std::is_nothrow_swappable>::value && + * std::is_nothrow_move_constructible>::value` is true, otherwise if an exception + * is thrown during the swap or the move, the hash map may end up in a undefined state. Per the standard + * a `Key` or `T` with a noexcept copy constructor and no move constructor also satisfies the + * `std::is_nothrow_move_constructible>::value` criterion (and will thus guarantee the + * strong exception for the map). + * + * When `StoreHash` is true, 32 bits of the hash are stored alongside the values. It can improve + * the performance during lookups if the `KeyEqual` function takes time (if it engenders a cache-miss for example) + * as we then compare the stored hashes before comparing the keys. When `tsl::rh::power_of_two_growth_policy` is used + * as `GrowthPolicy`, it may also speed-up the rehash process as we can avoid to recalculate the hash. + * When it is detected that storing the hash will not incur any memory penalty due to alignment (i.e. + * `sizeof(tsl::detail_robin_hash::bucket_entry) == + * sizeof(tsl::detail_robin_hash::bucket_entry)`) and `tsl::rh::power_of_two_growth_policy` is + * used, the hash will be stored even if `StoreHash` is false so that we can speed-up the rehash (but it will + * not be used on lookups unless `StoreHash` is true). + * + * `GrowthPolicy` defines how the map grows and consequently how a hash value is mapped to a bucket. + * By default the map uses `tsl::rh::power_of_two_growth_policy`. This policy keeps the number of buckets + * to a power of two and uses a mask to map the hash to a bucket instead of the slow modulo. + * Other growth policies are available and you may define your own growth policy, + * check `tsl::rh::power_of_two_growth_policy` for the interface. + * + * `std::pair` must be swappable. + * + * `Key` and `T` must be copy and/or move constructible. + * + * If the destructor of `Key` or `T` throws an exception, the behaviour of the class is undefined. + * + * Iterators invalidation: + * - clear, operator=, reserve, rehash: always invalidate the iterators. + * - insert, emplace, emplace_hint, operator[]: if there is an effective insert, invalidate the iterators. + * - erase: always invalidate the iterators. + */ +template, + class KeyEqual = std::equal_to, + class Allocator = std::allocator>, + bool StoreHash = false, + class GrowthPolicy = tsl::rh::power_of_two_growth_policy<2>> +class robin_map { +private: + template + using has_is_transparent = tsl::detail_robin_hash::has_is_transparent; + + class KeySelect { + public: + using key_type = Key; + + const key_type& operator()(const std::pair& key_value) const noexcept { + return key_value.first; + } + + key_type& operator()(std::pair& key_value) noexcept { + return key_value.first; + } + }; + + class ValueSelect { + public: + using value_type = T; + + const value_type& operator()(const std::pair& key_value) const noexcept { + return key_value.second; + } + + value_type& operator()(std::pair& key_value) noexcept { + return key_value.second; + } + }; + + using ht = detail_robin_hash::robin_hash, KeySelect, ValueSelect, + Hash, KeyEqual, Allocator, StoreHash, GrowthPolicy>; + +public: + using key_type = typename ht::key_type; + using mapped_type = T; + using value_type = typename ht::value_type; + using size_type = typename ht::size_type; + using difference_type = typename ht::difference_type; + using hasher = typename ht::hasher; + using key_equal = typename ht::key_equal; + using allocator_type = typename ht::allocator_type; + using reference = typename ht::reference; + using const_reference = typename ht::const_reference; + using pointer = typename ht::pointer; + using const_pointer = typename ht::const_pointer; + using iterator = typename ht::iterator; + using const_iterator = typename ht::const_iterator; + + +public: + /* + * Constructors + */ + robin_map(): robin_map(ht::DEFAULT_INIT_BUCKETS_SIZE) { + } + + explicit robin_map(size_type bucket_count, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual(), + const Allocator& alloc = Allocator()): + m_ht(bucket_count, hash, equal, alloc) + { + } + + robin_map(size_type bucket_count, + const Allocator& alloc): robin_map(bucket_count, Hash(), KeyEqual(), alloc) + { + } + + robin_map(size_type bucket_count, + const Hash& hash, + const Allocator& alloc): robin_map(bucket_count, hash, KeyEqual(), alloc) + { + } + + explicit robin_map(const Allocator& alloc): robin_map(ht::DEFAULT_INIT_BUCKETS_SIZE, alloc) { + } + + template + robin_map(InputIt first, InputIt last, + size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual(), + const Allocator& alloc = Allocator()): robin_map(bucket_count, hash, equal, alloc) + { + insert(first, last); + } + + template + robin_map(InputIt first, InputIt last, + size_type bucket_count, + const Allocator& alloc): robin_map(first, last, bucket_count, Hash(), KeyEqual(), alloc) + { + } + + template + robin_map(InputIt first, InputIt last, + size_type bucket_count, + const Hash& hash, + const Allocator& alloc): robin_map(first, last, bucket_count, hash, KeyEqual(), alloc) + { + } + + robin_map(std::initializer_list init, + size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual(), + const Allocator& alloc = Allocator()): + robin_map(init.begin(), init.end(), bucket_count, hash, equal, alloc) + { + } + + robin_map(std::initializer_list init, + size_type bucket_count, + const Allocator& alloc): + robin_map(init.begin(), init.end(), bucket_count, Hash(), KeyEqual(), alloc) + { + } + + robin_map(std::initializer_list init, + size_type bucket_count, + const Hash& hash, + const Allocator& alloc): + robin_map(init.begin(), init.end(), bucket_count, hash, KeyEqual(), alloc) + { + } + + robin_map& operator=(std::initializer_list ilist) { + m_ht.clear(); + + m_ht.reserve(ilist.size()); + m_ht.insert(ilist.begin(), ilist.end()); + + return *this; + } + + allocator_type get_allocator() const { return m_ht.get_allocator(); } + + + /* + * Iterators + */ + iterator begin() noexcept { return m_ht.begin(); } + const_iterator begin() const noexcept { return m_ht.begin(); } + const_iterator cbegin() const noexcept { return m_ht.cbegin(); } + + iterator end() noexcept { return m_ht.end(); } + const_iterator end() const noexcept { return m_ht.end(); } + const_iterator cend() const noexcept { return m_ht.cend(); } + + + /* + * Capacity + */ + bool empty() const noexcept { return m_ht.empty(); } + size_type size() const noexcept { return m_ht.size(); } + size_type max_size() const noexcept { return m_ht.max_size(); } + + /* + * Modifiers + */ + void clear() noexcept { m_ht.clear(); } + + + + std::pair insert(const value_type& value) { + return m_ht.insert(value); + } + + template::value>::type* = nullptr> + std::pair insert(P&& value) { + return m_ht.emplace(std::forward

(value)); + } + + std::pair insert(value_type&& value) { + return m_ht.insert(std::move(value)); + } + + + iterator insert(const_iterator hint, const value_type& value) { + return m_ht.insert_hint(hint, value); + } + + template::value>::type* = nullptr> + iterator insert(const_iterator hint, P&& value) { + return m_ht.emplace_hint(hint, std::forward

(value)); + } + + iterator insert(const_iterator hint, value_type&& value) { + return m_ht.insert_hint(hint, std::move(value)); + } + + + template + void insert(InputIt first, InputIt last) { + m_ht.insert(first, last); + } + + void insert(std::initializer_list ilist) { + m_ht.insert(ilist.begin(), ilist.end()); + } + + + + + template + std::pair insert_or_assign(const key_type& k, M&& obj) { + return m_ht.insert_or_assign(k, std::forward(obj)); + } + + template + std::pair insert_or_assign(key_type&& k, M&& obj) { + return m_ht.insert_or_assign(std::move(k), std::forward(obj)); + } + + template + iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj) { + return m_ht.insert_or_assign(hint, k, std::forward(obj)); + } + + template + iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj) { + return m_ht.insert_or_assign(hint, std::move(k), std::forward(obj)); + } + + + + /** + * Due to the way elements are stored, emplace will need to move or copy the key-value once. + * The method is equivalent to insert(value_type(std::forward(args)...)); + * + * Mainly here for compatibility with the std::unordered_map interface. + */ + template + std::pair emplace(Args&&... args) { + return m_ht.emplace(std::forward(args)...); + } + + + + /** + * Due to the way elements are stored, emplace_hint will need to move or copy the key-value once. + * The method is equivalent to insert(hint, value_type(std::forward(args)...)); + * + * Mainly here for compatibility with the std::unordered_map interface. + */ + template + iterator emplace_hint(const_iterator hint, Args&&... args) { + return m_ht.emplace_hint(hint, std::forward(args)...); + } + + + + + template + std::pair try_emplace(const key_type& k, Args&&... args) { + return m_ht.try_emplace(k, std::forward(args)...); + } + + template + std::pair try_emplace(key_type&& k, Args&&... args) { + return m_ht.try_emplace(std::move(k), std::forward(args)...); + } + + template + iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args) { + return m_ht.try_emplace_hint(hint, k, std::forward(args)...); + } + + template + iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args) { + return m_ht.try_emplace_hint(hint, std::move(k), std::forward(args)...); + } + + + + + iterator erase(iterator pos) { return m_ht.erase(pos); } + iterator erase(const_iterator pos) { return m_ht.erase(pos); } + iterator erase(const_iterator first, const_iterator last) { return m_ht.erase(first, last); } + size_type erase(const key_type& key) { return m_ht.erase(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup to the value if you already have the hash. + */ + size_type erase(const key_type& key, std::size_t precalculated_hash) { + return m_ht.erase(key, precalculated_hash); + } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + size_type erase(const K& key) { return m_ht.erase(key); } + + /** + * @copydoc erase(const K& key) + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup to the value if you already have the hash. + */ + template::value>::type* = nullptr> + size_type erase(const K& key, std::size_t precalculated_hash) { + return m_ht.erase(key, precalculated_hash); + } + + + + void swap(robin_map& other) { other.m_ht.swap(m_ht); } + + + + /* + * Lookup + */ + T& at(const Key& key) { return m_ht.at(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + T& at(const Key& key, std::size_t precalculated_hash) { return m_ht.at(key, precalculated_hash); } + + + const T& at(const Key& key) const { return m_ht.at(key); } + + /** + * @copydoc at(const Key& key, std::size_t precalculated_hash) + */ + const T& at(const Key& key, std::size_t precalculated_hash) const { return m_ht.at(key, precalculated_hash); } + + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + T& at(const K& key) { return m_ht.at(key); } + + /** + * @copydoc at(const K& key) + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + T& at(const K& key, std::size_t precalculated_hash) { return m_ht.at(key, precalculated_hash); } + + + /** + * @copydoc at(const K& key) + */ + template::value>::type* = nullptr> + const T& at(const K& key) const { return m_ht.at(key); } + + /** + * @copydoc at(const K& key, std::size_t precalculated_hash) + */ + template::value>::type* = nullptr> + const T& at(const K& key, std::size_t precalculated_hash) const { return m_ht.at(key, precalculated_hash); } + + + + + T& operator[](const Key& key) { return m_ht[key]; } + T& operator[](Key&& key) { return m_ht[std::move(key)]; } + + + + + size_type count(const Key& key) const { return m_ht.count(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + size_type count(const Key& key, std::size_t precalculated_hash) const { + return m_ht.count(key, precalculated_hash); + } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + size_type count(const K& key) const { return m_ht.count(key); } + + /** + * @copydoc count(const K& key) const + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + size_type count(const K& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } + + + + + iterator find(const Key& key) { return m_ht.find(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + iterator find(const Key& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } + + const_iterator find(const Key& key) const { return m_ht.find(key); } + + /** + * @copydoc find(const Key& key, std::size_t precalculated_hash) + */ + const_iterator find(const Key& key, std::size_t precalculated_hash) const { + return m_ht.find(key, precalculated_hash); + } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + iterator find(const K& key) { return m_ht.find(key); } + + /** + * @copydoc find(const K& key) + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + iterator find(const K& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } + + /** + * @copydoc find(const K& key) + */ + template::value>::type* = nullptr> + const_iterator find(const K& key) const { return m_ht.find(key); } + + /** + * @copydoc find(const K& key) + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + const_iterator find(const K& key, std::size_t precalculated_hash) const { + return m_ht.find(key, precalculated_hash); + } + + + + + bool contains(const Key& key) const { return m_ht.contains(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + bool contains(const Key& key, std::size_t precalculated_hash) const { + return m_ht.contains(key, precalculated_hash); + } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + bool contains(const K& key) const { return m_ht.contains(key); } + + /** + * @copydoc contains(const K& key) const + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + bool contains(const K& key, std::size_t precalculated_hash) const { + return m_ht.contains(key, precalculated_hash); + } + + + + + std::pair equal_range(const Key& key) { return m_ht.equal_range(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + std::pair equal_range(const Key& key, std::size_t precalculated_hash) { + return m_ht.equal_range(key, precalculated_hash); + } + + std::pair equal_range(const Key& key) const { return m_ht.equal_range(key); } + + /** + * @copydoc equal_range(const Key& key, std::size_t precalculated_hash) + */ + std::pair equal_range(const Key& key, std::size_t precalculated_hash) const { + return m_ht.equal_range(key, precalculated_hash); + } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + std::pair equal_range(const K& key) { return m_ht.equal_range(key); } + + + /** + * @copydoc equal_range(const K& key) + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + std::pair equal_range(const K& key, std::size_t precalculated_hash) { + return m_ht.equal_range(key, precalculated_hash); + } + + /** + * @copydoc equal_range(const K& key) + */ + template::value>::type* = nullptr> + std::pair equal_range(const K& key) const { return m_ht.equal_range(key); } + + /** + * @copydoc equal_range(const K& key, std::size_t precalculated_hash) + */ + template::value>::type* = nullptr> + std::pair equal_range(const K& key, std::size_t precalculated_hash) const { + return m_ht.equal_range(key, precalculated_hash); + } + + + + + /* + * Bucket interface + */ + size_type bucket_count() const { return m_ht.bucket_count(); } + size_type max_bucket_count() const { return m_ht.max_bucket_count(); } + + + /* + * Hash policy + */ + float load_factor() const { return m_ht.load_factor(); } + + float min_load_factor() const { return m_ht.min_load_factor(); } + float max_load_factor() const { return m_ht.max_load_factor(); } + + /** + * Set the `min_load_factor` to `ml`. When the `load_factor` of the map goes + * below `min_load_factor` after some erase operations, the map will be + * shrunk when an insertion occurs. The erase method itself never shrinks + * the map. + * + * The default value of `min_load_factor` is 0.0f, the map never shrinks by default. + */ + void min_load_factor(float ml) { m_ht.min_load_factor(ml); } + void max_load_factor(float ml) { m_ht.max_load_factor(ml); } + + void rehash(size_type count) { m_ht.rehash(count); } + void reserve(size_type count) { m_ht.reserve(count); } + + + /* + * Observers + */ + hasher hash_function() const { return m_ht.hash_function(); } + key_equal key_eq() const { return m_ht.key_eq(); } + + /* + * Other + */ + + /** + * Convert a const_iterator to an iterator. + */ + iterator mutable_iterator(const_iterator pos) { + return m_ht.mutable_iterator(pos); + } + + friend bool operator==(const robin_map& lhs, const robin_map& rhs) { + if(lhs.size() != rhs.size()) { + return false; + } + + for(const auto& element_lhs: lhs) { + const auto it_element_rhs = rhs.find(element_lhs.first); + if(it_element_rhs == rhs.cend() || element_lhs.second != it_element_rhs->second) { + return false; + } + } + + return true; + } + + friend bool operator!=(const robin_map& lhs, const robin_map& rhs) { + return !operator==(lhs, rhs); + } + + friend void swap(robin_map& lhs, robin_map& rhs) { + lhs.swap(rhs); + } + +private: + ht m_ht; +}; + + +/** + * Same as `tsl::robin_map`. + */ +template, + class KeyEqual = std::equal_to, + class Allocator = std::allocator>, + bool StoreHash = false> +using robin_pg_map = robin_map; + +} // end namespace tsl + +#endif diff --git a/include/tsl/include/tsl/robin_set.h b/include/tsl/include/tsl/robin_set.h new file mode 100644 index 0000000000..8f1b9082f8 --- /dev/null +++ b/include/tsl/include/tsl/robin_set.h @@ -0,0 +1,582 @@ +/** + * MIT License + * + * Copyright (c) 2017 Thibaut Goetghebuer-Planchon + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef TSL_ROBIN_SET_H +#define TSL_ROBIN_SET_H + + +#include +#include +#include +#include +#include +#include +#include "robin_hash.h" + + +namespace tsl { + + +/** + * Implementation of a hash set using open-addressing and the robin hood hashing algorithm with backward shift deletion. + * + * For operations modifying the hash set (insert, erase, rehash, ...), the strong exception guarantee + * is only guaranteed when the expression `std::is_nothrow_swappable::value && + * std::is_nothrow_move_constructible::value` is true, otherwise if an exception + * is thrown during the swap or the move, the hash set may end up in a undefined state. Per the standard + * a `Key` with a noexcept copy constructor and no move constructor also satisfies the + * `std::is_nothrow_move_constructible::value` criterion (and will thus guarantee the + * strong exception for the set). + * + * When `StoreHash` is true, 32 bits of the hash are stored alongside the values. It can improve + * the performance during lookups if the `KeyEqual` function takes time (or engenders a cache-miss for example) + * as we then compare the stored hashes before comparing the keys. When `tsl::rh::power_of_two_growth_policy` is used + * as `GrowthPolicy`, it may also speed-up the rehash process as we can avoid to recalculate the hash. + * When it is detected that storing the hash will not incur any memory penalty due to alignment (i.e. + * `sizeof(tsl::detail_robin_hash::bucket_entry) == + * sizeof(tsl::detail_robin_hash::bucket_entry)`) and `tsl::rh::power_of_two_growth_policy` is + * used, the hash will be stored even if `StoreHash` is false so that we can speed-up the rehash (but it will + * not be used on lookups unless `StoreHash` is true). + * + * `GrowthPolicy` defines how the set grows and consequently how a hash value is mapped to a bucket. + * By default the set uses `tsl::rh::power_of_two_growth_policy`. This policy keeps the number of buckets + * to a power of two and uses a mask to set the hash to a bucket instead of the slow modulo. + * Other growth policies are available and you may define your own growth policy, + * check `tsl::rh::power_of_two_growth_policy` for the interface. + * + * `Key` must be swappable. + * + * `Key` must be copy and/or move constructible. + * + * If the destructor of `Key` throws an exception, the behaviour of the class is undefined. + * + * Iterators invalidation: + * - clear, operator=, reserve, rehash: always invalidate the iterators. + * - insert, emplace, emplace_hint, operator[]: if there is an effective insert, invalidate the iterators. + * - erase: always invalidate the iterators. + */ +template, + class KeyEqual = std::equal_to, + class Allocator = std::allocator, + bool StoreHash = false, + class GrowthPolicy = tsl::rh::power_of_two_growth_policy<2>> +class robin_set { +private: + template + using has_is_transparent = tsl::detail_robin_hash::has_is_transparent; + + class KeySelect { + public: + using key_type = Key; + + const key_type& operator()(const Key& key) const noexcept { + return key; + } + + key_type& operator()(Key& key) noexcept { + return key; + } + }; + + using ht = detail_robin_hash::robin_hash; + +public: + using key_type = typename ht::key_type; + using value_type = typename ht::value_type; + using size_type = typename ht::size_type; + using difference_type = typename ht::difference_type; + using hasher = typename ht::hasher; + using key_equal = typename ht::key_equal; + using allocator_type = typename ht::allocator_type; + using reference = typename ht::reference; + using const_reference = typename ht::const_reference; + using pointer = typename ht::pointer; + using const_pointer = typename ht::const_pointer; + using iterator = typename ht::iterator; + using const_iterator = typename ht::const_iterator; + + + /* + * Constructors + */ + robin_set(): robin_set(ht::DEFAULT_INIT_BUCKETS_SIZE) { + } + + explicit robin_set(size_type bucket_count, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual(), + const Allocator& alloc = Allocator()): + m_ht(bucket_count, hash, equal, alloc) + { + } + + robin_set(size_type bucket_count, + const Allocator& alloc): robin_set(bucket_count, Hash(), KeyEqual(), alloc) + { + } + + robin_set(size_type bucket_count, + const Hash& hash, + const Allocator& alloc): robin_set(bucket_count, hash, KeyEqual(), alloc) + { + } + + explicit robin_set(const Allocator& alloc): robin_set(ht::DEFAULT_INIT_BUCKETS_SIZE, alloc) { + } + + template + robin_set(InputIt first, InputIt last, + size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual(), + const Allocator& alloc = Allocator()): robin_set(bucket_count, hash, equal, alloc) + { + insert(first, last); + } + + template + robin_set(InputIt first, InputIt last, + size_type bucket_count, + const Allocator& alloc): robin_set(first, last, bucket_count, Hash(), KeyEqual(), alloc) + { + } + + template + robin_set(InputIt first, InputIt last, + size_type bucket_count, + const Hash& hash, + const Allocator& alloc): robin_set(first, last, bucket_count, hash, KeyEqual(), alloc) + { + } + + robin_set(std::initializer_list init, + size_type bucket_count = ht::DEFAULT_INIT_BUCKETS_SIZE, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual(), + const Allocator& alloc = Allocator()): + robin_set(init.begin(), init.end(), bucket_count, hash, equal, alloc) + { + } + + robin_set(std::initializer_list init, + size_type bucket_count, + const Allocator& alloc): + robin_set(init.begin(), init.end(), bucket_count, Hash(), KeyEqual(), alloc) + { + } + + robin_set(std::initializer_list init, + size_type bucket_count, + const Hash& hash, + const Allocator& alloc): + robin_set(init.begin(), init.end(), bucket_count, hash, KeyEqual(), alloc) + { + } + + + robin_set& operator=(std::initializer_list ilist) { + m_ht.clear(); + + m_ht.reserve(ilist.size()); + m_ht.insert(ilist.begin(), ilist.end()); + + return *this; + } + + allocator_type get_allocator() const { return m_ht.get_allocator(); } + + + /* + * Iterators + */ + iterator begin() noexcept { return m_ht.begin(); } + const_iterator begin() const noexcept { return m_ht.begin(); } + const_iterator cbegin() const noexcept { return m_ht.cbegin(); } + + iterator end() noexcept { return m_ht.end(); } + const_iterator end() const noexcept { return m_ht.end(); } + const_iterator cend() const noexcept { return m_ht.cend(); } + + + /* + * Capacity + */ + bool empty() const noexcept { return m_ht.empty(); } + size_type size() const noexcept { return m_ht.size(); } + size_type max_size() const noexcept { return m_ht.max_size(); } + + /* + * Modifiers + */ + void clear() noexcept { m_ht.clear(); } + + + + + std::pair insert(const value_type& value) { + return m_ht.insert(value); + } + + std::pair insert(value_type&& value) { + return m_ht.insert(std::move(value)); + } + + iterator insert(const_iterator hint, const value_type& value) { + return m_ht.insert_hint(hint, value); + } + + iterator insert(const_iterator hint, value_type&& value) { + return m_ht.insert_hint(hint, std::move(value)); + } + + template + void insert(InputIt first, InputIt last) { + m_ht.insert(first, last); + } + + void insert(std::initializer_list ilist) { + m_ht.insert(ilist.begin(), ilist.end()); + } + + + + + /** + * Due to the way elements are stored, emplace will need to move or copy the key-value once. + * The method is equivalent to insert(value_type(std::forward(args)...)); + * + * Mainly here for compatibility with the std::unordered_map interface. + */ + template + std::pair emplace(Args&&... args) { + return m_ht.emplace(std::forward(args)...); + } + + + + /** + * Due to the way elements are stored, emplace_hint will need to move or copy the key-value once. + * The method is equivalent to insert(hint, value_type(std::forward(args)...)); + * + * Mainly here for compatibility with the std::unordered_map interface. + */ + template + iterator emplace_hint(const_iterator hint, Args&&... args) { + return m_ht.emplace_hint(hint, std::forward(args)...); + } + + + + iterator erase(iterator pos) { return m_ht.erase(pos); } + iterator erase(const_iterator pos) { return m_ht.erase(pos); } + iterator erase(const_iterator first, const_iterator last) { return m_ht.erase(first, last); } + size_type erase(const key_type& key) { return m_ht.erase(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup to the value if you already have the hash. + */ + size_type erase(const key_type& key, std::size_t precalculated_hash) { + return m_ht.erase(key, precalculated_hash); + } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + size_type erase(const K& key) { return m_ht.erase(key); } + + /** + * @copydoc erase(const K& key) + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup to the value if you already have the hash. + */ + template::value>::type* = nullptr> + size_type erase(const K& key, std::size_t precalculated_hash) { + return m_ht.erase(key, precalculated_hash); + } + + + + void swap(robin_set& other) { other.m_ht.swap(m_ht); } + + + + /* + * Lookup + */ + size_type count(const Key& key) const { return m_ht.count(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + size_type count(const Key& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + size_type count(const K& key) const { return m_ht.count(key); } + + /** + * @copydoc count(const K& key) const + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + size_type count(const K& key, std::size_t precalculated_hash) const { return m_ht.count(key, precalculated_hash); } + + + + + iterator find(const Key& key) { return m_ht.find(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + iterator find(const Key& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } + + const_iterator find(const Key& key) const { return m_ht.find(key); } + + /** + * @copydoc find(const Key& key, std::size_t precalculated_hash) + */ + const_iterator find(const Key& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + iterator find(const K& key) { return m_ht.find(key); } + + /** + * @copydoc find(const K& key) + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + iterator find(const K& key, std::size_t precalculated_hash) { return m_ht.find(key, precalculated_hash); } + + /** + * @copydoc find(const K& key) + */ + template::value>::type* = nullptr> + const_iterator find(const K& key) const { return m_ht.find(key); } + + /** + * @copydoc find(const K& key) + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + const_iterator find(const K& key, std::size_t precalculated_hash) const { return m_ht.find(key, precalculated_hash); } + + + + + bool contains(const Key& key) const { return m_ht.contains(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + bool contains(const Key& key, std::size_t precalculated_hash) const { + return m_ht.contains(key, precalculated_hash); + } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + bool contains(const K& key) const { return m_ht.contains(key); } + + /** + * @copydoc contains(const K& key) const + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + bool contains(const K& key, std::size_t precalculated_hash) const { + return m_ht.contains(key, precalculated_hash); + } + + + + + std::pair equal_range(const Key& key) { return m_ht.equal_range(key); } + + /** + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + std::pair equal_range(const Key& key, std::size_t precalculated_hash) { + return m_ht.equal_range(key, precalculated_hash); + } + + std::pair equal_range(const Key& key) const { return m_ht.equal_range(key); } + + /** + * @copydoc equal_range(const Key& key, std::size_t precalculated_hash) + */ + std::pair equal_range(const Key& key, std::size_t precalculated_hash) const { + return m_ht.equal_range(key, precalculated_hash); + } + + /** + * This overload only participates in the overload resolution if the typedef KeyEqual::is_transparent exists. + * If so, K must be hashable and comparable to Key. + */ + template::value>::type* = nullptr> + std::pair equal_range(const K& key) { return m_ht.equal_range(key); } + + /** + * @copydoc equal_range(const K& key) + * + * Use the hash value 'precalculated_hash' instead of hashing the key. The hash value should be the same + * as hash_function()(key). Useful to speed-up the lookup if you already have the hash. + */ + template::value>::type* = nullptr> + std::pair equal_range(const K& key, std::size_t precalculated_hash) { + return m_ht.equal_range(key, precalculated_hash); + } + + /** + * @copydoc equal_range(const K& key) + */ + template::value>::type* = nullptr> + std::pair equal_range(const K& key) const { return m_ht.equal_range(key); } + + /** + * @copydoc equal_range(const K& key, std::size_t precalculated_hash) + */ + template::value>::type* = nullptr> + std::pair equal_range(const K& key, std::size_t precalculated_hash) const { + return m_ht.equal_range(key, precalculated_hash); + } + + + + + /* + * Bucket interface + */ + size_type bucket_count() const { return m_ht.bucket_count(); } + size_type max_bucket_count() const { return m_ht.max_bucket_count(); } + + + /* + * Hash policy + */ + float load_factor() const { return m_ht.load_factor(); } + + float min_load_factor() const { return m_ht.min_load_factor(); } + float max_load_factor() const { return m_ht.max_load_factor(); } + + /** + * Set the `min_load_factor` to `ml`. When the `load_factor` of the set goes + * below `min_load_factor` after some erase operations, the set will be + * shrunk when an insertion occurs. The erase method itself never shrinks + * the set. + * + * The default value of `min_load_factor` is 0.0f, the set never shrinks by default. + */ + void min_load_factor(float ml) { m_ht.min_load_factor(ml); } + void max_load_factor(float ml) { m_ht.max_load_factor(ml); } + + void rehash(size_type count) { m_ht.rehash(count); } + void reserve(size_type count) { m_ht.reserve(count); } + + + /* + * Observers + */ + hasher hash_function() const { return m_ht.hash_function(); } + key_equal key_eq() const { return m_ht.key_eq(); } + + + /* + * Other + */ + + /** + * Convert a const_iterator to an iterator. + */ + iterator mutable_iterator(const_iterator pos) { + return m_ht.mutable_iterator(pos); + } + + friend bool operator==(const robin_set& lhs, const robin_set& rhs) { + if(lhs.size() != rhs.size()) { + return false; + } + + for(const auto& element_lhs: lhs) { + const auto it_element_rhs = rhs.find(element_lhs); + if(it_element_rhs == rhs.cend()) { + return false; + } + } + + return true; + } + + friend bool operator!=(const robin_set& lhs, const robin_set& rhs) { + return !operator==(lhs, rhs); + } + + friend void swap(robin_set& lhs, robin_set& rhs) { + lhs.swap(rhs); + } + +private: + ht m_ht; +}; + + +/** + * Same as `tsl::robin_set`. + */ +template, + class KeyEqual = std::equal_to, + class Allocator = std::allocator, + bool StoreHash = false> +using robin_pg_set = robin_set; + +} // end namespace tsl + +#endif + diff --git a/include/utils.h b/include/utils.h index 6b9db5bf62..6f8b0de989 100644 --- a/include/utils.h +++ b/include/utils.h @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. #pragma once @@ -13,6 +13,7 @@ #include #include #include +#include #ifdef __APPLE__ #else #include @@ -26,8 +27,9 @@ typedef HANDLE FileHandle; typedef int FileHandle; #endif +#include "distance.h" #include "logger.h" -#include "cached_io.h" +#include "ann_exception.h" #include "common_includes.h" #include "windows_customizations.h" @@ -51,7 +53,9 @@ typedef int FileHandle; #define IS_ALIGNED(X, Y) ((uint64_t)(X) % (uint64_t)(Y) == 0) #define IS_512_ALIGNED(X) IS_ALIGNED(X, 512) #define IS_4096_ALIGNED(X) IS_ALIGNED(X, 4096) - +#define METADATA_SIZE \ + 4096 // all metadata of individual sub-component files is written in first + // 4KB for unified files typedef uint64_t _u64; typedef int64_t _s64; typedef uint32_t _u32; @@ -61,10 +65,124 @@ typedef int16_t _s16; typedef uint8_t _u8; typedef int8_t _s8; +inline bool file_exists(const std::string& name, bool dirCheck = false) { + int val; +#ifndef _WINDOWS + struct stat buffer; + val = stat(name.c_str(), &buffer); +#else + struct _stat64 buffer; + val = _stat64(name.c_str(), &buffer); +#endif + + diskann::cout << " Stat(" << name.c_str() << ") returned: " << val + << std::endl; + if (val != 0) { + switch (errno) { + case EINVAL: + diskann::cout << "Invalid argument passed to stat()" << std::endl; + break; + case ENOENT: + diskann::cout << "File " << name.c_str() << " does not exist" + << std::endl; + break; + default: + diskann::cout << "Unexpected error in stat():" << errno << std::endl; + break; + } + return false; + } else { + // the file entry exists. If reqd, check if this is a directory. + return dirCheck ? buffer.st_mode & S_IFDIR : true; + } +} + +inline std::string getTempFilePath(const std::string& workingDir, + const std::string& suffix) { +#ifdef _WINDOWS + char temp[MAX_PATH]; + std::string retFile; + + do { + if (!tmpnam_s(temp, MAX_PATH) == 0) { + throw diskann::ANNException("Could not create temporary name.", -1); + } + + std::string tempFile(temp); + memset(temp, 0, MAX_PATH); + // GetTempPath returns number of chars in path incl a trailing '\' + int numCharsInTempPath = 0; + if ((numCharsInTempPath = GetTempPathA(MAX_PATH, temp)) == 0) { + throw diskann::ANNException("GetTempPathA failed with error code: ", + GetLastError()); + } + + tempFile.erase(0, numCharsInTempPath); + retFile = workingDir + "\\" + tempFile + "_" + suffix; + } while (file_exists( + retFile)); // To handle the rare case that the file may exist already. + return retFile; +#endif + return ""; +} + +inline void open_file_to_write(std::ofstream& writer, + const std::string& filename) { + writer.exceptions(std::ofstream::failbit | std::ofstream::badbit); + if (!file_exists(filename)) + writer.open(filename, std::ios::binary | std::ios::out); + else + writer.open(filename, std::ios::binary | std::ios::in | std::ios::out); + + if (writer.fail()) { + diskann::cerr << std::string("Failed to open file") + filename + + " for write because " + << std::strerror(errno) << std::endl; + throw diskann::ANNException( + std::string("Failed to open file ") + filename + + " for write because: " + std::strerror(errno), + -1); + } +} + +inline _u64 get_file_size(const std::string& fname) { + std::ifstream reader(fname, std::ios::binary | std::ios::ate); + if (!reader.fail() && reader.is_open()) { + _u64 end_pos = reader.tellg(); + reader.close(); + return end_pos; + } else { + diskann::cerr << "Could not open file: " << fname << std::endl; + return 0; + } +} + +inline int delete_file(const std::string& fileName) { + if (file_exists(fileName)) { + auto rc = ::remove(fileName.c_str()); + if (rc != 0) { + diskann::cerr + << "Could not delete file: " << fileName + << " even though it exists. This might indicate a permissions issue. " + "If you see this message, please contact the diskann team." + << std::endl; + } + return rc; + } else { + return 0; + } +} + namespace diskann { static const size_t MAX_SIZE_OF_STREAMBUF = 2LL * 1024 * 1024 * 1024; - enum Metric { L2 = 0, INNER_PRODUCT = 1, FAST_L2 = 2, PQ = 3 }; + enum Metric { L2 = 0, INNER_PRODUCT = 1, FAST_L2 = 2, PQ = 3, COSINE = 4 }; + + DISKANN_DLLEXPORT float calc_recall_set_tags( + unsigned num_queries, unsigned* gold_std, unsigned dim_gs, + unsigned* our_results_tags, unsigned dim_or, unsigned recall_at, + unsigned subset_size, std::string gt_tag_filename, + std::string current_tag_filename); inline void alloc_aligned(void** ptr, size_t size, size_t align) { *ptr = nullptr; @@ -77,9 +195,33 @@ namespace diskann { assert(*ptr != nullptr); } + inline void realloc_aligned(void** ptr, size_t size, size_t align) { + assert(IS_ALIGNED(size, align)); +#ifdef _WINDOWS + *ptr = ::_aligned_realloc(*ptr, size, align); +#endif + assert(*ptr != nullptr); + } + + inline void realloc_aligned(void** ptr, void** ptr_new, size_t old_size, + size_t new_size, size_t align) { + assert(IS_ALIGNED(new_size, align)); +#ifndef _WINDOWS + alloc_aligned((void**) &ptr_new, new_size, align); + memcpy(*ptr_new, *ptr, old_size); + ::free(*ptr); + *ptr = *ptr_new; +#endif + assert(*ptr != nullptr); + } + + inline void check_stop(std::string arnd) { + int brnd; + diskann::cout << arnd << std::endl; + std::cin >> brnd; + } + inline void aligned_free(void* ptr) { - // Gopal. Must have a check here if the pointer was actually allocated by - // _alloc_aligned if (ptr == nullptr) { return; } @@ -110,8 +252,10 @@ namespace diskann { // get_bin_metadata functions START inline void get_bin_metadata_impl(std::basic_istream& reader, - size_t& nrows, size_t& ncols) { + size_t& nrows, size_t& ncols, + size_t offset = 0) { int nrows_32, ncols_32; + reader.seekg(offset, reader.beg); reader.read((char*) &nrows_32, sizeof(int)); reader.read((char*) &ncols_32, sizeof(int)); nrows = nrows_32; @@ -121,19 +265,22 @@ namespace diskann { #ifdef EXEC_ENV_OLS inline void get_bin_metadata(MemoryMappedFiles& files, const std::string& bin_file, size_t& nrows, - size_t& ncols) { + size_t& ncols, size_t offset = 0) { diskann::cout << "Getting metadata for file: " << bin_file << std::endl; - auto fc = files.getContent(bin_file); - auto cb = ContentBuf((char*) fc._content, fc._size); - std::basic_istream reader(&cb); - get_bin_metadata_impl(reader, nrows, ncols); + auto fc = files.getContent(bin_file); + int nrows_32, ncols_32; + int32_t* metadata_ptr = (int32_t*) ((char*) fc._content + offset); + nrows_32 = *metadata_ptr; + ncols_32 = *(metadata_ptr + 1); + nrows = nrows_32; + ncols = ncols_32; } #endif inline void get_bin_metadata(const std::string& bin_file, size_t& nrows, - size_t& ncols) { + size_t& ncols, size_t offset = 0) { std::ifstream reader(bin_file.c_str(), std::ios::binary); - get_bin_metadata_impl(reader, nrows, ncols); + get_bin_metadata_impl(reader, nrows, ncols, offset); } // get_bin_metadata functions END @@ -151,10 +298,11 @@ namespace diskann { // load_bin functions START template - inline void load_bin_impl(std::basic_istream& reader, - size_t actual_file_size, T*& data, size_t& npts, - size_t& dim) { + inline void load_bin_impl(std::basic_istream& reader, T*& data, + size_t& npts, size_t& dim, size_t file_offset = 0) { int npts_i32, dim_i32; + + reader.seekg(file_offset, reader.beg); reader.read((char*) &npts_i32, sizeof(int)); reader.read((char*) &dim_i32, sizeof(int)); npts = (unsigned) npts_i32; @@ -163,64 +311,34 @@ namespace diskann { diskann::cout << "Metadata: #pts = " << npts << ", #dims = " << dim << "..." << std::endl; - size_t expected_actual_file_size = - npts * dim * sizeof(T) + 2 * sizeof(uint32_t); - if (actual_file_size != expected_actual_file_size) { - std::stringstream stream; - stream << "Error. File size mismatch. Actual size is " << actual_file_size - << " while expected size is " << expected_actual_file_size - << " npts = " << npts << " dim = " << dim - << " size of = " << sizeof(T) << std::endl; - diskann::cout << stream.str(); - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } - data = new T[npts * dim]; reader.read((char*) data, npts * dim * sizeof(T)); - - // diskann::cout << "Last bytes: " - // << getValues(data + (npts - 2) * dim, dim); - // diskann::cout << "Finished reading bin file." << std::endl; } #ifdef EXEC_ENV_OLS template inline void load_bin(MemoryMappedFiles& files, const std::string& bin_file, - T*& data, size_t& npts, size_t& dim) { - diskann::cout << "Reading bin file " << bin_file.c_str() << " ..." - << std::endl; - + T*& data, size_t& npts, size_t& dim, size_t offset = 0) { + diskann::cout << "Reading bin file " << bin_file.c_str() + << " at offset: " << offset << "..." << std::endl; auto fc = files.getContent(bin_file); uint32_t t_npts, t_dim; - uint32_t* contentAsIntPtr = (uint32_t*) (fc._content); + uint32_t* contentAsIntPtr = (uint32_t*) ((char*) fc._content + offset); t_npts = *(contentAsIntPtr); t_dim = *(contentAsIntPtr + 1); npts = t_npts; dim = t_dim; - auto actual_file_size = npts * dim * sizeof(T) + 2 * sizeof(uint32_t); - if (actual_file_size != fc._size) { - std::stringstream stream; - stream << "Error. File size mismatch. Actual size is " << fc._size - << " while expected size is " << actual_file_size - << " npts = " << npts << " dim = " << dim - << " size of = " << sizeof(T) << std::endl; - diskann::cout << stream.str(); - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } - - data = - (T*) ((char*) fc._content + 2 * sizeof(uint32_t)); // No need to copy! + data = (T*) ((char*) fc._content + offset + + 2 * sizeof(uint32_t)); // No need to copy! } #endif template inline void load_bin(const std::string& bin_file, T*& data, size_t& npts, - size_t& dim) { + size_t& dim, size_t offset = 0) { // OLS //_u64 read_blk_size = 64 * 1024 * 1024; // cached_ifstream reader(bin_file, read_blk_size); @@ -229,20 +347,20 @@ namespace diskann { diskann::cout << "Reading bin file " << bin_file.c_str() << " ..." << std::endl; std::ifstream reader(bin_file, std::ios::binary | std::ios::ate); - uint64_t fsize = reader.tellg(); + // uint64_t fsize = reader.tellg(); reader.seekg(0); - load_bin_impl(reader, fsize, data, npts, dim); + load_bin_impl(reader, data, npts, dim, offset); } // load_bin functions END inline void load_truthset(const std::string& bin_file, uint32_t*& ids, - float*& dists, size_t& npts, size_t& dim) { - _u64 read_blk_size = 64 * 1024 * 1024; - cached_ifstream reader(bin_file, read_blk_size); - diskann::cout << "Reading truthset file " << bin_file.c_str() << " ..." + float*& dists, size_t& npts, size_t& dim, + uint32_t** tags = nullptr) { + std::ifstream reader(bin_file, std::ios::binary); + diskann::cout << "Reading truthset file " << bin_file.c_str() << "..." << std::endl; - size_t actual_file_size = reader.get_file_size(); + size_t actual_file_size = get_file_size(bin_file); int npts_i32, dim_i32; reader.read((char*) &npts_i32, sizeof(int)); @@ -264,9 +382,15 @@ namespace diskann { size_t expected_file_size_just_ids = npts * dim * sizeof(uint32_t) + 2 * sizeof(uint32_t); + size_t with_tags_actual_file_size = + 3 * npts * dim * sizeof(uint32_t) + 2 * sizeof(uint32_t); + if (actual_file_size == expected_file_size_just_ids) truthset_type = 2; + if (actual_file_size == with_tags_actual_file_size) + truthset_type = 3; + if (truthset_type == -1) { std::stringstream stream; stream << "Error. File size mismatch. File should have bin format, with " @@ -283,109 +407,137 @@ namespace diskann { ids = new uint32_t[npts * dim]; reader.read((char*) ids, npts * dim * sizeof(uint32_t)); - if (truthset_type == 1) { + if ((truthset_type == 1) || (truthset_type == 3)) { dists = new float[npts * dim]; reader.read((char*) dists, npts * dim * sizeof(float)); } + if (truthset_type == 3) { + *tags = new uint32_t[npts * dim]; + reader.read((char*) *tags, npts * dim * sizeof(uint32_t)); + } } #ifdef EXEC_ENV_OLS template inline void load_bin(MemoryMappedFiles& files, const std::string& bin_file, - std::unique_ptr& data, size_t& npts, size_t& dim) { + std::unique_ptr& data, size_t& npts, size_t& dim, + size_t offset = 0) { T* ptr; - load_bin(files, bin_file, ptr, npts, dim); + load_bin(files, bin_file, ptr, npts, dim, offset); data.reset(ptr); } + #endif template inline void load_bin(const std::string& bin_file, std::unique_ptr& data, - size_t& npts, size_t& dim) { + size_t& npts, size_t& dim, size_t offset = 0) { T* ptr; - load_bin(bin_file, ptr, npts, dim); + load_bin(bin_file, ptr, npts, dim, offset); data.reset(ptr); } template - inline void save_bin(const std::string& filename, T* data, size_t npts, - size_t ndims) { - std::ofstream writer(filename, std::ios::binary | std::ios::out); + inline uint64_t save_bin(const std::string& filename, T* data, size_t npts, + size_t ndims, size_t offset = 0) { + std::ofstream writer; + open_file_to_write(writer, filename); + diskann::cout << "Writing bin: " << filename.c_str() << std::endl; - int npts_i32 = (int) npts, ndims_i32 = (int) ndims; + writer.seekp(offset, writer.beg); + int npts_i32 = (int) npts, ndims_i32 = (int) ndims; + size_t bytes_written = npts * ndims * sizeof(T) + 2 * sizeof(uint32_t); writer.write((char*) &npts_i32, sizeof(int)); writer.write((char*) &ndims_i32, sizeof(int)); diskann::cout << "bin: #pts = " << npts << ", #dims = " << ndims - << ", size = " << npts * ndims * sizeof(T) + 2 * sizeof(int) - << "B" << std::endl; + << ", size = " << bytes_written << "B" << std::endl; - // data = new T[npts_u64 * ndims_u64]; writer.write((char*) data, npts * ndims * sizeof(T)); writer.close(); diskann::cout << "Finished writing bin." << std::endl; + return bytes_written; } // load_aligned_bin functions START template - inline void load_aligned_bin_impl(std::basic_istream& reader, - size_t actual_file_size, T*& data, + inline void load_aligned_bin_impl(std::basic_istream& reader, T*& data, size_t& npts, size_t& dim, - size_t& rounded_dim) { + size_t& rounded_dim, size_t offset = 0) { int npts_i32, dim_i32; + reader.seekg(offset, reader.beg); reader.read((char*) &npts_i32, sizeof(int)); reader.read((char*) &dim_i32, sizeof(int)); + npts = (unsigned) npts_i32; dim = (unsigned) dim_i32; - - size_t expected_actual_file_size = - npts * dim * sizeof(T) + 2 * sizeof(uint32_t); - if (actual_file_size != expected_actual_file_size) { - std::stringstream stream; - stream << "Error. File size mismatch. Actual size is " << actual_file_size - << " while expected size is " << expected_actual_file_size - << " npts = " << npts << " dim = " << dim - << " size of = " << sizeof(T) << std::endl; - diskann::cout << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } rounded_dim = ROUND_UP(dim, 8); diskann::cout << "Metadata: #pts = " << npts << ", #dims = " << dim << ", aligned_dim = " << rounded_dim << "..." << std::flush; size_t allocSize = npts * rounded_dim * sizeof(T); - diskann::cout << "allocating aligned memory, " << allocSize << " bytes..." - << std::flush; alloc_aligned(((void**) &data), allocSize, 8 * sizeof(T)); - diskann::cout << "done. Copying data..." << std::flush; for (size_t i = 0; i < npts; i++) { reader.read((char*) (data + i * rounded_dim), dim * sizeof(T)); memset(data + i * rounded_dim + dim, 0, (rounded_dim - dim) * sizeof(T)); } - diskann::cout << " done." << std::endl; + diskann::cout << " Allocated " << allocSize << "bytes and copied data " + << std::endl; } #ifdef EXEC_ENV_OLS template inline void load_aligned_bin(MemoryMappedFiles& files, const std::string& bin_file, T*& data, - size_t& npts, size_t& dim, size_t& rounded_dim) { - diskann::cout << "Reading bin file " << bin_file << " ..." << std::flush; - FileContent fc = files.getContent(bin_file); - ContentBuf buf((char*) fc._content, fc._size); - std::basic_istream reader(&buf); + size_t& npts, size_t& dim, size_t& rounded_dim, + size_t offset = 0) { + diskann::cout << "Reading bin file " << bin_file << " at offset: " << offset + << "..." << std::flush; + FileContent fc = files.getContent(bin_file); + // ContentBuf buf((char*) fc._content, fc._size); + + char* read_addr = (((char*) fc._content) + offset); + + int npts_32 = *((int*) read_addr); + int ndim_32 = *((int*) (read_addr + sizeof(int))); + + npts = (uint32_t) npts_32; + dim = (uint32_t) ndim_32; + + char* data_start = ((char*) fc._content) + offset + 2 * sizeof(int); + rounded_dim = ROUND_UP(dim, 8); + diskann::cout << "Metadata: #pts = " << npts << ", #dims = " << dim + << ", aligned_dim = " << rounded_dim << "..." << std::flush; + + size_t allocSize = npts * rounded_dim * sizeof(T); + + diskann::cout << "allocating aligned memory, " << allocSize << " bytes..." + << std::flush; + + alloc_aligned(((void**) &data), allocSize, 8 * sizeof(T)); + diskann::cout << "done. Copying data..." << std::flush; + + for (size_t i = 0; i < npts; i++) { + memcpy((data + i * rounded_dim), data_start, dim * sizeof(T)); + memset(data + i * rounded_dim + dim, 0, (rounded_dim - dim) * sizeof(T)); + data_start += dim * sizeof(T); + } - size_t actual_file_size = fc._size; - load_aligned_bin_impl(reader, actual_file_size, data, npts, dim, - rounded_dim); + if (data_start - read_addr != dim * sizeof(T) * npts + 2 * sizeof(int)) { + diskann::cerr << "Read " << data_start - read_addr + << " bytes of data instead of: " << dim * sizeof(T) * npts + << std::endl; + } + diskann::cout << " done." << std::endl; } #endif template inline void load_aligned_bin(const std::string& bin_file, T*& data, - size_t& npts, size_t& dim, size_t& rounded_dim) { - diskann::cout << "Reading bin file " << bin_file << " ..." << std::flush; + size_t& npts, size_t& dim, size_t& rounded_dim, + size_t offset = 0) { + diskann::cout << "Reading bin file " << bin_file << " at offset " << offset + << "..." << std::flush; // START OLS //_u64 read_blk_size = 64 * 1024 * 1024; // cached_ifstream reader(bin_file, read_blk_size); @@ -393,10 +545,10 @@ namespace diskann { // END OLS std::ifstream reader(bin_file, std::ios::binary | std::ios::ate); - uint64_t fsize = reader.tellg(); + // uint64_t fsize = reader.tellg(); reader.seekg(0); - load_aligned_bin_impl(reader, fsize, data, npts, dim, rounded_dim); + load_aligned_bin_impl(reader, data, npts, dim, rounded_dim, offset); } template @@ -410,24 +562,58 @@ namespace diskann { } } - // plain saves data as npts X ndims array into filename template - void save_Tvecs(const char* filename, T* data, size_t npts, size_t ndims) { - std::string fname(filename); + inline void load_aligned_bin(const std::string& bin_file, + std::unique_ptr& data, size_t& npts, + size_t& dim, size_t& rounded_dim, + size_t offset = 0) { + T* ptr; + load_aligned_bin(bin_file, ptr, npts, dim, rounded_dim, offset); + data.reset(ptr); + } - // create cached ofstream with 64MB cache - cached_ofstream writer(fname, 64 * 1048576); + template + inline uint64_t save_data_in_base_dimensions(const std::string& filename, + T* data, size_t npts, + size_t ndims, size_t aligned_dim, + size_t offset = 0) { + std::ofstream writer; //(filename, std::ios::binary | std::ios::out); + open_file_to_write(writer, filename); + int npts_i32 = (int) npts, ndims_i32 = (int) ndims; + _u64 bytes_written = 2 * sizeof(uint32_t) + npts * ndims * sizeof(T); + writer.seekp(offset, writer.beg); + writer.write((char*) &npts_i32, sizeof(int)); + writer.write((char*) &ndims_i32, sizeof(int)); + for (size_t i = 0; i < npts; i++) { + writer.write((char*) (data + i * aligned_dim), ndims * sizeof(T)); + } + writer.close(); + return bytes_written; + } - unsigned dims_u32 = (unsigned) ndims; + template + inline void copy_aligned_data_from_file(const std::string bin_file, T*& data, + size_t& npts, size_t& dim, + const size_t& rounded_dim, + size_t offset = 0) { + if (data == nullptr) { + diskann::cout << "Memory was not allocated for " << data + << " before calling the load function. Exiting..." + << std::endl; + exit(-1); + } + std::ifstream reader(bin_file, std::ios::binary); + reader.seekg(offset, reader.beg); - // start writing - for (uint64_t i = 0; i < npts; i++) { - // write dims in u32 - writer.write((char*) &dims_u32, sizeof(unsigned)); + int npts_i32, dim_i32; + reader.read((char*) &npts_i32, sizeof(int)); + reader.read((char*) &dim_i32, sizeof(int)); + npts = (unsigned) npts_i32; + dim = (unsigned) dim_i32; - // get cur point in data - T* cur_pt = data + i * ndims; - writer.write((char*) cur_pt, ndims * sizeof(T)); + for (size_t i = 0; i < npts; i++) { + reader.read((char*) (data + i * rounded_dim), dim * sizeof(T)); + memset(data + i * rounded_dim + dim, 0, (rounded_dim - dim) * sizeof(T)); } } @@ -444,7 +630,17 @@ namespace diskann { for (size_t d = 0; d < max_prefetch_size; d += 64) _mm_prefetch((const char*) vec + d, _MM_HINT_T1); } -}; // namespace diskann + + // NOTE: Implementation in utils.cpp. + void block_convert(std::ofstream& writr, std::ifstream& readr, + float* read_buf, _u64 npts, _u64 ndims); + + DISKANN_DLLEXPORT void normalize_data_file(const std::string& inFileName, + const std::string& outFileName); + + template + Distance* get_distance_function(Metric m); +} // namespace diskann struct PivotContainer { PivotContainer() = default; @@ -465,28 +661,6 @@ struct PivotContainer { float piv_dist; }; -inline bool file_exists(const std::string& name) { - struct stat buffer; - auto val = stat(name.c_str(), &buffer); - diskann::cout << " Stat(" << name.c_str() << ") returned: " << val - << std::endl; - return (val == 0); -} - -inline _u64 get_file_size(const std::string& fname) { - std::ifstream reader(fname, std::ios::binary | std::ios::ate); - if (!reader.fail() && reader.is_open()) { - _u64 end_pos = reader.tellg(); - diskann::cout << " Tellg: " << reader.tellg() << " as u64: " << end_pos - << std::endl; - reader.close(); - return end_pos; - } else { - diskann::cout << "Could not open file: " << fname << std::endl; - return 0; - } -} - inline bool validate_file_size(const std::string& name) { std::ifstream in(std::string(name), std::ios::binary); in.seekg(0, in.end); @@ -495,11 +669,12 @@ inline bool validate_file_size(const std::string& name) { size_t expected_file_size; in.read((char*) &expected_file_size, sizeof(uint64_t)); if (actual_file_size != expected_file_size) { - diskann::cout << "Error loading" << name << ". Expected " - "size (metadata): " + diskann::cerr << "Error loading" << name + << ". Expected " + "size (metadata): " << expected_file_size - << ", actual file size : " << actual_file_size - << ". Exitting." << std::endl; + << ", actual file size : " << actual_file_size << ". Exiting." + << std::endl; in.close(); return false; } @@ -507,18 +682,50 @@ inline bool validate_file_size(const std::string& name) { return true; } +template +diskann::Distance* get_distance_function(diskann::Metric m); + +extern bool AvxSupportedCPU; +extern bool Avx2SupportedCPU; + #ifdef _WINDOWS #include #include +inline size_t getMemoryUsage() { + PROCESS_MEMORY_COUNTERS_EX pmc; + GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*) &pmc, + sizeof(pmc)); + return pmc.PrivateUsage; +} + +inline std::string getWindowsErrorMessage(DWORD lastError) { + char* errorText; + FormatMessageA( + // use system message tables to retrieve error text + FORMAT_MESSAGE_FROM_SYSTEM + // allocate buffer on local heap for error text + | FORMAT_MESSAGE_ALLOCATE_BUFFER + // Important! will fail otherwise, since we're not + // (and CANNOT) pass insertion parameters + | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, // unused with FORMAT_MESSAGE_FROM_SYSTEM + lastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR) &errorText, // output + 0, // minimum size for output buffer + NULL); // arguments - see note + + return errorText != nullptr ? std::string(errorText) : std::string(); +} + inline void printProcessMemory(const char* message) { PROCESS_MEMORY_COUNTERS counters; HANDLE h = GetCurrentProcess(); GetProcessMemoryInfo(h, &counters, sizeof(counters)); diskann::cout << message << " [Peaking Working Set size: " - << counters.PeakWorkingSetSize * 1.0 / (1024 * 1024 * 1024) + << counters.PeakWorkingSetSize * 1.0 / (1024.0 * 1024 * 1024) << "GB Working set size: " - << counters.WorkingSetSize * 1.0 / (1024 * 1024 * 1024) + << counters.WorkingSetSize * 1.0 / (1024.0 * 1024 * 1024) << "GB Private bytes " << counters.PagefileUsage * 1.0 / (1024 * 1024 * 1024) << "GB]" << std::endl; @@ -529,11 +736,6 @@ inline void printProcessMemory(const char* message) { inline bool avx2Supported() { return true; } - -inline void printProcessMemory(const char* message) { - diskann::cout << message << std::endl; +inline void printProcessMemory(const char*) { } #endif - -extern bool AvxSupportedCPU; -extern bool Avx2SupportedCPU; diff --git a/include/v2/aux_dist.h b/include/v2/aux_dist.h new file mode 100644 index 0000000000..986977159f --- /dev/null +++ b/include/v2/aux_dist.h @@ -0,0 +1,5 @@ +#pragma once + +namespace diskann { + class FloatFloat +} // namespace diskann \ No newline at end of file diff --git a/include/v2/delete_set.h b/include/v2/delete_set.h new file mode 100644 index 0000000000..654b43dd18 --- /dev/null +++ b/include/v2/delete_set.h @@ -0,0 +1,37 @@ +#pragma once + +#include "v2/graph_delta.h" +#include "tsl/robin_map.h" +#include "tsl/robin_set.h" +#include +#include +#include +#include +#include + +namespace diskann { + class DeleteSet { + public: + // max # track_merge calls before `id` becomes free + DeleteSet(uint32_t max_merges); + ~DeleteSet(); + + // adds `id` to deleted set + void add_delete(uint32_t id); + + // checks if `id` is in delete set + bool is_dead(uint32_t id); + void batch_is_dead(const uint32_t *ids, bool* dead, const uint32_t count); + + // track merge + release merged nodes + void merge_start(); + + // returns nodes + std::vector track_merge(); + private: + tsl::robin_map *primary = nullptr; + tsl::robin_map *secondary = nullptr; + uint32_t max_merges; + std::mutex lock; + }; +} // namespace diskann \ No newline at end of file diff --git a/include/v2/fs_allocator.h b/include/v2/fs_allocator.h new file mode 100644 index 0000000000..d360652d36 --- /dev/null +++ b/include/v2/fs_allocator.h @@ -0,0 +1,30 @@ +#pragma once + +#include "tsl/robin_map.h" +#include "tsl/robin_set.h" +#include +#include +#include +#include +#include + +namespace diskann { + // cached allocator for fast aligned mallocs + template + class FixedSizeAlignedAllocator { + public: + // create aligned buffer with at least max_count * ndims elements + FixedSizeAlignedAllocator(const uint32_t ndims, const uint32_t max_count); + // destruct allocator, free mem + ~FixedSizeAlignedAllocator(); + // allocate ndims buffer + T* allocate(); + // deallocate ndims elements + void deallocate(T* ptr); + private: + std::mutex lock; + T* buf = nullptr; + tsl::robin_set free_set; + uint32_t count; + }; +} // namespace diskann \ No newline at end of file diff --git a/include/v2/graph_delta.h b/include/v2/graph_delta.h new file mode 100644 index 0000000000..be395cddd3 --- /dev/null +++ b/include/v2/graph_delta.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace diskann { + class GraphDelta { + public: + GraphDelta(const uint32_t offset, const uint32_t max_nodes); + // inserts node `id` into graph with `nhood` as neighbors + // SUCCEEDS ONLY IF `id` belongs to the range [offset, offset + max_nodes] + void insert_vector(const uint32_t id, const uint32_t*nhood, const uint32_t nnbrs); + + // adds required back-edges from `srcs` to `dest` + void inter_insert(const uint32_t dest, const uint32_t* srcs, const uint32_t src_count); + + // get nhood for single ID + const std::vector get_nhood(const uint32_t id); + + void rename_edges(const tsl::robin_map& rename_map); + void rename_edges(const std::function &rename_func); + private: + bool is_relevant(const uint32_t id); + // in-memory graph + std::vector> graph; + // locks to access nodes in graph + std::unique_ptr locks; + // max nodes + uint32_t offset; + uint32_t max_nodes; + // id 'n' nhood located at graph[n - offset] if offset <= n <= offset + max_nodes + }; +}; diff --git a/include/v2/index_merger.h b/include/v2/index_merger.h new file mode 100644 index 0000000000..c3323a8759 --- /dev/null +++ b/include/v2/index_merger.h @@ -0,0 +1,184 @@ +#pragma once + +#include "v2/graph_delta.h" +#include "tsl/robin_map.h" +#include "tsl/robin_set.h" +#include "pq_flash_index.h" +#include "linux_aligned_file_reader.h" +#include "index.h" +#include +#include +#include +#include +#include +#include "windows_customizations.h" + +namespace diskann { + template + class StreamingMerger { + public: + // constructor to read a constructed index, allocated IDs + // disk_in : SSD-DiskANN index to merge into + // mem_in : list of mem-DiskANN indices to merge into disk_in + // disk_out : SSD-DiskANN index to write out + // delete_list : list of IDs to delete from disk_in + // ndims : dimensionality of full-prec vectors + // dist : distance comparator -- WARNING :: assumed to be L2 + // beam_width : BW for search on disk_in + // range : max out-degree + // l_index : L param for indexing + // maxc : max num of candidates to consider while pruning + /* StreamingMerger(const char* disk_in, const std::vector + &mem_in, const char* disk_out, const char* deleted_tags, const uint32_t + ndims, Distance* dist, const uint32_t beam_width, const uint32_t + range, const uint32_t l_index, const float alpha, const uint32_t maxc, + bool single_file_index);*/ + DISKANN_DLLEXPORT StreamingMerger(const uint32_t ndims, Distance *dist, + diskann::Metric dist_metric, + const uint32_t beam_width, + const uint32_t range, + const uint32_t l_index, const float alpha, + const uint32_t maxc, + bool single_file_index); + + DISKANN_DLLEXPORT ~StreamingMerger(); + + DISKANN_DLLEXPORT void merge(const char * disk_in, + const std::vector &mem_in, + const char * disk_out, + std::vector*> &deleted_tags, + std::string &working_folder); + // merge all memory indices into the disk index and write out new disk index + void mergeImpl(); + + private: + /* insert related funcs */ + void process_inserts(); + void process_inserts_pq(); + void insert_mem_vec(const T *vec, const uint32_t offset_id); + void offset_iterate_to_fixed_point( + const T *vec, const uint32_t Lsize, + std::vector & expanded_nodes_info, + tsl::robin_map &coord_map); + // used to prune insert() edges + void prune_neighbors(const tsl::robin_map &coord_map, + std::vector & pool, + std::vector & pruned_list); + // used to prune inter-insert() edges + void prune_neighbors_pq(std::vector &pool, + std::vector &pruned_list, + uint8_t * scratch = nullptr); + void occlude_list(std::vector & pool, + const tsl::robin_map &coord_map, + std::vector & result, + std::vector & occlude_factor); + void occlude_list_pq(std::vector &pool, + std::vector &result, + std::vector & occlude_factor, + uint8_t * scratch = nullptr); + + void dump_to_disk(const uint32_t start_id, const char *buf, + const uint32_t n_sector, std::ofstream& output_writer); + + /* delete related funcs */ + // converts tags into deleted IDs + void compute_deleted_ids(); + // process all deletes + void process_deletes(); + // reads nhoods of all deleted nods + void populate_deleted_nhoods(); + // eliminates references to deleted nodes in id_nhoods + void consolidate_deletes(DiskNode &disk_node, + uint8_t * scratch = nullptr); + // whether the specific node is deleted / node id not in use + bool is_deleted(const DiskNode &disk_node); + + /* rename related funcs */ + // assign smallest free IDs to new inserts + void compute_rename_map(); + void rename(DiskNode &node) const; + void rename(std::vector &nhood) const; + // returns uint32_t::max() upon failure + uint32_t rename(uint32_t id) const; + // returns uint32_t::max() upon failure + uint32_t rename_inverse(uint32_t renamed_id) const; + // returns ID of mem index offset_id belongs to; uint32_t::max() otherwise + uint32_t get_index_id(const uint32_t offset_id) const; + std::vector get_edge_list(const uint32_t offset_id); + const T * get_mem_data(const uint32_t offset_id); + + /* merge related funcs */ + void write_tag_file(const std::string &tag_out_filename, + const uint32_t npts); + void process_merges(); + + // deletes + tsl::robin_set deleted_tags; + tsl::robin_map> disk_deleted_nhoods; + tsl::robin_set disk_deleted_ids; + std::vector> mem_deleted_ids; + char *delete_backing_buf = nullptr; + + // rename stuff + tsl::robin_map rename_map; + tsl::robin_map inverse_map; + std::vector> rename_list; + std::vector> inverse_list; + + // disk index + GraphDelta * disk_delta; + PQFlashIndex *disk_index; + std::vector init_ids; + uint8_t * pq_data = nullptr; + TagT * disk_tags = nullptr; + uint32_t pq_nchunks; + uint32_t max_node_len, nnodes_per_sector, disk_npts; + std::string disk_index_out_path, disk_index_in_path, pq_coords_file; + std::string temp_disk_index_path, temp_pq_coords_path, temp_tags_path; + std::string final_index_file, final_pq_coords_file, final_tags_file; + //std::fstream output_writer; + std::vector> disk_thread_data; + + // mem-index + std::vector mem_deltas; + //std::vector *> mem_indices; + //std::vector> *> mem_graphs; + std::vector mem_data; + std::vector> mem_tags; + std::vector offset_ids; + std::vector mem_npts; + Distance * dist_cmp; + diskann::Metric dist_metric; + //T * _data_load; + std::vector> latter_deleted_tags; + + + + + // allocators + // FixedSizeAlignedAllocator *fp_alloc = nullptr; + // FixedSizeAlignedAllocator *pq_alloc = nullptr; + + // book keeping + std::vector free_ids; + uint8_t * thread_pq_scratch = nullptr; + std::vector thread_bufs; + // vector info + uint32_t ndims, aligned_ndims; + // search + index params + uint32_t beam_width; + uint32_t l_index, range, maxc; + float alpha; + + uint64_t disk_index_num_frozen = 0; // assuming that every merge + // folds a single mem index into the PQFlashIndex + uint64_t disk_index_frozen_loc = 0; + // timing stuff + std::vector insert_times, delta_times, search_times, prune_times; + std::mutex _print_lock; + + bool _single_file_index = false; + + std::string TMP_FOLDER; + }; +}; // namespace diskann diff --git a/include/v2/merge_insert.h b/include/v2/merge_insert.h new file mode 100644 index 0000000000..bc8c5851b4 --- /dev/null +++ b/include/v2/merge_insert.h @@ -0,0 +1,156 @@ +#pragma once + +#include "v2/graph_delta.h" +#include "v2/fs_allocator.h" +#include "v2/index_merger.h" +#include "tsl/robin_map.h" +#include "tsl/robin_set.h" +#include "pq_flash_index.h" +#include "linux_aligned_file_reader.h" +#include "index.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "parameters.h" +#include "Neighbor_Tag.h" +#include "threadpool.h" + +#include "windows_customizations.h" + +#define MERGE_TH 18000000 + +namespace diskann { + + template + class MergeInsert { + public: + // constructor + DISKANN_DLLEXPORT MergeInsert( + Parameters& parameters, size_t dim, const std::string mem_prefix, + const std::string disk_prefix_in, const std::string disk_prefix_out, + Distance* dist, diskann::Metric disk_metric, bool single_file_index, + std::string working_folder); + + DISKANN_DLLEXPORT ~MergeInsert(); + + // insertion function - insert into short_term_index + DISKANN_DLLEXPORT int insert(const T* point, const TagT& tag); + + DISKANN_DLLEXPORT void lazy_delete(const TagT& tag); + //DISKANN_DLLEXPORT void lazy_delete(tsl::robin_set& delete_list); + + // search function - search both short_term_index and long_term_index and + // return with top L candidate tags of the shard + DISKANN_DLLEXPORT void search_sync(const T* query, const uint64_t K, + const uint64_t search_L, TagT* tags, + float* distances, QueryStats* stats); + // void return_active_tags(tsl::robin_set& active_tags); + + // continuously runs in background to check if mem index size has exceeded + // its threshold - triggers index switch and merge + DISKANN_DLLEXPORT int trigger_merge(); + + DISKANN_DLLEXPORT void final_merge(); + + DISKANN_DLLEXPORT std::string ret_merge_prefix(); + + protected: + // call constructor to StreamingMerger object + void construct_index_merger(); + + // call StreamingMerger destructor to explicitly de-register threads + void destruct_index_merger(); + + //_active_index flag will be modified only inside this function + void switch_index(); // function to atomically switch btw indices, makes + // older index inactive(read-only), saves it, makes new + // index active (r/w) + + // save currently active mem_index and make it inactive + int save(); + + // make a local copy of _deletion_set and save it to a _deleted_tags_file + void save_del_set(); + + // call merge on a StreamingMerger object, only if index switching and + // saving is successful + void merge(); + + private: + size_t _merge_th = 0; + size_t _mem_points = 0; // reflects number of points in active mem index + size_t _index_points = 0; + size_t _dim; + _u32 _num_nodes_to_cache; + _u32 _num_search_threads; + uint64_t _beamwidth; + + std::unordered_map curr_location_to_tag; + + std::shared_ptr> _mem_index_0 = nullptr; + std::shared_ptr> _mem_index_1 = nullptr; + std::shared_ptr reader = nullptr; + PQFlashIndex* _disk_index = nullptr; + StreamingMerger * _merger = nullptr; + std::string TMP_FOLDER; + + diskann::Metric _dist_metric; + Distance* _dist_comp; + + diskann::Parameters _paras_mem; + diskann::Parameters _paras_disk; + + tsl::robin_set _deletion_set_0; + tsl::robin_set _deletion_set_1; + + std::vector*> _deleted_tags_vector; + + int _active_index = 0; // reflects value of writable index + int _active_delete_set = 0; // reflects active _deletion_set + std::atomic_bool _active_0; // true except when merging + std::atomic_bool _active_1; // true except when merging + std::atomic_bool _active_del_0; // true except when being saved + std::atomic_bool _active_del_1; // true except when being saved + std::atomic_bool _clearing_index_0; // don't search mem_index if true + std::atomic_bool _clearing_index_1; // don't search mem_index if true + std::atomic_bool _switching_disk_prefixes = + false; // wait if true, search when false + std::atomic_bool _check_switch_index = + false; // true when switch_index acquires _index_lock in writer mode, + // insert threads wait till it turns back to false + std::atomic_bool _check_switch_delete = + false; // true when switching between _deletion_sets, _delete_lock + // acquired in write mode, delete thread waits till it turns back to false + + bool _single_file_index = false; + + std::shared_timed_mutex _delete_lock; // lock to access _deletion_set + std::shared_timed_mutex _index_lock; // mutex to switch between mem indices + std::shared_timed_mutex _change_lock; // mutex to switch increment _mem_pts + std::shared_timed_mutex _disk_lock; // mutex to switch between disk indices + std::shared_timed_mutex + _clear_lock_0; // lock to prevent an index from being cleared when it + // is being searched and vice versa + std::shared_timed_mutex + _clear_lock_1; // lock to prevent an index from being cleared when it + // is being searched and vice versa + + ThreadPool* _search_tpool; + + std::string _mem_index_prefix; + std::string _disk_index_prefix_in; + std::string _disk_index_prefix_out; + std::string _deleted_tags_file; + }; +}; // namespace diskann diff --git a/include/windows_aligned_file_reader.h b/include/windows_aligned_file_reader.h index 8fec3d4f0e..433d3c0bf7 100644 --- a/include/windows_aligned_file_reader.h +++ b/include/windows_aligned_file_reader.h @@ -31,7 +31,7 @@ class WindowsAlignedFileReader : public AlignedFileReader { // Open & close ops // Blocking calls DISKANN_DLLEXPORT virtual void open(const std::string &fname); - DISKANN_DLLEXPORT virtual void close(); + DISKANN_DLLEXPORT virtual void close(); DISKANN_DLLEXPORT virtual void register_thread(); DISKANN_DLLEXPORT virtual void deregister_thread() { @@ -41,8 +41,7 @@ class WindowsAlignedFileReader : public AlignedFileReader { // process batch of aligned requests in parallel // NOTE :: blocking call for the calling thread, but can thread-safe DISKANN_DLLEXPORT virtual void read(std::vector &read_reqs, - IOContext &ctx, - bool async); + IOContext &ctx, bool async); }; #endif // USE_BING_INFRA #endif //_WINDOWS diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9cd8a86bc4..fe49a71d2a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,7 +9,9 @@ else() #file(GLOB CPP_SOURCES *.cpp) set(CPP_SOURCES ann_exception.cpp aux_utils.cpp index.cpp linux_aligned_file_reader.cpp math_utils.cpp memory_mapper.cpp - partition_and_pq.cpp pq_flash_index.cpp logger.cpp utils.cpp) + partition_and_pq.cpp pq_flash_index.cpp logger.cpp distance.cpp + utils.cpp v2/graph_delta.cpp v2/index_merger.cpp + v2/merge_insert.cpp) add_library(${PROJECT_NAME} ${CPP_SOURCES}) add_library(${PROJECT_NAME}_s STATIC ${CPP_SOURCES}) endif() diff --git a/src/ann_exception.cpp b/src/ann_exception.cpp index 23f3db9937..c24985eaae 100644 --- a/src/ann_exception.cpp +++ b/src/ann_exception.cpp @@ -33,4 +33,8 @@ namespace diskann { return sstream.str(); } -} // namespace diskann \ No newline at end of file + int ANNException::errorCode() const { + return _errorCode; + } + +} // namespace diskann diff --git a/src/aux_utils.cpp b/src/aux_utils.cpp index 6a2990ba66..18a7a27b27 100644 --- a/src/aux_utils.cpp +++ b/src/aux_utils.cpp @@ -21,19 +21,98 @@ #include "pq_flash_index.h" #include "utils.h" +#include "pq_flash_index.h" +#include "tsl/robin_set.h" +#include "utils.h" + +#define NUM_KMEANS 15 + namespace diskann { - double get_memory_budget(const std::string &mem_budget_str) { - double mem_ram_budget = atof(mem_budget_str.c_str()); - double final_index_ram_limit = mem_ram_budget; - if (mem_ram_budget - SPACE_FOR_CACHED_NODES_IN_GB > + void add_new_file_to_single_index(std::string index_file, + std::string new_file) { + std::unique_ptr<_u64[]> metadata; + _u64 nr, nc; + diskann::load_bin<_u64>(index_file, metadata, nr, nc, 0); + if (nc != 1) { + std::stringstream stream; + stream << "Error, index file specified does not have correct metadata. " + << std::endl; + throw diskann::ANNException(stream.str(), -1); + } + size_t index_ending_offset = metadata[nr - 1]; + _u64 read_blk_size = 64 * 1024 * 1024; + cached_ofstream writer(index_file, read_blk_size, index_ending_offset); + _u64 check_file_size = get_file_size(index_file); + if (check_file_size != index_ending_offset) { + std::stringstream stream; + stream << "Error, index file specified does not have correct metadata " + "(last entry must match the filesize). " + << std::endl; + throw diskann::ANNException(stream.str(), -1); + } + + cached_ifstream reader(new_file, read_blk_size); + size_t fsize = reader.get_file_size(); + if (fsize == 0) { + std::stringstream stream; + stream << "Error, new file specified is empty. Not appending. " + << std::endl; + throw diskann::ANNException(stream.str(), -1); + } + + size_t num_blocks = DIV_ROUND_UP(fsize, read_blk_size); + char * dump = new char[read_blk_size]; + for (_u64 i = 0; i < num_blocks; i++) { + size_t cur_block_size = read_blk_size > fsize - (i * read_blk_size) + ? fsize - (i * read_blk_size) + : read_blk_size; + reader.read(dump, cur_block_size); + writer.write(dump, cur_block_size); + } + reader.close(); + writer.close(); + + delete[] dump; + std::vector<_u64> new_meta; + for (_u64 i = 0; i < nr; i++) + new_meta.push_back(metadata[i]); + new_meta.push_back(metadata[nr - 1] + fsize); + + diskann::save_bin<_u64>(index_file, new_meta.data(), new_meta.size(), 1, 0); + } + + double get_memory_budget(double search_ram_budget) { + double final_index_ram_limit = search_ram_budget; + if (search_ram_budget - SPACE_FOR_CACHED_NODES_IN_GB > THRESHOLD_FOR_CACHING_IN_GB) { // slack for space used by cached // nodes - final_index_ram_limit = mem_ram_budget - SPACE_FOR_CACHED_NODES_IN_GB; + final_index_ram_limit = search_ram_budget - SPACE_FOR_CACHED_NODES_IN_GB; } return final_index_ram_limit * 1024 * 1024 * 1024; } + double get_memory_budget(const std::string &mem_budget_str) { + double search_ram_budget = atof(mem_budget_str.c_str()); + return get_memory_budget(search_ram_budget); + } + + size_t calculate_num_pq_chunks(double final_index_ram_limit, + size_t points_num, uint32_t dim) { + size_t num_pq_chunks = + (size_t)(std::floor)(_u64(final_index_ram_limit / (double) points_num)); + + diskann::cout << "Calculated num_pq_chunks :" << num_pq_chunks << std::endl; + num_pq_chunks = num_pq_chunks <= 0 ? 1 : num_pq_chunks; + num_pq_chunks = num_pq_chunks > dim ? dim : num_pq_chunks; + num_pq_chunks = + num_pq_chunks > MAX_PQ_CHUNKS ? MAX_PQ_CHUNKS : num_pq_chunks; + + diskann::cout << "Compressing " << dim << "-dimensional data into " + << num_pq_chunks << " bytes per vector." << std::endl; + return num_pq_chunks; + } + double calculate_recall(unsigned num_queries, unsigned *gold_std, float *gs_dist, unsigned dim_gs, unsigned *our_results, unsigned dim_or, @@ -48,8 +127,8 @@ namespace diskann { unsigned *res_vec = our_results + dim_or * i; size_t tie_breaker = recall_at; if (gs_dist != nullptr) { - tie_breaker = recall_at - 1; float *gt_dist_vec = gs_dist + dim_gs * i; + tie_breaker = recall_at - 1; while (tie_breaker < dim_gs && gt_dist_vec[tie_breaker] == gt_dist_vec[recall_at - 1]) tie_breaker++; @@ -57,9 +136,10 @@ namespace diskann { gt.insert(gt_vec, gt_vec + tie_breaker); res.insert(res_vec, res_vec + recall_at); + unsigned cur_recall = 0; - for (auto &v : gt) { - if (res.find(v) != res.end()) { + for (auto &v : res) { + if (gt.find(v) != gt.end()) { cur_recall++; } } @@ -68,6 +148,63 @@ namespace diskann { return total_recall / (num_queries) * (100.0 / recall_at); } + double calculate_recall(unsigned num_queries, unsigned *gold_std, + float *gs_dist, unsigned dim_gs, + unsigned *our_results, unsigned dim_or, + unsigned recall_at, + const tsl::robin_set &active_tags) { + double total_recall = 0; + std::set gt, res; + bool printed = false; + for (size_t i = 0; i < num_queries; i++) { + gt.clear(); + res.clear(); + unsigned *gt_vec = gold_std + dim_gs * i; + unsigned *res_vec = our_results + dim_or * i; + size_t tie_breaker = recall_at; + unsigned active_points_count = 0; + unsigned cur_counter = 0; + while (active_points_count < recall_at && cur_counter < dim_gs) { + if (active_tags.find(*(gt_vec + cur_counter)) != active_tags.end()) { + active_points_count++; + } + cur_counter++; + } + if (active_tags.empty()) + cur_counter = recall_at; + + if ((active_points_count < recall_at && !active_tags.empty()) && + !printed) { + diskann::cout << "Warning: Couldn't find enough closest neighbors " + << active_points_count << "/" << recall_at + << " from " + "truthset for query # " + << i << ". Will result in under-reported value of recall." + << std::endl; + printed = true; + } + if (gs_dist != nullptr) { + tie_breaker = cur_counter - 1; + float *gt_dist_vec = gs_dist + dim_gs * i; + while (tie_breaker < dim_gs && + gt_dist_vec[tie_breaker] == gt_dist_vec[cur_counter - 1]) + tie_breaker++; + } + + gt.insert(gt_vec, gt_vec + tie_breaker); + res.insert(res_vec, res_vec + recall_at); + unsigned cur_recall = 0; + for (auto &v : res) { + if (gt.find(v) != gt.end()) { + cur_recall++; + } + } + total_recall += cur_recall; + } + return ((double) (total_recall / (num_queries))) * + ((double) (100.0 / recall_at)); + } + template T *generateRandomWarmup(uint64_t warmup_num, uint64_t warmup_dim, uint64_t warmup_aligned_dim) { @@ -102,6 +239,12 @@ namespace diskann { if (files.fileExists(cache_warmup_file)) { diskann::load_aligned_bin(files, cache_warmup_file, warmup, warmup_num, file_dim, file_aligned_dim); + diskann::cout << "In the warmup file: " << cache_warmup_file + << " File dim: " << file_dim + << " File aligned dim: " << file_aligned_dim + << " Expected dim: " << warmup_dim + << " Expected aligned dim: " << warmup_aligned_dim + << std::endl; if (file_dim != warmup_dim || file_aligned_dim != warmup_aligned_dim) { std::stringstream stream; stream << "Mismatched dimensions in sample file. file_dim = " @@ -152,9 +295,8 @@ namespace diskann { std::ifstream reader(fname.c_str(), std::ios::binary); reader.read((char *) &npts32, sizeof(uint32_t)); reader.read((char *) &dim, sizeof(uint32_t)); - if (dim != 1 || - actual_file_size != - ((size_t) npts32) * sizeof(uint32_t) + 2 * sizeof(uint32_t)) { + if (dim != 1 || actual_file_size != ((size_t) npts32) * sizeof(uint32_t) + + 2 * sizeof(uint32_t)) { std::stringstream stream; stream << "Error reading idmap file. Check if the file is bin file with " "1 dimensional data. Actual: " @@ -209,32 +351,23 @@ namespace diskann { node_shard.push_back(std::make_pair((_u32) node_id, (_u32) shard)); } } - std::sort(node_shard.begin(), node_shard.end(), [](const auto &left, - const auto &right) { - return left.first < right.first || - (left.first == right.first && left.second < right.second); - }); + std::sort(node_shard.begin(), node_shard.end(), + [](const auto &left, const auto &right) { + return left.first < right.first || (left.first == right.first && + left.second < right.second); + }); diskann::cout << "Finished computing node -> shards map" << std::endl; // create cached vamana readers std::vector vamana_readers(nshards); for (_u64 i = 0; i < nshards; i++) { vamana_readers[i].open(vamana_names[i], 1024 * 1048576); - size_t actual_file_size = get_file_size(vamana_names[i]); size_t expected_file_size; vamana_readers[i].read((char *) &expected_file_size, sizeof(uint64_t)); - if (actual_file_size != expected_file_size) { - std::stringstream stream; - stream << "Error in Vamana Index file " << vamana_names[i] - << " Actual file size: " << actual_file_size - << " does not match expected file size: " << expected_file_size - << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } } - size_t merged_index_size = 16; + size_t merged_index_size = 24; + size_t merged_index_frozen = 0; // create cached vamana writers cached_ofstream diskann_writer(output_vamana, 1024 * 1048576); diskann_writer.write((char *) &merged_index_size, sizeof(uint64_t)); @@ -259,10 +392,13 @@ namespace diskann { medoid_writer.write((char *) &nshards_u32, sizeof(uint32_t)); medoid_writer.write((char *) &one_val, sizeof(uint32_t)); + _u64 vamana_index_frozen = 0; for (_u64 shard = 0; shard < nshards; shard++) { unsigned medoid; // read medoid vamana_readers[shard].read((char *) &medoid, sizeof(unsigned)); + vamana_readers[shard].read((char *) &vamana_index_frozen, sizeof(_u64)); + assert(vamana_index_frozen == false); // rename medoid medoid = idmaps[shard][medoid]; @@ -271,11 +407,12 @@ namespace diskann { if (shard == (nshards - 1)) //--> uncomment if running hierarchical diskann_writer.write((char *) &medoid, sizeof(unsigned)); } + diskann_writer.write((char *) &merged_index_frozen, sizeof(_u64)); medoid_writer.close(); diskann::cout << "Starting merge" << std::endl; - // Gopal. random_shuffle() is deprecated. + // random_shuffle() is deprecated. std::random_device rng; std::mt19937 urng(rng()); @@ -288,7 +425,7 @@ namespace diskann { unsigned node_id = id_shard.first; unsigned shard_id = id_shard.second; if (cur_id < node_id) { - // Gopal. random_shuffle() is deprecated. + // random_shuffle() is deprecated. std::shuffle(final_nhood.begin(), final_nhood.end(), urng); nnbrs = (unsigned) (std::min)(final_nhood.size(), (uint64_t) max_degree); @@ -321,7 +458,7 @@ namespace diskann { } } - // Gopal. random_shuffle() is deprecated. + // random_shuffle() is deprecated. std::shuffle(final_nhood.begin(), final_nhood.end(), urng); nnbrs = (unsigned) (std::min)(final_nhood.size(), (uint64_t) max_degree); // write into merged ofstream @@ -342,12 +479,11 @@ namespace diskann { } template - int build_merged_vamana_index(std::string base_file, - diskann::Metric _compareMetric, unsigned L, - unsigned R, double sampling_rate, - double ram_budget, std::string mem_index_path, - std::string medoids_file, - std::string centroids_file) { + int build_merged_vamana_index( + std::string base_file, diskann::Metric _compareMetric, + bool single_file_index, unsigned L, unsigned R, double sampling_rate, + double ram_budget, std::string mem_index_path, std::string medoids_file, + std::string centroids_file, const char *tag_file) { size_t base_num, base_dim; diskann::get_bin_metadata(base_file, base_num, base_dim); @@ -360,20 +496,40 @@ namespace diskann { paras.Set("L", (unsigned) L); paras.Set("R", (unsigned) R); paras.Set("C", 750); - paras.Set("alpha", 2.0f); + paras.Set("alpha", 1.2f); paras.Set("num_rnds", 2); - paras.Set("saturate_graph", 1); + paras.Set("saturate_graph", 1); // was 0 earlier. paras.Set("save_path", mem_index_path); + bool tags_enabled; + if (tag_file == nullptr) + tags_enabled = false; + else + tags_enabled = true; + std::unique_ptr> _pvamanaIndex = std::unique_ptr>( - new diskann::Index(_compareMetric, base_file.c_str())); - _pvamanaIndex->build(paras); + new diskann::Index(_compareMetric, base_dim, base_num, false, + single_file_index, tags_enabled)); + if (tags_enabled) + _pvamanaIndex->build(base_file.c_str(), base_num, paras, tag_file); + else + _pvamanaIndex->build(base_file.c_str(), base_num, paras); + _pvamanaIndex->save(mem_index_path.c_str()); std::remove(medoids_file.c_str()); std::remove(centroids_file.c_str()); return 0; } + + if (single_file_index || tag_file != nullptr) { + diskann::cout << "Cannot build merged index if single_file_index is " + "required or if tags are specified. Please contact " + "rakri@microsoft.com if this is required" + << std::endl; + return 1; + } + std::string merged_index_prefix = mem_index_path + "_tempFiles"; int num_parts = partition_with_ram_budget(base_file, sampling_rate, ram_budget, @@ -392,15 +548,18 @@ namespace diskann { paras.Set("L", L); paras.Set("R", (2 * (R / 3))); paras.Set("C", 750); - paras.Set("alpha", 2.0f); + paras.Set("alpha", 1.2f); paras.Set("num_rnds", 2); - paras.Set("saturate_graph", 1); + paras.Set("saturate_graph", 0); paras.Set("save_path", shard_index_file); + _u64 shard_base_dim, shard_base_pts; + get_bin_metadata(shard_base_file, shard_base_pts, shard_base_dim); std::unique_ptr> _pvamanaIndex = - std::unique_ptr>( - new diskann::Index(_compareMetric, shard_base_file.c_str())); - _pvamanaIndex->build(paras); + std::unique_ptr>(new diskann::Index( + _compareMetric, shard_base_dim, shard_base_pts, false, + single_file_index)); // TODO: Single? + _pvamanaIndex->build(shard_base_file.c_str(), shard_base_pts, paras); _pvamanaIndex->save(shard_index_file.c_str()); } @@ -416,9 +575,13 @@ namespace diskann { std::to_string(p) + "_ids_uint32.bin"; std::string shard_index_file = merged_index_prefix + "_subshard-" + std::to_string(p) + "_mem.index"; + // Required if Index.cpp thinks we are building a multi-file index. + std::string shard_index_file_data = shard_index_file + ".data"; + std::remove(shard_base_file.c_str()); std::remove(shard_id_file.c_str()); std::remove(shard_index_file.c_str()); + std::remove(shard_index_file_data.c_str()); } return 0; } @@ -429,71 +592,103 @@ namespace diskann { // optimizes the beamwidth to maximize QPS for a given L_search subject to // 99.9 latency not blowing up - template - uint32_t optimize_beamwidth( - std::unique_ptr> &pFlashIndex, T - *tuning_sample, - _u64 tuning_sample_num, _u64 tuning_sample_aligned_dim, uint32_t L, - uint32_t nthreads, uint32_t start_bw) { - uint32_t cur_bw = start_bw; - double max_qps = 0; - uint32_t best_bw = start_bw; - bool stop_flag = false; - - while (!stop_flag) { - std::vector tuning_sample_result_ids_64(tuning_sample_num, - 0); - std::vector tuning_sample_result_dists(tuning_sample_num, - 0); - diskann::QueryStats * stats = new - diskann::QueryStats[tuning_sample_num]; - - auto s = std::chrono::high_resolution_clock::now(); - #pragma omp parallel for schedule(dynamic, 1) num_threads(nthreads) - for (_s64 i = 0; i < (int64_t) tuning_sample_num; i++) { - pFlashIndex->cached_beam_search( - tuning_sample + (i * tuning_sample_aligned_dim), 1, L, - tuning_sample_result_ids_64.data() + (i * 1), - tuning_sample_result_dists.data() + (i * 1), cur_bw, stats + - i); - } - auto e = std::chrono::high_resolution_clock::now(); - std::chrono::duration diff = e - s; - double qps = (1.0f * tuning_sample_num) / (1.0f * diff.count()); - - double lat_999 = diskann::get_percentile_stats( - stats, tuning_sample_num, 0.999, - [](const diskann::QueryStats &stats) { return stats.total_us; }); - - double mean_latency = diskann::get_mean_stats( - stats, tuning_sample_num, - [](const diskann::QueryStats &stats) { return stats.total_us; }); - - if (qps > max_qps && lat_999 < (15000) + mean_latency * 2) { - max_qps = qps; - best_bw = cur_bw; - cur_bw = (uint32_t)(std::ceil)((float) cur_bw * 1.1); - } else { - stop_flag = true; - } - if (cur_bw > 64) - stop_flag = true; - - delete[] stats; + template + uint32_t optimize_beamwidth( + std::unique_ptr> &pFlashIndex, + T *tuning_sample, _u64 tuning_sample_num, _u64 tuning_sample_aligned_dim, + uint32_t L, uint32_t nthreads, uint32_t start_bw) { + uint32_t cur_bw = start_bw; + double max_qps = 0; + uint32_t best_bw = start_bw; + bool stop_flag = false; + + while (!stop_flag) { + std::vector tuning_sample_result_tags(tuning_sample_num, 0); + std::vector tuning_sample_result_dists(tuning_sample_num, 0); + diskann::QueryStats *stats = new diskann::QueryStats[tuning_sample_num]; + + auto s = std::chrono::high_resolution_clock::now(); +#pragma omp parallel for schedule(dynamic, 1) num_threads(nthreads) + for (_s64 i = 0; i < (int64_t) tuning_sample_num; i++) { + pFlashIndex->cached_beam_search( + tuning_sample + (i * tuning_sample_aligned_dim), 1, L, + tuning_sample_result_tags.data() + (i * 1), + tuning_sample_result_dists.data() + (i * 1), cur_bw, stats + i); } - return best_bw; + auto e = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = e - s; + double qps = + (1.0f * (float) tuning_sample_num) / (1.0f * (float) diff.count()); + + double lat_999 = diskann::get_percentile_stats( + stats, tuning_sample_num, 0.999f, + [](const diskann::QueryStats &stats) { return stats.total_us; }); + + double mean_latency = diskann::get_mean_stats( + stats, tuning_sample_num, + [](const diskann::QueryStats &stats) { return stats.total_us; }); + + if (qps > max_qps && lat_999 < (15000) + mean_latency * 2) { + max_qps = qps; + best_bw = cur_bw; + cur_bw = (uint32_t)(std::ceil)((float) cur_bw * 1.1f); + } else { + stop_flag = true; + } + if (cur_bw > 64) + stop_flag = true; + + delete[] stats; } + return best_bw; + } - template - void create_disk_layout(const std::string base_file, - const std::string mem_index_file, - const std::string output_file) { + // if single_index format is true, we assume that the entire mem index is in + // mem_index_file, and the entire disk index will be in output_file. + template + void create_disk_layout(const std::string &mem_index_file, + const std::string &base_file, + const std::string &tag_file, + const std::string &pq_pivots_file, + const std::string &pq_vectors_file, + bool single_file_index, + const std::string &output_file) { unsigned npts, ndims; // amount to read or write in one shot _u64 read_blk_size = 64 * 1024 * 1024; _u64 write_blk_size = read_blk_size; - cached_ifstream base_reader(base_file, read_blk_size); + cached_ifstream base_reader; + std::ifstream vamana_reader; + _u64 base_offset = 0, vamana_offset = 0, tags_offset = 0; + bool tags_enabled = false; + + if (single_file_index) { + _u64 nr, nc; + std::unique_ptr<_u64[]> offsets; + diskann::load_bin<_u64>(mem_index_file, offsets, nr, nc); + if (nr != Index::METADATA_ROWS && nc != 1) { + std::stringstream stream; + stream + << "Vamana Single Index file size does not meet meta-data criteria." + << std::endl; + + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + vamana_offset = offsets[0]; + base_offset = offsets[1]; + tags_offset = offsets[2]; + tags_enabled = tags_offset != offsets[3]; + vamana_reader.open(mem_index_file, std::ios::binary); + vamana_reader.seekg(vamana_offset, vamana_reader.beg); + base_reader.open(mem_index_file, read_blk_size, base_offset); + } else { + base_reader.open(base_file, read_blk_size); + vamana_reader.open(mem_index_file, std::ios::binary); + tags_enabled = tag_file != ""; + } + base_reader.read((char *) &npts, sizeof(uint32_t)); base_reader.read((char *) &ndims, sizeof(uint32_t)); @@ -502,33 +697,27 @@ namespace diskann { ndims_64 = ndims; // create cached reader + writer - size_t actual_file_size = get_file_size(mem_index_file); - cached_ifstream vamana_reader(mem_index_file, read_blk_size); - cached_ofstream diskann_writer(output_file, write_blk_size); + // size_t actual_file_size = get_file_size(mem_index_file); + std::remove(output_file.c_str()); + cached_ofstream diskann_writer; + diskann_writer.open(output_file, write_blk_size); // metadata: width, medoid unsigned width_u32, medoid_u32; size_t index_file_size; vamana_reader.read((char *) &index_file_size, sizeof(uint64_t)); - if (index_file_size != actual_file_size) { - std::stringstream stream; - stream << "Vamana Index file size does not match expected size per " - "meta-data." - << " file size from file: " << index_file_size - << " actual file size: " << actual_file_size << std::endl; - - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } + _u64 vamana_frozen_num = false, vamana_frozen_loc = 0; vamana_reader.read((char *) &width_u32, sizeof(unsigned)); vamana_reader.read((char *) &medoid_u32, sizeof(unsigned)); - + vamana_reader.read((char *) &vamana_frozen_num, sizeof(_u64)); // compute _u64 medoid, max_node_len, nnodes_per_sector; npts_64 = (_u64) npts; medoid = (_u64) medoid_u32; + if (vamana_frozen_num == 1) + vamana_frozen_loc = medoid; max_node_len = (((_u64) width_u32 + 1) * sizeof(unsigned)) + (ndims_64 * sizeof(T)); nnodes_per_sector = SECTOR_LEN / max_node_len; @@ -539,26 +728,31 @@ namespace diskann { << std::endl; // SECTOR_LEN buffer for each sector - std::unique_ptr sector_buf = - std::make_unique(SECTOR_LEN); - std::unique_ptr node_buf = - std::make_unique(max_node_len); + std::unique_ptr sector_buf = std::make_unique(SECTOR_LEN); + std::unique_ptr node_buf = std::make_unique(max_node_len); unsigned &nnbrs = *(unsigned *) (node_buf.get() + ndims_64 * sizeof(T)); unsigned *nhood_buf = (unsigned *) (node_buf.get() + (ndims_64 * sizeof(T)) + sizeof(unsigned)); // number of sectors (1 for meta data) - _u64 n_sectors = ROUND_UP(npts_64, nnodes_per_sector) / - nnodes_per_sector; + _u64 n_sectors = ROUND_UP(npts_64, nnodes_per_sector) / nnodes_per_sector; _u64 disk_index_file_size = (n_sectors + 1) * SECTOR_LEN; - // write first sector with metadata - *(_u64 *) (sector_buf.get() + 0 * sizeof(_u64)) = disk_index_file_size; - *(_u64 *) (sector_buf.get() + 1 * sizeof(_u64)) = npts_64; - *(_u64 *) (sector_buf.get() + 2 * sizeof(_u64)) = medoid; - *(_u64 *) (sector_buf.get() + 3 * sizeof(_u64)) = max_node_len; - *(_u64 *) (sector_buf.get() + 4 * sizeof(_u64)) = nnodes_per_sector; - diskann_writer.write(sector_buf.get(), SECTOR_LEN); + + std::vector<_u64> output_file_meta; + output_file_meta.push_back(npts_64); + output_file_meta.push_back(ndims_64); + output_file_meta.push_back(medoid); + output_file_meta.push_back(max_node_len); + output_file_meta.push_back(nnodes_per_sector); + output_file_meta.push_back(vamana_frozen_num); + output_file_meta.push_back(vamana_frozen_loc); + output_file_meta.push_back(disk_index_file_size); + + diskann_writer.write(sector_buf.get(), SECTOR_LEN); // write out the empty + // first sector, will + // be populated at the + // end. std::unique_ptr cur_node_coords = std::make_unique(ndims_64); diskann::cout << "# sectors: " << n_sectors << std::endl; @@ -576,24 +770,32 @@ namespace diskann { vamana_reader.read((char *) &nnbrs, sizeof(unsigned)); // sanity checks on nnbrs - assert(nnbrs > 0); - assert(nnbrs <= width_u32); + if (nnbrs == 0) { + diskann::cout << "ERROR. Found point with no out-neighbors; Point#: " + << cur_node_id << std::endl; + exit(-1); + } // read node's nhood - vamana_reader.read((char *) nhood_buf, nnbrs * sizeof(unsigned)); + vamana_reader.read((char *) nhood_buf, + (std::min)(nnbrs, width_u32) * sizeof(unsigned)); + if (nnbrs > width_u32) { + vamana_reader.seekg((nnbrs - width_u32) * sizeof(unsigned), + vamana_reader.cur); + } // write coords of node first // T *node_coords = data + ((_u64) ndims_64 * cur_node_id); - base_reader.read((char *) cur_node_coords.get(), sizeof(T) * - ndims_64); + base_reader.read((char *) cur_node_coords.get(), sizeof(T) * ndims_64); memcpy(node_buf.get(), cur_node_coords.get(), ndims_64 * sizeof(T)); // write nnbrs - *(unsigned *) (node_buf.get() + ndims_64 * sizeof(T)) = nnbrs; + *(unsigned *) (node_buf.get() + ndims_64 * sizeof(T)) = + (std::min)(nnbrs, width_u32); // write nhood next memcpy(node_buf.get() + ndims_64 * sizeof(T) + sizeof(unsigned), - nhood_buf, nnbrs * sizeof(unsigned)); + nhood_buf, (std::min)(nnbrs, width_u32) * sizeof(unsigned)); // get offset into sector_buf char *sector_node_buf = @@ -606,13 +808,93 @@ namespace diskann { // flush sector to disk diskann_writer.write(sector_buf.get(), SECTOR_LEN); } + diskann_writer.close(); + size_t tag_bytes_written = 0; + + // frozen point implies dynamic index which must have tags + if (vamana_frozen_num > 0) { + std::unique_ptr mem_index_tags; + size_t nr, nc; + if (single_file_index) + diskann::load_bin(mem_index_file, mem_index_tags, nr, nc, + tags_offset); + else + diskann::load_bin(tag_file, mem_index_tags, nr, nc, tags_offset); + + if (nr != npts_64 && nc != 1) { + std::stringstream stream; + stream << "Error loading tags file. File dims are " << nr << ", " << nc + << ", but expecting " << npts_64 + << " tags in 1 dimension (bin format)." << std::endl; + + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + + if (single_file_index) { + tag_bytes_written = diskann::save_bin( + output_file, mem_index_tags.get(), nr, nc, + output_file_meta[output_file_meta.size() - 1]); + } else { + diskann::save_bin(output_file + std::string(".tags"), + mem_index_tags.get(), nr, nc); + } + } else { + if (tags_enabled) { + std::unique_ptr mem_index_tags; + size_t nr, nc; + if (single_file_index) { + diskann::load_bin(mem_index_file, mem_index_tags, nr, nc, + tags_offset); + } else { + if (!file_exists(tag_file)) { + diskann::cout << "Static vamana index, tag file " << tag_file + << "does not exist. Exiting...." << std::endl; + exit(-1); + } + + diskann::load_bin(tag_file, mem_index_tags, nr, nc, + tags_offset); + } + + if (nr != npts_64 && nc != 1) { + std::stringstream stream; + stream << "Error loading tags file. File dims are " << nr << ", " + << nc << ", but expecting " << npts_64 + << " tags in 1 dimension (bin format)." << std::endl; + + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + + if (single_file_index) { + tag_bytes_written = diskann::save_bin( + output_file, mem_index_tags.get(), nr, nc, + output_file_meta[output_file_meta.size() - 1]); + } else { + diskann::save_bin(output_file + std::string(".tags"), + mem_index_tags.get(), nr, nc); + } + } + } + + output_file_meta.push_back(output_file_meta[output_file_meta.size() - 1] + + tag_bytes_written); + diskann::save_bin<_u64>(output_file, output_file_meta.data(), + output_file_meta.size(), 1, 0); + + if (single_file_index) { + add_new_file_to_single_index(output_file, pq_pivots_file); + add_new_file_to_single_index(output_file, pq_vectors_file); + } diskann::cout << "Output file written." << std::endl; } - template - bool build_disk_index(const char *dataFilePath, const char *indexFilePath, + template + bool build_disk_index(const char *dataPath, const char *indexFilePath, const char * indexBuildParameters, - diskann::Metric _compareMetric) { + diskann::Metric _compareMetric, bool single_file_index, + const char *tag_file) { std::stringstream parser; parser << std::string(indexBuildParameters); std::string cur_param; @@ -620,17 +902,19 @@ namespace diskann { while (parser >> cur_param) param_list.push_back(cur_param); - if (param_list.size() != 5) { + if (param_list.size() != 5 && param_list.size() != 6) { diskann::cout - << "Correct usage of parameters is R (max degree) " - "L (indexing list size, better if >= R) B (RAM limit of final " - "index in " - "GB) M (memory limit while indexing) T (number of threads for " - "indexing)" + << "Correct usage of parameters is: R (max degree)" + " L (indexing list size, should be >= R) " + " B (RAM limit of final index in GB) " + " M (memory limit while indexing in GB)" + " T (number of threads for indexing) " + " [C (compression ratio for PQ. Overrides parameter value B)] " << std::endl; return false; } + std::string dataFilePath(dataPath); std::string index_prefix_path(indexFilePath); std::string pq_pivots_path = index_prefix_path + "_pq_pivots.bin"; std::string pq_compressed_vectors_path = @@ -646,15 +930,15 @@ namespace diskann { double final_index_ram_limit = get_memory_budget(param_list[2]); if (final_index_ram_limit <= 0) { - std::cerr << "Insufficient memory budget (or string was not in right " - "format). Should be > 0." - << std::endl; + diskann::cerr << "Insufficient memory budget (or string was not in right " + "format). Should be > 0." + << std::endl; return false; } double indexing_ram_budget = (float) atof(param_list[3].c_str()); if (indexing_ram_budget <= 0) { - std::cerr << "Not building index. Please provide more RAM budget" - << std::endl; + diskann::cerr << "Not building index. Please provide more RAM budget" + << std::endl; return false; } _u32 num_threads = (_u32) atoi(param_list[4].c_str()); @@ -666,80 +950,160 @@ namespace diskann { diskann::cout << "Starting index build: R=" << R << " L=" << L << " Query RAM budget: " << final_index_ram_limit - << " Indexing ram budget: " << indexing_ram_budget - << " T: " << num_threads << std::endl; + << " Indexing RAM budget: " << indexing_ram_budget + << " T: " << num_threads << " Final index will be in " + << (single_file_index ? "single file" : "multiple files") + << std::endl; + + std::string normalized_file_path = dataFilePath; + if (_compareMetric == diskann::Metric::COSINE) { + if (std::is_floating_point::value) { + diskann::cout << "Cosine metric chosen. Normalizing vectors and " + "changing distance to L2 to boost accuracy." + << std::endl; + + normalized_file_path = + std::string(indexFilePath) + "_data.normalized.bin"; + normalize_data_file(dataFilePath, normalized_file_path); + _compareMetric = diskann::Metric::L2; + } else { + diskann::cerr << "WARNING: Cannot normalize integral data types." + << " Using cosine distance with integer data types may " + "result in poor recall." + << " Consider using L2 distance with integral data types." + << std::endl; + } + } auto s = std::chrono::high_resolution_clock::now(); size_t points_num, dim; - diskann::get_bin_metadata(dataFilePath, points_num, dim); + diskann::get_bin_metadata(normalized_file_path, points_num, dim); + auto training_set_size = + PQ_TRAINING_SET_FRACTION * points_num > MAX_PQ_TRAINING_SET_SIZE + ? MAX_PQ_TRAINING_SET_SIZE + : (_u32) std::round(PQ_TRAINING_SET_FRACTION * points_num); + training_set_size = (training_set_size == 0) ? 1 : training_set_size; + diskann::cout << "(Normalized, if required) file : " << normalized_file_path + << " has: " << points_num + << " points. Changing training set size to " + << training_set_size << " points" << std::endl; size_t num_pq_chunks = - (size_t)(std::floor)(_u64(final_index_ram_limit / points_num)); - - num_pq_chunks = num_pq_chunks <= 0 ? 1 : num_pq_chunks; - num_pq_chunks = num_pq_chunks > dim ? dim : num_pq_chunks; - num_pq_chunks = - num_pq_chunks > MAX_PQ_CHUNKS ? MAX_PQ_CHUNKS : num_pq_chunks; - - diskann::cout << "Compressing " << dim << "-dimensional data into " - << num_pq_chunks << " bytes per vector." << std::endl; + calculate_num_pq_chunks(final_index_ram_limit, points_num, dim); size_t train_size, train_dim; float *train_data; - double p_val = ((double) TRAINING_SET_SIZE / (double) points_num); - // generates random sample and sets it to train_data and updates - // train_size - gen_random_slice(dataFilePath, p_val, train_data, train_size, - train_dim); - - diskann::cout << "Training data loaded of size " << train_size << - std::endl; + auto start = std::chrono::high_resolution_clock::now(); + double p_val = ((double) training_set_size / (double) points_num); + // generates random sample and sets it to train_data and updates train_size + gen_random_slice(normalized_file_path, p_val, train_data, train_size, + train_dim); + diskann::cout << "Generating PQ pivots with training data of size: " + << train_size << " num PQ chunks: " << num_pq_chunks + << std::endl; generate_pq_pivots(train_data, train_size, (uint32_t) dim, 256, - (uint32_t) num_pq_chunks, 15, pq_pivots_path); - generate_pq_data_from_pivots(dataFilePath, 256, (uint32_t) - num_pq_chunks, - pq_pivots_path, - pq_compressed_vectors_path); + (uint32_t) num_pq_chunks, NUM_KMEANS, pq_pivots_path); + auto end = std::chrono::high_resolution_clock::now(); + diskann::cout << "Pivots generated in " + << std::chrono::duration(end - start).count() << "s." + << std::endl; + start = std::chrono::high_resolution_clock::now(); + generate_pq_data_from_pivots(normalized_file_path, 256, + (uint32_t) num_pq_chunks, pq_pivots_path, + pq_compressed_vectors_path); delete[] train_data; - train_data = nullptr; - + end = std::chrono::high_resolution_clock::now(); + diskann::cout << "Compressed data generated and written in: " + << std::chrono::duration(end - start).count() << "s." + << std::endl; + start = std::chrono::high_resolution_clock::now(); diskann::build_merged_vamana_index( - dataFilePath, _compareMetric, L, R, p_val, indexing_ram_budget, - mem_index_path, medoids_path, centroids_path); - - diskann::create_disk_layout(dataFilePath, mem_index_path, - disk_index_path); + normalized_file_path, _compareMetric, single_file_index, L, R, p_val, + indexing_ram_budget, mem_index_path, medoids_path, centroids_path, + tag_file); + end = std::chrono::high_resolution_clock::now(); + diskann::cout << "Vamana index built in: " + << std::chrono::duration(end - start).count() << "s." + << std::endl; - double sample_sampling_rate = (150000.0 / points_num); - gen_random_slice(dataFilePath, sample_base_prefix, - sample_sampling_rate); + if (tag_file == nullptr) { + diskann::create_disk_layout( + mem_index_path, normalized_file_path, "", pq_pivots_path, + pq_compressed_vectors_path, single_file_index, disk_index_path); + } else { + std::string tag_filename = std::string(tag_file); + diskann::create_disk_layout( + mem_index_path, normalized_file_path, tag_filename, pq_pivots_path, + pq_compressed_vectors_path, single_file_index, disk_index_path); + } + double ten_percent_points = std::ceil(points_num * 0.1); + double num_sample_points = ten_percent_points > MAX_SAMPLE_POINTS_FOR_WARMUP + ? MAX_SAMPLE_POINTS_FOR_WARMUP + : ten_percent_points; + double sample_sampling_rate = num_sample_points / points_num; + diskann::cout << "Generating warmup file with " << num_sample_points + << " points using a sampling rate of: " + << sample_sampling_rate << std::endl; + gen_random_slice(normalized_file_path, sample_base_prefix, + sample_sampling_rate); + + diskann::cout << "Deleting memory index file: " << mem_index_path + << std::endl; std::remove(mem_index_path.c_str()); + // TODO: This is poor design. The decision to add the ".data" prefix + // is taken by build_vamana_index. So, we shouldn't repeate it here. + // Checking to see if we can merge the data and index into one file. + std::remove((mem_index_path + ".data").c_str()); + if (normalized_file_path != dataFilePath) { + // then we created a normalized vector file. Delete it. + diskann::cout << "Deleting normalized vector file: " + << normalized_file_path << std::endl; + std::remove(normalized_file_path.c_str()); + } - auto e = - std::chrono::high_resolution_clock::now(); + auto e = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = e - s; diskann::cout << "Indexing time: " << diff.count() << std::endl; - return true; } - template DISKANN_DLLEXPORT void create_disk_layout( - const std::string base_file, const std::string mem_index_file, - const std::string output_file); - - template DISKANN_DLLEXPORT void create_disk_layout( - const std::string base_file, const std::string mem_index_file, - const std::string output_file); - template DISKANN_DLLEXPORT void create_disk_layout( - const std::string base_file, const std::string mem_index_file, - const std::string output_file); + template DISKANN_DLLEXPORT void create_disk_layout( + const std::string &mem_index_file, const std::string &base_file, + const std::string &tag_file, const std::string &pq_pivots_file, + const std::string &pq_compressed_vectors_file, bool single_file_index, + const std::string &output_file); + template DISKANN_DLLEXPORT void create_disk_layout( + const std::string &mem_index_file, const std::string &base_file, + const std::string &tag_file, const std::string &pq_pivots_file, + const std::string &pq_compressed_vectors_file, bool single_file_index, + const std::string &output_file); + template DISKANN_DLLEXPORT void create_disk_layout( + const std::string &mem_index_file, const std::string &base_file, + const std::string &tag_file, const std::string &pq_pivots_file, + const std::string &pq_compressed_vectors_file, bool single_file_index, + const std::string &output_file); + template DISKANN_DLLEXPORT void create_disk_layout( + const std::string &mem_index_file, const std::string &base_file, + const std::string &tag_file, const std::string &pq_pivots_file, + const std::string &pq_compressed_vectors_file, bool single_file_index, + const std::string &output_file); + template DISKANN_DLLEXPORT void create_disk_layout( + const std::string &mem_index_file, const std::string &base_file, + const std::string &tag_file, const std::string &pq_pivots_file, + const std::string &pq_compressed_vectors_file, bool single_file_index, + const std::string &output_file); + template DISKANN_DLLEXPORT void create_disk_layout( + const std::string &mem_index_file, const std::string &base_file, + const std::string &tag_file, const std::string &pq_pivots_file, + const std::string &pq_compressed_vectors_file, bool single_file_index, + const std::string &output_file); template DISKANN_DLLEXPORT int8_t *load_warmup( const std::string &cache_warmup_file, uint64_t &warmup_num, @@ -763,45 +1127,76 @@ namespace diskann { uint64_t &warmup_num, uint64_t warmup_dim, uint64_t warmup_aligned_dim); #endif - template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( - std::unique_ptr> &pFlashIndex, + template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( + std::unique_ptr> &pFlashIndex, int8_t *tuning_sample, _u64 tuning_sample_num, _u64 tuning_sample_aligned_dim, uint32_t L, uint32_t nthreads, uint32_t start_bw); - template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( - std::unique_ptr> &pFlashIndex, + template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( + std::unique_ptr> &pFlashIndex, uint8_t *tuning_sample, _u64 tuning_sample_num, _u64 tuning_sample_aligned_dim, uint32_t L, uint32_t nthreads, uint32_t start_bw); - template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( - std::unique_ptr> &pFlashIndex, + template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( + std::unique_ptr> &pFlashIndex, float *tuning_sample, _u64 tuning_sample_num, _u64 tuning_sample_aligned_dim, uint32_t L, uint32_t nthreads, uint32_t start_bw); - template DISKANN_DLLEXPORT bool build_disk_index( + template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( + std::unique_ptr> &pFlashIndex, + int8_t *tuning_sample, _u64 tuning_sample_num, + _u64 tuning_sample_aligned_dim, uint32_t L, uint32_t nthreads, + uint32_t start_bw); + template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( + std::unique_ptr> &pFlashIndex, + uint8_t *tuning_sample, _u64 tuning_sample_num, + _u64 tuning_sample_aligned_dim, uint32_t L, uint32_t nthreads, + uint32_t start_bw); + template DISKANN_DLLEXPORT uint32_t optimize_beamwidth( + std::unique_ptr> &pFlashIndex, + float *tuning_sample, _u64 tuning_sample_num, + _u64 tuning_sample_aligned_dim, uint32_t L, uint32_t nthreads, + uint32_t start_bw); + + template DISKANN_DLLEXPORT bool build_disk_index( + const char *dataFilePath, const char *indexFilePath, + const char *indexBuildParameters, diskann::Metric _compareMetric, + bool singleFileIndex, const char *tag_file); + template DISKANN_DLLEXPORT bool build_disk_index( + const char *dataFilePath, const char *indexFilePath, + const char *indexBuildParameters, diskann::Metric _compareMetric, + bool singleFileIndex, const char *tag_file); + template DISKANN_DLLEXPORT bool build_disk_index( + const char *dataFilePath, const char *indexFilePath, + const char *indexBuildParameters, diskann::Metric _compareMetric, + bool singleFileIndex, const char *tag_file); + template DISKANN_DLLEXPORT bool build_disk_index( const char *dataFilePath, const char *indexFilePath, - const char *indexBuildParameters, diskann::Metric _compareMetric); - template DISKANN_DLLEXPORT bool build_disk_index( + const char *indexBuildParameters, diskann::Metric _compareMetric, + bool singleFileIndex, const char *tag_file); + template DISKANN_DLLEXPORT bool build_disk_index( const char *dataFilePath, const char *indexFilePath, - const char *indexBuildParameters, diskann::Metric _compareMetric); - template DISKANN_DLLEXPORT bool build_disk_index( + const char *indexBuildParameters, diskann::Metric _compareMetric, + bool singleFileIndex, const char *tag_file); + template DISKANN_DLLEXPORT bool build_disk_index( const char *dataFilePath, const char *indexFilePath, - const char *indexBuildParameters, diskann::Metric _compareMetric); + const char *indexBuildParameters, diskann::Metric _compareMetric, + bool singleFileIndex, const char *tag_file); template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric _compareMetric, unsigned L, - unsigned R, double sampling_rate, double ram_budget, - std::string mem_index_path, std::string medoids_path, - std::string centroids_file); + std::string base_file, diskann::Metric _compareMetric, + bool single_file_index, unsigned L, unsigned R, double sampling_rate, + double ram_budget, std::string mem_index_path, std::string medoids_path, + std::string centroids_file, const char *tag_file); template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric _compareMetric, unsigned L, - unsigned R, double sampling_rate, double ram_budget, - std::string mem_index_path, std::string medoids_path, - std::string centroids_file); + std::string base_file, diskann::Metric _compareMetric, + bool single_file_index, unsigned L, unsigned R, double sampling_rate, + double ram_budget, std::string mem_index_path, std::string medoids_path, + std::string centroids_file, const char *tag_file); template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric _compareMetric, unsigned L, - unsigned R, double sampling_rate, double ram_budget, - std::string mem_index_path, std::string medoids_path, - std::string centroids_file); + std::string base_file, diskann::Metric _compareMetric, + bool single_file_index, unsigned L, unsigned R, double sampling_rate, + double ram_budget, std::string mem_index_path, std::string medoids_path, + std::string centroids_file, const char *tag_file); }; // namespace diskann diff --git a/src/convert/convert.cpp b/src/convert/convert.cpp new file mode 100644 index 0000000000..1d445d1b2c --- /dev/null +++ b/src/convert/convert.cpp @@ -0,0 +1,72 @@ +// convert.cpp : This file contains the 'main' function. Program execution +// begins and ends there. +// + +#include +#include "util.h" + +template +int aux_main(int argc, char** argv) { + source_type* sourceVec = nullptr; + size_t num_points, num_dims; + diskann::cout << "Loading source vector from file " << argv[2] << std::endl; + diskann::load_bin(argv[2], sourceVec, num_points, num_dims); + + dest_type* destVec = new dest_type[num_points * num_dims]; + diskann::convert_types(sourceVec, destVec, num_points, + num_dims); + diskann::cout << "Converted vector from type " << argv[1] << "to type " << argv[3] + << std::endl; + diskann::save_bin(argv[4], destVec, num_points, num_dims); + diskann::cout << "Saved converted vector to file " << argv[4] << std::endl; + return 0; +} + +int main(int argc, char** argv) { + if (argc < 5) { + diskann::cout + << "Usage: convert " + "where type is one of [float/uint8/int8], case-sensitive. " + << std::endl; + } + + std::string sourceType(argv[1]); + std::string destType(argv[3]); + + if (sourceType == destType) { + diskann::cout << "Nothing to do. source and destination types are the same." + << std::endl; + return 0; + } + + if (sourceType == "int8" && destType == "uint8") { + return aux_main(argc, argv); + } else if (sourceType == "int8" && destType == "float") { + return aux_main(argc, argv); + } else if (sourceType == "uint8" && destType == "int8") { + return aux_main(argc, argv); + } else if (sourceType == "uint8" && destType == "float") { + return aux_main(argc, argv); + } else if (sourceType == "float" && destType == "int8") { + return aux_main(argc, argv); + } else if (sourceType == "float" && destType == "uint8") { + return aux_main(argc, argv); + } else { + diskann::cout << "One of the source or destination types is unknown: " + << argv[0] << "," << argv[2] << std::endl; + return 0; + } +} + +// Run program: Ctrl + F5 or Debug > Start Without Debugging menu +// Debug program: F5 or Debug > Start Debugging menu + +// Tips for Getting Started: +// 1. Use the Solution Explorer window to add/manage files +// 2. Use the Team Explorer window to connect to source control +// 3. Use the Output window to see build output and other messages +// 4. Use the Error List window to view errors +// 5. Go to Project > Add New Item to create new code files, or Project > Add +// Existing Item to add existing code files to the project +// 6. In the future, to open this project again, go to File > Open > Project +// and select the .sln file diff --git a/src/distance.cpp b/src/distance.cpp new file mode 100644 index 0000000000..cc8ec79ab6 --- /dev/null +++ b/src/distance.cpp @@ -0,0 +1,233 @@ +#ifdef _WINDOWS +#include +#include +#include +#include +#else +#include +#endif + +#include "simd_utils.h" +#include +#include + +#include "distance.h" + +namespace diskann { + + // Cosine similarity. + float DistanceCosineInt8::compare(const int8_t *a, const int8_t *b, + uint32_t length) const { +#ifdef _WINDOWS + return diskann::CosineSimilarity2(a, b, length); +#else + return diskann::compute_cosine_similarity(a, b, length); +#endif + } + + float DistanceCosineFloat::compare(const float *a, const float *b, + uint32_t length) const { +#ifdef _WINDOWS + return diskann::CosineSimilarity2(a, b, length); +#else + return diskann::compute_cosine_similarity(a, b, length); +#endif + } + + float SlowDistanceCosineUInt8::compare(const uint8_t *a, const uint8_t *b, + uint32_t length) const { + int magA = 0, magB = 0, scalarProduct = 0; + for (uint32_t i = 0; i < length; i++) { + magA += ((uint32_t) a[i]) * ((uint32_t) a[i]); + magB += ((uint32_t) b[i]) * ((uint32_t) b[i]); + scalarProduct += ((uint32_t) a[i]) * ((uint32_t) b[i]); + } + // similarity == 1-cosine distance + return 1.0f - (float) (scalarProduct / (sqrt(magA) * sqrt(magB))); + } + + // L2 distance functions. + float DistanceL2Int8::compare(const int8_t *a, const int8_t *b, + uint32_t size) const { + int32_t result = 0; + +#ifdef _WINDOWS +#ifdef USE_AVX2 + __m256 r = _mm256_setzero_ps(); + char * pX = (char *) a, *pY = (char *) b; + while (size >= 32) { + __m256i r1 = _mm256_subs_epi8(_mm256_loadu_si256((__m256i *) pX), + _mm256_loadu_si256((__m256i *) pY)); + r = _mm256_add_ps(r, _mm256_mul_epi8(r1, r1)); + pX += 32; + pY += 32; + size -= 32; + } + while (size > 0) { + __m128i r2 = _mm_subs_epi8(_mm_loadu_si128((__m128i *) pX), + _mm_loadu_si128((__m128i *) pY)); + r = _mm256_add_ps(r, _mm256_mul32_pi8(r2, r2)); + pX += 4; + pY += 4; + size -= 4; + } + r = _mm256_hadd_ps(_mm256_hadd_ps(r, r), r); + return r.m256_f32[0] + r.m256_f32[4]; +#else +#pragma omp simd reduction(+ : result) aligned(a, b : 8) + for (_s32 i = 0; i < (_s32) size; i++) { + result += ((int32_t)((int16_t) a[i] - (int16_t) b[i])) * + ((int32_t)((int16_t) a[i] - (int16_t) b[i])); + } + return (float) result; +#endif +#else +#pragma omp simd reduction(+ : result) aligned(a, b : 8) + for (int32_t i = 0; i < (int32_t) size; i++) { + result += ((int32_t)((int16_t) a[i] - (int16_t) b[i])) * + ((int32_t)((int16_t) a[i] - (int16_t) b[i])); + } + return (float) result; +#endif + } + + float DistanceL2UInt8::compare(const uint8_t *a, const uint8_t *b, + uint32_t size) const { + uint32_t result = 0; +#ifndef _WINDOWS +#pragma omp simd reduction(+ : result) aligned(a, b : 8) +#endif + for (int32_t i = 0; i < (int32_t) size; i++) { + result += ((int32_t)((int16_t) a[i] - (int16_t) b[i])) * + ((int32_t)((int16_t) a[i] - (int16_t) b[i])); + } + return (float) result; + } + +#ifndef _WINDOWS + float DistanceL2::compare(const float *a, const float *b, + uint32_t size) const { + a = (const float *) __builtin_assume_aligned(a, 32); + b = (const float *) __builtin_assume_aligned(b, 32); +#else + float DistanceL2::compare(const float *a, const float *b, + uint32_t size) const { +#endif + + float result = 0; +#ifdef USE_AVX2 + // assume size is divisible by 8 + uint16_t niters = (uint16_t)(size / 8); + __m256 sum = _mm256_setzero_ps(); + for (uint16_t j = 0; j < niters; j++) { + // scope is a[8j:8j+7], b[8j:8j+7] + // load a_vec + if (j < (niters - 1)) { + _mm_prefetch((char *) (a + 8 * (j + 1)), _MM_HINT_T0); + _mm_prefetch((char *) (b + 8 * (j + 1)), _MM_HINT_T0); + } + __m256 a_vec = _mm256_load_ps(a + 8 * j); + // load b_vec + __m256 b_vec = _mm256_load_ps(b + 8 * j); + // a_vec - b_vec + __m256 tmp_vec = _mm256_sub_ps(a_vec, b_vec); + /* + // (a_vec - b_vec)**2 + __m256 tmp_vec2 = _mm256_mul_ps(tmp_vec, tmp_vec); + // accumulate sum + sum = _mm256_add_ps(sum, tmp_vec2); + */ + // sum = (tmp_vec**2) + sum + sum = _mm256_fmadd_ps(tmp_vec, tmp_vec, sum); + } + + // horizontal add sum + result = _mm256_reduce_add_ps(sum); +#else +#ifndef _WINDOWS +#pragma omp simd reduction(+ : result) aligned(a, b : 32) +#endif + for (_s32 i = 0; i < (_s32) size; i++) { + result += (a[i] - b[i]) * (a[i] - b[i]); + } +#endif + return result; + } + + float SlowDistanceL2Float::compare(const float *a, const float *b, + uint32_t length) const { + float result = 0.0f; + for (uint32_t i = 0; i < length; i++) { + result += (a[i] - b[i]) * (a[i] - b[i]); + } + return result; + } + +#ifdef _WINDOWS + float AVXDistanceL2Int8::compare(const int8_t *a, const int8_t *b, + uint32_t length) const { + __m128 r = _mm_setzero_ps(); + __m128i r1; + while (length >= 16) { + r1 = _mm_subs_epi8(_mm_load_si128((__m128i *) a), + _mm_load_si128((__m128i *) b)); + r = _mm_add_ps(r, _mm_mul_epi8(r1)); + a += 16; + b += 16; + length -= 16; + } + r = _mm_hadd_ps(_mm_hadd_ps(r, r), r); + float res = r.m128_f32[0]; + + if (length >= 8) { + __m128 r2 = _mm_setzero_ps(); + __m128i r3 = _mm_subs_epi8(_mm_load_si128((__m128i *) (a - 8)), + _mm_load_si128((__m128i *) (b - 8))); + r2 = _mm_add_ps(r2, _mm_mulhi_epi8(r3)); + a += 8; + b += 8; + length -= 8; + r2 = _mm_hadd_ps(_mm_hadd_ps(r2, r2), r2); + res += r2.m128_f32[0]; + } + + if (length >= 4) { + __m128 r2 = _mm_setzero_ps(); + __m128i r3 = _mm_subs_epi8(_mm_load_si128((__m128i *) (a - 12)), + _mm_load_si128((__m128i *) (b - 12))); + r2 = _mm_add_ps(r2, _mm_mulhi_epi8_shift32(r3)); + res += r2.m128_f32[0] + r2.m128_f32[1]; + } + + return res; + } + + float AVXDistanceL2Float::compare(const float *a, const float *b, + uint32_t length) const { + __m128 diff, v1, v2; + __m128 sum = _mm_set1_ps(0); + + while (length >= 4) { + v1 = _mm_loadu_ps(a); + a += 4; + v2 = _mm_loadu_ps(b); + b += 4; + diff = _mm_sub_ps(v1, v2); + sum = _mm_add_ps(sum, _mm_mul_ps(diff, diff)); + length -= 4; + } + + return sum.m128_f32[0] + sum.m128_f32[1] + sum.m128_f32[2] + + sum.m128_f32[3]; + } +#else + float AVXDistanceL2Int8::compare(const int8_t *, const int8_t *, + uint32_t) const { + return 0; + } + float AVXDistanceL2Float::compare(const float *, const float *, + uint32_t) const { + return 0; + } +#endif +} // namespace diskann diff --git a/src/dll/CMakeLists.txt b/src/dll/CMakeLists.txt index 75ee6ea7fa..d76bee441e 100644 --- a/src/dll/CMakeLists.txt +++ b/src/dll/CMakeLists.txt @@ -1,8 +1,11 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT license. -add_library(diskann_dll SHARED dllmain.cpp ../partition_and_pq.cpp ../pq_flash_index.cpp ../logger.cpp ../utils.cpp - ../windows_aligned_file_reader.cpp ../memory_mapper.cpp ../index.cpp ../math_utils.cpp ../aux_utils.cpp ../ann_exception.cpp) +add_library(diskann_dll SHARED dllmain.cpp + diskann_interface.cpp diskann_incr_index.cpp ../partition_and_pq.cpp ../pq_flash_index.cpp + ../windows_aligned_file_reader.cpp bing_aligned_file_reader.cpp ../logger.cpp ../utils.cpp + ../memory_mapper.cpp ../distance.cpp ../index.cpp ../math_utils.cpp ../aux_utils.cpp ../v2/graph_delta.cpp + ../v2/index_merger.cpp ../v2/merge_insert.cpp ../ann_exception.cpp ) if (MSVC) add_definitions(-D_USRDLL -D_WINDLL -DDISKANN_DLL) add_compile_options(/MD) @@ -11,8 +14,8 @@ if (MSVC) target_link_options(diskann_dll PRIVATE $<$:/IMPLIB:${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib> $<$:/IMPLIB:${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib> ) - target_link_libraries(diskann_dll debug ${PROJECT_SOURCE_DIR}/dependencies/windows/tcmalloc/libtcmalloc_minimal.lib) - target_link_libraries(diskann_dll optimized ${PROJECT_SOURCE_DIR}/dependencies/windows/tcmalloc/libtcmalloc_minimal.lib) + target_link_libraries(diskann_dll debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskpriority_io.lib ${PROJECT_SOURCE_DIR}/dependencies/windows/tcmalloc/libtcmalloc_minimal.lib) + target_link_libraries(diskann_dll optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskpriority_io.lib ${PROJECT_SOURCE_DIR}/dependencies/windows/tcmalloc/libtcmalloc_minimal.lib) add_custom_command(TARGET @@ -47,10 +50,36 @@ if (MSVC) diskann_dll POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${INTEL_ROOT}redist/intel64/mkl/mkl_rt.dll "$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}\">$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}\">" ) + add_custom_command(TARGET + diskann_dll + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/dependencies/windows/dll/boost_date_time-vc141-mt-x64-1_70.dll "$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}\">$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}\">" ) + add_custom_command(TARGET + diskann_dll + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/dependencies/windows/dll/cpprest_2_10.dll "$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}\">$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}\">" ) + add_custom_command(TARGET + diskann_dll + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/dependencies/windows/dll/LIBEAY32.dll "$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}\">$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}\">" ) + add_custom_command(TARGET + diskann_dll + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/dependencies/windows/dll/SSLEAY32.dll "$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}\">$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}\">" ) + add_custom_command(TARGET + diskann_dll + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/dependencies/windows/dll/zlib1.dll "$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}\">$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}\">" ) + add_custom_command(TARGET diskann_dll POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/dependencies/windows/tcmalloc/libtcmalloc_minimal.dll "$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}\">$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}\">" ) + add_custom_command(TARGET + diskann_dll + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/config/SharedFileStoreTemplate.ini "$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}\">$<$:\"${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}\">" ) + endif() diff --git a/src/index.cpp b/src/index.cpp index 2405878669..3dc9b9267a 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2,6 +2,7 @@ // Licensed under the MIT license. #include +#include #include #include #include @@ -14,12 +15,17 @@ #include #include #include +#include +#include #include #include #include +#include #include #include #include "tsl/robin_set.h" +#include "tsl/robin_map.h" +#include #include #include @@ -35,318 +41,510 @@ #include "timer.h" #include "utils.h" #include "windows_customizations.h" +#include "ann_exception.h" +#include "tcmalloc/malloc_extension.h" #ifdef _WINDOWS #include #endif +#include "Neighbor_Tag.h" // only L2 implemented. Need to implement inner product search -namespace { - template - diskann::Distance *get_distance_function(diskann::Metric m); - - template<> - diskann::Distance *get_distance_function(diskann::Metric m) { - if (m == diskann::Metric::FAST_L2) { - std::cout << "Here" << std::endl; - return new diskann::DistanceFastL2(); - } else if (m == diskann::Metric::L2) { - if (Avx2SupportedCPU) { - std::cout << "Using AVX2 distance computation" << std::endl; - return new diskann::DistanceL2(); - } else if (AvxSupportedCPU) { - std::cout << "AVX2 not supported. Using AVX distance computation" - << std::endl; - return new diskann::AVXDistanceL2Float(); - } else { - std::cout << "Older CPU. Using slow distance computation" << std::endl; - return new diskann::SlowDistanceL2Float(); - } - } else { - std::stringstream stream; - stream << "Only L2 metric supported as of now. Email " - "gopalsr@microsoft.com if you need cosine similarity or inner " - "product." - << std::endl; - std::cerr << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } - } - - template<> - diskann::Distance *get_distance_function(diskann::Metric m) { - if (m == diskann::Metric::L2) { - if (Avx2SupportedCPU) { - std::cout << "Using AVX2 distance computation" << std::endl; - return new diskann::DistanceL2Int8(); - } else if (AvxSupportedCPU) { - std::cout << "AVX2 not supported. Using AVX distance computation" - << std::endl; - return new diskann::AVXDistanceL2Int8(); - } else { - std::cout << "Older CPU. Using slow distance computation" << std::endl; - return new diskann::SlowDistanceL2Int(); - } - } else { - std::stringstream stream; - stream << "Only L2 metric supported as of now. Email " - "gopalsr@microsoft.com if you need cosine similarity or inner " - "product." - << std::endl; - std::cerr << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } - } - - template<> - diskann::Distance *get_distance_function(diskann::Metric m) { - if (m == diskann::Metric::L2) { - std::cout << "AVX/AVX2 distance function not defined for Uint8. Using " - "slow version. " - "Contact gopalsr@microsoft.com if you need AVX/AVX2 support." - << std::endl; - return new diskann::DistanceL2UInt8(); - } else { - std::stringstream stream; - stream << "Only L2 metric supported as of now. Email " - "gopalsr@microsoft.com if you need cosine similarity or inner " - "product." - << std::endl; - std::cerr << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } - } -} // namespace namespace diskann { - // Initialize an index with metric m, load the data of type T with filename // (bin), and initialize max_points template - Index::Index(Metric m, const char *filename, const size_t max_points, - const size_t nd, const size_t num_frozen_pts, - const bool enable_tags, const bool store_data, - const bool support_eager_delete) - : _num_frozen_pts(num_frozen_pts), _has_built(false), _width(0), - _can_delete(false), _eager_done(true), _lazy_done(true), - _compacted_order(true), _enable_tags(enable_tags), - _consolidated_order(true), _support_eager_delete(support_eager_delete), - _store_data(store_data) { + + Index::Index(Metric m, const size_t dim, const size_t max_points, + const bool dynamic_index, + const bool save_index_in_one_file, + const bool enable_tags, const bool support_eager_delete) + : _dist_metric(m), _dim(dim), _max_points(max_points), + _save_as_one_file(save_index_in_one_file), + _dynamic_index(dynamic_index), _enable_tags(enable_tags), + _support_eager_delete(support_eager_delete) { + if (dynamic_index && !enable_tags) { + throw diskann::ANNException( + "ERROR: Eager Deletes must have Dynamic Indexing enabled.", -1, + __FUNCSIG__, __FILE__, __LINE__); + diskann::cerr + << "WARNING: Dynamic Indices must have tags enabled. Auto-enabling." + << std::endl; + _enable_tags = true; + } + if (support_eager_delete && !dynamic_index) { + diskann::cout << "ERROR: Eager Deletes must have Dynamic Indexing " + "enabled. Exitting." + << std::endl; + exit(-1); + } // data is stored to _nd * aligned_dim matrix with necessary // zero-padding - diskann::cout << "Number of frozen points = " << _num_frozen_pts - << std::endl; - load_aligned_bin(std::string(filename), _data, _nd, _dim, _aligned_dim); + _aligned_dim = ROUND_UP(_dim, 8); - if (nd > 0) { - if (_nd >= nd) - _nd = nd; // Consider the first _nd points and ignore the rest. - else { - std::stringstream stream; - stream << "ERROR: Driver requests loading " << _nd << " points," - << "but file has fewer (" << nd << ") points" << std::endl; - diskann::cerr << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } - } + if (dynamic_index) + _num_frozen_pts = 1; - _max_points = (max_points > 0) ? max_points : _nd; - if (_max_points < _nd) { - std::stringstream stream; - stream << "ERROR: max_points must be >= data size; max_points: " - << _max_points << " n: " << _nd << std::endl; - diskann::cerr << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); - } + alloc_aligned(((void **) &_data), + (_max_points + _num_frozen_pts) * _aligned_dim * sizeof(T), + 8 * sizeof(T)); + std::memset(_data, 0, + (_max_points + _num_frozen_pts) * _aligned_dim * sizeof(T)); - // Allocate space for max points and frozen points, - // and add frozen points at the end of the array - if (_num_frozen_pts > 0) { - auto temp = _data; - _data = (T *) realloc( - _data, (_max_points + _num_frozen_pts) * _aligned_dim * sizeof(T)); - if (_data == nullptr) { - free(temp); - diskann::cout << "Realloc failed, killing programme" << std::endl; - throw diskann::ANNException("Realloc failed", -1, __FUNCSIG__, __FILE__, - __LINE__); - } + _ep = (unsigned) _max_points; + + _final_graph.reserve(_max_points + _num_frozen_pts); + _final_graph.resize(_max_points + _num_frozen_pts); + + for (size_t i = 0; i < _max_points + _num_frozen_pts; i++) + _final_graph[i].clear(); + + if (_support_eager_delete) { + _in_graph.reserve(_max_points + _num_frozen_pts); + _in_graph.resize(_max_points + _num_frozen_pts); } - this->_distance = ::get_distance_function(m); + diskann::cout << "Getting distance function for metric: " + << (m == diskann::Metric::COSINE ? "cosine" : "l2") + << std::endl; + this->_distance = get_distance_function(m); _locks = std::vector(_max_points + _num_frozen_pts); + if (_support_eager_delete) + _locks_in = std::vector(_max_points + _num_frozen_pts); + _width = 0; } - template<> - Index::~Index() { + template + Index::~Index() { delete this->_distance; aligned_free(_data); } - template<> - Index<_s8>::~Index() { - delete this->_distance; - aligned_free(_data); + template + void Index::clear_index() { + memset(_data, 0, + _aligned_dim * (_max_points + _num_frozen_pts) * sizeof(T)); + _nd = 0; + for (size_t i = 0; i < _final_graph.size(); i++) + _final_graph[i].clear(); + + _tag_to_location.clear(); + _location_to_tag.clear(); + + _delete_set.clear(); + _empty_slots.clear(); } - template<> - Index<_u8>::~Index() { - delete this->_distance; - aligned_free(_data); + template + _u64 Index::save_tags(std::string tags_file, size_t offset) { + if (!_enable_tags) { + diskann::cout << "Not saving tags as they are not enabled." << std::endl; + return 0; + } + size_t tag_bytes_written; + TagT * tag_data = new TagT[_nd + _num_frozen_pts]; + for (_u32 i = 0; i < _nd; i++) { + if (_location_to_tag.find(i) != _location_to_tag.end()) { + tag_data[i] = _location_to_tag[i]; + } else { + // catering to future when tagT can be any type. + std::memset((char *) &tag_data[i], 0, sizeof(TagT)); + } + } + if (_num_frozen_pts > 0) { + std::memset((char *) &tag_data[_ep], 0, sizeof(TagT)); + } + tag_bytes_written = + save_bin(tags_file, tag_data, _nd + _num_frozen_pts, 1, offset); + delete[] tag_data; + return tag_bytes_written; + } + + template + _u64 Index::save_data(std::string data_file, size_t offset) { + return save_data_in_base_dimensions(data_file, _data, _nd + _num_frozen_pts, + _dim, _aligned_dim, offset); } // save the graph index on a file as an adjacency list. For each point, // first store the number of neighbors, and then the neighbor list (each as // 4 byte unsigned) template - void Index::save(const char *filename) { - long long total_gr_edges = 0; - size_t index_size = 0; - std::ofstream out(std::string(filename), std::ios::binary | std::ios::out); + _u64 Index::save_graph(std::string graph_file, size_t offset) { + std::ofstream out; + open_file_to_write(out, graph_file); - if (_support_eager_delete) - if (_eager_done && (!_compacted_order)) { - if (_nd < _max_points) { - assert(_final_graph.size() == _max_points + _num_frozen_pts); - unsigned active = 0; - std::vector new_location = get_new_location(active); - diskann::cout << "Size of new_location = " << new_location.size() - << std::endl; - for (unsigned i = 0; i < new_location.size(); i++) - if ((_delete_set.find(i) == _delete_set.end()) && - (new_location[i] >= _max_points + _num_frozen_pts)) - diskann::cout << "Wrong new_location assigned to " << i - << std::endl; - else { - if ((_delete_set.find(i) != _delete_set.end()) && - (new_location[i] < _max_points + _num_frozen_pts)) - diskann::cout << "Wrong location assigned to " - "delete point " - << i << std::endl; - } - compact_data(new_location, active, _compacted_order); - - if (_support_eager_delete) - update_in_graph(); - - } else { - assert(_final_graph.size() == _max_points + _num_frozen_pts); - if (_enable_tags) { - _change_lock.lock(); - if (_can_delete) { - std::cerr << "Disable deletes and consolidate " - "index before saving." - << std::endl; - throw diskann::ANNException( - "Disable deletes and consolidate index before " - "saving.", - -1, __FUNCSIG__, __FILE__, __LINE__); - } - } - } - } - if (_lazy_done) { - assert(_final_graph.size() == _max_points + _num_frozen_pts); - if (_enable_tags) { - _change_lock.lock(); - if (_can_delete || (!_consolidated_order)) { - diskann::cout << "Disable deletes and consolidate index before " - "saving." - << std::endl; - throw diskann::ANNException( - "Disable deletes and consolidate index before saving.", -1, - __FUNCSIG__, __FILE__, __LINE__); - } - } - } + out.seekp(offset, out.beg); + _u64 index_size = 24; + _u32 max_degree = 0; out.write((char *) &index_size, sizeof(uint64_t)); out.write((char *) &_width, sizeof(unsigned)); - out.write((char *) &_ep, sizeof(unsigned)); + unsigned ep_u32 = _ep; + out.write((char *) &ep_u32, sizeof(unsigned)); + out.write((char *) &_num_frozen_pts, sizeof(_u64)); for (unsigned i = 0; i < _nd + _num_frozen_pts; i++) { unsigned GK = (unsigned) _final_graph[i].size(); out.write((char *) &GK, sizeof(unsigned)); out.write((char *) _final_graph[i].data(), GK * sizeof(unsigned)); - total_gr_edges += GK; + max_degree = _final_graph[i].size() > max_degree + ? (_u32) _final_graph[i].size() + : max_degree; + index_size += (_u64)(sizeof(unsigned) * (GK + 1)); } - index_size = out.tellp(); - out.seekp(0, std::ios::beg); + out.seekp(offset, out.beg); out.write((char *) &index_size, sizeof(uint64_t)); + out.write((char *) &max_degree, sizeof(_u32)); out.close(); + return index_size; // number of bytes written + } + + template + _u64 Index::save_delete_list(const std::string &filename, + _u64 file_offset) { + if (_delete_set.size() == 0) { + return 0; + } + std::unique_ptr<_u32[]> delete_list = + std::make_unique<_u32[]>(_delete_set.size()); + _u32 i = 0; + for (auto &del : _delete_set) { + delete_list[i++] = del; + } + return save_bin<_u32>(filename, delete_list.get(), _delete_set.size(), 1, + file_offset); + } - diskann::cout << "Avg degree: " - << ((float) total_gr_edges) / - ((float) (_nd + _num_frozen_pts)) + template + void Index::save(const char *filename) { + // first check if no thread is inserting + auto start = std::chrono::high_resolution_clock::now(); + std::unique_lock lock(_update_lock); + _change_lock.lock(); + + // compact_data(); + compact_frozen_point(); + if (!_save_as_one_file) { + std::string graph_file = std::string(filename); + std::string tags_file = std::string(filename) + ".tags"; + std::string data_file = std::string(filename) + ".data"; + std::string delete_list_file = std::string(filename) + ".del"; + + // Because the save_* functions use append mode, ensure that + // the files are deleted before save. Ideally, we should check + // the error code for delete_file, but will ignore now because + // delete should succeed if save will succeed. + delete_file(graph_file); + save_graph(graph_file); + delete_file(data_file); + save_data(data_file); + delete_file(tags_file); + save_tags(tags_file); + delete_file(delete_list_file); + save_delete_list(delete_list_file); + } else { + delete_file(filename); + std::vector cumul_bytes(5, 0); + cumul_bytes[0] = METADATA_SIZE; + cumul_bytes[1] = + cumul_bytes[0] + save_graph(std::string(filename), cumul_bytes[0]); + cumul_bytes[2] = + cumul_bytes[1] + save_data(std::string(filename), cumul_bytes[1]); + cumul_bytes[3] = + cumul_bytes[2] + save_tags(std::string(filename), cumul_bytes[2]); + cumul_bytes[4] = + cumul_bytes[3] + save_delete_list(filename, cumul_bytes[3]); + diskann::save_bin<_u64>(filename, cumul_bytes.data(), cumul_bytes.size(), + 1, 0); + + diskann::cout << "Saved index as one file to " << filename << " of size " + << cumul_bytes[cumul_bytes.size() - 1] << "B." << std::endl; + } + + reposition_frozen_point_to_end(); + + _change_lock.unlock(); + auto stop = std::chrono::high_resolution_clock::now(); + auto timespan = + std::chrono::duration_cast>(stop - start); + diskann::cout << "Time taken for save: " << timespan.count() << "s." << std::endl; } - // load the index from file and update the width (max_degree), ep - // (navigating node id), and _final_graph (adjacency list) template - void Index::load(const char *filename, const bool load_tags, - const char *tag_filename) { - if (!validate_file_size(filename)) { - return; + size_t Index::load_tags(const std::string tag_filename, + size_t offset) { + if (_enable_tags && !file_exists(tag_filename)) { + diskann::cerr << "Tag file provided does not exist!" << std::endl; + throw diskann::ANNException("Tag file provided does not exist!", -1, + __FUNCSIG__, __FILE__, __LINE__); + } + + if (!_enable_tags) { + diskann::cout << "Tags not loaded as tags not enabled." << std::endl; + return 0; + } + + size_t file_dim, file_num_points; + TagT * tag_data; + load_bin(std::string(tag_filename), tag_data, file_num_points, + file_dim, offset); + + if (file_dim != 1) { + std::stringstream stream; + stream << "ERROR: Loading " << file_dim << " dimensions for tags," + << "but tag file must have 1 dimension." << std::endl; + std::cerr << stream.str() << std::endl; + delete[] tag_data; + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + + size_t num_data_points = + _num_frozen_pts > 0 ? file_num_points - 1 : file_num_points; + for (_u32 i = 0; i < (_u32) num_data_points; i++) { + TagT tag = *(tag_data + i); + if (_delete_set.find(i) == _delete_set.end()) { + _location_to_tag[i] = tag; + _tag_to_location[tag] = (_u32) i; + } + } + diskann::cout << "Tags loaded." << std::endl; + delete[] tag_data; + return file_num_points; + } + + template + size_t Index::load_data(std::string filename, size_t offset) { + if (!file_exists(filename)) { + std::stringstream stream; + stream << "ERROR: data file " << filename << " does not exist." + << std::endl; + std::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + size_t file_dim, file_num_points; + diskann::get_bin_metadata(filename, file_num_points, file_dim, offset); + + // since we are loading a new dataset, _empty_slots must be cleared + _empty_slots.clear(); + + if (file_dim != _dim) { + std::stringstream stream; + stream << "ERROR: Driver requests loading " << _dim << " dimension," + << "but file has " << file_dim << " dimension." << std::endl; + std::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + + if (file_num_points > _max_points + _num_frozen_pts) { + //_change_lock is already locked in load() + std::unique_lock tl(_tag_lock); + std::unique_lock growth_lock(_update_lock); + + resize(file_num_points); + } + + copy_aligned_data_from_file(std::string(filename), _data, + file_num_points, file_dim, _aligned_dim, + offset); + return file_num_points; + } + + template + size_t Index::load_delete_set(const std::string &filename, + size_t offset) { + std::unique_ptr<_u32[]> delete_list; + _u64 npts, ndim; + load_bin<_u32>(filename, delete_list, npts, ndim, offset); + assert(ndim == 1); + for (size_t i = 0; i < npts; i++) { + _delete_set.insert(delete_list[i]); + } + return npts; + } + + // load the index from file and update the width (max_degree), ep (navigating + // node id), and _final_graph (adjacency list) + template + void Index::load(const char *filename) { + _change_lock.lock(); + + size_t tags_file_num_pts = 0, graph_num_pts = 0, data_file_num_pts = 0; + + if (!_save_as_one_file) { + std::string data_file = std::string(filename) + ".data"; + std::string tags_file = std::string(filename) + ".tags"; + std::string delete_set_file = std::string(filename) + ".del"; + std::string graph_file = std::string(filename); + data_file_num_pts = load_data(data_file); + if (file_exists(delete_set_file)) { + load_delete_set(delete_set_file); + } + if (_enable_tags) { + tags_file_num_pts = load_tags(tags_file); + } + graph_num_pts = load_graph(graph_file, data_file_num_pts); + + } else { + _u64 nr, nc; + std::unique_ptr<_u64[]> file_offset_data; + + std::string index_file(filename); + + diskann::load_bin<_u64>(index_file, file_offset_data, nr, nc, 0); + // Loading data first so that we know how many points to expect. + data_file_num_pts = load_data(index_file, file_offset_data[1]); + graph_num_pts = + load_graph(index_file, data_file_num_pts, file_offset_data[0]); + if (file_offset_data[3] != file_offset_data[4]) { + load_delete_set(index_file, file_offset_data[3]); + } + if (_enable_tags) { + tags_file_num_pts = load_tags(index_file, file_offset_data[2]); + } } + + if (data_file_num_pts != graph_num_pts || + (data_file_num_pts != tags_file_num_pts && _enable_tags)) { + std::stringstream stream; + stream << "ERROR: When loading index, loaded " << data_file_num_pts + << " points from datafile, " << graph_num_pts + << " from graph, and " << tags_file_num_pts + << " tags, with num_frozen_pts being set to " << _num_frozen_pts + << " in constructor." << std::endl; + std::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + + _nd = data_file_num_pts - _num_frozen_pts; + _empty_slots.clear(); + for (_u32 i = _nd; i < _max_points; i++) { + _empty_slots.insert(i); + } + + _lazy_done = _delete_set.size() != 0; + + reposition_frozen_point_to_end(); + diskann::cout << "Num frozen points:" << _num_frozen_pts << " _nd: " << _nd + << " _ep: " << _ep + << " size(_location_to_tag): " << _location_to_tag.size() + << " size(_tag_to_location):" << _tag_to_location.size() + << " Max points: " << _max_points << std::endl; + // auto point_count = _location_to_tag.size(); + // Since we haven't consolidated while save, during load, it is possible + // that we'll get locations > point_count. Hence commented + // for (auto lt : _location_to_tag) { + // if (lt.first > point_count) { + // std::cout << "Found location: " << lt.first << " for tag: " << + // lt.second + // << ", location > " << point_count << std::endl; + // } + //} + _change_lock.unlock(); + } + + template + size_t Index::load_graph(std::string filename, + size_t expected_num_points, size_t offset) { std::ifstream in(filename, std::ios::binary); - size_t expected_file_size; + in.seekg(offset, in.beg); + size_t expected_file_size; + _u64 file_frozen_pts; in.read((char *) &expected_file_size, sizeof(_u64)); in.read((char *) &_width, sizeof(unsigned)); in.read((char *) &_ep, sizeof(unsigned)); + in.read((char *) &file_frozen_pts, sizeof(_u64)); + + if (file_frozen_pts != _num_frozen_pts) { + std::stringstream stream; + if (file_frozen_pts == 1) + stream << "ERROR: When loading index, detected dynamic index, but " + "constructor asks for static index. Exitting." + << std::endl; + else + stream << "ERROR: When loading index, detected static index, but " + "constructor asks for dynamic index. Exitting." + << std::endl; + std::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } diskann::cout << "Loading vamana index " << filename << "..." << std::flush; + // Sanity check. In case the user gave us fewer points as max_points than + // the number + // of points in the dataset, resize the _final_graph to the larger size. + if (_max_points < expected_num_points) { + diskann::cout << "Number of points in data: " << expected_num_points + << " is less than max_points argument: " + << _final_graph.size() + << " Setting max points to: " << expected_num_points + << std::endl; + _final_graph.resize(expected_num_points); + _max_points = expected_num_points; + } + + size_t bytes_read = 24; size_t cc = 0; unsigned nodes = 0; - while (!in.eof()) { + while (bytes_read != expected_file_size) { unsigned k; in.read((char *) &k, sizeof(unsigned)); - if (in.eof()) - break; + if (k == 0) { + diskann::cerr << "ERROR: Point found with no out-neighbors, point#" + << nodes << std::endl; + } + // if (in.eof()) + // break; cc += k; ++nodes; std::vector tmp(k); + tmp.reserve(k); in.read((char *) tmp.data(), k * sizeof(unsigned)); - - _final_graph.emplace_back(tmp); + _final_graph[nodes - 1].swap(tmp); + bytes_read += sizeof(uint32_t) * ((_u64) k + 1); if (nodes % 10000000 == 0) diskann::cout << "." << std::flush; } - if (_final_graph.size() != _nd) { - diskann::cout << "ERROR. mismatch in number of points. Graph has " - << _final_graph.size() << " points and loaded dataset has " - << _nd << " points. " << std::endl; - return; - } - diskann::cout << "..done. Index has " << nodes << " nodes and " << cc - << " out-edges" << std::endl; + diskann::cout << "done. Index has " << nodes << " nodes and " << cc + << " out-edges, _ep is set to " << _ep << std::endl; + return nodes; + } - if (load_tags) { - if (_enable_tags == false) - diskann::cout << "Enabling tags." << std::endl; - _enable_tags = true; - std::ifstream tag_file; - if (tag_filename == NULL) - tag_file = std::ifstream(std::string(filename) + std::string(".tags")); - else - tag_file = std::ifstream(std::string(tag_filename)); - if (!tag_file.is_open()) { - std::cerr << "Tag file not found." << std::endl; - return; - } - unsigned id = 0; - TagT tag; - while (tag_file >> tag) { - _location_to_tag[id] = tag; - _tag_to_location[tag] = id++; - } - tag_file.close(); - assert(id == _nd); + template + int Index::get_vector_by_tag(TagT &tag, T *vec) { + std::shared_lock lock(_tag_lock); + if (_tag_to_location.find(tag) == _tag_to_location.end()) { + diskann::cout << "Tag " << tag << " does not exist" << std::endl; + return -1; + } + unsigned location = _tag_to_location[tag]; + // memory should be allocated for vec before calling this function + memcpy((void *) vec, (void *) (_data + (size_t)(location * _aligned_dim)), + (size_t) _aligned_dim * sizeof(T)); + return 0; + } + + template + const T *Index::get_vector_by_tag(const TagT &tag) { + std::shared_lock lock(_tag_lock); + if (_tag_to_location.find(tag) == _tag_to_location.end()) { + diskann::cout << "Tag " << tag << " does not exist in the index." + << std::endl; + return nullptr; + } else { + unsigned location = _tag_to_location[tag]; + return _data + (size_t)(location * _aligned_dim); } } @@ -366,13 +564,13 @@ namespace diskann { for (size_t i = 0; i < _nd; i++) for (size_t j = 0; j < _aligned_dim; j++) - center[j] += _data[i * _aligned_dim + j]; + center[j] += (float) _data[i * _aligned_dim + j]; for (size_t j = 0; j < _aligned_dim; j++) - center[j] /= _nd; + center[j] /= (float) _nd; // compute all to one distance - float * distances = new float[_nd](); + float *distances = new float[_nd](); #pragma omp parallel for schedule(static, 65536) for (_s64 i = 0; i < (_s64) _nd; i++) { // extract point and distance reference @@ -381,7 +579,8 @@ namespace diskann { dist = 0; float diff = 0; for (size_t j = 0; j < _aligned_dim; j++) { - diff = (center[j] - cur_vec[j]) * (center[j] - cur_vec[j]); + diff = + (center[j] - (float) cur_vec[j]) * (center[j] - (float) cur_vec[j]); dist += diff; } } @@ -417,8 +616,11 @@ namespace diskann { const std::vector &init_ids, std::vector & expanded_nodes_info, tsl::robin_set & expanded_nodes_ids, - std::vector & best_L_nodes) { + std::vector &best_L_nodes, bool ret_frozen) { best_L_nodes.resize(Lsize + 1); + for (unsigned i = 0; i < Lsize + 1; i++) { + best_L_nodes[i].distance = std::numeric_limits::max(); + } expanded_nodes_info.reserve(10 * Lsize); expanded_nodes_ids.reserve(10 * Lsize); @@ -428,7 +630,7 @@ namespace diskann { inserted_into_pool.reserve(Lsize * 20); for (auto id : init_ids) { - assert(id < _max_points); + assert(id < _max_points + _num_frozen_pts); nn = Neighbor(id, _distance->compare(_data + _aligned_dim * (size_t) id, node_coords, (unsigned) _aligned_dim), @@ -453,16 +655,46 @@ namespace diskann { if (best_L_nodes[k].flag) { best_L_nodes[k].flag = false; auto n = best_L_nodes[k].id; - expanded_nodes_info.emplace_back(best_L_nodes[k]); - expanded_nodes_ids.insert(n); + if (!(best_L_nodes[k].id == _ep && _num_frozen_pts > 0 && + !ret_frozen)) { + expanded_nodes_info.emplace_back(best_L_nodes[k]); + expanded_nodes_ids.insert(n); + } + std::vector des; + if (_dynamic_index) { + LockGuard guard(_locks[n]); + for (unsigned m = 0; m < _final_graph[n].size(); m++) { + if (_final_graph[n][m] >= _max_points + _num_frozen_pts) { + diskann::cerr << "Wrong id found: " << _final_graph[n][m] + << std::endl; + throw diskann::ANNException( + std::string("Wrong id found") + + std::to_string(_final_graph[n][m]), + -1, __FUNCSIG__, __FILE__, __LINE__); + } + des.emplace_back(_final_graph[n][m]); + } + } else { + for (unsigned m = 0; m < _final_graph[n].size(); m++) { + if (_final_graph[n][m] >= _max_points + _num_frozen_pts) { + diskann::cerr << "Wrong id found: " << _final_graph[n][m] + << std::endl; + throw diskann::ANNException( + std::string("Wrong id found") + + std::to_string(_final_graph[n][m]), + -1, __FUNCSIG__, __FILE__, __LINE__); + } + des.emplace_back(_final_graph[n][m]); + } + } - for (unsigned m = 0; m < _final_graph[n].size(); ++m) { - unsigned id = _final_graph[n][m]; + for (unsigned m = 0; m < des.size(); ++m) { + unsigned id = des[m]; if (inserted_into_pool.find(id) == inserted_into_pool.end()) { inserted_into_pool.insert(id); - if ((m + 1) < _final_graph[n].size()) { - auto nextn = _final_graph[n][m + 1]; + if ((m + 1) < des.size()) { + auto nextn = des[m + 1]; diskann::prefetch_vector( (const char *) _data + _aligned_dim * (size_t) nextn, sizeof(T) * _aligned_dim); @@ -495,6 +727,25 @@ namespace diskann { return std::make_pair(hops, cmps); } + template + void Index::iterate_to_fixed_point( + const T *node_coords, const unsigned Lindex, + std::vector & expanded_nodes_info, + tsl::robin_map &coord_map, bool return_frozen_pt) { + std::vector init_ids; + init_ids.push_back(this->_ep); + std::vector best_L_nodes; + tsl::robin_set expanded_nodes_ids; + this->iterate_to_fixed_point(node_coords, Lindex, init_ids, + expanded_nodes_info, expanded_nodes_ids, + best_L_nodes, return_frozen_pt); + for (Neighbor &einf : expanded_nodes_info) { + T *coords = + this->_data + (uint64_t) einf.id * (uint64_t) this->_aligned_dim; + coord_map.insert(std::make_pair(einf.id, coords)); + } + } + template void Index::get_expanded_nodes( const size_t node_id, const unsigned Lindex, @@ -555,12 +806,12 @@ namespace diskann { } start++; } - cur_alpha *= 1.2; + cur_alpha *= 1.2f; } } template - void Index::prune_neighbors(const unsigned location, + void Index::prune_neighbors(const unsigned location, std::vector &pool, const Parameters & parameter, std::vector &pruned_list) { @@ -568,8 +819,10 @@ namespace diskann { unsigned maxc = parameter.Get("C"); float alpha = parameter.Get("alpha"); - if (pool.size() == 0) - return; + if (pool.size() == 0) { + throw diskann::ANNException("Pool passed to prune_neighbors is empty", + -1); + } _width = (std::max)(_width, range); @@ -618,7 +871,7 @@ namespace diskann { if (des == n) continue; /* des.id is the id of the neighbors of n */ - assert(des >= 0 && des < _max_points); + assert(des >= 0 && des < _max_points + _num_frozen_pts); if (des > _max_points) diskann::cout << "error. " << des << " exceeds max_pts" << std::endl; /* des_pool contains the neighbors of the neighbors of n */ @@ -640,19 +893,20 @@ namespace diskann { * the current node n. */ template - void Index::inter_insert(unsigned n, + void Index::inter_insert(unsigned n, std::vector &pruned_list, const Parameters & parameter, bool update_in_graph) { const auto range = parameter.Get("R"); - assert(n >= 0 && n < _nd); + assert(n >= 0 && n < _nd + _num_frozen_pts); + const auto &src_pool = pruned_list; assert(!src_pool.empty()); for (auto des : src_pool) { /* des.id is the id of the neighbors of n */ - assert(des >= 0 && des < _max_points); + assert(des >= 0 && des < _max_points + _num_frozen_pts); /* des_pool contains the neighbors of the neighbors of n */ auto & des_pool = _final_graph[des]; std::vector copy_of_neighbors; @@ -660,14 +914,11 @@ namespace diskann { { LockGuard guard(_locks[des]); if (std::find(des_pool.begin(), des_pool.end(), n) == des_pool.end()) { - if (des_pool.size() < SLACK_FACTOR * range) { + if (des_pool.size() < (_u64)(SLACK_FACTOR * range)) { des_pool.emplace_back(n); if (update_in_graph) { - // USE APPROPRIATE LOCKS FOR IN_GRAPH - if (std::find(_in_graph[n].begin(), _in_graph[n].end(), des) == - _in_graph[n].end()) { - _in_graph[n].emplace_back(des); - } + LockGuard guard(_locks_in[n]); + _in_graph[n].emplace_back(des); } prune_needed = false; } else { @@ -701,14 +952,30 @@ namespace diskann { prune_neighbors(des, dummy_pool, parameter, new_out_neighbors); { LockGuard guard(_locks[des]); - // DELETE IN-EDGES FROM IN_GRAPH USING APPROPRIATE LOCKS + // updating in_graph of out-neighbors of des + if (update_in_graph) { + for (auto out_nbr : _final_graph[des]) { + { + LockGuard guard(_locks_in[out_nbr]); + for (unsigned i = 0; i < _in_graph[out_nbr].size(); i++) { + if (_in_graph[out_nbr][i] == des) { + _in_graph[out_nbr].erase(_in_graph[out_nbr].begin() + i); + break; + } + } + } + } + } + _final_graph[des].clear(); for (auto new_nbr : new_out_neighbors) { _final_graph[des].emplace_back(new_nbr); if (update_in_graph) { + LockGuard guard(_locks_in[new_nbr]); _in_graph[new_nbr].emplace_back(des); } } + _final_graph[des].shrink_to_fit(); } } } @@ -750,14 +1017,16 @@ namespace diskann { parameters.Set("alpha", 1); /* visit_order is a vector that is initialized to the entire graph */ - std::vector visit_order; + std::vector visit_order; + std::vector pool, tmp; + tsl::robin_set visited; visit_order.reserve(_nd + _num_frozen_pts); for (unsigned i = 0; i < (unsigned) _nd; i++) { visit_order.emplace_back(i); } - for (unsigned i = 0; i < (unsigned) _num_frozen_pts; ++i) - visit_order.emplace_back((unsigned) (_max_points + i)); + if (_num_frozen_pts > 0) + visit_order.emplace_back((unsigned) _max_points); // if there are frozen points, the first such one is set to be the _ep if (_num_frozen_pts > 0) @@ -765,8 +1034,6 @@ namespace diskann { else _ep = calculate_entry_point(); - _final_graph.reserve(_max_points + _num_frozen_pts); - _final_graph.resize(_max_points + _num_frozen_pts); if (_support_eager_delete) { _in_graph.reserve(_max_points + _num_frozen_pts); _in_graph.resize(_max_points + _num_frozen_pts); @@ -925,20 +1192,24 @@ namespace diskann { progress_counter += 5; } } -// Gopal. Splittng diskann_dll into separate DLLs for search and build. +// Splittng diskann_dll into separate DLLs for search and build. // This code should only be available in the "build" DLL. -#ifdef DISKANN_BUILD +#ifdef USE_TCMALLOC MallocExtension::instance()->ReleaseFreeMemory(); #endif - diskann::cout << "Completed Pass " << rnd_no << " of data using L=" << L - << " and alpha=" << parameters.Get("alpha") - << ". Stats: "; - diskann::cout << "search+prune_time=" << total_sync_time - << "s, inter_time=" << total_inter_time - << "s, inter_count=" << total_inter_count << std::endl; + if (_nd > 0) { + diskann::cout << "Completed Pass " << rnd_no << " of data using L=" << L + << " and alpha=" << parameters.Get("alpha") + << ". Stats: "; + diskann::cout << "search+prune_time=" << total_sync_time + << "s, inter_time=" << total_inter_time + << "s, inter_count=" << total_inter_count << std::endl; + } } - diskann::cout << "Starting final cleanup.." << std::flush; + if (_nd > 0) { + diskann::cout << "Starting final cleanup.." << std::flush; + } #pragma omp parallel for schedule(dynamic, 65536) for (_s64 node_ctr = 0; node_ctr < (_s64)(visit_order.size()); node_ctr++) { auto node = visit_order[node_ctr]; @@ -965,30 +1236,141 @@ namespace diskann { _final_graph[node].emplace_back(id); } } - diskann::cout << "done. Link time: " - << ((double) link_timer.elapsed() / (double) 1000000) << "s" - << std::endl; + if (_nd > 0) { + diskann::cout << "done. Link time: " + << ((double) link_timer.elapsed() / (double) 1000000) << "s" + << std::endl; + } } template - void Index::build(Parameters ¶meters, - const std::vector &tags) { - if (_enable_tags) { - if (tags.size() != _nd) { - std::cerr << "#Tags should be equal to #points" << std::endl; - throw diskann::ANNException("#Tags must be equal to #points", -1, - __FUNCSIG__, __FILE__, __LINE__); - } - for (size_t i = 0; i < tags.size(); ++i) { - _tag_to_location[tags[i]] = (unsigned) i; - _location_to_tag[(unsigned) i] = tags[i]; + void Index::prune_all_nbrs(const Parameters ¶meters) { + const unsigned range = parameters.Get("R"); + + diskann::Timer timer; +#pragma omp parallel for + for (_s64 node = 0; node < (_s64)(_max_points + _num_frozen_pts); node++) { + if ((size_t) node < _nd || (size_t) node == _max_points) { + if (_final_graph[node].size() > range) { + tsl::robin_set dummy_visited(0); + std::vector dummy_pool(0); + std::vector new_out_neighbors; + + for (auto cur_nbr : _final_graph[node]) { + if (dummy_visited.find(cur_nbr) == dummy_visited.end() && + cur_nbr != node) { + float dist = + _distance->compare(_data + _aligned_dim * (size_t) node, + _data + _aligned_dim * (size_t) cur_nbr, + (unsigned) _aligned_dim); + dummy_pool.emplace_back(Neighbor(cur_nbr, dist, true)); + dummy_visited.insert(cur_nbr); + } + } + prune_neighbors((_u32) node, dummy_pool, parameters, + new_out_neighbors); + + _final_graph[node].clear(); + for (auto id : new_out_neighbors) + _final_graph[node].emplace_back(id); + } } } - diskann::cout << "Starting index build..." << std::endl; - link(parameters); // Primary func for creating graph - if (_support_eager_delete) { - update_in_graph(); // copying values to in_graph + diskann::cout << "Prune time : " << timer.elapsed() / 1000 << "ms" + << std::endl; + size_t max = 0, min = 1 << 30, total = 0, cnt = 0; + for (size_t i = 0; i < (_nd + _num_frozen_pts); i++) { + auto &pool = _final_graph[i]; + max = (std::max)(max, pool.size()); + min = (std::min)(min, pool.size()); + total += pool.size(); + if (pool.size() < 2) + cnt++; + } + if (min > max) + min = max; + if (_nd > 0) { + diskann::cout << "Index built with degree: max:" << max << " avg:" + << (float) total / (float) (_nd + _num_frozen_pts) + << " min:" << min << " count(deg<2):" << cnt << std::endl; + } + } + + template + void Index::build(const char * filename, + const size_t num_points_to_load, + Parameters & parameters, + const std::vector &tags) { + if (!file_exists(filename)) { + diskann::cerr << "Data file " << filename + << " does not exist!!! Exiting...." << std::endl; + std::stringstream stream; + stream << "Data file " << filename << " does not exist." << std::endl; + std::cerr << stream.str() << std::endl; + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + + size_t file_num_points, file_dim; + if (filename == nullptr) { + diskann::cout << "Starting with an empty index." << std::endl; + _nd = 0; + } else { + diskann::get_bin_metadata(filename, file_num_points, file_dim); + if (file_num_points > _max_points || + num_points_to_load > file_num_points) { + std::stringstream stream; + stream << "ERROR: Driver requests loading " << num_points_to_load + << " points and file has " << file_num_points << " points, but " + << "index can support only " << _max_points + << " points as specified in constructor." << std::endl; + std::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + if (file_dim != _dim) { + std::stringstream stream; + stream << "ERROR: Driver requests loading " << _dim << " dimension," + << "but file has " << file_dim << " dimension." << std::endl; + std::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + + copy_aligned_data_from_file(std::string(filename), _data, + file_num_points, file_dim, _aligned_dim); + + diskann::cout << "Loading only first " << num_points_to_load + << " from file.. " << std::endl; + _nd = num_points_to_load; + + if (_enable_tags && tags.size() != num_points_to_load) { + std::stringstream stream; + stream << "ERROR: Driver requests loading " << num_points_to_load + << " points from file," + << "but tags vector is of size " << tags.size() << "." + << std::endl; + std::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + if (_enable_tags) { + for (size_t i = 0; i < tags.size(); ++i) { + _tag_to_location[tags[i]] = (unsigned) i; + _location_to_tag[(unsigned) i] = tags[i]; + } + } + } + + generate_frozen_point(); + link(parameters); // Primary func for creating nsg graph + + if (_support_eager_delete) { + update_in_graph(); // copying values to in_graph } size_t max = 0, min = 1 << 30, total = 0, cnt = 0; @@ -1000,38 +1382,204 @@ namespace diskann { if (pool.size() < 2) cnt++; } - diskann::cout << "Degree: max:" << max - << " avg:" << (float) total / (float) _nd << " min:" << min - << " count(deg<2):" << cnt << "\n" - << "Index built." << std::endl; + if (min > max) + min = max; + if (_nd > 0) { + diskann::cout << "Index built with degree: max:" << max << " avg:" + << (float) total / (float) (_nd + _num_frozen_pts) + << " min:" << min << " count(deg<2):" << cnt << std::endl; + } _width = (std::max)((unsigned) max, _width); _has_built = true; } template - std::pair Index::search(const T *query, + void Index::build(const char * filename, + const size_t num_points_to_load, + Parameters ¶meters, const char *tag_filename) { + if (!file_exists(filename)) { + std::cerr << "Data file provided " << filename << " does not exist." + << std::endl; + std::stringstream stream; + stream << "Data file provided " << filename << " does not exist." + << std::endl; + std::cerr << stream.str() << std::endl; + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + + size_t file_num_points, file_dim; + if (filename == nullptr) { + diskann::cout << "Starting with an empty index." << std::endl; + _nd = 0; + } else { + diskann::get_bin_metadata(filename, file_num_points, file_dim); + if (file_num_points > _max_points || + num_points_to_load > file_num_points) { + std::stringstream stream; + stream << "ERROR: Driver requests loading " << num_points_to_load + << " points and file has " << file_num_points << " points, but " + << "index can support only " << _max_points + << " points as specified in constructor." << std::endl; + std::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + if (file_dim != _dim) { + std::stringstream stream; + stream << "ERROR: Driver requests loading " << _dim << " dimension," + << "but file has " << file_dim << " dimension." << std::endl; + std::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + + copy_aligned_data_from_file(std::string(filename), _data, + file_num_points, file_dim, _aligned_dim); + + diskann::cout << "Loading only first " << num_points_to_load + << " from file.. " << std::endl; + _nd = num_points_to_load; + if (_enable_tags) { + if (tag_filename == nullptr) { + for (unsigned i = 0; i < num_points_to_load; i++) { + _tag_to_location[i] = i; + _location_to_tag[i] = i; + } + } else { + if (file_exists(tag_filename)) { + diskann::cout << "Loading tags from " << tag_filename + << " for vamana index build" << std::endl; + TagT * tag_data = nullptr; + size_t npts, ndim; + diskann::load_bin(tag_filename, tag_data, npts, ndim); + if (npts != num_points_to_load) { + std::stringstream sstream; + sstream << "Loaded " << npts + << " tags instead of expected number: " + << num_points_to_load; + diskann::cerr << sstream.str() << std::endl; + throw diskann::ANNException(sstream.str(), -1, __FUNCSIG__, + __FILE__, __LINE__); + } + for (size_t i = 0; i < npts; i++) { + _tag_to_location[tag_data[i]] = (unsigned) i; + _location_to_tag[(unsigned) i] = tag_data[i]; + } + delete[] tag_data; + } else { + diskann::cerr << "Tag file " << tag_filename + << " does not exist. Exiting..." << std::endl; + throw diskann::ANNException( + std::string("Tag file") + tag_filename + " does not exist", -1, + __FUNCSIG__, __FILE__, __LINE__); + } + } + } + } + + generate_frozen_point(); + link(parameters); // Primary func for creating nsg graph + + if (_support_eager_delete) { + update_in_graph(); // copying values to in_graph + } + + size_t max = 0, min = 1 << 30, total = 0, cnt = 0; + for (size_t i = 0; i < _nd; i++) { + auto &pool = _final_graph[i]; + max = (std::max)(max, pool.size()); + min = (std::min)(min, pool.size()); + total += pool.size(); + if (pool.size() < 2) + cnt++; + } + if (min > max) + min = max; + if (_nd > 0) { + diskann::cout << "Index built with degree: max:" << max << " avg:" + << (float) total / (float) (_nd + _num_frozen_pts) + << " min:" << min << " count(deg<2):" << cnt << std::endl; + } + _width = (std::max)((unsigned) max, _width); + _has_built = true; + } + + template + std::pair Index::search( + const T *query, const size_t K, const unsigned L, + std::vector> &best_K_tags) { + std::shared_lock ulock(_update_lock); + assert(best_K_tags.size() == 0); + std::vector init_ids; + tsl::robin_set visited(10 * L); + std::vector best, expanded_nodes_info; + tsl::robin_set expanded_nodes_ids; + + if (init_ids.size() == 0) { + init_ids.emplace_back(_ep); + } + + T * aligned_query; + size_t allocSize = _aligned_dim * sizeof(T); + alloc_aligned(((void **) &aligned_query), allocSize, 8 * sizeof(T)); + memset(aligned_query, 0, _aligned_dim * sizeof(T)); + memcpy(aligned_query, query, _dim * sizeof(T)); + auto retval = + iterate_to_fixed_point(aligned_query, L, init_ids, expanded_nodes_info, + expanded_nodes_ids, best, false); + + std::shared_lock lock(_tag_lock); + for (auto iter : best) { + if (_location_to_tag.find(iter.id) != _location_to_tag.end()) + best_K_tags.emplace_back( + Neighbor_Tag(_location_to_tag[iter.id], iter.distance)); + if (best_K_tags.size() == K) + break; + } + aligned_free(aligned_query); + return retval; + } + + template + std::pair Index::search(const T * query, const size_t K, const unsigned L, - unsigned * indices) { + unsigned * indices, + float *distances) { std::vector init_ids; tsl::robin_set visited(10 * L); std::vector best_L_nodes, expanded_nodes_info; tsl::robin_set expanded_nodes_ids; + std::shared_lock lock(_update_lock); + if (init_ids.size() == 0) { init_ids.emplace_back(_ep); } + T * aligned_query; + size_t allocSize = _aligned_dim * sizeof(T); + alloc_aligned(((void **) &aligned_query), allocSize, 8 * sizeof(T)); + memset(aligned_query, 0, _aligned_dim * sizeof(T)); + memcpy(aligned_query, query, _dim * sizeof(T)); auto retval = - iterate_to_fixed_point(query, L, init_ids, expanded_nodes_info, + iterate_to_fixed_point(aligned_query, L, init_ids, expanded_nodes_info, expanded_nodes_ids, best_L_nodes); size_t pos = 0; for (auto it : best_L_nodes) { - indices[pos] = it.id; - pos++; + if (it.id < _max_points) { + indices[pos] = it.id; + if (distances != nullptr) + distances[pos] = it.distance; + pos++; + } if (pos == K) break; } + aligned_free(aligned_query); return retval; } @@ -1043,10 +1591,17 @@ namespace diskann { std::vector best_L_nodes, expanded_nodes_info; tsl::robin_set expanded_nodes_ids; + std::shared_lock lock(_update_lock); + if (init_ids.size() == 0) { init_ids.emplace_back(_ep); } - auto retval = iterate_to_fixed_point(query, (unsigned) L, init_ids, + T * aligned_query; + size_t allocSize = _aligned_dim * sizeof(T); + alloc_aligned(((void **) &aligned_query), allocSize, 8 * sizeof(T)); + memset(aligned_query, 0, _aligned_dim * sizeof(T)); + memcpy(aligned_query, query, _dim * sizeof(T)); + auto retval = iterate_to_fixed_point(aligned_query, (unsigned) L, init_ids, expanded_nodes_info, expanded_nodes_ids, best_L_nodes); @@ -1058,145 +1613,84 @@ namespace diskann { if (pos == K) break; } + aligned_free(aligned_query); return retval; } template - std::pair Index::search_with_tags( - const T *query, const size_t K, const unsigned L, TagT *tags, - unsigned frozen_pts, unsigned *indices_buffer) { - const bool alloc = indices_buffer == NULL; - auto indices = alloc ? new unsigned[K] : indices_buffer; - auto ret = search(query, K, L, indices); - for (int i = 0; i < (int) K; ++i) - tags[i] = _location_to_tag[indices[i]]; - if (alloc) - delete[] indices; - return ret; + size_t Index::search_with_tags(const T *query, const uint64_t K, + const unsigned L, TagT *tags, + float * distances, + std::vector &res_vectors) { + _u32 * indices = new unsigned[L]; + float *dist_interim = new float[L]; + search(query, L, L, indices, dist_interim); + + std::shared_lock ulock(_update_lock); + std::shared_lock lock(_tag_lock); + size_t pos = 0; + for (int i = 0; i < (int) L; ++i) + if (_location_to_tag.find(indices[i]) != _location_to_tag.end()) { + tags[pos] = _location_to_tag[indices[i]]; + res_vectors[i] = _data + indices[i] * _aligned_dim; + + if (distances != nullptr) + distances[pos] = dist_interim[i]; + pos++; + if (pos == K) + break; + } + delete[] indices; + delete[] dist_interim; + return pos; } template - void Index::optimize_graph() { // use after build or load - _data_len = (_aligned_dim + 1) * sizeof(float); - _neighbor_len = (_width + 1) * sizeof(unsigned); - _node_size = _data_len + _neighbor_len; - _opt_graph = (char *) malloc(_node_size * _nd); - DistanceFastL2 *dist_fast = (DistanceFastL2 *) _distance; - for (unsigned i = 0; i < _nd; i++) { - char *cur_node_offset = _opt_graph + i * _node_size; - float cur_norm = dist_fast->norm(_data + i * _aligned_dim, _aligned_dim); - std::memcpy(cur_node_offset, &cur_norm, sizeof(float)); - std::memcpy(cur_node_offset + sizeof(float), _data + i * _aligned_dim, - _data_len - sizeof(float)); - - cur_node_offset += _data_len; - unsigned k = _final_graph[i].size(); - std::memcpy(cur_node_offset, &k, sizeof(unsigned)); - std::memcpy(cur_node_offset + sizeof(unsigned), _final_graph[i].data(), - k * sizeof(unsigned)); - std::vector().swap(_final_graph[i]); - } - _final_graph.clear(); - _final_graph.shrink_to_fit(); + size_t Index::search_with_tags(const T *query, const size_t K, + const unsigned L, TagT *tags, + float *distances) { + _u32 * indices = new unsigned[L]; + float *dist_interim = new float[L]; + search(query, L, L, indices, dist_interim); + + std::shared_lock ulock(_update_lock); + std::shared_lock lock(_tag_lock); + size_t pos = 0; + for (int i = 0; i < (int) L; ++i) { + if (_location_to_tag.find(indices[i]) != _location_to_tag.end()) { + tags[pos] = _location_to_tag[indices[i]]; + if (distances != nullptr) + distances[pos] = dist_interim[i]; + pos++; + if (pos == K) + break; + } + } + delete[] indices; + delete[] dist_interim; + return pos; } template - void Index::search_with_opt_graph(const T *query, size_t K, size_t L, - unsigned *indices) { - DistanceFastL2 *dist_fast = (DistanceFastL2 *) _distance; - - std::vector retset(L + 1); - std::vector init_ids(L); - // std::mt19937 rng(rand()); - // GenRandom(rng, init_ids.data(), L, (unsigned) nd_); - - boost::dynamic_bitset<> flags{_nd, 0}; - unsigned tmp_l = 0; - unsigned * neighbors = - (unsigned *) (_opt_graph + _node_size * _ep + _data_len); - unsigned MaxM_ep = *neighbors; - neighbors++; - - for (; tmp_l < L && tmp_l < MaxM_ep; tmp_l++) { - init_ids[tmp_l] = neighbors[tmp_l]; - flags[init_ids[tmp_l]] = true; - } - - while (tmp_l < L) { - unsigned id = rand() % _nd; - if (flags[id]) - continue; - flags[id] = true; - init_ids[tmp_l] = id; - tmp_l++; - } - - for (unsigned i = 0; i < init_ids.size(); i++) { - unsigned id = init_ids[i]; - if (id >= _nd) - continue; - _mm_prefetch(_opt_graph + _node_size * id, _MM_HINT_T0); - } - L = 0; - for (unsigned i = 0; i < init_ids.size(); i++) { - unsigned id = init_ids[i]; - if (id >= _nd) - continue; - T * x = (T *) (_opt_graph + _node_size * id); - float norm_x = *x; - x++; - float dist = - dist_fast->compare(x, query, norm_x, (unsigned) _aligned_dim); - retset[i] = Neighbor(id, dist, true); - flags[id] = true; - L++; - } - // std::cout<compare(query, data, norm, (unsigned) _aligned_dim); - if (dist >= retset[L - 1].distance) - continue; - Neighbor nn(id, dist, true); - int r = InsertIntoPool(retset.data(), L, nn); + size_t Index::get_num_points() { + return _nd; + } - // if(L+1 < retset.size()) ++L; - if (r < nk) - nk = r; - } - } - if (nk <= k) - k = nk; - else - ++k; - } - for (size_t i = 0; i < K; i++) { - indices[i] = retset[i].id; - } + template + T *Index::get_data() { + if (_num_frozen_pts > 0) { + T * ret_data = nullptr; + size_t allocSize = _nd * _aligned_dim * sizeof(T); + alloc_aligned(((void **) &ret_data), allocSize, 8 * sizeof(T)); + memset(ret_data, 0, _nd * _aligned_dim * sizeof(T)); + memcpy(ret_data, _data, _nd * _aligned_dim * sizeof(T)); + return ret_data; + } + return _data; + } + template + size_t Index::return_max_points() { + return _max_points; } /************************************************* @@ -1206,149 +1700,177 @@ namespace diskann { // in case we add ''frozen'' auxiliary points to the dataset, these are not // visible to external world, we generate them here and update our dataset template - int Index::generate_random_frozen_points(const char *filename) { - if (_has_built) { - diskann::cout << "Index already built. Cannot add more points" - << std::endl; - return -1; - } + int Index::generate_frozen_point() { + if (_num_frozen_pts == 0) + return 0; - if (filename) { // user defined frozen points - T *frozen_pts; - load_aligned_bin(std::string(filename), frozen_pts, _num_frozen_pts, - _dim, _aligned_dim); - for (_u64 i = 0; i < _num_frozen_pts; i++) { - for (unsigned d = 0; d < _dim; d++) - _data[(i + _max_points) * _aligned_dim + d] = - frozen_pts[i * _dim + d]; - for (_u64 d = _dim; d < _aligned_dim; d++) - _data[(i + _max_points) * _aligned_dim + d] = 0; - } - } else { // random frozen points - - std::random_device device; - std::mt19937 generator(device()); - std::uniform_real_distribution dist(0, 1); - // Harsha: Should the distribution change with the distance metric? - - for (_u64 i = 0; i < _num_frozen_pts; ++i) { - for (_u64 d = 0; d < _dim; d++) - _data[(i + _max_points) * _aligned_dim + d] = (T) dist(generator); - for (_u64 d = _dim; d < _aligned_dim; d++) - _data[(i + _max_points) * _aligned_dim + d] = 0; - } + if (_nd == 0) { + memset(_data + (_max_points) *_aligned_dim, 0, _aligned_dim * sizeof(T)); + return 1; } - + size_t res = calculate_entry_point(); + memcpy(_data + _max_points * _aligned_dim, _data + res * _aligned_dim, + _aligned_dim * sizeof(T)); return 0; } template int Index::enable_delete() { - LockGuard guard(_change_lock); - assert(!_can_delete); assert(_enable_tags); - if (_can_delete) { - std::cerr << "Delete already enabled" << std::endl; - return -1; - } if (!_enable_tags) { std::cerr << "Tags must be instantiated for deletions" << std::endl; return -2; } - if (_consolidated_order && _compacted_order) { - assert(_empty_slots.size() == 0); - for (unsigned slot = (unsigned) _nd; slot < _max_points; ++slot) + if (_data_compacted) { + for (unsigned slot = (unsigned) _nd; slot < _max_points; ++slot) { _empty_slots.insert(slot); - _consolidated_order = false; - _compacted_order = false; + } } _lazy_done = false; _eager_done = false; - _can_delete = true; + if (_support_eager_delete) { + _in_graph.resize(_max_points + _num_frozen_pts); + _in_graph.reserve(_max_points + _num_frozen_pts); + update_in_graph(); + } return 0; } template - int Index::eager_delete(const TagT tag, - const Parameters ¶meters) { - if (_lazy_done && (!_consolidated_order)) { - diskann::cout << "Lazy delete reuests issued but data not consolidated, " + void Index::release_location() { + LockGuard guard(_change_lock); + _nd--; + } + + template + int Index::eager_delete(const TagT tag, const Parameters ¶meters, + int delete_mode) { + if (_lazy_done && (!_data_compacted)) { + diskann::cout << "Lazy delete requests issued but data not consolidated, " "cannot proceed with eager deletes." << std::endl; return -1; } - LockGuard guard(_change_lock); - if (_tag_to_location.find(tag) == _tag_to_location.end()) { - std::cerr << "Delete tag not found" << std::endl; - return -1; + + unsigned id = -1; + { + std::shared_lock lock(_tag_lock); + if (_tag_to_location.find(tag) == _tag_to_location.end()) { + std::cerr << "Delete tag not found" << std::endl; + return -1; + } + id = _tag_to_location[tag]; + } + + { + std::unique_lock lock(_tag_lock); + _location_to_tag.erase(_tag_to_location[tag]); + _tag_to_location.erase(tag); } - unsigned id = _tag_to_location[tag]; - _location_to_tag.erase(_tag_to_location[tag]); - _tag_to_location.erase(tag); - _delete_set.insert(id); - _empty_slots.insert(id); + { + // id will be valid because if not, it'll return in the {} above. + std::unique_lock lock(_delete_lock); + _delete_set.insert(id); + _empty_slots.insert(id); + } const unsigned range = parameters.Get("R"); const unsigned maxc = parameters.Get("C"); const float alpha = parameters.Get("alpha"); // delete point from out-neighbors' in-neighbor list - for (auto j : _final_graph[id]) - for (unsigned k = 0; k < _in_graph[j].size(); k++) - if (_in_graph[j][k] == id) { - _in_graph[j].erase(_in_graph[j].begin() + k); - break; + { + LockGuard guard(_locks[id]); + for (size_t i = 0; i < _final_graph[id].size(); i++) { + unsigned j = _final_graph[id][i]; + { + LockGuard guard(_locks_in[j]); + for (unsigned k = 0; k < _in_graph[j].size(); k++) { + if (_in_graph[j][k] == id) { + _in_graph[j].erase(_in_graph[j].begin() + k); + break; + } + } } + } + } tsl::robin_set in_nbr; - for (unsigned i = 0; i < _in_graph[id].size(); i++) - in_nbr.insert(_in_graph[id][i]); + { + LockGuard guard(_locks_in[id]); + for (unsigned i = 0; i < _in_graph[id].size(); i++) + in_nbr.insert(_in_graph[id][i]); + } assert(_in_graph[id].size() == in_nbr.size()); - tsl::robin_set candidate_set; - std::vector expanded_nghrs; - std::vector result; std::vector pool, tmp; tsl::robin_set visited; + std::vector intersection; + unsigned Lindex = parameters.Get("L"); + std::vector init_ids; + if (delete_mode == 2) { + // constructing list of in-neighbors to be processed + get_expanded_nodes(id, Lindex, init_ids, pool, visited); - unsigned Lindex = parameters.Get("L"); - std::vector init_ids; - - get_expanded_nodes(id, Lindex, init_ids, pool, visited); - - for (unsigned i = 0; i < pool.size(); i++) - if (pool[i].id == id) { - pool.erase(pool.begin() + i); - break; + for (auto node : visited) { + if (in_nbr.find(node) != in_nbr.end()) { + intersection.push_back(node); + } } + } + // deleting deleted point from all in-neighbors' out-neighbor list for (auto it : in_nbr) { + LockGuard guard(_locks[it]); _final_graph[it].erase( std::remove(_final_graph[it].begin(), _final_graph[it].end(), id), _final_graph[it].end()); } - for (auto it : visited) { - auto ngh = it; - if (in_nbr.find(ngh) != in_nbr.end()) { - candidate_set.clear(); - expanded_nghrs.clear(); - result.clear(); + tsl::robin_set candidate_set; + std::vector expanded_nghrs; + std::vector result; + + for (size_t i = 0; i < intersection.size(); i++) { + auto ngh = intersection[i]; + + candidate_set.clear(); + expanded_nghrs.clear(); + result.clear(); - for (auto j : _final_graph[id]) - if ((j != id) && (j != ngh) && - (_delete_set.find(j) == _delete_set.end())) - candidate_set.insert(j); + { + std::shared_lock lock(_delete_lock); + if (_delete_set.find(ngh) != _delete_set.end()) + continue; + } + + { + LockGuard guard(_locks[ngh]); + + // constructing candidate set from out-neighbors and out-neighbors of + // ngh and id + { // should a shared reader lock on delete_lock be held here at the + // beginning of the two for loops or should it be held and release + // for ech iteration of the for loops? Which is faster? + + std::shared_lock lock(_delete_lock); + for (auto j : _final_graph[id]) { + if ((j != id) && (j != ngh) && + (_delete_set.find(j) == _delete_set.end())) + candidate_set.insert(j); + } - for (auto j : _final_graph[ngh]) - if ((j != id) && (j != ngh) && - (_delete_set.find(j) == _delete_set.end())) - candidate_set.insert(j); + for (auto j : _final_graph[ngh]) { + if ((j != id) && (j != ngh) && + (_delete_set.find(j) == _delete_set.end())) + candidate_set.insert(j); + } + } for (auto j : candidate_set) expanded_nghrs.push_back( @@ -1360,78 +1882,79 @@ namespace diskann { std::sort(expanded_nghrs.begin(), expanded_nghrs.end()); occlude_list(expanded_nghrs, alpha, range, maxc, result); - for (auto iter : _final_graph[ngh]) - for (unsigned k = 0; k < _in_graph[iter].size(); k++) - if (_in_graph[iter][k] == ngh) { - _in_graph[iter].erase(_in_graph[iter].begin() + k); + // deleting ngh from its old out-neighbors' in-neighbor list + for (auto iter : _final_graph[ngh]) { + { + LockGuard guard(_locks_in[iter]); + for (unsigned k = 0; k < _in_graph[iter].size(); k++) { + if (_in_graph[iter][k] == ngh) { + _in_graph[iter].erase(_in_graph[iter].begin() + k); + break; + } } + } + } _final_graph[ngh].clear(); - for (auto j : result) { - if (_delete_set.find(j.id) == _delete_set.end()) - _final_graph[ngh].push_back(j.id); - if (std::find(_in_graph[j.id].begin(), _in_graph[j.id].end(), ngh) == - _in_graph[j.id].end()) - _in_graph[j.id].emplace_back(ngh); + // updating out-neighbors and in-neighbors of ngh + { + std::shared_lock lock(_delete_lock); + for (size_t i = 0; i < result.size(); i++) { + auto j = result[i]; + if (_delete_set.find(j.id) == _delete_set.end()) { + _final_graph[ngh].push_back(j.id); + { + LockGuard guard(_locks_in[j.id]); + if (std::find(_in_graph[j.id].begin(), _in_graph[j.id].end(), + ngh) == _in_graph[j.id].end()) { + _in_graph[j.id].emplace_back(ngh); + } + } + } + } } } } + _final_graph[id].clear(); - _nd--; + _in_graph[id].clear(); + + release_location(); _eager_done = true; + _data_compacted = false; return 0; } template void Index::update_in_graph() { - diskann::cout << "Updating in_graph....." << std::flush; + // diskann::cout << "Updating in_graph....."; for (unsigned i = 0; i < _in_graph.size(); i++) _in_graph[i].clear(); - for (unsigned i = 0; i < _final_graph.size(); + for (size_t i = 0; i < _final_graph.size(); i++) // copying to in-neighbor graph - - for (unsigned j = 0; j < _final_graph[i].size(); j++) { - if (std::find(_in_graph[_final_graph[i][j]].begin(), - _in_graph[_final_graph[i][j]].end(), - i) != _in_graph[_final_graph[i][j]].end()) - diskann::cout << "Duplicates found" << std::endl; - _in_graph[_final_graph[i][j]].emplace_back(i); - } - - size_t max_in, min_in, avg_in; - max_in = 0; - min_in = _max_points + 1; - avg_in = 0; - for (unsigned i = 0; i < _in_graph.size(); i++) { - avg_in += _in_graph[i].size(); - if (_in_graph[i].size() > max_in) - max_in = _in_graph[i].size(); - if ((_in_graph[i].size() < min_in) && (i != _ep)) - min_in = _in_graph[i].size(); - } - - diskann::cout << std::endl - << "Max in_degree = " << max_in - << "; Min in_degree = " << min_in << "; Average in_degree = " - << (float) (avg_in) / (float) (_nd + _num_frozen_pts) - << std::endl; + for (size_t j = 0; j < _final_graph[i].size(); j++) + _in_graph[_final_graph[i][j]].emplace_back((_u32) i); } // Do not call consolidate_deletes() if you have not locked _change_lock. // Returns number of live points left after consolidation + // proxy inserts all nghrs of deleted points + // original approach template size_t Index::consolidate_deletes(const Parameters ¶meters) { if (_eager_done) { - diskann::cout << "No consolidation required, eager deletes done" - << std::endl; + diskann::cout + << "In consolidate_deletes(), _eager_done is true. So exiting." + << std::endl; return 0; } - assert(!_consolidated_order); - assert(_can_delete); + diskann::cout << "Inside Index::consolidate_deletes()" << std::endl; + std::cout << "Empty slots size: " << _empty_slots.size() << " _nd: " << _nd + << " max_points: " << _max_points << std::endl; assert(_enable_tags); assert(_delete_set.size() <= _nd); assert(_empty_slots.size() + _nd == _max_points); @@ -1440,89 +1963,185 @@ namespace diskann { const unsigned maxc = parameters.Get("C"); const float alpha = parameters.Get("alpha"); - std::vector new_location; - new_location.resize(_max_points + _num_frozen_pts, - (unsigned) (_max_points + _num_frozen_pts)); - unsigned active = 0; - for (unsigned old = 0; old < _max_points + _num_frozen_pts; ++old) - if (_empty_slots.find(old) == _empty_slots.end() && - _delete_set.find(old) == _delete_set.end()) - new_location[old] = active++; - assert(active + _delete_set.size() == _max_points + _num_frozen_pts); - - tsl::robin_set candidate_set; - std::vector expanded_nghrs; - std::vector result; + _u64 total_pts = _max_points + _num_frozen_pts; + unsigned block_size = 1 << 10; + _s64 total_blocks = DIV_ROUND_UP(total_pts, block_size); - for (unsigned i = 0; i < _max_points + _num_frozen_pts; ++i) { - if (new_location[i] < _max_points + _num_frozen_pts) { - candidate_set.clear(); - expanded_nghrs.clear(); - result.clear(); - - bool modify = false; - for (auto ngh : _final_graph[i]) { - if (new_location[ngh] >= _max_points + _num_frozen_pts) { - modify = true; - - // Add outgoing links from - for (auto j : _final_graph[ngh]) - if (_delete_set.find(j) == _delete_set.end()) - candidate_set.insert(j); - } else { - candidate_set.insert(ngh); + auto start = std::chrono::high_resolution_clock::now(); +#pragma omp parallel for schedule(dynamic) + for (_s64 block = 0; block < total_blocks; ++block) { + tsl::robin_set candidate_set; + std::vector expanded_nghrs; + std::vector result; + + for (_s64 i = block * block_size; + i < (_s64)((block + 1) * block_size) && + i < (_s64)(_max_points + _num_frozen_pts); + i++) { + if ((_delete_set.find((_u32) i) == _delete_set.end()) && + (_empty_slots.find((_u32) i) == _empty_slots.end())) { + candidate_set.clear(); + expanded_nghrs.clear(); + result.clear(); + + bool modify = false; + for (auto ngh : _final_graph[(_u32) i]) { + if (_delete_set.find(ngh) != _delete_set.end()) { + modify = true; + + // Add outgoing links from + for (auto j : _final_graph[ngh]) + if (_delete_set.find(j) == _delete_set.end()) + candidate_set.insert(j); + } else { + candidate_set.insert(ngh); + } } - } + if (modify) { + for (auto j : candidate_set) { + expanded_nghrs.push_back( + Neighbor(j, + _distance->compare(_data + _aligned_dim * i, + _data + _aligned_dim * (size_t) j, + (unsigned) _aligned_dim), + true)); + } + + std::sort(expanded_nghrs.begin(), expanded_nghrs.end()); + occlude_list(expanded_nghrs, alpha, range, maxc, result); - if (modify) { - for (auto j : candidate_set) - expanded_nghrs.push_back( - Neighbor(j, - _distance->compare(_data + _aligned_dim * (size_t) i, - _data + _aligned_dim * (size_t) j, - (unsigned) _aligned_dim), - true)); - std::sort(expanded_nghrs.begin(), expanded_nghrs.end()); - occlude_list(expanded_nghrs, alpha, range, maxc, result); - - _final_graph[i].clear(); - for (auto j : result) { - if (j.id != i) - _final_graph[i].push_back(j.id); + _final_graph[(_u32) i].clear(); + for (auto j : result) { + if (j.id != (_u32) i && + (_delete_set.find(j.id) == _delete_set.end())) + _final_graph[(_u32) i].push_back(j.id); + } } } - } else - _final_graph[i].clear(); + } } if (_support_eager_delete) update_in_graph(); + for (auto iter : _delete_set) { + _empty_slots.insert(iter); + } _nd -= _delete_set.size(); - compact_data(new_location, active, _consolidated_order); + + _data_compacted = _delete_set.size() == 0; + + auto stop = std::chrono::high_resolution_clock::now(); + std::cout << "Time taken for consolidate_deletes() " + << std::chrono::duration_cast>( + stop - start) + .count() + << "s." << std::endl; + return _nd; } template - std::vector Index::get_new_location(unsigned &active) { - std::vector new_location; - new_location.resize(_max_points + _num_frozen_pts, - (unsigned) (_max_points + _num_frozen_pts)); - - for (unsigned old = 0; old < _max_points + _num_frozen_pts; ++old) - if (_empty_slots.find(old) == _empty_slots.end() && - _delete_set.find(old) == _delete_set.end()) - new_location[old] = active++; - assert(active + _delete_set.size() == _max_points + _num_frozen_pts); - - return new_location; + void Index::consolidate(Parameters ¶meters) { + consolidate_deletes(parameters); + compact_data(); + } + + template + void Index::compact_frozen_point() { + if (_nd < _max_points) { + if (_num_frozen_pts > 0) { + // set new _ep to be frozen point + _ep = (_u32) _nd; + if (!_final_graph[_max_points].empty()) { + for (unsigned i = 0; i < _nd; i++) + for (unsigned j = 0; j < _final_graph[i].size(); j++) + if (_final_graph[i][j] == _max_points) + _final_graph[i][j] = (_u32) _nd; + + _final_graph[_nd].clear(); + for (unsigned k = 0; k < _final_graph[_max_points].size(); k++) + _final_graph[_nd].emplace_back(_final_graph[_max_points][k]); + + _final_graph[_max_points].clear(); + if (_support_eager_delete) + update_in_graph(); + + memcpy((void *) (_data + (size_t) _aligned_dim * _nd), + _data + (size_t) _aligned_dim * _max_points, sizeof(T) * _dim); + memset((_data + (size_t) _aligned_dim * _max_points), 0, + sizeof(T) * _aligned_dim); + } + } + } + } + + template + void Index::compact_data_for_search() { + compact_data(); + compact_frozen_point(); } template - void Index::compact_data(std::vector new_location, - unsigned active, bool &mode) { + void Index::compact_data_for_insert() { + compact_data(); + + size_t max = 0, min = 1 << 30, total = 0, cnt = 0; + for (size_t i = 0; i < (_nd + _num_frozen_pts); i++) { + auto &pool = _final_graph[i]; + max = (std::max)(max, pool.size()); + min = (std::min)(min, pool.size()); + total += pool.size(); + if (pool.size() < 2) + cnt++; + } + if (min > max) + min = max; + if (_nd > 0) { + diskann::cout << "Index built with degree: max:" << max << " avg:" + << (float) total / (float) (_nd + _num_frozen_pts) + << " min:" << min << " count(deg<2):" << cnt << std::endl; + } + } + + template + void Index::compact_data() { + if (!_dynamic_index) + return; + + if (!_lazy_done && !_eager_done) + return; + + if (_data_compacted) { + diskann::cerr + << "Warning! Calling compact_data() when _data_compacted is true!" + << std::endl; + return; + } + + auto start = std::chrono::high_resolution_clock::now(); + auto fnstart = start; + + std::vector new_location = std::vector( + _max_points + _num_frozen_pts, (_u32) _max_points); + + _u32 new_counter = 0; + + for (_u32 old_counter = 0; old_counter < _max_points + _num_frozen_pts; + old_counter++) { + if (_location_to_tag.find(old_counter) != _location_to_tag.end()) { + new_location[old_counter] = new_counter; + new_counter++; + } + } + + auto stop = std::chrono::high_resolution_clock::now(); + std::cout << "Time taken for initial setup: " + << std::chrono::duration_cast>( + stop - start) + .count() + << "s." << std::endl; // If start node is removed, replace it. - assert(!mode); if (_delete_set.find(_ep) != _delete_set.end()) { std::cerr << "Replacing start node which has been deleted... " << std::flush; @@ -1541,20 +2160,42 @@ namespace diskann { __FUNCSIG__, __FILE__, __LINE__); } else { assert(_delete_set.find(_ep) == _delete_set.end()); - diskann::cout << "New start node is " << _ep << std::endl; } } - diskann::cout << "Re-numbering nodes and edges and consolidating data... " - << std::flush; - diskann::cout << "active = " << active << std::endl; - for (unsigned old = 0; old < _max_points + _num_frozen_pts; ++old) { - if (new_location[old] < - _max_points + _num_frozen_pts) { // If point continues to exist + start = std::chrono::high_resolution_clock::now(); + double copy_time = 0; + for (unsigned old = 0; old <= _max_points; ++old) { + if ((new_location[old] < _max_points) || + (old == _max_points)) { // If point continues to exist // Renumber nodes to compact the order for (size_t i = 0; i < _final_graph[old].size(); ++i) { - assert(new_location[_final_graph[old][i]] <= _final_graph[old][i]); + if (new_location[_final_graph[old][i]] > _final_graph[old][i]) { + std::stringstream sstream; + sstream << "Error in compact_data(). Found point: " << old + << " whose " << i << "th neighbor has new location " + << new_location[_final_graph[old][i]] + << " that is greater than its old location: " + << _final_graph[old][i]; + if (_delete_set.find(_final_graph[old][i]) != _delete_set.end()) { + sstream << std::endl + << " Point: " << old << " index: " << i + << " neighbor: " << _final_graph[old][i] + << " found in delete set of size: " << _delete_set.size() + << std::endl; + } else { + sstream << " Point: " << old + << " neighbor: " << _final_graph[old][i] + << " NOT found in delete set of size: " + << _delete_set.size() << std::endl; + } + print_delete_set(); + + diskann::cerr << sstream.str() << std::endl; + throw diskann::ANNException(sstream.str(), -1, __FUNCSIG__, + __FILE__, __LINE__); + } _final_graph[old][i] = new_location[_final_graph[old][i]]; } @@ -1565,6 +2206,7 @@ namespace diskann { } // Move the data and adj list to the correct position + auto c_start = std::chrono::high_resolution_clock::now(); if (new_location[old] != old) { assert(new_location[old] < old); _final_graph[new_location[old]].swap(_final_graph[old]); @@ -1574,58 +2216,79 @@ namespace diskann { (void *) (_data + _aligned_dim * (size_t) old), _aligned_dim * sizeof(T)); } + auto c_stop = std::chrono::high_resolution_clock::now(); + copy_time += std::chrono::duration_cast>( + c_stop - c_start) + .count(); + + } else { + _final_graph[old].clear(); } } - diskann::cout << "done." << std::endl; + stop = std::chrono::high_resolution_clock::now(); + std::cout << "Time taken for moving data around: " + << std::chrono::duration_cast>( + stop - start) + .count() + << "s. Of which copy_time: " << copy_time << "s." << std::endl; - diskann::cout << "Updating mapping between tags and ids... " << std::flush; - // Update the location pointed to by tag + start = std::chrono::high_resolution_clock::now(); _tag_to_location.clear(); - for (auto iter : _location_to_tag) + for (auto iter : _location_to_tag) { _tag_to_location[iter.second] = new_location[iter.first]; + } _location_to_tag.clear(); - for (auto iter : _tag_to_location) + for (auto iter : _tag_to_location) { _location_to_tag[iter.second] = iter.first; - diskann::cout << "done." << std::endl; + } - for (unsigned old = active; old < _max_points + _num_frozen_pts; ++old) + for (_u64 old = _nd; old < _max_points; ++old) { _final_graph[old].clear(); + } _delete_set.clear(); _empty_slots.clear(); - mode = true; - diskann::cout << "Consolidated the index" << std::endl; - - /* for(unsigned i = 0; i < _nd + _num_frozen_pts; i++){ - int flag = 0; - for(unsigned j = 0; j < _final_graph[i].size(); j++) - if(_final_graph[i][j] == i){ - diskann::cout << "Self loop found just after compacting inside the - function" << std::endl; - flag = 1; - break; - } - if(flag == 1) - break; - } */ + for (_u32 i = _nd; i < _max_points; i++) { + _empty_slots.insert(i); + } + + _lazy_done = false; + _eager_done = false; + _data_compacted = true; + stop = std::chrono::high_resolution_clock::now(); + std::cout << "Time taken for tag<->index consolidation: " + << std::chrono::duration_cast>( + stop - start) + .count() + << "s." << std::endl; + std::cout << "Time taken for compact_data(): " + << std::chrono::duration_cast>( + stop - fnstart) + .count() + << "s." << std::endl; } // Do not call reserve_location() if you have not locked _change_lock. // It is not thread safe. template - unsigned Index::reserve_location() { - assert(_nd < _max_points); - + int Index::reserve_location() { + LockGuard guard(_change_lock); + if (_nd >= _max_points) { + return -1; + } unsigned location; - if (_consolidated_order || _compacted_order) + if (_data_compacted) { location = (unsigned) _nd; - else { + _empty_slots.erase(location); + } else { + // no need of delete_lock here, _change_lock will ensure no other thread + // executes this block of code assert(_empty_slots.size() != 0); assert(_empty_slots.size() + _nd == _max_points); auto iter = _empty_slots.begin(); location = *iter; _empty_slots.erase(iter); - _delete_set.erase(iter); + _delete_set.erase(location); } ++_nd; @@ -1633,75 +2296,179 @@ namespace diskann { } template - void Index::readjust_data(unsigned _num_frozen_pts) { - if (_num_frozen_pts > 0) { - if (_final_graph[_max_points].empty()) { - diskann::cout << "Readjusting data to correctly position frozen point" - << std::endl; - for (unsigned i = 0; i < _nd; i++) - for (unsigned j = 0; j < _final_graph[i].size(); j++) - if (_final_graph[i][j] >= _nd) - _final_graph[i][j] = - (unsigned) (_max_points + (_final_graph[i][j] - _nd)); - for (unsigned i = 0; i < _num_frozen_pts; i++) { - for (unsigned k = 0; k < _final_graph[_nd + i].size(); k++) - _final_graph[_max_points + i].emplace_back( - _final_graph[_nd + i][k]); - _final_graph[_nd + i].clear(); - } + void Index::reposition_point(unsigned old_location, + unsigned new_location) { + for (unsigned i = 0; i < _nd; i++) + for (unsigned j = 0; j < _final_graph[i].size(); j++) + if (_final_graph[i][j] == old_location) + _final_graph[i][j] = (unsigned) new_location; - if (_support_eager_delete) - update_in_graph(); + _final_graph[new_location].clear(); + for (unsigned k = 0; k < _final_graph[_nd].size(); k++) + _final_graph[new_location].emplace_back(_final_graph[old_location][k]); - diskann::cout << "Finished updating graph, updating data now" - << std::endl; - for (unsigned i = 0; i < _num_frozen_pts; i++) { - memcpy((void *) (_data + (size_t) _aligned_dim * (_max_points + i)), - _data + (size_t) _aligned_dim * (_nd + i), - sizeof(float) * _dim); - memset((_data + (size_t) _aligned_dim * (_nd + i)), 0, - sizeof(float) * _aligned_dim); - } - diskann::cout << "Readjustment done" << std::endl; - } - } else - diskann::cout << "No frozen points. No re-adjustment required" - << std::endl; + _final_graph[old_location].clear(); + + if (_support_eager_delete) { + update_in_graph(); + } + memcpy((void *) (_data + (size_t) _aligned_dim * new_location), + _data + (size_t) _aligned_dim * old_location, + sizeof(T) * _aligned_dim); + memset((_data + (size_t) _aligned_dim * old_location), 0, + sizeof(T) * _aligned_dim); + } + + template + void Index::reposition_frozen_point_to_end() { + if (_num_frozen_pts == 0) + return; + + if (_nd == _max_points) { + diskann::cout + << "Not repositioning frozen point as it is already at the end." + << std::endl; + return; + } + reposition_point(_nd, _max_points); + _ep = (_u32) _max_points; + } + + template + void Index::resize(uint32_t new_max_points) { + // TODO: Check if the _change_lock and _update_lock are both locked. + + auto start = std::chrono::high_resolution_clock::now(); + assert(_empty_slots.size() == + 0); // should not resize if there are empty slots. +#ifndef _WINDOWS + T *new_data; + /* alloc_aligned((void **) &new_data, + (new_max_points + 1) * _aligned_dim * sizeof(T), + 8 * sizeof(T)); + memcpy(new_data, _data, (_max_points + 1) * _aligned_dim * sizeof(T)); + aligned_free(_data); + _data = new_data; + */ + realloc_aligned((void **) &_data, (void **) &new_data, + (_max_points + 1) * _aligned_dim * sizeof(T), + (new_max_points + 1) * _aligned_dim * sizeof(T), + 8 * sizeof(T)); +#else + realloc_aligned((void **) &_data, + (new_max_points + 1) * _aligned_dim * sizeof(T), + 8 * sizeof(T)); +#endif + _final_graph.resize(new_max_points + 1); + _locks = std::vector(new_max_points + 1); + if (_support_eager_delete) { + _in_graph.resize(new_max_points + 1); + _locks_in = std::vector(new_max_points + 1); + } + + reposition_point(_max_points, new_max_points); + _max_points = new_max_points; + _ep = new_max_points; + + for (_u32 i = _nd; i < _max_points; i++) { + _empty_slots.insert(i); + } + + auto stop = std::chrono::high_resolution_clock::now(); + diskann::cout << "Resizing took: " + << std::chrono::duration(stop - start).count() << "s" + << std::endl; + } + + template + void Index::printTagToLocation() { + std::shared_lock lock(_tag_lock); + + std::cout << "Thread: " << std::this_thread::get_id() + << " _tag_to_location: " << std::endl; + for (auto tl : _tag_to_location) { + std::cout << "(" << tl.first << "," << tl.second << "),"; + } + std::cout << std::endl + << "Thread: " << std::this_thread::get_id() + << " _location_to_tag: " << std::endl; + for (auto lt : _location_to_tag) { + std::cout << "(" << lt.first << "," << lt.second << "),"; + } + std::cout << std::endl; } template int Index::insert_point(const T *point, const Parameters ¶meters, - std::vector & pool, - std::vector & tmp, - tsl::robin_set &visited, - vecNgh &cut_graph, const TagT tag) { + const TagT tag) { + std::shared_lock lock(_update_lock); unsigned range = parameters.Get("R"); - assert(_has_built); + // assert(_has_built); + std::vector pool; + std::vector tmp; + tsl::robin_set visited; - LockGuard guard(_change_lock); - if (_enable_tags && - (_tag_to_location.find(tag) != _tag_to_location.end())) { - std::cerr << "Entry with the tag " << tag << " exists already" - << std::endl; - return -1; - } - if (_nd == _max_points) { - std::cerr << "Can not insert, reached maximum(" << _max_points - << ") points." << std::endl; - return -2; + { + std::shared_lock lock(_tag_lock); + std::shared_lock tsl(_tag_lock); + if (_enable_tags && + (_tag_to_location.find(tag) != _tag_to_location.end())) { + // TODO! This is a repeat of lazy_delete, but we can't call + // that function because we are taking many locks here. Hence + // the repeated code. + tsl.unlock(); + std::unique_lock tul(_tag_lock); + std::unique_lock tdl(_delete_lock); + _lazy_done = true; + _delete_set.insert(_tag_to_location[tag]); + _location_to_tag.erase(_tag_to_location[tag]); + _tag_to_location.erase(tag); + } } auto location = reserve_location(); - _tag_to_location[tag] = location; - _location_to_tag[location] = tag; + if (location == -1) { + std::cout << "Thread: " << std::this_thread::get_id() + << " location == -1. Waiting for unique_lock. " << std::endl + << std::flush; + lock.unlock(); + std::unique_lock growth_lock(_update_lock); + + std::cout << "Thread: " << std::this_thread::get_id() + << " Obtained unique_lock. " << std::endl; + if (_nd >= _max_points) { + auto new_max_points = (size_t)(_max_points * INDEX_GROWTH_FACTOR); + diskann::cerr << "Thread: " << std::this_thread::get_id() + << ": Increasing _max_points from " << _max_points + << " to " << new_max_points << " _nd is: " << _nd + << std::endl; + resize(new_max_points); + } + growth_lock.unlock(); + lock.lock(); + location = reserve_location(); + // TODO: Consider making this a while/do_while loop so that we retry + // instead of terminating. + if (location == -1) { + throw diskann::ANNException( + "Cannot reserve location even after expanding graph. Terminating.", + -1, __FUNCSIG__, __FILE__, __LINE__); + } + } + + { + std::unique_lock lock(_tag_lock); + + _tag_to_location[tag] = location; + _location_to_tag[location] = tag; + } auto offset_data = _data + (size_t) _aligned_dim * location; - memset((void *) offset_data, 0, sizeof(float) * _aligned_dim); - memcpy((void *) offset_data, point, sizeof(float) * _dim); + memset((void *) offset_data, 0, sizeof(T) * _aligned_dim); + memcpy((void *) offset_data, point, sizeof(T) * _dim); pool.clear(); tmp.clear(); - cut_graph.clear(); visited.clear(); std::vector pruned_list; unsigned Lindex = parameters.Get("L"); @@ -1710,32 +2477,45 @@ namespace diskann { get_expanded_nodes(location, Lindex, init_ids, pool, visited); for (unsigned i = 0; i < pool.size(); i++) - if (pool[i].id == location) { + if (pool[i].id == (unsigned) location) { pool.erase(pool.begin() + i); - visited.erase(location); + visited.erase((unsigned) location); break; } prune_neighbors(location, pool, parameters, pruned_list); - assert(_final_graph.size() == _max_points + _num_frozen_pts); - for (unsigned i = 0; i < _final_graph[location].size(); i++) - _in_graph[_final_graph[location][i]].erase( - std::remove(_in_graph[_final_graph[location][i]].begin(), - _in_graph[_final_graph[location][i]].end(), location), - _in_graph[_final_graph[location][i]].end()); + if (_support_eager_delete) { + for (unsigned i = 0; i < _final_graph[location].size(); i++) { + { + LockGuard guard(_locks_in[_final_graph[location][i]]); + _in_graph[_final_graph[location][i]].erase( + std::remove(_in_graph[_final_graph[location][i]].begin(), + _in_graph[_final_graph[location][i]].end(), location), + _in_graph[_final_graph[location][i]].end()); + } + } + } _final_graph[location].clear(); - _final_graph[location].reserve(range); + _final_graph[location].shrink_to_fit(); + _final_graph[location].reserve((_u64)(range * SLACK_FACTOR * 1.05)); + + if (pruned_list.empty()) { + std::cout << "Thread: " << std::this_thread::get_id() << "Tag id: " << tag + << " pruned_list.size(): " << pruned_list.size() << std::endl; + } assert(!pruned_list.empty()); - for (auto link : pruned_list) { - _final_graph[location].emplace_back(link); - if (_support_eager_delete) - if (std::find(_in_graph[link].begin(), _in_graph[link].end(), - location) == _in_graph[link].end()) { + { + LockGuard guard(_locks[location]); + for (auto link : pruned_list) { + _final_graph[location].emplace_back(link); + if (_support_eager_delete) { + LockGuard guard(_locks_in[link]); _in_graph[link].emplace_back(location); } + } } assert(_final_graph[location].size() <= range); @@ -1743,77 +2523,209 @@ namespace diskann { inter_insert(location, pruned_list, parameters, 1); else inter_insert(location, pruned_list, parameters, 0); - return 0; } template - int Index::disable_delete(const Parameters ¶meters, - const bool consolidate) { - LockGuard guard(_change_lock); - if (!_can_delete) { - diskann::cerr << "Delete not currently enabled" << std::endl; - return -1; - } - if (!_enable_tags) { - diskann::cerr << "Point tag array not instantiated" << std::endl; - throw diskann::ANNException("Point tag array not instantiated", -1, - __FUNCSIG__, __FILE__, __LINE__); - } - if (_eager_done) { - diskann::cout << "#Points after eager_delete : " << _nd + _num_frozen_pts - << std::endl; - if (_tag_to_location.size() != _nd) { - diskann::cerr << "Tags to points array wrong sized" << std::endl; - return -2; - } - } else if (_tag_to_location.size() + _delete_set.size() != _nd) { - diskann::cerr << "Tags to points array wrong sized" << std::endl; + int Index::lazy_delete(const TagT &tag) { + if ((_eager_done) && (!_data_compacted)) { + std::cerr << "Eager delete requests were issued but data was not " + "compacted, cannot proceed with lazy_deletes" + << std::endl; return -2; } - if (_eager_done) { - if (_location_to_tag.size() != _nd) { - diskann::cerr << "Points to tags array wrong sized" << std::endl; - return -3; + std::shared_lock lock(_update_lock); + _lazy_done = true; + + { + std::shared_lock l(_tag_lock); + + if (_tag_to_location.find(tag) == _tag_to_location.end()) { + diskann::cerr << "Delete tag not found" << std::endl; + return -1; } - } else if (_location_to_tag.size() + _delete_set.size() != _nd) { - diskann::cerr << "Points to tags array wrong sized" << std::endl; - return -3; + assert(_tag_to_location[tag] < _max_points); } - if (consolidate) { - auto nd = consolidate_deletes(parameters); - if (nd >= 0) - diskann::cout << "#Points after consolidation: " << nd + _num_frozen_pts - << std::endl; + { + std::unique_lock l(_delete_lock); + std::shared_lock tl(_tag_lock); + _delete_set.insert(_tag_to_location[tag]); + } + + { + std::unique_lock l(_tag_lock); + _location_to_tag.erase(_tag_to_location[tag]); + _tag_to_location.erase(tag); } - _can_delete = false; return 0; } + // TODO: Check if this function needs a shared_lock on _tag_lock. template - int Index::delete_point(const TagT tag) { - if ((_eager_done) && (!_compacted_order)) { + int Index::lazy_delete(const tsl::robin_set &tags, + std::vector & failed_tags) { + if (failed_tags.size() > 0) { + std::cerr << "failed_tags should be passed as an empty list" << std::endl; + return -3; + } + if ((_eager_done) && (!_data_compacted)) { diskann::cout << "Eager delete requests were issued but data was not " "compacted, cannot proceed with lazy_deletes" << std::endl; - return -1; + return -2; } - LockGuard guard(_change_lock); - if (_tag_to_location.find(tag) == _tag_to_location.end()) { - diskann::cerr << "Delete tag not found" << std::endl; + std::shared_lock lock(_update_lock); + _lazy_done = true; + + for (auto tag : tags) { + // assert(_tag_to_location[tag] < _max_points); + if (_tag_to_location.find(tag) == _tag_to_location.end()) { + failed_tags.push_back(tag); + } else { + _delete_set.insert(_tag_to_location[tag]); + _location_to_tag.erase(_tag_to_location[tag]); + _tag_to_location.erase(tag); + } + } + + return 0; + } + + template + int Index::extract_data( + T *ret_data, std::unordered_map &tag_to_location) { + if (!_data_compacted) { + std::cerr + << "Error! Data not compacted. Cannot give access to private data." + << std::endl; return -1; } - assert(_tag_to_location[tag] < _max_points); - _delete_set.insert(_tag_to_location[tag]); - _location_to_tag.erase(_tag_to_location[tag]); - _tag_to_location.erase(tag); + std::memset(ret_data, 0, (size_t) _aligned_dim * _nd * sizeof(T)); + std::memcpy(ret_data, _data, (size_t)(_aligned_dim) *_nd * sizeof(T)); + tag_to_location = _tag_to_location; return 0; } + template + void Index::get_location_to_tag( + std::unordered_map &ret_loc_to_tag) { + ret_loc_to_tag = _location_to_tag; + } + + template + bool Index::hasIndexBeenSaved() { + return _is_saved; + } + + template + void Index::get_active_tags(tsl::robin_set &active_tags) { + active_tags.clear(); + for (auto iter : _tag_to_location) { + active_tags.insert(iter.first); + } + } + + template + void Index::print_delete_set() const { + diskann::cout << "Delete set is of size: " << _delete_set.size() + << std::endl; + std::vector sorted_delete_set; + for (auto i : _delete_set) { + sorted_delete_set.push_back(i); + } + std::sort(sorted_delete_set.begin(), sorted_delete_set.end()); + diskann::cout << "Sorted Delete set is of size: " << _delete_set.size() + << std::endl; + + // TODO: Debugging ONLY + size_t counter = 60000; + std::vector<_u32> missing_ids; + for (auto i : sorted_delete_set) { + if (i != counter) { + missing_ids.push_back(i); + } + counter++; + } + diskann::cout << "Missing ids in delete set for the 60k-80k case:" + << std::endl; + for (auto i : missing_ids) { + diskann::cout << i << ","; + } + diskann::cout << std::endl; + } + template + void Index::are_deleted_points_in_graph() const { + std::vector> start_end_pairs; + for (size_t i = 0; i < _nd; i++) { + for (size_t j = 0; j < _final_graph[i].size(); j++) { + if (_delete_set.find(_final_graph[i][j]) != _delete_set.end()) { + start_end_pairs.push_back( + std::pair<_u32, _u32>(i, _final_graph[i][j])); + } + } + } + + if (start_end_pairs.size() > 0) { + diskann::cout << "Found " << start_end_pairs.size() + << " references to deleted vertices" << std::endl; + std::sort(start_end_pairs.begin(), start_end_pairs.end(), + [](const std::pair<_u32, _u32> &val1, + const std::pair<_u32, _u32> &val2) { + return val1.first < val2.first; + }); + diskann::cout << "Min source id: " << start_end_pairs[0].first + << " Max source id: " + << start_end_pairs[start_end_pairs.size() - 1].first + << std::endl; + std::sort(start_end_pairs.begin(), start_end_pairs.end(), + [](const std::pair<_u32, _u32> &val1, + const std::pair<_u32, _u32> &val2) { + return val1.second < val2.second; + }); + diskann::cout << "Min target id: " << start_end_pairs[0].second + << " Max target id: " + << start_end_pairs[start_end_pairs.size() - 1].second + << std::endl; + } + } + + template + void Index::print_status() const { + diskann::cout << "------------------- Index object: " << (uint64_t) this + << " -------------------" << std::endl; + diskann::cout << "Number of points: " << _nd << std::endl; + diskann::cout << "Graph size: " << _final_graph.size() << std::endl; + diskann::cout << "Location to tag size: " << _location_to_tag.size() + << std::endl; + diskann::cout << "Tag to location size: " << _tag_to_location.size() + << std::endl; + diskann::cout << "Number of empty slots: " << _empty_slots.size() + << std::endl; + // print_delete_set(); + // are_deleted_points_in_graph(); + diskann::cout << std::boolalpha + << "Data compacted: " << this->_data_compacted + << " Lazy done: " << this->_lazy_done + << " Eager done: " << this->_eager_done << std::endl; + diskann::cout << "---------------------------------------------------------" + "------------" + << std::endl; + } + + /* Internals of the library */ // EXPORTS - template DISKANN_DLLEXPORT class Index; - template DISKANN_DLLEXPORT class Index; - template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; + template DISKANN_DLLEXPORT class Index; } // namespace diskann diff --git a/src/linux_aligned_file_reader.cpp b/src/linux_aligned_file_reader.cpp index 69eae9b60e..c09c15dc6a 100644 --- a/src/linux_aligned_file_reader.cpp +++ b/src/linux_aligned_file_reader.cpp @@ -1,8 +1,7 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. #include "linux_aligned_file_reader.h" +#include #include #include #include @@ -19,7 +18,7 @@ namespace { #ifdef DEBUG for (auto &req : read_reqs) { assert(IS_ALIGNED(req.len, 512)); - // std::cout << "request:"<= req.len); @@ -56,8 +55,8 @@ namespace { if (ret != (int64_t) n_ops) { std::cerr << "io_submit() failed; returned " << ret << ", expected=" << n_ops << ", ernno=" << errno << "=" - << ::strerror(-ret) << ", try #" << n_tries + 1; - std::cout << "ctx: " << ctx << "\n"; + << ::strerror((int) -ret) << ", try #" << n_tries + 1; + diskann::cout << "ctx: " << ctx << "\n"; exit(-1); } else { // wait on io_getevents @@ -67,29 +66,16 @@ namespace { if (ret != (int64_t) n_ops) { std::cerr << "io_getevents() failed; returned " << ret << ", expected=" << n_ops << ", ernno=" << errno << "=" - << ::strerror(-ret) << ", try #" << n_tries + 1; + << ::strerror((int) -ret) << ", try #" << n_tries + 1; exit(-1); } else { break; } } } - // disabled since req.buf could be an offset into another buf - /* - for (auto &req : read_reqs) { - // corruption check - assert(malloc_usable_size(req.buf) >= req.len); - } - */ - } - - /* - for(unsigned i=0;i<64;i++){ - std::cout << *((unsigned*)read_reqs[0].buf + i) << " "; } - std::cout << std::endl;*/ } -} +} // namespace LinuxAlignedFileReader::LinuxAlignedFileReader() { this->file_desc = -1; @@ -128,8 +114,6 @@ void LinuxAlignedFileReader::register_thread() { auto my_id = std::this_thread::get_id(); std::unique_lock lk(ctx_mut); if (ctx_map.find(my_id) != ctx_map.end()) { - std::cerr << "multiple calls to register_thread from the same thread" - << std::endl; return; } io_context_t ctx = 0; @@ -141,8 +125,6 @@ void LinuxAlignedFileReader::register_thread() { std::cerr << "io_setup() failed; returned " << ret << ", errno=" << errno << ":" << ::strerror(errno) << std::endl; } else { - std::cerr << "allocating ctx: " << ctx << " to thread-id:" << my_id - << std::endl; ctx_map[my_id] = ctx; } lk.unlock(); @@ -159,16 +141,40 @@ void LinuxAlignedFileReader::deregister_thread() { // assert(ret == 0); lk.lock(); ctx_map.erase(my_id); - std::cerr << "returned ctx from thread-id:" << my_id << std::endl; + // std::cerr << "returned ctx from thread-id:" << my_id << std::endl; + lk.unlock(); +} + +void LinuxAlignedFileReader::deregister_all_threads() { + std::unique_lock lk(ctx_mut); + + for (auto &iter : ctx_map) { + io_context_t ctx = iter.second; + io_destroy(ctx); + // assert(ret == 0); + // std::cerr << "returned ctx from thread-id:" << iter.first << + // std::endl; + } + ctx_map.clear(); lk.unlock(); } -void LinuxAlignedFileReader::open(const std::string &fname) { - int flags = O_DIRECT | O_RDONLY | O_LARGEFILE; +void LinuxAlignedFileReader::open(const std::string &fname, + bool enable_writes = false, + bool enable_create = false) { + int flags = O_DIRECT | O_LARGEFILE; + if (!enable_writes) { + flags |= O_RDONLY; + } else { + flags |= O_RDWR; + } + if (enable_create) { + flags |= O_CREAT; + } this->file_desc = ::open(fname.c_str(), flags); // error checks assert(this->file_desc != -1); - std::cerr << "Opened file : " << fname << std::endl; + // std::cerr << "Opened file : " << fname << std::endl; } void LinuxAlignedFileReader::close() { @@ -185,9 +191,46 @@ void LinuxAlignedFileReader::close() { void LinuxAlignedFileReader::read(std::vector &read_reqs, io_context_t &ctx, bool async) { assert(this->file_desc != -1); - //#pragma omp critical - // std::cout << "thread: " << std::this_thread::get_id() << ", crtx: " << - // ctx - //<< "\n"; execute_io(ctx, this->file_desc, read_reqs); + if (async == true) { + std::cerr << "async only supported in Windows for now." << std::endl; + } +} + +void LinuxAlignedFileReader::sequential_write(AlignedRead &write_req, + IOContext & ctx) { + assert(this->file_desc != -1); + // check inputs + assert(IS_ALIGNED(write_req.offset, 4096)); + assert(IS_ALIGNED(write_req.buf, 4096)); + assert(IS_ALIGNED(write_req.len, 4096)); + + // create write request + io_event_t evt; + struct iocb cb; + iocb_t * cbs = &cb; + io_prep_pwrite(&cb, this->file_desc, write_req.buf, write_req.len, + write_req.offset); + + uint64_t n_tries = 0; + // issue reads + int64_t ret = io_submit(ctx, (int64_t) 1, &cbs); + // if requests didn't get accepted + if (ret != (int64_t) 1) { + std::cerr << "io_submit() failed; returned " << ret << ", expected=" << 1 + << ", ernno=" << errno << "=" << ::strerror((int) -ret) + << ", try #" << n_tries + 1; + diskann::cout << "ctx: " << ctx << "\n"; + exit(-1); + } else { + // wait on io_getevents + ret = io_getevents(ctx, (int64_t) 1, (int64_t) 1, &evt, nullptr); + // if requests didn't complete + if (ret != (int64_t) 1) { + std::cerr << "io_getevents() failed; returned " << ret + << ", expected=" << 1 << ", ernno=" << errno << "=" + << ::strerror((int) -ret) << ", try #" << n_tries + 1; + exit(-1); + } + } } diff --git a/src/math_utils.cpp b/src/math_utils.cpp index de63d93241..bdb3b51b5c 100644 --- a/src/math_utils.cpp +++ b/src/math_utils.cpp @@ -152,7 +152,10 @@ namespace math_utils { if (!is_norm_given_for_pts) pts_norms_squared = new float[num_points]; - size_t PAR_BLOCK_SIZE = num_points; + size_t PAR_BLOCK_SIZE = std::min((size_t) 1 << 23, num_points); + // (num_points > 1 << 20) ? 1 << 13 : (num_points / 16); + + // size_t PAR_BLOCK_SIZE = num_points; size_t N_BLOCKS = (num_points % PAR_BLOCK_SIZE) == 0 ? (num_points / PAR_BLOCK_SIZE) : (num_points / PAR_BLOCK_SIZE) + 1; @@ -204,9 +207,6 @@ namespace math_utils { void process_residuals(float* data_load, size_t num_points, size_t dim, float* cur_pivot_data, size_t num_centers, uint32_t* closest_centers, bool to_subtract) { - diskann::cout << "Processing residuals of " << num_points << " points in " - << dim << " dimensions using " << num_centers << " centers " - << std::endl; #pragma omp parallel for schedule(static, 8192) for (int64_t n_iter = 0; n_iter < (_s64) num_points; n_iter++) { for (size_t d_iter = 0; d_iter < dim; d_iter++) { @@ -334,13 +334,15 @@ namespace kmeans { residual = lloyds_iter(data, num_points, dim, centers, num_centers, docs_l2sq, closest_docs, closest_center); - diskann::cout << "Lloyd's iter " << i - << " dist_sq residual: " << residual << std::endl; + // diskann::cout << "Lloyd's iter " << i + // << " dist_sq residual: " << residual << std::endl; - if (((i != 0) && ((old_residual - residual) / residual) < 0.00001) || + if (((i != 0) && + ((double) ((old_residual - residual) / residual)) < 0.00001) || (residual < std::numeric_limits::epsilon())) { - diskann::cout << "Residuals unchanged: " << old_residual << " becomes " - << residual << ". Early termination." << std::endl; + // diskann::cout << "Residuals unchanged: " << old_residual << " becomes + // " + // << residual << ". Early termination." << std::endl; break; } } @@ -359,12 +361,9 @@ namespace kmeans { float* pivot_data, size_t num_centers) { // pivot_data = new float[num_centers * dim]; - std::vector picked; - diskann::cout << "Selecting " << num_centers << " pivots from " - << num_points << " points using "; - std::random_device rd; - auto x = rd(); - diskann::cout << "random seed " << x << std::endl; + std::vector picked; + std::random_device rd; + auto x = rd(); std::mt19937 generator(x); std::uniform_int_distribution distribution(0, num_points - 1); @@ -391,12 +390,9 @@ namespace kmeans { return; } - std::vector picked; - diskann::cout << "Selecting " << num_centers << " pivots from " - << num_points << " points using "; - std::random_device rd; - auto x = rd(); - diskann::cout << "random seed " << x << ": " << std::flush; + std::vector picked; + std::random_device rd; + auto x = rd(); std::mt19937 generator(x); std::uniform_real_distribution<> distribution(0, 1); std::uniform_int_distribution int_dist(0, num_points - 1); @@ -423,7 +419,7 @@ namespace kmeans { double sum = 0; for (size_t i = 0; i < num_points; i++) { - sum = sum + dist[i]; + sum = sum + (double) dist[i]; } if (sum == 0) sum_flag = true; @@ -433,11 +429,12 @@ namespace kmeans { double prefix_sum = 0; for (size_t i = 0; i < (num_points); i++) { tmp_pivot = i; - if (dart_val >= prefix_sum && dart_val < prefix_sum + dist[i]) { + if (dart_val >= prefix_sum && + dart_val < prefix_sum + (double) dist[i]) { break; } - prefix_sum += dist[i]; + prefix_sum += (double) dist[i]; } if (std::find(picked.begin(), picked.end(), tmp_pivot) != picked.end() && @@ -454,10 +451,10 @@ namespace kmeans { data + tmp_pivot * dim, dim)); } num_picked++; - if (num_picked % 32 == 0) - diskann::cout << "." << std::flush; + // if (num_picked % 32 == 0) + // diskann::cout << "." << std::flush; } - diskann::cout << "done." << std::endl; + // diskann::cout << "done." << std::endl; delete[] dist; } diff --git a/src/partition_and_pq.cpp b/src/partition_and_pq.cpp index 9da49b2203..1918996be0 100644 --- a/src/partition_and_pq.cpp +++ b/src/partition_and_pq.cpp @@ -15,11 +15,14 @@ #include #include #include + #include "logger.h" +#include "cached_io.h" #include "exceptions.h" #include "index.h" #include "parameters.h" #include "tsl/robin_set.h" +#include "tcmalloc/malloc_extension.h" #include "utils.h" #include @@ -35,13 +38,16 @@ #include #endif -#define BLOCK_SIZE 5000000 +// For fresh index, keep it at 1m instead of 5m. +#define MAX_BLOCK_SIZE 1000000 template void gen_random_slice(const std::string base_file, - const std::string output_prefix, double sampling_rate) { + const std::string output_prefix, double sampling_rate, + size_t offset) { _u64 read_blk_size = 64 * 1024 * 1024; - cached_ifstream base_reader(base_file.c_str(), read_blk_size); + cached_ifstream base_reader(base_file.c_str(), read_blk_size, + (uint32_t) offset); std::ofstream sample_writer(std::string(output_prefix + "_data.bin").c_str(), std::ios::binary); std::ofstream sample_id_writer( @@ -75,13 +81,19 @@ void gen_random_slice(const std::string base_file, for (size_t i = 0; i < npts; i++) { base_reader.read((char *) cur_row.get(), sizeof(T) * nd); float sample = distribution(generator); - if (sample < sampling_rate) { + if (sample < (float) sampling_rate) { sample_writer.write((char *) cur_row.get(), sizeof(T) * nd); uint32_t cur_i_u32 = (_u32) i; sample_id_writer.write((char *) &cur_i_u32, sizeof(uint32_t)); num_sampled_pts_u32++; } } + + if (num_sampled_pts_u32 == 0) { + // We have read something from file, so write it. + sample_writer.write((char *) cur_row.get(), sizeof(T) * nd); + num_sampled_pts_u32 = 1; + } sample_writer.seekp(0, std::ios::beg); sample_writer.write((char *) &num_sampled_pts_u32, sizeof(uint32_t)); sample_id_writer.seekp(0, std::ios::beg); @@ -101,6 +113,14 @@ void gen_random_slice(const std::string base_file, * Reimplement using gen_random_slice(const T* inputdata,...) ************************************/ +template +void gen_random_slice(const std::string data_file, double p_val, + std::unique_ptr &sampled_data, + size_t &slice_size, size_t &ndims) { + float *sampled_ptr = sampled_data.get(); + gen_random_slice(data_file, p_val, sampled_ptr, slice_size, ndims); + sampled_data.reset(sampled_ptr); +} template void gen_random_slice(const std::string data_file, double p_val, float *&sampled_data, size_t &slice_size, size_t &ndims) { @@ -130,7 +150,7 @@ void gen_random_slice(const std::string data_file, double p_val, for (size_t i = 0; i < npts; i++) { base_reader.read((char *) cur_vector_T.get(), ndims * sizeof(T)); float rnd_val = distribution(generator); - if (rnd_val < p_val) { + if (rnd_val < (float) p_val) { std::vector cur_vector_float; for (size_t d = 0; d < ndims; d++) cur_vector_float.push_back(cur_vector_T[d]); @@ -138,7 +158,14 @@ void gen_random_slice(const std::string data_file, double p_val, } } slice_size = sampled_vectors.size(); + if (slice_size == 0) { + slice_size = 1; + std::vector cur_vector_float(cur_vector_T.get(), + cur_vector_T.get() + ndims); + sampled_vectors.push_back(cur_vector_float); + } sampled_data = new float[slice_size * ndims]; + for (size_t i = 0; i < slice_size; i++) { for (size_t j = 0; j < ndims; j++) { sampled_data[i * ndims + j] = sampled_vectors[i][j]; @@ -166,15 +193,23 @@ void gen_random_slice(const T *inputdata, size_t npts, size_t ndims, for (size_t i = 0; i < npts; i++) { cur_vector_T = inputdata + ndims * i; float rnd_val = distribution(generator); - if (rnd_val < p_val) { + if (rnd_val < (float) p_val) { std::vector cur_vector_float; for (size_t d = 0; d < ndims; d++) cur_vector_float.push_back(cur_vector_T[d]); sampled_vectors.push_back(cur_vector_float); } } + // If we got zero sample vectors, simply add the first vector + // as the sample vector. slice_size = sampled_vectors.size(); + if (slice_size == 0) { + slice_size = 1; + std::vector cur_vector_float(inputdata, inputdata + ndims); + sampled_vectors.push_back(cur_vector_float); + } sampled_data = new float[slice_size * ndims]; + for (size_t i = 0; i < slice_size; i++) { for (size_t j = 0; j < ndims; j++) { sampled_data[i * ndims + j] = sampled_vectors[i][j]; @@ -187,12 +222,33 @@ void gen_random_slice(const T *inputdata, size_t npts, size_t ndims, // num_pq_chunks (if it divides dimension, else rounded) chunks, and runs // k-means in each chunk to compute the PQ pivots and stores in bin format in // file pq_pivots_path as a s num_centers*dim floating point binary file +template +int generate_pq_pivots(const std::unique_ptr &passed_train_data, + size_t num_train, unsigned dim, unsigned num_centers, + unsigned num_pq_chunks, unsigned max_k_means_reps, + std::string pq_pivots_path) { + std::unique_ptr train_float = + std::make_unique(num_train * (size_t)(dim)); + float *flt_ptr = train_float.get(); + T * T_ptr = passed_train_data.get(); + + for (_u64 i = 0; i < num_train; i++) { + for (_u64 j = 0; j < (_u64) dim; j++) { + flt_ptr[i * (_u64) dim + j] = (float) T_ptr[i * (_u64) dim + j]; + } + } + if (generate_pq_pivots(flt_ptr, num_train, dim, num_centers, num_pq_chunks, + max_k_means_reps, pq_pivots_path) != 0) + return -1; + return 0; +} + int generate_pq_pivots(const float *passed_train_data, size_t num_train, unsigned dim, unsigned num_centers, unsigned num_pq_chunks, unsigned max_k_means_reps, std::string pq_pivots_path) { if (num_pq_chunks > dim) { - diskann::cout << " Error: number of chunks more than dimension" + diskann::cerr << " Error: number of chunks more than dimension" << std::endl; return -1; } @@ -205,23 +261,12 @@ int generate_pq_pivots(const float *passed_train_data, size_t num_train, for (uint64_t i = 0; i < num_train; i++) { for (uint64_t j = 0; j < dim; j++) { if (passed_train_data[i * dim + j] != train_data[i * dim + j]) - diskann::cout << "error in copy" << std::endl; + diskann::cerr << "error in copy" << std::endl; } } std::unique_ptr full_pivot_data; - if (file_exists(pq_pivots_path)) { - size_t file_dim, file_num_centers; - diskann::load_bin(pq_pivots_path, full_pivot_data, file_num_centers, - file_dim); - if (file_dim == dim && file_num_centers == num_centers) { - diskann::cout << "PQ pivot file exists. Not generating again" - << std::endl; - return -1; - } - } - // Calculate centroid and center the training data std::unique_ptr centroid = std::make_unique(dim); for (uint64_t d = 0; d < dim; d++) { @@ -229,7 +274,7 @@ int generate_pq_pivots(const float *passed_train_data, size_t num_train, for (uint64_t p = 0; p < num_train; p++) { centroid[d] += train_data[p * dim + d]; } - centroid[d] /= num_train; + centroid[d] /= (float) num_train; } // std::memset(centroid, 0 , dim*sizeof(float)); @@ -251,7 +296,7 @@ int generate_pq_pivots(const float *passed_train_data, size_t num_train, std::vector> bin_to_dims(num_pq_chunks); tsl::robin_map dim_to_bin; - std::vector bin_loads(num_pq_chunks, 0); + std::vector bin_loads(num_pq_chunks, 0); // Process dimensions not inserted by previous loop for (uint32_t d = 0; d < dim; d++) { @@ -266,8 +311,6 @@ int generate_pq_pivots(const float *passed_train_data, size_t num_train, cur_best_load = bin_loads[b]; } } - diskann::cout << " Pushing " << d << " into bin #: " << cur_best - << std::endl; bin_to_dims[cur_best].push_back(d); if (bin_to_dims[cur_best].size() == high_val) { cur_num_high++; @@ -281,26 +324,20 @@ int generate_pq_pivots(const float *passed_train_data, size_t num_train, chunk_offsets.push_back(0); for (uint32_t b = 0; b < num_pq_chunks; b++) { - diskann::cout << "[ "; for (auto p : bin_to_dims[b]) { rearrangement.push_back(p); - diskann::cout << p << ","; } - diskann::cout << "] " << std::endl; if (b > 0) chunk_offsets.push_back(chunk_offsets[b - 1] + (unsigned) bin_to_dims[b - 1].size()); } chunk_offsets.push_back(dim); - diskann::cout << "\nCross-checking rearranged order of coordinates:" - << std::endl; - for (auto p : rearrangement) - diskann::cout << p << " "; - diskann::cout << std::endl; - full_pivot_data.reset(new float[num_centers * dim]); + // DEBUG ONLY + double kmeans_time = 0.0, lloyds_time = 0.0, copy_time = 0.0; + for (size_t i = 0; i < num_pq_chunks; i++) { size_t cur_chunk_size = chunk_offsets[i + 1] - chunk_offsets[i]; @@ -313,42 +350,79 @@ int generate_pq_pivots(const float *passed_train_data, size_t num_train, std::unique_ptr closest_center = std::make_unique(num_train); - diskann::cout << "Processing chunk " << i << " with dimensions [" - << chunk_offsets[i] << ", " << chunk_offsets[i + 1] << ")" - << std::endl; + memset((void *) cur_pivot_data.get(), 0, + num_centers * cur_chunk_size * sizeof(float)); + auto start = std::chrono::high_resolution_clock::now(); #pragma omp parallel for schedule(static, 65536) for (int64_t j = 0; j < (_s64) num_train; j++) { std::memcpy(cur_data.get() + j * cur_chunk_size, train_data.get() + j * dim + chunk_offsets[i], cur_chunk_size * sizeof(float)); } + auto end = std::chrono::high_resolution_clock::now(); + copy_time += std::chrono::duration(end - start).count(); - kmeans::kmeanspp_selecting_pivots(cur_data.get(), num_train, cur_chunk_size, - cur_pivot_data.get(), num_centers); + start = std::chrono::high_resolution_clock::now(); + // kmeans::kmeanspp_selecting_pivots(cur_data.get(), num_train, + // cur_chunk_size, + // cur_pivot_data.get(), num_centers); + kmeans::selecting_pivots(cur_data.get(), num_train, cur_chunk_size, + cur_pivot_data.get(), num_centers); + + unsigned k_means_reps = max_k_means_reps; kmeans::run_lloyds(cur_data.get(), num_train, cur_chunk_size, - cur_pivot_data.get(), num_centers, max_k_means_reps, - NULL, closest_center.get()); + cur_pivot_data.get(), num_centers, k_means_reps, nullptr, + closest_center.get()); + end = std::chrono::high_resolution_clock::now(); + kmeans_time += std::chrono::duration(end - start).count(); + + start = std::chrono::high_resolution_clock::now(); + if (num_train > 2 * num_centers) { + kmeans::run_lloyds(cur_data.get(), num_train, cur_chunk_size, + cur_pivot_data.get(), num_centers, max_k_means_reps, + NULL, closest_center.get()); + } + end = std::chrono::high_resolution_clock::now(); + lloyds_time += std::chrono::duration(end - start).count(); + start = std::chrono::high_resolution_clock::now(); for (uint64_t j = 0; j < num_centers; j++) { std::memcpy(full_pivot_data.get() + j * dim + chunk_offsets[i], cur_pivot_data.get() + j * cur_chunk_size, cur_chunk_size * sizeof(float)); } + end = std::chrono::high_resolution_clock::now(); + copy_time += std::chrono::duration(end - start).count(); } + diskann::cout << "Kmeans time: " << kmeans_time + << " Lloyds time: " << lloyds_time + << " Copy time: " << copy_time << std::endl; + + std::vector cumul_bytes(5, 0); + cumul_bytes[0] = METADATA_SIZE; + cumul_bytes[1] = + cumul_bytes[0] + + diskann::save_bin(pq_pivots_path.c_str(), full_pivot_data.get(), + (size_t) num_centers, dim, cumul_bytes[0]); + cumul_bytes[2] = cumul_bytes[1] + diskann::save_bin( + pq_pivots_path.c_str(), centroid.get(), + (size_t) dim, 1, cumul_bytes[1]); + cumul_bytes[3] = + cumul_bytes[2] + + diskann::save_bin(pq_pivots_path.c_str(), rearrangement.data(), + rearrangement.size(), 1, cumul_bytes[2]); + cumul_bytes[4] = + cumul_bytes[3] + + diskann::save_bin(pq_pivots_path.c_str(), chunk_offsets.data(), + chunk_offsets.size(), 1, cumul_bytes[3]); + diskann::save_bin<_u64>(pq_pivots_path.c_str(), cumul_bytes.data(), + cumul_bytes.size(), 1, 0); + + diskann::cout << "Saved pq pivot data to " << pq_pivots_path << " of size " + << cumul_bytes[cumul_bytes.size() - 1] << "B." << std::endl; - diskann::save_bin(pq_pivots_path.c_str(), full_pivot_data.get(), - (size_t) num_centers, dim); - std::string centroids_path = pq_pivots_path + "_centroid.bin"; - diskann::save_bin(centroids_path.c_str(), centroid.get(), (size_t) dim, - 1); - std::string rearrangement_path = pq_pivots_path + "_rearrangement_perm.bin"; - diskann::save_bin(rearrangement_path.c_str(), rearrangement.data(), - rearrangement.size(), 1); - std::string chunk_offsets_path = pq_pivots_path + "_chunk_offsets.bin"; - diskann::save_bin(chunk_offsets_path.c_str(), chunk_offsets.data(), - chunk_offsets.size(), 1); return 0; } @@ -361,9 +435,10 @@ template int generate_pq_data_from_pivots(const std::string data_file, unsigned num_centers, unsigned num_pq_chunks, std::string pq_pivots_path, - std::string pq_compressed_vectors_path) { + std::string pq_compressed_vectors_path, + size_t offset) { _u64 read_blk_size = 64 * 1024 * 1024; - cached_ifstream base_reader(data_file, read_blk_size); + cached_ifstream base_reader(data_file, read_blk_size, (uint32_t) offset); _u32 npts32; _u32 basedim32; base_reader.read((char *) &npts32, sizeof(uint32_t)); @@ -371,6 +446,12 @@ int generate_pq_data_from_pivots(const std::string data_file, size_t num_points = npts32; size_t dim = basedim32; +#ifdef SAVE_INFLATED_PQ + std::string inflated_pq_file = pq_compressed_vectors_path + "_full.bin"; +#endif + + size_t BLOCK_SIZE = (std::min)((size_t) MAX_BLOCK_SIZE, num_points); + std::unique_ptr full_pivot_data; std::unique_ptr centroid; std::unique_ptr rearrangement; @@ -380,67 +461,92 @@ int generate_pq_data_from_pivots(const std::string data_file, diskann::cout << "ERROR: PQ k-means pivot file not found" << std::endl; throw diskann::ANNException("PQ k-means pivot file not found", -1); } else { - uint64_t numr, numc; - - std::string centroids_path = pq_pivots_path + "_centroid.bin"; - diskann::load_bin(centroids_path.c_str(), centroid, numr, numc); - - if (numr != dim || numc != 1) { - diskann::cout << "Error reading centroid file." << std::endl; - throw diskann::ANNException("Error reading centroid file.", -1, - __FUNCSIG__, __FILE__, __LINE__); + _u64 nr, nc; + std::unique_ptr<_u64[]> file_offset_data; + + diskann::load_bin<_u64>(pq_pivots_path.c_str(), file_offset_data, nr, nc, + 0); + + if (nr != 5) { + diskann::cout << "Error reading pq_pivots file " << pq_pivots_path + << ". Offsets dont contain correct metadata, # offsets = " + << nr << ", but expecting 5."; + throw diskann::ANNException( + "Error reading pq_pivots file at offsets data.", -1, __FUNCSIG__, + __FILE__, __LINE__); } - std::string rearrangement_path = pq_pivots_path + "_rearrangement_perm.bin"; - diskann::load_bin(rearrangement_path.c_str(), rearrangement, numr, - numc); - if (numr != dim || numc != 1) { - diskann::cout << "Error reading rearrangement file." << std::endl; - throw diskann::ANNException("Error reading rearrangement file.", -1, - __FUNCSIG__, __FILE__, __LINE__); + + diskann::load_bin(pq_pivots_path.c_str(), full_pivot_data, nr, nc, + file_offset_data[0]); + + if ((nr != num_centers) || (nc != dim)) { + diskann::cout << "Error reading pq_pivots file " << pq_pivots_path + << ". file_num_centers = " << nr << ", file_dim = " << nc + << " but expecting " << num_centers << " centers in " << dim + << " dimensions."; + throw diskann::ANNException( + "Error reading pq_pivots file at pivots data.", -1, __FUNCSIG__, + __FILE__, __LINE__); } - std::string chunk_offsets_path = pq_pivots_path + "_chunk_offsets.bin"; - diskann::load_bin(chunk_offsets_path.c_str(), chunk_offsets, numr, - numc); - if (numr != (uint64_t) num_pq_chunks + 1 || numc != 1) { - diskann::cout << "Error reading chunk offsets file." << std::endl; - throw diskann::ANNException("Error reading chunk offsets file.", -1, - __FUNCSIG__, __FILE__, __LINE__); + + diskann::load_bin(pq_pivots_path.c_str(), centroid, nr, nc, + file_offset_data[1]); + + if ((nr != dim) || (nc != 1)) { + diskann::cout << "Error reading pq_pivots file " << pq_pivots_path + << ". file_dim = " << nr << ", file_cols = " << nc + << " but expecting " << dim << " entries in 1 dimension."; + throw diskann::ANNException( + "Error reading pq_pivots file at centroid data.", -1, __FUNCSIG__, + __FILE__, __LINE__); } - size_t file_num_centers; - size_t file_dim; - diskann::load_bin(pq_pivots_path, full_pivot_data, file_num_centers, - file_dim); - - if (file_num_centers != num_centers) { - std::stringstream stream; - stream << "ERROR: file number of PQ centers " << file_num_centers - << " does " - "not match input argument " - << num_centers << std::endl; - diskann::cout << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); + diskann::load_bin(pq_pivots_path.c_str(), rearrangement, nr, nc, + file_offset_data[2]); + + if ((nr != dim) || (nc != 1)) { + diskann::cout << "Error reading pq_pivots file " << pq_pivots_path + << ". file_dim = " << nr << ", file_cols = " << nc + << " but expecting " << dim << " entries in 1 dimension."; + throw diskann::ANNException( + "Error reading pq_pivots file at re-arrangement data.", -1, + __FUNCSIG__, __FILE__, __LINE__); } - if (file_dim != dim) { - std::stringstream stream; - stream << "ERROR: PQ pivot dimension does " - "not match base file dimension" - << std::endl; - diskann::cout << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, - __LINE__); + + diskann::load_bin(pq_pivots_path.c_str(), chunk_offsets, nr, nc, + file_offset_data[3]); + + if (nr != (uint64_t) num_pq_chunks + 1 || nc != 1) { + diskann::cout + << "Error reading pq_pivots file at chunk offsets; file has nr=" << nr + << ",nc=" << nc << ", expecting nr=" << num_pq_chunks + 1 << ", nc=1." + << std::endl; + throw diskann::ANNException( + "Error reading pq_pivots file at chunk offsets.", -1, __FUNCSIG__, + __FILE__, __LINE__); } + diskann::cout << "Loaded PQ pivot information" << std::endl; } std::ofstream compressed_file_writer(pq_compressed_vectors_path, std::ios::binary); - _u32 num_pq_chunks_u32 = num_pq_chunks; + _u32 num_pq_chunks_u32 = num_pq_chunks; compressed_file_writer.write((char *) &num_points, sizeof(uint32_t)); compressed_file_writer.write((char *) &num_pq_chunks_u32, sizeof(uint32_t)); +#ifdef SAVE_INFLATED_PQ + std::ofstream inflated_file_writer(inflated_pq_file, std::ios::binary); + inflated_file_writer.write((char *) &npts32, sizeof(uint32_t)); + inflated_file_writer.write((char *) &basedim32, sizeof(uint32_t)); + + std::unique_ptr block_inflated_base = + std::make_unique(BLOCK_SIZE * (_u64) dim); + std::memset(block_inflated_base.get(), 0, + BLOCK_SIZE * (_u64) dim * sizeof(float)); +#endif + size_t block_size = num_points <= BLOCK_SIZE ? num_points : BLOCK_SIZE; std::unique_ptr<_u32[]> block_compressed_base = std::make_unique<_u32[]>(block_size * (_u64) num_pq_chunks); @@ -465,8 +571,11 @@ int generate_pq_data_from_pivots(const std::string data_file, diskann::convert_types(block_data_T.get(), block_data_tmp.get(), cur_blk_size, dim); - diskann::cout << "Processing points [" << start_id << ", " << end_id - << ").." << std::flush; + /* diskann::cout << "Processing points [" << start_id << ", " << end_id + << ")... Used memory: " + << getMemoryUsage() / (1024.0 * 1024.0) << "MB" << + std::flush; + */ for (uint64_t p = 0; p < cur_blk_size; p++) { for (uint64_t d = 0; d < dim; d++) { @@ -510,13 +619,23 @@ int generate_pq_data_from_pivots(const std::string data_file, math_utils::compute_closest_centers(cur_data.get(), cur_blk_size, cur_chunk_size, cur_pivot_data.get(), num_centers, 1, closest_center.get()); - #pragma omp parallel for schedule(static, 8192) for (int64_t j = 0; j < (_s64) cur_blk_size; j++) { block_compressed_base[j * num_pq_chunks + i] = closest_center[j]; +#ifdef SAVE_INFLATED_PQ + for (uint64_t k = 0; k < cur_chunk_size; k++) + block_inflated_base[j * dim + chunk_offsets[i] + k] = + cur_pivot_data[closest_center[j] * cur_chunk_size + k] + + centroid[chunk_offsets[i] + k]; +#endif } } +#ifdef SAVE_INFLATED_PQ + inflated_file_writer.write((char *) block_inflated_base.get(), + cur_blk_size * dim * sizeof(float)); +#endif + if (num_centers > 256) { compressed_file_writer.write( (char *) (block_compressed_base.get()), @@ -530,14 +649,17 @@ int generate_pq_data_from_pivots(const std::string data_file, (char *) (pVec.get()), cur_blk_size * num_pq_chunks * sizeof(uint8_t)); } - diskann::cout << ".done." << std::endl; + // diskann::cout << ".done." << std::endl; } -// Gopal. Splittng diskann_dll into separate DLLs for search and build. +// Splittng diskann_dll into separate DLLs for search and build. // This code should only be available in the "build" DLL. -#ifdef DISKANN_BUILD +#ifdef USE_TCMALLOC MallocExtension::instance()->ReleaseFreeMemory(); #endif compressed_file_writer.close(); +#ifdef SAVE_INFLATED_PQ + inflated_file_writer.close(); +#endif return 0; } @@ -567,6 +689,7 @@ int estimate_cluster_sizes(const std::string data_file, float *pivots, shard_counts[i] = 0; } + size_t BLOCK_SIZE = (std::min)((size_t) MAX_BLOCK_SIZE, num_test); size_t num_points = 0, num_dim = 0; diskann::get_bin_metadata(data_file, num_points, num_dim); size_t block_size = num_points <= BLOCK_SIZE ? num_points : BLOCK_SIZE; @@ -649,6 +772,7 @@ int shard_data_into_clusters(const std::string data_file, float *pivots, shard_counts[i] = 0; } + size_t BLOCK_SIZE = (std::min)((size_t) MAX_BLOCK_SIZE, num_points); size_t block_size = num_points <= BLOCK_SIZE ? num_points : BLOCK_SIZE; std::unique_ptr<_u32[]> block_closest_centers = std::make_unique<_u32[]>(block_size * k_base); @@ -840,19 +964,28 @@ int partition_with_ram_budget(const std::string data_file, } // Instantations of supported templates +template void DISKANN_DLLEXPORT gen_random_slice( + const std::string data_file, double p_val, + std::unique_ptr &sampled_data, size_t &slice_size, size_t &ndims); +template void DISKANN_DLLEXPORT gen_random_slice( + const std::string data_file, double p_val, + std::unique_ptr &sampled_data, size_t &slice_size, size_t &ndims); +template void DISKANN_DLLEXPORT gen_random_slice( + const std::string data_file, double p_val, + std::unique_ptr &sampled_data, size_t &slice_size, size_t &ndims); -template void DISKANN_DLLEXPORT -gen_random_slice(const std::string base_file, - const std::string output_prefix, double sampling_rate); +template void DISKANN_DLLEXPORT gen_random_slice( + const std::string base_file, const std::string output_prefix, + double sampling_rate, size_t offset); template void DISKANN_DLLEXPORT gen_random_slice( const std::string base_file, const std::string output_prefix, - double sampling_rate); -template void DISKANN_DLLEXPORT -gen_random_slice(const std::string base_file, - const std::string output_prefix, double sampling_rate); + double sampling_rate, size_t offset); +template void DISKANN_DLLEXPORT gen_random_slice( + const std::string base_file, const std::string output_prefix, + double sampling_rate, size_t offset); template void DISKANN_DLLEXPORT -gen_random_slice(const float *inputdata, size_t npts, size_t ndims, + gen_random_slice(const float *inputdata, size_t npts, size_t ndims, double p_val, float *&sampled_data, size_t &slice_size); template void DISKANN_DLLEXPORT gen_random_slice( const uint8_t *inputdata, size_t npts, size_t ndims, double p_val, @@ -891,12 +1024,28 @@ template DISKANN_DLLEXPORT int partition_with_ram_budget( const std::string data_file, const double sampling_rate, double ram_budget, size_t graph_degree, const std::string prefix_path, size_t k_base); +template DISKANN_DLLEXPORT int generate_pq_pivots( + const std::unique_ptr &passed_train_data, size_t num_train, + unsigned dim, unsigned num_centers, unsigned num_pq_chunks, + unsigned max_k_means_reps, std::string pq_pivots_path); +template DISKANN_DLLEXPORT int generate_pq_pivots( + const std::unique_ptr &passed_train_data, size_t num_train, + unsigned dim, unsigned num_centers, unsigned num_pq_chunks, + unsigned max_k_means_reps, std::string pq_pivots_path); +template DISKANN_DLLEXPORT int generate_pq_pivots( + const std::unique_ptr &passed_train_data, size_t num_train, + unsigned dim, unsigned num_centers, unsigned num_pq_chunks, + unsigned max_k_means_reps, std::string pq_pivots_path); + template DISKANN_DLLEXPORT int generate_pq_data_from_pivots( const std::string data_file, unsigned num_centers, unsigned num_pq_chunks, - std::string pq_pivots_path, std::string pq_compressed_vectors_path); + std::string pq_pivots_path, std::string pq_compressed_vectors_path, + size_t offset); template DISKANN_DLLEXPORT int generate_pq_data_from_pivots( const std::string data_file, unsigned num_centers, unsigned num_pq_chunks, - std::string pq_pivots_path, std::string pq_compressed_vectors_path); + std::string pq_pivots_path, std::string pq_compressed_vectors_path, + size_t offset); template DISKANN_DLLEXPORT int generate_pq_data_from_pivots( const std::string data_file, unsigned num_centers, unsigned num_pq_chunks, - std::string pq_pivots_path, std::string pq_compressed_vectors_path); + std::string pq_pivots_path, std::string pq_compressed_vectors_path, + size_t offset); diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index 21da3521d6..352042f1ff 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -18,6 +18,10 @@ #include "timer.h" #include "utils.h" +#include +#include +#include "tcmalloc/malloc_extension.h" +#include "cosine_similarity.h" #include "tsl/robin_set.h" #ifdef _WINDOWS @@ -33,6 +37,7 @@ #define SECTOR_LEN 4096 #define READ_U64(stream, val) stream.read((char *) &val, sizeof(_u64)) +#define READ_U32(stream, val) stream.read((char *) &val, sizeof(_u32)) #define READ_UNSIGNED(stream, val) stream.read((char *) &val, sizeof(unsigned)) // sector # on disk where node_id is present @@ -84,127 +89,106 @@ namespace { } // namespace namespace diskann { - template<> - PQFlashIndex<_u8>::PQFlashIndex( - std::shared_ptr &fileReader) - : reader(fileReader) { - diskann::cout - << "dist_cmp function for _u8 uses slow implementation." - " Please contact gopalsr@microsoft.com if you need an AVX/AVX2" - " implementation." - << std::endl; - // TODO: No AVX2/AVX implementation available for uint8. - this->dist_cmp = new DistanceL2UInt8(); - if (Avx2SupportedCPU) { - diskann::cout << "Using AVX2 dist_cmp_float function." << std::endl; - this->dist_cmp_float = new DistanceL2(); - } else if (AvxSupportedCPU) { - diskann::cout << "Using AVX dist_cmp_float function" << std::endl; - this->dist_cmp_float = new AVXDistanceL2Float(); - } else { - diskann::cout << "No AVX/AVX2 support. Using Slow dist_cmp_float function" - << std::endl; - this->dist_cmp_float = new SlowDistanceL2Float(); - } + template + DiskNode::DiskNode(uint32_t id, T *coords, uint32_t *nhood) : id(id) { + this->coords = coords; + this->nnbrs = *nhood; + this->nbrs = nhood + 1; } - template<> - PQFlashIndex<_s8>::PQFlashIndex( - std::shared_ptr &fileReader) - : reader(fileReader) { - if (Avx2SupportedCPU) { - diskann::cout << "Using AVX2 function for dist_cmp and dist_cmp_float" - << std::endl; - this->dist_cmp = new DistanceL2Int8(); - this->dist_cmp_float = new DistanceL2(); - } else if (AvxSupportedCPU) { - diskann::cout << "No AVX2 support. Switching to AVX routines for " - "dist_cmp, dist_cmp_float." - << std::endl; - this->dist_cmp = new AVXDistanceL2Int8(); - this->dist_cmp_float = new AVXDistanceL2Float(); - } else { - diskann::cout << "No AVX/AVX2 support. Switching to slow routines for " - "dist_cmp, dist_cmp_float" - << std::endl; - this->dist_cmp = new SlowDistanceL2Int(); - this->dist_cmp_float = new SlowDistanceL2Float(); - } - } + // structs for DiskNode + template struct DiskNode; + template struct DiskNode; + template struct DiskNode; + + template + PQFlashIndex::PQFlashIndex( + diskann::Metric m, std::shared_ptr &fileReader, + bool single_file_index, bool tags) + : reader(fileReader), data_is_normalized(false), + single_index_file(single_file_index), enable_tags(tags) { + if (m == diskann::Metric::COSINE) { + if (std::is_floating_point::value) { + diskann::cout << "Cosine metric chosen for (normalized) float data." + "Changing distance to L2 to boost accuracy." + << std::endl; + m = diskann::Metric::L2; + data_is_normalized = true; - template<> - PQFlashIndex::PQFlashIndex( - std::shared_ptr &fileReader) - : reader(fileReader) { - if (Avx2SupportedCPU) { - diskann::cout << "Using AVX2 functions for dist_cmp and dist_cmp_float" - << std::endl; - this->dist_cmp = new DistanceL2(); - this->dist_cmp_float = new DistanceL2(); - } else if (AvxSupportedCPU) { - diskann::cout << "No AVX2 support. Switching to AVX functions for " - "dist_cmp and dist_cmp_float." - << std::endl; - this->dist_cmp = new AVXDistanceL2Float(); - this->dist_cmp_float = new AVXDistanceL2Float(); - } else { - diskann::cout << "No AVX/AVX2 support. Switching to slow implementations " - "for dist_cmp and dist_cmp_float" - << std::endl; - this->dist_cmp = new AVXDistanceL2Float(); - this->dist_cmp_float = new AVXDistanceL2Float(); + } else { + diskann::cerr << "WARNING: Cannot normalize integral data types." + << " This may result in erroneous results or poor recall." + << " Consider using L2 distance with integral data types." + << std::endl; + } } + + this->dist_cmp.reset(diskann::get_distance_function(m)); + this->dist_cmp_float.reset(diskann::get_distance_function(m)); } - template - PQFlashIndex::~PQFlashIndex() { + template + PQFlashIndex::~PQFlashIndex() { #ifndef EXEC_ENV_OLS if (data != nullptr) { delete[] data; } #endif + diskann::cout << "Thread Data size: " << this->thread_data.size() << "\n"; + assert(!this->thread_data.empty()); + +#ifndef EXEC_ENV_OLS if (centroid_data != nullptr) aligned_free(centroid_data); +#endif + // delete backing bufs for nhood and coord cache if (nhood_cache_buf != nullptr) { delete[] nhood_cache_buf; diskann::aligned_free(coord_cache_buf); } - delete this->dist_cmp; - delete this->dist_cmp_float; if (load_flag) { this->destroy_thread_data(); reader->close(); // delete reader; //not deleting reader because it is now passed by ref. } + + if (this->tags != nullptr) { + delete[] tags; + } + +#ifndef EXEC_ENV_OLS + if (medoids != nullptr) + delete[] medoids; +#endif +#ifdef USE_TCMALLOC + MallocExtension::instance()->ReleaseFreeMemory(); +#endif } - template - void PQFlashIndex::setup_thread_data(_u64 nthreads) { + template + void PQFlashIndex::setup_thread_data(_u64 nthreads) { diskann::cout << "Setting up thread-specific contexts for nthreads: " - << nthreads << std::endl; + << nthreads << "\n"; // omp parallel for to generate unique thread IDs #pragma omp parallel for num_threads((int) nthreads) for (_s64 thread = 0; thread < (_s64) nthreads; thread++) { #pragma omp critical { this->reader->register_thread(); - IOContext &ctx = this->reader->get_ctx(); - // diskann::cout << "ctx: " << ctx << "\n"; + IOContext & ctx = this->reader->get_ctx(); QueryScratch scratch; _u64 coord_alloc_size = ROUND_UP(MAX_N_CMPS * this->aligned_dim, 256); diskann::alloc_aligned((void **) &scratch.coord_scratch, coord_alloc_size, 256); - // scratch.coord_scratch = new T[MAX_N_CMPS * this->aligned_dim]; - // //Gopal. Commenting out the reallocation! diskann::alloc_aligned((void **) &scratch.sector_scratch, MAX_N_SECTOR_READS * SECTOR_LEN, SECTOR_LEN); diskann::alloc_aligned((void **) &scratch.aligned_scratch, 256 * sizeof(float), 256); diskann::alloc_aligned((void **) &scratch.aligned_pq_coord_scratch, - 25600 * sizeof(_u8), 256); + 32768 * 32 * sizeof(_u8), 256); diskann::alloc_aligned((void **) &scratch.aligned_pqtable_dist_scratch, 25600 * sizeof(float), 256); diskann::alloc_aligned((void **) &scratch.aligned_dist_scratch, @@ -215,8 +199,9 @@ namespace diskann { this->aligned_dim * sizeof(float), 8 * sizeof(float)); + memset(scratch.sector_scratch, 0, MAX_N_SECTOR_READS * SECTOR_LEN); memset(scratch.aligned_scratch, 0, 256 * sizeof(float)); - memset(scratch.coord_scratch, 0, MAX_N_CMPS * this->aligned_dim); + memset(scratch.coord_scratch, 0, coord_alloc_size); memset(scratch.aligned_query_T, 0, this->aligned_dim * sizeof(T)); memset(scratch.aligned_query_float, 0, this->aligned_dim * sizeof(float)); @@ -225,21 +210,15 @@ namespace diskann { data.ctx = ctx; data.scratch = scratch; this->thread_data.push(data); + this->thread_data_backing_buf.push_back(data); } } load_flag = true; } - template - void PQFlashIndex::destroy_thread_data() { - diskann::cout << "Clearing scratch" << std::endl; - assert(this->thread_data.size() == this->max_nthreads); - while (this->thread_data.size() > 0) { - ThreadData data = this->thread_data.pop(); - while (data.scratch.sector_scratch == nullptr) { - this->thread_data.wait_for_push_notify(); - data = this->thread_data.pop(); - } + template + void PQFlashIndex::destroy_thread_data() { + for (auto &data : this->thread_data_backing_buf) { auto &scratch = data.scratch; diskann::aligned_free((void *) scratch.coord_scratch); diskann::aligned_free((void *) scratch.sector_scratch); @@ -250,11 +229,13 @@ namespace diskann { diskann::aligned_free((void *) scratch.aligned_query_float); diskann::aligned_free((void *) scratch.aligned_query_T); } + this->reader->deregister_all_threads(); } - template - void PQFlashIndex::load_cache_list(std::vector &node_list) { - diskann::cout << "Loading the cache list into memory.." << std::flush; + template + void PQFlashIndex::load_cache_list( + std::vector &node_list) { + // diskann::cout << "Loading the cache list into memory.." << std::flush; _u64 num_cached_nodes = node_list.size(); // borrow thread data @@ -263,7 +244,6 @@ namespace diskann { this->thread_data.wait_for_push_notify(); this_thread_data = this->thread_data.pop(); } - IOContext &ctx = this_thread_data.ctx; nhood_cache_buf = new unsigned[num_cached_nodes * (max_degree + 1)]; @@ -280,7 +260,7 @@ namespace diskann { for (_u64 block = 0; block < num_blocks; block++) { _u64 start_idx = block * BLOCK_SIZE; _u64 end_idx = (std::min)(num_cached_nodes, (block + 1) * BLOCK_SIZE); - std::vector read_reqs; + std::vector read_reqs; std::vector> nhoods; for (_u64 node_idx = start_idx; node_idx < end_idx; node_idx++) { AlignedRead read; @@ -323,14 +303,14 @@ namespace diskann { } #ifdef EXEC_ENV_OLS - template - void PQFlashIndex::generate_cache_list_from_sample_queries( + template + void PQFlashIndex::generate_cache_list_from_sample_queries( MemoryMappedFiles &files, std::string sample_bin, _u64 l_search, _u64 beamwidth, _u64 num_nodes_to_cache, uint32_t nthreads, std::vector &node_list) { #else - template - void PQFlashIndex::generate_cache_list_from_sample_queries( + template + void PQFlashIndex::generate_cache_list_from_sample_queries( std::string sample_bin, _u64 l_search, _u64 beamwidth, _u64 num_nodes_to_cache, uint32_t nthreads, std::vector &node_list) { @@ -363,13 +343,13 @@ namespace diskann { return; } - std::vector tmp_result_ids_64(sample_num, 0); - std::vector tmp_result_dists(sample_num, 0); + std::vector tmp_result_tags(sample_num, 0); + std::vector tmp_result_dists(sample_num, 0); #pragma omp parallel for schedule(dynamic, 1) num_threads(nthreads) for (_s64 i = 0; i < (int64_t) sample_num; i++) { cached_beam_search(samples + (i * sample_aligned_dim), 1, l_search, - tmp_result_ids_64.data() + (i * 1), + tmp_result_tags.data() + (i * 1), tmp_result_dists.data() + (i * 1), beamwidth); } @@ -388,15 +368,26 @@ namespace diskann { diskann::aligned_free(samples); } - template - void PQFlashIndex::cache_bfs_levels(_u64 num_nodes_to_cache, - std::vector &node_list) { - // Gopal. random_shuffle() is deprecated. + template + void PQFlashIndex::cache_bfs_levels( + _u64 num_nodes_to_cache, std::vector &node_list) { + // random_shuffle() is deprecated. std::random_device rng; std::mt19937 urng(rng()); node_list.clear(); + // Do not cache more than 10% of the nodes in the index + _u64 tenp_nodes = (_u64)(std::round(this->num_points * 0.1)); + if (num_nodes_to_cache > tenp_nodes) { + diskann::cout << "Reducing nodes to cache from: " << num_nodes_to_cache + << " to: " << tenp_nodes + << "(10 percent of total nodes:" << this->num_points << ")" + << std::endl; + num_nodes_to_cache = tenp_nodes == 0 ? 1 : tenp_nodes; + } + diskann::cout << "Caching " << num_nodes_to_cache << "..." << std::endl; + // borrow thread data ThreadData this_thread_data = this->thread_data.pop(); while (this_thread_data.scratch.sector_scratch == nullptr) { @@ -434,7 +425,7 @@ namespace diskann { nodes_to_expand.push_back(id); } - // Gopal. random_shuffle() is deprecated. + // random_shuffle() is deprecated. std::shuffle(nodes_to_expand.begin(), nodes_to_expand.end(), urng); diskann::cout << "Level: " << lvl << std::flush; @@ -447,7 +438,7 @@ namespace diskann { size_t start = block * BLOCK_SIZE; size_t end = (std::min)((block + 1) * BLOCK_SIZE, nodes_to_expand.size()); - std::vector read_reqs; + std::vector read_reqs; std::vector> nhoods; for (size_t cur_pt = start; cur_pt < end; cur_pt++) { char *buf = nullptr; @@ -459,8 +450,10 @@ namespace diskann { read.offset = NODE_SECTOR_NO(nodes_to_expand[cur_pt]) * SECTOR_LEN; read_reqs.push_back(read); } + // issue read requests reader->read(read_reqs, ctx); + // process each nhood buf for (auto &nhood : nhoods) { // insert node coord into coord_cache @@ -492,7 +485,7 @@ namespace diskann { for (const unsigned &p : *cur_level) cur_level_node_list.push_back(p); - // Gopal. random_shuffle() is deprecated + // random_shuffle() is deprecated std::shuffle(cur_level_node_list.begin(), cur_level_node_list.end(), urng); size_t residual = num_nodes_to_cache - node_list.size(); @@ -503,13 +496,12 @@ namespace diskann { diskann::cout << "Level: " << lvl << std::flush; diskann::cout << ". #nodes: " << node_list.size() - prev_node_list_size << ", #nodes thus far: " << node_list.size() << std::endl; - // return thread data this->thread_data.push(this_thread_data); } - template - void PQFlashIndex::use_medoids_data_as_centroids() { + template + void PQFlashIndex::use_medoids_data_as_centroids() { if (centroid_data != nullptr) aligned_free(centroid_data); alloc_aligned(((void **) ¢roid_data), @@ -546,6 +538,7 @@ namespace diskann { for (uint32_t i = 0; i < data_dim; i++) centroid_data[cur_m * aligned_dim + i] = medoid_coords[i]; + delete[] medoid_coords; aligned_free(medoid_buf); } @@ -556,97 +549,166 @@ namespace diskann { } #ifdef EXEC_ENV_OLS - template - int PQFlashIndex::load(MemoryMappedFiles &files, uint32_t num_threads, - const char *pq_prefix, - const char *disk_index_file) { + template + int PQFlashIndex::load(const char *index_prefix, _u32 num_threads, + MemoryMappedFiles &files, + bool new_index_format) { #else - template - int PQFlashIndex::load(uint32_t num_threads, const char *pq_prefix, - const char *disk_index_file) { + template + int PQFlashIndex::load(const char *index_prefix, _u32 num_threads, + bool new_index_format) { #endif - std::string pq_table_bin = std::string(pq_prefix) + "_pivots.bin"; - std::string pq_compressed_vectors = - std::string(pq_prefix) + "_compressed.bin"; - std::string medoids_file = std::string(disk_index_file) + "_medoids.bin"; - std::string centroids_file = - std::string(disk_index_file) + "_centroids.bin"; - - size_t pq_file_dim, pq_file_num_centroids; + std::string pq_table_bin, pq_compressed_vectors, disk_index_file, + medoids_file, centroids_file; + + if (false == this->single_index_file) { + std::string iprefix = std::string(index_prefix); + pq_table_bin = iprefix + "_pq_pivots.bin"; + pq_compressed_vectors = iprefix + "_pq_compressed.bin"; + disk_index_file = iprefix + "_disk.index"; + this->_disk_index_file = disk_index_file; + medoids_file = disk_index_file + "_medoids.bin"; + centroids_file = disk_index_file + "_centroids.bin"; + } else { + // Since incremental index which uses single file index is never + // a result of merging multiple indices, we won't have medoids + // or centroids file (or medoids/centroid data stored in disk_index_file). + pq_table_bin = pq_compressed_vectors = disk_index_file = + std::string(index_prefix); + this->_disk_index_file = disk_index_file; + } + #ifdef EXEC_ENV_OLS - get_bin_metadata(files, pq_table_bin, pq_file_num_centroids, pq_file_dim); + // This is a bit tricky. We have to read the header from the + // disk_index_file. But this is now exclusively a preserve of the + // DiskPriorityIO class. So, we need to estimate how many bytes are needed + // to store the header and read in that many using our 'standard' aligned + // file reader approach. + reader->open(disk_index_file, false, false); + // this->setup_thread_data(num_threads); + this->max_nthreads = num_threads; + + char * bytes = getHeaderBytes(); + ContentBuf buf(bytes, HEADER_SIZE); + std::basic_istream index_metadata(&buf); + #else - get_bin_metadata(pq_table_bin, pq_file_num_centroids, pq_file_dim); + std::ifstream index_metadata(disk_index_file, std::ios::binary); #endif - this->disk_index_file = std::string(disk_index_file); + size_t tags_offset = 0; + size_t pq_pivots_offset = 0; + size_t pq_vectors_offset = 0; + _u64 disk_nnodes; + _u64 disk_ndims; + size_t medoid_id_on_file; + _u64 file_frozen_id; + + if (new_index_format) { + _u32 nr, nc; + + READ_U32(index_metadata, nr); + READ_U32(index_metadata, nc); + + READ_U64(index_metadata, disk_nnodes); + READ_U64(index_metadata, disk_ndims); + + READ_U64(index_metadata, medoid_id_on_file); + READ_U64(index_metadata, max_node_len); + READ_U64(index_metadata, nnodes_per_sector); + data_dim = disk_ndims; + max_degree = + ((max_node_len - data_dim * sizeof(T)) / sizeof(unsigned)) - 1; + + diskann::cout << "Disk-Index File Meta-data: " + << "# nodes per sector: " << nnodes_per_sector + << ", max node len (bytes): " << max_node_len + << ", max node degree: " << max_degree << ", npts: " << nr + << ", dim: " << nc << " disk_nnodes: " << disk_nnodes + << " disk_ndims: " << disk_ndims << std::endl; + + READ_U64(index_metadata, this->num_frozen_points); + READ_U64(index_metadata, file_frozen_id); + if (this->num_frozen_points == 1) { + this->frozen_location = file_frozen_id; + // if (this->num_frozen_points == 1) { + diskann::cout << " Detected frozen point in index at location " + << this->frozen_location + << ". Will not output it at search time." << std::endl; + } + READ_U64(index_metadata, tags_offset); + READ_U64(index_metadata, pq_pivots_offset); + READ_U64(index_metadata, pq_vectors_offset); + + diskann::cout << "Tags offset: " << tags_offset + << " PQ Pivots offset: " << pq_pivots_offset + << " PQ Vectors offset: " << pq_vectors_offset << std::endl; + } else { // old index file format + size_t actual_index_size = get_file_size(disk_index_file); + size_t expected_file_size; + READ_U64(index_metadata, expected_file_size); + if (actual_index_size != expected_file_size) { + diskann::cout << "File size mismatch for " << disk_index_file + << " (size: " << actual_index_size << ")" + << " with meta-data size: " << expected_file_size + << std::endl; + return -1; + } - if (pq_file_num_centroids != 256) { - diskann::cout << "Error. Number of PQ centroids is not 256. Exitting." - << std::endl; - return -1; + READ_U64(index_metadata, disk_nnodes); + READ_U64(index_metadata, medoid_id_on_file); + READ_U64(index_metadata, max_node_len); + READ_U64(index_metadata, nnodes_per_sector); + max_degree = + ((max_node_len - data_dim * sizeof(T)) / sizeof(unsigned)) - 1; + + diskann::cout << "Disk-Index File Meta-data: "; + diskann::cout << "# nodes per sector: " << nnodes_per_sector; + diskann::cout << ", max node len (bytes): " << max_node_len; + diskann::cout << ", max node degree: " << max_degree << std::endl; } - this->data_dim = pq_file_dim; - this->aligned_dim = ROUND_UP(pq_file_dim, 8); +#ifdef EXEC_ENV_OLS + delete[] bytes; +#else + index_metadata.close(); +#endif + + if (this->single_index_file) { + pq_table_bin = disk_index_file; + pq_compressed_vectors = disk_index_file; + } else { + pq_pivots_offset = 0; + pq_vectors_offset = 0; + } + diskann::cout << "After single file index check, Tags offset: " + << tags_offset << " PQ Pivots offset: " << pq_pivots_offset + << " PQ Vectors offset: " << pq_vectors_offset << std::endl; size_t npts_u64, nchunks_u64; #ifdef EXEC_ENV_OLS diskann::load_bin<_u8>(files, pq_compressed_vectors, this->data, npts_u64, - nchunks_u64); + nchunks_u64, pq_vectors_offset); #else diskann::load_bin<_u8>(pq_compressed_vectors, this->data, npts_u64, - nchunks_u64); + nchunks_u64, pq_vectors_offset); #endif - this->num_points = npts_u64; this->n_chunks = nchunks_u64; -#ifdef EXEC_ENV_OLS - pq_table.load_pq_centroid_bin(files, pq_table_bin.c_str(), nchunks_u64); -#else - pq_table.load_pq_centroid_bin(pq_table_bin.c_str(), nchunks_u64); -#endif - - diskann::cout - << "Loaded PQ centroids and in-memory compressed vectors. #points: " - << num_points << " #dim: " << data_dim - << " #aligned_dim: " << aligned_dim << " #chunks: " << n_chunks - << std::endl; + diskann::cout << "Load compressed vectors from file: " + << pq_compressed_vectors << " offset: " << pq_vectors_offset + << " num points: " << npts_u64 << " n_chunks: " << nchunks_u64 + << std::endl; -// read index metadata #ifdef EXEC_ENV_OLS - // This is a bit tricky. We have to read the header from the - // disk_index_file. But this is - // now exclusively a preserve of the DiskPriorityIO class. So, we need to - // estimate how many - // bytes are needed to store the header and read in that many using our - // 'standard' aligned - // file reader approach. - reader->open(disk_index_file); - this->setup_thread_data(num_threads); - this->max_nthreads = num_threads; - - char * bytes = getHeaderBytes(); - ContentBuf buf(bytes, HEADER_SIZE); - std::basic_istream index_metadata(&buf); + pq_table.load_pq_centroid_bin(files, pq_table_bin.c_str(), nchunks_u64, + pq_pivots_offset); #else - std::ifstream index_metadata(disk_index_file, std::ios::binary); + pq_table.load_pq_centroid_bin(pq_table_bin.c_str(), nchunks_u64, + pq_pivots_offset); #endif - size_t actual_index_size = get_file_size(disk_index_file); - size_t expected_file_size; - READ_U64(index_metadata, expected_file_size); - if (actual_index_size != expected_file_size) { - diskann::cout << "File size mismatch for " << disk_index_file - << " (size: " << actual_index_size << ")" - << " with meta-data size: " << expected_file_size - << std::endl; - return -1; - } - - _u64 disk_nnodes; - READ_U64(index_metadata, disk_nnodes); if (disk_nnodes != num_points) { diskann::cout << "Mismatch in #points for compressed data file and disk " "index file: " @@ -654,32 +716,23 @@ namespace diskann { return -1; } - size_t medoid_id_on_file; - READ_U64(index_metadata, medoid_id_on_file); - READ_U64(index_metadata, max_node_len); - READ_U64(index_metadata, nnodes_per_sector); - max_degree = ((max_node_len - data_dim * sizeof(T)) / sizeof(unsigned)) - 1; + this->data_dim = pq_table.get_dim(); + this->aligned_dim = ROUND_UP(this->data_dim, 8); - diskann::cout << "Disk-Index File Meta-data: "; - diskann::cout << "# nodes per sector: " << nnodes_per_sector; - diskann::cout << ", max node len (bytes): " << max_node_len; - diskann::cout << ", max node degree: " << max_degree << std::endl; - -#ifdef EXEC_ENV_OLS - delete[] bytes; -#else - index_metadata.close(); -#endif + diskann::cout + << "Loaded PQ centroids and in-memory compressed vectors. #points: " + << num_points << " #dim: " << data_dim + << " #aligned_dim: " << aligned_dim << " #chunks: " << n_chunks + << std::endl; +// read index metadata #ifndef EXEC_ENV_OLS // open AlignedFileReader handle to index_file std::string index_fname(disk_index_file); - reader->open(index_fname); + reader->open(index_fname, false, false); +#endif this->setup_thread_data(num_threads); this->max_nthreads = num_threads; - -#endif - #ifdef EXEC_ENV_OLS if (files.fileExists(medoids_file)) { size_t tmp_dim; @@ -725,8 +778,9 @@ namespace diskann { stream << "Error loading centroids data file. Expected bin format of " "m times data_dim vector of float, where m is number of " "medoids " - "in medoids file." - << std::endl; + "in medoids file."; + + diskann::cerr << stream.str() << std::endl; throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -738,10 +792,28 @@ namespace diskann { use_medoids_data_as_centroids(); } - diskann::cout << "done.." << std::endl; + // load tags + if (this->enable_tags) { + diskann::cout << "Loading tags..."; + if (!this->single_index_file) { + std::string tag_file = disk_index_file; + tag_file = tag_file + ".tags"; + diskann::cout << "from " << tag_file << std::endl; + this->load_tags(tag_file); + } else { + diskann::cout << "from " << disk_index_file << std::endl; + this->load_tags(disk_index_file, tags_offset); + } + } + diskann::cout << "PQFlashIndex loaded successfully." << std::endl; return 0; } + template + _u64 PQFlashIndex::return_nd() { + return this->num_points; + } + #ifdef USE_BING_INFRA bool getNextCompletedRequest(const IOContext &ctx, size_t size, int &completedIndex) { @@ -760,23 +832,138 @@ namespace diskann { } #endif - template - void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_search, - const _u64 l_search, _u64 *indices, - float * distances, - const _u64 beam_width, - QueryStats * stats, - Distance *output_dist_func) { - ThreadData data = this->thread_data.pop(); - while (data.scratch.sector_scratch == nullptr) { - this->thread_data.wait_for_push_notify(); + template + size_t PQFlashIndex::cached_beam_search_vectors( + const T *query, const _u64 k_search, const _u64 l_search, TagT *res_tags, + float *distances, std::vector &res_vectors, const _u64 beam_width, + QueryStats *stats) { + // iterate to fixed point + std::vector expanded_nodes_info; + expanded_nodes_info.reserve(2 * l_search); + tsl::robin_map coord_map; + + this->disk_iterate_to_fixed_point(query, (_u32) l_search, (_u32) beam_width, + expanded_nodes_info, &coord_map, stats); + + _u32 res_count = 0; + for (uint32_t i = 0; i < l_search && res_count < k_search; i++) { + if (this->num_frozen_points == 1 && + expanded_nodes_info[i].id == this->frozen_location) + continue; + + if (distances != nullptr) { + distances[res_count] = expanded_nodes_info[i].distance; + } + + memcpy(res_vectors[res_count], coord_map[expanded_nodes_info[i].id], + data_dim * sizeof(T)); + + if (res_tags != nullptr && this->tags != nullptr) { + res_tags[res_count] = this->tags[expanded_nodes_info[i].id]; + } else if (enable_tags) { + throw diskann::ANNException("Could not find tags", -1, __FUNCSIG__, + __FILE__, __LINE__); + } + res_count++; + } + return res_count; + } + + template + size_t PQFlashIndex::cached_beam_search( + const T *query, const _u64 k_search, const _u64 l_search, TagT *res_tags, + float *distances, const _u64 beam_width, QueryStats *stats) { + // iterate to fixed point + std::vector expanded_nodes_info; + expanded_nodes_info.reserve(2 * l_search); + tsl::robin_map coord_map; + + this->disk_iterate_to_fixed_point(query, (_u32) l_search, (_u32) beam_width, + expanded_nodes_info, &coord_map, stats); + // fill in `indices`, `distances` + _u64 res_count = 0; + for (uint32_t i = 0; i < l_search && res_count < k_search; i++) { + if (this->num_frozen_points == 1 && + expanded_nodes_info[i].id == this->frozen_location) + continue; + + if (distances != nullptr) { + distances[res_count] = expanded_nodes_info[i].distance; + } + if (res_tags != nullptr && this->tags != nullptr) { + res_tags[res_count] = this->tags[expanded_nodes_info[i].id]; + } + res_count++; + } + return res_count; + } + + template + size_t PQFlashIndex::cached_beam_search_ids( + const T *query, const _u64 k_search, const _u64 l_search, + uint64_t *res_ids, float *distances, const _u64 beam_width, + QueryStats *stats) { + // iterate to fixed point + std::vector expanded_nodes_info; + expanded_nodes_info.reserve(2 * l_search); + this->disk_iterate_to_fixed_point(query, (_u32) l_search, (_u32) beam_width, + expanded_nodes_info, nullptr, stats); + + _u64 res_count = 0; + for (uint32_t i = 0; i < l_search && res_count < k_search; i++) { + if (this->num_frozen_points == 1 && + expanded_nodes_info[i].id == this->frozen_location) { + continue; + } + + res_ids[res_count] = expanded_nodes_info[i].id; + + if (distances != nullptr) { + distances[res_count] = expanded_nodes_info[i].distance; + } + + res_count++; + } + + return res_count; + } + + template + void PQFlashIndex::disk_iterate_to_fixed_point( + const T *query1, const uint32_t l_search, const uint32_t beam_width, + std::vector & expanded_nodes_info, + tsl::robin_map *coord_map, QueryStats *stats, + ThreadData * passthrough_data, + tsl::robin_set *exclude_nodes) { + // only pull from sector scratch if ThreadData not passed as arg + + ThreadData data; + if (passthrough_data == nullptr) { data = this->thread_data.pop(); + while (data.scratch.sector_scratch == nullptr) { + this->thread_data.wait_for_push_notify(); + data = this->thread_data.pop(); + } + } else { + data = *passthrough_data; } - for (uint32_t i = 0; i < this->data_dim; i++) { - data.scratch.aligned_query_float[i] = query1[i]; + if (data_is_normalized) { + // Data has been normalized. Normalize search vector too. + float norm = diskann::compute_l2_norm(query1, this->data_dim); + for (uint32_t i = 0; i < this->data_dim; i++) { + data.scratch.aligned_query_float[i] = query1[i] / norm; + } + for (uint32_t i = 0; i < this->data_dim; i++) { + data.scratch.aligned_query_T[i] = + (T) data.scratch.aligned_query_float[i]; + } + } else { + for (uint32_t i = 0; i < this->data_dim; i++) { + data.scratch.aligned_query_float[i] = query1[i]; + } + memcpy(data.scratch.aligned_query_T, query1, this->data_dim * sizeof(T)); } - memcpy(data.scratch.aligned_query_T, query1, this->data_dim * sizeof(T)); const T * query = data.scratch.aligned_query_T; const float *query_float = data.scratch.aligned_query_float; @@ -808,21 +995,23 @@ namespace diskann { _u8 * pq_coord_scratch = query_scratch->aligned_pq_coord_scratch; // lambda to batch compute query<-> node distances in PQ space - auto compute_dists = [this, pq_coord_scratch, pq_dists]( - const unsigned *ids, const _u64 n_ids, float *dists_out) { + auto compute_dists = [this, pq_coord_scratch, pq_dists](const unsigned *ids, + const _u64 n_ids, + float *dists_out) { ::aggregate_coords(ids, n_ids, this->data, this->n_chunks, pq_coord_scratch); ::pq_dist_lookup(pq_coord_scratch, n_ids, this->n_chunks, pq_dists, dists_out); }; + Timer query_timer, io_timer, cpu_timer; - std::vector retset(l_search + 1); - tsl::robin_set<_u64> visited(4096); + std::vector retset; + retset.resize(l_search + 1); + tsl::robin_set<_u64> visited(4096); - std::vector full_retset; + // re-naming `expanded_nodes_info` to not change rest of the code + std::vector &full_retset = expanded_nodes_info; full_retset.reserve(4096); - tsl::robin_map<_u64, T *> fp_coords; - _u32 best_medoid = 0; float best_dist = (std::numeric_limits::max)(); std::vector medoid_dists; @@ -852,42 +1041,26 @@ namespace diskann { unsigned k = 0; // cleared every iteration - std::vector frontier; + std::vector frontier; std::vector> frontier_nhoods; - std::vector frontier_read_reqs; + std::vector frontier_read_reqs; std::vector>> cached_nhoods; while (k < cur_list_size) { auto nk = cur_list_size; - // clear iteration state frontier.clear(); frontier_nhoods.clear(); frontier_read_reqs.clear(); cached_nhoods.clear(); sector_scratch_idx = 0; - // find new beam // WAS: _u64 marker = k - 1; _u32 marker = k; _u32 num_seen = 0; - - /* - bool marker_set = false; - diskann::cout << "hop " << hops << ": "; - for (_u32 i = 0; i < cur_list_size; i++) { - diskann::cout << retset[i].id << "( " << retset[i].distance; - if (retset[i].flag && !marker_set) { - diskann::cout << ",*) "; - marker_set = true; - } else - diskann::cout << ") "; - } - diskann::cout << std::endl; - */ while (marker < cur_list_size && frontier.size() < beam_width && - num_seen < beam_width + 2) { + num_seen < beam_width) { if (retset[marker].flag) { num_seen++; auto iter = nhood_cache.find(retset[marker].id); @@ -915,7 +1088,7 @@ namespace diskann { if (stats != nullptr) stats->n_hops++; for (_u64 i = 0; i < frontier.size(); i++) { - auto id = frontier[i]; + auto id = frontier[i]; std::pair<_u32, char *> fnhood; fnhood.first = id; fnhood.second = sector_scratch + sector_scratch_idx * SECTOR_LEN; @@ -934,22 +1107,37 @@ namespace diskann { #ifdef USE_BING_INFRA reader->read(frontier_read_reqs, ctx, true); // async reader windows. #else - reader->read(frontier_read_reqs, ctx); // synchronous IO linux + reader->read(frontier_read_reqs, ctx, false); // synchronous IO linux #endif if (stats != nullptr) { - stats->io_us += io_timer.elapsed(); + stats->io_us += (double) io_timer.elapsed(); } } // process cached nhoods for (auto &cached_nhood : cached_nhoods) { - auto global_cache_iter = coord_cache.find(cached_nhood.first); - T * node_fp_coords_copy = global_cache_iter->second; + auto global_cache_iter = coord_cache.find(cached_nhood.first); + T * node_fp_coords = global_cache_iter->second; + T * node_fp_coords_copy = data_buf + (data_buf_idx * aligned_dim); + data_buf_idx++; + memcpy(node_fp_coords_copy, node_fp_coords, data_dim * sizeof(T)); float cur_expanded_dist = dist_cmp->compare(query, node_fp_coords_copy, (unsigned) aligned_dim); - full_retset.push_back( - Neighbor((unsigned) cached_nhood.first, cur_expanded_dist, true)); - + bool exclude_cur_node = false; + if (exclude_nodes != nullptr) { + exclude_cur_node = + (exclude_nodes->find(cached_nhood.first) != exclude_nodes->end()); + } + // only figure in final list if + if (!exclude_cur_node) { + // added for StreamingMerger calls + if (coord_map != nullptr) { + coord_map->insert( + std::make_pair(cached_nhood.first, node_fp_coords_copy)); + } + full_retset.push_back( + Neighbor((unsigned) cached_nhood.first, cur_expanded_dist, true)); + } _u64 nnbrs = cached_nhood.second.first; unsigned *node_nbrs = cached_nhood.second.second; @@ -957,8 +1145,8 @@ namespace diskann { cpu_timer.reset(); compute_dists(node_nbrs, nnbrs, dist_scratch); if (stats != nullptr) { - stats->n_cmps += nnbrs; - stats->cpu_us += cpu_timer.elapsed(); + stats->n_cmps += (double) nnbrs; + stats->cpu_us += (double) cpu_timer.elapsed(); } // process prefetched nhood @@ -1015,19 +1203,30 @@ namespace diskann { T *node_fp_coords_copy = data_buf + (data_buf_idx * aligned_dim); data_buf_idx++; memcpy(node_fp_coords_copy, node_fp_coords, data_dim * sizeof(T)); - float cur_expanded_dist = dist_cmp->compare(query, node_fp_coords_copy, (unsigned) aligned_dim); - full_retset.push_back( - Neighbor(frontier_nhood.first, cur_expanded_dist, true)); - + bool exclude_cur_node = false; + if (exclude_nodes != nullptr) { + exclude_cur_node = (exclude_nodes->find(frontier_nhood.first) != + exclude_nodes->end()); + } + // if node is to be excluded from final search results + if (!exclude_cur_node) { + // added for StreamingMerger calls + if (coord_map != nullptr) { + coord_map->insert( + std::make_pair(frontier_nhood.first, node_fp_coords_copy)); + } + full_retset.push_back( + Neighbor(frontier_nhood.first, cur_expanded_dist, true)); + } unsigned *node_nbrs = (node_buf + 1); // compute node_nbrs <-> query dist in PQ space cpu_timer.reset(); compute_dists(node_nbrs, nnbrs, dist_scratch); if (stats != nullptr) { - stats->n_cmps += nnbrs; - stats->cpu_us += cpu_timer.elapsed(); + stats->n_cmps += (double) nnbrs; + stats->cpu_us += (double) cpu_timer.elapsed(); } cpu_timer.reset(); @@ -1040,9 +1239,6 @@ namespace diskann { visited.insert(id); cmps++; float dist = dist_scratch[m]; - // diskann::cout << "cmp: " << id << ", dist: " << dist << - // std::endl; - // diskann::cout << "dist: " << dist << std::endl; if (stats != nullptr) { stats->n_cmps++; } @@ -1063,7 +1259,7 @@ namespace diskann { } if (stats != nullptr) { - stats->cpu_us += cpu_timer.elapsed(); + stats->cpu_us += (double) cpu_timer.elapsed(); } } @@ -1083,25 +1279,394 @@ namespace diskann { return left.distance < right.distance; }); - // copy k_search values - for (_u64 i = 0; i < k_search; i++) { - indices[i] = full_retset[i].id; - if (distances != nullptr) { - distances[i] = full_retset[i].distance; + // return data to ConcurrentQueue only if popped from it + if (passthrough_data == nullptr) { + this->thread_data.push(data); + this->thread_data.push_notify_all(); + } + + if (stats != nullptr) { + stats->total_us = (double) query_timer.elapsed(); + } + } + + template + void PQFlashIndex::compute_pq_dists(const T *query, const _u32 *ids, + float * fp_dists, + const _u32 count) { + // TODO (perf) :: more efficient impl without using populate_chunk_distances + ThreadData data = this->thread_data.pop(); + while (data.scratch.sector_scratch == nullptr) { + this->thread_data.wait_for_push_notify(); + data = this->thread_data.pop(); + } + + T *aligned_query = data.scratch.aligned_query_T; + memcpy(aligned_query, query, this->data_dim * sizeof(T)); + auto query_scratch = &(data.scratch); + + // reset query + query_scratch->reset(); + + // query <-> PQ chunk centers distances + float *pq_dists = query_scratch->aligned_pqtable_dist_scratch; + pq_table.populate_chunk_distances(aligned_query, pq_dists); + + _u8 *pq_coord_scratch = query_scratch->aligned_pq_coord_scratch; + + // lambda to batch compute query<-> node distances in PQ space + auto compute_dists = [this, pq_coord_scratch, pq_dists](const unsigned *ids, + const _u64 n_ids, + float *dists_out) { + ::aggregate_coords(ids, n_ids, this->data, this->n_chunks, + pq_coord_scratch); + ::pq_dist_lookup(pq_coord_scratch, n_ids, this->n_chunks, pq_dists, + dists_out); + }; + compute_dists(ids, count, fp_dists); + + // return scratch + this->thread_data.push(data); + this->thread_data.push_notify_all(); + } + + template + void PQFlashIndex::compute_pq_dists(const _u32 src, const _u32 *ids, + float * fp_dists, + const _u32 count, + uint8_t * aligned_scratch) { + const _u8 * src_ptr = this->data + (this->n_chunks * src); + ThreadData data; + bool popped = false; + if (aligned_scratch == nullptr) { + assert(false); + // get buffer to store aggregated coords + data = this->thread_data.pop(); + while (data.scratch.sector_scratch == nullptr) { + this->thread_data.wait_for_push_notify(); + data = this->thread_data.pop(); } + popped = true; + + auto query_scratch = &(data.scratch); + aligned_scratch = query_scratch->aligned_pq_coord_scratch; } + // aggregate PQ coords into scratch + ::aggregate_coords(ids, count, this->data, this->n_chunks, aligned_scratch); + + // compute distances + this->pq_table.compute_distances(src_ptr, aligned_scratch, fp_dists, count); + if (popped) { + // return scratch + this->thread_data.push(data); + this->thread_data.push_notify_all(); + } + } + + template + _u32 PQFlashIndex::merge_read(std::vector> &disk_nodes, + _u32 & start_id, + const _u32 sector_count, + char * scratch) { + assert(start_id % this->nnodes_per_sector == 0); + assert(IS_ALIGNED(scratch, SECTOR_LEN)); + disk_nodes.clear(); + assert(scratch != nullptr); + + ThreadData data = this->thread_data.pop(); + while (data.scratch.sector_scratch == nullptr) { + this->thread_data.wait_for_push_notify(); + data = this->thread_data.pop(); + } + + IOContext & ctx = data.ctx; + std::vector read_req(1); + _u64 start_off = NODE_SECTOR_NO(((size_t) start_id)) * SECTOR_LEN; + _u64 n_sectors = ROUND_UP(this->num_points - start_id, nnodes_per_sector) / + nnodes_per_sector; + n_sectors = std::min(n_sectors, (uint64_t) sector_count); + assert(n_sectors > 0); + read_req[0].buf = scratch; + read_req[0].len = n_sectors * SECTOR_LEN; + read_req[0].offset = start_off; + + // big sequential read + this->reader->read(read_req, ctx); + + // create disk nodes + _u32 cur_node_id = start_id; + for (_u32 i = 0; i < n_sectors; i++) { + char *sector_buf = scratch + (i * SECTOR_LEN); + for (_u32 j = 0; j < nnodes_per_sector && cur_node_id < this->num_points; + j++) { + char *node_buf = OFFSET_TO_NODE(sector_buf, cur_node_id); + disk_nodes.emplace_back(cur_node_id, OFFSET_TO_NODE_COORDS(node_buf), + OFFSET_TO_NODE_NHOOD(node_buf)); + cur_node_id++; + } + } + + // return scratch this->thread_data.push(data); this->thread_data.push_notify_all(); - if (stats != nullptr) { - stats->total_us = (double) query_timer.elapsed(); + // return cur_node_id as starting point for next iteration + return cur_node_id; + } + + template + void PQFlashIndex::scan_deleted_nodes( + const tsl::robin_set &delete_set, + std::vector> &deleted_nodes, char *buf, char *backing_buf, + const uint32_t sectors_per_scan) { + assert(buf != nullptr); + assert(IS_ALIGNED(buf, 4096)); + assert(IS_ALIGNED(backing_buf, 32)); + + uint64_t backing_buf_unit_size = ROUND_UP(this->max_node_len, 32); + uint64_t backing_buf_idx = 0; + + // TODO (perf) :: remove this memset + memset(buf, 0, sectors_per_scan * SECTOR_LEN); + + // get ctx + ThreadData data = this->thread_data.pop(); + while (data.scratch.sector_scratch == nullptr) { + this->thread_data.wait_for_push_notify(); + data = this->thread_data.pop(); + } + + IOContext &ctx = data.ctx; + + uint32_t n_scanned = 0; + uint32_t base_offset = (uint32_t)(NODE_SECTOR_NO(0) * SECTOR_LEN); + std::vector reads(1); + reads[0].buf = buf; + reads[0].len = sectors_per_scan * SECTOR_LEN; + reads[0].offset = base_offset; + while (n_scanned < this->num_points) { + memset(buf, 0, sectors_per_scan * SECTOR_LEN); + assert(this->reader); + + this->reader->read(reads, ctx); + + // scan each sector + for (uint32_t i = 0; i < sectors_per_scan && n_scanned < this->num_points; + i++) { + char *sector_buf = buf + i * SECTOR_LEN; + // scan each node + for (uint32_t j = 0; + j < nnodes_per_sector && n_scanned < this->num_points; j++) { + char *node_buf = OFFSET_TO_NODE(sector_buf, n_scanned); + // if in delete_set, add to deleted_nodes + if (delete_set.find(n_scanned) != delete_set.end()) { + char *buf_start = + backing_buf + (backing_buf_idx * backing_buf_unit_size); + backing_buf_idx++; + memcpy(buf_start, node_buf, max_node_len); + // create disk node object from backing buf instead of `buf` + DiskNode node(n_scanned, OFFSET_TO_NODE_COORDS(buf_start), + OFFSET_TO_NODE_NHOOD(buf_start)); + // uint32_t nnbrs = node.nnbrs; + assert(node.nnbrs < 512); + assert(node.nnbrs > 0); + deleted_nodes.push_back(node); + } + n_scanned++; + } + } + } + + // return ctx + this->thread_data.push(data); + this->thread_data.push_notify_all(); + } + + template + std::vector<_u8> PQFlashIndex::deflate_vector(const T *vec) { + std::vector<_u8> pq_coords(this->n_chunks); + std::vector fp_vec(this->data_dim); + for (uint32_t i = 0; i < this->data_dim; i++) { + fp_vec[i] = (float) vec[i]; + } + this->pq_table.deflate_vec(fp_vec.data(), pq_coords.data()); + return pq_coords; + } + + template<> + std::vector<_u8> PQFlashIndex::deflate_vector(const float *vec) { + std::vector<_u8> pq_coords(this->n_chunks); + this->pq_table.deflate_vec(vec, pq_coords.data()); + return pq_coords; + } + + template + void PQFlashIndex::reload_index( + const std::string &disk_index_file, + const std::string &pq_compressed_vectors, const std::string &tags_file) { + // reload PQ coords + size_t npts_u64, nchunks_u64; + delete this->data; + + diskann::cout << "RELOAD: Loading compressed vectors from " + << pq_compressed_vectors << "\n"; + diskann::load_bin<_u8>(pq_compressed_vectors, data, npts_u64, nchunks_u64); + + this->num_points = npts_u64; + this->n_chunks = nchunks_u64; + + // close current FP + // this->reader->deregister_all_threads(); + this->reader->close(); + + diskann::cout << "RELOAD: Loading graph from " << disk_index_file << "\n"; + // read new graph from disk + std::ifstream diskann_meta(disk_index_file, std::ios::binary); + + // size_t actual_index_size = get_file_size(disk_index_file); + // size_t expected_file_size; + // READ_U64(diskann_meta, expected_file_size); + /* if (actual_index_size != expected_file_size) { + diskann::cout << "File size mismatch for " << disk_index_file + << " (size: " << actual_index_size << ")" + << " with meta-data size: " << expected_file_size + << std::endl; + exit(-1); + } */ + + _u32 nr, nc; + READ_U32(diskann_meta, nr); + READ_U32(diskann_meta, nc); + + _u64 disk_nnodes, ndims; + READ_U64(diskann_meta, disk_nnodes); + READ_U64(diskann_meta, ndims); + + size_t medoid_id_on_file; + READ_U64(diskann_meta, medoid_id_on_file); + diskann::cout << "Medoid-ID: " << medoid_id_on_file << "\n"; + this->medoids[0] = (_u32) medoid_id_on_file; + this->num_medoids = 1; + READ_U64(diskann_meta, max_node_len); + READ_U64(diskann_meta, nnodes_per_sector); + max_degree = ((max_node_len - data_dim * sizeof(T)) / sizeof(unsigned)) - 1; + READ_U64(diskann_meta, this->num_frozen_points); + _u64 file_frozen_id; + READ_U64(diskann_meta, file_frozen_id); + if (this->num_frozen_points == 1) + this->frozen_location = file_frozen_id; + if (this->num_frozen_points == 1) { + diskann::cout << " Detected frozen point in index at location " + << this->frozen_location + << ". Will not output it at search time." << std::endl; + } + size_t tags_offset; + READ_U64(diskann_meta, tags_offset); + + diskann_meta.close(); + + // point AlignedFileReader handle to diskann_file + std::string diskann_fname(disk_index_file); + reader->open(diskann_fname, true, false); +#ifdef _WINDOWS + setup_thread_data(1); +#endif + // skip setup_thread_data() and other load() calls here + + // re-load tags + this->load_tags(tags_file); + + // number of nodes to cache + uint32_t node_cache_count = std::min((_u32) this->nhood_cache.size(), + (_u32) this->coord_cache.size()); + + // clear cache + diskann::cout << "RELOAD: Clearing cache.\n"; + delete[] this->nhood_cache_buf; + this->nhood_cache.clear(); + // buffers allocated via alloc_aligned must be freed using + // aligned_free + // TODO: Revisit why we need alloc_aligned for coord_cache_buf. + aligned_free(this->coord_cache_buf); + // delete[] this->coord_cache_buf; + this->coord_cache.clear(); + + // refresh cache + diskann::cout << "RELOAD: Caching " << node_cache_count << " nodes.\n"; + std::vector node_list; + this->cache_bfs_levels(node_cache_count, node_list); + this->load_cache_list(node_list); + } + + template + void PQFlashIndex::load_tags(const std::string &tag_file_name, + size_t offset) { + if (file_exists(tag_file_name)) { + diskann::cout << "Loading tags from " << tag_file_name << std::endl; + size_t tag_num, tag_dim; + diskann::load_bin(tag_file_name, tags, tag_num, tag_dim, offset); + } else { + diskann::cout << "Tags file " << tag_file_name << " does not exist. " + << std::endl; + } + } + + template + void PQFlashIndex::get_active_tags( + tsl::robin_set &active_tags) { + active_tags.clear(); + if (this->enable_tags) { + for (_u64 i = 0; i < num_points; i++) { + if (this->num_frozen_points > 0) { + if (i != frozen_location) + active_tags.insert(tags[i]); + } else { + active_tags.insert(tags[i]); + } + } } } + template + int PQFlashIndex::get_vector_by_tag(const TagT &tag, + T * vector_coords) { + if (!enable_tags) { + diskann::cout << "Tags are disabled, cannot retrieve vector" << std::endl; + return -1; + } + size_t pos; + bool tag_found = false; + for (size_t i = 0; i < num_points; i++) { + if (tags[i] == tag) { + pos = i; + tag_found = true; + break; + } + } + if (!tag_found) { + diskann::cout << "Tag not found." << std::endl; + return -2; + } + + size_t num_sectors = NODE_SECTOR_NO(pos); + std::ifstream disk_reader(_disk_index_file.c_str(), std::ios::binary); + std::unique_ptr sector_buf = std::make_unique(SECTOR_LEN); + + disk_reader.seekg(SECTOR_LEN * num_sectors, std::ios::beg); + + disk_reader.read(sector_buf.get(), SECTOR_LEN); + + char *node_coords = (OFFSET_TO_NODE(sector_buf.get(), pos)); + memcpy((void *) vector_coords, (void *) node_coords, data_dim * sizeof(T)); + + return 0; + } + #ifdef EXEC_ENV_OLS - template - char *PQFlashIndex::getHeaderBytes() { + template + char *PQFlashIndex::getHeaderBytes() { + this->reader->register_thread(); IOContext & ctx = reader->get_ctx(); AlignedRead readReq; readReq.buf = new char[PQFlashIndex::HEADER_SIZE]; @@ -1118,8 +1683,16 @@ namespace diskann { #endif // instantiations - template class PQFlashIndex<_u8>; - template class PQFlashIndex<_s8>; - template class PQFlashIndex; - + template class PQFlashIndex; + template class PQFlashIndex<_s8, int32_t>; + template class PQFlashIndex<_u8, int32_t>; + template class PQFlashIndex; + template class PQFlashIndex<_s8, uint32_t>; + template class PQFlashIndex<_u8, uint32_t>; + template class PQFlashIndex; + template class PQFlashIndex<_s8, int64_t>; + template class PQFlashIndex<_u8, int64_t>; + template class PQFlashIndex; + template class PQFlashIndex<_s8, uint64_t>; + template class PQFlashIndex<_u8, uint64_t>; } // namespace diskann diff --git a/src/utils.cpp b/src/utils.cpp index c3eec1d918..2b1ce301a8 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -49,12 +49,157 @@ bool cpuHasAvx2Support() { } return false; } + #endif -#ifndef _WINDOWS -bool AvxSupportedCPU = false; -bool Avx2SupportedCPU = true; -#else +#ifdef _WINDOWS bool AvxSupportedCPU = cpuHasAvxSupport(); bool Avx2SupportedCPU = cpuHasAvx2Support(); +#else +bool Avx2SupportedCPU = true; +bool AvxSupportedCPU = false; #endif + +namespace diskann { + // Get the right distance function for the given metric. + template<> + diskann::Distance* get_distance_function(diskann::Metric m) { + if (m == diskann::Metric::L2) { + if (Avx2SupportedCPU) { + diskann::cout << "L2: Using AVX2 distance computation" << std::endl; + return new diskann::DistanceL2(); + } else if (AvxSupportedCPU) { + diskann::cout + << "L2: AVX2 not supported. Using AVX distance computation" + << std::endl; + return new diskann::AVXDistanceL2Float(); + } else { + diskann::cout << "L2: Older CPU. Using slow distance computation" + << std::endl; + return new diskann::SlowDistanceL2Float(); + } + } else if (m == diskann::Metric::COSINE) { + diskann::cout << "Cosine: Using either AVX or AVX2 implementation" + << std::endl; + return new diskann::DistanceCosineFloat(); + } else { + std::stringstream stream; + stream << "Only L2 and cosine metric supported as of now. Email " + "gopalsr@microsoft.com if you need support for any other metric" + << std::endl; + std::cerr << stream.str() << std::endl; + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + } + + template<> + diskann::Distance* get_distance_function(diskann::Metric m) { + if (m == diskann::Metric::L2) { + if (Avx2SupportedCPU) { + diskann::cout << "Using AVX2 distance computation" << std::endl; + return new diskann::DistanceL2Int8(); + } else if (AvxSupportedCPU) { + diskann::cout << "AVX2 not supported. Using AVX distance computation" + << std::endl; + return new diskann::AVXDistanceL2Int8(); + } else { + diskann::cout << "Older CPU. Using slow distance computation" + << std::endl; + return new diskann::SlowDistanceL2Int(); + } + } else if (m == diskann::Metric::COSINE) { + diskann::cout << "Using either AVX or AVX2 for Cosine similarity" + << std::endl; + return new diskann::DistanceCosineInt8(); + } else { + std::stringstream stream; + stream << "Only L2 and cosine metric supported as of now. Email " + "gopalsr@microsoft.com if you need support for any other metric" + << std::endl; + std::cerr << stream.str() << std::endl; + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + } + + template<> + diskann::Distance* get_distance_function(diskann::Metric m) { + if (m == diskann::Metric::L2) { + diskann::cout + << "AVX/AVX2 distance function not defined for Uint8. Using " + "slow version. " + "Contact gopalsr@microsoft.com if you need AVX/AVX2 support." + << std::endl; + return new diskann::DistanceL2UInt8(); + } else if (m == diskann::Metric::COSINE) { + diskann::cout + << "AVX/AVX2 distance function not defined for Uint8. Using " + "slow version. " + "Contact gopalsr@microsoft.com if you need AVX/AVX2 support." + << std::endl; + return new diskann::SlowDistanceCosineUInt8(); + } else { + std::stringstream stream; + stream << "Only L2 and Cosine metric supported as of now. Email " + "gopalsr@microsoft.com if you need any support for any other " + "metric" + << std::endl; + std::cerr << stream.str() << std::endl; + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + } + + void block_convert(std::ofstream& writr, std::ifstream& readr, + float* read_buf, _u64 npts, _u64 ndims) { + readr.read((char*) read_buf, npts * ndims * sizeof(float)); + _u32 ndims_u32 = (_u32) ndims; +#pragma omp parallel for + for (_s64 i = 0; i < (_s64) npts; i++) { + float norm_pt = std::numeric_limits::epsilon(); + for (_u32 dim = 0; dim < ndims_u32; dim++) { + norm_pt += + *(read_buf + i * ndims + dim) * *(read_buf + i * ndims + dim); + } + norm_pt = std::sqrt(norm_pt); + for (_u32 dim = 0; dim < ndims_u32; dim++) { + *(read_buf + i * ndims + dim) = *(read_buf + i * ndims + dim) / norm_pt; + } + } + writr.write((char*) read_buf, npts * ndims * sizeof(float)); + } + + void normalize_data_file(const std::string& inFileName, + const std::string& outFileName) { + std::ifstream readr(inFileName, std::ios::binary); + std::ofstream writr(outFileName, std::ios::binary); + + int npts_s32, ndims_s32; + readr.read((char*) &npts_s32, sizeof(_s32)); + readr.read((char*) &ndims_s32, sizeof(_s32)); + + writr.write((char*) &npts_s32, sizeof(_s32)); + writr.write((char*) &ndims_s32, sizeof(_s32)); + + _u64 npts = (_u64) npts_s32, ndims = (_u64) ndims_s32; + diskann::cout << "Normalizing FLOAT vectors in file: " << inFileName + << std::endl; + diskann::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims + << std::endl; + + _u64 blk_size = 131072; + _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + diskann::cout << "# blks: " << nblks << std::endl; + + float* read_buf = new float[npts * ndims]; + for (_u64 i = 0; i < nblks; i++) { + _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + block_convert(writr, readr, read_buf, cblk_size, ndims); + } + delete[] read_buf; + + diskann::cout << "Wrote normalized points to file: " << outFileName + << std::endl; + } +} // namespace diskann diff --git a/src/v2/delete_set.cpp b/src/v2/delete_set.cpp new file mode 100644 index 0000000000..a7a8247a1d --- /dev/null +++ b/src/v2/delete_set.cpp @@ -0,0 +1,103 @@ +#include "v2/delete_set.h" +#include "tsl/robin_map.h" +#include "tsl/robin_set.h" +#include +#include +#include +#include +#include + +#include "logger.h" + +namespace diskann { + DeleteSet::DeleteSet(uint32_t max_merges) : max_merges(max_merges) { + this->primary = new tsl::robin_map(); + this->secondary = new tsl::robin_map(); + } + + DeleteSet::~DeleteSet() { + std::lock_guard lk(this->lock); + // assert no deleted entries remaining to reconcile + assert(this->primary->empty()); + assert(this->secondary->empty()); + // free both primary & secondary delete lists + delete this->primary; + delete this->secondary; + lk.~lock_guard(); + } + + void DeleteSet::add_delete(uint32_t id) { + std::lock_guard l(this->lock); + // check if already in delete list + bool deleted = (this->primary->find(id) != this->primary->end()) || (this->secondary->find(id) != this->secondary->end()); + if (!deleted) { + this->primary->insert(std::make_pair(id, 0)); + } + } + + bool DeleteSet::is_dead(uint32_t id) { + std::lock_guard l(this->lock); + // fast short-circuit if empty + if(this->secondary->empty()) { + return this->primary->find(id) != this->primary->end(); + } else { + return (this->primary->find(id) != this->primary->end()) || (this->secondary->find(id) != this->secondary->end()); + } + } + + void DeleteSet::batch_is_dead(const uint32_t *ids, bool *dead, + const uint32_t count) { + std::lock_guard l(this->lock); + if (this->secondary->empty()) { + for (uint32_t i = 0; i < count; i++) { + // fast short-circuit if empty + dead[i] = this->primary->find(ids[i]) != this->primary->end(); + } + } else { + for (uint32_t i = 0; i < count; i++) { + // fast short-circuit if empty + dead[i] = (this->primary->find(ids[i]) != this->primary->end()) || + (this->secondary->find(ids[i]) != this->secondary->end()); + } + return; + } + } + + void DeleteSet::merge_start() { + std::lock_guard l(this->lock); + assert(this->secondary->empty()); + std::swap(this->primary, this->secondary); + } + + std::vector DeleteSet::track_merge() { + std::lock_guard l(this->lock); + // increment counts for secondary + for (auto &k_v : *this->secondary) { + this->secondary->operator[](k_v.first)++; + } + + // swap primary & secondary + std::swap(this->primary, this->secondary); + + // merge secondary into primary + for(auto &k_v : *this->secondary) { + this->primary->insert(k_v); + } + + // clear duplicates + this->secondary->clear(); + + // get reclaimed IDs + std::vector reclaimed; + for(auto &k_v : *this->primary) { + if (k_v.second >= this->max_merges) { + reclaimed.push_back(k_v.first); + } + } + for(auto id : reclaimed) { + this->primary->erase(id); + } + + return reclaimed; + } +} // namespace diskann diff --git a/src/v2/fs_allocator.cpp b/src/v2/fs_allocator.cpp new file mode 100644 index 0000000000..4c2001b654 --- /dev/null +++ b/src/v2/fs_allocator.cpp @@ -0,0 +1,65 @@ +#pragma once + +#include "v2/fs_allocator.h" +#include "tsl/robin_set.h" +#include +#include +#include +#include + +#include "utils.h" +#include "logger.h" + +namespace diskann { + + template + FixedSizeAlignedAllocator::FixedSizeAlignedAllocator(const uint32_t ndims, const uint32_t max_count) { + assert(IS_ALIGNED(ndims, 32)); + this->count = ROUND_UP(max_count, 32); + alloc_aligned( (void**)&this->buf, this->count * sizeof(T), 32); + std::vector ids(this->count); + std::iota(ids.begin(), ids.end(), 0); + this->free_set.insert(ids.begin(), ids.end()); + ids.clear(); + } + + template + FixedSizeAlignedAllocator::~FixedSizeAlignedAllocator() { + std::lock_guard lk(this->lock); + assert(this->free_set.size() == this->count); + aligned_free(this->buf); + } + + template + T* FixedSizeAlignedAllocator::allocate(){ + std::lock_guard lk(this->lock); + uint32_t id = std::numeric_limits::max(); + for(auto &v : this->free_set) { + id = v; + break; + } + + if(id == std::numeric_limits::max()) { + std::cerr << "UNABLE TO ALLOCATE MEMORY" << std::endl; + return nullptr; + } else{ + this->free_set.erase(id); + } + return this->buf + (id * ndims); + } + + template + void FixedSizeAlignedAllocator::deallocate(T* ptr) { + assert(IS_ALIGNED(ptr, 32)); + uint32_t id = (uint32_t) (ptr - this->buf) / ndims; + std::lock_guard lk(this->lock); + this->free_set.insert(id); + } + + // vectors + template class FixedSizeAlignedAllocator; + template class FixedSizeAlignedAllocator; + template class FixedSizeAlignedAllocator; + // nhoods + template class FixedSizeAlignedAllocator; +} // namespace diskann diff --git a/src/v2/graph_delta.cpp b/src/v2/graph_delta.cpp new file mode 100644 index 0000000000..07ca956f3a --- /dev/null +++ b/src/v2/graph_delta.cpp @@ -0,0 +1,105 @@ +#include "v2/graph_delta.h" +#include +#include +#include + +#include "utils.h" +#include "logger.h" + +namespace diskann { + GraphDelta::GraphDelta(const uint32_t offset, const uint32_t max_nodes) : offset(offset), max_nodes(max_nodes) { + diskann::cout << "GraphDelta: Allocating " << max_nodes << " deltas\n"; + this->graph.resize(max_nodes); + for (size_t i = 0; i < this->graph.size();i++) { + this->graph[i].shrink_to_fit(); + } + this->locks = std::make_unique(max_nodes); + } + + bool GraphDelta::is_relevant(const uint32_t id) { + return (id < offset + max_nodes && id >= offset); + } + + void GraphDelta::insert_vector(const uint32_t id, const uint32_t*nhood, const uint32_t nnbrs) { + if (!this->is_relevant(id)) { + return; + } + + assert(nhood != nullptr); + + uint32_t local_id = id - offset; + // check valid id + assert(local_id < this->graph.size()); + + // acquire lock + std::lock_guard lock(this->locks[local_id]); + + // copy nhood into graph[local_id], clear existing nbrs + this->graph[local_id].clear(); + this->graph[local_id].insert(this->graph[local_id].end(), nhood, nhood + nnbrs); + this->graph[local_id].shrink_to_fit(); + } + + void GraphDelta::inter_insert(const uint32_t dest, const uint32_t* srcs, const uint32_t src_count){ + assert(srcs != nullptr); + for(uint32_t i=0;i lock(this->locks[local_src_id]); + // add src->dest edge + this->graph[local_src_id].push_back(dest); + this->graph[local_src_id].shrink_to_fit(); + } + } + + const std::vector GraphDelta::get_nhood(const uint32_t id) { + if (!is_relevant(id)) { + return std::vector(); + } + uint32_t local_id = id - offset; + // acquire lock + std::lock_guard lock(this->locks[local_id]); + // add src->dest edge + return this->graph[local_id]; + } + + void GraphDelta::rename_edges(const tsl::robin_map& rename_map) { + std::atomic count; + count.store(0); +#pragma omp parallel for schedule(dynamic, 128) + for(int64_t i=0;i < (int64_t)this->graph.size(); i++) { + std::vector &delta = this->graph[ (uint32_t)i]; + count += delta.size(); + for(uint32_t j=0; j < delta.size(); j++) { + auto iter = rename_map.find(delta[j]); + if (iter != rename_map.end()) { + delta[j] = iter->second; + } + } + } + diskann::cout << "Renamed "<< count.load() << " edges.\n"; + } + + void GraphDelta::rename_edges(const std::function &rename_func) { + std::atomic count; + count.store(0); + #pragma omp parallel for schedule(dynamic, 128) + for(int64_t i=0;i < (int64_t)this->graph.size(); i++) { + std::vector &delta = this->graph[ (uint32_t)i]; + count += delta.size(); + for(uint32_t j=0; j < delta.size(); j++) { + uint32_t renamed_id = rename_func(delta[j]); + if (renamed_id != std::numeric_limits::max()) { + delta[j] = renamed_id; + } + } + } + diskann::cout << "Renamed "<< count.load() << " edges.\n"; + } +}; diff --git a/src/v2/index_merger.cpp b/src/v2/index_merger.cpp new file mode 100644 index 0000000000..837a64d01b --- /dev/null +++ b/src/v2/index_merger.cpp @@ -0,0 +1,1636 @@ +#include "neighbor.h" +#include "timer.h" +#include "tsl/robin_map.h" +#include "tsl/robin_set.h" +#include "utils.h" +#include "v2/index_merger.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tcmalloc/malloc_extension.h" +#include +#include +#include "logger.h" +#include "ann_exception.h" + +#define SECTORS_PER_MERGE (uint64_t) 65536 +// max number of points per mem index being merged -- 32M +#define MAX_PTS_PER_MEM_INDEX (uint64_t)(1 << 25) +#define INDEX_OFFSET (uint64_t)(MAX_PTS_PER_MEM_INDEX * 4) +#define MAX_INSERT_THREADS (uint64_t) 18 +#define MAX_N_THREADS (uint64_t) 18 +#define NUM_INDEX_LOAD_THREADS (uint64_t) 18 +#define PER_THREAD_BUF_SIZE (uint64_t)(65536 * 64 * 4) + +#define PQ_FLASH_INDEX_MAX_NODES_TO_CACHE 200000 + +namespace diskann { + template + StreamingMerger::StreamingMerger( + const uint32_t ndims, Distance *dist, diskann::Metric dist_metric, const uint32_t beam_width, + const uint32_t range, const uint32_t l_index, const float alpha, + const uint32_t maxc, bool single_file_index) { + // book keeping + this->ndims = ndims; + this->aligned_ndims = (_u32) ROUND_UP(this->ndims, 8); + this->range = range; + this->l_index = l_index; + this->beam_width = beam_width; + this->maxc = maxc; + this->alpha = alpha; + this->dist_metric = dist_metric; + this->dist_cmp = dist; + this->_single_file_index = single_file_index; + + std::cout << "StreamingMerger created with R=" << this->range + << " L=" << this->l_index << " BW=" << this->beam_width + << " MaxC=" << this->maxc << " alpha=" << this->alpha + << " ndims: " << this->ndims << std::endl; + } + + template + StreamingMerger::~StreamingMerger() { + // release scratch alloc memory + // delete this->fp_alloc; + // delete this->pq_alloc; + + if (this->disk_index != nullptr) + delete this->disk_index; + + delete this->disk_delta; + + for (auto &delta : this->mem_deltas) { + delete delta; + } + aligned_free((void *) this->thread_pq_scratch); + for (auto &data : this->mem_data) { + //delete[] data; + aligned_free((void *)data); + } + } + + template + void StreamingMerger::process_inserts_pq() { + Timer total_insert_timer; + this->insert_times.resize(MAX_N_THREADS, 0.0); + this->delta_times.resize(MAX_N_THREADS, 0.0); + // iterate through each vector in each mem index + for (uint32_t i = 0; i < this->mem_data.size(); i++) { + diskann::cout << "Processing pq of inserts from mem-DiskANN #" << i + 1 + << "\n"; + const tsl::robin_set &deleted_set = this->mem_deleted_ids[i]; + const T* coords = this->mem_data[i]; + const uint32_t offset = this->offset_ids[i]; + const uint32_t count = this->mem_npts[i]; +// TODO (perf) :: trivially parallelizes ?? +#pragma omp parallel for schedule(dynamic, 1) num_threads(MAX_N_THREADS) + // iteratively insert each point into full index + for (int32_t j = 0; j < (int32_t) count; j++) { + // filter out -- `j` is deleted + if (deleted_set.find((uint32_t) j) != deleted_set.end()) { + continue; + } + + // data for jth point + const T *j_coords = + coords + ((uint64_t)(this->aligned_ndims) * (uint64_t) j); + const uint32_t j_id = offset + (uint32_t) j; + + // get renamed ID + const uint32_t j_renamed = this->rename(j_id); + assert(j_renamed != std::numeric_limits::max()); + + // compute PQ coords + std::vector j_pq_coords = + this->disk_index->deflate_vector(j_coords); + // std::vector j_pq_coords(this->pq_nchunks,0); + + // directly copy into PQFlashIndex PQ data + const uint64_t j_pq_offset = + (uint64_t) j_renamed * (uint64_t) this->pq_nchunks; + memcpy(this->pq_data + j_pq_offset, j_pq_coords.data(), + this->pq_nchunks * sizeof(uint8_t)); + } + } + + diskann::cout << "Finished deflating all points\n"; + double e2e_time = ((double) total_insert_timer.elapsed()) / (1000000.0); + double insert_time = std::accumulate(this->insert_times.begin(), + this->insert_times.end(), 0.0); + double delta_time = std::accumulate(this->delta_times.begin(), + this->delta_times.end(), 0.0); + uint32_t n_inserts = + std::accumulate(this->mem_npts.begin(), this->mem_npts.end(), 0); + diskann::cout << "TIMER:: PQ time per point = " << insert_time / n_inserts + << ", Delta = " << delta_time / n_inserts << "\n"; + diskann::cout << " E2E pq time: " << e2e_time << " sec" << std::endl; + } + + template + void StreamingMerger::process_inserts() { + Timer total_insert_timer; + this->insert_times.resize(MAX_INSERT_THREADS, 0.0); + this->delta_times.resize(MAX_INSERT_THREADS, 0.0); + // iterate through each vector in each mem index + for (uint32_t i = 0; i < this->mem_data.size(); i++) { + diskann::cout << "Processing inserts from mem-DiskANN #" << i + 1 << "\n"; + const tsl::robin_set &deleted_set = this->mem_deleted_ids[i]; + const T* coords = this->mem_data[i]; + const uint32_t offset = this->offset_ids[i]; + const uint32_t count = this->mem_npts[i]; + + size_t cur_cache_size = 0; + MallocExtension::instance()->GetNumericProperty( + "tcmalloc.max_total_thread_cache_bytes", &cur_cache_size); + //diskann::cout << "Current cache size : " << (cur_cache_size >> 10) + // << " KiB\n" + // << std::endl; + MallocExtension::instance()->SetNumericProperty( + "tcmalloc.max_total_thread_cache_bytes", 128 * 1024 * 1024); + + diskann::Timer timer; +#pragma omp parallel for schedule(dynamic, 1) num_threads(MAX_INSERT_THREADS) + // iteratively insert each point into full index + for (int32_t j = 0; j < (int32_t) count; j++) { + // filter out -- `j` is deleted + if (deleted_set.find((uint32_t) j) != deleted_set.end()) { + continue; + } + + if (((j % 100000) == 0) && (j > 0)) { + diskann::cout << "Finished inserting " << j << " points" << std::endl; + std::cout << "When j = " << j + << " elapsed time: " << timer.elapsed() / 1000000 << "s" + << std::endl; + } + // data for jth point + const T *j_coords = + coords + ((uint64_t)(this->aligned_ndims) * (uint64_t) j); + const uint32_t j_id = offset + (uint32_t) j; + + // insert into index + this->insert_mem_vec(j_coords, j_id); + } + } + + diskann::cout << "Finished inserting all points\n"; + double e2e_time = ((double) total_insert_timer.elapsed()) / (1000000.0); + double insert_time = std::accumulate(this->insert_times.begin(), + this->insert_times.end(), 0.0); + double delta_time = std::accumulate(this->delta_times.begin(), + this->delta_times.end(), 0.0); + uint32_t n_inserts = + std::accumulate(this->mem_npts.begin(), this->mem_npts.end(), 0); + diskann::cout << "TIMER:: Insert time per point = " + << insert_time / n_inserts + << ", Delta = " << delta_time / n_inserts << "\n"; + diskann::cout << " E2E insert time: " << e2e_time << " sec" << std::endl; + } + + template + void StreamingMerger::insert_mem_vec(const T * mem_vec, + const uint32_t offset_id) { + Timer timer; + float insert_time, delta_time; + // START: mem_vec has no ID, no presence in system + std::vector pool; + std::vector tmp; + tsl::robin_map coord_map; + + // std::cout << "TID: " << std::this_thread::get_id() + // << " Before offset_iterate_to_Fixed_point()" << std::endl; + // search on combined graph + this->offset_iterate_to_fixed_point(mem_vec, this->l_index, pool, + coord_map); + insert_time = (float) timer.elapsed(); + + // prune neighbors using alpha + std::vector new_nhood; + prune_neighbors(coord_map, pool, new_nhood); + + if (new_nhood.size() > range) { + std::cout << "***ERROR*** After prune, for offset_id: " << offset_id << " found " + << new_nhood.size() << " neighbors instead of range: " << range + << std::endl; + + } + + //this->disk_delta->insert_vector(offset_id, new_nhood.data(), + // (_u32) new_nhood.size()); + this->disk_delta->inter_insert(offset_id, new_nhood.data(), + (_u32) new_nhood.size()); + + // insert into graph + for (auto &delta : this->mem_deltas) { + delta->insert_vector(offset_id, new_nhood.data(), + (_u32) new_nhood.size()); + //delta->inter_insert(offset_id, new_nhood.data(), (_u32) new_nhood.size()); + } + delta_time = (float) timer.elapsed(); + // END: mem_vec now connected with new ID + uint32_t thread_no = omp_get_thread_num(); + this->insert_times[thread_no] += insert_time; + this->delta_times[thread_no] += delta_time; + // std::cout << "TID: " << std::this_thread::get_id() + // << " Exiting insert_mem_vec() " << std::endl; + } + + template + void StreamingMerger::offset_iterate_to_fixed_point( + const T *vec, const uint32_t Lsize, + std::vector & expanded_nodes_info, + tsl::robin_map &coord_map) { + std::vector exp_node_info; + exp_node_info.reserve(2 * Lsize); + tsl::robin_map cmap; + // first hit PQ iterate to fixed point + // NOTE :: handling deletes for disk-index inside this call + // this->disk_iterate_to_fixed_point(vec, this->l_index, exp_node_info, + // exp_node_id, best_l_nodes, cmap); + uint32_t omp_thread_no = omp_get_thread_num(); + if (this->disk_thread_data.size() <= omp_thread_no) { + throw ANNException(std::string("Found ") + std::to_string(omp_thread_no) + + " thread when only " + + std::to_string(this->disk_thread_data.size()) + " were expected", + -1); + } + ThreadData &thread_data = this->disk_thread_data[omp_thread_no]; + // ThreadData * thread_data = nullptr; + + cmap.reserve(2 * Lsize); + this->disk_index->disk_iterate_to_fixed_point( + vec, Lsize, this->beam_width, exp_node_info, &cmap, nullptr, + &thread_data, &this->disk_deleted_ids); + + // reduce and pick top maxc expanded nodes only + std::sort(exp_node_info.begin(), exp_node_info.end()); + // expanded_nodes_info.clear(); + expanded_nodes_info.reserve(this->maxc); + expanded_nodes_info.insert(expanded_nodes_info.end(), exp_node_info.begin(), + exp_node_info.end()); + + // insert only relevant coords into coord_map + for (auto &nbr : expanded_nodes_info) { + uint32_t id = nbr.id; + auto iter = cmap.find(id); + assert(iter != cmap.end()); + coord_map.insert(std::make_pair(iter->first, iter->second)); + } + } + + template + void StreamingMerger::prune_neighbors( + const tsl::robin_map &coord_map, + std::vector &pool, std::vector &pruned_list) { + if (pool.size() == 0) + return; + + // sort the pool based on distance to query + std::sort(pool.begin(), pool.end()); + + std::vector result; + result.reserve(range); + std::vector occlude_factor(pool.size(), 0); + + occlude_list(pool, coord_map, result, occlude_factor); + + pruned_list.clear(); + assert(result.size() <= range); + for (auto iter : result) { + pruned_list.emplace_back(iter.id); + } + + if (alpha > 1) { + for (uint32_t i = 0; i < pool.size() && pruned_list.size() < range; i++) { + if (std::find(pruned_list.begin(), pruned_list.end(), pool[i].id) == + pruned_list.end()) + pruned_list.emplace_back(pool[i].id); + } + } + } + + template + void StreamingMerger::prune_neighbors_pq( + std::vector &pool, std::vector &pruned_list, + uint8_t *scratch) { + if (pool.size() == 0) + return; + + // sort the pool based on distance to query + std::sort(pool.begin(), pool.end()); + + std::vector result; + result.reserve(this->range); + std::vector occlude_factor(pool.size(), 0); + + occlude_list_pq(pool, result, occlude_factor, scratch); + + pruned_list.clear(); + assert(result.size() <= range); + for (auto iter : result) { + pruned_list.emplace_back(iter.id); + } + + if (alpha > 1) { + for (uint32_t i = 0; i < pool.size() && pruned_list.size() < range; i++) { + if (std::find(pruned_list.begin(), pruned_list.end(), pool[i].id) == + pruned_list.end()) + pruned_list.emplace_back(pool[i].id); + } + } + } + + template + void StreamingMerger::occlude_list( + std::vector & pool, + const tsl::robin_map &coord_map, + std::vector &result, std::vector &occlude_factor) { + if (pool.empty()) + return; + assert(std::is_sorted(pool.begin(), pool.end())); + assert(!pool.empty()); + + float cur_alpha = 1; + while (cur_alpha <= alpha && result.size() < range) { + uint32_t start = 0; + while (result.size() < range && (start) < pool.size() && start < maxc) { + auto &p = pool[start]; + if (occlude_factor[start] > cur_alpha) { + start++; + continue; + } + occlude_factor[start] = std::numeric_limits::max(); + result.push_back(p); + for (uint32_t t = start + 1; t < pool.size() && t < maxc; t++) { + if (occlude_factor[t] > alpha) + continue; + auto iter_right = coord_map.find(p.id); + auto iter_left = coord_map.find(pool[t].id); + // HAS to be in coord_map since it was expanded during + // iterate_to_fixed_point + assert(iter_right != coord_map.end()); + assert(iter_left != coord_map.end()); + // WARNING :: correct, but not fast -- NO SIMD version if using MSVC, + // g++ should auto vectorize + float djk = this->dist_cmp->compare(iter_left->second, + iter_right->second, this->ndims); + occlude_factor[t] = + (std::max)(occlude_factor[t], pool[t].distance / djk); + } + start++; + } + cur_alpha *= 1.2f; + } + } + + template + void StreamingMerger::occlude_list_pq( + std::vector &pool, std::vector &result, + std::vector &occlude_factor, uint8_t *scratch) { + if (pool.empty()) + return; + assert(std::is_sorted(pool.begin(), pool.end())); + assert(!pool.empty()); + + float cur_alpha = 1; + while (cur_alpha <= alpha && result.size() < range) { + uint32_t start = 0; + while (result.size() < range && (start) < pool.size() && start < maxc) { + auto &p = pool[start]; + if (occlude_factor[start] > cur_alpha) { + start++; + continue; + } + occlude_factor[start] = std::numeric_limits::max(); + result.push_back(p); + for (uint32_t t = start + 1; t < pool.size() && t < maxc; t++) { + if (occlude_factor[t] > alpha) + continue; + // djk = dist(p.id, pool[t.id]) + float djk; + this->disk_index->compute_pq_dists(p.id, &(pool[t].id), &djk, 1, + scratch); + occlude_factor[t] = + (std::max)(occlude_factor[t], pool[t].distance / djk); + } + start++; + } + cur_alpha *= 1.2f; + } + } + + template + void StreamingMerger::dump_to_disk(const uint32_t start_id, + const char * buf, + const uint32_t n_sectors, + std::ofstream & output_writer) { + assert(start_id % this->nnodes_per_sector == 0); + uint32_t start_sector = (start_id / this->nnodes_per_sector) + 1; + uint64_t start_off = start_sector * (uint64_t) SECTOR_LEN; + + // seek fp + output_writer.seekp(start_off, std::ios::beg); + + // dump + output_writer.write(buf, (uint64_t) n_sectors * (uint64_t) SECTOR_LEN); + + uint64_t nb_written = + (uint64_t) output_writer.tellp() - (uint64_t) start_off; + if (nb_written != (uint64_t) n_sectors * (uint64_t) SECTOR_LEN) { + std::stringstream sstream; + sstream << "ERROR!!! Wrote " << nb_written << " bytes to disk instead of " + << ((uint64_t) n_sectors) * SECTOR_LEN; + diskann::cerr << sstream.str() << std::endl; + throw diskann::ANNException(sstream.str(), -1, __FUNCSIG__, __FILE__, + __LINE__); + } + } + + template + void StreamingMerger::compute_deleted_ids() { + // process disk deleted tags + for (uint32_t i = 0; i < this->disk_npts; i++) { + TagT i_tag = this->disk_tags[i]; + if (this->deleted_tags.find(i_tag) != this->deleted_tags.end()) { + this->disk_deleted_ids.insert(i); + } + } + diskann::cout << "Found " << this->disk_deleted_ids.size() + << " tags to delete from SSD-DiskANN\n"; + + this->mem_deleted_ids.resize(this->mem_data.size()); + for (uint32_t i = 0; i < this->mem_data.size(); i++) { + tsl::robin_set &deleted_ids = this->mem_deleted_ids[i]; + for (uint32_t id = 0; id < this->mem_npts[i]; id++) { + const TagT tag = this->mem_tags[i][id]; + //if (this->deleted_tags.find(tag) != this->deleted_tags.end()) { + // deleted_ids.insert(id); + //} + if (this->latter_deleted_tags[i].find(tag) != + this->latter_deleted_tags[i].end()) { + deleted_ids.insert(id); + } + } + diskann::cout << "Found " << deleted_ids.size() + << " tags to delete from mem-DiskANN #" << i + 1 << "\n"; + } + } + + template + void StreamingMerger::process_deletes() { + // buf to hold data being read + char *buf = nullptr; + alloc_aligned((void **) &buf, SECTORS_PER_MERGE * SECTOR_LEN, SECTOR_LEN); + + // open output file for writing + // Was: this->disk_index_out_path + "_disk.index"; + + diskann::cout << "Writing delete consolidated graph to " + << this->temp_disk_index_path << std::endl; + std::ofstream output_writer(this->temp_disk_index_path, + std::ios::out | std::ios::binary); + assert(output_writer.is_open()); + // skip writing header for now + // this->output_writer.seekp(SECTOR_LEN, std::ios::beg); + std::unique_ptr sector_buf = std::make_unique(SECTOR_LEN); + output_writer.write(sector_buf.get(), SECTOR_LEN); + + Timer delete_timer; + // batch consolidate deletes + std::vector> disk_nodes; + std::vector>> id_nhoods; + uint32_t start_id = 0, new_start_id; + diskann::cout << "Consolidating deletes\n"; + + while (start_id < this->disk_npts) { + new_start_id = this->disk_index->merge_read(disk_nodes, start_id, + SECTORS_PER_MERGE, buf); +#pragma omp parallel for schedule(dynamic, 128) num_threads(MAX_N_THREADS) + for (int64_t i = 0; i < (int64_t) disk_nodes.size(); i++) { + // get thread-specific scratch + int omp_thread_no = omp_get_thread_num(); + uint8_t *pq_coord_scratch = this->thread_bufs[omp_thread_no]; + assert(pq_coord_scratch != nullptr); + DiskNode &disk_node = disk_nodes[i]; + this->consolidate_deletes(disk_node, pq_coord_scratch); + } + for (auto &disk_node : disk_nodes) { + if (this->is_deleted(disk_node)) { + this->free_ids.push_back(disk_node.id); + } + } + + uint64_t prev_pos = output_writer.tellp(); + this->dump_to_disk(start_id, buf, SECTORS_PER_MERGE, output_writer); + output_writer.flush(); + uint64_t cur_pos = output_writer.tellp(); + if (!(cur_pos - prev_pos == (SECTORS_PER_MERGE * SECTOR_LEN))) + diskann::cout << "ERROR! During dumping to disk" << std::endl; + + // advance to next block + disk_nodes.clear(); + id_nhoods.clear(); + diskann::cout << new_start_id << " / " << this->disk_npts + << " nodes processed.\n"; + start_id = new_start_id; + + } + double e2e_time = ((double) delete_timer.elapsed()) / (1000000.0); + diskann::cout << "Processed Deletes in " << e2e_time << " s." << std::endl; + diskann::cout << "Writing header.\n"; + + // write header + output_writer.seekp(0, std::ios::beg); + // HEADER --> [_u32 #metadata items][_u32 1][_u64 nnodes][_u64 ndims][_u64 + // medoid ID] + // [_u64 max_node_len][_u64 nnodes_per_sector][_u64 #frozen points in vamana + // index][_u64 frozen point location][_u64 file size] + uint64_t file_size = + SECTOR_LEN + (ROUND_UP(ROUND_UP(this->disk_npts, nnodes_per_sector) / + nnodes_per_sector, + SECTORS_PER_MERGE)) * + (uint64_t) SECTOR_LEN; + std::vector output_metadata; + output_metadata.push_back(this->disk_npts); + output_metadata.push_back((uint64_t) this->ndims); + // determine medoid + uint64_t medoid = this->init_ids[0]; + // TODO (correct?, misc) :: better way of selecting new medoid + while (this->disk_deleted_ids.find((_u32) medoid) != + this->disk_deleted_ids.end()) { + diskann::cout << "Medoid deleted. Choosing another start node.\n"; + auto iter = this->disk_deleted_nhoods.find((_u32) medoid); + assert(iter != this->disk_deleted_nhoods.end()); + medoid = iter->second[0]; + } + output_metadata.push_back((uint64_t) medoid); + uint64_t max_node_len = (this->ndims * sizeof(T)) + sizeof(uint32_t) + + (this->range * sizeof(uint32_t)); + uint64_t nnodes_per_sector = SECTOR_LEN / max_node_len; + output_metadata.push_back(max_node_len); + output_metadata.push_back(nnodes_per_sector); + output_metadata.push_back(this->disk_index_num_frozen); + output_metadata.push_back(this->disk_index_frozen_loc); + output_metadata.push_back(file_size); + + // close index + output_writer.close(); + diskann::save_bin<_u64>(this->temp_disk_index_path, output_metadata.data(), + output_metadata.size(), 1, 0); + + // free buf + aligned_free((void *) buf); + + // free backing buf for deletes + aligned_free((void *) this->delete_backing_buf); + } + + template + void StreamingMerger::populate_deleted_nhoods() { + // buf for scratch + char *buf = nullptr; + alloc_aligned((void **) &buf, SECTORS_PER_MERGE * SECTOR_LEN, SECTOR_LEN); + + // scan deleted nodes and get + std::vector> deleted_nodes; + uint64_t backing_buf_size = (uint64_t) this->disk_deleted_ids.size() * + ROUND_UP(this->max_node_len, 32); + backing_buf_size = ROUND_UP(backing_buf_size, 256); + diskann::cout << "ALLOC: " << (backing_buf_size << 10) + << "KiB aligned buffer for deletes.\n"; + alloc_aligned((void **) &this->delete_backing_buf, backing_buf_size, 256); + memset(this->delete_backing_buf, 0, backing_buf_size); + this->disk_index->scan_deleted_nodes(this->disk_deleted_ids, deleted_nodes, + buf, this->delete_backing_buf, + SECTORS_PER_MERGE); + + // insert into deleted_nhoods + this->disk_deleted_nhoods.clear(); + this->disk_deleted_nhoods.reserve(deleted_nodes.size()); + for (auto &nhood : deleted_nodes) { + // WARNING :: ASSUMING DISK GRAPH DEGREE NEVER GOES OVER 512 + assert(nhood.nnbrs < 512); + std::vector non_deleted_nbrs; + for (uint32_t i = 0; i < nhood.nnbrs; i++) { + uint32_t id = nhood.nbrs[i]; + auto iter = this->disk_deleted_ids.find(id); + if (iter == this->disk_deleted_ids.end()) { + non_deleted_nbrs.push_back(id); + } + } + this->disk_deleted_nhoods.insert( + std::make_pair(nhood.id, non_deleted_nbrs)); + } + + // free buf + aligned_free((void *) buf); + assert(deleted_nodes.size() == this->disk_deleted_ids.size()); + assert(this->disk_deleted_nhoods.size() == this->disk_deleted_ids.size()); + } + + template + void StreamingMerger::consolidate_deletes(DiskNode &disk_node, + uint8_t * scratch) { + // if node is deleted + if (this->is_deleted(disk_node)) { + disk_node.nnbrs = 0; + *(disk_node.nbrs - 1) = 0; + return; + } + + const uint32_t id = disk_node.id; + + assert(disk_node.nnbrs < 512); + + + std::vector id_nhood(disk_node.nbrs, + disk_node.nbrs + disk_node.nnbrs); + + tsl::robin_set new_edges; + + bool change = false; + for (auto &nbr : id_nhood) { + auto iter = this->disk_deleted_nhoods.find(nbr); + if (iter != this->disk_deleted_nhoods.end()) { + change = true; + new_edges.insert(iter->second.begin(), iter->second.end()); + } else { + new_edges.insert(nbr); + } + } + // no refs to deleted nodes --> move to next node + if (!change) { + return; + } + + // refs to deleted nodes + id_nhood.clear(); + id_nhood.reserve(new_edges.size()); + for (auto &nbr : new_edges) { + // 2nd order deleted edge + auto iter = this->disk_deleted_ids.find(nbr); + if (iter != this->disk_deleted_ids.end()) { + continue; + } else { + id_nhood.push_back(nbr); + } + } + + // TODO (corner case) :: id_nhood might be empty in adversarial cases + if (id_nhood.empty()) { + diskann::cout << "Adversarial case -- all neighbors of node's neighbors " + "deleted -- ID : " + << id << "; exiting\n"; + exit(-1); + } + + // compute PQ dists and shrink + std::vector id_nhood_dists(id_nhood.size(), 0.0f); + assert(scratch != nullptr); + this->disk_index->compute_pq_dists(id, id_nhood.data(), + id_nhood_dists.data(), + (_u32) id_nhood.size(), scratch); + + // prune neighbor list using PQ distances + std::vector cand_nbrs(id_nhood.size()); + for (uint32_t i = 0; i < id_nhood.size(); i++) { + cand_nbrs[i].id = id_nhood[i]; + // auto iter = this->disk_deleted_ids.find(id_nhood[i]); + // assert(iter == this->disk_deleted_ids.end()); + cand_nbrs[i].distance = id_nhood_dists[i]; + } + // sort and keep only maxc neighbors + std::sort(cand_nbrs.begin(), cand_nbrs.end()); + if (cand_nbrs.size() > this->maxc) { + cand_nbrs.resize(this->maxc); + } + std::vector pruned_nbrs; + std::vector occlude_factor(cand_nbrs.size(), 0.0f); + pruned_nbrs.reserve(this->range); + this->occlude_list_pq(cand_nbrs, pruned_nbrs, occlude_factor, scratch); + + // copy back final nbrs + disk_node.nnbrs = (_u32) pruned_nbrs.size(); + *(disk_node.nbrs - 1) = disk_node.nnbrs; + for (uint32_t i = 0; i < (_u32) pruned_nbrs.size(); i++) { + disk_node.nbrs[i] = pruned_nbrs[i].id; + // auto iter = this->disk_deleted_ids.find(disk_node.nbrs[i]); + // assert(iter == this->disk_deleted_ids.end()); + } + } + + template + bool StreamingMerger::is_deleted(const DiskNode &disk_node) { + // short circuit when disk_node is a `hole` on disk + if (this->disk_tags[disk_node.id] == std::numeric_limits::max()) { + if (disk_node.nnbrs != 0) { + throw diskann::ANNException(std::string("Found node with id: ") + + std::to_string(disk_node.id) + + " that has non-zero degree.", + -1, __FUNCSIG__, __FILE__, __LINE__); + diskann::cerr << "Node with id " << disk_node.id + << " is a hole but has non-zero degree " + << disk_node.nnbrs << std::endl; + } else { + return true; + } + } + return (this->disk_deleted_ids.find(disk_node.id) != + this->disk_deleted_ids.end()); + } + + template + void StreamingMerger::compute_rename_map() { + uint32_t needed = 0; + for (auto &mem_npt : this->mem_npts) { + needed += mem_npt; + } + for (auto &del_set : this->mem_deleted_ids) { + needed -= (_u32) del_set.size(); + } + diskann::cout << "RENAME: Need " << needed + << ", free: " << this->free_ids.size() << "\n"; + + uint32_t last_id = this->disk_npts; + if (needed > this->free_ids.size()) { + this->free_ids.reserve(needed); + } + while (this->free_ids.size() < needed) { + this->free_ids.push_back(last_id); + last_id++; + } + + // assign free IDs to all new IDs + diskann::cout << "RENAME: Assigning IDs.\n"; + uint32_t next_free_index = 0; + this->rename_map.reserve(needed); + this->inverse_map.reserve(needed); + std::vector> rename_pairs(needed); + std::vector> inverse_pairs(needed); + for (uint32_t mem_id = 0; mem_id < this->mem_data.size(); mem_id++) { + diskann::cout << "Processing Mem-DiskANN #" << mem_id + 1 << "\n"; + uint32_t offset = this->offset_ids[mem_id]; + const tsl::robin_set &del_set = this->mem_deleted_ids[mem_id]; + std::vector deleted(this->mem_npts[mem_id], false); + for (auto &id : del_set) { + deleted[id] = true; + } + for (uint32_t j = 0; j < this->mem_npts[mem_id]; j++) { + // ignore any deleted points + if (deleted[j]) { + continue; + } + const uint32_t new_id = this->free_ids[next_free_index]; + assert(new_id < last_id); + rename_pairs[next_free_index].first = offset + j; + rename_pairs[next_free_index].second = new_id; + inverse_pairs[next_free_index].first = new_id; + inverse_pairs[next_free_index].second = offset + j; + next_free_index++; + } + } + diskann::cout << "RENAME: Storing mappings for " << next_free_index + << " points.\n"; + this->rename_list.clear(); + this->rename_list.reserve(next_free_index); + this->rename_list.insert(this->rename_list.end(), rename_pairs.begin(), + rename_pairs.end()); + this->inverse_list.clear(); + this->inverse_list.reserve(next_free_index); + this->inverse_list.insert(this->inverse_list.end(), inverse_pairs.begin(), + inverse_pairs.end()); + } + + template + uint32_t StreamingMerger::rename(uint32_t id) const { + auto iter = std::lower_bound( + this->rename_list.begin(), this->rename_list.end(), + std::make_pair(id, std::numeric_limits::max()), + [](const auto &left, const auto &right) { + return left.first < right.first; + }); + if (iter == this->rename_list.end()) { + return std::numeric_limits::max(); + } else { + uint32_t idx = (_u32) std::distance(this->rename_list.begin(), iter); + const std::pair &p = this->rename_list[idx]; + if (p.first == id) + return p.second; + else + return std::numeric_limits::max(); + } + } + + template + uint32_t StreamingMerger::rename_inverse(uint32_t renamed_id) const { + auto iter = std::lower_bound( + this->inverse_list.begin(), this->inverse_list.end(), + std::make_pair(renamed_id, std::numeric_limits::max()), + [](const auto &left, const auto &right) { + return left.first < right.first; + }); + if (iter == this->inverse_list.end()) { + return std::numeric_limits::max(); + } else { + uint32_t idx = (_u32) std::distance(this->inverse_list.begin(), iter); + const std::pair &p = this->inverse_list[idx]; + if (p.first == renamed_id) + return p.second; + else + return std::numeric_limits::max(); + } + } + + template + void StreamingMerger::rename(DiskNode &node) const { + uint32_t renamed_id = this->rename(node.id); + if (renamed_id != std::numeric_limits::max()) { + node.id = renamed_id; + } + uint32_t nnbrs = node.nnbrs; + for (uint32_t i = 0; i < nnbrs; i++) { + uint32_t renamed_nbr_i = this->rename(node.nbrs[i]); + if (renamed_nbr_i != std::numeric_limits::max()) { + node.nbrs[i] = renamed_nbr_i; + } + } + } + + template + void StreamingMerger::rename(std::vector &ids) const { + for (uint32_t i = 0; i < ids.size(); i++) { + uint32_t renamed_id = this->rename(ids[i]); + if (renamed_id != std::numeric_limits::max()) { + ids[i] = renamed_id; + } + } + } + + template + uint32_t StreamingMerger::get_index_id( + const uint32_t offset_id) const { + if (offset_id < this->offset_ids[0]) { + return std::numeric_limits::max(); + } + // should not happen unless some buffer is corrupted + if (offset_id > this->offset_ids.back() + INDEX_OFFSET) { + diskann::cout << "Seen: " << offset_id << ", min: " << offset_ids[0] + << ", max: " << offset_ids.back() << "\n"; + } + assert(offset_id < this->offset_ids.back() + INDEX_OFFSET); + uint32_t index_no = + (uint32_t)((offset_id - this->offset_ids[0]) / INDEX_OFFSET); + assert(index_no < this->offset_ids.size()); + return index_no; + } + + template + std::vector StreamingMerger::get_edge_list( + const uint32_t offset_id) { + const uint32_t index_no = this->get_index_id(offset_id); + if (index_no == std::numeric_limits::max()) { + assert(offset_id < this->offset_ids[0]); + return this->disk_delta->get_nhood(offset_id); + } + // uint32_t local_id = offset_id - this->offset_ids[index_no]; + // assert(local_id < this->mem_npts[index_no]); + std::vector ret = + this->mem_deltas[index_no]->get_nhood(offset_id); + // this->rename(ret); + return ret; + } + + template + const T *StreamingMerger::get_mem_data(const uint32_t offset_id) { + const uint32_t index_no = this->get_index_id(offset_id); + if (index_no == std::numeric_limits::max()) { + assert(offset_id < this->offset_ids[0]); + return nullptr; + } + uint32_t local_id = offset_id - this->offset_ids[index_no]; + assert(local_id < this->mem_npts[index_no]); + return this->mem_data[index_no] + + ((uint64_t) local_id * (uint64_t) this->aligned_ndims); + } + + template + void StreamingMerger::write_tag_file( + const std::string &tag_out_filename, const uint32_t npts) { + diskann::Timer timer; + diskann::cout << "Writing new tags to " << tag_out_filename << "\n"; + + TagT *cur_tags; + + size_t allocSize = npts * sizeof(TagT); + alloc_aligned(((void **) &cur_tags), allocSize, 8 * sizeof(TagT)); + + //TODO: We must detect holes in a better way. Currently, it is possible + //that one of the tags will be uint32_t::max() and will fail. + for (uint32_t i = 0; i < npts; i++) { + TagT cur_tag; + // check if `i` is in inverse map + const uint32_t offset_id = this->rename_inverse(i); + if (offset_id == std::numeric_limits::max()) { + cur_tag = this->disk_tags[i]; + if (this->deleted_tags.find(cur_tag) != this->deleted_tags.end()) { + *(cur_tags + i) = std::numeric_limits::max(); + } else + *(cur_tags + i) = cur_tag; + } else { + const uint32_t index_no = this->get_index_id(offset_id); + const uint32_t index_local_id = offset_id - this->offset_ids[index_no]; + cur_tag = this->mem_tags[index_no][index_local_id]; + if (this->latter_deleted_tags[index_no].find(cur_tag) != + this->latter_deleted_tags[index_no].end()) { + *(cur_tags + i) = std::numeric_limits::max(); + } else + *(cur_tags + i) = cur_tag; + } + } + diskann::save_bin(tag_out_filename, cur_tags, npts, 1); + + diskann::cout << "Tags written to " << tag_out_filename << " in " << timer.elapsed() + << " microsec" << std::endl; + + //Should not mix delete with alloc aligned + //TODO: This will work because we are dealing with uint64 at the moment. + //If we ever have string tags, this'll fail spectacularly. + //delete[] cur_tags; + aligned_free(cur_tags); + // release all tags -- automatically deleted since using `unique_ptr` + this->mem_tags.clear(); + } + + template + void StreamingMerger::process_merges() { + // buf to hold data being read + char *buf = nullptr; + alloc_aligned((void **) &buf, SECTORS_PER_MERGE * SECTOR_LEN, SECTOR_LEN); + + Timer merge_timer; + std::unique_ptr sector_buf = std::make_unique(SECTOR_LEN); + + std::ofstream output_writer(this->final_index_file, + std::ios::binary | std::ios::ate); + + output_writer.write(sector_buf.get(), SECTOR_LEN); + // start at sector=1 in output file for reading + writing + uint64_t cur_offset = SECTOR_LEN; + + // batch consolidate deletes + std::vector> disk_nodes; + std::vector>> id_nhoods; + uint32_t start_id = 0, new_start_id; + diskann::cout << "Merging inserts into SSD-DiskANN.\n"; + uint64_t delta_avg = 0, delta_max = 0, delta_count = 0; + std::atomic counts; + counts.store(0); + + // aux_writer << "buf_min = " << (uint64_t) buf << ", buf_max = " << + // (uint64_t) (buf + SECTORS_PER_MERGE * SECTOR_LEN) << "\n"; + while (start_id < this->disk_npts) { + // zero buf for better consistency + memset(buf, 0, SECTORS_PER_MERGE * SECTOR_LEN); + new_start_id = this->disk_index->merge_read(disk_nodes, start_id, + SECTORS_PER_MERGE, buf); +#pragma omp parallel for schedule(dynamic, 128) num_threads(MAX_N_THREADS) + for (int64_t idx = 0; idx < (int64_t) disk_nodes.size(); idx++) { + // get thread-specific scratch + int omp_thread_no = omp_get_thread_num(); + uint8_t *thread_scratch = this->thread_bufs[omp_thread_no]; + + DiskNode &disk_node = disk_nodes[idx]; + uint32_t id = disk_node.id; + + std::vector nhood; + std::vector deltas; + uint32_t offset_id = this->rename_inverse(id); + // replaced by new vector, copy coords and proceed as normal + if (offset_id != std::numeric_limits::max()) { + // copy coords + const T *vec = this->get_mem_data(offset_id); + assert(vec != nullptr); + memcpy(disk_node.coords, vec, this->ndims * sizeof(T)); + disk_node.nnbrs = 0; + *(disk_node.nbrs - 1) = 0; // also set on buffer + deltas = this->get_edge_list(offset_id); + // delta_count++; + // delta_avg += deltas.size(); + // delta_max = std::max(delta_max, (uint64_t) deltas.size()); + } else { + // not replaced + deltas = this->get_edge_list(id); + delta_count++; + delta_avg += deltas.size(); + delta_max = std::max(delta_max, (uint64_t) deltas.size()); + } + + // if no edges to add, continue + if (deltas.empty()) { + continue; + } + + uint32_t nnbrs = disk_node.nnbrs; + nhood.insert(nhood.end(), disk_node.nbrs, disk_node.nbrs + nnbrs); + nhood.insert(nhood.end(), deltas.begin(), deltas.end()); + // rename nbrs in nhood to use PQ dist comparisons + // this->rename(nhood); // skipping since get_edge_list() renames delta + // edges + + // prune neighbor list ONLY if exceeding graph max out-degree (`range`) + if (nhood.size() > this->range) { + std::vector dists(nhood.size(), 0.0f); + std::vector pool(nhood.size()); + this->disk_index->compute_pq_dists(id, nhood.data(), dists.data(), + (_u32) nhood.size(), + thread_scratch); + for (uint32_t k = 0; k < nhood.size(); k++) { + pool[k].id = nhood[k]; + pool[k].distance = dists[k]; + // diskann::cout << k << ": id=" << nhood[k] << ", dist=" << + // dists[k] << "\n"; + } + nhood.clear(); + // prune pool + std::sort(pool.begin(), pool.end()); + this->prune_neighbors_pq(pool, nhood, thread_scratch); + } + // copy edges from nhood to disk node + disk_node.nnbrs = (_u32) nhood.size(); + // *(disk_node.nbrs - 1) = nhood.size(); // write to buf + *(disk_node.nbrs - 1) = (_u32) nhood.size(); // write to buf + for (uint32_t i = 0; i < disk_node.nnbrs; i++) { + disk_node.nbrs[i] = nhood[i]; + } + memcpy(disk_node.nbrs, nhood.data(), + disk_node.nnbrs * sizeof(uint32_t)); + // aux_writer << "disk_node.nbrs = " << (uint64_t) disk_node.nbrs << + // ", id = "; + uint32_t lcounts = 0; + for (auto &nbr : nhood) { + if (nbr >= 980000) + lcounts++; + } + counts += lcounts; + } + + cur_offset += SECTORS_PER_MERGE * SECTOR_LEN; + output_writer.write(buf, SECTORS_PER_MERGE * SECTOR_LEN); + diskann::cout << new_start_id << " / " << this->disk_npts + << " nodes processed.\n"; + start_id = new_start_id; + } + diskann::cout << "Delta statistics:\nMax: " << delta_max + << ", Avg: " << (float) delta_avg / (float) delta_count + << "\n"; + diskann::cout << "Old -> new edges: " << counts.load() << "\n"; + + // close index + output_writer.close(); + + // [_u64 file size][_u64 nnodes][_u64 medoid ID][_u64 max_node_len][_u64 + // nnodes_per_sector] + uint64_t file_size = + SECTOR_LEN + (ROUND_UP(ROUND_UP(this->disk_npts, nnodes_per_sector) / + nnodes_per_sector, + SECTORS_PER_MERGE)) * + (uint64_t) SECTOR_LEN; + memset(buf, 0, SECTORS_PER_MERGE * SECTOR_LEN); + std::vector output_metadata; + output_metadata.push_back((uint64_t) this->disk_npts); + output_metadata.push_back((uint64_t) this->ndims); + // determine medoid + uint64_t medoid = this->init_ids[0]; + output_metadata.push_back((uint64_t) medoid); + uint64_t max_node_len = this->ndims * sizeof(T) + sizeof(uint32_t) + + this->range * sizeof(uint32_t); + uint64_t nnodes_per_sector = SECTOR_LEN / max_node_len; + output_metadata.push_back(max_node_len); + output_metadata.push_back(nnodes_per_sector); + output_metadata.push_back(this->disk_index_num_frozen); + output_metadata.push_back(this->disk_index_frozen_loc); + output_metadata.push_back(file_size); + + diskann::save_bin<_u64>(final_index_file, output_metadata.data(), + output_metadata.size(), 1, 0); + // free buf + aligned_free((void *) buf); + double e2e_time = ((double) merge_timer.elapsed()) / (1000000.0); + diskann::cout << "Time to merge the inserts to disk: " << e2e_time << "s." + << std::endl; + } + + + template + void StreamingMerger::merge(const char * disk_in, + const std::vector &mem_in, + const char * disk_out, + std::vector*> &deleted_tags_vectors, + std::string &working_folder) { + // load disk index + this->disk_index_out_path = disk_out; + this->disk_index_in_path = disk_in; + this->TMP_FOLDER = working_folder; + this->temp_disk_index_path = getTempFilePath(working_folder, "temp_disk_index"); + this->temp_pq_coords_path = getTempFilePath(working_folder, "temp_pq_compressed"); + this->temp_tags_path = getTempFilePath(working_folder, "temp_tags"); + this->final_index_file = + this->_single_file_index ? this->disk_index_out_path + : this->disk_index_out_path + "_disk.index"; + this->final_pq_coords_file = + this->_single_file_index + ? this->disk_index_out_path + : this->disk_index_out_path + "_pq_compressed.bin"; + this->final_tags_file = + this->_single_file_index + ? this->disk_index_out_path + : this->disk_index_out_path + "_disk.index.tags"; + + +#ifndef _WINDOWS + std::shared_ptr reader = + std::make_shared(); +#else + std::shared_ptr reader = + std::make_shared(); +#endif + + // std::shared_ptr reader = + // std::make_shared(); + this->disk_index = new PQFlashIndex( + this->dist_metric, reader, this->_single_file_index, true); + diskann::cout << "Created PQFlashIndex inside index_merger " << std::endl; + + diskann::cout << "Loading PQFlashIndex from file: " << disk_in + << " into object: " << std::hex << (_u64) & + (this->disk_index) << std::dec << std::endl; + this->disk_index->load(disk_in, NUM_INDEX_LOAD_THREADS); + + uint32_t node_cache_count = 1 + (uint32_t) round(this->disk_index->return_nd() * 0.01); + node_cache_count = node_cache_count > PQ_FLASH_INDEX_MAX_NODES_TO_CACHE + ? PQ_FLASH_INDEX_MAX_NODES_TO_CACHE + : node_cache_count; + std::vector cache_node_list; + this->disk_index->cache_bfs_levels(node_cache_count, + cache_node_list); + this->disk_index->load_cache_list(cache_node_list); + this->disk_tags = this->disk_index->get_tags(); + this->init_ids = this->disk_index->get_init_ids(); + this->disk_npts = (_u32) this->disk_index->return_nd(); + this->disk_thread_data = this->disk_index->get_thread_data(); + auto res_pq = this->disk_index->get_pq_config(); + this->pq_data = res_pq.first; + this->pq_nchunks = res_pq.second; + this->nnodes_per_sector = (_u32) this->disk_index->nnodes_per_sector; + this->max_node_len = (_u32) this->disk_index->max_node_len; + _u32 max_degree = + (max_node_len - (sizeof(T) * this->ndims)) / sizeof(uint32_t) - 1; + this->range = max_degree; + diskann::cout << "Setting range to: " << this->range << std::endl; + this->disk_index_num_frozen = this->disk_index->get_num_frozen_points(); + this->disk_index_frozen_loc = this->disk_index->get_frozen_loc(); + + // create deltas + this->disk_delta = new GraphDelta(0, this->disk_npts); + uint64_t base_offset = ROUND_UP(this->disk_npts, INDEX_OFFSET); + + // load mem-indices + for (auto &mem_index_path : mem_in) { + uint32_t npts; + if (!(this->_single_file_index)) { + std::string ind_path = mem_index_path; + std::string data_path = mem_index_path + ".data"; + std::ifstream bin_reader(data_path, std::ios::binary); + uint32_t bin_npts, bin_ndims; + bin_reader.read((char *) &bin_npts, sizeof(uint32_t)); + bin_reader.read((char *) &bin_ndims, sizeof(uint32_t)); + bin_reader.close(); + diskann::cout << "Index Path: " << ind_path << "\n"; + diskann::cout << "Data Path: " << data_path << "\n"; + diskann::cout << "Detected # pts = " << bin_npts + << ", # dims = " << bin_ndims << "\n"; + + auto mem_index = std::make_unique>( + this->dist_metric, bin_ndims, bin_npts + 100, true, + this->_single_file_index, true, false); + _u64 n1, n2, n3; + T * data_load; + diskann::load_aligned_bin(data_path, data_load, n1, n2, n3); + npts = (_u32)(n1 - 1); + assert(npts < MAX_PTS_PER_MEM_INDEX); + this->mem_npts.push_back(npts); + this->mem_data.push_back(data_load); + uint32_t index_offset = (_u32) base_offset; + base_offset += INDEX_OFFSET; + this->offset_ids.push_back(index_offset); + this->mem_deltas.push_back(new GraphDelta(index_offset, npts)); + mem_index->load_tags(mem_index_path + ".tags"); + // manage tags + std::unique_ptr index_tags; + index_tags.reset(new TagT[npts]); + + const std::unordered_map &loc_tag_map = + *mem_index->get_tags(); + for (uint32_t k = 0; k < npts; k++) { + auto iter = loc_tag_map.find(k); + if (iter == loc_tag_map.end()) { + diskann::cout << "Index # " << this->mem_data.size() + << " : missing tag for node #" << k << "\n"; + exit(-1); + index_tags[k] = (TagT) k; + } else { + index_tags[k] = iter->second; + } + } + this->mem_tags.push_back(std::move(index_tags)); + } else { + // read metadata from single index file for npts and ndims + _u64 nr, nc; + std::unique_ptr<_u64[]> file_offset_data; + diskann::load_bin<_u64>(mem_index_path, file_offset_data, nr, nc, 0); + + size_t data_dim, data_num_points; + diskann::get_bin_metadata(mem_index_path, data_num_points, data_dim, + file_offset_data[1]); + diskann::cout << "Detected # pts = " << data_num_points + << ", # dims = " << data_dim << "\n"; + diskann::cout << "Since vamana index is dynamic, it will have one " + "frozen point, hence #pts = " + << data_num_points - 1 << std::endl; + + // load mem_index_data with appropriate offset + _u64 n1, n2, n3; + T * data_load; + diskann::load_aligned_bin(mem_index_path, data_load, n1, n2, n3, + file_offset_data[1]); + npts = (_u32)(n1 - 1); + assert(npts < MAX_PTS_PER_MEM_INDEX); + this->mem_npts.push_back(npts); + this->mem_data.push_back(data_load); + + // call mem_index constructor with dynamic index and single index file + // set to true + auto mem_index = std::make_unique>( + this->dist_metric, data_dim, data_num_points + 100, true, + this->_single_file_index, true, false); + + // load tags with appropriate offset + uint32_t index_offset = (_u32) base_offset; + base_offset += INDEX_OFFSET; + this->offset_ids.push_back(index_offset); + this->mem_deltas.push_back(new GraphDelta(index_offset, npts)); + mem_index->load_tags(mem_index_path, file_offset_data[2]); + // manage tags + std::unique_ptr index_tags; + index_tags.reset(new TagT[npts]); + + const std::unordered_map &loc_tag_map = + *mem_index->get_tags(); + for (uint32_t k = 0; k < npts; k++) { + auto iter = loc_tag_map.find(k); + if (iter == loc_tag_map.end()) { + diskann::cout << "Index # " << this->mem_data.size() + << " : missing tag for node #" << k << "\n"; + exit(-1); + index_tags[k] = (TagT) k; + } else { + index_tags[k] = iter->second; + } + } + this->mem_tags.push_back(std::move(index_tags)); + } + } + +#ifdef USE_TCMALLOC + MallocExtension::instance()->ReleaseFreeMemory(); +#endif + + for (size_t j = 0; j < deleted_tags_vectors.size(); j++) { + this->latter_deleted_tags.push_back(tsl::robin_set()); + for (size_t i = j+1; i < deleted_tags_vectors.size(); i++) { + for (size_t k = 0; k < deleted_tags_vectors[i]->size(); k++) { + this->latter_deleted_tags[j].insert((*deleted_tags_vectors[i])[k]); + } + } + } + + //TODO: See if this can be included in the previous loop + for (auto &deleted_tags_vector : deleted_tags_vectors) { + for (size_t i = 0; i < deleted_tags_vector->size(); i++) { + this->deleted_tags.insert((*deleted_tags_vector)[i]); + } + } + + diskann::cout << "Allocating thread scratch space -- " + << PER_THREAD_BUF_SIZE / (1 << 20) << " MB / thread.\n"; + alloc_aligned((void **) &this->thread_pq_scratch, + MAX_N_THREADS * PER_THREAD_BUF_SIZE, SECTOR_LEN); + this->thread_bufs.resize(MAX_N_THREADS); + for (uint32_t i = 0; i < thread_bufs.size(); i++) { + this->thread_bufs[i] = this->thread_pq_scratch + i * PER_THREAD_BUF_SIZE; + } + + mergeImpl(); + } + + template + void StreamingMerger::mergeImpl() { + // populate deleted IDs + this->compute_deleted_ids(); + // BEGIN -- graph on disk has deleted references, maybe some holes + // populate deleted nodes + this->populate_deleted_nhoods(); + // process all deletes + this->process_deletes(); + // END -- graph on disk has NO deleted references, maybe some holes + + diskann::cout << "Computing rename-map.\n"; + // compute rename map + this->compute_rename_map(); + + // get max ID + 1 in rename-map as new max pts + uint32_t new_max_pts = this->disk_npts - 1; + // alternative using list + new_max_pts = std::max(this->inverse_list.back().first, new_max_pts); + new_max_pts = new_max_pts + 1; + + // TODO (correct) :: figure out naming scheme + //std::string new_disk_out(this->disk_index_out_path + "_disk.index"); + //diskann::cout << "RELOAD: Creating new disk graph at " << new_disk_out + // << "\n"; + //std::string new_pq_prefix(this->disk_index_out_path + "_pq"); + //std::string new_pq_coords(new_pq_prefix + "_compressed.bin"); + diskann::cout << "RELOAD: Creating new PQ coords file " + << this->temp_pq_coords_path << std::endl; + + + // TODO (correct) :: write to the right file + //std::string tmp_file = TMP_FOLDER + "/index_ravi"; + + MallocExtension::instance()->ReleaseFreeMemory(); + + //this->output_writer.open(tmp_file, std::ios::out | std::ios::binary); + //assert(this->output_writer.is_open()); + + // BEGIN -- PQ data on disk not consistent, not in right order + // write outdated PQ data into pq writer with intentionally wrong header - + // all these updates are made to a separate file, to be merged later into + // thw index file if instructed + std::fstream pq_writer(this->temp_pq_coords_path, + std::ios::out | std::ios::binary | std::ios::trunc); + assert(pq_writer.is_open()); + uint64_t pq_file_size = + ((uint64_t) new_max_pts * (uint64_t) this->pq_nchunks) + + (2 * sizeof(uint32_t)); + + // inflate file size to accommodate new points + uint64_t dummy = 0; + pq_writer.seekp(pq_file_size - sizeof(uint64_t), std::ios::beg); + pq_writer.write((char *) (&dummy), sizeof(uint64_t)); + + // write PQ compressed coords bin and close file + pq_writer.seekp(0, std::ios::beg); + uint32_t npts_u32 = new_max_pts, ndims_u32 = this->pq_nchunks; + pq_writer.write((char *) &npts_u32, sizeof(uint32_t)); + pq_writer.write((char *) &ndims_u32, sizeof(uint32_t)); + pq_writer.write((char *) this->pq_data, + (uint64_t) this->disk_npts * (uint64_t) ndims_u32); + pq_writer.close(); + + // write out tags + //const std::string tag_file = new_disk_out + ".tags"; + this->write_tag_file(this->temp_tags_path, new_max_pts); + + // switch index to read-only mode + this->disk_index->reload_index(this->temp_disk_index_path, + this->temp_pq_coords_path, + this->temp_tags_path); +#ifdef USE_TCMALLOC + MallocExtension::instance()->ReleaseFreeMemory(); +#endif + + // re-acquire pointers + auto res = this->disk_index->get_pq_config(); + this->pq_nchunks = res.second; + this->pq_data = res.first; + this->disk_npts = (_u32) this->disk_index->return_nd(); + this->init_ids.clear(); + this->init_ids = this->disk_index->get_init_ids(); + assert(this->disk_npts == new_max_pts); + + std::cout << "AFTER RELOAD: PQ_NChunks: " << res.second + << " Disk points: " << this->disk_npts + << " Frozen point id: " << this->init_ids[0] << std::endl; + + // call inserts + this->process_inserts(); +#ifdef USE_TCMALLOC + MallocExtension::instance()->ReleaseFreeMemory(); +#endif + + this->process_inserts_pq(); +#ifdef USE_TCMALLOC + MallocExtension::instance()->ReleaseFreeMemory(); +#endif + + diskann::cout << "Dumping full compressed PQ vectors from memory.\n"; + // re-open PQ writer + pq_writer.open(this->temp_pq_coords_path, + std::ios::in | std::ios::out | std::ios::binary); + pq_writer.seekp(2 * sizeof(uint32_t), std::ios::beg); + // write all (old + new) PQ data to disk; no need to modify header + pq_writer.write((char *) this->pq_data, + ((uint64_t) new_max_pts * (uint64_t) this->pq_nchunks)); + pq_writer.close(); + // END -- PQ data on disk consistent and in correct order + + // batch rename all inserted edges in each delta + diskann::cout << "Renaming edges for easier access during merge.\n"; + // const std::function rename_func = + // std::bind(&StreamingMerger::rename, this); + const std::function rename_func = [this](uint32_t id) { + return this->rename(id); + }; + this->disk_delta->rename_edges(rename_func); + for (auto &delta : this->mem_deltas) { + delta->rename_edges(rename_func); + } + + // start merging + // BEGIN -- graph on disk has NO deleted references, NO newly inserted + // points + + + this->process_merges(); + // END -- graph on disk has NO deleted references, has newly inserted points + + /* copy output from temp_file -> new_disk_out */ + // reset temp_file ptr + //this->output_writer.close(); + + auto copy_file = [](const std::string &src, const std::string &dest) { + diskann::cout << "COPY :: " << src << " --> " << dest << "\n"; + std::ofstream dest_writer(dest, std::ios::binary); + std::ifstream src_reader(src, std::ios::binary); + dest_writer << src_reader.rdbuf(); + dest_writer.close(); + src_reader.close(); + }; + // copy index + //copy_file(tmp_file, this->disk_index_out_path); + + // merge files if needed + if (this->_single_file_index) { + // update metadata with pq_pivots_file_size, pq_vector_file_size + size_t nr, nc; + std::vector output_metadata; + uint64_t * out_metadata; + + diskann::load_bin(this->final_index_file, out_metadata, nr, + nc); + for (size_t i = 0; i < nr; i++) + output_metadata.push_back(out_metadata[i]); + + delete[] out_metadata; + + // tags + TagT * tags; + uint64_t tag_num, tag_dim; + diskann::load_bin(this->temp_tags_path, tags, tag_num, tag_dim); + size_t tag_bytes_written = + diskann::save_bin(this->final_index_file, tags, tag_num, tag_dim, + output_metadata[output_metadata.size() - 1]); + delete[] tags; + + output_metadata.push_back(output_metadata[output_metadata.size() - 1] + + tag_bytes_written); + + size_t nr_in, nc_in; + uint64_t * in_metadata; + std::string disk_in = this->_single_file_index + ? this->disk_index_in_path + : this->disk_index_in_path + "_disk.index"; + diskann::load_bin(disk_in, in_metadata, nr_in, nc_in); + + uint64_t *pq_metadata_in; + size_t nr_pq_in, nc_pq_in; + diskann::load_bin(disk_in, pq_metadata_in, nr_pq_in, nc_pq_in, + in_metadata[8]); + diskann::save_bin(this->final_index_file, pq_metadata_in, + nr_pq_in, + nc_pq_in, + output_metadata[output_metadata.size() - 1]); + + size_t pq_pivots_total_bytes_written = 0; + // pq_pivots + float * pq_pivots_data; + uint64_t pq_pts, pq_dims; + diskann::load_bin(disk_in, pq_pivots_data, pq_pts, pq_dims, + in_metadata[8] + pq_metadata_in[0]); + size_t pq_pivots_bytes = diskann::save_bin( + this->final_index_file, pq_pivots_data, pq_pts, pq_dims, + output_metadata[output_metadata.size() - 1] + pq_metadata_in[0]); + delete[] pq_pivots_data; + diskann::cout << "Written pivots to single index file" << std::endl; + + // pq centroids + float * pq_centroid_data; + uint64_t centroid_num, centroid_dim; + diskann::load_bin(disk_in, pq_centroid_data, centroid_num, + centroid_dim, + in_metadata[8] + pq_metadata_in[1]); + size_t pq_centroid_bytes = diskann::save_bin( + this->final_index_file, pq_centroid_data, centroid_num, + centroid_dim, + output_metadata[output_metadata.size() - 1] + pq_metadata_in[1]); + delete[] pq_centroid_data; + diskann::cout << "Written centroids to single index file" << std::endl; + + // pq_rearrangment_perm + uint32_t *pq_rearrange_data; + uint64_t rearrange_num, rearrange_dim; + diskann::load_bin(disk_in, pq_rearrange_data, rearrange_num, + rearrange_dim, + in_metadata[8] + pq_metadata_in[2]); + size_t pq_rearrange_bytes = diskann::save_bin( + this->final_index_file, pq_rearrange_data, rearrange_num, + rearrange_dim, + output_metadata[output_metadata.size() - 1] + pq_metadata_in[2]); + delete[] pq_rearrange_data; + diskann::cout << "Written rearrangement data to single index file" + << std::endl; + + // pq_chunk_offsets + uint32_t *pq_offset_data; + uint64_t chunk_offset_num, chunk_offset_dim; + diskann::load_bin(disk_in, pq_offset_data, chunk_offset_num, + chunk_offset_dim, + in_metadata[8] + pq_metadata_in[3]); + size_t pq_offset_bytes = diskann::save_bin( + this->final_index_file, pq_offset_data, chunk_offset_num, + chunk_offset_dim, + output_metadata[output_metadata.size() - 1] + pq_metadata_in[3]); + delete[] pq_offset_data; + diskann::cout << "Written offsets to single index file" << std::endl; + + pq_pivots_total_bytes_written = pq_pivots_bytes + pq_centroid_bytes + + pq_rearrange_bytes + pq_offset_bytes; + output_metadata.push_back(output_metadata[output_metadata.size() - 1] + + pq_pivots_total_bytes_written + + pq_metadata_in[0]); + + // pq vectors + size_t pq_vector_bytes = diskann::save_bin( + this->final_index_file, this->pq_data, (uint64_t) this->disk_npts, + (uint64_t) ndims_u32, output_metadata[output_metadata.size() - 1]); + + output_metadata.push_back(output_metadata[output_metadata.size() - 1] + + pq_vector_bytes); + + delete[] pq_metadata_in; + + diskann::save_bin(this->final_index_file, + output_metadata.data(), + output_metadata.size(), 1); + } else { + // update pq table related data into new files + /* copy PQ tables */ + std::string prefix_pq_in = this->disk_index_in_path + "_pq"; + std::string prefix_pq_out = this->disk_index_out_path + "_pq"; + // PQ pivots + + copy_file(prefix_pq_in + "_pivots.bin", prefix_pq_out + "_pivots.bin"); + diskann::save_bin( + this->final_pq_coords_file, this->pq_data, (uint64_t) this->disk_npts, + (uint64_t) ndims_u32); + + copy_file(this->temp_tags_path, this->final_tags_file); + + } + + // destruct PQFlashIndex + delete this->disk_index; + this->disk_index = nullptr; + diskann::cout << "Destroyed PQ Flash Index\n"; + + } + + // template class instantiations + template class StreamingMerger; + template class StreamingMerger; + template class StreamingMerger; + template class StreamingMerger; + template class StreamingMerger; + template class StreamingMerger; + template class StreamingMerger; + template class StreamingMerger; + template class StreamingMerger; +} // namespace diskann diff --git a/src/v2/merge_insert.cpp b/src/v2/merge_insert.cpp new file mode 100644 index 0000000000..4a64093a20 --- /dev/null +++ b/src/v2/merge_insert.cpp @@ -0,0 +1,582 @@ +#include "neighbor.h" +#include "timer.h" +#include "tsl/robin_map.h" +#include "tsl/robin_set.h" +#include "utils.h" +#include "v2/merge_insert.h" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tcmalloc/malloc_extension.h" + +#include +#include +#include + +#include "aux_utils.h" +#include "exceptions.h" +#include "index.h" +#include "pq_flash_index.h" +#include "math_utils.h" +#include "memory_mapper.h" +#include "parameters.h" +#include "partition_and_pq.h" + +#include "logger.h" + +#include "Neighbor_Tag.h" +#ifdef _WINDOWS +#ifdef USE_BING_INFRA +#include "bing_aligned_file_reader.h" +#else +#include "windows_aligned_file_reader.h" +#endif +#else +#include "linux_aligned_file_reader.h" +#endif + +namespace diskann { + template + MergeInsert::MergeInsert( + Parameters& parameters, size_t dim, const std::string mem_prefix, + const std::string disk_prefix_in, const std::string disk_prefix_out, + Distance* dist, diskann::Metric dist_metric, bool single_file_index, + std::string working_folder) + : _dim(dim), _dist_metric(dist_metric), _active_0(true), _active_1(false), _active_del_0(true), + _active_del_1(false), _clearing_index_0(false), + _clearing_index_1(false), _switching_disk_prefixes(false), + _check_switch_index(false), _check_switch_delete(false) { + _merge_th = MERGE_TH; + _single_file_index = single_file_index; + this->_dist_metric = dist_metric; + _mem_index_0 = std::make_shared>( + this->_dist_metric, dim, _merge_th * 2, 1, _single_file_index, 1); + _mem_index_1 = std::make_shared>( + this->_dist_metric, dim, _merge_th * 2, 1, _single_file_index, 1); + + _paras_mem.Set("L", parameters.Get("L_mem")); + _paras_mem.Set("R", parameters.Get("R_mem")); + _paras_mem.Set("C", parameters.Get("C")); + _paras_mem.Set("alpha", parameters.Get("alpha_mem")); + _paras_mem.Set("num_rnds", 2); + _paras_mem.Set("saturate_graph", 0); + + _paras_disk.Set("L", parameters.Get("L_disk")); + _paras_disk.Set("R", parameters.Get("R_disk")); + _paras_disk.Set("C", parameters.Get("C")); + _paras_disk.Set("alpha", parameters.Get("alpha_disk")); + _paras_disk.Set("num_rnds", 2); + _paras_disk.Set("saturate_graph", 0); + + _num_search_threads = parameters.Get<_u32>("num_search_threads"); + _beamwidth = parameters.Get("beamwidth"); + _num_nodes_to_cache = parameters.Get<_u32>("nodes_to_cache"); + + _search_tpool = new ThreadPool(_num_search_threads); + + _mem_index_prefix = mem_prefix; + _deleted_tags_file = mem_prefix + "_deleted.tags"; + _disk_index_prefix_in = disk_prefix_in; + _disk_index_prefix_out = disk_prefix_out; + _dist_comp = dist; +#ifdef _WINDOWS +#ifndef USE_BING_INFRA + reader.reset(new WindowsAlignedFileReader()); +#else + reader.reset(new diskann::BingAlignedFileReader()); +#endif +#else + reader.reset(new LinuxAlignedFileReader()); +#endif + + _disk_index = new diskann::PQFlashIndex( + this->_dist_metric, reader, _single_file_index, true); + + std::string pq_prefix = _disk_index_prefix_in + "_pq"; + std::string disk_index_file = _disk_index_prefix_in + "_disk.index"; + int res = + _disk_index->load(_disk_index_prefix_in.c_str(), _num_search_threads); + if (res != 0) { + diskann::cout << "Failed to load disk index in MergeInsert constructor" + << std::endl; + exit(-1); + } + + TMP_FOLDER = working_folder; + } + + template + MergeInsert::~MergeInsert() { + // put in destructor code + } + + template + void MergeInsert::construct_index_merger() + { + uint32_t range = _paras_disk.Get("R"); + uint32_t l_index = _paras_disk.Get("L"); + uint32_t maxc = _paras_disk.Get("C"); + float alpha = _paras_disk.Get("alpha"); + _merger = new diskann::StreamingMerger((uint32_t) _dim, _dist_comp, _dist_metric, (uint32_t) _beamwidth, range, l_index, alpha, maxc, _single_file_index); + diskann::cout << "Created index merger object" << std::endl; + + } + + template + void MergeInsert::destruct_index_merger() + { + delete(_merger); + _merger = nullptr; + } + + template + int MergeInsert::insert(const T* point, const TagT& tag) + { + while(_check_switch_index.load()) + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + std::shared_lock lock(_index_lock); + if((_active_index == 0) && (_active_0.load() == false)) + { + diskann::cout << "Active index indicated as _mem_index_0 but it cannot accept insertions" << std::endl; + return -1; + } + if((_active_index == 1) && (_active_1.load() == false)) + { + diskann::cout << "Active index indicated as _mem_index_1 but it cannot accept insertions" << std::endl; + return -1; + } + + if(_active_index == 0) + { + if(_mem_index_0->get_num_points() < _mem_index_0->return_max_points()) + { + if(_mem_index_0->insert_point(point, _paras_mem, tag) != 0) + { + diskann::cout << "Could not insert point with tag " << tag << std::endl; + return -3; + } + { + std::unique_lock lock(_change_lock); + _mem_points++; + } + return 0; + } + else + { + diskann::cout << "Capacity exceeded" << std::endl; + } + } + else + { + if(_mem_index_1->get_num_points() < _mem_index_1->return_max_points()) + { + if(_mem_index_1->insert_point(point, _paras_mem, tag) != 0) + { + diskann::cout << "Could not insert point with tag " << tag << std::endl; + return -3; + } + { + std::unique_lock lock(_change_lock); + _mem_points++; + } + return 0; + } + else + { + diskann::cout << "Capacity exceeded in mem_index 1" << std::endl; + } + } + + return -2; + } + + + template + void MergeInsert::lazy_delete(const TagT& tag) + { + std::unique_lock lock(_delete_lock); + if((_active_delete_set == 0) && (_active_del_0.load() == false)) + { + diskann::cout << "Active deletion set indicated as _deletion_set_0 but it cannot accept deletions" << std::endl; + } + if((_active_delete_set == 1) && (_active_del_1.load() == false)) + { + diskann::cout << "Active deletion set indicated as _deletion_set_1 but it cannot accept deletions" << std::endl; + } + + if(_active_delete_set == 0) + _deletion_set_0.insert(tag); + else + _deletion_set_1.insert(tag); + } + + template + void MergeInsert::search_sync(const T* query, const uint64_t K, const uint64_t search_L, + TagT* tags, float * distances, QueryStats * stats) + { + std::set> best; + //search disk index and get top K tags + { + std::shared_lock lock(_disk_lock); + assert(_switching_disk_prefixes == false); + std::vector disk_result_ids_64(search_L); + std::vector disk_result_dists(search_L); + std::vector disk_result_tags(search_L); + _disk_index->cached_beam_search( + query, search_L, search_L, disk_result_tags.data(), disk_result_dists.data(), _beamwidth, + stats); + for(unsigned i = 0; i < disk_result_tags.size(); i++) + { + Neighbor_Tag n; + n = Neighbor_Tag(disk_result_tags[i], disk_result_dists[i]); +// best.insert(Neighbor_Tag(disk_result_tags[i], disk_result_dists[i])); + best.insert(n); + } + } + //check each memory index - if non empty and not being currently cleared - search and get top K active tags + { + if(_clearing_index_0.load() == false) + { + std::shared_lock lock(_clear_lock_0); + if(_mem_index_0->get_num_points() > 0) + { + std::vector> best_mem_index_0; + _mem_index_0->search(query, (uint32_t)search_L, (uint32_t)search_L, best_mem_index_0); + for(auto iter : best_mem_index_0) + best.insert(iter); + } + } + + if(_clearing_index_1.load() == false) + { + std::shared_lock lock(_clear_lock_1); + if(_mem_index_1->get_num_points() > 0) + { + std::vector> best_mem_index_1; + _mem_index_1->search(query, (uint32_t)search_L, (uint32_t)search_L, best_mem_index_1); + for(auto iter : best_mem_index_1) + best.insert(iter); + } + } + } + std::vector> best_vec; + for(auto iter : best) + best_vec.emplace_back(iter); +// std::sort(best_vec.begin(), best_vec.end()); + if (best_vec.size() > K) +// best_vec.erase(best_vec.begin() + K, best_vec.end()); + //aggregate results, sort and pick top K candidates + { + std::shared_lock lock(_delete_lock); + size_t pos = 0; + for (auto iter : best_vec) { + if((_deletion_set_0.find(iter.tag) == _deletion_set_0.end()) && (_deletion_set_1.find(iter.tag) == _deletion_set_1.end())) { + tags[pos] = iter.tag; + distances[pos] = iter.dist; + pos++; + } + if (pos == K) + break; + } + } + } + + template + int MergeInsert::trigger_merge() + { + if(_mem_points >= _merge_th) + { + save_del_set(); + switch_index(); + return 1; + } + return 0; + } + + template + void MergeInsert::final_merge() + { + diskann::cout << "Inside final_merge()." << std::endl; + diskann::cout << _mem_index_0->get_num_points() << " " << _mem_index_1->get_num_points() << std::endl; + if(_mem_points > 0) + { + save_del_set(); + switch_index(); + } + diskann::cout << _mem_index_0->get_num_points() << " " << _mem_index_1->get_num_points() << std::endl; + } + + template + void MergeInsert::merge() + { + std::vector mem_in; + if(_active_index == 0) + mem_in.push_back(_mem_index_prefix + "_1"); + else + mem_in.push_back(_mem_index_prefix + "_0"); + std::string folder = " "; + _merger->merge(_disk_index_prefix_in.c_str(), mem_in, _disk_index_prefix_out.c_str(), _deleted_tags_vector, folder); + + diskann::cout << "Merge done" << std::endl; + { + std::unique_lock lock(_disk_lock); + bool expected_value = false; + if (_switching_disk_prefixes.compare_exchange_strong(expected_value, true)) { + diskann::cout << "Switching to latest merged disk index " << std::endl; + } else { + diskann::cout << "Failed to switch" << std::endl; +// return -1; + } + + std::string temp = _disk_index_prefix_out; + _disk_index_prefix_out = _disk_index_prefix_in; + _disk_index_prefix_in = temp; + delete(_disk_index); + _disk_index = new diskann::PQFlashIndex(this->_dist_metric, reader, _single_file_index, true); + + std::string pq_prefix = _disk_index_prefix_in + "_pq"; + std::string disk_index_file = _disk_index_prefix_in + "_disk.index"; + int res = _disk_index->load(_disk_index_prefix_in.c_str(), _num_search_threads); + if(res != 0) + { + diskann::cout << "Failed to load new disk index after merge" << std::endl; + exit(-1); + } + expected_value = true; + _switching_disk_prefixes.compare_exchange_strong(expected_value,false); + } + } + + template + void MergeInsert::switch_index() + { + //unique lock throughout the function to ensure another thread does not flip the value of _active_index after it has been saved by one thread, + //and multiple threads do not save the same index + //unique lock is acquired when no other thread holds any shared lock over it, so this function will wait till any on-going insertions are completed + //and then change the value of all related flags + { + bool expected_value = false; + _check_switch_index.compare_exchange_strong(expected_value, true); + std::unique_lock lock(_index_lock); + //make new index active + if(_active_index == 0) + { + _mem_index_1 = std::make_shared>(this->_dist_metric, _dim, _merge_th * 2 , 1, _single_file_index, 1); + bool expected_active = false; + if (_active_1.compare_exchange_strong(expected_active, true)) { + diskann::cout << "Initialised new index for _mem_index_1 " << std::endl; + } else { + diskann::cout << "Failed to initialise new _mem_index_1" << std::endl; +// return -1; + } + + } + else + { + _mem_index_0 = std::make_shared>(this->_dist_metric, _dim, _merge_th * 2, 1, _single_file_index, 1); + bool expected_active = false; + if (_active_0.compare_exchange_strong(expected_active, true)) { + diskann::cout << "Initialised new index for _mem_index_0 " << std::endl; + } else { + diskann::cout << "Failed to initialise new _mem_index_0" << std::endl; + // return -1; + } + } + _active_index = 1 - _active_index; + _mem_points = 0; + expected_value = true; + _check_switch_index.compare_exchange_strong(expected_value, false); + + } + + save(); + //start timer + diskann::Timer timer; + construct_index_merger(); + destruct_index_merger(); + diskann::cout << "Merge time : " << timer.elapsed()/1000 << " ms" << std::endl; + //end timer + + { + std::shared_lock lock(_index_lock); + //make older index inactive after merge is complete or before ? + if(_active_index == 0) + { + bool expected_clearing = false; + bool expected_active = true; + _clearing_index_1.compare_exchange_strong(expected_clearing, true); + { + std::unique_lock lock(_clear_lock_1); + _mem_index_1.reset(); + _mem_index_1 = nullptr; + _mem_index_1 = std::make_shared>( + _dist_metric, _dim, _merge_th * 2, 1, _single_file_index, 1); + } + expected_clearing = true; + assert(expected_clearing == true); + _clearing_index_1.compare_exchange_strong(expected_clearing, false); + assert(expected_active == true); + _active_1.compare_exchange_strong(expected_active, false); + } + else + { + bool expected_clearing = false; + bool expected_active = true; + _clearing_index_0.compare_exchange_strong(expected_clearing, true); + std::unique_lock lock(_clear_lock_0); + { + _mem_index_0.reset(); + _mem_index_0 = nullptr; + _mem_index_0 = std::make_shared>( + _dist_metric, _dim, _merge_th * 2, 1, _single_file_index, 1); + } + expected_clearing = true; + assert(expected_clearing == true); + _clearing_index_0.compare_exchange_strong(expected_clearing, false); + assert(expected_active == true); + _active_0.compare_exchange_strong(expected_active, false); + } + //if merge() has returned, clear older active index + } + + } + + template + int MergeInsert::save() + { + //only switch_index will call this function + bool expected_active = true; + if(_active_index == 1) + { + if (_active_0.compare_exchange_strong(expected_active, false)) { + diskann::cout << "Saving mem index 0 to merge it into disk index" << std::endl; + std::string save_path = _mem_index_prefix + "_0"; + _mem_index_0->save(save_path.c_str()); + } else { + diskann::cout << "Index 0 is already inactive" << std::endl; + return -1; + } + } + else + { + if (_active_1.compare_exchange_strong(expected_active, false)) { + diskann::cout << "Saving mem index 1 to merge it into disk index" << std::endl; + std::string save_path = _mem_index_prefix + "_1"; + _mem_index_1->save(save_path.c_str()); + } else { + diskann::cout << "Index 1 is already inactive" << std::endl; + return -1; + } + } + diskann::cout << "Saved mem index" << std::endl; + return 0; + } + + template + void MergeInsert::save_del_set() + { + { + bool expected_value = false; + _check_switch_delete.compare_exchange_strong(expected_value, true); + std::unique_lock lock(_delete_lock); + if(_active_delete_set == 0) + { + _deletion_set_1.clear(); + bool expected_active = false; + if(_active_del_1.compare_exchange_strong(expected_active, true)) { + diskann::cout << "Cleared _deletion_set_1 - ready to accept new points" << std::endl; + } + else + { + diskann::cout << "Failed to clear _deletion_set_1" << std::endl; + } + } + else + { + _deletion_set_0.clear(); + bool expected_active = false; + if(_active_del_0.compare_exchange_strong(expected_active, true)) { + diskann::cout << "Cleared _deletion_set_0 - ready to accept new points" << std::endl; + } + else + { + diskann::cout << "Failed to clear _deletion_set_0" << std::endl; + } + } + _active_delete_set = 1 - _active_delete_set; + bool expected_active = true; + if(_active_delete_set == 0) + _active_del_1.compare_exchange_strong(expected_active, false); + else + _active_del_0.compare_exchange_strong(expected_active, false); + expected_value = true; + _check_switch_delete.compare_exchange_strong(expected_value, false); + } + + if(_active_delete_set == 0) + { + std::vector * del_vec = new std::vector(_deletion_set_1.size()); + + size_t i = 0; + for(auto iter : _deletion_set_1) + { + (*del_vec)[i] = iter; + i++; + } + _deleted_tags_vector.clear(); + _deleted_tags_vector.push_back(del_vec); + } + else + { + std::vector * del_vec = new std::vector(_deletion_set_0.size()); + + size_t i = 0; + for(auto iter : _deletion_set_0) + { + (*del_vec)[i] = iter; + i++; + } + _deleted_tags_vector.clear(); + _deleted_tags_vector.push_back(del_vec); + } + + } + + template + std::string MergeInsert::ret_merge_prefix() + { + return _disk_index_prefix_in; + } + // template class instantiations + template class MergeInsert; + template class MergeInsert; + template class MergeInsert; + template class MergeInsert; + template class MergeInsert; + template class MergeInsert; + template class MergeInsert; + template class MergeInsert; + template class MergeInsert; +} diff --git a/src/windows_aligned_file_reader.cpp b/src/windows_aligned_file_reader.cpp index e8d4553602..ca4db06209 100644 --- a/src/windows_aligned_file_reader.cpp +++ b/src/windows_aligned_file_reader.cpp @@ -7,9 +7,8 @@ #include #include "utils.h" -#define SECTOR_LEN 4096 - -void WindowsAlignedFileReader::open(const std::string& fname) { +void WindowsAlignedFileReader::open(const std::string& fname, + bool enable_writes, bool enable_create) { m_filename = std::wstring(fname.begin(), fname.end()); this->register_thread(); } @@ -67,7 +66,7 @@ IOContext& WindowsAlignedFileReader::get_ctx() { } void WindowsAlignedFileReader::read(std::vector& read_reqs, - IOContext& ctx, bool async) { + IOContext& ctx, bool async) { using namespace std::chrono_literals; // execute each request sequentially _u64 n_reqs = read_reqs.size(); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fa6e8ea045..d7a04bd7cf 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,4 +40,51 @@ else() target_link_libraries(search_disk_index ${PROJECT_NAME} aio -ltcmalloc) endif() +set(CMAKE_CXX_STANDARD 14) + +add_executable(test_concurr_merge_insert test_concurr_merge_insert.cpp) +if(MSVC) + + target_link_options(test_concurr_merge_insert PRIVATE /MACHINE:x64) + target_link_libraries(test_concurr_merge_insert debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/nsg_dll.lib) + target_link_libraries(test_concurr_merge_insert optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/nsg_dll.lib) +else() + target_link_libraries(test_concurr_merge_insert ${PROJECT_NAME} -ltcmalloc aio) +endif() + +add_executable(test_incremental_index test_incremental_index.cpp) +if(MSVC) + + target_link_options(test_incremental_index PRIVATE /MACHINE:x64) + target_link_libraries(test_incremental_index debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/nsg_dll.lib) + target_link_libraries(test_incremental_index optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/nsg_dll.lib) +else() + target_link_libraries(test_incremental_index ${PROJECT_NAME} -ltcmalloc aio) +endif() +add_executable(build_stream_merger_disk_index build_stream_merger_disk_index.cpp) +if(MSVC) + target_link_options(build_stream_merger_disk_index PRIVATE /MACHINE:x64 /DEBUG:FULL "/INCLUDE:_tcmalloc") + target_link_libraries(build_stream_merger_disk_index debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/nsg_dll.lib ${PROJECT_SOURCE_DIR}/dependencies/windows/tcmalloc/libtcmalloc_minimal.lib) + target_link_libraries(build_stream_merger_disk_index optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/nsg_dll.lib ${PROJECT_SOURCE_DIR}/dependencies/windows/tcmalloc/libtcmalloc_minimal.lib) +else() + target_link_libraries(build_stream_merger_disk_index ${PROJECT_NAME} -ltcmalloc aio) +endif() + +if (MSVC) +add_executable(test_incr_intf test_incr_intf.cpp) + target_link_options(test_incr_intf PRIVATE /MACHINE:x64 /DEBUG:FULL) + target_link_libraries(test_incr_intf debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/nsg_dll.lib) + target_link_libraries(test_incr_intf optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/nsg_dll.lib) +endif() + + + +if(MSVC) + add_executable(test_diskpriority_io test_diskpriority_io.cpp ) + target_include_directories(test_diskpriority_io PRIVATE "F:/boost/boost_1_71_0") + target_link_options(test_diskpriority_io PRIVATE /MACHINE:x64 /DEBUG:FULL) + target_link_libraries(test_diskpriority_io debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskpriority_io.lib) + target_link_libraries(test_diskpriority_io optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskpriority_io.lib) +endif() +# formatter diff --git a/tests/align_query_file.cpp b/tests/align_query_file.cpp new file mode 100644 index 0000000000..e3ac804187 --- /dev/null +++ b/tests/align_query_file.cpp @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aux_utils.h" +#include "utils.h" + +#ifndef _WINDOWS +#include +#include +#include +#endif + +#include "memory_mapper.h" + +int main(int argc, char** argv) { + if (argc < 3) { + diskann::cout << "Correct usage : " << argv[0] + << " " << std::endl; + exit(-1); + } + + std::string input(argv[1]); + std::string output(argv[2]); + + float* data = nullptr; + size_t in_num, in_dim, in_aligned_dim; + diskann::load_aligned_bin(input.c_str(), data, in_num, in_dim, + in_aligned_dim); + diskann::save_bin(output + ".bin", data, in_num, in_aligned_dim); + + return 0; +} diff --git a/tests/build_disk_index.cpp b/tests/build_disk_index.cpp index b29c3f0d1e..c28f0cb570 100644 --- a/tests/build_disk_index.cpp +++ b/tests/build_disk_index.cpp @@ -11,30 +11,44 @@ template bool build_index(const char* dataFilePath, const char* indexFilePath, - const char* indexBuildParameters) { - return diskann::build_disk_index( - dataFilePath, indexFilePath, indexBuildParameters, diskann::Metric::L2); + const char* indexBuildParameters, diskann::Metric m, + bool singleFile) { + return diskann::build_disk_index(dataFilePath, indexFilePath, + indexBuildParameters, m, singleFile); } int main(int argc, char** argv) { - if (argc != 9) { - std::cout << "Usage: " << argv[0] - << " [data_type] [data_file.bin] " - "[index_prefix_path] " - "[R] [L] [B] [M] [T]. See README for more information on " - "parameters." - << std::endl; + if (argc != 11) { + diskann::cout << "Usage: " << argv[0] + << " " + " " + " ." + " " + " See README for more information on parameters." + << std::endl; } else { std::string params = std::string(argv[4]) + " " + std::string(argv[5]) + " " + std::string(argv[6]) + " " + std::string(argv[7]) + " " + std::string(argv[8]); + std::string dist_metric(argv[9]); + bool single_file_index = std::atoi(argv[10]) != 0; + + diskann::Metric m = + dist_metric == "cosine" ? diskann::Metric::COSINE : diskann::Metric::L2; + if (dist_metric != "l2" && m == diskann::Metric::L2) { + diskann::cout << "Metric " << dist_metric << " is not supported. Using L2" + << std::endl; + } if (std::string(argv[1]) == std::string("float")) - build_index(argv[2], argv[3], params.c_str()); + build_index(argv[2], argv[3], params.c_str(), m, + single_file_index); else if (std::string(argv[1]) == std::string("int8")) - build_index(argv[2], argv[3], params.c_str()); + build_index(argv[2], argv[3], params.c_str(), m, + single_file_index); else if (std::string(argv[1]) == std::string("uint8")) - build_index(argv[2], argv[3], params.c_str()); + build_index(argv[2], argv[3], params.c_str(), m, + single_file_index); else - std::cout << "Error. wrong file type" << std::endl; + diskann::cout << "Error. wrong file type" << std::endl; } } diff --git a/tests/build_memory_index.cpp b/tests/build_memory_index.cpp index a5a13595e3..50f5d79e4d 100644 --- a/tests/build_memory_index.cpp +++ b/tests/build_memory_index.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "utils.h" #ifndef _WINDOWS @@ -16,10 +17,12 @@ #include "memory_mapper.h" template -int build_in_memory_index(const std::string& data_path, const unsigned R, +int build_in_memory_index(const std::string& data_path, + const std::string& tags_file, const unsigned R, const unsigned L, const float alpha, const std::string& save_path, - const unsigned num_threads) { + const unsigned num_threads, bool dynamic_index, + bool single_file_index, diskann::Metric distMetric) { diskann::Parameters paras; paras.Set("R", R); paras.Set("L", L); @@ -29,46 +32,94 @@ int build_in_memory_index(const std::string& data_path, const unsigned R, paras.Set("saturate_graph", 0); paras.Set("num_threads", num_threads); - diskann::Index index(diskann::L2, data_path.c_str()); - auto s = std::chrono::high_resolution_clock::now(); - index.build(paras); - std::chrono::duration diff = - std::chrono::high_resolution_clock::now() - s; + _u64 data_num, data_dim; + diskann::get_bin_metadata(data_path, data_num, data_dim); + diskann::cout << "Building in-memory index with parameters: data_file: " + << data_path << "tags file: " << tags_file << " R: " << R + << " L: " << L << " alpha: " << alpha + << " index_path: " << save_path << " #threads: " << num_threads + << ", using distance metric: " + << (distMetric == diskann::Metric::COSINE ? "cosine " : "l2 "); - std::cout << "Indexing time: " << diff.count() << "\n"; + typedef int TagT; + + // TODO: Should not hard code enable tags. + diskann::Index index(distMetric, data_dim, data_num, dynamic_index, + single_file_index, + true); // enable_tags forced to true! + if (dynamic_index) { + std::vector tags(data_num); + std::iota(tags.begin(), tags.end(), 0); + + auto s = std::chrono::high_resolution_clock::now(); + index.build(data_path.c_str(), data_num, paras, tags); + std::chrono::duration diff = + std::chrono::high_resolution_clock::now() - s; + + diskann::cout << "Indexing time: " << diff.count() << "\n"; + } else { + std::vector tags(data_num); + std::iota(tags.begin(), tags.end(), 0); + + auto s = std::chrono::high_resolution_clock::now(); + index.build(data_path.c_str(), data_num, paras, tags); + std::chrono::duration diff = + std::chrono::high_resolution_clock::now() - s; + + diskann::cout << "Indexing time: " << diff.count() << "\n"; + } index.save(save_path.c_str()); return 0; } int main(int argc, char** argv) { - if (argc != 8) { - std::cout << "Usage: " << argv[0] - << " [data_type] [data_file.bin] " - "[output_index_file] " - << "[R] [L] [alpha]" - << " [num_threads_to_use]. See README for more information on " - "parameters." - << std::endl; + if (argc != 12) { + diskann::cout + << "Usage: " << argv[0] + << " " + " (use null if no tags file is used) " + " " + << " " + << " ." + << " See README for more information on parameters." << std::endl; exit(-1); } - const std::string data_path(argv[2]); - const std::string save_path(argv[3]); - const unsigned R = (unsigned) atoi(argv[4]); - const unsigned L = (unsigned) atoi(argv[5]); - const float alpha = (float) atof(argv[6]); - const unsigned num_threads = (unsigned) atoi(argv[7]); + int arg_no = 2; + + const std::string data_path(argv[arg_no++]); + const std::string tags_file(argv[arg_no++]); + const std::string save_path(argv[arg_no++]); + bool dynamic_index = (bool) atoi(argv[arg_no++]); + bool single_file_index = (bool) atoi(argv[arg_no++]); + const unsigned R = (unsigned) atoi(argv[arg_no++]); + const unsigned L = (unsigned) atoi(argv[arg_no++]); + const float alpha = (float) atof(argv[arg_no++]); + const unsigned num_threads = (unsigned) atoi(argv[arg_no++]); + const std::string dist_metric_str = argv[arg_no++]; + enum diskann::Metric distMetric = + dist_metric_str == "cosine" + ? diskann::Metric::COSINE + : diskann::Metric::L2; // set to l2 even if something else is chosen + + if (dist_metric_str != "l2" && distMetric == diskann::Metric::L2) { + std::cerr << "Unknown distance metric " << argv[argc - 1] + << ". Setting metric to L2" << std::endl; + } if (std::string(argv[1]) == std::string("int8")) - build_in_memory_index(data_path, R, L, alpha, save_path, - num_threads); + build_in_memory_index(data_path, tags_file, R, L, alpha, save_path, + num_threads, dynamic_index, single_file_index, + distMetric); else if (std::string(argv[1]) == std::string("uint8")) - build_in_memory_index(data_path, R, L, alpha, save_path, - num_threads); + build_in_memory_index(data_path, tags_file, R, L, alpha, save_path, + num_threads, dynamic_index, + single_file_index, distMetric); else if (std::string(argv[1]) == std::string("float")) - build_in_memory_index(data_path, R, L, alpha, save_path, - num_threads); + build_in_memory_index(data_path, tags_file, R, L, alpha, save_path, + num_threads, dynamic_index, single_file_index, + distMetric); else - std::cout << "Unsupported type. Use float/int8/uint8" << std::endl; + diskann::cout << "Unsupported type. Use float/int8/uint8" << std::endl; } diff --git a/tests/build_stream_merger_disk_index.cpp b/tests/build_stream_merger_disk_index.cpp new file mode 100644 index 0000000000..65183907c4 --- /dev/null +++ b/tests/build_stream_merger_disk_index.cpp @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "omp.h" + +#include "aux_utils.h" +#include "index.h" +#include "math_utils.h" +#include "partition_and_pq.h" +#include "utils.h" + +template +bool build_index(const char* dataFilePath, const char* indexFilePath, + const char* indexBuildParameters, const char* tag_file, + int single_file_index) { + std::string tag_filename = std::string(tag_file); + + bool save_index_as_one_file; + if (single_file_index == 0) + save_index_as_one_file = false; + else + save_index_as_one_file = true; + + if (tag_filename == "null") + return diskann::build_disk_index( + dataFilePath, indexFilePath, indexBuildParameters, diskann::Metric::L2, + save_index_as_one_file, nullptr); + return diskann::build_disk_index(dataFilePath, indexFilePath, + indexBuildParameters, diskann::Metric::L2, + save_index_as_one_file, tag_file); +} + +int main(int argc, char** argv) { + if (argc != 11) { + diskann::cout << "Usage: " << argv[0] + << " [data_type] [data_file.bin] " + "[index_prefix_path] " + "[R] [L] [B] [M] [T] [] . See README for more " + "information on " + "parameters." + << std::endl; + } else { + std::string params = std::string(argv[4]) + " " + std::string(argv[5]) + + " " + std::string(argv[6]) + " " + + std::string(argv[7]) + " " + std::string(argv[8]); + int single_file_index = atoi(argv[10]); + if (std::string(argv[1]) == std::string("float")) + build_index(argv[2], argv[3], params.c_str(), argv[9], + single_file_index); + else if (std::string(argv[1]) == std::string("int8")) + build_index(argv[2], argv[3], params.c_str(), argv[9], + single_file_index); + else if (std::string(argv[1]) == std::string("uint8")) + build_index(argv[2], argv[3], params.c_str(), argv[9], + single_file_index); + else + diskann::cout << "Error. wrong file type" << std::endl; + } +} diff --git a/tests/lazy_reinsert_batch.cpp b/tests/lazy_reinsert_batch.cpp new file mode 100644 index 0000000000..97c201f472 --- /dev/null +++ b/tests/lazy_reinsert_batch.cpp @@ -0,0 +1,250 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aux_utils.h" +#include "utils.h" +#include "tsl/robin_set.h" + +#ifndef _WINDOWS +#include +#include +#include +#endif + +#include "memory_mapper.h" + +template +void search_kernel( + T* query, size_t query_num, size_t query_aligned_dim, const int recall_at, + std::vector<_u64> Lvec, diskann::Index& index, + const std::string& truthset_file, + tsl::robin_set delete_list = tsl::robin_set()) { + unsigned* gt_ids = NULL; + float* gt_dists = NULL; + size_t gt_num, gt_dim; + diskann::load_truthset(truthset_file, gt_ids, gt_dists, gt_num, gt_dim); + + float* query_result_dists = new float[recall_at * query_num]; + unsigned* query_result_ids = new unsigned[recall_at * query_num]; + TagT* query_result_tags = new TagT[recall_at * query_num]; + memset(query_result_dists, 0, sizeof(float) * recall_at * query_num); + memset(query_result_tags, 0, sizeof(TagT) * recall_at * query_num); + memset(query_result_ids, 0, sizeof(unsigned) * recall_at * query_num); + + std::string recall_string = "Recall@" + std::to_string(recall_at); + diskann_cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " + << std::setw(18) << "Mean Latency (ms)" << std::setw(15) + << "99.9 Latency" << std::setw(12) << recall_string << std::endl; + + diskann_cout + << "===============================================================" + "===============" + << std::endl; + + for (uint32_t test_id = 0; test_id < Lvec.size(); test_id++) { + std::vector latency_stats(query_num, 0); + memset(query_result_dists, 0, sizeof(float) * recall_at * query_num); + memset(query_result_tags, 0, sizeof(TagT) * recall_at * query_num); + memset(query_result_ids, 0, sizeof(unsigned) * recall_at * query_num); + _u64 L = Lvec[test_id]; + auto s = std::chrono::high_resolution_clock::now(); +#pragma omp parallel for + for (int64_t i = 0; i < (int64_t) query_num; i++) { + auto qs = std::chrono::high_resolution_clock::now(); + index.search_with_tags(query + i * query_aligned_dim, recall_at, (_u32) L, + query_result_tags + i * recall_at, 1, + query_result_ids + i * recall_at); + auto qe = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = qe - qs; + latency_stats[i] = diff.count() * 1000; + // std::this_thread::sleep_for(std::chrono::milliseconds(2)); + } + auto e = std::chrono::high_resolution_clock::now(); + + std::chrono::duration diff = e - s; + float qps = (float) (query_num / diff.count()); + + float recall; + if (delete_list.size() > 0) { + recall = (float) diskann::calculate_recall( + (_u32) query_num, gt_ids, gt_dists, (_u32) gt_dim, query_result_tags, + (_u32) recall_at, (_u32) recall_at, delete_list); + } else { + recall = (float) diskann::calculate_recall( + (_u32) query_num, gt_ids, gt_dists, (_u32) gt_dim, query_result_tags, + (_u32) recall_at, (_u32) recall_at); + } + + std::sort(latency_stats.begin(), latency_stats.end()); + diskann_cout << std::setw(4) << L << std::setw(12) << qps << std::setw(18) + << std::accumulate(latency_stats.begin(), latency_stats.end(), + 0) / + (float) query_num + << std::setw(15) + << (float) latency_stats[(_u64)(0.999 * query_num)] + << std::setw(12) << recall << std::endl; + } + delete[] query_result_dists; + delete[] query_result_ids; + delete[] query_result_tags; +} + +template +int build_incremental_index(const std::string& data_path, + const std::string& memory_index_file, + const unsigned L, const unsigned R, + const unsigned C, const unsigned num_rnds, + const float alpha, const std::string& save_path, + const unsigned num_cycles, int fraction, + const std::string& query_file, + const std::string& truthset_file, + const int recall_at, std::vector<_u64> Lvec) { + diskann::Parameters paras; + paras.Set("L", L); + paras.Set("R", R); + paras.Set("C", C); + paras.Set("alpha", alpha); + paras.Set("num_rnds", num_rnds); + + T* data_load = NULL; + size_t num_points, dim, aligned_dim; + + diskann::load_aligned_bin(data_path.c_str(), data_load, num_points, dim, + aligned_dim); + + diskann::Index index(diskann::L2, dim, num_points, 1, true, true, 0); + + auto tag_path = memory_index_file + ".tags"; + index.load(memory_index_file.c_str(), data_path.c_str(), true, + tag_path.c_str()); + diskann_cout << "Loaded index and tags and data" << std::endl; + T* query = NULL; + size_t query_num, query_dim, query_aligned_dim; + diskann::load_aligned_bin(query_file, query, query_num, query_dim, + query_aligned_dim); + diskann_cout << "Search on static index" << std::endl; + search_kernel(query, query_num, query_aligned_dim, recall_at, Lvec, index, + truthset_file); + unsigned i = 0; + while (i < num_cycles) { + size_t delete_size = (num_points / 100) * fraction; + tsl::robin_set delete_set; + while (delete_set.size() < delete_size) + delete_set.insert(rand() % num_points); + std::vector delete_vector(delete_set.begin(), delete_set.end()); + diskann_cout << "\nDeleting " << delete_vector.size() << " elements... "; + + { + index.enable_delete(); + diskann::Timer del_timer; + std::vector failed_tags; + if (index.lazy_delete(delete_set, failed_tags) < 0) { + std::cerr << "Error in delete_points" << std::endl; + } + if (failed_tags.size() > 0) { + std::cerr << "Failed to delete " << failed_tags.size() << " tags" + << std::endl; + } + + diskann::Timer del_timer; + diskann::cout + << "Starting consolidation of deletes and compacting data....." index + .consolidate(paras); + diskann_cout << "completed in " << del_timer.elapsed() / 1000000.0 + << "sec." << std::endl; + + diskann_cout << "Search post deletion....." << std::endl; + search_kernel(query, query_num, query_aligned_dim, recall_at, Lvec, index, + truthset_file, delete_set); + } + + { + index.reposition_frozen_point_to_end(); + diskann::Timer timer; +#pragma omp parallel for + for (size_t i = 0; i < delete_vector.size(); i++) { + unsigned p = delete_vector[i]; + index.insert_point(data_load + (size_t) p * (size_t) aligned_dim, paras, + p); + } + diskann_cout << "Re-incremental time: " << timer.elapsed() / 1000 + << "ms\n"; + index.prune_all_nbrs(paras); + index.compact_frozen_point(); + search_kernel(query, query_num, query_aligned_dim, recall_at, Lvec, index, + truthset_file); + } + i++; + } + + delete[] data_load; + + return 0; +} + +int main(int argc, char** argv) { + if (argc < 16) { + diskann_cout + << "Correct usage: " << argv[0] + << " [int8/uint8/float] " + " " + " " + << " <#batches> " + "<#batch_del_size> " + " ...." + << std::endl; + exit(-1); + } + + int arg_no = 4; + unsigned L = (unsigned) atoi(argv[arg_no++]); + unsigned R = (unsigned) atoi(argv[arg_no++]); + unsigned C = (unsigned) atoi(argv[arg_no++]); + float alpha = (float) std::atof(argv[arg_no++]); + unsigned num_rnds = (unsigned) std::atoi(argv[arg_no++]); + std::string save_path(argv[arg_no++]); + unsigned num_cycles = (unsigned) atoi(argv[arg_no++]); + int fraction = (int) atoi(argv[arg_no++]); + std::string query_file(argv[arg_no++]); + std::string truthset(argv[arg_no++]); + int recall_at = (int) std::atoi(argv[arg_no++]); + std::vector<_u64> Lvec; + + for (int ctr = 15; ctr < argc; ctr++) { + _u64 curL = std::atoi(argv[ctr]); + if (curL >= recall_at) + Lvec.push_back(curL); + } + + if (Lvec.size() == 0) { + diskann_cout + << "No valid Lsearch found. Lsearch must be at least recall_at." + << std::endl; + return -1; + } + + if (std::string(argv[1]) == std::string("int8")) + build_incremental_index( + argv[2], argv[3], L, R, C, num_rnds, alpha, save_path, num_cycles, + fraction, query_file, truthset, recall_at, Lvec); + else if (std::string(argv[1]) == std::string("uint8")) + build_incremental_index( + argv[2], argv[3], L, R, C, num_rnds, alpha, save_path, num_cycles, + fraction, query_file, truthset, recall_at, Lvec); + else if (std::string(argv[1]) == std::string("float")) + build_incremental_index( + argv[2], argv[3], L, R, C, num_rnds, alpha, save_path, num_cycles, + fraction, query_file, truthset, recall_at, Lvec); + else + diskann_cout << "Unsupported type. Use float/int8/uint8" << std::endl; +} diff --git a/tests/search_disk_index.cpp b/tests/search_disk_index.cpp index 4d5c79ca89..55af98ff1a 100644 --- a/tests/search_disk_index.cpp +++ b/tests/search_disk_index.cpp @@ -53,24 +53,36 @@ int search_disk_index(int argc, char** argv) { T* query = nullptr; unsigned* gt_ids = nullptr; float* gt_dists = nullptr; + uint32_t* tags = nullptr; size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; std::vector<_u64> Lvec; - std::string index_prefix_path(argv[2]); - std::string pq_prefix = index_prefix_path + "_pq"; - std::string disk_index_file = index_prefix_path + "_disk.index"; + int index = 2; + std::string index_prefix_path(argv[index++]); std::string warmup_query_file = index_prefix_path + "_sample_data.bin"; - _u64 num_nodes_to_cache = std::atoi(argv[3]); - _u32 num_threads = std::atoi(argv[4]); - _u32 beamwidth = std::atoi(argv[5]); - std::string query_bin(argv[6]); - std::string truthset_bin(argv[7]); - _u64 recall_at = std::atoi(argv[8]); - std::string result_output_prefix(argv[9]); + bool single_file_index = std::atoi(argv[index++]) != 0; + bool tags_flag = std::atoi(argv[index++]) != 0; + _u64 num_nodes_to_cache = std::atoi(argv[index++]); + _u32 num_threads = std::atoi(argv[index++]); + _u32 beamwidth = std::atoi(argv[index++]); + std::string query_bin(argv[index++]); + std::string truthset_bin(argv[index++]); + _u64 recall_at = std::atoi(argv[index++]); + std::string result_output_prefix(argv[index++]); + std::string dist_metric(argv[index++]); + + diskann::Metric m = + dist_metric == "cosine" ? diskann::Metric::COSINE : diskann::Metric::L2; + if (dist_metric != "l2" && m == diskann::Metric::L2) { + diskann::cout << "Unknown distance metric: " << dist_metric + << ". Using default(L2) instead." << std::endl; + } + + std::string disk_index_tag_file = index_prefix_path + "_disk.index.tags"; bool calc_recall_flag = false; - for (int ctr = 10; ctr < argc; ctr++) { + for (int ctr = index; ctr < argc; ctr++) { _u64 curL = std::atoi(argv[ctr]); if (curL >= recall_at) Lvec.push_back(curL); @@ -93,7 +105,8 @@ int search_disk_index(int argc, char** argv) { query_aligned_dim); if (file_exists(truthset_bin)) { - diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim); + diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim, + &tags); if (gt_num != query_num) { diskann::cout << "Error. Mismatch in number of queries and ground truth data" @@ -111,34 +124,45 @@ int search_disk_index(int argc, char** argv) { #endif #else reader.reset(new LinuxAlignedFileReader()); +// reader.reset(new diskann::MemAlignedFileReader()); #endif std::unique_ptr> _pFlashIndex( - new diskann::PQFlashIndex(reader)); - - int res = _pFlashIndex->load(num_threads, pq_prefix.c_str(), - disk_index_file.c_str()); + new diskann::PQFlashIndex(m, reader, single_file_index, + tags_flag)); // no tags support yet. + int res = _pFlashIndex->load(index_prefix_path.c_str(), num_threads); if (res != 0) { return res; } + + if (tags_flag) { + tsl::robin_set<_u32> active_tags; + _pFlashIndex->get_active_tags(active_tags); + + diskann::cout << "Loaded " << active_tags.size() + << " tags from index for recall measurement." << std::endl; + } else { + diskann::cout << "Not loading tags since they are disabled." << std::endl; + } + // cache bfs levels std::vector node_list; diskann::cout << "Caching " << num_nodes_to_cache << " BFS nodes around medoid(s)" << std::endl; - // _pFlashIndex->cache_bfs_levels(num_nodes_to_cache, node_list); - _pFlashIndex->generate_cache_list_from_sample_queries( - warmup_query_file, 15, 6, num_nodes_to_cache, num_threads, node_list); + _pFlashIndex->cache_bfs_levels(num_nodes_to_cache, node_list); + //_pFlashIndex->generate_cache_list_from_sample_queries( + // warmup_query_file, 15, 6, num_nodes_to_cache, num_threads, node_list); _pFlashIndex->load_cache_list(node_list); node_list.clear(); node_list.shrink_to_fit(); omp_set_num_threads(num_threads); - uint64_t warmup_L = 20; + uint64_t warmup_L; + warmup_L = 20; uint64_t warmup_num = 0, warmup_dim = 0, warmup_aligned_dim = 0; T* warmup = nullptr; - if (WARMUP) { if (file_exists(warmup_query_file)) { diskann::load_aligned_bin(warmup_query_file, warmup, warmup_num, @@ -161,15 +185,15 @@ int search_disk_index(int argc, char** argv) { } } diskann::cout << "Warming up index... " << std::flush; - std::vector warmup_result_ids_64(warmup_num, 0); + std::vector warmup_result_tags_64(warmup_num, 0); std::vector warmup_result_dists(warmup_num, 0); #pragma omp parallel for schedule(dynamic, 1) for (_s64 i = 0; i < (int64_t) warmup_num; i++) { - _pFlashIndex->cached_beam_search(warmup + (i * warmup_aligned_dim), 1, - warmup_L, - warmup_result_ids_64.data() + (i * 1), - warmup_result_dists.data() + (i * 1), 4); + _pFlashIndex->cached_beam_search_ids( + warmup + (i * warmup_aligned_dim), 1, warmup_L, + warmup_result_tags_64.data() + (i * 1), + warmup_result_dists.data() + (i * 1), (uint64_t) 4); } diskann::cout << "..done" << std::endl; } @@ -192,12 +216,11 @@ int search_disk_index(int argc, char** argv) { << std::endl; std::vector> query_result_ids(Lvec.size()); + std::vector> query_result_tags(Lvec.size()); std::vector> query_result_dists(Lvec.size()); uint32_t optimized_beamwidth = 2; - // query_num = 1; - for (uint32_t test_id = 0; test_id < Lvec.size(); test_id++) { _u64 L = Lvec[test_id]; @@ -205,54 +228,66 @@ int search_disk_index(int argc, char** argv) { // diskann::cout<<"Tuning beamwidth.." << std::endl; optimized_beamwidth = optimize_beamwidth(_pFlashIndex, warmup, warmup_num, - warmup_aligned_dim, L, optimized_beamwidth); + warmup_aligned_dim, (_u32) L, optimized_beamwidth); } else optimized_beamwidth = beamwidth; query_result_ids[test_id].resize(recall_at * query_num); query_result_dists[test_id].resize(recall_at * query_num); + query_result_tags[test_id].resize(recall_at * query_num); diskann::QueryStats* stats = new diskann::QueryStats[query_num]; - std::vector query_result_ids_64(recall_at * query_num); + std::vector query_result_tags_64(recall_at * query_num); auto s = std::chrono::high_resolution_clock::now(); -#pragma omp parallel for schedule(dynamic, 1) +#pragma omp parallel for schedule(dynamic, 1) for (_s64 i = 0; i < (int64_t) query_num; i++) { - _pFlashIndex->cached_beam_search( - query + (i * query_aligned_dim), recall_at, L, - query_result_ids_64.data() + (i * recall_at), + _pFlashIndex->cached_beam_search_ids( + query + (i * query_aligned_dim), (uint64_t) recall_at, (uint64_t) L, + query_result_tags_64.data() + (i * recall_at), query_result_dists[test_id].data() + (i * recall_at), - optimized_beamwidth, stats + i); + (uint64_t) optimized_beamwidth, stats + i); } auto e = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = e - s; - float qps = (1.0 * query_num) / (1.0 * diff.count()); + float qps = + (float) ((1.0 * (double) query_num) / (1.0 * (double) diff.count())); - diskann::convert_types(query_result_ids_64.data(), - query_result_ids[test_id].data(), - query_num, recall_at); + diskann::convert_types( + query_result_tags_64.data(), query_result_tags[test_id].data(), + (size_t) query_num, (size_t) recall_at); - float mean_latency = diskann::get_mean_stats( + float mean_latency = (float) diskann::get_mean_stats( stats, query_num, [](const diskann::QueryStats& stats) { return stats.total_us; }); - float latency_999 = diskann::get_percentile_stats( - stats, query_num, 0.999, + /* float latency_90 = (float) diskann::get_percentile_stats( + stats, query_num, 0.900, + [](const diskann::QueryStats& stats) { return stats.total_us; }); + + float latency_95 = (float) diskann::get_percentile_stats( + stats, query_num, 0.950, + [](const diskann::QueryStats& stats) { return stats.total_us; }); + */ + float latency_999 = (float) diskann::get_percentile_stats( + stats, query_num, 0.999f, [](const diskann::QueryStats& stats) { return stats.total_us; }); - float mean_ios = diskann::get_mean_stats( + float mean_ios = (float) diskann::get_mean_stats( stats, query_num, [](const diskann::QueryStats& stats) { return stats.n_ios; }); - float mean_cpuus = diskann::get_mean_stats( + float mean_cpuus = (float) diskann::get_mean_stats( stats, query_num, [](const diskann::QueryStats& stats) { return stats.cpu_us; }); + delete[] stats; float recall = 0; if (calc_recall_flag) { - recall = diskann::calculate_recall(query_num, gt_ids, gt_dists, gt_dim, - query_result_ids[test_id].data(), - recall_at, recall_at); + recall = (float) diskann::calculate_recall( + (_u32) query_num, gt_ids, gt_dists, (_u32) gt_dim, + query_result_tags[test_id].data(), (_u32) recall_at, + (_u32) recall_at); } diskann::cout << std::setw(6) << L << std::setw(12) << optimized_beamwidth @@ -261,9 +296,9 @@ int search_disk_index(int argc, char** argv) { << std::setw(16) << mean_cpuus; if (calc_recall_flag) { diskann::cout << std::setw(16) << recall << std::endl; - } else - diskann::cout << std::endl; + } } + std::this_thread::sleep_for(std::chrono::seconds(10)); diskann::cout << "Done searching. Now saving results " << std::endl; _u64 test_id = 0; @@ -273,31 +308,45 @@ int search_disk_index(int argc, char** argv) { diskann::save_bin<_u32>(cur_result_path, query_result_ids[test_id].data(), query_num, recall_at); + cur_result_path = + result_output_prefix + "_" + std::to_string(L) + "_tags_uint32.bin"; + diskann::save_bin<_u32>(cur_result_path, query_result_tags[test_id].data(), + query_num, recall_at); cur_result_path = result_output_prefix + "_" + std::to_string(L) + "_dists_float.bin"; diskann::save_bin(cur_result_path, query_result_dists[test_id++].data(), query_num, recall_at); } + diskann::aligned_free(query); if (warmup != nullptr) diskann::aligned_free(warmup); + delete[] gt_ids; + delete[] gt_dists; return 0; } int main(int argc, char** argv) { - if (argc < 11) { + if (argc < 14) { diskann::cout << "Usage: " << argv[0] - << " [index_type] [index_prefix_path] " - " [num_nodes_to_cache] [num_threads] [beamwidth (use 0 to " - "optimize internally)] " - " [query_file.bin] [truthset.bin (use \"null\" for none)] " - " [K] [result_output_prefix] " - " [L1] [L2] etc. See README for more information on parameters." + << " " + " " + " " + " " + " [L2] etc. See README for more information on parameters." << std::endl; exit(-1); } + + diskann::cout << "Attach debugger and press a key" << std::endl; + /* char x; + std::cin >> x; + */ + if (std::string(argv[1]) == std::string("float")) search_disk_index(argc, argv); else if (std::string(argv[1]) == std::string("int8")) diff --git a/tests/search_memory_index.cpp b/tests/search_memory_index.cpp index 32592710e5..3b26188247 100644 --- a/tests/search_memory_index.cpp +++ b/tests/search_memory_index.cpp @@ -23,127 +23,156 @@ template int search_memory_index(int argc, char** argv) { T* query = nullptr; unsigned* gt_ids = nullptr; + unsigned* gt_tags = nullptr; float* gt_dists = nullptr; size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; std::vector<_u64> Lvec; - std::string data_file(argv[2]); - std::string memory_index_file(argv[3]); - _u64 num_threads = std::atoi(argv[4]); - std::string query_bin(argv[5]); - std::string truthset_bin(argv[6]); - _u64 recall_at = std::atoi(argv[7]); - std::string result_output_prefix(argv[8]); - bool use_optimized_search = std::atoi(argv[9]); - - if ((std::string(argv[1]) != std::string("float")) && - (use_optimized_search == true)) { - std::cout << "Error. Optimized search currently only supported for " - "floating point datatypes. Using un-optimized search." - << std::endl; - use_optimized_search = false; + int arg_no = 2; + + _u64 max_points = (_u64) std::atoi(argv[arg_no++]); + std::string memory_index_file(argv[arg_no++]); + bool dynamic_index = (bool) std::atoi(argv[arg_no++]); + bool single_index_file = (bool) std::atoi(argv[arg_no++]); + // std::string data_file(argv[arg_no++]); + std::string query_bin(argv[arg_no++]); + std::string truthset_bin(argv[arg_no++]); + _u64 recall_at = std::atoi(argv[arg_no++]); + std::string result_output_prefix(argv[arg_no++]); + _u32 num_threads = (_u32) std::atoi(argv[arg_no++]); + std::string distance_metric(argv[arg_no++]); + + diskann::Metric m = (distance_metric == "cosine" ? diskann::Metric::COSINE + : diskann::Metric::L2); + + if (distance_metric != "l2" && m == diskann::Metric::L2) { + std::cout << "Not processing metric: '" << distance_metric + << "'. Setting to default (L2)" << std::endl; } bool calc_recall_flag = false; - for (int ctr = 10; ctr < argc; ctr++) { + for (int ctr = arg_no; ctr < argc; ctr++) { _u64 curL = std::atoi(argv[ctr]); if (curL >= recall_at) Lvec.push_back(curL); } if (Lvec.size() == 0) { - std::cout << "No valid Lsearch found. Lsearch must be at least recall_at." - << std::endl; + diskann::cout + << "No valid Lsearch found. Lsearch must be at least recall_at." + << std::endl; return -1; } + std::cout << "Running search on type " << typeid(T).name() + << " max_points: " << max_points + << " index file:" << memory_index_file + << " is dynamic: " << dynamic_index + << " is single file: " << single_index_file + << " query file: " << query_bin + << " truthset file: " << truthset_bin << " K: " << recall_at + << " num threads: " << num_threads + << " save prefix: " << result_output_prefix + << " similarity metric: " + << (m == diskann::Metric::COSINE ? "cosine" : "l2") + << " first L: " << Lvec[0] << std::endl; + diskann::load_aligned_bin(query_bin, query, query_num, query_dim, query_aligned_dim); if (file_exists(truthset_bin)) { - diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim); + diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim, + >_tags); if (gt_num != query_num) { - std::cout << "Error. Mismatch in number of queries and ground truth data" - << std::endl; + diskann::cout + << "Error. Mismatch in number of queries and ground truth data" + << std::endl; } calc_recall_flag = true; } - std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); - std::cout.precision(2); + diskann::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); + diskann::cout.precision(2); - auto metric = diskann::L2; - if (use_optimized_search) - metric = diskann::FAST_L2; - diskann::Index index(metric, data_file.c_str()); - index.load(memory_index_file.c_str()); // to load NSG - std::cout << "Index loaded" << std::endl; + diskann::Index index(m, query_dim, max_points, dynamic_index, + single_index_file, dynamic_index); + index.load(memory_index_file.c_str()); - if (use_optimized_search) - index.optimize_graph(); + tsl::robin_set active_tags; + index.get_active_tags(active_tags); + + diskann::cout << "Index loaded" << std::endl; diskann::Parameters paras; std::string recall_string = "Recall@" + std::to_string(recall_at); - std::cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " << std::setw(18) - << "Mean Latency (mus)" << std::setw(15) << "99.9 Latency" - << std::setw(12) << recall_string << std::endl; - std::cout << "===============================================================" - "===============" - << std::endl; + diskann::cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " + << std::setw(18) << "Mean Latency (ms)" << std::setw(15) + << "99.9 Latency" << std::setw(12) << recall_string + << std::endl; + diskann::cout + << "===============================================================" + "===============" + << std::endl; std::vector> query_result_ids(Lvec.size()); std::vector> query_result_dists(Lvec.size()); + std::vector> query_result_tags(Lvec.size()); std::vector latency_stats(query_num, 0); for (uint32_t test_id = 0; test_id < Lvec.size(); test_id++) { _u64 L = Lvec[test_id]; query_result_ids[test_id].resize(recall_at * query_num); + query_result_tags[test_id].resize(recall_at * query_num); + query_result_dists[test_id].resize(recall_at * query_num); auto s = std::chrono::high_resolution_clock::now(); - omp_set_num_threads(num_threads); -#pragma omp parallel for schedule(dynamic, 1) + +#pragma omp parallel for schedule(dynamic, 1) num_threads(num_threads) for (int64_t i = 0; i < (int64_t) query_num; i++) { auto qs = std::chrono::high_resolution_clock::now(); - if (use_optimized_search) { - index.search_with_opt_graph( - query + i * query_aligned_dim, recall_at, L, - query_result_ids[test_id].data() + i * recall_at); - } else { - index.search(query + i * query_aligned_dim, recall_at, L, + if (dynamic_index) + index.search_with_tags( + query + i * query_aligned_dim, (uint64_t) recall_at, (_u32) L, + query_result_ids[test_id].data() + i * recall_at, + query_result_dists[test_id].data() + i * recall_at); + else + index.search(query + i * query_aligned_dim, recall_at, (_u32) L, query_result_ids[test_id].data() + i * recall_at); - } auto qe = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = qe - qs; - latency_stats[i] = diff.count() * 1000000; + latency_stats[i] = diff.count() * 1000; } auto e = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = e - s; - float qps = (query_num / diff.count()); + float qps = (float) ((double) query_num / (double) diff.count()); float recall = 0; if (calc_recall_flag) - recall = diskann::calculate_recall(query_num, gt_ids, gt_dists, gt_dim, - query_result_ids[test_id].data(), - recall_at, recall_at); + + recall = (float) diskann::calculate_recall( + (_u32) query_num, gt_tags, gt_dists, (_u32) gt_dim, + query_result_ids[test_id].data(), (_u32) recall_at, (_u32) recall_at, + active_tags); std::sort(latency_stats.begin(), latency_stats.end()); double mean_latency = 0; for (uint64_t q = 0; q < query_num; q++) { mean_latency += latency_stats[q]; } - mean_latency /= query_num; + mean_latency /= (double) query_num; - std::cout << std::setw(4) << L << std::setw(12) << qps << std::setw(18) - << (float) mean_latency << std::setw(15) - << (float) latency_stats[(_u64)(0.999 * query_num)] - << std::setw(12) << recall << std::endl; + diskann::cout << std::setw(4) << L << std::setw(12) << qps << std::setw(18) + << (float) mean_latency << std::setw(15) + << (float) latency_stats[(_u64)(0.999 * (double) query_num)] + << std::setw(12) << recall << std::endl; } - std::cout << "Done searching. Now saving results " << std::endl; + diskann::cout << "Done searching. Now saving results " << std::endl; _u64 test_id = 0; + for (auto L : Lvec) { std::string cur_result_path = result_output_prefix + "_" + std::to_string(L) + "_idx_uint32.bin"; @@ -157,18 +186,21 @@ int search_memory_index(int argc, char** argv) { } int main(int argc, char** argv) { - if (argc < 11) { - std::cout + if (argc < 13) { + diskann::cout << "Usage: " << argv[0] - << " [index_type] [data_file.bin] " - "[memory_index_path] [num_threads] " - "[query_file.bin] [truthset.bin (use \"null\" for none)] " - " [K] [result_output_prefix] [use_optimized_search (for small ~1M " - "data)] " - " [L1] [L2] etc. See README for more information on parameters. " + << " " + " " + " " + " " + " " + " [L2] etc. See README for more information on parameters. " << std::endl; exit(-1); } + if (std::string(argv[1]) == std::string("int8")) search_memory_index(argc, argv); else if (std::string(argv[1]) == std::string("uint8")) @@ -176,5 +208,5 @@ int main(int argc, char** argv) { else if (std::string(argv[1]) == std::string("float")) search_memory_index(argc, argv); else - std::cout << "Unsupported type. Use float/int8/uint8" << std::endl; + diskann::cout << "Unsupported type. Use float/int8/uint8" << std::endl; } diff --git a/tests/search_memory_index_recovery.cpp b/tests/search_memory_index_recovery.cpp new file mode 100644 index 0000000000..d33a503b7c --- /dev/null +++ b/tests/search_memory_index_recovery.cpp @@ -0,0 +1,200 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include + +#ifndef _WINDOWS +#include +#include +#include +#include +#endif + +#include "aux_utils.h" +#include "index.h" +#include "memory_mapper.h" +#include "utils.h" + +template +int search_memory_index(int argc, char** argv) { + T* query = nullptr; + unsigned* gt_ids = nullptr; + unsigned* gt_tags = nullptr; + float* gt_dists = nullptr; + size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; + std::vector<_u64> Lvec; + + int arg_no = 2; + std::string data_file(argv[arg_no++]); + std::string memory_index_file(argv[arg_no++]); + int frozen_pt = std::atoi(argv[arg_no++]); + int tags = std::atoi(argv[arg_no++]); + std::string query_bin(argv[arg_no++]); + std::string truthset_bin(argv[arg_no++]); + _u64 recall_at = std::atoi(argv[arg_no++]); + std::string result_output_prefix(argv[arg_no++]); + + bool calc_recall_flag = false; + + for (int ctr = 10; ctr < argc; ctr++) { + _u64 curL = std::atoi(argv[ctr]); + if (curL >= recall_at) + Lvec.push_back(curL); + } + + if (Lvec.size() == 0) { + std::cout << "No valid Lsearch found. Lsearch must be at least recall_at." + << std::endl; + return -1; + } + + diskann::load_aligned_bin(query_bin, query, query_num, query_dim, + query_aligned_dim); + + if (file_exists(truthset_bin)) { + diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim, + >_tags); + if (gt_num != query_num) { + std::cout << "Error. Mismatch in number of queries and ground truth data" + << std::endl; + } + calc_recall_flag = true; + } + + std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); + std::cout.precision(2); + + _u64 data_num, data_dim; + diskann::get_bin_metadata(data_file, data_num, data_dim); + std::vector>> indices; + indices.reserve(6); + for (int j = 0; j < 6; j++) { + indices.emplace_back(std::make_shared>( + diskann::L2, data_dim, data_num, frozen_pt)); + if (tags == 1) + indices[j]->load(memory_index_file.c_str(), data_file.c_str(), true); + else { + indices[j]->load(memory_index_file.c_str(), data_file.c_str(), false); + } + } + std::cout << "Index loaded" << std::endl; + + diskann::Parameters paras; + std::string recall_string = "Recall@" + std::to_string(recall_at); + std::cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " << std::setw(18) + << "Mean Latency (ms)" << std::setw(15) << "99.9 Latency" + << std::setw(12) << recall_string << std::endl; + std::cout << "===============================================================" + "===============" + << std::endl; + + std::vector> query_result_ids(Lvec.size()); + std::vector> query_result_dists(Lvec.size()); + std::vector> query_result_tags(Lvec.size()); + + std::vector> latency_stats(6); + for (int j = 0; j < 6; j++) { + latency_stats[j].reserve(query_num); + for (int k = 0; k < query_num; k++) + latency_stats[j][k] = 0; + } + + for (uint32_t test_id = 0; test_id < Lvec.size(); test_id++) { + _u64 L = Lvec[test_id]; + // recall_at = L; + // query_result_ids[test_id].resize(recall_at * query_num); + // query_result_tags[test_id].resize(recall_at * query_num); + + auto s = std::chrono::high_resolution_clock::now(); + // #pragma omp parallel for schedule(dynamic, 1) num_threads(96) + for (int64_t i = 0; i < (int64_t) query_num; i++) { +#pragma omp parallel for num_threads(6) + for (int j = 0; j < 6; j++) { + std::vector result_ids(recall_at); + auto qs = std::chrono::high_resolution_clock::now(); + indices[j]->search(query + i * query_aligned_dim, recall_at, (_u32) L, + result_ids.data()); + auto qe = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = qe - qs; + latency_stats[j][i] = diff.count() * 1000; + } + } + auto e = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = e - s; + + float qps = (float) (query_num / diff.count()); + + float recall = 0; + // if (calc_recall_flag) + + /* recall = (float) diskann::calculate_recall( + (_u32) query_num, gt_ids, gt_dists, (_u32) gt_dim, + query_result_ids[test_id].data(), (_u32) recall_at, (_u32) + recall_at); + */ + + for (int j = 0; j < 6; j++) + std::sort(latency_stats[j].begin(), latency_stats[j].end()); + double mean_latency = 0; + for (uint64_t q = 0; q < query_num; q++) { + double mean_latency_temp = 0; + for (int j = 0; j < 6; j++) { + mean_latency_temp += latency_stats[j][q]; + } + mean_latency += (mean_latency_temp / 6); + } + mean_latency /= query_num; + + double latency_99 = 0; + for (int j = 0; j < 6; j++) { + latency_99 += latency_stats[j][(_u64)(0.99 * query_num)]; + } + + latency_99 /= 6; + + std::cout << std::setw(4) << L << std::setw(12) << qps << std::setw(18) + << (float) mean_latency << std::setw(15) << (float) latency_99 + << std::setw(12) << recall << std::endl; + } + + /* std::cout << "Done searching. Now saving results " << std::endl; + _u64 test_id = 0; + for (auto L : Lvec) { + // recall_at = L; + std::string cur_result_path = + result_output_prefix + "_" + std::to_string(L) + "_idx_uint32.bin"; + diskann::save_bin<_u32>(cur_result_path, query_result_ids[test_id].data(), + query_num, recall_at); + test_id++; + } + */ + diskann::aligned_free(query); + return 0; +} + +int main(int argc, char** argv) { + if (argc < 10) { + std::cout + << "Usage: " << argv[0] + << " [index_type] [data_file.bin] " + "[memory_index_path] [frozen_pt[0/1]] [tags[0/1]]" + " [query_file.bin] [truthset.bin (use \"null\" for none)] " + " [K] [result_output_prefix] " + " [L1] [L2] etc. See README for more information on parameters. " + << std::endl; + exit(-1); + } + if (std::string(argv[1]) == std::string("int8")) + search_memory_index(argc, argv); + else if (std::string(argv[1]) == std::string("uint8")) + search_memory_index(argc, argv); + else if (std::string(argv[1]) == std::string("float")) + search_memory_index(argc, argv); + else + std::cout << "Unsupported type. Use float/int8/uint8" << std::endl; +} diff --git a/tests/test_concurr_insert_search.cpp b/tests/test_concurr_insert_search.cpp new file mode 100644 index 0000000000..571eec22c5 --- /dev/null +++ b/tests/test_concurr_insert_search.cpp @@ -0,0 +1,172 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" + +#ifndef _WINDOWS +#include +#include +#include +#endif + +#include "memory_mapper.h" + +template +void search_kernel(T* query, size_t query_num, size_t query_aligned_dim, + const int recall_at, std::vector<_u64> Lvec, + diskann::Index& index) { + uint32_t* results = new uint32_t[recall_at * query_num]; + for (uint32_t test_id = 0; test_id < Lvec.size(); test_id++) { +#pragma omp parallel for num_threads(8) + for (int64_t i = 0; i < (int64_t) query_num; i++) { + _u64 L = Lvec[test_id]; + index.search(query + i * query_aligned_dim, recall_at, L, + results + i * recall_at); + } + } + delete[] results; +} + +template +void insert_kernel(T* data_load, diskann::Index& index, + diskann::Parameters& parameters, size_t num_points, + size_t aligned_dim, unsigned start) { + diskann::cout << "Insertion thread" << std::endl; + diskann::Timer timer; +// do not parallelize without making _iterate_to_fixed_point() thread safe +#pragma omp parallel for num_threads(16) + for (unsigned insertions = start; insertions < num_points; ++insertions) { + index.insert_point(data_load + insertions * aligned_dim, parameters, + insertions); + } + + unsigned time_secs = timer.elapsed() / 1000000; + diskann::cout << "Insert time : " << time_secs << " s\n" + << "Inserts/sec : " << num_points / time_secs << std::endl; +} +template +int build_incremental_index(const std::string& data_path, const unsigned L, + const unsigned R, const unsigned C, + const unsigned num_rnds, const float alpha, + const std::string& save_path, + const std::string& query_file, const int recall_at, + std::vector<_u64> Lvec) { + diskann::Parameters paras; + paras.Set("L", L); + paras.Set("R", R); + paras.Set("C", C); + paras.Set("alpha", alpha); + paras.Set("num_rnds", num_rnds); + paras.Set("saturate_graph", 0); + + T* data_load = NULL; + size_t num_points, dim, aligned_dim; + + diskann::load_aligned_bin(data_path.c_str(), data_load, num_points, dim, + aligned_dim); + + unsigned num_prebuilt = 1; + + typedef int TagT; + diskann::Index index(diskann::L2, dim, num_points, 1, true, false); + + { + std::vector tags(1); + std::iota(tags.begin(), tags.end(), 0); + + diskann::Timer timer; + index.build(data_path.c_str(), num_points, paras, tags); + diskann::cout << "Index build time: " << timer.elapsed() / 1000 << "ms\n"; + } + + diskann::cout << "Saved batch build" << std::endl; + T* query = NULL; + size_t query_num, query_dim, query_aligned_dim; + + diskann::load_aligned_bin(query_file, query, query_num, query_dim, + query_aligned_dim); + { + std::future future = std::async( + std::launch::async, insert_kernel, data_load, std::ref(index), + std::ref(paras), num_points, aligned_dim, num_prebuilt); + + std::future_status status; + + unsigned total_queries = 0; + do { + status = future.wait_for(std::chrono::milliseconds(1)); + if (status == std::future_status::deferred) { + diskann::cout << "deferred\n"; + } else if (status == std::future_status::timeout) { + search_kernel(query, query_num, query_aligned_dim, recall_at, Lvec, + index); + total_queries += query_num; + diskann::cout << "total queries: " << total_queries << std::endl; + } else if (status == std::future_status::ready) { + diskann::cout << "Insertions complete!\n"; + } + } while (status != std::future_status::ready); + } + auto save_path_inc = save_path + ".inc"; + index.save(save_path_inc.c_str()); + diskann::cout << "Saved file post insertions" << std::endl; + + delete[] data_load; + + return 0; +} + +int main(int argc, char** argv) { + if (argc < 12) { + diskann::cout << "Correct usage: " << argv[0] + << " type[int8/uint8/float] data_file L R C alpha " + "num_rounds " + << "save_graph_file query_file recall@ L1 L2....." + << std::endl; + exit(-1); + } + + unsigned L = (unsigned) atoi(argv[3]); + unsigned R = (unsigned) atoi(argv[4]); + unsigned C = (unsigned) atoi(argv[5]); + float alpha = (float) std::atof(argv[6]); + unsigned num_rnds = (unsigned) std::atoi(argv[7]); + std::string save_path(argv[8]); + std::string query_file(argv[9]); + int recall_at = (int) atoi(argv[10]); + + std::vector<_u64> Lvec; + + for (int ctr = 11; ctr < argc; ctr++) { + _u64 curL = std::atoi(argv[ctr]); + if (curL >= (_u64) recall_at) + Lvec.push_back(curL); + } + + if (Lvec.size() == 0) { + diskann::cout + << "No valid Lsearch found. Lsearch must be at least recall_at." + << std::endl; + return -1; + } + + if (std::string(argv[1]) == std::string("int8")) + build_incremental_index(argv[2], L, R, C, num_rnds, alpha, + save_path, query_file, recall_at, Lvec); + else if (std::string(argv[1]) == std::string("uint8")) + build_incremental_index(argv[2], L, R, C, num_rnds, alpha, + save_path, query_file, recall_at, Lvec); + else if (std::string(argv[1]) == std::string("float")) + build_incremental_index(argv[2], L, R, C, num_rnds, alpha, save_path, + query_file, recall_at, Lvec); + else + diskann::cout << "Unsupported type. Use float/int8/uint8" << std::endl; +} diff --git a/tests/test_concurr_merge_insert.cpp b/tests/test_concurr_merge_insert.cpp new file mode 100644 index 0000000000..3a9a2f8ce9 --- /dev/null +++ b/tests/test_concurr_merge_insert.cpp @@ -0,0 +1,745 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "v2/index_merger.h" +#include "v2/merge_insert.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aux_utils.h" +#include "utils.h" +#include "math_utils.h" +#include "partition_and_pq.h" + +#ifndef _WINDOWS +#include +#include +#include +#endif + +#include +#include + +#define NUM_INSERT_THREADS 2 +#define NUM_DELETE_THREADS 1 +#define NUM_SEARCH_THREADS 6 +// random number generator +std::random_device dev; +std::mt19937 rng(dev()); + +tsl::robin_map params; +float mem_alpha, merge_alpha; +uint32_t medoid_id = std::numeric_limits::max(); +std::atomic_bool _insertions_done(true); +std::atomic_bool _del_done(true); +std::vector Lvec; +std::future delete_future; +std::future insert_future; +std::future merge_future; +diskann::Timer global_timer; +std::string all_points_file; +bool save_index_as_one_file; +std::string TMP_FOLDER; + +template +void seed_iter(tsl::robin_set &active_set, + tsl::robin_set &inactive_set, + const std::string & inserted_points_file, + const std::string & inserted_tags_file, + tsl::robin_set & deleted_tags) { + const uint32_t insert_count = params[std::string("insert_count")]; + const uint32_t delete_count = params[std::string("delete_count")]; + const uint32_t ndims = params[std::string("ndims")]; + std::cout << "ITER: start = " << active_set.size() << ", " + << inactive_set.size() << "\n"; + + // pick `delete_count` tags + std::vector active_vec(active_set.begin(), active_set.end()); + std::shuffle(active_vec.begin(), active_vec.end(), rng); + std::vector delete_vec; + if (active_vec.size() < delete_count) + delete_vec.insert(delete_vec.end(), active_vec.begin(), active_vec.end()); + else + delete_vec.insert(delete_vec.end(), active_vec.begin(), + active_vec.begin() + delete_count); + for (auto iter : delete_vec) + deleted_tags.insert(iter); + active_set.clear(); + active_set.insert(active_vec.begin() + delete_vec.size(), active_vec.end()); + std::cout << "ITER: DELETE - " << delete_vec.size() << " IDs\n"; + // pick `insert_count` tags + std::vector inactive_vec(inactive_set.begin(), inactive_set.end()); + std::shuffle(inactive_vec.begin(), inactive_vec.end(), rng); + std::vector insert_vec; + if (inactive_vec.size() < insert_count) + insert_vec.insert(insert_vec.end(), inactive_vec.begin(), + inactive_vec.end()); + else + insert_vec.insert(insert_vec.end(), inactive_vec.begin(), + inactive_vec.begin() + insert_count); + inactive_set.clear(); + + std::cout << "ITER: INSERT - " << insert_vec.size() << " IDs in " + << inserted_tags_file << "\n"; + inactive_set.insert(inactive_vec.begin() + insert_vec.size(), + inactive_vec.end()); + std::sort(insert_vec.begin(), insert_vec.end()); + TagT *tag_data = new TagT[insert_vec.size()]; + for (size_t i = 0; i < insert_vec.size(); i++) + tag_data[i] = insert_vec[i]; + diskann::save_bin(inserted_tags_file, tag_data, insert_vec.size(), 1); + delete[] tag_data; + + // use ifstream reader to load node coordinates + std::ifstream base_reader; + base_reader.open(::all_points_file, std::ios::binary | std::ios::ate); + + base_reader.seekg(2 * sizeof(uint32_t), std::ios::beg); + + std::ofstream inserted_points_writer(inserted_points_file, std::ios::binary); + T *new_pts = new T[(uint32_t) insert_vec.size() * (uint32_t) ndims]; + for (uint64_t idx = 0; idx < insert_vec.size(); idx++) { + uint32_t actual_idx = insert_vec[idx]; + T * point = new T[ndims]; + base_reader.seekg( + (2 * sizeof(uint32_t) + actual_idx * (uint64_t) ndims * sizeof(T)), + std::ios::beg); + base_reader.read((char *) point, ((uint64_t) ndims) * sizeof(T)); + T *dest_ptr = new_pts + idx * (uint64_t) ndims; + std::memcpy(dest_ptr, point, ndims * sizeof(T)); + delete[] point; + } + base_reader.close(); + + uint32_t npts_u32 = (uint32_t) insert_vec.size(); + uint32_t ndims_u32 = ndims; + inserted_points_writer.write((char *) &npts_u32, sizeof(uint32_t)); + inserted_points_writer.write((char *) &ndims_u32, sizeof(uint32_t)); + inserted_points_writer.write( + (char *) new_pts, + (uint64_t) insert_vec.size() * (uint64_t) ndims * sizeof(T)); + inserted_points_writer.close(); + delete[] new_pts; + + // balance tags + inactive_set.insert(delete_vec.begin(), delete_vec.end()); + active_set.insert(insert_vec.begin(), insert_vec.end()); + + diskann::cout << "ITER: end = " << active_set.size() << ", " + << inactive_set.size() << "\n"; +#ifndef _WINDOWS + std::cout << "ITER: end = " << active_set.size() << ", " + << inactive_set.size() << "\n"; + malloc_stats(); +#endif +} + +float compute_active_recall(const uint32_t *result_tags, + const uint32_t result_count, + const uint32_t *gs_tags, const uint64_t gs_count, + const tsl::robin_set &inactive_set) { + tsl::robin_set active_gs; + for (uint32_t i = 0; i < gs_count && active_gs.size() < result_count; i++) { + auto iter = inactive_set.find(gs_tags[i]); + if (iter == inactive_set.end()) { + active_gs.insert(gs_tags[i]); + } + } + uint32_t match = 0; + for (uint32_t i = 0; i < result_count; i++) { + match += (active_gs.find(result_tags[i]) != active_gs.end()); + } + return ((float) match / (float) result_count) * 100; +} + +template +void search_disk_index(const std::string & index_prefix_path, + const tsl::robin_set &inactive_tags, + const std::string & query_path, + const std::string & gs_path) { + std::string pq_prefix = index_prefix_path + "_pq"; + std::string disk_index_file = index_prefix_path + "_disk.index"; + std::string warmup_query_file = index_prefix_path + "_sample_data.bin"; + uint32_t beamwidth = params[std::string("beam_width")]; + uint32_t num_threads = 60; + std::string query_bin = query_path; + std::string truthset_bin = gs_path; + uint64_t recall_at = params[std::string("recall_k")]; + uint64_t search_L = ::Lvec[0]; + // hold data + T * query = nullptr; + unsigned *gt_ids = nullptr; + uint32_t *gt_tags = nullptr; + float * gt_dists = nullptr; + size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; + + // load query + truthset + diskann::load_aligned_bin(query_bin, query, query_num, query_dim, + query_aligned_dim); + diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim); + if (gt_num != query_num) { + std::cout << "Error. Mismatch in number of queries and ground truth data" + << std::endl; + } + + // load PQ Flash Index + std::shared_ptr reader(new LinuxAlignedFileReader()); + std::unique_ptr> _pFlashIndex( + new diskann::PQFlashIndex(diskann::Metric::L2, reader, + ::save_index_as_one_file, true)); + int res = _pFlashIndex->load(num_threads, pq_prefix.c_str(), + disk_index_file.c_str()); + if (res != 0) { + std::cerr << "Failed to load index.\n"; + exit(-1); + } + + // prep for search + std::vector query_result_ids; + std::vector query_result_tags; + std::vector query_result_dists; + query_result_ids.resize(recall_at * query_num); + query_result_dists.resize(recall_at * query_num); + query_result_tags.resize(recall_at * query_num); + diskann::QueryStats * stats = new diskann::QueryStats[query_num]; + std::vector query_result_ids_64(recall_at * query_num); +#pragma omp parallel for schedule(dynamic, 1) // num_threads(1) + for (_s64 i = 0; i < (int64_t) query_num; i++) { + _pFlashIndex->cached_beam_search( + query + (i * query_aligned_dim), recall_at, search_L, + query_result_ids_64.data() + (i * recall_at), + query_result_dists.data() + (i * recall_at), beamwidth, stats + i, + query_result_tags.data() + (i * recall_at)); + } + + // compute mean recall, IOs + float mean_recall = 0.0f; + for (uint32_t i = 0; i < query_num; i++) { + auto *result_tags = query_result_tags.data() + (i * recall_at); + auto *gs_tags = gt_tags + (i * gt_dim); + float query_recall = compute_active_recall( + result_tags, (uint32_t) recall_at, gs_tags, gt_dim, inactive_tags); + mean_recall += query_recall; + } + mean_recall /= query_num; + + float mean_ios = (float) diskann::get_mean_stats( + stats, query_num, + [](const diskann::QueryStats &stats) { return stats.n_ios; }); + std::cout << "PQFlashIndex :: recall-" << recall_at << "@" << recall_at + << ": " << mean_recall << ", mean IOs: " << mean_ios << "\n"; + diskann::aligned_free(query); + delete[] stats; + delete[] gt_ids; + delete[] gt_dists; + delete[] gt_tags; +} + +template +void search_kernel(diskann::MergeInsert & merge_insert, + const tsl::robin_set &active_tags, + const std::string query_path, const std::string gs_path, + bool print_stats = false) { + std::string query_bin = query_path; + std::string truthset_bin = gs_path; + uint64_t recall_at = params[std::string("recall_k")]; + + // hold data + T * query = nullptr; + unsigned *gt_ids = nullptr; + uint32_t *gt_tags = nullptr; + float * gt_dists = nullptr; + size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; + + // load query + truthset + diskann::load_aligned_bin(query_bin, query, query_num, query_dim, + query_aligned_dim); + std::cout << "Loaded query" << std::endl; + diskann::load_truthset(gs_path, gt_ids, gt_dists, gt_num, gt_dim); + std::cout << "Loaded gt" << std::endl; + if (gt_num != query_num) { + std::cout << "Error. Mismatch in number of queries and ground truth data" + << std::endl; + } + + if (print_stats) { + std::string recall_string = "SS-Recall@" + std::to_string(recall_at); + std::cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " + << std::setw(18) << "Mean Latency (ms)" << std::setw(12) + << "90 Latency" << std::setw(12) << "95 Latency" << std::setw(12) + << "99 Latency" << std::setw(12) << "99.9 Latency" + << std::setw(12) << recall_string << std::setw(12) + << "Mean disk IOs" << std::endl; + + std::cout + + << "===============================================================" + "===============" + << std::endl; + } else { + std::string recall_string = "Recall@" + std::to_string(recall_at); + std::cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " + << std::setw(18) << "Mean Latency (ms)" << std::setw(12) + << "90 Latency" << std::setw(12) << "95 Latency" << std::setw(12) + << "99 Latency" << std::setw(12) << "99.9 Latency" + << std::setw(12) << recall_string << std::setw(12) + << "Mean disk IOs" << std::endl; + std::cout + << "===============================================================" + "===============" + << std::endl; + } + + // prep for search + std::vector query_result_ids; + std::vector query_result_tags; + std::vector query_result_dists; + query_result_ids.resize(recall_at * query_num); + query_result_dists.resize(recall_at * query_num); + query_result_tags.resize(recall_at * query_num); + std::vector query_result_ids_32(recall_at * query_num); + + for (size_t test_id = 0; test_id < ::Lvec.size(); test_id++) { + diskann::QueryStats *stats = new diskann::QueryStats[query_num]; + uint32_t L = Lvec[test_id]; + std::vector latency_stats(query_num, 0); + auto s = std::chrono::high_resolution_clock::now(); +#pragma omp parallel for num_threads(NUM_SEARCH_THREADS) + for (_s64 i = 0; i < (int64_t) query_num; i++) { + auto qs = std::chrono::high_resolution_clock::now(); + merge_insert.search_sync(query + (i * query_aligned_dim), recall_at, L, + (query_result_tags.data() + (i * recall_at)), + query_result_dists.data() + (i * recall_at), + stats + i); + auto qe = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = qe - qs; + latency_stats[i] = diff.count() * 1000; + // std::this_thread::sleep_for(std::chrono::milliseconds(2)); + } + auto e = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = e - s; + float qps = (float) (((double) query_num) / diff.count()); + // compute mean recall, IOs + float mean_recall = 0.0f; + mean_recall = diskann::calculate_recall( + (unsigned) query_num, gt_ids, gt_dists, (unsigned) gt_dim, + query_result_tags.data(), (unsigned) recall_at, (unsigned) recall_at, + active_tags); + // mean_recall /= (float) query_num; + float mean_ios = (float) diskann::get_mean_stats( + stats, query_num, + [](const diskann::QueryStats &stats) { return stats.n_ios; }); + std::sort(latency_stats.begin(), latency_stats.end()); + std::cout << std::setw(4) << L << std::setw(12) << qps << std::setw(18) + << ((float) std::accumulate(latency_stats.begin(), + latency_stats.end(), 0)) / + (float) query_num + << std::setw(12) + << (float) latency_stats[(_u64)(0.90 * ((double) query_num))] + << std::setw(12) + << (float) latency_stats[(_u64)(0.95 * ((double) query_num))] + << std::setw(12) + << (float) latency_stats[(_u64)(0.99 * ((double) query_num))] + << std::setw(12) + << (float) latency_stats[(_u64)(0.999 * ((double) query_num))] + << std::setw(12) << mean_recall << std::setw(12) << mean_ios + << std::endl; + delete[] stats; + } + diskann::aligned_free(query); + delete[] gt_ids; + delete[] gt_dists; + delete[] gt_tags; +} + +template +void insertion_kernel(diskann::MergeInsert &merge_insert, + std::string mem_pts_file, std::string mem_tags_file) { + if (::_insertions_done.load()) { + std::cout << "Insertions_done is true at the beginning of insertion kernel" + << std::endl; + exit(-1); + } + T * data_insert = nullptr; + size_t npts, ndim, aligned_dim; + diskann::load_aligned_bin(mem_pts_file, data_insert, npts, ndim, + aligned_dim); + size_t tag_num, tag_dim; + TagT * tag_data; + diskann::load_bin(mem_tags_file, tag_data, tag_num, tag_dim); + if (tag_num != npts) { + std::cout << "In insertion_kernel(), number of tags loaded is not equal to " + "number of points loaded. Exiting....." + << std::endl; + exit(-1); + } + _s64 i; + std::vector insert_latencies(npts, 0); + diskann::Timer timer; +#pragma omp parallel for num_threads(NUM_INSERT_THREADS) + for (i = 0; i < (_s64) npts; i++) { + diskann::Timer insert_timer; + if (merge_insert.insert(data_insert + i * aligned_dim, tag_data[i]) == 0) { + insert_latencies[i] = ((double) insert_timer.elapsed()); + } else { + std::cout << "Point " << i << "could not be inserted." << std::endl; + } + if ((i % 1000000 == 0) && (i > 0)) + std::cout << "Inserted another 1M points" << std::endl; + } + std::cout << "Mem index insertion time : " << timer.elapsed() / 1000 << " ms" + << std::endl + << "10th percentile insertion time : " + << insert_latencies[(size_t)(0.10 * ((double) npts))] << " microsec" + << std::endl + << "50th percentile insertion time : " + << insert_latencies[(size_t)(0.5 * ((double) npts))] << " microsec" + << "90th percentile insertion time : " + << insert_latencies[(size_t)(0.90 * ((double) npts))] << " microsec" + << std::endl; + ::_insertions_done.store(true); + delete[] data_insert; + delete[] tag_data; +} +template +void deletion_kernel(diskann::MergeInsert &merge_insert, + tsl::robin_set del_tags) { + if (::_del_done.load()) { + std::cout << "_del_done is already true" << std::endl; + exit(-1); + } + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + diskann::Timer timer; + for (auto iter : del_tags) { + merge_insert.lazy_delete(iter); + } + std::cout << "Deletion time : " << timer.elapsed() / 1000 << " ms" + << std::endl; + ::_del_done.store(true); +} + +template +void merge_kernel(diskann::MergeInsert &merge_insert) { + merge_insert.final_merge(); +} + +template +void run_iter(diskann::MergeInsert & merge_insert, + const std::string & mem_prefix, + tsl::robin_set &active_set, + tsl::robin_set &inactive_set, + const std::string query_file, const std::string gs_file, + T *data) { + // files for mem-DiskANN + std::string mem_pts_file = mem_prefix + ".data_orig"; + std::string mem_tags_file = mem_prefix + ".tags_orig"; + std::this_thread::sleep_for(std::chrono::milliseconds(5000)); + + ::merge_future = + std::async(std::launch::async, merge_kernel, std::ref(merge_insert)); + + while (!(::_insertions_done.load() && ::_del_done.load())) { + /* std::cout << "Search at " << ::global_timer.elapsed() / 1000000 + << " seconds " << std::endl; + search_kernel(merge_insert, inactive_set, query_file, gs_file);*/ + std::this_thread::sleep_for(std::chrono::milliseconds(5000)); + } + + if (::_insertions_done.load() && ::_del_done.load()) { + ::_insertions_done.store(false); + ::_del_done.store(false); + + /* std::cout << "Searching all indices" << std::endl; + std::cout << "Search at " << ::global_timer.elapsed() / 1000000 + << " seconds " << std::endl; + search_kernel(merge_insert, inactive_set, query_file, gs_file, true); + */ + + std::cout << "ITER: Seeding iteration" + << "\n"; + // seed the iteration + tsl::robin_set deleted_tags; + seed_iter(active_set, inactive_set, mem_pts_file, mem_tags_file, + deleted_tags); + ::delete_future = std::async(std::launch::async, deletion_kernel, + std::ref(merge_insert), deleted_tags); + ::insert_future = + std::async(std::launch::async, insertion_kernel, + std::ref(merge_insert), mem_pts_file, mem_tags_file); + } + + std::future_status merge_status; + do { + merge_status = ::merge_future.wait_for(std::chrono::milliseconds(1)); + /* std::cout << "Search at " << ::global_timer.elapsed() / 1000000 + << " seconds " << std::endl; + search_kernel(merge_insert, inactive_set, query_file, gs_file); + */ + std::this_thread::sleep_for(std::chrono::milliseconds(10000)); + } while ((merge_status != std::future_status::ready)); +} + +template +void run_iter(diskann::MergeInsert &merge_insert, + const std::string &base_prefix, const std::string &merge_prefix, + const std::string & mem_prefix, + tsl::robin_set &active_set, + tsl::robin_set &inactive_set, + const std::string &query_file, const std::string &gs_file, + diskann::Distance *dist_cmp) { + // files for mem-DiskANN + std::string mem_pts_file = mem_prefix + ".data_orig"; + std::string mem_tags_file = mem_prefix + ".tags_orig"; + if (::_insertions_done.load() && ::_del_done.load()) { + ::_insertions_done.store(false); + ::_del_done.store(false); + + /* std::cout << "Searching all indices" << std::endl; + std::cout << "Search at " << ::global_timer.elapsed() / 1000000 + << " seconds " << std::endl; + search_kernel(merge_insert, inactive_set, query_file, gs_file, true); + */ + std::cout << "ITER: Seeding iteration" + << "\n"; + // seed the iteration + tsl::robin_set deleted_tags; + seed_iter(active_set, inactive_set, mem_pts_file, mem_tags_file, + deleted_tags); + ::delete_future = std::async(std::launch::async, deletion_kernel, + std::ref(merge_insert), deleted_tags); + ::insert_future = + std::async(std::launch::async, insertion_kernel, + std::ref(merge_insert), mem_pts_file, mem_tags_file); + } + std::future_status insert_status, delete_status; + do { + insert_status = ::insert_future.wait_for(std::chrono::milliseconds(1)); + delete_status = ::delete_future.wait_for(std::chrono::milliseconds(1)); + std::this_thread::sleep_for(std::chrono::seconds(60)); + } while ((insert_status != std::future_status::ready) || + (delete_status != std::future_status::ready)); + + ::merge_future = + std::async(std::launch::async, merge_kernel, std::ref(merge_insert)); + + std::future_status merge_status; + do { + merge_status = ::merge_future.wait_for(std::chrono::milliseconds(1)); + /* std::cout << "Search at " << ::global_timer.elapsed() / 1000000 + << " seconds " << std::endl; + search_kernel(merge_insert, inactive_set, query_file, gs_file); + */ + // std::this_thread::sleep_for(std::chrono::milliseconds(10000)); + } while ((merge_status != std::future_status::ready)); +} + +template +void run_all_iters(std::string base_prefix, std::string merge_prefix, + const std::string mem_prefix, const std::string data_file, + const std::string active_tags_file, + const std::string query_file, const std::string gs_file, + diskann::Distance *dist_cmp) { + // load all data points + std::unique_ptr data; + uint64_t npts = 0, ndims = 0; + diskann::load_bin(data_file, data, npts, ndims); + std::cout << "Loaded base bin" << std::endl; + params[std::string("ndims")] = (uint32_t) ndims; + + uint32_t n_iters = params["n_iters"]; + // load active tags + tsl::robin_set active_tags; + TagT * tag_data; + size_t tag_num, tag_dim; + if (::save_index_as_one_file) { + uint64_t *metadata; + size_t nr, nc; + diskann::load_bin(active_tags_file, metadata, nr, nc); + diskann::load_bin(active_tags_file, tag_data, tag_num, tag_dim, + metadata[7]); + } else { + diskann::load_bin(active_tags_file, tag_data, tag_num, tag_dim); + } + + size_t tags_loaded = 0; + size_t del_tags_found = 0; + active_tags.reserve(tag_num); + for (size_t i = 0; i < tag_num; i++) { + if (tag_data[i] != std::numeric_limits::max()) { + active_tags.insert(tag_data[i]); + tags_loaded++; + } else { + if (del_tags_found < 5) + std::cout << "Driver file found invalid tag in active tag file : " + << tag_data[i] << std::endl; + del_tags_found++; + } + } + std::cout << "Loaded " << tags_loaded << " tags" << std::endl; + delete[] tag_data; + std::cout << del_tags_found + << " deleted/invalid tags found in active tags file" << std::endl; + // read medoid ID from base_prefix + std::ifstream disk_reader(base_prefix + "_disk.index", std::ios::binary); + disk_reader.seekg(2 * sizeof(uint32_t), std::ios::beg); + disk_reader.seekg(2 * sizeof(uint64_t), std::ios::cur); + uint64_t medoid = std::numeric_limits::max(); + disk_reader.read((char *) &medoid, sizeof(uint64_t)); + std::cout << "Detected medoid = " << medoid + << " ==> excluding from insert/deletes.\n"; + ::medoid_id = (uint32_t) medoid; + + // generate inactive tags + tsl::robin_set inactive_tags; + inactive_tags.reserve(npts - tag_num); + for (uint32_t i = 0; i < npts; i++) { + auto iter = active_tags.find(i); + if (iter == active_tags.end()) { + inactive_tags.insert(i); + } + } + std::cout << "Inactive tags : " << inactive_tags.size() << std::endl; + // remove medoid from active_set + active_tags.erase(::medoid_id); + + diskann::Parameters paras; + paras.Set("L_mem", params[std::string("mem_l_index")]); + paras.Set("R_mem", params[std::string("range")]); + paras.Set("alpha_mem", ::mem_alpha); + paras.Set("L_disk", params[std::string("merge_l_index")]); + paras.Set("R_disk", params[std::string("range")]); + paras.Set("alpha_disk", ::merge_alpha); + paras.Set("C", params[std::string("merge_maxc")]); + paras.Set("beamwidth", params[std::string("beam_width")]); + paras.Set("nodes_to_cache", + params[std::string("disk_search_node_cache_count")]); + paras.Set("num_search_threads", + params[std::string("disk_search_nthreads")]); + + const std::string working_folder = ::TMP_FOLDER; + diskann::Metric metric = diskann::Metric::L2; + diskann::MergeInsert merge_insert( + paras, ndims, mem_prefix, base_prefix, merge_prefix, dist_cmp, metric, + ::save_index_as_one_file, working_folder); + for (size_t i = 0; i < n_iters; i++) { + std::cout << "ITER : " << i << std::endl; + run_iter(merge_insert, mem_prefix, active_tags, inactive_tags, + query_file, gs_file, data.get()); + } + /* + std::cout << "Done running all iterations, now merging any leftover points." + << std::endl; + std::future_status merge_status, insert_status, delete_status; + do { + merge_status = ::merge_future.wait_for(std::chrono::milliseconds(1)); + insert_status = ::insert_future.wait_for(std::chrono::milliseconds(1)); + delete_status = ::delete_future.wait_for(std::chrono::milliseconds(1)); + + // search_kernel(merge_insert, active_tags, query_file, gs_file, + // false); + } while ((merge_status != std::future_status::ready) || + (insert_status != std::future_status::ready) || + (delete_status != std::future_status::ready)); + merge_kernel(merge_insert); + */ + search_kernel(merge_insert, active_tags, query_file, gs_file, true); +} + +int main(int argc, char **argv) { + if (argc < 20) { + std::cout << "Correct usage: " << argv[0] + << " " + " " + " " + << " " + << " " + " " + " ...." + << "\n WARNING: Other parameters set inside CPP source." + << std::endl; + exit(-1); + } else { + std::cout << "This driver file only works with uint32 type tags" + << std::endl; + } + std::cout.setf(std::ios::unitbuf); + + int arg_no = 1; + std::string index_type = argv[arg_no++]; + TMP_FOLDER = argv[arg_no++]; + std::string base_prefix(argv[arg_no++]); + std::string merge_prefix(argv[arg_no++]); + std::string mem_prefix(argv[arg_no++]); + unsigned L_mem = (unsigned) atoi(argv[arg_no++]); + float alpha_mem = (float) atof(argv[arg_no++]); + unsigned L_disk = (unsigned) atoi(argv[arg_no++]); + float alpha_disk = (float) atof(argv[arg_no++]); + std::string data_bin(argv[arg_no++]); + int single_file = atoi(argv[arg_no++]); + std::string query_bin(argv[arg_no++]); + std::string gt_bin(argv[arg_no++]); + int n_iters = atoi(argv[arg_no++]); + uint32_t insert_count = (uint32_t) atoi(argv[arg_no++]); + uint32_t delete_count = (uint32_t) atoi(argv[arg_no++]); + uint32_t range = (uint32_t) atoi(argv[arg_no++]); + uint32_t recall_k = (uint32_t) atoi(argv[arg_no++]); + + for (int ctr = arg_no; ctr < argc; ctr++) { + _u32 curL = std::atoi(argv[ctr]); + if (curL >= recall_k) + ::Lvec.push_back(curL); + } + + params[std::string("n_iters")] = n_iters; + params[std::string("insert_count")] = insert_count; + params[std::string("delete_count")] = delete_count; + params[std::string("range")] = range; + params[std::string("recall_k")] = recall_k; + + // hard-coded params + params[std::string("disk_search_node_cache_count")] = 100; + params[std::string("disk_search_nthreads")] = 16; + params[std::string("beam_width")] = 4; + params[std::string("mem_l_index")] = L_mem; + mem_alpha = alpha_mem; + merge_alpha = alpha_disk; + params[std::string("mem_nthreads")] = 32; + params[std::string("merge_maxc")] = (uint32_t)(range * 2.5); + params[std::string("merge_l_index")] = L_disk; + + if (single_file == 1) + ::save_index_as_one_file = true; + else + ::save_index_as_one_file = false; + + std::string active_tags_filename; + if (single_file) + active_tags_filename = base_prefix + "_disk.index"; + else + active_tags_filename = base_prefix + "_disk.index.tags"; + + if (index_type == std::string("float")) { + diskann::DistanceL2 dist_cmp; + run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, + active_tags_filename, query_bin, gt_bin, &dist_cmp); + } else if (index_type == std::string("uint8")) { + diskann::DistanceL2UInt8 dist_cmp; + run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, + active_tags_filename, query_bin, gt_bin, &dist_cmp); + } else if (index_type == std::string("int8")) { + diskann::DistanceL2Int8 dist_cmp; + run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, + active_tags_filename, query_bin, gt_bin, &dist_cmp); + } else { + std::cout << "Unsupported type : " << index_type << "\n"; + } + std::cout << "Exiting\n"; +} diff --git a/tests/test_delete_insert_cycles.cpp b/tests/test_delete_insert_cycles.cpp new file mode 100644 index 0000000000..b48a6ad96b --- /dev/null +++ b/tests/test_delete_insert_cycles.cpp @@ -0,0 +1,174 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "tsl/robin_set.h" + +#ifndef _WINDOWS +#include +#include +#include +#endif + +#include "memory_mapper.h" + +template +int build_incremental_index(const std::string& data_path, + const std::string& memory_index_file, + const unsigned L, const unsigned R, + const unsigned C, const unsigned num_rnds, + const float alpha, const std::string& save_path, + const unsigned num_cycles, int fraction, int tags, + int delete_mode) { + diskann::Parameters paras; + paras.Set("L", L); + paras.Set("R", R); + paras.Set("C", C); + paras.Set("alpha", alpha); + paras.Set("num_rnds", num_rnds); + + T* data_load = NULL; + size_t num_points, dim, aligned_dim; + + diskann::load_aligned_bin(data_path.c_str(), data_load, num_points, dim, + aligned_dim); + + typedef int TagT; + + bool eager; + if (delete_mode == 0) { + eager = false; + } else { + eager = true; + } + + diskann::Index index(diskann::L2, dim, num_points, 1, true, eager); + + if (tags == 0) + index.load(memory_index_file.c_str(), data_path.c_str()); + else { + auto tag_path = memory_index_file + ".tags"; + index.load(memory_index_file.c_str(), data_path.c_str(), true, + tag_path.c_str()); + } + + unsigned i = 0; + while (i < num_cycles) { + size_t delete_size = (num_points / 100) * fraction; + tsl::robin_set delete_set; + while (delete_set.size() < delete_size) + delete_set.insert(rand() % num_points); + std::vector delete_vector(delete_set.begin(), delete_set.end()); + diskann::cout << "\nDeleting " << delete_vector.size() << " elements... "; + + { + index.enable_delete(); + if (delete_mode == 0) { // Lazy delete + diskann::Timer del_timer; + std::vector failed_tags; + if (index.lazy_delete(delete_set, failed_tags) < 0) + std::cerr << "Error in delete_points" << std::endl; + if (failed_tags.size() > 0) + std::cerr << "Failed to delete " << failed_tags.size() << " tags" + << std::endl; + diskann::cout << "completed in " << del_timer.elapsed() / 1000000.0 + << "sec.\n" + << "Starting consolidation... " << std::flush; + + diskann::Timer timer; + if (index.disable_delete(paras, true) != 0) { + std::cerr << "Disable delete failed" << std::endl; + return -1; + } + diskann::cout << "completed in " << timer.elapsed() / 1000000.0 + << "sec.\n" + << std::endl; + + } else { // Eager delete + diskann::Timer timer; +#pragma omp parallel for + for (auto iter = delete_vector.begin(); iter < delete_vector.end(); + ++iter) { + if (index.eager_delete(*iter, paras, delete_mode) != 0) + std::cerr << "Delete tag " << *iter << " not found" << std::endl; + } + diskann::cout << "Eager delete time: " << timer.elapsed() / 1000000.0 + << "sec\n"; + if (index.disable_delete(paras, false) != 0) { + std::cerr << "Disable delete failed" << std::endl; + return -1; + } + } + } + + auto save_path_del = save_path + ".del" + std::to_string(i); + index.save(save_path_del.c_str()); + + { + diskann::Timer timer; +#pragma omp parallel for + for (size_t i = 0; i < delete_vector.size(); i++) { + unsigned p = delete_vector[i]; + index.insert_point(data_load + (size_t) p * (size_t) aligned_dim, paras, + p); + } + diskann::cout << "Re-incremental time: " << timer.elapsed() / 1000 + << "ms\n"; + } + + auto save_path_reinc = save_path + ".reinc" + std::to_string(i); + index.save(save_path_reinc.c_str()); + i++; + } + + delete[] data_load; + + return 0; +} + +int main(int argc, char** argv) { + if (argc != 14) { + diskann::cout + << "Correct usage: " << argv[0] + << " type[int8/uint8/float] data_file index_file L R C alpha " + "num_rounds " + << "save_graph_file #cycles " + "#percent_points_deleted_in_each_cycle tags_available?[0/1] " + "delete_mode[0-lazy/1-eager-all/2-eager-selected] " + << std::endl; + exit(-1); + } + + unsigned L = (unsigned) atoi(argv[4]); + unsigned R = (unsigned) atoi(argv[5]); + unsigned C = (unsigned) atoi(argv[6]); + float alpha = (float) std::atof(argv[7]); + unsigned num_rnds = (unsigned) std::atoi(argv[8]); + std::string save_path(argv[9]); + unsigned num_cycles = (unsigned) atoi(argv[10]); + int fraction = (int) atoi(argv[11]); + int tags = (int) atoi(argv[12]); + int delete_mode = (int) atoi(argv[13]); + + if (std::string(argv[1]) == std::string("int8")) + build_incremental_index(argv[2], argv[3], L, R, C, num_rnds, alpha, + save_path, num_cycles, fraction, tags, + delete_mode); + else if (std::string(argv[1]) == std::string("uint8")) + build_incremental_index(argv[2], argv[3], L, R, C, num_rnds, alpha, + save_path, num_cycles, fraction, tags, + delete_mode); + else if (std::string(argv[1]) == std::string("float")) + build_incremental_index(argv[2], argv[3], L, R, C, num_rnds, alpha, + save_path, num_cycles, fraction, tags, + delete_mode); + else + diskann::cout << "Unsupported type. Use float/int8/uint8" << std::endl; +} diff --git a/tests/test_diskpriority_io.cpp b/tests/test_diskpriority_io.cpp new file mode 100644 index 0000000000..be36c57146 --- /dev/null +++ b/tests/test_diskpriority_io.cpp @@ -0,0 +1,106 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include "DiskPriorityIO.h" + +#define NUM_THREADS 4 +#define NUM_CHUNKS 16 + +std::string getTempFileName() { + char tempPath[256]; + char tempFileName[MAX_PATH]; + + GetTempPathA(256, tempPath); + GetTempFileNameA(tempPath, "KNN", 0, tempFileName); + + return std::string(tempFileName); +} + +void saveContents(const char* fileName, char* pBytes, int count) { + std::fstream file; + file.open(fileName, std::ios::binary | std::ios::out); + file.write(pBytes, count); + file.flush(); + file.close(); +} + +void processData(HANDLE evnt, __int8* readVec, + ANNIndex::AsyncReadRequest request, bool result) { + // What do we do here? + std::cout << "Entering callback: " << result << std::endl; + memcpy(readVec + request.m_offset, request.m_buffer, request.m_readSize); + SetEvent(evnt); +} + +int main(int argc, char** argv) { + size_t fileSize = ((size_t) NUM_CHUNKS) * 1024 * 1024; + char* pByte = (char*) malloc(fileSize); + char* readVec = (char*) malloc(fileSize); + memset(readVec, 0, fileSize); + + for (int i = 0; i < fileSize; i++) { + *(pByte + i) = (char) (rand() % 8); + } + std::string s = getTempFileName(); + saveContents(s.c_str(), pByte, fileSize); + std::cout << "Saved file of size " << fileSize << " to " << s << std::endl; + + int batchSize = fileSize / NUM_THREADS; + std::cout << "Sending " << NUM_CHUNKS << " requests per batch. " + << NUM_THREADS << " batches " << std::endl; + + for (int i = 0; i < NUM_THREADS; i++) { + diskann::DiskPriorityIO iohandler( + ANNIndex::DiskIOScenario::DIS_HighPriorityUserRead); + iohandler.Initialize(s.c_str()); + + HANDLE events[NUM_CHUNKS]; + std::vector requests; + requests.reserve(NUM_CHUNKS); + + int chunkSize = batchSize / NUM_CHUNKS; + for (int j = 0; j < NUM_CHUNKS; j++) { + ANNIndex::AsyncReadRequest& request = requests[j]; + request.m_buffer = new __int8[chunkSize]; + memset(request.m_buffer, 0, chunkSize); + request.m_offset = i * batchSize + j * chunkSize; + + assert(request.m_offset + chunkSize <= fileSize); + request.m_readSize = chunkSize; + + auto evnt = CreateEvent(NULL, FALSE, FALSE, NULL); + events[j] = evnt; + + std::function fptr = std::bind( + &processData, evnt, readVec, request, std::placeholders::_1); + request.m_callback = fptr; + + iohandler.ReadFileAsync(request); + } + + WaitForMultipleObjectsEx(NUM_CHUNKS, events, TRUE, INFINITE, TRUE); + + for (auto evnt : events) { + CloseHandle(evnt); + } + iohandler.ShutDown(); + } + + int k = 0; + for (k = 0; k < fileSize; k++) { + if (readVec[k] != pByte[k]) { + std::cerr << "Expected " << pByte[k] << " got " << readVec[k] + << " at index: " << k << std::endl; + break; + } + } + if (k == fileSize - 1) { + std::cout << "Successfully verified read." << std::endl; + } else { + std::cout << "Read verification failed." << std::endl; + } +} diff --git a/tests/test_incr_intf.cpp b/tests/test_incr_intf.cpp new file mode 100644 index 0000000000..e880a6879d --- /dev/null +++ b/tests/test_incr_intf.cpp @@ -0,0 +1,102 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +// Testing insert +#include "index.h" +#include "UTILS.H" +#include "diskann_incr_index.h" + +const std::string IndexParams = + "IndexParams=64 75 1 20 20"; // R, L, SearchMem, IndexMem, ThreadCount +const std::string SearchParams = "SearchParams=14 10 6"; // L, Threads, BW + +template +using IncrIndex = diskann::DiskANNIncrementalIndex; + +template +class InMemoryIndexParallelTest { + public: + InMemoryIndexParallelTest(_u32 maxPoints) : _maxPoints(maxPoints) { + std::random_device device; + std::mt19937 generator(device()); + _pDistribution = + std::make_shared>(0, maxPoints); + } + + private: + _u32 _maxPoints; + tsl::robin_set<_u64> _insertedIds; + std::shared_ptr> _pDistribution; + + void insertThread(T* data, _u32 ndims, IncrIndex& incrIntf) { + for (_u32 i = 0; i < 2 * maxPoints; i++) + } +}; + +template +void insertData(T* data, _u32 startIndex, _u32 endIndex, _u32 ndims, + IncrIndex& incrIntf) { + for (_u32 i = startIndex; i < endIndex; i++) { + incrIntf.AddData((_u64) startIndex * ndims, data + startIndex * ndims); + } +} + +template +std::shared_ptr> initialCreateInMemoryIndex( + T* data, _u32 npts, _u32 ndims, _u32 pointsPerIndex, + const std::string& workingDir) { + std::string parameters = IndexParams + ";" + SearchParams + + ";Placement=INMEMORY;WorkingDir=" + workingDir; + std::shared_ptr> incrIndx = std::make_shared>( + dims, ANNIndex::DT_L2, maxMemIndexPoints, parameters); + +#pragma omp parallel for schedule(dynamic, 1) num_threads(nthreads) + for (int i = 0; i <) +} + +template +void runIncrementalIntfTest(const std::string& basefile, + const std::string& workingDir, + uint32_t maxMemIndexPoints) { + T* data; + size_t npts, ndim; + diskann::load_bin + // The aim of this code is to simply exercise the incremental interface. It + // does not + // attempt to do perf tests, e.t.c beyond a point. The goal is to mimic the + // store + if (argc != 4) { + std::cout << "Usage: " + " " + << std::endl; + } + int argi = 1; + std::string datatype = argv[argi++]; + std::string basefile = argv[argi++]; + std::string workingDir = argv[argi++]; + uint32_t maxMemIndexPoints = (_u32) std::atoi(argv[argi++]); + + if (datatype == "float") { + runIncrementalIntfTest(basefile, workingDir, maxMemIndexPoints); + } else if (datatype == "uint8") { + runIncrementalIntfTest(basefile, workingDir, maxMemIndexPoints); + } else if (datatype == "int8") { + runIncrementalIntfTest(basefile, workingDir, maxMemIndexPoints); + } else { + std::cerr << std::string("Unknown data type: ") << datatype + << ".Only float,uint8,and int8 are supported." << std::endl; + } + return 0; +} diff --git a/tests/test_incr_ramp_up.cpp b/tests/test_incr_ramp_up.cpp new file mode 100644 index 0000000000..7c9d1a3490 --- /dev/null +++ b/tests/test_incr_ramp_up.cpp @@ -0,0 +1,196 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include + +#include "utils.h" + +#ifndef _WINDOWS +#include +#include +#include +#endif + +#include "memory_mapper.h" + +template +int build_incremental_index(const std::string& data_path, const unsigned L, + const unsigned R, const unsigned C, + const unsigned num_rnds, const float alpha, + const std::string& save_path, + const unsigned num_incr, const unsigned num_frozen, + const int del_mode) { + diskann::Parameters paras; + paras.Set("L", L); + paras.Set("R", R); + paras.Set("C", C); + paras.Set("alpha", alpha); + paras.Set("num_rnds", num_rnds); + + T* data_load = NULL; + size_t num_points, dim, aligned_dim; + + diskann::load_aligned_bin(data_path.c_str(), data_load, num_points, dim, + aligned_dim); + + typedef int TagT; + + diskann::Index index(diskann::L2, dim, num_points, num_frozen, true, + true); + diskann::cout << "num_points = " << num_points; + { + std::vector tags(num_points - num_incr); + std::iota(tags.begin(), tags.end(), 0); + + diskann::Timer timer; + index.build(data_path.c_str(), num_points - num_incr, paras, tags); + diskann::cout << "Index build time: " << timer.elapsed() / 1000 << "ms\n"; + } + + unsigned insert_size = (num_points / 100) * 2; + unsigned rounds = 100 / 2; + + tsl::robin_set insert_list; + tsl::robin_set delete_list; + tsl::robin_set used_tags; + tsl::robin_set inserted_tags; + tsl::robin_set deleted_tags; + unsigned num_curr_pts = num_points - num_incr + num_frozen; + + for (unsigned i = 0; i < rounds; i++) { + diskann::cout << i << std::endl << std::endl; + /*___________________________Insertion____________________*/ + + while (insert_list.size() < insert_size) { + insert_list.insert(rand() % num_points); + } + unsigned tag_p; + size_t res = used_tags.size(); + while (used_tags.size() < res + insert_size) { + tag_p = rand() % num_points + 1; + size_t temp = used_tags.size(); + used_tags.insert(tag_p); + if (used_tags.size() > temp) + inserted_tags.insert(tag_p); + } + diskann::cout << "Inserting " << insert_size << " points" << std::endl; + tsl::robin_set::iterator it = inserted_tags.begin(); + diskann::Timer insert_timer; + for (auto p : insert_list) { + index.insert_point(data_load + p * aligned_dim, paras, *it); + it++; + } + diskann::cout << "Insertion time " << insert_timer.elapsed() / 1000 + << "ms\n"; + + auto save_path_inc = + save_path + ".inc" + std::to_string(i); // 10 -denotes that 10% of base + // points are being inserted at + // a time + index.save(save_path_inc.c_str()); + + num_curr_pts += insert_size; + diskann::cout << "Number of points in the index post insertion " + << num_curr_pts << std::endl; + insert_list.clear(); + + /*_________________________Deleting points___________________________*/ + + unsigned delete_size = (unsigned) (num_curr_pts / 10); + while (deleted_tags.size() < delete_size) { + auto r = rand() % used_tags.size(); + tsl::robin_set::iterator iter = used_tags.begin(); + for (unsigned j = 0; j < r; j++) + iter++; + size_t res = delete_list.size(); + delete_list.insert(*iter); + if (delete_list.size() > res) + deleted_tags.insert(*iter); + } + diskann::cout << "Deleting " << delete_size << " points from the index" + << std::endl; + + index.enable_delete(); + for (auto p : deleted_tags) { + if (del_mode == 0) { + if (index.eager_delete(p, paras) != 0) { + std::cerr << "Delete tag " << p << " not found" << std::endl; + } else + used_tags.erase(p); + } else { + if (index.lazy_delete(p) != 0) + std::cerr << "Delete tag" << p << "not found" << std::endl; + else + used_tags.erase(p); + } + } + if (index.disable_delete(paras, true) != 0) { + std::cerr << "Disable delete failed" << std::endl; + return -1; + } + diskann::cout << "Delete time in this phase " << del_timer.elapsed() / 1000 + << "ms\n"; + deleted_tags.clear(); + inserted_tags.clear(); + + auto save_path_del = save_path + ".del" + std::to_string(i); + index.save(save_path_del.c_str()); + + num_curr_pts -= delete_size; + diskann::cout << "Number of points in the graph currently = " + << num_curr_pts << std::endl; + } + + { + diskann::Timer timer; + for (size_t i = num_points - num_incr; i < num_points; ++i) { + index.insert_point(data_load + i * aligned_dim, paras, i); + } + diskann::cout << "Incremental time: " << timer.elapsed() / 1000 << "ms\n"; + auto save_path_inc = save_path + ".inc"; + index.save(save_path_inc.c_str()); + } + + delete[] data_load; + + return 0; +} + +int main(int argc, char** argv) { + if (argc != 12) { + diskann::cout << "Correct usage: " << argv[0] + << " type[int8/uint8/float] data_file L R C alpha " + "num_rounds " + << "save_graph_file #incr_points #frozen_points " + "delete_mode[0-eager/1-lazy]" + << std::endl; + exit(-1); + } + + unsigned L = (unsigned) atoi(argv[3]); + unsigned R = (unsigned) atoi(argv[4]); + unsigned C = (unsigned) atoi(argv[5]); + float alpha = (float) std::atof(argv[6]); + unsigned num_rnds = (unsigned) std::atoi(argv[7]); + std::string save_path(argv[8]); + unsigned num_incr = (unsigned) atoi(argv[9]); + unsigned num_frozen = (unsigned) atoi(argv[10]); + int del_mode = (int) atoi(argv[11]); + + if (std::string(argv[1]) == std::string("int8")) + build_incremental_index(argv[2], L, R, C, num_rnds, alpha, + save_path, num_incr, num_frozen, del_mode); + else if (std::string(argv[1]) == std::string("uint8")) + build_incremental_index(argv[2], L, R, C, num_rnds, alpha, + save_path, num_incr, num_frozen, del_mode); + else if (std::string(argv[1]) == std::string("float")) + build_incremental_index(argv[2], L, R, C, num_rnds, alpha, save_path, + num_incr, num_frozen, del_mode); + else + diskann::cout << "Unsupported type. Use float/int8/uint8" << std::endl; +} diff --git a/tests/test_incremental_index.cpp b/tests/test_incremental_index.cpp index 8b98233b28..f92dd175d1 100644 --- a/tests/test_incremental_index.cpp +++ b/tests/test_incremental_index.cpp @@ -18,104 +18,92 @@ #include "memory_mapper.h" -int main(int argc, char** argv) { - if (argc != 10) { - std::cout << "Correct usage: " << argv[0] - << " data_file L R C alpha num_rounds " - << "save_graph_file #incr_points #frozen_points" << std::endl; - exit(-1); - } - - float* data_load = NULL; - size_t num_points, dim, aligned_dim; - - diskann::load_aligned_bin(argv[1], data_load, num_points, dim, - aligned_dim); - - unsigned L = (unsigned) atoi(argv[2]); - unsigned R = (unsigned) atoi(argv[3]); - unsigned C = (unsigned) atoi(argv[4]); - float alpha = (float) std::atof(argv[5]); - unsigned num_rnds = (unsigned) std::atoi(argv[6]); - std::string save_path(argv[7]); - unsigned num_incr = (unsigned) atoi(argv[8]); - unsigned num_frozen = (unsigned) atoi(argv[9]); - +template +int build_incremental_index(const std::string& data_path, const unsigned L, + const unsigned R, const float alpha, + const std::string& save_path, + const unsigned num_incr) { diskann::Parameters paras; paras.Set("L", L); paras.Set("R", R); - paras.Set("C", C); + paras.Set("C", 750); paras.Set("alpha", alpha); paras.Set("saturate_graph", false); - paras.Set("num_rnds", num_rnds); + paras.Set("num_rnds", 2); + + T* data_load = NULL; + size_t num_points, dim, aligned_dim; + + diskann::load_aligned_bin(data_path.c_str(), data_load, num_points, dim, + aligned_dim); - typedef int TagT; - diskann::Index index(diskann::L2, argv[1], num_points, - num_points - num_incr, num_frozen, true, - true, true); + typedef uint32_t TagT; + + diskann::Index index(diskann::L2, dim, num_points, true, + false, // single file index + true); { std::vector tags(num_points - num_incr); std::iota(tags.begin(), tags.end(), 0); - if (argc > 10) { - std::string frozen_points_file(argv[10]); - index.generate_random_frozen_points(frozen_points_file.c_str()); - } else - index.generate_random_frozen_points(); - diskann::Timer timer; - index.build(paras, tags); - std::cout << "Index build time: " << timer.elapsed() / 1000 << "ms\n"; + index.build(data_path.c_str(), num_points - num_incr, paras, tags); + diskann::cout << "Index build time: " << timer.elapsed() / 1000 << "ms\n"; + index.save(save_path.c_str()); } - std::vector pool, tmp; - tsl::robin_set visited; - std::vector cut_graph; - index.readjust_data(num_frozen); - { diskann::Timer timer; - for (size_t i = num_points - num_incr; i < num_points; ++i) { - index.insert_point(data_load + i * aligned_dim, paras, pool, tmp, visited, - cut_graph, i); +#pragma omp parallel for + for (_s64 i = num_points - num_incr; i < (_s64) num_points; ++i) { + index.insert_point(data_load + i * aligned_dim, paras, (TagT) i); } - std::cout << "Incremental time: " << timer.elapsed() / 1000 << "ms\n"; + diskann::cout << "Incremental time: " << timer.elapsed() / 1000 << "ms\n"; auto save_path_inc = save_path + ".inc"; index.save(save_path_inc.c_str()); } tsl::robin_set delete_list; while (delete_list.size() < num_incr) - delete_list.insert(rand() % num_points); - std::cout << "Deleting " << delete_list.size() << " elements" << std::endl; + delete_list.insert((uint32_t)(rand() % num_points)); + diskann::cout << "Deleting " << delete_list.size() << " elements" + << std::endl; + std::vector delete_vector; + for (auto p : delete_list) { + delete_vector.emplace_back(p); + } + diskann::cout << "Size of delete_vector : " << delete_vector.size() + << std::endl; { - diskann::Timer timer; index.enable_delete(); - for (auto p : delete_list) - - if (index.eager_delete(p, paras) != 0) - // if (index.delete_point(p) != 0) + for (size_t i = 0; i < delete_vector.size(); i++) { + unsigned p = delete_vector[i]; + if (index.lazy_delete(p) != 0) std::cerr << "Delete tag " << p << " not found" << std::endl; - - if (index.disable_delete(paras, true) != 0) { - std::cerr << "Disable delete failed" << std::endl; - return -1; } - std::cout << "Delete time: " << timer.elapsed() / 1000 << "ms\n"; } - auto save_path_del = save_path + ".del"; + auto save_path_del = save_path + ".delete"; index.save(save_path_del.c_str()); + index.load(save_path_del.c_str()); + index.consolidate(paras); - index.readjust_data(num_frozen); { + index.reposition_frozen_point_to_end(); + std::vector<_u32> reinsert_vec; + for (auto p : delete_list) + reinsert_vec.emplace_back(p); + diskann::Timer timer; - for (auto p : delete_list) { - index.insert_point(data_load + (size_t) p * (size_t) aligned_dim, paras, - pool, tmp, visited, cut_graph, p); +#pragma omp parallel for + for (_s64 p = 0; p < (_s64) reinsert_vec.size(); p++) { + index.insert_point( + data_load + (size_t)(reinsert_vec[p]) * (size_t) aligned_dim, paras, + (reinsert_vec[p])); } - std::cout << "Re-incremental time: " << timer.elapsed() / 1000 << "ms\n"; + diskann::cout << "Re-incremental time: " << timer.elapsed() / 1000 + << "ms\n"; } auto save_path_reinc = save_path + ".reinc"; @@ -125,3 +113,27 @@ int main(int argc, char** argv) { return 0; } + +int main(int argc, char** argv) { + if (argc != 8) { + diskann::cout << "Correct usage: " << argv[0] + << " type[int8/uint8/float] data_file L R alpha " + << "save_graph_file #incr_points " << std::endl; + exit(-1); + } + + unsigned L = (unsigned) atoi(argv[3]); + unsigned R = (unsigned) atoi(argv[4]); + float alpha = (float) std::atof(argv[5]); + std::string save_path(argv[6]); + unsigned num_incr = (unsigned) atoi(argv[7]); + + if (std::string(argv[1]) == std::string("int8")) + build_incremental_index(argv[2], L, R, alpha, save_path, num_incr); + else if (std::string(argv[1]) == std::string("uint8")) + build_incremental_index(argv[2], L, R, alpha, save_path, num_incr); + else if (std::string(argv[1]) == std::string("float")) + build_incremental_index(argv[2], L, R, alpha, save_path, num_incr); + else + diskann::cout << "Unsupported type. Use float/int8/uint8" << std::endl; +} diff --git a/tests/test_index_merger.cpp b/tests/test_index_merger.cpp new file mode 100644 index 0000000000..a928806b2f --- /dev/null +++ b/tests/test_index_merger.cpp @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "v2/index_merger.h" + +#include +#include +#include +#include +#include +#include + +#include "aux_utils.h" +#include "utils.h" + +#ifndef _WINDOWS +#include +#include +#include +#endif + +template +void run(const char* disk_in, const std::vector& mem_in, + const char* disk_out, const char* deleted_tags, const uint32_t ndims, + diskann::Distance* dist, const uint32_t beam_width, + const uint32_t range, const uint32_t l_index, const float alpha, + const uint32_t maxc) { + diskann::cout << "Instantiating StreamingMerger\n"; + diskann::StreamingMerger merger(disk_in, mem_in, disk_out, deleted_tags, + ndims, dist, beam_width, range, l_index, + alpha, maxc); + + diskann::cout << "Starting merge\n"; + merger.merge(); + + diskann::cout << "Finished merging\n"; +} + +int main(int argc, char** argv) { + if (argc < 13) { + diskann::cout + << "Correct usage: " << argv[0] + << " " + << " " + " .." + << std::endl; + exit(-1); + } + diskann::cout.setf(std::ios::unitbuf); + + int arg_no = 1; + std::string index_type = argv[arg_no++]; + // assert(index_type == std::string("float")); + const char* disk_in = argv[arg_no++]; + diskann::cout << "Input SSD-DiskANN: " << disk_in << "\n"; + const char* disk_out = argv[arg_no++]; + diskann::cout << "Output SSD-DiskANN: " << disk_out << "\n"; + const char* delete_list_file = argv[arg_no++]; + diskann::cout << "Deleted tags file : " << delete_list_file << "\n"; + uint32_t data_dim = (uint32_t) atoi(argv[arg_no++]); + diskann::cout << "Data dim : " << data_dim << "\n"; + uint32_t beam_width = (uint32_t) atoi(argv[arg_no++]); + diskann::cout << "Beam Width : " << beam_width << "\n"; + uint32_t range = (uint32_t) atoi(argv[arg_no++]); + diskann::cout << "Range (max out-degree) : " << range << "\n"; + uint32_t L_index = (uint32_t) atoi(argv[arg_no++]); + diskann::cout << "L-index : " << L_index << "\n"; + float alpha = (float) atof(argv[arg_no++]); + diskann::cout << "alpha : " << alpha << "\n"; + uint32_t maxc = (uint32_t) atoi(argv[arg_no++]); + diskann::cout << "max-C : " << maxc << "\n"; + TMP_FOLDER = argv[arg_no++]; + diskann::cout << "Working folder : " << TMP_FOLDER << "\n"; + std::vector mem_in; + while (arg_no < argc) { + const char* cur_mem_in = argv[arg_no++]; + diskann::cout << "Mem-DiskANN index #" << mem_in.size() + 1 << " : " + << cur_mem_in << "\n"; + mem_in.emplace_back(cur_mem_in); + } + + if (index_type == std::string("float")) { + diskann::DistanceL2 dist_cmp; + run(disk_in, mem_in, disk_out, delete_list_file, data_dim, &dist_cmp, + beam_width, range, L_index, alpha, maxc); + } else if (index_type == std::string("uint8")) { + diskann::DistanceL2UInt8 dist_cmp; + run(disk_in, mem_in, disk_out, delete_list_file, data_dim, + &dist_cmp, beam_width, range, L_index, alpha, maxc); + } else if (index_type == std::string("int8")) { + diskann::DistanceL2Int8 dist_cmp; + run(disk_in, mem_in, disk_out, delete_list_file, data_dim, + &dist_cmp, beam_width, range, L_index, alpha, maxc); + } else { + diskann::cout << "Unsupported type : " << index_type << "\n"; + } + diskann::cout << "Exiting\n"; +} diff --git a/tests/test_index_merger_steady_state.cpp b/tests/test_index_merger_steady_state.cpp new file mode 100644 index 0000000000..3157a635a5 --- /dev/null +++ b/tests/test_index_merger_steady_state.cpp @@ -0,0 +1,549 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "v2/index_merger.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "aux_utils.h" +#include "utils.h" + +#ifndef _WINDOWS +#include +#include +#include +#else +#include "bing_aligned_file_reader.h" +#endif + +#ifdef USE_TCMALLOC +#include +#endif + +// random number generator +std::random_device dev; +std::mt19937 rng(dev()); + +std::vector Lvec; +tsl::robin_map params; +float mem_alpha, merge_alpha; +uint32_t medoid_id = std::numeric_limits::max(); +bool save_index_as_one_file; +std::string TMP_FOLDER; + +template +void seed_iter(tsl::robin_set &active_set, + tsl::robin_set &inactive_set, T *all_points, + const std::string &inserted_points_file, + const std::string &inserted_tags_file, + const std::string &deleted_tags_file) { + const uint32_t insert_count = params[std::string("insert_count")]; + const uint32_t delete_count = params[std::string("delete_count")]; + const uint32_t ndims = params[std::string("ndims")]; + diskann::cout << "ITER: start = " << active_set.size() << ", " + << inactive_set.size() << "\n"; + + // pick `delete_count` tags + std::vector active_vec(active_set.begin(), active_set.end()); + std::shuffle(active_vec.begin(), active_vec.end(), rng); + std::vector delete_vec; + if (active_vec.size() < delete_count) + delete_vec.insert(delete_vec.end(), active_vec.begin(), active_vec.end()); + else + delete_vec.insert(delete_vec.end(), active_vec.begin(), + active_vec.begin() + delete_count); + // assert(delete_vec.size() == delete_count); + active_set.clear(); + active_set.insert(active_vec.begin() + delete_vec.size(), active_vec.end()); + diskann::cout << "ITER: DELETE - " << delete_vec.size() << " IDs in " + << deleted_tags_file << "\n"; + TagT *del_tags = new TagT[delete_vec.size()]; + for (size_t i = 0; i < delete_vec.size(); i++) + *(del_tags + i) = delete_vec[i]; + diskann::save_bin(deleted_tags_file, del_tags, delete_vec.size(), 1); + delete[] del_tags; + /* std::ofstream deleted_tags_writer(deleted_tags_file, std::ios::trunc); + for (auto &id : delete_vec) { + deleted_tags_writer << id << std::endl; + } + deleted_tags_writer.close(); */ + // pick `insert_count` tags + std::vector inactive_vec(inactive_set.begin(), inactive_set.end()); + std::shuffle(inactive_vec.begin(), inactive_vec.end(), rng); + std::vector insert_vec; + if (inactive_vec.size() < insert_count) + insert_vec.insert(insert_vec.end(), inactive_vec.begin(), + inactive_vec.end()); + else + insert_vec.insert(insert_vec.end(), inactive_vec.begin(), + inactive_vec.begin() + insert_count); + inactive_set.clear(); + diskann::cout << "ITER: INSERT - " << insert_vec.size() << " IDs in " + << inserted_tags_file << "\n"; + inactive_set.insert(inactive_vec.begin() + insert_vec.size(), + inactive_vec.end()); + std::sort(insert_vec.begin(), insert_vec.end()); + TagT *ins_tags = new TagT[insert_vec.size()]; + for (size_t i = 0; i < insert_vec.size(); i++) + *(ins_tags + i) = insert_vec[i]; + diskann::save_bin(inserted_tags_file, ins_tags, insert_vec.size(), 1); + delete[] ins_tags; + /* std::ofstream inserted_tags_writer(inserted_tags_file, std::ios::trunc); + for (auto &id : insert_vec) { + inserted_tags_writer << id << std::endl; + } + inserted_tags_writer.close(); + */ + std::ofstream inserted_points_writer(inserted_points_file, std::ios::binary); + T *new_pts = new T[(uint64_t) insert_vec.size() * (uint64_t) ndims]; + for (uint64_t idx = 0; idx < insert_vec.size(); idx++) { + uint32_t actual_idx = insert_vec[idx]; + T * src_ptr = all_points + actual_idx * (uint64_t) ndims; + T * dest_ptr = new_pts + idx * (uint64_t) ndims; + std::memcpy(dest_ptr, src_ptr, ndims * sizeof(T)); + } + uint32_t npts_u32 = (uint32_t) insert_vec.size(); + uint32_t ndims_u32 = ndims; + inserted_points_writer.write((char *) &npts_u32, sizeof(uint32_t)); + inserted_points_writer.write((char *) &ndims_u32, sizeof(uint32_t)); + inserted_points_writer.write( + (char *) new_pts, + (uint64_t) insert_vec.size() * (uint64_t) ndims * sizeof(T)); + inserted_points_writer.close(); + delete[] new_pts; + + // balance tags + inactive_set.insert(delete_vec.begin(), delete_vec.end()); + active_set.insert(insert_vec.begin(), insert_vec.end()); + diskann::cout << "ITER: end = " << active_set.size() << ", " + << inactive_set.size() << "\n"; + +#ifndef _WINDOWS + malloc_stats(); +#endif +} + +float compute_active_recall(const uint32_t *result_tags, + const uint32_t result_count, + const uint32_t *gs_tags, const uint64_t gs_count, + const tsl::robin_set &inactive_set) { + tsl::robin_set active_gs; + for (uint32_t i = 0; i < gs_count && active_gs.size() < result_count; i++) { + auto iter = inactive_set.find(gs_tags[i]); + if (iter == inactive_set.end()) { + active_gs.insert(gs_tags[i]); + } + } + uint32_t match = 0; + for (uint32_t i = 0; i < result_count; i++) { + match += (active_gs.find(result_tags[i]) != active_gs.end()); + } + return ((float) match / (float) result_count) * 100; +} + +// borrowed from tests/search_disk_index.cpp +template +void search_disk_index(const std::string & index_prefix_path, + const tsl::robin_set &active_tags, + const std::string & query_path, + const std::string & gs_path) { + std::string pq_prefix = index_prefix_path + "_pq"; + std::string disk_index_file = index_prefix_path + "_disk.index"; + std::string warmup_query_file = index_prefix_path + "_sample_data.bin"; + // uint64_t num_nodes_to_cache = + // params[std::string("disk_search_node_cache_count")]; + uint32_t num_threads = params[std::string("disk_search_nthreads")]; + uint32_t beamwidth = params[std::string("beam_width")]; + std::string query_bin = query_path; + std::string truthset_bin = gs_path; + uint64_t recall_at = params[std::string("recall_k")]; + // uint64_t search_L = params[std::string("search_L")]; + + // hold data + T * query = nullptr; + unsigned *gt_ids = nullptr; + uint32_t *gt_tags = nullptr; + float * gt_dists = nullptr; + size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; + + // load query + truthset + diskann::load_aligned_bin(query_bin, query, query_num, query_dim, + query_aligned_dim); + diskann::cout << "Loaded query file" << std::endl; + diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim); + diskann::cout << "Loaded truthset" << std::endl; + if (gt_num != query_num) { + diskann::cout + << "Error. Mismatch in number of queries and ground truth data" + << std::endl; + } + +#ifdef _WINDOWS + std::shared_ptr reader( + new diskann::BingAlignedFileReader()); +#else + std::shared_ptr reader(new LinuxAlignedFileReader()); +#endif + + // TODO: Change Metric + std::unique_ptr> pFlashIndex = + std::make_unique>( + diskann::Metric::L2, reader, ::save_index_as_one_file, true); + int res = pFlashIndex->load(index_prefix_path.c_str(), num_threads); + if (res != 0) { + std::cerr << "Failed to load index.\n"; + exit(-1); + } + + diskann::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); + diskann::cout.precision(2); + + std::string recall_string = "Recall@" + std::to_string(recall_at); + diskann::cout << std::setw(6) << "L" << std::setw(12) << "QPS" + << std::setw(16) << "Mean Latency" << std::setw(16) + << "90 Latency" << std::setw(16) << "95 Latency" + << std::setw(16) << "99 Latency" << std::setw(16) + << "99.9 Latency" << std::setw(16) << "Mean IOs" + << std::setw(16) << recall_string << std::setw(16) << "CPU (s)" + << std::endl; + // prep for search + std::vector query_result_tags; + std::vector query_result_dists; + query_result_dists.resize(recall_at * query_num); + query_result_tags.resize(recall_at * query_num); + + for (size_t test_id = 0; test_id < ::Lvec.size(); test_id++) { + diskann::QueryStats *stats = new diskann::QueryStats[query_num]; + uint32_t L = Lvec[test_id]; + auto s = std::chrono::high_resolution_clock::now(); +#pragma omp parallel for schedule(dynamic, 1) // num_threads(1) + for (_s64 i = 0; i < (int64_t) query_num; i++) { + int res_count = pFlashIndex->cached_beam_search( + query + (i * query_aligned_dim), recall_at, L, + query_result_tags.data() + (i * recall_at), + query_result_dists.data() + (i * recall_at), beamwidth, stats + i); + } + + auto e = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = e - s; + float qps = (float) ((1.0 * (double) query_num) / (1.0 * diff.count())); + // compute mean recall, IOs + double mean_recall = 0.0; + mean_recall = diskann::calculate_recall( + (unsigned) query_num, gt_ids, gt_dists, (unsigned) gt_dim, + query_result_tags.data(), (unsigned) recall_at, (unsigned) recall_at, + active_tags); + float mean_latency = (float) diskann::get_mean_stats( + stats, query_num, + [](const diskann::QueryStats &stats) { return stats.total_us; }); + + float latency_90 = (float) diskann::get_percentile_stats( + stats, query_num, (float) 0.900, + [](const diskann::QueryStats &stats) { return stats.total_us; }); + + float latency_95 = (float) diskann::get_percentile_stats( + stats, query_num, (float) 0.950, + [](const diskann::QueryStats &stats) { return stats.total_us; }); + + float latency_99 = (float) diskann::get_percentile_stats( + stats, query_num, (float) 0.990, + [](const diskann::QueryStats &stats) { return stats.total_us; }); + + float latency_999 = (float) diskann::get_percentile_stats( + stats, query_num, (float) 0.999, + [](const diskann::QueryStats &stats) { return stats.total_us; }); + + float mean_ios = (float) diskann::get_mean_stats( + stats, query_num, + [](const diskann::QueryStats &stats) { return stats.n_ios; }); + + float mean_cpuus = (float) diskann::get_mean_stats( + stats, query_num, + [](const diskann::QueryStats &stats) { return stats.cpu_us; }); + diskann::cout << std::setw(6) << L << std::setw(12) << qps << std::setw(16) + << mean_latency << std::setw(16) << latency_90 + << std::setw(16) << latency_95 << std::setw(16) << latency_99 + << std::setw(16) << latency_999 << std::setw(16) << mean_ios + << std::setw(16) << mean_recall << std::setw(16) << mean_cpuus + << std::endl; + delete[] stats; + } + diskann::aligned_free(query); + delete[] gt_ids; + delete[] gt_dists; + delete[] gt_tags; +} + +// borrowed from tests/build_memory_index.cpp +template +void build_in_memory_index(const std::string &data_path, + const std::string &save_path, + const std::string &tag_path) { + const uint32_t R = params[std::string("range")]; + const uint32_t L = params[std::string("mem_l_index")]; + const float alpha = ::mem_alpha; + const uint32_t num_threads = params[std::string("mem_nthreads")]; + + diskann::Parameters paras; + paras.Set("R", R); + paras.Set("L", L); + // maximum candidate set size during pruning procedure + paras.Set("C", 750); + paras.Set("alpha", alpha); + paras.Set("saturate_graph", 0); + paras.Set("num_threads", num_threads); + + _u64 data_num, data_dim; + diskann::get_bin_metadata(data_path, data_num, data_dim); + diskann::Index index(diskann::L2, data_dim, data_num, true, true, true, + false); + auto s = std::chrono::high_resolution_clock::now(); + index.build(data_path.c_str(), data_num, paras, tag_path.c_str()); + std::chrono::duration diff = + std::chrono::high_resolution_clock::now() - s; + + diskann::cout << "Indexing time: " << diff.count() << "\n"; + index.save(save_path.c_str()); +} + +// borrowed from tests/test_index_merger.cpp +template +void run_index_merger(const char * disk_in, + const std::vector &mem_in, + const char *disk_out, const char *deleted_tags, + diskann::Distance *dist) { + const uint32_t ndims = params[std::string("ndims")]; + const uint32_t beam_width = params[std::string("beam_width")]; + const uint32_t maxc = params[std::string("merge_maxc")]; + const float alpha = ::merge_alpha; + const uint32_t l_index = params[std::string("merge_l_index")]; + const uint32_t range = params[std::string("range")]; + diskann::cout << "ITER: MERGE " << disk_in << " + " << mem_in[0] << " -> " + << disk_out << "\n"; + + diskann::cout << "Instantiating StreamingMerger\n"; + diskann::Metric metric = diskann::Metric::L2; + diskann::StreamingMerger merger(ndims, dist, metric, beam_width, + range, l_index, alpha, maxc, + ::save_index_as_one_file); + diskann::cout << "Starting merge\n"; + const std::string working_folder = TMP_FOLDER; + // merger.merge(disk_in, mem_in, disk_out, deleted_tags, working_folder); + + diskann::cout << "Finished merging\n"; +} + +template +void run_iter(const std::string &base_prefix, const std::string &merge_prefix, + const std::string &mem_prefix, const std::string &deleted_tags, + tsl::robin_set &active_set, + tsl::robin_set &inactive_set, + const std::string &query_file, const std::string &gs_file, + T *data, diskann::Distance *dist_cmp) { + // uint64_t initial_count = active_set.size() + inactive_set.size(); + // files for mem-DiskANN + std::string mem_pts_file = mem_prefix + ".index.data"; + std::string mem_index_file = mem_prefix + ".index"; + std::string mem_tags_file = mem_prefix + ".index.tags"; + + diskann::cout << "ITER: Seeding iteration" + << "\n"; + + // seed the iteration + seed_iter(active_set, inactive_set, data, mem_pts_file, mem_tags_file, + deleted_tags); + + // assert(active_set.size() + inactive_set.size() == initial_count); + + diskann::cout << "ITER: Building memory index for inserted points" + << "\n"; + // build in-memory index + build_in_memory_index(mem_pts_file, mem_index_file, mem_tags_file); + + // run merge + std::vector mem_in; + mem_in.push_back(mem_index_file); + diskann::cout << "ITER: Folding mem-DiskANN into SSD-DiskANN" << std::endl; + + run_index_merger(base_prefix.c_str(), mem_in, merge_prefix.c_str(), + deleted_tags.c_str(), dist_cmp); + + // search PQ Flash Index + diskann::cout << "ITER: Searching SSD-DiskANN" << std::endl; + search_disk_index(merge_prefix, active_set, query_file, gs_file); +} + +template +void run_all_iters(const std::string &base_prefix, + const std::string &merge_prefix, + const std::string &mem_prefix, + const std::string &deleted_tags, + const std::string &data_file, + const std::string &active_tags_file, + const std::string &query_file, const std::string &gs_file, + diskann::Distance *dist_cmp, const uint32_t n_iters) { + // load all data points + std::unique_ptr data; + uint64_t npts = 0, ndims = 0; + diskann::load_bin(data_file, data, npts, ndims); + params[std::string("ndims")] = (uint32_t) ndims; + + // load active tags + size_t tags_pts, tags_dim; + TagT * active_tags_data; + + if (::save_index_as_one_file) { + uint64_t *metadata; + size_t nr, nc; + diskann::load_bin(active_tags_file, metadata, nr, nc); + diskann::load_bin(active_tags_file, active_tags_data, tags_pts, + tags_dim, metadata[7]); + } else { + diskann::load_bin(active_tags_file, active_tags_data, tags_pts, + tags_dim); + } + + diskann::cout << "Tag dim = " << tags_dim << ", Tags pts = " << tags_pts + << std::endl; + tsl::robin_set active_tags; + for (size_t i = 0; i < tags_pts; i++) + active_tags.insert(*(active_tags_data + i)); + + // read medoid ID from base_prefix + std::ifstream disk_reader(base_prefix + "_disk.index", std::ios::binary); + disk_reader.seekg(2 * sizeof(uint32_t), std::ios::beg); + disk_reader.seekg(2 * sizeof(uint64_t), std::ios::cur); + uint64_t medoid = std::numeric_limits::max(); + disk_reader.read((char *) &medoid, sizeof(uint64_t)); + diskann::cout << "Detected medoid = " << medoid + << " ==> excluding from insert/deletes.\n"; + ::medoid_id = (uint32_t) medoid; + + // generate inactive tags + tsl::robin_set inactive_tags; + for (uint32_t i = 0; i < npts; i++) { + auto iter = active_tags.find(i); + if (iter == active_tags.end()) { + inactive_tags.insert(i); + } + } + + // remove medoid from active_set + active_tags.erase((uint32_t)::medoid_id); + + diskann::cout << "Searching before any iterations" << std::endl; + search_disk_index(base_prefix, active_tags, query_file, gs_file); +#ifdef USE_TCMALLOC + MallocExtension::instance()->ReleaseFreeMemory(); +#endif + for (uint32_t i = 0; i < n_iters; i++) { + diskann::cout << "ITER: Iteration #" << i + 1 << "\n"; + std::string base, merge; + if (i % 2 == 0) { + base = base_prefix; + merge = merge_prefix; + } else { + base = merge_prefix; + merge = base_prefix; + } + + run_iter(base, merge, mem_prefix, deleted_tags, active_tags, + inactive_tags, query_file, gs_file, data.get(), dist_cmp); +#ifdef USE_TCMALLOC + MallocExtension::instance()->ReleaseFreeMemory(); +#endif + } +} + +int main(int argc, char **argv) { + if (argc < 17) { + diskann::cout + << "Correct usage: " << argv[0] + << " " + " " + << " " + " " + << " " + " ..." + << "\n WARNING: Other parameters set inside CPP source." << std::endl; + exit(-1); + } + diskann::cout.setf(std::ios::unitbuf); + + std::cout << "Press any key to continue" << std::endl; + char x; + std::cin >> x; + + int arg_no = 1; + std::string index_type = argv[arg_no++]; + ::TMP_FOLDER = argv[arg_no++]; + // assert(index_type == std::string("float")); + std::string base_prefix(argv[arg_no++]); + std::string merge_prefix(argv[arg_no++]); + std::string mem_prefix(argv[arg_no++]); + std::string deleted_tags_file(argv[arg_no++]); + std::string data_bin(argv[arg_no++]); + int single_file = atoi(argv[arg_no++]); + std::string query_bin(argv[arg_no++]); + std::string gt_bin(argv[arg_no++]); + uint32_t n_iters = (uint32_t) atoi(argv[arg_no++]); + uint32_t insert_count = (uint32_t) atoi(argv[arg_no++]); + uint32_t delete_count = (uint32_t) atoi(argv[arg_no++]); + uint32_t range = (uint32_t) atoi(argv[arg_no++]); + uint32_t recall_k = (uint32_t) atoi(argv[arg_no++]); + + for (int ctr = arg_no; ctr < argc; ctr++) { + _u32 curL = std::atoi(argv[ctr]); + if (curL >= recall_k) + ::Lvec.push_back(curL); + } + params[std::string("insert_count")] = insert_count; + params[std::string("delete_count")] = delete_count; + params[std::string("range")] = range; + params[std::string("recall_k")] = recall_k; + // params[std::string("search_L")] = search_L; + + // hard-coded params + params[std::string("disk_search_node_cache_count")] = 2000; + params[std::string("disk_search_nthreads")] = 20; + params[std::string("beam_width")] = 4; + params[std::string("mem_l_index")] = 75; + mem_alpha = (float) 1.2; + merge_alpha = (float) 1.2; + params[std::string("mem_nthreads")] = 20; + params[std::string("merge_maxc")] = (uint32_t)(range * 2.5); + params[std::string("merge_l_index")] = 75; + + ::save_index_as_one_file = (bool) single_file; + std::string active_tags_filename; + if (single_file) + active_tags_filename = base_prefix + "_disk.index"; + else + active_tags_filename = base_prefix + "_disk.index.tags"; + + if (index_type == std::string("float")) { + diskann::DistanceL2 dist_cmp; + run_all_iters(base_prefix, merge_prefix, mem_prefix, + deleted_tags_file, data_bin, active_tags_filename, + query_bin, gt_bin, &dist_cmp, n_iters); + } else if (index_type == std::string("uint8")) { + diskann::DistanceL2UInt8 dist_cmp; + run_all_iters(base_prefix, merge_prefix, mem_prefix, + deleted_tags_file, data_bin, active_tags_filename, + query_bin, gt_bin, &dist_cmp, n_iters); + } else if (index_type == std::string("int8")) { + diskann::DistanceL2Int8 dist_cmp; + run_all_iters(base_prefix, merge_prefix, mem_prefix, + deleted_tags_file, data_bin, active_tags_filename, + query_bin, gt_bin, &dist_cmp, n_iters); + } else { + diskann::cout << "Unsupported type : " << index_type << "\n"; + } + diskann::cout << "Exiting\n"; +} diff --git a/tests/test_merge_insert.cpp b/tests/test_merge_insert.cpp new file mode 100644 index 0000000000..2b95ab27da --- /dev/null +++ b/tests/test_merge_insert.cpp @@ -0,0 +1,625 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "v2/index_merger.h" +#include "v2/merge_insert.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "aux_utils.h" +#include "utils.h" + +#ifndef _WINDOWS +#include +#include +#include +#endif + +#define NUM_INSERT_THREADS 30 +#define NUM_DELETE_THREADS 1 +#define NUM_SEARCH_THREADS 10 + +// random number generator +std::random_device dev; +std::mt19937 rng(dev()); + +tsl::robin_map params; +float mem_alpha, merge_alpha; +uint32_t medoid_id = std::numeric_limits::max(); +std::atomic_bool _insertions_done(false); +std::vector Lvec; + +template +void seed_iter(tsl::robin_set &active_set, + tsl::robin_set &inactive_set, T *all_points, + const std::string & inserted_points_file, + const std::string & inserted_tags_file, + tsl::robin_set &deleted_tags) { + const uint32_t insert_count = params[std::string("insert_count")]; + const uint32_t delete_count = params[std::string("delete_count")]; + const uint32_t ndims = params[std::string("ndims")]; + diskann::cout << "ITER: start = " << active_set.size() << ", " + << inactive_set.size() << "\n"; + + // pick `delete_count` tags + std::vector active_vec(active_set.begin(), active_set.end()); + std::shuffle(active_vec.begin(), active_vec.end(), rng); + std::vector delete_vec(active_vec.begin(), + active_vec.begin() + delete_count); + for (auto iter : delete_vec) + deleted_tags.insert(iter); + active_set.clear(); + active_set.insert(active_vec.begin() + delete_count, active_vec.end()); + // pick `insert_count` tags + std::vector inactive_vec(inactive_set.begin(), inactive_set.end()); + std::shuffle(inactive_vec.begin(), inactive_vec.end(), rng); + std::vector insert_vec(inactive_vec.begin(), + inactive_vec.begin() + insert_count); + inactive_set.clear(); + diskann::cout << "ITER: INSERT - " << insert_vec.size() << " IDs in " + << inserted_tags_file << "\n"; + inactive_set.insert(inactive_vec.begin() + insert_count, inactive_vec.end()); + std::sort(insert_vec.begin(), insert_vec.end()); + std::ofstream inserted_tags_writer(inserted_tags_file, std::ios::trunc); + for (auto &id : insert_vec) { + inserted_tags_writer << id << std::endl; + } + inserted_tags_writer.close(); + std::ofstream inserted_points_writer(inserted_points_file, std::ios::binary); + T *new_pts = new T[(uint64_t) insert_vec.size() * (uint64_t) ndims]; + for (uint64_t idx = 0; idx < insert_vec.size(); idx++) { + uint64_t actual_idx = insert_vec[idx]; + T * src_ptr = all_points + actual_idx * (uint64_t) ndims; + T * dest_ptr = new_pts + idx * (uint64_t) ndims; + std::memcpy(dest_ptr, src_ptr, ndims * sizeof(T)); + } + uint32_t npts_u32 = insert_vec.size(), ndims_u32 = ndims; + inserted_points_writer.write((char *) &npts_u32, sizeof(uint32_t)); + inserted_points_writer.write((char *) &ndims_u32, sizeof(uint32_t)); + inserted_points_writer.write( + (char *) new_pts, + (uint64_t) insert_vec.size() * (uint64_t) ndims * sizeof(T)); + inserted_points_writer.close(); + delete[] new_pts; + + // balance tags + inactive_set.insert(delete_vec.begin(), delete_vec.end()); + active_set.insert(insert_vec.begin(), insert_vec.end()); + diskann::cout << "ITER: end = " << active_set.size() << ", " + << inactive_set.size() << "\n"; + malloc_stats(); +} + +float compute_active_recall(const uint64_t *result_tags, + const uint32_t result_count, + const uint32_t *gs_tags, const uint32_t gs_count, + const tsl::robin_set &inactive_set) { + tsl::robin_set active_gs; + for (uint32_t i = 0; i < gs_count && active_gs.size() < result_count; i++) { + auto iter = inactive_set.find(gs_tags[i]); + if (iter == inactive_set.end()) { + active_gs.insert(gs_tags[i]); + } + } + uint32_t match = 0; + for (uint32_t i = 0; i < result_count; i++) { + match += (active_gs.find(result_tags[i]) != active_gs.end()); + } + return ((float) match / (float) result_count) * 100; +} + +template +void search_disk_index(const std::string & index_prefix_path, + const tsl::robin_set &inactive_tags, + const std::string & query_path, + const std::string & gs_path) { + std::string pq_prefix = index_prefix_path + "_pq"; + std::string disk_index_file = index_prefix_path + "_disk.index"; + std::string warmup_query_file = index_prefix_path + "_sample_data.bin"; + uint32_t beamwidth = params[std::string("beam_width")]; + uint32_t num_threads = params[std::string("disk_search_nthreads")]; + std::string query_bin = query_path; + std::string truthset_bin = gs_path; + uint64_t recall_at = params[std::string("recall_k")]; + uint64_t search_L = ::Lvec[0]; + // hold data + T * query = nullptr; + unsigned *gt_ids = nullptr; + uint32_t *gt_tags = nullptr; + float * gt_dists = nullptr; + size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; + + // load query + truthset + diskann::load_aligned_bin(query_bin, query, query_num, query_dim, + query_aligned_dim); + diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim, + >_tags); + if (gt_num != query_num) { + diskann::cout + << "Error. Mismatch in number of queries and ground truth data" + << std::endl; + } + + // load PQ Flash Index + std::shared_ptr reader(new LinuxAlignedFileReader()); + std::unique_ptr> _pFlashIndex( + new diskann::PQFlashIndex(reader)); + int res = _pFlashIndex->load(num_threads, pq_prefix.c_str(), + disk_index_file.c_str(), true); + if (res != 0) { + std::cerr << "Failed to load index.\n"; + exit(-1); + } + + // prep for search + std::vector query_result_ids; + std::vector query_result_tags; + std::vector query_result_dists; + query_result_ids.resize(recall_at * query_num); + query_result_dists.resize(recall_at * query_num); + query_result_tags.resize(recall_at * query_num); + diskann::QueryStats * stats = new diskann::QueryStats[query_num]; + std::vector query_result_ids_64(recall_at * query_num); +#pragma omp parallel for schedule(dynamic, 1) // num_threads(1) + for (_s64 i = 0; i < (int64_t) query_num; i++) { + _pFlashIndex->cached_beam_search( + query + (i * query_aligned_dim), recall_at, search_L, + query_result_ids_64.data() + (i * recall_at), + query_result_dists.data() + (i * recall_at), beamwidth, stats + i, + nullptr, query_result_tags.data() + (i * recall_at)); + } + + // compute mean recall, IOs + float mean_recall = 0.0f; + for (uint32_t i = 0; i < query_num; i++) { + auto *result_tags = query_result_tags.data() + (i * recall_at); + auto *gs_tags = gt_tags + (i * gt_dim); + float query_recall = compute_active_recall(result_tags, recall_at, gs_tags, + gt_dim, inactive_tags); + mean_recall += query_recall; + } + mean_recall /= query_num; + float mean_ios = (float) diskann::get_mean_stats( + stats, query_num, + [](const diskann::QueryStats &stats) { return stats.n_ios; }); + diskann::cout << "PQFlashIndex :: recall-" << recall_at << "@" << recall_at + << ": " << mean_recall << ", mean IOs: " << mean_ios << "\n"; + diskann::aligned_free(query); + delete[] stats; + delete[] gt_ids; + delete[] gt_dists; + delete[] gt_tags; +} + +template +void search_kernel(diskann::MergeInsert & merge_insert, + const tsl::robin_set &inactive_tags, + const std::string &query_path, const std::string &gs_path, + bool print_stats = false) { + uint32_t beamwidth = params[std::string("beam_width")]; + std::string query_bin = query_path; + std::string truthset_bin = gs_path; + uint64_t recall_at = params[std::string("recall_k")]; + + // hold data + T * query = nullptr; + unsigned *gt_ids = nullptr; + uint32_t *gt_tags = nullptr; + float * gt_dists = nullptr; + size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; + + // load query + truthset + diskann::load_aligned_bin(query_bin, query, query_num, query_dim, + query_aligned_dim); + diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim, + >_tags); + if (gt_num != query_num) { + diskann::cout + << "Error. Mismatch in number of queries and ground truth data" + << std::endl; + } + + if (print_stats) { + std::string recall_string = "Recall@" + std::to_string(recall_at); + diskann::cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " + << std::setw(18) << "Mean Latency (ms)" << std::setw(15) + << "99.9 Latency" << std::setw(12) << recall_string + << std::setw(12) << "Mean disk IOs" << std::endl; + + diskann::cout + << "===============================================================" + "===============" + << std::endl; + } + + // prep for search + std::vector query_result_ids; + std::vector query_result_tags; + std::vector query_result_dists; + query_result_ids.resize(recall_at * query_num); + query_result_dists.resize(recall_at * query_num); + query_result_tags.resize(recall_at * query_num); + diskann::QueryStats * stats = new diskann::QueryStats[query_num]; + std::vector query_result_ids_64(recall_at * query_num); + + size_t end_count = 1; + if (print_stats) + end_count = ::Lvec.size(); + else + end_count = 1; + for (size_t test_id = 0; test_id < end_count; test_id++) { + uint32_t L = Lvec[test_id]; + if (print_stats) { + std::vector latency_stats(query_num, 0); + auto s = std::chrono::high_resolution_clock::now(); + for (_s64 i = 0; i < (int64_t) query_num; i++) { + auto qs = std::chrono::high_resolution_clock::now(); + merge_insert.search_sync(query + (i * query_aligned_dim), recall_at, L, + (query_result_tags.data() + (i * recall_at)), + query_result_dists.data() + (i * recall_at), + stats + i); + auto qe = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = qe - qs; + latency_stats[i] = diff.count() * 1000; + // std::this_thread::sleep_for(std::chrono::milliseconds(2)); + } + auto e = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = e - s; + float qps = (float) (query_num / diff.count()); + + // compute mean recall, IOs + float mean_recall = 0.0f; + for (uint32_t i = 0; i < query_num; i++) { + auto *result_tags = query_result_tags.data() + (i * recall_at); + auto *gs_tags = gt_tags + (i * gt_dim); + float query_recall = compute_active_recall( + result_tags, recall_at, gs_tags, gt_dim, inactive_tags); + mean_recall += query_recall; + } + mean_recall /= query_num; + float mean_ios = (float) diskann::get_mean_stats( + stats, query_num, + [](const diskann::QueryStats &stats) { return stats.n_ios; }); + std::sort(latency_stats.begin(), latency_stats.end()); + diskann::cout << std::setw(4) << L << std::setw(12) << qps + << std::setw(18) + << std::accumulate(latency_stats.begin(), + latency_stats.end(), 0) / + (float) query_num + << std::setw(15) + << (float) latency_stats[(_u64)(0.999 * query_num)] + << std::setw(12) << mean_recall << std::setw(12) << mean_ios + << std::endl; + } else { + diskann::Timer timer; +#pragma parallel omp for num_threads(NUM_SEARCH_THREADS) + for (_s64 i = 0; i < (int64_t) query_num; i++) { + merge_insert.search_sync(query + (i * query_aligned_dim), recall_at, L, + (query_result_tags.data() + (i * recall_at)), + query_result_dists.data() + (i * recall_at), + stats + i); + // std::this_thread::sleep_for(std::chrono::milliseconds(2)); + } + diskann::cout << "Concurrent search over " << NUM_SEARCH_THREADS + << " threads in " << timer.elapsed() / 1000 << " ms" + << std::endl; + } + } + diskann::aligned_free(query); + delete[] stats; + delete[] gt_ids; + delete[] gt_dists; + delete[] gt_tags; +} + +template +void insertion_kernel(diskann::MergeInsert &merge_insert, + const std::string & mem_pts_file, + const std::string & mem_tags_file) { + /* if(::_insertions_done.load()) + { + diskann::cout << "Insertions_done is true at the beginning of + insertion + kernel" << std::endl; + exit(-1); + } + std::this_thread::sleep_for(std::chrono::milliseconds(5000)); */ + T * data_insert = nullptr; + size_t npts, ndim, aligned_dim; + diskann::load_aligned_bin(mem_pts_file, data_insert, npts, ndim, + aligned_dim); + std::vector tags; + tags.reserve(npts); + tags.resize(npts); + std::ifstream tag_file; + tag_file = std::ifstream(mem_tags_file); + if (!tag_file.is_open()) { + std::cerr << "Tag file not found." << std::endl; + } + TagT tag; + size_t j = 0; + while (tag_file >> tag) { + tags[j] = tag; + j++; + } + diskann::cout << "Tags loaded." << std::endl; + tag_file.close(); + size_t i; + diskann::Timer timer; +#pragma omp parallel for num_threads(NUM_INSERT_THREADS) + for (i = 0; i < npts; i++) { + if (merge_insert.insert(data_insert + i * aligned_dim, tags[i]) != 0) + diskann::cout << "Point " << i << "could not be inserted." << std::endl; + } + diskann::cout << "Mem index insertion time : " << timer.elapsed() / 1000 + << " ms" << std::endl; + ::_insertions_done.store(true); + delete[] data_insert; +} + +template +void deletion_kernel(diskann::MergeInsert &merge_insert, + tsl::robin_set & del_tags) { + // std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + diskann::Timer timer; + for (auto iter : del_tags) { + merge_insert.lazy_delete(iter); + } + diskann::cout << "Deletion time : " << timer.elapsed() / 1000 << " ms" + << std::endl; +} + +template +void merge_kernel(diskann::MergeInsert &merge_insert) { + while (true) { + merge_insert.trigger_merge(); + if (::_insertions_done.load()) { + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + } +} + +/*template +void merge_kernel(diskann::MergeInsert &merge_insert) { + merge_insert.final_merge(); +} +*/ +template +void run_iter(diskann::MergeInsert &merge_insert, + const std::string &base_prefix, const std::string &merge_prefix, + const std::string & mem_prefix, + tsl::robin_set &active_set, + tsl::robin_set &inactive_set, + const std::string &query_file, const std::string &gs_file, + T *data, diskann::Distance *dist_cmp) { + uint64_t initial_count = active_set.size() + inactive_set.size(); + // files for mem-DiskANN + std::string mem_pts_file = mem_prefix + ".data_orig"; + std::string mem_index_file = mem_prefix + ".index"; + std::string mem_tags_file = mem_prefix + ".tags_orig"; + + diskann::cout << "ITER: Seeding iteration" + << "\n"; + // seed the iteration + tsl::robin_set deleted_tags; + seed_iter(active_set, inactive_set, data, mem_pts_file, mem_tags_file, + deleted_tags); + assert(active_set.size() + inactive_set.size() == initial_count); + std::future delete_future = + std::async(std::launch::async, deletion_kernel, std::ref(merge_insert), + std::ref(deleted_tags)); + std::future insert_future; + insert_future = std::async(std::launch::async, insertion_kernel, + std::ref(merge_insert), std::ref(mem_pts_file), + std::ref(mem_tags_file)); + std::future merge_future = + std::async(std::launch::async, merge_kernel, std::ref(merge_insert)); + /* if(::_insertions_done.load()) + { + ::_insertions_done.store(false); + insert_future = std::async( + std::launch::async, insertion_kernel, std::ref(merge_insert), + std::ref(mem_pts_file), std::ref(mem_tags_file)); + } + */ + std::future_status insert_status, merge_status, delete_status; + + do { + insert_status = insert_future.wait_for(std::chrono::milliseconds(1)); + merge_status = merge_future.wait_for(std::chrono::milliseconds(1)); + delete_status = delete_future.wait_for(std::chrono::milliseconds(1)); + + if ((insert_status == std::future_status::timeout) || + (merge_status == std::future_status::timeout) || + (delete_status == std::future_status::timeout)) { + // search_kernel(merge_insert, inactive_set, query_file, gs_file); + } else { + if ((insert_status == std::future_status::ready) && + (merge_status == std::future_status::ready) && + (delete_status == std::future_status::ready)) { + merge_insert.final_merge(); + } + } + } while (insert_status != std::future_status::ready || + merge_status != std::future_status::ready); + + /* + do { + insert_status = insert_future.wait_for(std::chrono::milliseconds(1)); + merge_status = merge_future.wait_for(std::chrono::milliseconds(1)); + delete_status = delete_future.wait_for(std::chrono::milliseconds(1)); + + if ((merge_status == std::future_status::timeout) || + (delete_status == std::future_status::timeout)) { + search_kernel(merge_insert, inactive_set, query_file, gs_file); + } else { + if ((merge_status == std::future_status::ready) && + (delete_status == std::future_status::ready) && (insert_status == +std::future_status::ready)) { +// merge_insert.final_merge(); + break; + } + } + } while (delete_status != std::future_status::ready || insert_status != +std::future_status::ready || + merge_status != std::future_status::ready); +*/ + + // diskann::cout << "Searching all indices" << std::endl; + search_kernel(merge_insert, inactive_set, query_file, gs_file, true); +} + +template +void run_all_iters(std::string &base_prefix, std::string &merge_prefix, + const std::string &mem_prefix, const std::string &data_file, + const std::string &active_tags_file, + const std::string &query_file, const std::string &gs_file, + diskann::Distance *dist_cmp) { + // load all data points + std::unique_ptr data; + uint64_t npts = 0, ndims = 0; + diskann::load_bin(data_file, data, npts, ndims); + params[std::string("ndims")] = ndims; + + int n_iters = params["n_iters"]; + // load active tags + std::ifstream reader(active_tags_file); + tsl::robin_set active_tags; + uint32_t tag; + while (reader >> tag) { + active_tags.insert(tag); + } + + // read medoid ID from base_prefix + std::ifstream disk_reader(base_prefix + "_disk.index", std::ios::binary); + disk_reader.seekg(2 * sizeof(uint64_t), std::ios::beg); + uint64_t medoid = std::numeric_limits::max(); + disk_reader.read((char *) &medoid, sizeof(uint64_t)); + diskann::cout << "Detected medoid = " << medoid + << " ==> excluding from insert/deletes.\n"; + ::medoid_id = medoid; + + // generate inactive tags + tsl::robin_set inactive_tags; + for (uint32_t i = 0; i < npts; i++) { + auto iter = active_tags.find(i); + if (iter == active_tags.end()) { + inactive_tags.insert(i); + } + } + + // remove medoid from active_set + active_tags.erase(::medoid_id); + + diskann::Parameters paras; + paras.Set("L_mem", params[std::string("mem_l_index")]); + paras.Set("R_mem", params[std::string("range")]); + paras.Set("alpha_mem", ::mem_alpha); + paras.Set("L_disk", params[std::string("merge_l_index")]); + paras.Set("R_disk", params[std::string("range")]); + paras.Set("alpha_disk", ::merge_alpha); + paras.Set("C", params[std::string("merge_maxc")]); + paras.Set("beamwidth", params[std::string("beam_width")]); + paras.Set("nodes_to_cache", + params[std::string("disk_search_node_cache_count")]); + paras.Set("num_search_threads", + params[std::string("disk_search_nthreads")]); + + diskann::MergeInsert merge_insert(paras, 200000, ndims, mem_prefix, + base_prefix, merge_prefix, dist_cmp); + for (size_t i = 0; i < n_iters; i++) { + diskann::cout << "ITER : " << i << std::endl; + run_iter(merge_insert, base_prefix, merge_prefix, mem_prefix, + active_tags, inactive_tags, query_file, gs_file, data.get(), + dist_cmp); + } + // merge_kernel(merge_insert); +} + +int main(int argc, char **argv) { + if (argc < 19) { + diskann::cout + << "Correct usage: " << argv[0] + << " " + " " + " " + << " " + << " " + " " + " ...." + << "\n WARNING: Other parameters set inside CPP source." << std::endl; + exit(-1); + } + diskann::cout.setf(std::ios::unitbuf); + + int arg_no = 1; + std::string index_type = argv[arg_no++]; + TMP_FOLDER = argv[arg_no++]; + std::string base_prefix(argv[arg_no++]); + std::string merge_prefix(argv[arg_no++]); + std::string mem_prefix(argv[arg_no++]); + unsigned L_mem = (unsigned) atoi(argv[arg_no++]); + float alpha_mem = (float) atof(argv[arg_no++]); + unsigned L_disk = (unsigned) atoi(argv[arg_no++]); + float alpha_disk = (float) atof(argv[arg_no++]); + std::string data_bin(argv[arg_no++]); + std::string query_bin(argv[arg_no++]); + std::string gt_bin(argv[arg_no++]); + int n_iters = atoi(argv[arg_no++]); + uint32_t insert_count = (uint32_t) atoi(argv[arg_no++]); + uint32_t delete_count = (uint32_t) atoi(argv[arg_no++]); + uint32_t range = (uint32_t) atoi(argv[arg_no++]); + uint32_t recall_k = (uint32_t) atoi(argv[arg_no++]); + + for (int ctr = arg_no; ctr < argc; ctr++) { + _u64 curL = std::atoi(argv[ctr]); + if (curL >= recall_k) + ::Lvec.push_back(curL); + } + + params[std::string("n_iters")] = n_iters; + params[std::string("insert_count")] = insert_count; + params[std::string("delete_count")] = delete_count; + params[std::string("range")] = range; + params[std::string("recall_k")] = recall_k; + + // hard-coded params + params[std::string("disk_search_node_cache_count")] = 100; + params[std::string("disk_search_nthreads")] = 16; + params[std::string("beam_width")] = 4; + params[std::string("mem_l_index")] = L_mem; + mem_alpha = alpha_mem; + merge_alpha = alpha_disk; + params[std::string("mem_nthreads")] = 32; + params[std::string("merge_maxc")] = (uint32_t)(range * 2.5); + params[std::string("merge_l_index")] = L_disk; + + if (index_type == std::string("float")) { + diskann::DistanceL2 dist_cmp; + run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, + base_prefix + "_disk.index.tags", query_bin, gt_bin, + &dist_cmp); + } else if (index_type == std::string("uint8")) { + diskann::DistanceL2UInt8 dist_cmp; + run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, + base_prefix + "_disk.index.tags", query_bin, gt_bin, + &dist_cmp); + } else if (index_type == std::string("int8")) { + diskann::DistanceL2Int8 dist_cmp; + run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, + base_prefix + "_disk.index.tags", query_bin, gt_bin, + &dist_cmp); + } else { + diskann::cout << "Unsupported type : " << index_type << "\n"; + } + diskann::cout << "Exiting\n"; +} diff --git a/tests/utils/CMakeLists.txt b/tests/utils/CMakeLists.txt index e69722dcfc..388580f773 100644 --- a/tests/utils/CMakeLists.txt +++ b/tests/utils/CMakeLists.txt @@ -3,25 +3,40 @@ set(CMAKE_CXX_STANDARD 14) +add_executable(uint8_to_float uint8_to_float.cpp) +if(MSVC) + target_link_options(uint8_to_float PRIVATE /MACHINE:x64) + target_link_libraries(uint8_to_float debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) + target_link_libraries(uint8_to_float optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) +else() + target_link_libraries(uint8_to_float ${PROJECT_NAME}) +endif() + add_executable(fvecs_to_bin fvecs_to_bin.cpp) if(MSVC) target_link_options(fvecs_to_bin PRIVATE /MACHINE:x64) target_link_libraries(fvecs_to_bin debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) target_link_libraries(fvecs_to_bin optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) +else() + target_link_libraries(fvecs_to_bin ${PROJECT_NAME}) endif() -add_executable(float_bin_to_int8 float_bin_to_int8.cpp) +add_executable(bin_to_fvecs bin_to_fvecs.cpp) if(MSVC) - target_link_options(float_bin_to_int8 PRIVATE /MACHINE:x64) - target_link_libraries(float_bin_to_int8 debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) - target_link_libraries(float_bin_to_int8 optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) + target_link_options(bin_to_fvecs PRIVATE /MACHINE:x64) + target_link_libraries(bin_to_fvecs debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) + target_link_libraries(bin_to_fvecs optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) +else() + target_link_libraries(bin_to_fvecs ${PROJECT_NAME}) endif() -add_executable(ivecs_to_bin ivecs_to_bin.cpp) +add_executable(normalize_data normalize_data.cpp) if(MSVC) - target_link_options(ivecs_to_bin PRIVATE /MACHINE:x64) - target_link_libraries(ivecs_to_bin debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) - target_link_libraries(ivecs_to_bin optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) + target_link_options(normalize_data PRIVATE /MACHINE:x64) + target_link_libraries(normalize_data debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) + target_link_libraries(normalize_data optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) +else() + target_link_libraries(normalize_data ${PROJECT_NAME}) endif() add_executable(tsv_to_bin tsv_to_bin.cpp) @@ -29,13 +44,17 @@ if(MSVC) target_link_options(tsv_to_bin PRIVATE /MACHINE:x64) target_link_libraries(tsv_to_bin debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) target_link_libraries(tsv_to_bin optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) +else() + target_link_libraries(tsv_to_bin ${PROJECT_NAME}) endif() -add_executable(bin_to_tsv bin_to_tsv.cpp) +add_executable(ivecs_to_bin ivecs_to_bin.cpp) if(MSVC) - target_link_options(bin_to_tsv PRIVATE /MACHINE:x64) - target_link_libraries(bin_to_tsv debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) - target_link_libraries(bin_to_tsv optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) + target_link_options(ivecs_to_bin PRIVATE /MACHINE:x64) + target_link_libraries(ivecs_to_bin debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) + target_link_libraries(ivecs_to_bin optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) +else() + target_link_libraries(ivecs_to_bin ${PROJECT_NAME}) endif() add_executable(int8_to_float int8_to_float.cpp) @@ -56,14 +75,14 @@ else() target_link_libraries(uint32_to_uint8 ${PROJECT_NAME}) endif() -add_executable(gen_random_slice gen_random_slice.cpp) -if(MSVC) - target_link_options(gen_random_slice PRIVATE /MACHINE:x64) - target_link_libraries(gen_random_slice debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) - target_link_libraries(gen_random_slice optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) -else() - target_link_libraries(gen_random_slice ${PROJECT_NAME} -ltcmalloc) -endif() +#add_executable(gen_random_slice gen_random_slice.cpp) +#if(MSVC) +# target_link_options(gen_random_slice PRIVATE /MACHINE:x64) +# target_link_libraries(gen_random_slice debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) +# target_link_libraries(gen_random_slice optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) +#else() +# target_link_libraries(gen_random_slice ${PROJECT_NAME} -ltcmalloc) +#endif() add_executable(calculate_recall calculate_recall.cpp) if(MSVC) @@ -85,6 +104,15 @@ else() endif() +add_executable(seed_index_merger seed_index_merger.cpp) +if(MSVC) + target_link_options(seed_index_merger PRIVATE /MACHINE:x64 /DEBUG:FULL) + target_link_libraries(seed_index_merger debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) + target_link_libraries(seed_index_merger optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) +else() + target_link_libraries(seed_index_merger ${PROJECT_NAME} -ltcmalloc) +endif() + add_executable(generate_pq generate_pq.cpp) if(MSVC) target_link_options(generate_pq PRIVATE /MACHINE:x64 /DEBUG:FULL) @@ -103,7 +131,6 @@ else() target_link_libraries(partition_data ${PROJECT_NAME} -ltcmalloc) endif() - add_executable(partition_with_ram_budget partition_with_ram_budget.cpp) if(MSVC) target_link_options(partition_with_ram_budget PRIVATE /MACHINE:x64) @@ -134,8 +161,32 @@ else() endif() +if(MSVC) + add_executable(test_l2_avx test_l2_avx.cpp) + target_link_options(test_l2_avx PRIVATE /MACHINE:x64 /DEBUG:FULL) + target_link_libraries(test_l2_avx debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) + target_link_libraries(test_l2_avx optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) + + add_executable(extract_rows extract_rows.cpp) + target_link_options(extract_rows PRIVATE /MACHINE:x64 /DEBUG:FULL) + target_link_libraries(extract_rows debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib) + target_link_libraries(extract_rows optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib) + +endif() + +#add_executable(convert_axon_to_bin convert_axon_to_bin.cpp ${PROJECT_SOURCE_DIR}/src/ann_exception.cpp) +#if(MSVC) +# target_include_directories(convert_axon_to_bin PRIVATE "${BOOST_ROOT}") +# target_link_options(convert_axon_to_bin PRIVATE /MACHINE:x64) +#else() +# target_link_libraries(convert_axon_to_bin ${PROJECT_NAME}) +#endif() + + + + # formatter -if (LINUX) - add_custom_command(TARGET gen_random_slice PRE_BUILD COMMAND clang-format-4.0 -i ../../../include/*.h ../../../include/dll/*.h ../../../src/*.cpp ../../../tests/*.cpp ../../../src/dll/*.cpp ../../../tests/utils/*.cpp) +if (NOT MSVC) + add_custom_command(TARGET generate_pq PRE_BUILD COMMAND clang-format -i ../../../include/*.h ../../../src/*.cpp ../../../tests/*.cpp ../../../src/dll/*.cpp ../../../tests/utils/*.cpp) endif() diff --git a/tests/utils/bin_to_fvecs.cpp b/tests/utils/bin_to_fvecs.cpp index 307437a416..050f37f3b6 100644 --- a/tests/utils/bin_to_fvecs.cpp +++ b/tests/utils/bin_to_fvecs.cpp @@ -2,60 +2,79 @@ // Licensed under the MIT license. #include -#include "util.h" +#include +#include +#include "utils.h" -void block_convert(std::ifstream& writr, std::ofstream& readr, float* read_buf, - float* write_buf, _u64 npts, _u64 ndims) { - writr.write((char*) read_buf, - npts * (ndims * sizeof(float) + sizeof(unsigned))); +void block_convert(std::ofstream& writr, std::ifstream& readr, float* read_buf, + float* write_buf, _u64 npts, _u64 ndims, + bool normalize = false) { + readr.read((char*) read_buf, npts * ndims * sizeof(float)); + _u32 ndims_u32 = (_u32) ndims; #pragma omp parallel for - for (_u64 i = 0; i < npts; i++) { - memcpy(write_buf + i * ndims, (read_buf + i * (ndims + 1)) + 1, + for (_s64 i = 0; i < (_s64) npts; i++) { + if (normalize) { + float norm_pt = std::numeric_limits::epsilon(); + for (_u32 dim = 0; dim < ndims_u32; dim++) { + norm_pt += + *(read_buf + i * ndims + dim) * *(read_buf + i * ndims + dim); + } + norm_pt = std::sqrt(norm_pt); + for (_u32 dim = 0; dim < ndims_u32; dim++) { + *(read_buf + i * ndims + dim) = *(read_buf + i * ndims + dim) / norm_pt; + } + } + + memcpy(write_buf + i * (ndims + 1), &ndims_u32, sizeof(float)); + memcpy(write_buf + i * (ndims + 1) + 1, (read_buf + i * ndims), ndims * sizeof(float)); } - readr.read((char*) write_buf, npts * ndims * sizeof(float)); + writr.write((char*) write_buf, + npts * (ndims * sizeof(float) + sizeof(unsigned))); } int main(int argc, char** argv) { - if (argc != 3) { - std::cout << argv[0] << " input_bin output_fvecs" << std::endl; + if (argc != 4) { + diskann::cout << argv[0] + << ": [input_bin] [output_fvecs] [normalize? (1 for yes]" + << std::endl; exit(-1); } + bool normalize = (bool) std::atoi(argv[3]); std::ifstream readr(argv[1], std::ios::binary); int npts_s32; int ndims_s32; readr.read((char*) &npts_s32, sizeof(_s32)); readr.read((char*) &ndims_s32, sizeof(_s32)); - size_t npts = npts_s32; - size_t ndims = ndims_s32; - _u32 ndims_u32 = (_u32) ndims_s32; - // _u64 fsize = writr.tellg(); - readr.seekg(0, std::ios::beg); + // size_t npt = npts_s32; + // size_t ndim = ndims_s32; + _u32 ndims_u32 = (_u32) ndims_s32; + _u32 npts_u32 = (_u32) npts_s32; + // readr.seekg(0, std::ios::end); + //_u64 fsize = readr.tellg(); - unsigned ndims_u32; - writr.write((char*) &ndims_u32, sizeof(unsigned)); - writr.seekg(0, std::ios::beg); + std::ofstream writr(argv[2], std::ios::binary); + // writr.write((char*) &ndims_u32, sizeof(unsigned)); + // writr.seekg(0, std::ios::beg); _u64 ndims = (_u64) ndims_u32; - _u64 npts = fsize / ((ndims + 1) * sizeof(float)); - std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims - << std::endl; + _u64 npts = (_u64) npts_u32; + diskann::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims + << std::endl; _u64 blk_size = 131072; _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; - std::cout << "# blks: " << nblks << std::endl; + diskann::cout << "# blks: " << nblks << std::endl; - std::ofstream writr(argv[2], std::ios::binary); - float* read_buf = new float[npts * (ndims + 1)]; - float* write_buf = new float[npts * ndims]; + float* read_buf = new float[npts * ndims]; + float* write_buf = new float[npts * (ndims + 1)]; for (_u64 i = 0; i < nblks; i++) { _u64 cblk_size = std::min(npts - i * blk_size, blk_size); - block_convert(writr, readr, read_buf, write_buf, cblk_size, ndims); - std::cout << "Block #" << i << " written" << std::endl; + block_convert(writr, readr, read_buf, write_buf, cblk_size, ndims, + normalize); + diskann::cout << "Block #" << i << " written" << std::endl; } - delete[] read_buf; delete[] write_buf; - writr.close(); readr.close(); } diff --git a/tests/utils/calculate_recall.cpp b/tests/utils/calculate_recall.cpp index 7fe03798ff..cb94039d72 100644 --- a/tests/utils/calculate_recall.cpp +++ b/tests/utils/calculate_recall.cpp @@ -14,8 +14,8 @@ int main(int argc, char** argv) { if (argc != 4) { - std::cout << argv[0] << " " - << std::endl; + diskann::cout << argv[0] << " " + << std::endl; return -1; } unsigned* gold_std = NULL; @@ -29,7 +29,7 @@ int main(int argc, char** argv) { diskann::load_truthset(argv[2], our_results, or_dist, points_num_or, dim_or); if (points_num_gs != points_num_or) { - std::cout + diskann::cout << "Error. Number of queries mismatch in ground truth and our results" << std::endl; return -1; @@ -39,15 +39,16 @@ int main(int argc, char** argv) { uint32_t recall_at = std::atoi(argv[3]); if ((dim_or < recall_at) || (recall_at > dim_gs)) { - std::cout << "ground truth has size " << dim_gs << "; our set has " - << dim_or << " points. Asking for recall " << recall_at - << std::endl; + diskann::cout << "ground truth has size " << dim_gs << "; our set has " + << dim_or << " points. Asking for recall " << recall_at + << std::endl; return -1; } - std::cout << "Calculating recall@" << recall_at << std::endl; - float recall_val = diskann::calculate_recall( - points_num, gold_std, gs_dist, dim_gs, our_results, dim_or, recall_at); + diskann::cout << "Calculating recall@" << recall_at << std::endl; + float recall_val = (float) diskann::calculate_recall( + (_u32) points_num, gold_std, gs_dist, (_u32) dim_gs, our_results, + (_u32) dim_or, recall_at); // double avg_recall = (recall*1.0)/(points_num*1.0); - std::cout << "Avg. recall@" << recall_at << " is " << recall_val << "\n"; + diskann::cout << "Avg. recall@" << recall_at << " is " << recall_val << "\n"; } diff --git a/tests/utils/compute_groundtruth.cpp b/tests/utils/compute_groundtruth.cpp index 8fef8c929c..1c3a10267f 100644 --- a/tests/utils/compute_groundtruth.cpp +++ b/tests/utils/compute_groundtruth.cpp @@ -31,10 +31,10 @@ #define ALIGNMENT 512 void command_line_help() { - std::cerr - << " " - << std::endl; + std::cerr << " " + " optional:" + << std::endl; } template @@ -131,8 +131,8 @@ void exact_knn(const size_t dim, const size_t k, distsq_to_points(dim, dist_matrix, npoints, points, points_l2sq, q_e - q_b, queries + (ptrdiff_t) q_b * (ptrdiff_t) dim, queries_l2sq + q_b); - std::cout << "Computed distances for queries: [" << q_b << "," << q_e << ")" - << std::endl; + diskann::cout << "Computed distances for queries: [" << q_b << "," << q_e + << ")" << std::endl; #pragma omp parallel for schedule(dynamic, 16) for (long long q = q_b; q < q_e; q++) { @@ -163,8 +163,8 @@ void exact_knn(const size_t dim, const size_t k, dist_closest_points + (ptrdiff_t) q * (ptrdiff_t) k, dist_closest_points + (ptrdiff_t)(q + 1) * (ptrdiff_t) k)); } - std::cout << "Computed exact k-NN for queries: [" << q_b << "," << q_e - << ")" << std::endl; + diskann::cout << "Computed exact k-NN for queries: [" << q_b << "," << q_e + << ")" << std::endl; } delete[] dist_matrix; @@ -176,16 +176,18 @@ void exact_knn(const size_t dim, const size_t k, template inline int get_num_parts(const char *filename) { std::ifstream reader(filename, std::ios::binary); - std::cout << "Reading bin file " << filename << " ...\n"; + diskann::cout << "Reading bin file " << filename << " ...\n"; int npts_i32, ndims_i32; reader.read((char *) &npts_i32, sizeof(int)); reader.read((char *) &ndims_i32, sizeof(int)); - std::cout << "#pts = " << npts_i32 << ", #dims = " << ndims_i32 << std::endl; + diskann::cout << "#pts = " << npts_i32 << ", #dims = " << ndims_i32 + << std::endl; reader.close(); - int num_parts = (npts_i32 % PARTSIZE) == 0 - ? npts_i32 / PARTSIZE - : std::floor(npts_i32 / PARTSIZE) + 1; - std::cout << "Number of parts: " << num_parts << std::endl; + uint32_t num_parts = + (npts_i32 % PARTSIZE) == 0 + ? (_u32)(npts_i32 / PARTSIZE) + : (_u32) std::floor((double) npts_i32 / (double) PARTSIZE) + 1; + diskann::cout << "Number of parts: " << num_parts << std::endl; return num_parts; } @@ -193,7 +195,7 @@ template inline void load_bin_as_float(const char *filename, float *&data, size_t &npts, size_t &ndims, int part_num) { std::ifstream reader(filename, std::ios::binary); - std::cout << "Reading bin file " << filename << " ...\n"; + diskann::cout << "Reading bin file " << filename << " ...\n"; int npts_i32, ndims_i32; reader.read((char *) &npts_i32, sizeof(int)); reader.read((char *) &ndims_i32, sizeof(int)); @@ -203,16 +205,18 @@ inline void load_bin_as_float(const char *filename, float *&data, size_t &npts, ndims = (unsigned) ndims_i32; uint64_t nptsuint64_t = (uint64_t) npts; uint64_t ndimsuint64_t = (uint64_t) ndims; - std::cout << "#pts in part = " << npts << ", #dims = " << ndims - << ", size = " << nptsuint64_t * ndimsuint64_t * sizeof(T) << "B" - << std::endl; + diskann::cout << "#pts in part = " << npts << ", #dims = " << ndims + << ", size = " << nptsuint64_t * ndimsuint64_t * sizeof(T) + << "B" << std::endl; reader.seekg(start_id * ndims * sizeof(T) + 2 * sizeof(uint32_t), std::ios::beg); + // data = new T[nptsuint64_t * ndimsuint64_t]; T *data_T = new T[nptsuint64_t * ndimsuint64_t]; reader.read((char *) data_T, sizeof(T) * nptsuint64_t * ndimsuint64_t); - std::cout << "Finished reading part of the bin file." << std::endl; + diskann::cout << "Finished reading part of the bin file." << std::endl; reader.close(); + // data = (nptsuint64_t*ndimsuint64_t, ALIGNMENT); data = aligned_malloc(nptsuint64_t * ndimsuint64_t, ALIGNMENT); #pragma omp parallel for schedule(dynamic, 32768) for (int64_t i = 0; i < (int64_t) nptsuint64_t; i++) { @@ -223,55 +227,62 @@ inline void load_bin_as_float(const char *filename, float *&data, size_t &npts, } } delete[] data_T; - std::cout << "Finished converting part data to float." << std::endl; + diskann::cout << "Finished converting part data to float." << std::endl; } template inline void save_bin(const std::string filename, T *data, size_t npts, size_t ndims) { std::ofstream writer(filename, std::ios::binary | std::ios::out); - std::cout << "Writing bin: " << filename << "\n"; + diskann::cout << "Writing bin: " << filename << "\n"; int npts_i32 = (int) npts, ndims_i32 = (int) ndims; writer.write((char *) &npts_i32, sizeof(int)); writer.write((char *) &ndims_i32, sizeof(int)); - std::cout << "bin: #pts = " << npts << ", #dims = " << ndims - << ", size = " << npts * ndims * sizeof(T) + 2 * sizeof(int) << "B" - << std::endl; + diskann::cout << "bin: #pts = " << npts << ", #dims = " << ndims + << ", size = " << npts * ndims * sizeof(T) + 2 * sizeof(int) + << "B" << std::endl; // data = new T[npts_u64 * ndims_u64]; writer.write((char *) data, npts * ndims * sizeof(T)); writer.close(); - std::cout << "Finished writing bin" << std::endl; + diskann::cout << "Finished writing bin" << std::endl; } inline void save_groundtruth_as_one_file(const std::string filename, int32_t *data, float *distances, - size_t npts, size_t ndims) { + size_t npts, size_t ndims, + uint32_t *tags = nullptr) { std::ofstream writer(filename, std::ios::binary | std::ios::out); int npts_i32 = (int) npts, ndims_i32 = (int) ndims; writer.write((char *) &npts_i32, sizeof(int)); writer.write((char *) &ndims_i32, sizeof(int)); - std::cout << "Saving truthset in one file (npts, dim, npts*dim id-matrix, " - "npts*dim dist-matrix) with npts = " - << npts << ", dim = " << ndims << ", size = " - << 2 * npts * ndims * sizeof(unsigned) + 2 * sizeof(int) << "B" - << std::endl; + diskann::cout + << "Saving truthset in one file (npts, dim, npts*dim id-matrix, " + "npts*dim dist-matrix) with npts = " + << npts << ", dim = " << ndims + << ", size = " << 2 * npts * ndims * sizeof(unsigned) + 2 * sizeof(int) + << "B" << std::endl; // data = new T[npts_u64 * ndims_u64]; writer.write((char *) data, npts * ndims * sizeof(uint32_t)); writer.write((char *) distances, npts * ndims * sizeof(float)); + if (tags != nullptr) { + writer.write((char *) tags, npts * ndims * sizeof(uint32_t)); + } else { + writer.write((char *) data, npts * ndims * sizeof(uint32_t)); + } + writer.close(); - std::cout << "Finished writing truthset" << std::endl; + diskann::cout << "Finished writing truthset" << std::endl; } template -int aux_main(int argv, char **argc) { - +int aux_main(int argc, char **argv) { size_t npoints, nqueries, dim; - std::string base_file(argc[2]); - std::string query_file(argc[3]); - size_t k = atoi(argc[4]); - std::string gt_file(argc[5]); + std::string base_file(argv[2]); + std::string query_file(argv[3]); + size_t k = atoi(argv[4]); + std::string gt_file(argv[5]); float *base_data; float *query_data; @@ -314,21 +325,38 @@ int aux_main(int argv, char **argc) { dist_closest_points[i * k + j] = cur_res[j].second; } } + uint32_t *tags = nullptr; + if (argc == 7) { + std::cout << "Loading tags from " << argv[6] << "\n"; + tags = new uint32_t[nqueries * k]; + uint32_t * all_tags; + std::string tag_file = std::string(argv[6]); + size_t tag_pts, tag_dim; + diskann::load_bin(tag_file, all_tags, tag_pts, tag_dim); + + diskann::cout << "Loaded tags for " << tag_pts << " points.\n"; + for (uint64_t i = 0; i < nqueries * k; i++) { + tags[i] = all_tags[closest_points[i]]; + } + } save_groundtruth_as_one_file(gt_file, closest_points, dist_closest_points, - nqueries, k); + nqueries, k, tags); diskann::aligned_free(query_data); delete[] closest_points; delete[] dist_closest_points; + if (tags != nullptr) { + delete[] tags; + } + return 0; } int main(int argc, char **argv) { - if (argc != 6) { + if (argc != 6 && argc != 7) { command_line_help(); return -1; } - if (std::string(argv[1]) == std::string("float")) aux_main(argc, argv); if (std::string(argv[1]) == std::string("int8")) diff --git a/tests/utils/convert_axon_to_bin.cpp b/tests/utils/convert_axon_to_bin.cpp new file mode 100644 index 0000000000..cfeca80c3e --- /dev/null +++ b/tests/utils/convert_axon_to_bin.cpp @@ -0,0 +1,314 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include +#include "cached_io.h" +#include "ann_exception.h" + +float (*atofLambda)(const std::string&) = [](const std::string& str) { + return (float) ::atof(str.c_str()); +}; +int8_t (*atoiLambda)(const std::string&) = [](const std::string& str) { + return (int8_t)::atoi(str.c_str()); +}; +uint8_t (*atouLambda)(const std::string&) = [](const std::string& str) { + return (uint8_t)::atoi(str.c_str()); +}; + +const int MIN_POINTS_FOR_VALUE_VERIFICATION = 10000; + +std::vector splitLine(const std::string& str, const char delimiter, + int suggestedCapacity) { + std::vector records; + records.reserve(suggestedCapacity); + + boost::split(records, str, [delimiter](char c) { return c == delimiter; }); + + return records; +} + +template +std::vector getVector(const std::string& str, + T convertFn(const std::string& str), + int suggestedSize) { + auto idsAndVector = splitLine(str, '\t', suggestedSize); + + std::vector typedVec; + typedVec.reserve(suggestedSize); + std::vector strVec; + + if (idsAndVector.size() >= 3) { + strVec = splitLine(idsAndVector[2], ',', suggestedSize); + } else if (idsAndVector.size() == 2) { + strVec = splitLine(idsAndVector[1], ',', suggestedSize); + } else if (idsAndVector.size() == 1) { + strVec = splitLine(idsAndVector[0], ',', suggestedSize); + } else { + std::cerr << "Found line " << str + << " that has non-standard number of delimiters: " + << idsAndVector.size() << std::endl; + } + std::transform( + strVec.begin(), strVec.end(), std::back_inserter(typedVec), + [&convertFn](const std::string& str) { return convertFn(str); }); + + return typedVec; +} + +template +uint32_t getDimension(const char* inFile, T convertFn(const std::string& val)) { + std::ifstream fin(inFile); + if (fin.is_open()) { + std::string line; + std::getline(fin, line); + + auto vector = getVector(line, convertFn, 1); + return (uint32_t) vector.size(); + } else { + char message[2048]; + std::cerr << "Could not open input file: " << inFile << ". " + << strerror_s(message, 2048, errno) << std::endl; + exit(1); + } +} + +uint32_t getRowCount(const char* infile) { + std::ifstream fin(infile); + std::string line; + + uint32_t count = 0; + while (std::getline(fin, line)) { + if (line.length() != 0) { + count++; + if (count % 10000 == 0) { + diskann::cout << "Counted " << count << " lines." << std::endl; + } + } + } + + return count; +} + +template +void writeBinaryVec(const char* outfile, uint32_t numDimensions, + const std::vector>& allVecs) { + uint32_t numPoints = (uint32_t) allVecs.size(); + diskann::cout << "Writing " << numPoints + << " records of dimension: " << numDimensions + << " to file: " << outfile << "..."; + + std::ofstream fout(outfile, std::ios::binary); + if (fout.is_open()) { + fout.write((const char*) &numPoints, sizeof(uint32_t)); + fout.write((const char*) &numDimensions, sizeof(uint32_t)); + + for (auto vec : allVecs) { + fout.write((const char*) vec.data(), numDimensions * sizeof(T)); + } + diskann::cout << "done." << std::endl; + } else { + char message[2048]; + std::cerr << "Could not open output file: " << outfile << ". " + << strerror_s(message, 2048, errno) << std::endl; + } +} + +// template +// void writeBinary(const char* outfile, uint32_t numDimensions, +// uint32_t numPoints, T* data) { +// diskann::cout << "Writing " << numPoints +// << " records of dimension: " << numDimensions +// << " to file: " << outfile << "..."; +// +// std::ofstream fout(outfile, std::ios::binary); +// if (fout.is_open()) { +// fout.write((const char*) &numPoints, sizeof(uint32_t)); +// fout.write((const char*) &numDimensions, sizeof(uint32_t)); +// +// fout.write((const char*) data, +// ((uint64_t) numDimensions) * numPoints * sizeof(T)); +// diskann::cout << "done." << std::endl; +// } else { +// char message[2048]; +// std::cerr << "Could not open output file: " << outfile << ". " +// << strerror_s(message, 2048, errno) << std::endl; +// } +//} + +uint32_t numPointsToCheck(uint32_t numPoints) { + uint32_t point01percent = (uint32_t)(0.01 * numPoints / 100); + uint32_t point1percent = (uint32_t)(0.1 * numPoints / 100); + uint32_t onepercent = (uint32_t)(1 * numPoints / 100); + + return point01percent > MIN_POINTS_FOR_VALUE_VERIFICATION + ? point01percent + : point1percent > MIN_POINTS_FOR_VALUE_VERIFICATION + ? point1percent + : onepercent > MIN_POINTS_FOR_VALUE_VERIFICATION ? onepercent + : numPoints; +} + +template +void sanityCheck(const char* origfile, const char* binfile, + uint32_t numDimensions, uint32_t numPoints, + T convertFn(const std::string& str)) { + uint32_t nd, np; + std::ifstream fin(binfile, std::ios::binary); + std::ifstream orig(origfile); + + fin.read((char*) &np, sizeof(uint32_t)); + fin.read((char*) &nd, sizeof(uint32_t)); + + assert(np == numPoints); + if (np != numPoints) { + throw diskann::ANNException( + "Verifying binary write failed! np != numPoints", -1, __FUNCSIG__, + __FILE__, __LINE__); + } + assert(nd == numDimensions); + if (nd != numDimensions) { + throw diskann::ANNException( + "Verifying binary write failed! nd != numDimensions", -1, __FUNCSIG__, + __FILE__, __LINE__); + } + + uint32_t mismatchCount = 0; + uint32_t vectorsToCheck = numPointsToCheck(numPoints); + T* data = new T[numDimensions * vectorsToCheck]; + fin.read((char*) data, sizeof(T) * numDimensions * vectorsToCheck); + + diskann::cout << "Checking first " << vectorsToCheck + << " records for byte-byte match." << std::endl; + + for (uint32_t i = 0; i < vectorsToCheck; i++) { + std::string line; + std::getline(orig, line); + + auto origvec = getVector(line, convertFn, nd); + assert(origvec.size() == nd); + + for (uint32_t j = 0; j < nd; j++) { + if (origvec[j] != data[i * nd + j]) { + std::cerr << "Found mismatch at line " << i << " orig: " << origvec[j] + << " bin val: " << data[i * nd + j] << std::endl; + mismatchCount++; + } + } + } + + delete[] data; + + if (mismatchCount == 0) { + diskann::cout << "Successfully verified byte-byte conversion." << std::endl; + } else { + diskann::cout << "Conversion failed!!! Found " << mismatchCount + << " mismatches in vector elements" << std::endl; + } + diskann::cout << "Successfully verified binary conversion." << std::endl; +} + +template +std::vector getVector(const std::string& str, + T convertFn(const std::string& val)) { + auto idsAndVector = splitLine(str, '\t', suggestedSize); + + std::vector typedVec; + typedVec.reserve(suggestedSize); + + if (idsAndVector.size() >= 3) { + auto strVec = splitLine(idsAndVector[2], ',', suggestedSize); + std::transform( + strVec.begin(), strVec.end(), std::back_inserter(typedVec), + [&convertFn](const std::string& str) { return convertFn(str); }); + } else { + std::cerr << "Found line " << str + << " that didn't have standard delimiters." << std::endl; + } + return typedVec; +} + +template +void convert(const char* infile, const char* outfile, + T convertFn(const std::string& val), uint32_t suggestedSize) { + uint32_t numDimensions = getDimension(infile, convertFn); + uint32_t numPoints = 0; + + std::vector> allVecs; + allVecs.reserve(suggestedSize > 0 ? suggestedSize : 1); + + // T* data = new T[((uint64_t) numDimensions) * numPoints]; + // int index = 0; + + std::ifstream fin(infile); + std::string line; + int lc = 0; + while (std::getline(fin, line)) { + lc++; + auto vector = getVector(line, convertFn, numDimensions); + if (vector.size() != 0) { + if (vector.size() != numDimensions) { + std::stringstream stream; + stream << "Found vector with dimension " << vector.size() + << " instead of " << numDimensions << " at line: " << lc; + throw diskann::ANNException(stream.str(), -1); + } + allVecs.push_back(vector); + if (allVecs.size() % 10000 == 0) { + diskann::cout << "Processed " << allVecs.size() << " records." + << std::endl; + } + // std::for_each(vector.begin(), vector.end(), + // [data, &index](const T& v) { + // data[index] = v; + // index++; + // }); + } + + // if ((index / numDimensions) % 5000 == 0) { + // diskann::cout << "Processed " << index / numDimensions << " + // records." + // << std::endl; + //} + } + + // writeBinary(outfile, numDimensions, numPoints, data); + writeBinaryVec(outfile, numDimensions, allVecs); + // delete[] data; + + sanityCheck(infile, outfile, numDimensions, (uint32_t) allVecs.size(), + convertFn); +} + +int main(int argc, char** argv) { + if (argc != 5) { + std::cerr << "Usage: " << argv[0] + << " " + "[num_of_points] (use zero to not specify)" + << std::endl; + return -1; + } + + diskann::cout << "Converting (" << argv[1] << ") axon file: " << argv[2] + << " with " << argv[4] << " points to diskann bin format file " + << argv[3] << std::endl; + + std::string datatype(argv[1]); + uint32_t numPoints = (uint32_t)::atoi(argv[4]); + + if (datatype == "uint8") { + convert(argv[2], argv[3], atouLambda, numPoints); + } else if (datatype == "int8") { + convert(argv[2], argv[3], atoiLambda, numPoints); + } else if (datatype == "float") { + convert(argv[2], argv[3], atofLambda, numPoints); + } else { + std::cerr << "Unknown data type " << argv[1] + << ". Supported data types are int8, uint8, and float." + << std::endl; + } +} \ No newline at end of file diff --git a/tests/utils/create_disk_layout.cpp b/tests/utils/create_disk_layout.cpp index ac378272d8..bb4ea2db6d 100644 --- a/tests/utils/create_disk_layout.cpp +++ b/tests/utils/create_disk_layout.cpp @@ -13,30 +13,40 @@ #include "utils.h" template -int create_disk_layout(int argc, char **argv) { - if (argc != 5) { - std::cout << argv[0] << " data_type data_bin " - "vamana_index_file output_diskann_index_file" - << std::endl; - exit(-1); - } - std::string base_file(argv[2]); - std::string vamana_file(argv[3]); - std::string output_file(argv[4]); - diskann::create_disk_layout(base_file, vamana_file, output_file); +int create_disk_layout(char **argv) { + std::string vamana_file(argv[2]); + std::string base_file(argv[3]); + std::string tags_file(argv[4]); + std::string pq_pivots_file(argv[5]); + std::string pq_vectors_file(argv[6]); + std::string output_file(argv[7]); + bool single_index_flag = false; + if (base_file == "null") + single_index_flag = true; + diskann::create_disk_layout(vamana_file, base_file, "", + pq_pivots_file, pq_vectors_file, + single_index_flag, output_file); return 0; } int main(int argc, char **argv) { + if (argc != 8) { + diskann::cout << argv[0] + << " data_type vamana_index_file " + " data_file tags_bin pq_pivots_file pq_vectors_file " + "output_diskann_file" + << std::endl; + exit(-1); + } int ret_val = -1; if (std::string(argv[1]) == std::string("float")) - ret_val = create_disk_layout(argc, argv); + ret_val = create_disk_layout(argv); else if (std::string(argv[1]) == std::string("int8")) - ret_val = create_disk_layout(argc, argv); + ret_val = create_disk_layout(argv); else if (std::string(argv[1]) == std::string("uint8")) - ret_val = create_disk_layout(argc, argv); + ret_val = create_disk_layout(argv); else { - std::cout << "unsupported type. use int8/uint8/float " << std::endl; + diskann::cout << "unsupported type. use int8/uint8/float " << std::endl; ret_val = -2; } return ret_val; diff --git a/tests/utils/extract_rows.cpp b/tests/utils/extract_rows.cpp new file mode 100644 index 0000000000..ff05e72343 --- /dev/null +++ b/tests/utils/extract_rows.cpp @@ -0,0 +1,143 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include "utils.h" +#include "extract_rows.h" + +using namespace std; + +template +void extract_rows(const std::string& input_file, _u64 nrows, _u64 ndims, + _u64 offset, _u64 nrows_to_extract, + const std::string& output_file, bool has_id, + bool replace_content) { + std::cout << "Trying to extract: " << nrows_to_extract << " rows of " + << typeid(T).name() << " data in " << ndims + << " dimensions from offset: " << offset + << " and saving to file: " << output_file << "..."; + std::ifstream fin; + fin.open(input_file, std::ios::binary); + + _u32 rows32 = (_u32) nrows_to_extract, dims32 = (_u32) ndims; + std::ofstream fout(output_file, std::ios::binary); + fout.write((const char*) &rows32, sizeof(uint32_t)); + fout.write((const char*) &dims32, sizeof(uint32_t)); + + T* data = new T[nrows_to_extract * ndims]; + if (replace_content) { + std::cout << std::endl << "Replacing file content with random values..."; + srand((unsigned int) time((time_t*) nullptr)); + for (int i = 0; i < nrows_to_extract * ndims; i++) { + // since we won't allow replace_content if datatype != float, we can + // assume that T is float always. + data[i] = (T)(rand() / RAND_MAX); + } + std::cout << nrows_to_extract * ndims << " values replaced. " << std::endl; + } else { + fin.seekg(2 * sizeof(_u32) + offset * ndims * sizeof(T)); + fin.read((char*) data, nrows_to_extract * ndims * sizeof(T)); + } + + fout.write((const char*) data, nrows_to_extract * ndims * sizeof(T)); + + if (has_id) { + _u64* tags = new _u64[nrows_to_extract]; + _u64 tag_start = + 2 * sizeof(_u32) + nrows * ndims * sizeof(T) + offset * sizeof(_u64); + fin.seekg(tag_start); + fin.read((char*) tags, nrows_to_extract * sizeof(_u64)); + fout.write((const char*) tags, nrows_to_extract * sizeof(_u64)); + delete[] tags; + } + fout.close(); + fin.close(); + delete[] data; + + std::cout << " done." << std::endl; +} + +int main(int argc, char* argv[]) { + if (argc != 6 && argc != 7 && argc != 8) { + std::cout + << "Usage: (uint8|int8|float) " + "<#_rows_to_extract> " + "(zero if beginning) [has_tags(true/false) default is " + "false, file doesn't have ids.] [replace_random (true/false) " + "default is false, i.e.don't replace file content with random data]" + << std::endl; + } + + int count = 1; + std::string input_file = argv[count++]; + std::string datatype = argv[count++]; + uint64_t nrows_to_extract = atoi(argv[count++]); + uint64_t offset = atoi(argv[count++]); + std::string output_file = argv[count++]; + bool has_id = false; + bool replace_content = false; + + if (argc >= 7) { + if (std::string(argv[count++]) == "true") { + has_id = true; + } + } + if (argc >= 8) { + if (std::string(argv[count++]) == "true") { + if (!has_id || datatype != "float") { + std::cout << "Can replace content ONLY if has_id is true and datatype " + "== float. " + << std::endl; + return -6; + } else { + replace_content = true; + } + } + } + + if (!file_exists(input_file)) { + std::cerr << "Input file: " << input_file << " does not exist. Terminating." + << std::endl; + return -1; + } + uint64_t nrows, ncols; + diskann::get_bin_metadata(input_file, nrows, ncols, 0); + + if (nrows_to_extract > nrows) { + std::cerr << "Number of rows in file: " << nrows + << " is less than num rows to extract: " << nrows_to_extract + << std::endl; + return -2; + } + if (offset > nrows) { + std::cerr << "Start offset " << offset + << " is greater than or equal to rows in file: " << nrows + << std::endl; + return -3; + } + if (offset + nrows_to_extract > nrows) { + std::cerr << "Sum of start offset: " << offset + << " and # rows to extract: " << nrows_to_extract + << " is greater than or equal to rows in file: " << nrows + << std::endl; + return -4; + } + + if (datatype == "uint8") { + extract_rows(input_file, nrows, ncols, offset, nrows_to_extract, + output_file, has_id, replace_content); + } else if (datatype == "int8") { + extract_rows(input_file, nrows, ncols, offset, nrows_to_extract, + output_file, has_id, replace_content); + } else if (datatype == "float") { + extract_rows(input_file, nrows, ncols, offset, nrows_to_extract, + output_file, has_id, replace_content); + + } else { + std::cerr << "Unknown datatype: " << datatype; + return -5; + } + + return 0; +} \ No newline at end of file diff --git a/tests/utils/fvecs_to_bin.cpp b/tests/utils/fvecs_to_bin.cpp index d5c7fe4bab..c26cf1d462 100644 --- a/tests/utils/fvecs_to_bin.cpp +++ b/tests/utils/fvecs_to_bin.cpp @@ -3,6 +3,7 @@ #include #include "utils.h" +#include "logger.h" void block_convert(std::ifstream& reader, std::ofstream& writer, float* read_buf, float* write_buf, _u64 npts, _u64 ndims) { @@ -17,7 +18,7 @@ void block_convert(std::ifstream& reader, std::ofstream& writer, int main(int argc, char** argv) { if (argc != 3) { - std::cout << argv[0] << " input_fvecs output_bin" << std::endl; + diskann::cout << argv[0] << " input_fvecs output_bin" << std::endl; exit(-1); } std::ifstream reader(argv[1], std::ios::binary | std::ios::ate); @@ -29,12 +30,12 @@ int main(int argc, char** argv) { reader.seekg(0, std::ios::beg); _u64 ndims = (_u64) ndims_u32; _u64 npts = fsize / ((ndims + 1) * sizeof(float)); - std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims - << std::endl; + diskann::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims + << std::endl; _u64 blk_size = 131072; _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; - std::cout << "# blks: " << nblks << std::endl; + diskann::cout << "# blks: " << nblks << std::endl; std::ofstream writer(argv[2], std::ios::binary); int npts_s32 = (_s32) npts; int ndims_s32 = (_s32) ndims; @@ -45,7 +46,7 @@ int main(int argc, char** argv) { for (_u64 i = 0; i < nblks; i++) { _u64 cblk_size = std::min(npts - i * blk_size, blk_size); block_convert(reader, writer, read_buf, write_buf, cblk_size, ndims); - std::cout << "Block #" << i << " written" << std::endl; + diskann::cout << "Block #" << i << " written" << std::endl; } delete[] read_buf; diff --git a/tests/utils/gen_random_slice.cpp b/tests/utils/gen_random_slice.cpp index 0417c12c0d..27f7fec9dc 100644 --- a/tests/utils/gen_random_slice.cpp +++ b/tests/utils/gen_random_slice.cpp @@ -21,14 +21,7 @@ #include template -int aux_main(int argc, char** argv) { - if (argc != 5) { - std::cout << argv[0] << " data_type [fliat/int8/uint8] base_bin_file " - "sample_output_prefix sampling_probability" - << std::endl; - exit(-1); - } - +int aux_main(char** argv) { std::string base_file(argv[2]); std::string output_prefix(argv[3]); float sampling_rate = (float) (std::atof(argv[4])); @@ -37,13 +30,21 @@ int aux_main(int argc, char** argv) { } int main(int argc, char** argv) { + if (argc != 5) { + diskann::cout << argv[0] + << " data_type [float/int8/uint8] base_bin_file " + "sample_output_prefix sampling_probability" + << std::endl; + exit(-1); + } + if (std::string(argv[1]) == std::string("float")) { - aux_main(argc, argv); + aux_main(argv); } else if (std::string(argv[1]) == std::string("int8")) { - aux_main(argc, argv); + aux_main(argv); } else if (std::string(argv[1]) == std::string("uint8")) { - aux_main(argc, argv); + aux_main(argv); } else - std::cout << "Unsupported type. Use float/int8/uint8." << std::endl; + diskann::cout << "Unsupported type. Use float/int8/uint8." << std::endl; return 0; } diff --git a/tests/utils/generate_pq.cpp b/tests/utils/generate_pq.cpp index 9e7a37c597..4279df05d8 100644 --- a/tests/utils/generate_pq.cpp +++ b/tests/utils/generate_pq.cpp @@ -13,20 +13,22 @@ bool generate_pq(const std::string& data_path, const float sampling_rate) { std::string pq_pivots_path = index_prefix_path + "_pq_pivots.bin"; std::string pq_compressed_vectors_path = - index_prefix_path + "_compressed.bin"; + index_prefix_path + "_pq_compressed.bin"; // generates random sample and sets it to train_data and updates train_size size_t train_size, train_dim; float* train_data; gen_random_slice(data_path, sampling_rate, train_data, train_size, train_dim); - std::cout << "For computing pivots, loaded sample data of size " << train_size - << std::endl; + diskann::cout << "For computing pivots, loaded sample data of size " + << train_size << std::endl; - generate_pq_pivots(train_data, train_size, train_dim, num_pq_centers, - num_pq_chunks, KMEANS_ITERS_FOR_PQ, pq_pivots_path); - generate_pq_data_from_pivots(data_path, num_pq_centers, num_pq_chunks, - pq_pivots_path, pq_compressed_vectors_path); + generate_pq_pivots(train_data, train_size, (_u32) train_dim, + (_u32) num_pq_centers, (_u32) num_pq_chunks, + KMEANS_ITERS_FOR_PQ, pq_pivots_path); + generate_pq_data_from_pivots(data_path, (_u32) num_pq_centers, + (_u32) num_pq_chunks, pq_pivots_path, + pq_compressed_vectors_path); delete[] train_data; @@ -35,7 +37,7 @@ bool generate_pq(const std::string& data_path, int main(int argc, char** argv) { if (argc != 6) { - std::cout + diskann::cout << "Usage: \n" << argv[0] << " " @@ -46,7 +48,7 @@ int main(int argc, char** argv) { const std::string index_prefix_path(argv[3]); const size_t num_pq_centers = 256; const size_t num_pq_chunks = (size_t) atoi(argv[4]); - const float sampling_rate = atof(argv[5]); + const float sampling_rate = (float) atof(argv[5]); if (std::string(argv[1]) == std::string("float")) generate_pq(data_path, index_prefix_path, num_pq_centers, @@ -58,6 +60,6 @@ int main(int argc, char** argv) { generate_pq(data_path, index_prefix_path, num_pq_centers, num_pq_chunks, sampling_rate); else - std::cout << "Error. wrong file type" << std::endl; + diskann::cout << "Error. wrong file type" << std::endl; } } diff --git a/tests/utils/int8_to_float.cpp b/tests/utils/int8_to_float.cpp index 3a62ea5749..e654b1874a 100644 --- a/tests/utils/int8_to_float.cpp +++ b/tests/utils/int8_to_float.cpp @@ -6,7 +6,7 @@ int main(int argc, char** argv) { if (argc != 3) { - std::cout << argv[0] << " input_int8_bin output_float_bin" << std::endl; + diskann::cout << argv[0] << " input_int8_bin output_float_bin" << std::endl; exit(-1); } diff --git a/tests/utils/ivecs_to_bin.cpp b/tests/utils/ivecs_to_bin.cpp index e42eeae7ee..28bcedd2d2 100644 --- a/tests/utils/ivecs_to_bin.cpp +++ b/tests/utils/ivecs_to_bin.cpp @@ -17,7 +17,7 @@ void block_convert(std::ifstream& reader, std::ofstream& writer, _u32* read_buf, int main(int argc, char** argv) { if (argc != 3) { - std::cout << argv[0] << " input_ivecs output_bin" << std::endl; + diskann::cout << argv[0] << " input_ivecs output_bin" << std::endl; exit(-1); } std::ifstream reader(argv[1], std::ios::binary | std::ios::ate); @@ -29,12 +29,12 @@ int main(int argc, char** argv) { reader.seekg(0, std::ios::beg); _u64 ndims = (_u64) ndims_u32; _u64 npts = fsize / ((ndims + 1) * sizeof(_u32)); - std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims - << std::endl; + diskann::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims + << std::endl; _u64 blk_size = 131072; _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; - std::cout << "# blks: " << nblks << std::endl; + diskann::cout << "# blks: " << nblks << std::endl; std::ofstream writer(argv[2], std::ios::binary); int npts_s32 = (_s32) npts; int ndims_s32 = (_s32) ndims; @@ -45,7 +45,7 @@ int main(int argc, char** argv) { for (_u64 i = 0; i < nblks; i++) { _u64 cblk_size = std::min(npts - i * blk_size, blk_size); block_convert(reader, writer, read_buf, write_buf, cblk_size, ndims); - std::cout << "Block #" << i << " written" << std::endl; + diskann::cout << "Block #" << i << " written" << std::endl; } delete[] read_buf; diff --git a/tests/utils/merge_shards.cpp b/tests/utils/merge_shards.cpp index 2f9eadec07..f6ce017649 100644 --- a/tests/utils/merge_shards.cpp +++ b/tests/utils/merge_shards.cpp @@ -16,7 +16,7 @@ int main(int argc, char **argv) { if (argc != 9) { - std::cout + diskann::cout << argv[0] << " vamana_index_prefix[1] vamana_index_suffix[2] idmaps_prefix[3] " "idmaps_suffix[4] n_shards[5] max_degree[6] output_vamana_path[7] " diff --git a/tests/utils/normalize_data.cpp b/tests/utils/normalize_data.cpp new file mode 100644 index 0000000000..ca74265912 --- /dev/null +++ b/tests/utils/normalize_data.cpp @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include "utils.h" + +void block_convert(std::ofstream& writr, std::ifstream& readr, float* read_buf, + _u64 npts, _u64 ndims) { + readr.read((char*) read_buf, npts * ndims * sizeof(float)); + _u32 ndims_u32 = (_u32) ndims; +#pragma omp parallel for + for (_s64 i = 0; i < (_s64) npts; i++) { + float norm_pt = std::numeric_limits::epsilon(); + for (_u32 dim = 0; dim < ndims_u32; dim++) { + norm_pt += *(read_buf + i * ndims + dim) * *(read_buf + i * ndims + dim); + } + norm_pt = std::sqrt(norm_pt); + for (_u32 dim = 0; dim < ndims_u32; dim++) { + *(read_buf + i * ndims + dim) = *(read_buf + i * ndims + dim) / norm_pt; + } + } + writr.write((char*) read_buf, npts * ndims * sizeof(float)); +} + +int main(int argc, char** argv) { + if (argc != 3) { + diskann::cout << argv[0] + << ": [input_bin (float data)] [output_bin (float data)] " + << std::endl; + exit(-1); + } + std::ifstream readr(argv[1], std::ios::binary); + int npts_s32; + int ndims_s32; + readr.read((char*) &npts_s32, sizeof(_s32)); + readr.read((char*) &ndims_s32, sizeof(_s32)); + // size_t npt = npts_s32; + // size_t ndim = ndims_s32; + _u32 ndims_u32 = (_u32) ndims_s32; + _u32 npts_u32 = (_u32) npts_s32; + // readr.seekg(0, std::ios::end); + //_u64 fsize = readr.tellg(); + + std::ofstream writr(argv[2], std::ios::binary); + writr.write((char*) &npts_s32, sizeof(_s32)); + writr.write((char*) &ndims_s32, sizeof(_s32)); + + // writr.write((char*) &ndims_u32, sizeof(unsigned)); + // writr.seekg(0, std::ios::beg); + _u64 ndims = (_u64) ndims_u32; + _u64 npts = (_u64) npts_u32; + diskann::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims + << std::endl; + + _u64 blk_size = 131072; + _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + diskann::cout << "# blks: " << nblks << std::endl; + + float* read_buf = new float[npts * ndims]; + for (_u64 i = 0; i < nblks; i++) { + _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + block_convert(writr, readr, read_buf, cblk_size, ndims); + diskann::cout << "Block #" << i << " written" << std::endl; + } + delete[] read_buf; + writr.close(); + readr.close(); +} diff --git a/tests/utils/partition_data.cpp b/tests/utils/partition_data.cpp index 63476b15e2..0cc2ad46d8 100644 --- a/tests/utils/partition_data.cpp +++ b/tests/utils/partition_data.cpp @@ -10,17 +10,18 @@ int main(int argc, char** argv) { if (argc != 7) { - std::cout << "Usage:\n" - << argv[0] << " datatype " - " " - " " - << std::endl; + diskann::cout << "Usage:\n" + << argv[0] + << " datatype " + " " + " " + << std::endl; exit(-1); } const std::string data_path(argv[2]); const std::string prefix_path(argv[3]); - const float sampling_rate = atof(argv[4]); + const float sampling_rate = (float) atof(argv[4]); const size_t num_partitions = (size_t) std::atoi(argv[5]); const size_t max_reps = 15; const size_t k_index = (size_t) std::atoi(argv[6]); @@ -35,5 +36,6 @@ int main(int argc, char** argv) { partition(data_path, sampling_rate, num_partitions, max_reps, prefix_path, k_index); else - std::cout << "unsupported data format. use float/int8/uint8" << std::endl; + diskann::cout << "unsupported data format. use float/int8/uint8" + << std::endl; } diff --git a/tests/utils/partition_with_ram_budget.cpp b/tests/utils/partition_with_ram_budget.cpp index fee3c84e82..296e70153d 100644 --- a/tests/utils/partition_with_ram_budget.cpp +++ b/tests/utils/partition_with_ram_budget.cpp @@ -10,17 +10,18 @@ int main(int argc, char** argv) { if (argc != 8) { - std::cout << "Usage:\n" - << argv[0] << " datatype " - " " - " " - << std::endl; + diskann::cout << "Usage:\n" + << argv[0] + << " datatype " + " " + " " + << std::endl; exit(-1); } const std::string data_path(argv[2]); const std::string prefix_path(argv[3]); - const float sampling_rate = atof(argv[4]); + const float sampling_rate = (float) atof(argv[4]); const double ram_budget = (double) std::atof(argv[5]); const size_t graph_degree = (size_t) std::atoi(argv[6]); const size_t k_index = (size_t) std::atoi(argv[7]); @@ -35,5 +36,6 @@ int main(int argc, char** argv) { partition_with_ram_budget(data_path, sampling_rate, ram_budget, graph_degree, prefix_path, k_index); else - std::cout << "unsupported data format. use float/int8/uint8" << std::endl; + diskann::cout << "unsupported data format. use float/int8/uint8" + << std::endl; } diff --git a/tests/utils/prep_index_merger.sh b/tests/utils/prep_index_merger.sh new file mode 100644 index 0000000000..76a9a35ec0 --- /dev/null +++ b/tests/utils/prep_index_merger.sh @@ -0,0 +1,21 @@ +BASE_PREFIX="/dev/shm/test/sample_base" +MEM_PREFIX="/dev/shm/test/sample_mem" +DELETE_LIST="/dev/shm/sample_deleted.tags" +ONESHOT_PREFIX="/dev/shm/test/sample_oneshot" +MERGED_PREFIX="/dev/shm/test/sample_merged" +NUM_MEM_INDICES=5 +# copy tags from base -> base_index +cp ${BASE_PREFIX}.tags ${BASE_PREFIX}_index_disk.index.tags +cp ${ONESHOT_PREFIX}.tags ${ONESHOT_PREFIX}_index_disk.index.tags + +# copy tags file for mem indices +for i in $(seq 1 $NUM_MEM_INDICES) +do + cp ${MEM_PREFIX}_${i}.tags ${MEM_PREFIX}_${i}_index.tags +done + +# copy PQ stuff for merged from base +cp ${BASE_PREFIX}_index_pq_pivots.bin ${MERGED_PREFIX}_index_pq_pivots.bin +cp ${BASE_PREFIX}_index_pq_pivots.bin_centroid.bin ${MERGED_PREFIX}_index_pq_pivots.bin_centroid.bin +cp ${BASE_PREFIX}_index_pq_pivots.bin_chunk_offsets.bin ${MERGED_PREFIX}_index_pq_pivots.bin_chunk_offsets.bin +cp ${BASE_PREFIX}_index_pq_pivots.bin_rearrangement_perm.bin ${MERGED_PREFIX}_index_pq_pivots.bin_rearrangement_perm.bin diff --git a/tests/utils/script.sh b/tests/utils/script.sh new file mode 100644 index 0000000000..5cdca72927 --- /dev/null +++ b/tests/utils/script.sh @@ -0,0 +1,56 @@ +#BASE_FILE=/home/t-adisin/sift_base.bin +#QUERY_FILE=/home/t-adisin/sift_query.bin +#GT_FILE=~/gs500_sift1m +#NUM_BASE=900000 +#NUM_DELETE=50000 +#NUM_INCR=50000 +#NUM_CYCLES=30 +#SAVE_PATH=/mnt/rakri/save/SIFT1M +#LOGFILE=~/sift1m_${NUM_BASE}_${NUM_DELETE}_${NUM_INCR}_${NUM_CYCLES} + +BASE_FILE=/mnt/aditi/datasets/sift_rnd100m_data.bin +QUERY_FILE=/home/t-adisin/datasets/bigann_query_float.bin +GT_FILE=~/gs500_sift100m +NUM_BASE=90000000 +NUM_DELETE=4500000 +NUM_INCR=4500000 +NUM_CYCLES=50 +SAVE_PATH=/mnt/rakri/save/SIFT100M +LOGFILE=~/sift100m_${NUM_BASE}_${NUM_DELETE}_${NUM_INCR}_${NUM_CYCLES} + +WORKING_PATH=/mnt/rakri/test3/ +#WORKING_PATH=/dev/shm/test4 + +INDEX_FILE=merger_index_${NUM_BASE}_${NUM_DELETE}_${NUM_INCR}_${NUM_CYCLES} + +#rm -rf /mnt/rakri/*pq* +./tests/utils/seed_index_merger float $NUM_BASE 1 $NUM_DELETE $NUM_INCR $NUM_CYCLES $BASE_FILE ${SAVE_PATH}/${INDEX_FILE} ${SAVE_PATH}/${INDEX_FILE}_deleted.tags 2>&1 0${LOGFILE}_build.log + + +# train indices +numactl --interleave=all ./tests/build_disk_index float ${SAVE_PATH}/${INDEX_FILE}_base.data ${WORKING_PATH}/${INDEX_FILE}_cycle_0 64 75 100 500 64 2>&1 0>${LOGFILE}_build.log +cp ${SAVE_PATH}/${INDEX_FILE}_base.tags ${WORKING_PATH}/${INDEX_FILE}_cycle_0_disk.index.tags + +mkdir $SAVE_PATH/base_copy/ +cp ${WORKING_PATH}/${INDEX_FILE}_cycle_0* $SAVE_PATH/base_copy/ + +#./tests/utils/compute_groundtruth float $BASE_FILE $QUERY_FILE 500 $GT_FILE + +# search on base index +numactl --interleave=all ./tests/search_disk_index float $WORKING_PATH/${INDEX_FILE}_cycle_0 100000 32 4 $QUERY_FILE $GT_FILE 10 /tmp/abc 100 2>&1 0${LOGFILE}_search.log + +for (( c=0; c<$NUM_CYCLES; c++ )) +do + ((nextc = c + 1)) + cp ${SAVE_PATH}/${INDEX_FILE}_cycle_${nextc}_mem_1.data $WORKING_PATH/ + cp ${SAVE_PATH}/${INDEX_FILE}_cycle_${nextc}_mem_1.tags $WORKING_PATH/ + cp ${SAVE_PATH}/${INDEX_FILE}_deleted.tags_cycle_${nextc} $WORKING_PATH/ + numactl --interleave=all ./tests/build_memory_index float $WORKING_PATH/${INDEX_FILE}_cycle_${nextc}_mem_1.data $WORKING_PATH/${INDEX_FILE}_cycle_${nextc}_mem_1.index 64 75 1.2 64 + cp $WORKING_PATH/${INDEX_FILE}_cycle_${nextc}_mem_1.tags $WORKING_PATH/${INDEX_FILE}_cycle_${nextc}_mem_1.index.tags 2>&1 0>${LOGFILE}_build.log + /usr/bin/time numactl --interleave=all ./tests/test_index_merger float $WORKING_PATH/${INDEX_FILE}_cycle_${c} $WORKING_PATH/${INDEX_FILE}_cycle_${nextc} $WORKING_PATH/${INDEX_FILE}_deleted.tags_cycle_${nextc} 128 4 64 70 1.2 1000 $WORKING_PATH $WORKING_PATH/${INDEX_FILE}_cycle_${nextc}_mem_1.index 2>&1 0>${LOGFILE}_build.log + numactl --interleave=all ./tests/search_disk_index float $WORKING_PATH/${INDEX_FILE}_cycle_${nextc} 100000 32 4 $QUERY_FILE $GT_FILE 10 /tmp/def 100 2>&1 0>${LOGFILE}_search.log + sudo rm -rf $WORKING_PATH/${INDEX_FILE}_cycle_${c}_* + rm -rf $SAVE_PATH/${INDEX_FILE}_cycle_${c}_* + cp $WORKING_PATH/${INDEX_FILE}_cycle_${nextc}* $SAVE_PATH/ +done + diff --git a/tests/utils/seed_index_merger.cpp b/tests/utils/seed_index_merger.cpp new file mode 100644 index 0000000000..358477c23a --- /dev/null +++ b/tests/utils/seed_index_merger.cpp @@ -0,0 +1,219 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "utils.h" + +#include +#include +#include +#include +#include +#include +#include "tsl/robin_set.h" + +#define ENTRY_POINT 52292725 +//#define ENTRY_POINT 123742 + +template +void dump_to_disk(const T *all_pts, const uint64_t ndims, + const std::string & filename, + const std::vector &tags) { + T * new_data = new T[ndims * tags.size()]; + TagT *new_tags = new TagT[tags.size()]; + + std::string tag_filename = filename + ".tags"; + std::string data_filename = filename + ".data"; + diskann::cout << "# points : " << tags.size() << "\n"; + diskann::cout << "Tag file : " << tag_filename << "\n"; + diskann::cout << "Data file : " << data_filename << "\n"; + + std::ofstream tag_writer(tag_filename); + for (uint64_t i = 0; i < tags.size(); i++) { + // tag_writer << tags[i] << std::endl; + *(new_tags + i) = tags[i]; + memcpy(new_data + (i * ndims), all_pts + (tags[i] * ndims), + ndims * sizeof(float)); + } + // tag_writer.close(); + diskann::save_bin(tag_filename, new_tags, tags.size(), 1); + diskann::save_bin(data_filename, new_data, tags.size(), ndims); + delete new_data; + delete new_tags; +} + +template +void run(const uint32_t base_count, const uint32_t num_mem_indices, + const uint32_t delete_count, const uint32_t incr_count, + const uint32_t num_cycles, const std::string &in_file, + const std::string &out_prefix, const std::string &deleted_tags_file) { + // random number generator + std::random_device dev; + std::mt19937 rng(dev()); + + T * all_points = nullptr; + uint64_t npts, ndims; + diskann::load_bin(in_file, all_points, npts, ndims); + diskann::cout << "Loaded " << npts << " pts x " << ndims << " dims\n"; + // assert(npts >= base_count + num_mem_indices); + + std::vector tags(npts); + std::iota(tags.begin(), tags.end(), 0); + + diskann::cout << "Base Index : choosing " << base_count << " points\n"; + std::vector base_tags(tags.begin(), tags.begin() + base_count); + + tsl::robin_set active_tags; + tsl::robin_set inactive_tags; + + tsl::robin_set new_active_tags; + tsl::robin_set new_inactive_tags; + + for (uint32_t i = 0; i < base_count; i++) { + active_tags.insert(i); + } + + for (uint32_t i = base_count; i < npts; i++) { + inactive_tags.insert(i); + } + + diskann::cout << "Dumping base set \n"; + // write base + dump_to_disk(all_points, ndims, out_prefix + "_base", base_tags); + + std::vector delete_vec; + std::vector insert_vec; + uint32_t count = 0; + while (count++ < num_cycles) { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution dis(0, 1); + + new_active_tags.clear(); + new_inactive_tags.clear(); + + delete_vec.clear(); + insert_vec.clear(); + + float active_tags_sampling_rate = (float) ((std::min)( + (1.0 * delete_count) / (1.0 * ((double) active_tags.size())), 1.0)); + + for (auto iter = active_tags.begin(); iter != active_tags.end(); iter++) { + if (dis(gen) < active_tags_sampling_rate && *iter != ENTRY_POINT) { + delete_vec.emplace_back(*iter); + new_inactive_tags.insert(*iter); + } else + new_active_tags.insert(*iter); + } + + float inactive_tags_sampling_rate = (float) ((std::min)( + (1.0 * incr_count) / (1.0 * ((double) inactive_tags.size())), 1.0)); + + for (auto iter = inactive_tags.begin(); iter != inactive_tags.end(); + iter++) { + if (dis(gen) < inactive_tags_sampling_rate) { + insert_vec.emplace_back(*iter); + new_active_tags.insert(*iter); + } else + new_inactive_tags.insert(*iter); + } + + diskann::cout << "Merge program will insert " << insert_vec.size() + << " points and delete " << delete_vec.size() + << " points in round " << count << std::endl; + + active_tags.swap(new_active_tags); + inactive_tags.swap(new_inactive_tags); + + // TODO (correct) :: enable shuffling tags for better randomness + // std::shuffle(tags.begin(), tags.end(), rng); + + // split tags + + const uint64_t mem_count = + ROUND_UP(insert_vec.size(), num_mem_indices) / num_mem_indices; + + std::vector> mem_tags(num_mem_indices); + uint64_t cur_start = 0; + for (uint64_t i = 0; i < num_mem_indices; i++) { + std::vector &ith_tags = mem_tags[i]; + uint64_t new_start = std::min(cur_start + mem_count, insert_vec.size()); + diskann::cout << "Index #" << i + 1 << " : choosing " + << new_start - cur_start << " points\n"; + ith_tags.insert(ith_tags.end(), insert_vec.begin() + cur_start, + insert_vec.begin() + new_start); + cur_start = new_start; + } + + // write mem + for (uint64_t i = 0; i < num_mem_indices; i++) { + diskann::cout << "Dumping mem set #" << i + 1 << "\n"; + dump_to_disk(all_points, ndims, + out_prefix + "_cycle_" + std::to_string(count) + "_mem_" + + std::to_string(i + 1), + mem_tags[i]); + } + + // re-shuffle tags to get delete list + // std::shuffle(tags.begin(), tags.end(), rng); + std::ofstream deleted_tags_writer(deleted_tags_file + "_cycle_" + + std::to_string(count)); + for (uint64_t i = 0; i < delete_vec.size(); i++) { + deleted_tags_writer << delete_vec[i] << std::endl; + } + deleted_tags_writer.close(); + + // add remaining tags to final list + // std::vector rem_tags(tags.begin() + delete_count, tags.end()); + // std::sort(rem_tags.begin(), rem_tags.end()); + // write mem + // diskann::cout << "Dumping {all} \\ {deleted} set\n"; + // dump_to_disk(all_points, ndims, out_prefix + "_oneshot", rem_tags); + } + // free all points + delete all_points; +} + +int main(int argc, char **argv) { + if (argc != 10) { + diskann::cout << "Correct usage: " << argv[0] + << " " + << " " + " " + << std::endl; + exit(-1); + } + diskann::cout.setf(std::ios::unitbuf); + + int arg_no = 1; + std::string index_type = argv[arg_no++]; + const uint32_t base_count = std::atoi(argv[arg_no++]); + diskann::cout << "# base points : " << base_count << "\n"; + const uint32_t num_mem_indices = std::atoi(argv[arg_no++]); + diskann::cout << "# mem indices : " << num_mem_indices << "\n"; + const uint32_t delete_count = std::atoi(argv[arg_no++]); + diskann::cout << "# deleted tags per cycle : " << delete_count << "\n"; + const uint32_t incr_count = std::atoi(argv[arg_no++]); + diskann::cout << "# inserted tags per cycle : " << incr_count << "\n"; + const uint32_t num_cycles = std::atoi(argv[arg_no++]); + diskann::cout << "# cycles : " << num_cycles << "\n"; + const std::string in_file = argv[arg_no++]; + diskann::cout << "In file : " << in_file << "\n"; + const std::string out_prefix = argv[arg_no++]; + diskann::cout << "Out prefix : " << out_prefix << "\n"; + const std::string deleted_tags_file = argv[arg_no++]; + diskann::cout << "Deleted tags file prefix : " << deleted_tags_file << "\n"; + + if (index_type == std::string("float")) { + run(base_count, num_mem_indices, delete_count, incr_count, + num_cycles, in_file, out_prefix, deleted_tags_file); + } else if (index_type == std::string("uint8")) { + run(base_count, num_mem_indices, delete_count, incr_count, + num_cycles, in_file, out_prefix, deleted_tags_file); + } else if (index_type == std::string("int8")) { + run(base_count, num_mem_indices, delete_count, incr_count, + num_cycles, in_file, out_prefix, deleted_tags_file); + } else { + diskann::cout << "Unsupported type : " << index_type << "\n"; + } + diskann::cout << "Exiting\n"; +} diff --git a/tests/utils/test_l2_avx.cpp b/tests/utils/test_l2_avx.cpp new file mode 100644 index 0000000000..e315d99ca2 --- /dev/null +++ b/tests/utils/test_l2_avx.cpp @@ -0,0 +1,482 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "utils.h" +#include "distance.h" +#include "logger.h" + +// 7-- OpenMP thread pool test + +void testOpenMPThreadPool() { + std::vector vec(8192); + std::iota(vec.begin(), vec.end(), 1); + std::vector squares(8192); + std::vector resource(8); + +#pragma omp parallel for schedule(dynamic, 64) num_threads(8) + for (int i = 0; i < vec.size(); i++) { + squares[i] = vec[i] * vec[i]; + resource[omp_get_thread_num()] = omp_get_thread_num(); + } + + // Anything to prevent the above code from being optimized away. + for (int i = 0; i < 8192; i++) { + if (i % 1000 == 0) { + std::cout << i << squares[i] << std::endl; + } + } + std::cout << "Omp is running: " << omp_get_num_threads() << std::endl; + +#pragma omp parallel for schedule(dynamic, 64) num_threads(8) + for (int i = 0; i < vec.size(); i++) { + squares[i] = vec[i] * vec[i]; + resource[omp_get_thread_num()] = omp_get_thread_num(); + } + + for (auto id : resource) { + std::cout << id << " "; + } + std::cout << std::endl; + std::cout << "After second omp, " << omp_get_num_threads() << std::endl; +} + +// For flexibility in switching between AVX/AVX2. +bool Avx2SupportedCPU = true; + +// Utility functions. +template +void printArray(T* arr, int size) { + for (int i = 0; i < size; i++) { + std::cout << (int) arr[i] << " "; + } + std::cout << std::endl; +} + +template<> +void printArray(float* arr, int size) { + for (int i = 0; i < size; i++) { + std::cout << arr[i] << " "; + } + std::cout << std::endl; +} + +// Lame but correct distance computations +float distanceL2_I(const int8_t* a, const int8_t* b, size_t size) { + float distance = 0; + for (int i = 0; i < size; i++) { + int16_t diff = ((int16_t) a[i] - (int16_t) b[i]); + distance += diff * diff; + } + return distance; +} + +float distanceL2_F(const float* a, const float* b, size_t size) { + float distance = 0; + for (int i = 0; i < size; i++) { + distance += (a[i] - b[i]) * (a[i] - b[i]); + } + return distance; +} + +float distanceCosine_I(const int8_t* a, const int8_t* b, size_t size) { + float aMag = 0.0f, bMag = 0.0f, scalarProduct = 0.0f; + for (int i = 0; i < size; i++) { + aMag += ((int32_t) a[i]) * ((int32_t) a[i]); + bMag += ((int32_t) b[i]) * ((int32_t) b[i]); + scalarProduct += ((int32_t) a[i]) * ((int32_t) b[i]); + } + std::cout << "aMag: " << aMag << " bMag: " << bMag + << " product: " << scalarProduct << std::endl; + return 1.0f - (float) (scalarProduct / (sqrt(aMag) * sqrt(bMag))); +} +float distanceCosine_F(const float* a, const float* b, size_t size) { + float aMag = 0.0f, bMag = 0.0f, scalarProduct = 0.0f; + for (int i = 0; i < size; i++) { + aMag += a[i] * a[i]; + bMag += b[i] * b[i]; + scalarProduct += a[i] * b[i]; + } + std::cout << "aMag: " << aMag << " bMag: " << bMag + << " product: " << scalarProduct << std::endl; + + return 1.0f - (float) (scalarProduct / (sqrt(aMag) * sqrt(bMag))); +} + +int8_t* createVector(int size) { + auto p = new int8_t[size]; + for (int i = 0; i < size; i++) { + p[i] = 0; + } + return p; +} + +uint8_t* getData(const char* infileName, uint8_t dataTypeSizeInBytes, + int32_t& count, int32_t& dimension) { + std::ifstream infile(infileName, std::ios::binary); + if (!infile.is_open()) { + std::cerr << "Could not open input file: " << infileName << std::endl; + } + + infile.read(reinterpret_cast(&count), sizeof(count)); + infile.read(reinterpret_cast(&dimension), sizeof(dimension)); + + diskann::cout << infileName << ": count: " << count + << " dimensions: " << dimension << std::endl; + + uint64_t sizeToRead = (uint64_t) count * dataTypeSizeInBytes * dimension; + uint8_t* bytes = new uint8_t[sizeToRead]; + infile.read((char*) bytes, sizeToRead); + + return bytes; +} + +void concat_files(int argc, char** argv) { + if (argc < 5) { + diskann::cout + << "Mode 1 requires 2 input files and 1 output file as argument." + << std::endl + << " This will concatenate the contents of the files specified " + "(in the same order) and save them to outfile." + << std::endl; + return; + } + + int dimension1, dimension2, count1, count2; + uint8_t* data1 = getData(argv[2], 1, count1, dimension1); + uint8_t* data2 = getData(argv[3], 1, count2, dimension2); + + if (dimension1 != dimension2) { + diskann::cout << "Error! Cannot combine vectors of differing dimensions (" + << dimension1 << "," << dimension2 << ")" << std::endl; + return; + } + + std::ofstream outFile(argv[4], std::ios::binary); + if (!outFile.is_open()) { + std::cerr << "Could not open output file: " << argv[4] << std::endl; + return; + } + outFile << count1 + count2; + outFile << dimension1; + outFile.write((char*) data1, count1); + outFile.write((char*) data2, count2); + outFile.close(); + + delete[] data1; + delete[] data2; + + diskann::cout << "Concatenated " << (count1 + count2) << " " << dimension1 + << "-dimension vectors from files: " << argv[2] << " and " + << argv[3] << " and saved to output file: " << argv[4] + << std::endl; +} + +void assignPtr(std::unique_ptr& data) { + float* ptr = new float[30]; + for (int i = 0; i < 30; i++) { + ptr[i] = i * 1.0f; + } + + data.reset(ptr); + // std::make_unique(30); +} + +void uniquePtrAssignment() { + std::unique_ptr data; + assignPtr(data); + + for (int i = 0; i < 30; i++) { + diskann::cout << data[i] << " "; + if (data[i] - i > 0.001) { + diskann::cout << data[i] << "," << i << " screwed " << std::endl; + break; + } + } + diskann::cout << std::endl; + diskann::cout << "safe." << std::endl; +} + +float epsilon = 0.01; +const int A_SIZE = 100; +const int A_COUNT = 20; +void compareDistanceComputationsInt() { + // int8_t vec1[] = {127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + // 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + // 127, 127, 127, 127, 127, 127, 127, 127, 127, 127}; + // int8_t vec2[] = {-128, -128, -128, -128, -128, -128, -128, -128, + // -128, -128, -128, -128, -128, -128, -128, -128, + // -128, -128, -128, -128, -128, -128, -128, -128, + // -128, -128, -128, -128, -128, -128, -128, -128}; + + int8_t vec1[A_SIZE], vec2[A_SIZE]; + srand(time(0)); + bool neg = false; + for (int i = 0; i < A_SIZE; i++) { + auto a = rand() % 10; + auto b = rand() % 10; + vec1[i] = -a; // < 0 ? -a : a; + vec2[i] = -b; // < 0 ? -b : b; + + neg = neg || vec1[i] < 0 || vec2[i] < 0; + } + if (!neg) { + diskann::cout << "No negative numbers in test. " << std::endl; + } + + std::cout << "Starting distance computation test for float." << std::endl; + printArray(vec1, 16); + printArray(vec2, 16); + + { + // diskann::DistanceL2Int8 dist; + diskann::AVXDistanceL2Int8 dist; + float dist1 = dist.compare(vec1, vec2, 16); + float dist2 = distanceL2_I(vec1, vec2, 16); + + if (abs(dist1 - dist2) > epsilon) { + std::cout + << "compareDistanceComputationsInt(): L2 Test failed. AVX dist: " + << dist1 << " normal dist: " << dist2 << " difference > " << epsilon + << std::endl; + } else { + std::cout << "Two scores are the same. " << std::endl; + } + } + { + diskann::DistanceCosineInt8 dist; + float dist1 = dist.compare(vec1, vec2, 16); + float dist2 = distanceCosine_I(vec1, vec2, 16); + if (abs(dist1 - dist2) > epsilon) { + std::cout + << "compareDistanceComputationsInt(): Cosine Test failed. AVX dist: " + << dist1 << " normal dist: " << dist2 << " difference > " << epsilon + << std::endl; + } else { + std::cout << "Two scores are the same. " << std::endl; + } + } +} + +void compareDistanceComputationsFloat() { + srand(time(0)); + float a[A_SIZE], b[A_SIZE]; + for (int i = 0; i < A_SIZE; i++) { + a[i] = (float) (rand() / 10E5); + b[i] = (float) (rand() / 10E5); + } + + printArray(a, 16); + printArray(b, 16); + + std::cout << "Starting distance computation test for float." << std::endl; + + { + diskann::AVXDistanceL2Float dist; + float dist1 = dist.compare(a, b, 16); + float dist2 = distanceL2_F(a, b, 16); + if (abs(dist1 - dist2) > epsilon) { + std::cout + << "compareDistanceComputationsFloat(): L2 Test failed. AVX dist: " + << dist1 << " normal dist: " << dist2 << " difference > " << epsilon + << std::endl; + } else { + std::cout << "Two scores are the same." << std::endl; + } + } + { + diskann::DistanceCosineFloat dist; + float dist1 = dist.compare(a, b, 16); + float dist2 = distanceCosine_F(a, b, 16); + if (abs(dist1 - dist2) > epsilon) { + std::cout << "compareDistanceComputationsFloat(): Cosine Test failed. " + "AVX dist: " + << dist1 << " normal dist: " << dist2 << " difference > " + << epsilon << std::endl; + } else { + std::cout << "Two scores are the same." << std::endl; + } + } +} + +void testStreamBufImpl() { + std::vector v(100); + std::iota(v.begin(), v.end(), 1); + + diskann::cout << "Printing with diskann::cout" << std::endl; +#pragma omp parallel for schedule(dynamic, 64) + for (int i = 0; i < v.size(); i++) { + diskann::cout << std::to_string(i) + ","; + if (i != 0 && i % 10 == 0) { + diskann::cout << std::endl; + } + } + + // diskann::cout << "Printing with diskann::cout" << std::endl; + //#pragma omp parallel for schedule(dynamic, 64) + // for (int i = 0; i < v.size(); i++) { + // diskann::cout << std::to_string(i) + ","; + // if (i != 0 && i % 10 == 0) { + // diskann::cout << std::endl; + // } + // } +} + +//--5. Testing MemBuf Impl +class ContentBuf : public std::basic_streambuf { + public: + ContentBuf(char* ptr, size_t size) { + setg(ptr, ptr, ptr + size); + } +}; +void testMemBufImpl(int argc, char** argv) { + // Create a simple binary file. + std::string fileName = argv[2]; + std::ofstream output_file(fileName, std::ios::binary); + uint32_t n1 = 105, n2 = 18090; + const int F_ARRAY_LEN = 5; + float fs[] = {1.024f, 2.39021f, 4.532f, 7.980232f, 6.222f}; + const int I_ARRAY_LEN = 7; + uint8_t arr[] = {12, 13, 14, 33, 222, 183, 99}; + float f1 = 9283.1237f; + + output_file.write((const char*) &n1, sizeof(uint32_t)); + output_file.write((const char*) &n2, sizeof(uint32_t)); + output_file.write((const char*) &f1, sizeof(float)); + output_file.write((const char*) fs, F_ARRAY_LEN * sizeof(float)); + output_file.write((const char*) arr, I_ARRAY_LEN * sizeof(uint8_t)); + + output_file.close(); + + std::ifstream input_file(fileName, std::ios::binary | std::ios::ate); + size_t size = input_file.tellg(); + input_file.seekg(0); + + auto data = new char[size]; + input_file.read(data, size); + + diskann::cout << "Read " << size << " bytes from file" << std::endl; + + uint32_t int1, int2; + float f2; + float* fs1 = new float[F_ARRAY_LEN]; + uint8_t* arr1 = new uint8_t[I_ARRAY_LEN]; + memset(fs1, 0, sizeof(float) * F_ARRAY_LEN); + memset(arr1, 0, sizeof(uint8_t) * I_ARRAY_LEN); + + // std::ifstream reader(argv[1], std::ios::binary); + // reader.read((char *)&int1, sizeof(int)); + // reader.read((char*) &int2, sizeof(int)); + // reader.read((char*) &f2, sizeof(float)); + // reader.read((char*) fs1, sizeof(float) * F_ARRAY_LEN); + + ContentBuf cb(data, size); + std::basic_istream reader(&cb); + + reader.read((char*) &int1, sizeof(uint32_t)); + reader.read((char*) &int2, sizeof(uint32_t)); + reader.read((char*) &f2, sizeof(float)); + reader.read((char*) fs1, F_ARRAY_LEN * sizeof(float)); + reader.read((char*) arr1, I_ARRAY_LEN * sizeof(uint8_t)); + + diskann::cout << int1 << "," << int2 << "," << f2 << std::endl; + for (int i = 0; i < F_ARRAY_LEN; i++) { + diskann::cout << fs1[i] << ","; + } + diskann::cout << std::endl; + for (int i = 0; i < I_ARRAY_LEN; i++) { + diskann::cout << std::to_string(arr1[i]) << ","; + } + diskann::cout << std::endl; + + assert(int1 == n1); + assert(int2 == n2); + assert(abs(f1 - f2) < 0.0001); +} + +void testSubstringImpl(int argc, char** argv) { + assert(argc >= 4); + + std::string s1(argv[2]); + std::string s2(argv[3]); + assert(s1[0] == s2[0]); // at least they share one char in common! + + size_t index = -1; + size_t compareLen = s1.length() <= s2.length() ? s1.length() : s2.length(); + for (size_t i = 0; i < compareLen; i++) { + if (s1[i] != s2[i]) { + index = i - 1; + break; + } + } + diskann::cout << "Common substring at 0 is:" << s1.substr(0, index); +} + +// DISKANN_DLLIMPORT std::basic_ostream diskann::cout; +// DISKANN_DLLIMPORT std::basic_ostream diskann::cerr; + +int main(int argc, char** argv) { + if (argc < 2) { + diskann::cout + << std::string("Usage: ") << argv[0] << " [arguments]" + << std::endl + << "Modes: 1 for file concat. Args " + << std::endl + << " 2 for test unique_ptr assignment. No args." << std::endl + << " 3 for comparing distance computations (AVX and " + "normal). No args." + << std::endl + << " 4 for testing our streambuf() implemntation. No args" + << std::endl + << " 5 for testing membuf implementation. Args " + << std::endl + << " 6 for testing substring implementation. Args " + << std::endl + << " 7 for testing OpenMP thread pool implementation. No args." + << std::endl; + return -1; + } + + int mode = atoi(argv[1]); + + std::cout << "Testing" << std::endl; + + switch (mode) { + case 1: + concat_files(argc, argv); + return 0; + break; + case 2: + uniquePtrAssignment(); + break; + case 3: + compareDistanceComputationsInt(); + compareDistanceComputationsFloat(); + break; + case 4: + testStreamBufImpl(); + break; + case 5: + testMemBufImpl(argc, argv); + break; + case 6: + testSubstringImpl(argc, argv); + break; + case 7: + testOpenMPThreadPool(); + break; + default: + diskann::cout << "Don't know what to do with mode parameter: " << argv[1] + << std::endl; + } +} diff --git a/tests/utils/test_partitioning.cpp b/tests/utils/test_partitioning.cpp new file mode 100644 index 0000000000..3fff7af268 --- /dev/null +++ b/tests/utils/test_partitioning.cpp @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include "partition_and_pq.h" + +// DEPRECATED: NEED TO REPROGRAM + +int main(int argc, char** argv) { + auto s = std::chrono::high_resolution_clock::now(); + + if (argc != 8) { + diskann::cout << argv[0] + << " format: data type base_set train_set " + "num_clusters " + "max_reps prefix_for_working_directory k_base " + << std::endl; + exit(-1); + } + size_t num_clusters = std::atoi(argv[4]); + size_t max_reps = std::atoi(argv[5]); + size_t k_base = std::atoi(argv[7]); + if (std::string(argv[1]) == std::string("float")) + partition(argv[2], argv[3], num_clusters, max_reps, argv[6], k_base); + else if (std::string(argv[1]) == std::string("int8")) + partition(argv[2], argv[3], num_clusters, max_reps, argv[6], + k_base); + else if (std::string(argv[1]) == std::string("uint8")) + partition(argv[2], argv[3], num_clusters, max_reps, argv[6], + k_base); + else + diskann::cout << "unsupported data format. use float/int8/uint8" + << std::endl; +} diff --git a/tests/utils/test_pq.cpp b/tests/utils/test_pq.cpp new file mode 100644 index 0000000000..2369688450 --- /dev/null +++ b/tests/utils/test_pq.cpp @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include "partition_and_pq.h" +#include "util.h" + +// DEPRECATED: NEED TO REPROGRAM + +int main(int argc, char** argv) { + if (argc != 6) { + diskann::cout << argv[0] + << " format: train_set " + "num_clusters_per_chunk number_chunks " + "max_reps prefix_for_working_directory " + << std::endl; + exit(-1); + } + + size_t num_centers = (size_t) strtol(argv[2], NULL, 10); + size_t num_chunks = (size_t) strtol(argv[3], NULL, 10); + size_t max_reps = (size_t) strtol(argv[4], NULL, 10); + + generate_pq_pivots(argv[1], num_centers, num_chunks, max_reps, argv[5]); + return 0; +} diff --git a/tests/utils/test_pq_from_pivots.cpp b/tests/utils/test_pq_from_pivots.cpp new file mode 100644 index 0000000000..12f98e7bc3 --- /dev/null +++ b/tests/utils/test_pq_from_pivots.cpp @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include + +#include "partition_and_pq.h" +#include "util.h" + +// DEPRECATED: NEED TO REPROGRAM + +int main(int argc, char** argv) { + if (argc != 5) { + diskann::cout << argv[0] + << "format: base_set " + "num_clusters_per_chunk number_chunks " + "prefix_for_working_file " + << std::endl; + exit(-1); + } + + size_t num_centers = (size_t) strtol(argv[2], NULL, 10); + size_t num_chunks = (size_t) strtol(argv[3], NULL, 10); + generate_pq_data_from_pivots(argv[1], num_centers, num_chunks, argv[4]); +} diff --git a/tests/utils/tsv_to_bin.cpp b/tests/utils/tsv_to_bin.cpp index 111a6bb55d..1151c0a177 100644 --- a/tests/utils/tsv_to_bin.cpp +++ b/tests/utils/tsv_to_bin.cpp @@ -4,13 +4,10 @@ #include #include "utils.h" -template -void block_convert(std::ifstream& reader, std::ofstream& writer, _u64 npts, - _u64 ndims) { - auto read_buf = new T[4 * npts * (ndims + 1)]; - - auto cursor = read_buf; - T val; +void block_convert(std::ifstream& reader, std::ofstream& writer, + float* read_buf, _u64 npts, _u64 ndims) { + auto cursor = read_buf; + float val; for (_u64 i = 0; i < npts; i++) { for (_u64 d = 0; d < ndims; ++d) { @@ -19,54 +16,42 @@ void block_convert(std::ifstream& reader, std::ofstream& writer, _u64 npts, cursor++; } } - writer.write((char*) read_buf, npts * ndims * sizeof(T)); - delete[] read_buf; + writer.write((char*) read_buf, npts * ndims * sizeof(float)); } int main(int argc, char** argv) { - if (argc != 6) { - std::cout << argv[0] - << " input_filename.tsv output_filename.bin dim num_pts>" + if (argc != 5) { + diskann::cout << argv[0] + << " input_filename.tsv output_filename.bin dim num_pts>" << std::endl; exit(-1); } - if (std::string(argv[1]) != std::string("float") && - std::string(argv[1]) != std::string("int8") && - std::string(argv[1]) != std::string("uint8")) { - std::cout << "Unsupported type. float, int8 and uint8 types are supported." - << std::endl; - } - - _u64 ndims = atoi(argv[4]); - _u64 npts = atoi(argv[5]); + _u64 ndims = atoi(argv[3]); + _u64 npts = atoi(argv[4]); - std::ifstream reader(argv[2], std::ios::binary | std::ios::ate); + std::ifstream reader(argv[1], std::ios::binary | std::ios::ate); // _u64 fsize = reader.tellg(); reader.seekg(0, std::ios::beg); reader.seekg(0, std::ios::beg); _u64 blk_size = 131072; _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; - std::cout << "# blks: " << nblks << std::endl; - std::ofstream writer(argv[3], std::ios::binary); - auto npts_s32 = (_u32) npts; - auto ndims_s32 = (_u32) ndims; - writer.write((char*) &npts_s32, sizeof(_u32)); - writer.write((char*) &ndims_s32, sizeof(_u32)); - + diskann::cout << "# blks: " << nblks << std::endl; + std::ofstream writer(argv[2], std::ios::binary); + int npts_s32 = (_s32) npts; + int ndims_s32 = (_s32) ndims; + writer.write((char*) &npts_s32, sizeof(_s32)); + writer.write((char*) &ndims_s32, sizeof(_s32)); + float* read_buf = new float[npts * (ndims + 1)]; for (_u64 i = 0; i < nblks; i++) { _u64 cblk_size = std::min(npts - i * blk_size, blk_size); - if (std::string(argv[1]) == std::string("float")) { - block_convert(reader, writer, cblk_size, ndims); - } else if (std::string(argv[1]) == std::string("int8")) { - block_convert(reader, writer, cblk_size, ndims); - } else if (std::string(argv[1]) == std::string("uint8")) { - block_convert(reader, writer, cblk_size, ndims); - } - std::cout << "Block #" << i << " written" << std::endl; + block_convert(reader, writer, read_buf, cblk_size, ndims); + diskann::cout << "Block #" << i << " written" << std::endl; } + delete[] read_buf; + reader.close(); writer.close(); } diff --git a/tests/utils/uint32_to_uint8.cpp b/tests/utils/uint32_to_uint8.cpp index 7c131180fd..21ce241e77 100644 --- a/tests/utils/uint32_to_uint8.cpp +++ b/tests/utils/uint32_to_uint8.cpp @@ -6,7 +6,8 @@ int main(int argc, char** argv) { if (argc != 3) { - std::cout << argv[0] << " input_uint32_bin output_int8_bin" << std::endl; + diskann::cout << argv[0] << " input_uint32_bin output_int8_bin" + << std::endl; exit(-1); } diff --git a/tests/utils/uint8_to_float.cpp b/tests/utils/uint8_to_float.cpp new file mode 100644 index 0000000000..04ab57864a --- /dev/null +++ b/tests/utils/uint8_to_float.cpp @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include "utils.h" + +int main(int argc, char** argv) { + if (argc != 3) { + diskann::cout << argv[0] << " input_uint8_bin output_float_bin" + << std::endl; + exit(-1); + } + + uint8_t* input; + size_t npts, nd; + diskann::load_bin(argv[1], input, npts, nd); + float* output = new float[npts * nd]; + diskann::convert_types(input, output, npts, nd); + diskann::save_bin(argv[2], output, npts, nd); + delete[] output; + delete[] input; +} diff --git a/tests/utils/update_metadata.cpp b/tests/utils/update_metadata.cpp new file mode 100644 index 0000000000..d57a4a14ba --- /dev/null +++ b/tests/utils/update_metadata.cpp @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include "utils.h" + +void block_convert(std::ifstream& reader, std::ofstream& writer, + float* read_buf, uint8_t* write_buf, _u64 npts, _u64 ndims) { + reader.read((char*) read_buf, + npts * (ndims * sizeof(float) + sizeof(unsigned))); + for (_u64 i = 0; i < npts; i++) { + memcpy(write_buf + i * ndims, (read_buf + i * (ndims + 1)) + 1, + ndims * sizeof(float)); + } + writer.write((char*) write_buf, npts * ndims * sizeof(float)); +} + +int main(int argc, char** argv) { + if (argc != 3) { + diskann::cout << argv[0] << " input_fvecs output_bin" << std::endl; + exit(-1); + } + std::ifstream reader(argv[1], std::ios::binary | std::ios::ate); + _u64 fsize = reader.tellg(); + reader.seekg(0, std::ios::beg); + + unsigned ndims_u32; + reader.read((char*) &ndims_u32, sizeof(unsigned)); + reader.seekg(0, std::ios::beg); + _u64 ndims = (_u64) ndims_u32; + _u64 npts = fsize / ((ndims + 1) * sizeof(float)); + diskann::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims + << std::endl; + + _u64 blk_size = 131072; + _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + diskann::cout << "# blks: " << nblks << std::endl; + std::ofstream writer(argv[2], std::ios::binary); + int npts_s32 = (_s32) npts; + int ndims_s32 = (_s32) ndims; + writer.write((char*) &npts_s32, sizeof(_s32)); + writer.write((char*) &ndims_s32, sizeof(_s32)); + float* read_buf = new float[npts * (ndims + 1)]; + uint8_t* write_buf = new uint8_t[npts * ndims]; + for (_u64 i = 0; i < nblks; i++) { + _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + block_convert(reader, writer, read_buf, write_buf, cblk_size, ndims); + diskann::cout << "Block #" << i << " written" << std::endl; + } + + delete[] read_buf; + delete[] write_buf; + + reader.close(); + writer.close(); +} From 07cddff45b9312f4054166efcf75b8a3e4e43703 Mon Sep 17 00:00:00 2001 From: Aditi Date: Thu, 1 Jul 2021 15:32:05 +0000 Subject: [PATCH 2/5] Added some debug code --- include/utils.h | 14 +++++--- src/pq_flash_index.cpp | 13 ++++++- src/v2/index_merger.cpp | 4 +++ src/v2/merge_insert.cpp | 6 ++-- tests/lazy_reinsert_batch.cpp | 56 ++++++++++++++--------------- tests/test_concurr_merge_insert.cpp | 5 +-- 6 files changed, 61 insertions(+), 37 deletions(-) diff --git a/include/utils.h b/include/utils.h index 6f8b0de989..6a399877c3 100644 --- a/include/utils.h +++ b/include/utils.h @@ -99,9 +99,9 @@ inline bool file_exists(const std::string& name, bool dirCheck = false) { inline std::string getTempFilePath(const std::string& workingDir, const std::string& suffix) { -#ifdef _WINDOWS - char temp[MAX_PATH]; std::string retFile; +#ifdef _WINDOWS + char temp[MAX_PATH]; do { if (!tmpnam_s(temp, MAX_PATH) == 0) { @@ -121,9 +121,15 @@ inline std::string getTempFilePath(const std::string& workingDir, retFile = workingDir + "\\" + tempFile + "_" + suffix; } while (file_exists( retFile)); // To handle the rare case that the file may exist already. - return retFile; +#else + int i = 0; + std::string temp = "temp"; + do { + retFile = workingDir + temp + std::to_string(i) + "_" + suffix; + i++; + } while (file_exists(retFile)); #endif - return ""; + return retFile; } inline void open_file_to_write(std::ofstream& writer, diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index 352042f1ff..f831d693a2 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -1468,7 +1468,18 @@ namespace diskann { // create disk node object from backing buf instead of `buf` DiskNode node(n_scanned, OFFSET_TO_NODE_COORDS(buf_start), OFFSET_TO_NODE_NHOOD(buf_start)); - // uint32_t nnbrs = node.nnbrs; + if ((!(node.nnbrs > 0)) || + ((n_scanned >= 300000) && (n_scanned < 300100))) { + std::cout << "#neighbors of " << n_scanned << " : " + << node.nnbrs << std::endl; + std::cout << NODE_SECTOR_NO(n_scanned) << std::endl; + std::cout << uint32_t(node_buf - sector_buf) << std::endl; + for (size_t i = 0; i < 128; i++) { + std::cout << *(OFFSET_TO_NODE_COORDS(buf_start) + i) + << " ; "; + } + std::cout << std::endl; + } assert(node.nnbrs < 512); assert(node.nnbrs > 0); deleted_nodes.push_back(node); diff --git a/src/v2/index_merger.cpp b/src/v2/index_merger.cpp index 837a64d01b..ee1343720c 100644 --- a/src/v2/index_merger.cpp +++ b/src/v2/index_merger.cpp @@ -586,6 +586,8 @@ namespace diskann { diskann::save_bin<_u64>(this->temp_disk_index_path, output_metadata.data(), output_metadata.size(), 1, 0); + int i; + std::cin >> i; // free buf aligned_free((void *) buf); @@ -1139,9 +1141,11 @@ namespace diskann { this->disk_index_out_path = disk_out; this->disk_index_in_path = disk_in; this->TMP_FOLDER = working_folder; + std::cout << "Working folder : " << working_folder << std::endl; this->temp_disk_index_path = getTempFilePath(working_folder, "temp_disk_index"); this->temp_pq_coords_path = getTempFilePath(working_folder, "temp_pq_compressed"); this->temp_tags_path = getTempFilePath(working_folder, "temp_tags"); + std::cout << this->temp_disk_index_path << " , " << this->temp_pq_coords_path << " , " << this->temp_tags_path << std::endl; this->final_index_file = this->_single_file_index ? this->disk_index_out_path : this->disk_index_out_path + "_disk.index"; diff --git a/src/v2/merge_insert.cpp b/src/v2/merge_insert.cpp index 4a64093a20..daea07213b 100644 --- a/src/v2/merge_insert.cpp +++ b/src/v2/merge_insert.cpp @@ -123,6 +123,7 @@ namespace diskann { } TMP_FOLDER = working_folder; + std::cout << "TMP_FOLDER inside MergeInsert : " << TMP_FOLDER << std::endl; } template @@ -336,8 +337,8 @@ namespace diskann { mem_in.push_back(_mem_index_prefix + "_1"); else mem_in.push_back(_mem_index_prefix + "_0"); - std::string folder = " "; - _merger->merge(_disk_index_prefix_in.c_str(), mem_in, _disk_index_prefix_out.c_str(), _deleted_tags_vector, folder); + + _merger->merge(_disk_index_prefix_in.c_str(), mem_in, _disk_index_prefix_out.c_str(), _deleted_tags_vector, TMP_FOLDER); diskann::cout << "Merge done" << std::endl; { @@ -415,6 +416,7 @@ namespace diskann { //start timer diskann::Timer timer; construct_index_merger(); + merge(); destruct_index_merger(); diskann::cout << "Merge time : " << timer.elapsed()/1000 << " ms" << std::endl; //end timer diff --git a/tests/lazy_reinsert_batch.cpp b/tests/lazy_reinsert_batch.cpp index 97c201f472..de9e29d41c 100644 --- a/tests/lazy_reinsert_batch.cpp +++ b/tests/lazy_reinsert_batch.cpp @@ -42,11 +42,12 @@ void search_kernel( memset(query_result_ids, 0, sizeof(unsigned) * recall_at * query_num); std::string recall_string = "Recall@" + std::to_string(recall_at); - diskann_cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " - << std::setw(18) << "Mean Latency (ms)" << std::setw(15) - << "99.9 Latency" << std::setw(12) << recall_string << std::endl; + diskann::cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " + << std::setw(18) << "Mean Latency (ms)" << std::setw(15) + << "99.9 Latency" << std::setw(12) << recall_string + << std::endl; - diskann_cout + diskann::cout << "===============================================================" "===============" << std::endl; @@ -86,13 +87,13 @@ void search_kernel( } std::sort(latency_stats.begin(), latency_stats.end()); - diskann_cout << std::setw(4) << L << std::setw(12) << qps << std::setw(18) - << std::accumulate(latency_stats.begin(), latency_stats.end(), - 0) / - (float) query_num - << std::setw(15) - << (float) latency_stats[(_u64)(0.999 * query_num)] - << std::setw(12) << recall << std::endl; + diskann::cout << std::setw(4) << L << std::setw(12) << qps << std::setw(18) + << std::accumulate(latency_stats.begin(), latency_stats.end(), + 0) / + (float) query_num + << std::setw(15) + << (float) latency_stats[(_u64)(0.999 * query_num)] + << std::setw(12) << recall << std::endl; } delete[] query_result_dists; delete[] query_result_ids; @@ -122,17 +123,17 @@ int build_incremental_index(const std::string& data_path, diskann::load_aligned_bin(data_path.c_str(), data_load, num_points, dim, aligned_dim); - diskann::Index index(diskann::L2, dim, num_points, 1, true, true, 0); + diskann::Index index(diskann::Metric::L2, dim, num_points, 1, true, + true, 0); auto tag_path = memory_index_file + ".tags"; - index.load(memory_index_file.c_str(), data_path.c_str(), true, - tag_path.c_str()); - diskann_cout << "Loaded index and tags and data" << std::endl; + index.load(memory_index_file.c_str()); + diskann::cout << "Loaded index and tags and data" << std::endl; T* query = NULL; size_t query_num, query_dim, query_aligned_dim; diskann::load_aligned_bin(query_file, query, query_num, query_dim, query_aligned_dim); - diskann_cout << "Search on static index" << std::endl; + diskann::cout << "Search on static index" << std::endl; search_kernel(query, query_num, query_aligned_dim, recall_at, Lvec, index, truthset_file); unsigned i = 0; @@ -142,11 +143,10 @@ int build_incremental_index(const std::string& data_path, while (delete_set.size() < delete_size) delete_set.insert(rand() % num_points); std::vector delete_vector(delete_set.begin(), delete_set.end()); - diskann_cout << "\nDeleting " << delete_vector.size() << " elements... "; + diskann::cout << "\nDeleting " << delete_vector.size() << " elements... "; { index.enable_delete(); - diskann::Timer del_timer; std::vector failed_tags; if (index.lazy_delete(delete_set, failed_tags) < 0) { std::cerr << "Error in delete_points" << std::endl; @@ -158,12 +158,12 @@ int build_incremental_index(const std::string& data_path, diskann::Timer del_timer; diskann::cout - << "Starting consolidation of deletes and compacting data....." index - .consolidate(paras); - diskann_cout << "completed in " << del_timer.elapsed() / 1000000.0 - << "sec." << std::endl; + << "Starting consolidation of deletes and compacting data....."; + index.consolidate(paras); + diskann::cout << "completed in " << del_timer.elapsed() / 1000000.0 + << "sec." << std::endl; - diskann_cout << "Search post deletion....." << std::endl; + diskann::cout << "Search post deletion....." << std::endl; search_kernel(query, query_num, query_aligned_dim, recall_at, Lvec, index, truthset_file, delete_set); } @@ -177,8 +177,8 @@ int build_incremental_index(const std::string& data_path, index.insert_point(data_load + (size_t) p * (size_t) aligned_dim, paras, p); } - diskann_cout << "Re-incremental time: " << timer.elapsed() / 1000 - << "ms\n"; + diskann::cout << "Re-incremental time: " << timer.elapsed() / 1000 + << "ms\n"; index.prune_all_nbrs(paras); index.compact_frozen_point(); search_kernel(query, query_num, query_aligned_dim, recall_at, Lvec, index, @@ -194,7 +194,7 @@ int build_incremental_index(const std::string& data_path, int main(int argc, char** argv) { if (argc < 16) { - diskann_cout + diskann::cout << "Correct usage: " << argv[0] << " [int8/uint8/float] " " " @@ -227,7 +227,7 @@ int main(int argc, char** argv) { } if (Lvec.size() == 0) { - diskann_cout + diskann::cout << "No valid Lsearch found. Lsearch must be at least recall_at." << std::endl; return -1; @@ -246,5 +246,5 @@ int main(int argc, char** argv) { argv[2], argv[3], L, R, C, num_rnds, alpha, save_path, num_cycles, fraction, query_file, truthset, recall_at, Lvec); else - diskann_cout << "Unsupported type. Use float/int8/uint8" << std::endl; + diskann::cout << "Unsupported type. Use float/int8/uint8" << std::endl; } diff --git a/tests/test_concurr_merge_insert.cpp b/tests/test_concurr_merge_insert.cpp index 3a9a2f8ce9..975fce55e6 100644 --- a/tests/test_concurr_merge_insert.cpp +++ b/tests/test_concurr_merge_insert.cpp @@ -441,7 +441,7 @@ void run_iter(diskann::MergeInsert & merge_insert, // files for mem-DiskANN std::string mem_pts_file = mem_prefix + ".data_orig"; std::string mem_tags_file = mem_prefix + ".tags_orig"; - std::this_thread::sleep_for(std::chrono::milliseconds(5000)); + std::this_thread::sleep_for(std::chrono::seconds(10)); ::merge_future = std::async(std::launch::async, merge_kernel, std::ref(merge_insert)); @@ -483,7 +483,7 @@ void run_iter(diskann::MergeInsert & merge_insert, << " seconds " << std::endl; search_kernel(merge_insert, inactive_set, query_file, gs_file); */ - std::this_thread::sleep_for(std::chrono::milliseconds(10000)); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); } while ((merge_status != std::future_status::ready)); } @@ -675,6 +675,7 @@ int main(int argc, char **argv) { int arg_no = 1; std::string index_type = argv[arg_no++]; TMP_FOLDER = argv[arg_no++]; + std::cout << "TMP_FOLDER : " << TMP_FOLDER << std::endl; std::string base_prefix(argv[arg_no++]); std::string merge_prefix(argv[arg_no++]); std::string mem_prefix(argv[arg_no++]); From 9d5174e53816cd247c3a21eb21dce92b9f3a7a0f Mon Sep 17 00:00:00 2001 From: Aditi Date: Thu, 1 Jul 2021 17:17:51 +0000 Subject: [PATCH 3/5] Fixed bugs in index_merger.cpp, some bugs pending --- include/index.h | 2 ++ src/index.cpp | 8 +++++++- src/v2/index_merger.cpp | 16 +++++++++++----- src/v2/merge_insert.cpp | 10 +++++++--- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/include/index.h b/include/index.h index a88335a4a5..40fb325c0c 100644 --- a/include/index.h +++ b/include/index.h @@ -67,6 +67,8 @@ namespace diskann { DISKANN_DLLEXPORT size_t load_delete_set(const std::string &filename, size_t offset = 0); + DISKANN_DLLEXPORT void get_delete_set(tsl::robin_set &del_set); + DISKANN_DLLEXPORT size_t get_num_points(); DISKANN_DLLEXPORT size_t return_max_points(); diff --git a/src/index.cpp b/src/index.cpp index 3dc9b9267a..e109d67af3 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -356,6 +356,12 @@ namespace diskann { return file_num_points; } + template + void Index::get_delete_set(tsl::robin_set &del_set) + { + del_set = _delete_set; + } + template size_t Index::load_delete_set(const std::string &filename, size_t offset) { @@ -2541,7 +2547,7 @@ namespace diskann { std::shared_lock l(_tag_lock); if (_tag_to_location.find(tag) == _tag_to_location.end()) { - diskann::cerr << "Delete tag not found" << std::endl; +// diskann::cerr << "Delete tag not found" << std::endl; return -1; } assert(_tag_to_location[tag] < _max_points); diff --git a/src/v2/index_merger.cpp b/src/v2/index_merger.cpp index ee1343720c..b71de5f0a8 100644 --- a/src/v2/index_merger.cpp +++ b/src/v2/index_merger.cpp @@ -466,10 +466,12 @@ namespace diskann { diskann::cout << "Found " << this->disk_deleted_ids.size() << " tags to delete from SSD-DiskANN\n"; - this->mem_deleted_ids.resize(this->mem_data.size()); +// this->mem_deleted_ids.resize(this->mem_data.size()); for (uint32_t i = 0; i < this->mem_data.size(); i++) { tsl::robin_set &deleted_ids = this->mem_deleted_ids[i]; for (uint32_t id = 0; id < this->mem_npts[i]; id++) { + if(deleted_ids.find(id) != deleted_ids.end()) + continue; const TagT tag = this->mem_tags[i][id]; //if (this->deleted_tags.find(tag) != this->deleted_tags.end()) { // deleted_ids.insert(id); @@ -1236,6 +1238,13 @@ namespace diskann { base_offset += INDEX_OFFSET; this->offset_ids.push_back(index_offset); this->mem_deltas.push_back(new GraphDelta(index_offset, npts)); + tsl::robin_set temp_del_set; + if(file_exists(mem_index_path + ".del")) + { + mem_index->load_delete_set(mem_index_path + ".del"); + mem_index->get_delete_set(temp_del_set); + } + this->mem_deleted_ids.push_back(temp_del_set); mem_index->load_tags(mem_index_path + ".tags"); // manage tags std::unique_ptr index_tags; @@ -1246,10 +1255,7 @@ namespace diskann { for (uint32_t k = 0; k < npts; k++) { auto iter = loc_tag_map.find(k); if (iter == loc_tag_map.end()) { - diskann::cout << "Index # " << this->mem_data.size() - << " : missing tag for node #" << k << "\n"; - exit(-1); - index_tags[k] = (TagT) k; + index_tags[k] = (TagT) 0; } else { index_tags[k] = iter->second; } diff --git a/src/v2/merge_insert.cpp b/src/v2/merge_insert.cpp index daea07213b..35aa412251 100644 --- a/src/v2/merge_insert.cpp +++ b/src/v2/merge_insert.cpp @@ -228,9 +228,13 @@ namespace diskann { } if(_active_delete_set == 0) - _deletion_set_0.insert(tag); - else - _deletion_set_1.insert(tag); + {_deletion_set_0.insert(tag); + _mem_index_0->lazy_delete(tag); + } + else{ + _deletion_set_1.insert(tag); + _mem_index_1->lazy_delete(tag); + } } template From ef024696fa5bc4a1c908868a435224d2830a8a2d Mon Sep 17 00:00:00 2001 From: Aditi Date: Mon, 5 Jul 2021 05:47:56 +0000 Subject: [PATCH 4/5] StreamingMerger::merge() now correctly identifies deleted tags --- include/index.h | 2 +- include/utils.h | 7 --- src/index.cpp | 9 ++-- src/pq_flash_index.cpp | 39 +++++++++----- src/v2/index_merger.cpp | 3 -- tests/search_disk_index.cpp | 11 ++-- tests/test_concurr_merge_insert.cpp | 80 ++++++++++++++--------------- tests/utils/bin_to_tsv.cpp | 8 +-- tests/utils/float_bin_to_int8.cpp | 1 - 9 files changed, 83 insertions(+), 77 deletions(-) diff --git a/include/index.h b/include/index.h index 40fb325c0c..2657ed56c9 100644 --- a/include/index.h +++ b/include/index.h @@ -67,7 +67,7 @@ namespace diskann { DISKANN_DLLEXPORT size_t load_delete_set(const std::string &filename, size_t offset = 0); - DISKANN_DLLEXPORT void get_delete_set(tsl::robin_set &del_set); + DISKANN_DLLEXPORT void get_delete_set(tsl::robin_set &del_set); DISKANN_DLLEXPORT size_t get_num_points(); diff --git a/include/utils.h b/include/utils.h index 6a399877c3..76f3d26631 100644 --- a/include/utils.h +++ b/include/utils.h @@ -544,14 +544,7 @@ namespace diskann { size_t offset = 0) { diskann::cout << "Reading bin file " << bin_file << " at offset " << offset << "..." << std::flush; - // START OLS - //_u64 read_blk_size = 64 * 1024 * 1024; - // cached_ifstream reader(bin_file, read_blk_size); - // size_t actual_file_size = reader.get_file_size(); - // END OLS - std::ifstream reader(bin_file, std::ios::binary | std::ios::ate); - // uint64_t fsize = reader.tellg(); reader.seekg(0); load_aligned_bin_impl(reader, data, npts, dim, rounded_dim, offset); diff --git a/src/index.cpp b/src/index.cpp index e109d67af3..d7903090ee 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -357,10 +357,9 @@ namespace diskann { } template - void Index::get_delete_set(tsl::robin_set &del_set) - { - del_set = _delete_set; - } + void Index::get_delete_set(tsl::robin_set &del_set) { + del_set = _delete_set; + } template size_t Index::load_delete_set(const std::string &filename, @@ -2547,7 +2546,7 @@ namespace diskann { std::shared_lock l(_tag_lock); if (_tag_to_location.find(tag) == _tag_to_location.end()) { -// diskann::cerr << "Delete tag not found" << std::endl; + // diskann::cerr << "Delete tag not found" << std::endl; return -1; } assert(_tag_to_location[tag] < _max_points); diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index f831d693a2..0f74239cb8 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -1450,6 +1450,7 @@ namespace diskann { assert(this->reader); this->reader->read(reads, ctx); + reads[0].offset += reads[0].len; // scan each sector for (uint32_t i = 0; i < sectors_per_scan && n_scanned < this->num_points; @@ -1468,18 +1469,32 @@ namespace diskann { // create disk node object from backing buf instead of `buf` DiskNode node(n_scanned, OFFSET_TO_NODE_COORDS(buf_start), OFFSET_TO_NODE_NHOOD(buf_start)); - if ((!(node.nnbrs > 0)) || - ((n_scanned >= 300000) && (n_scanned < 300100))) { - std::cout << "#neighbors of " << n_scanned << " : " - << node.nnbrs << std::endl; - std::cout << NODE_SECTOR_NO(n_scanned) << std::endl; - std::cout << uint32_t(node_buf - sector_buf) << std::endl; - for (size_t i = 0; i < 128; i++) { - std::cout << *(OFFSET_TO_NODE_COORDS(buf_start) + i) - << " ; "; - } - std::cout << std::endl; - } + /* if ((!(node.nnbrs > 0)) || + ((n_scanned >= 325000) && (n_scanned < 325100)) || + ((n_scanned >= 300000) && (n_scanned < 300100))) { + std::cout << "#neighbors of " << n_scanned << " : " + << node.nnbrs << std::endl; + std::cout << NODE_SECTOR_NO(n_scanned) << std::endl; + std::cout << uint32_t(node_buf - sector_buf) << + std::endl; for (size_t i = 0; i < 128; i++) { std::cout << + *(OFFSET_TO_NODE_COORDS(buf_start) + i) + << " ; "; + } + std::cout << std::endl; + if (((n_scanned % 5) != 0) && (node.nnbrs == 0)) { + std::cout << "Previous vector : " << std::endl; + std::cout << NODE_SECTOR_NO(n_scanned - 1) << + std::endl; char *buf_prev = OFFSET_TO_NODE(sector_buf, n_scanned + - 1); std::cout << uint32_t(buf_prev - sector_buf) << std::endl; + for (size_t i = 0; i < 128; i++) { + std::cout << *(OFFSET_TO_NODE_COORDS(buf_prev) + + i) + << " ; "; + } + std::cout << std::endl; + } + } + */ assert(node.nnbrs < 512); assert(node.nnbrs > 0); deleted_nodes.push_back(node); diff --git a/src/v2/index_merger.cpp b/src/v2/index_merger.cpp index b71de5f0a8..cca21945ca 100644 --- a/src/v2/index_merger.cpp +++ b/src/v2/index_merger.cpp @@ -587,9 +587,6 @@ namespace diskann { output_writer.close(); diskann::save_bin<_u64>(this->temp_disk_index_path, output_metadata.data(), output_metadata.size(), 1, 0); - - int i; - std::cin >> i; // free buf aligned_free((void *) buf); diff --git a/tests/search_disk_index.cpp b/tests/search_disk_index.cpp index 55af98ff1a..7d0b25460d 100644 --- a/tests/search_disk_index.cpp +++ b/tests/search_disk_index.cpp @@ -239,12 +239,13 @@ int search_disk_index(int argc, char** argv) { diskann::QueryStats* stats = new diskann::QueryStats[query_num]; std::vector query_result_tags_64(recall_at * query_num); + std::vector query_result_tags_32(recall_at * query_num); auto s = std::chrono::high_resolution_clock::now(); #pragma omp parallel for schedule(dynamic, 1) for (_s64 i = 0; i < (int64_t) query_num; i++) { - _pFlashIndex->cached_beam_search_ids( + _pFlashIndex->cached_beam_search( query + (i * query_aligned_dim), (uint64_t) recall_at, (uint64_t) L, - query_result_tags_64.data() + (i * recall_at), + query_result_tags_32.data() + (i * recall_at), query_result_dists[test_id].data() + (i * recall_at), (uint64_t) optimized_beamwidth, stats + i); } @@ -253,8 +254,8 @@ int search_disk_index(int argc, char** argv) { float qps = (float) ((1.0 * (double) query_num) / (1.0 * (double) diff.count())); - diskann::convert_types( - query_result_tags_64.data(), query_result_tags[test_id].data(), + diskann::convert_types( + query_result_tags_32.data(), query_result_tags[test_id].data(), (size_t) query_num, (size_t) recall_at); float mean_latency = (float) diskann::get_mean_stats( @@ -285,7 +286,7 @@ int search_disk_index(int argc, char** argv) { float recall = 0; if (calc_recall_flag) { recall = (float) diskann::calculate_recall( - (_u32) query_num, gt_ids, gt_dists, (_u32) gt_dim, + (_u32) query_num, tags, gt_dists, (_u32) gt_dim, query_result_tags[test_id].data(), (_u32) recall_at, (_u32) recall_at); } diff --git a/tests/test_concurr_merge_insert.cpp b/tests/test_concurr_merge_insert.cpp index 975fce55e6..c8a6f73693 100644 --- a/tests/test_concurr_merge_insert.cpp +++ b/tests/test_concurr_merge_insert.cpp @@ -48,6 +48,8 @@ diskann::Timer global_timer; std::string all_points_file; bool save_index_as_one_file; std::string TMP_FOLDER; +std::string query_file = ""; +std::string truthset_file = ""; template void seed_iter(tsl::robin_set &active_set, @@ -246,11 +248,8 @@ void search_disk_index(const std::string & index_prefix_path, template void search_kernel(diskann::MergeInsert & merge_insert, const tsl::robin_set &active_tags, - const std::string query_path, const std::string gs_path, - bool print_stats = false) { - std::string query_bin = query_path; - std::string truthset_bin = gs_path; - uint64_t recall_at = params[std::string("recall_k")]; + bool print_stats = false) { + uint64_t recall_at = params[std::string("recall_k")]; // hold data T * query = nullptr; @@ -259,11 +258,14 @@ void search_kernel(diskann::MergeInsert & merge_insert, float * gt_dists = nullptr; size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; + const std::string temp = "/mnt/t-adisin/sift_query.bin"; + std::cout << "Loading query : " << temp << std::endl; // load query + truthset - diskann::load_aligned_bin(query_bin, query, query_num, query_dim, + diskann::load_aligned_bin(temp, query, query_num, query_dim, query_aligned_dim); - std::cout << "Loaded query" << std::endl; - diskann::load_truthset(gs_path, gt_ids, gt_dists, gt_num, gt_dim); + std::cout << "Loaded query : " << temp << std::endl; + diskann::load_truthset(::truthset_file, gt_ids, gt_dists, gt_num, gt_dim, + >_tags); std::cout << "Loaded gt" << std::endl; if (gt_num != query_num) { std::cout << "Error. Mismatch in number of queries and ground truth data" @@ -435,9 +437,7 @@ template void run_iter(diskann::MergeInsert & merge_insert, const std::string & mem_prefix, tsl::robin_set &active_set, - tsl::robin_set &inactive_set, - const std::string query_file, const std::string gs_file, - T *data) { + tsl::robin_set &inactive_set) { // files for mem-DiskANN std::string mem_pts_file = mem_prefix + ".data_orig"; std::string mem_tags_file = mem_prefix + ".tags_orig"; @@ -449,7 +449,7 @@ void run_iter(diskann::MergeInsert & merge_insert, while (!(::_insertions_done.load() && ::_del_done.load())) { /* std::cout << "Search at " << ::global_timer.elapsed() / 1000000 << " seconds " << std::endl; - search_kernel(merge_insert, inactive_set, query_file, gs_file);*/ + search_kernel(merge_insert, active_set);*/ std::this_thread::sleep_for(std::chrono::milliseconds(5000)); } @@ -457,12 +457,11 @@ void run_iter(diskann::MergeInsert & merge_insert, ::_insertions_done.store(false); ::_del_done.store(false); - /* std::cout << "Searching all indices" << std::endl; + std::cout << "Searching all indices" << std::endl; std::cout << "Search at " << ::global_timer.elapsed() / 1000000 << " seconds " << std::endl; - search_kernel(merge_insert, inactive_set, query_file, gs_file, true); - */ - + search_kernel(merge_insert, active_set, true); + std::cout << "ITER: Seeding iteration" << "\n"; // seed the iteration @@ -481,20 +480,20 @@ void run_iter(diskann::MergeInsert & merge_insert, merge_status = ::merge_future.wait_for(std::chrono::milliseconds(1)); /* std::cout << "Search at " << ::global_timer.elapsed() / 1000000 << " seconds " << std::endl; - search_kernel(merge_insert, inactive_set, query_file, gs_file); + search_kernel(merge_insert, active_set); */ std::this_thread::sleep_for(std::chrono::milliseconds(1000)); } while ((merge_status != std::future_status::ready)); } template -void run_iter(diskann::MergeInsert &merge_insert, - const std::string &base_prefix, const std::string &merge_prefix, - const std::string & mem_prefix, - tsl::robin_set &active_set, - tsl::robin_set &inactive_set, - const std::string &query_file, const std::string &gs_file, - diskann::Distance *dist_cmp) { +void run_single_iter(diskann::MergeInsert & merge_insert, + const std::string & base_prefix, + const std::string & merge_prefix, + const std::string & mem_prefix, + tsl::robin_set &active_set, + tsl::robin_set &inactive_set, + diskann::Distance * dist_cmp) { // files for mem-DiskANN std::string mem_pts_file = mem_prefix + ".data_orig"; std::string mem_tags_file = mem_prefix + ".tags_orig"; @@ -505,7 +504,7 @@ void run_iter(diskann::MergeInsert &merge_insert, /* std::cout << "Searching all indices" << std::endl; std::cout << "Search at " << ::global_timer.elapsed() / 1000000 << " seconds " << std::endl; - search_kernel(merge_insert, inactive_set, query_file, gs_file, true); + search_kernel(merge_insert, active_set, true); */ std::cout << "ITER: Seeding iteration" << "\n"; @@ -535,7 +534,7 @@ void run_iter(diskann::MergeInsert &merge_insert, merge_status = ::merge_future.wait_for(std::chrono::milliseconds(1)); /* std::cout << "Search at " << ::global_timer.elapsed() / 1000000 << " seconds " << std::endl; - search_kernel(merge_insert, inactive_set, query_file, gs_file); + search_kernel(merge_insert, active_set); */ // std::this_thread::sleep_for(std::chrono::milliseconds(10000)); } while ((merge_status != std::future_status::ready)); @@ -544,13 +543,11 @@ void run_iter(diskann::MergeInsert &merge_insert, template void run_all_iters(std::string base_prefix, std::string merge_prefix, const std::string mem_prefix, const std::string data_file, - const std::string active_tags_file, - const std::string query_file, const std::string gs_file, + const std::string active_tags_file, diskann::Distance *dist_cmp) { // load all data points - std::unique_ptr data; - uint64_t npts = 0, ndims = 0; - diskann::load_bin(data_file, data, npts, ndims); + uint64_t npts = 0, ndims = 0; + diskann::get_bin_metadata(data_file, npts, ndims); std::cout << "Loaded base bin" << std::endl; params[std::string("ndims")] = (uint32_t) ndims; @@ -629,10 +626,10 @@ void run_all_iters(std::string base_prefix, std::string merge_prefix, diskann::MergeInsert merge_insert( paras, ndims, mem_prefix, base_prefix, merge_prefix, dist_cmp, metric, ::save_index_as_one_file, working_folder); + // search_kernel(merge_insert, active_tags, true); for (size_t i = 0; i < n_iters; i++) { std::cout << "ITER : " << i << std::endl; - run_iter(merge_insert, mem_prefix, active_tags, inactive_tags, - query_file, gs_file, data.get()); + run_iter(merge_insert, mem_prefix, active_tags, inactive_tags); } /* std::cout << "Done running all iterations, now merging any leftover points." @@ -643,14 +640,15 @@ void run_all_iters(std::string base_prefix, std::string merge_prefix, insert_status = ::insert_future.wait_for(std::chrono::milliseconds(1)); delete_status = ::delete_future.wait_for(std::chrono::milliseconds(1)); - // search_kernel(merge_insert, active_tags, query_file, gs_file, + // search_kernel(merge_insert, active_tags, // false); } while ((merge_status != std::future_status::ready) || (insert_status != std::future_status::ready) || (delete_status != std::future_status::ready)); merge_kernel(merge_insert); */ - search_kernel(merge_insert, active_tags, query_file, gs_file, true); + // search_kernel(merge_insert, active_tags, + // true); } int main(int argc, char **argv) { @@ -685,8 +683,8 @@ int main(int argc, char **argv) { float alpha_disk = (float) atof(argv[arg_no++]); std::string data_bin(argv[arg_no++]); int single_file = atoi(argv[arg_no++]); - std::string query_bin(argv[arg_no++]); - std::string gt_bin(argv[arg_no++]); + std::string query_path(argv[arg_no++]); + std::string gt_file(argv[arg_no++]); int n_iters = atoi(argv[arg_no++]); uint32_t insert_count = (uint32_t) atoi(argv[arg_no++]); uint32_t delete_count = (uint32_t) atoi(argv[arg_no++]); @@ -716,6 +714,8 @@ int main(int argc, char **argv) { params[std::string("merge_maxc")] = (uint32_t)(range * 2.5); params[std::string("merge_l_index")] = L_disk; + ::query_file = ::query_file + query_path; + ::truthset_file = gt_file; if (single_file == 1) ::save_index_as_one_file = true; else @@ -730,15 +730,15 @@ int main(int argc, char **argv) { if (index_type == std::string("float")) { diskann::DistanceL2 dist_cmp; run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, - active_tags_filename, query_bin, gt_bin, &dist_cmp); + active_tags_filename, &dist_cmp); } else if (index_type == std::string("uint8")) { diskann::DistanceL2UInt8 dist_cmp; run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, - active_tags_filename, query_bin, gt_bin, &dist_cmp); + active_tags_filename, &dist_cmp); } else if (index_type == std::string("int8")) { diskann::DistanceL2Int8 dist_cmp; run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, - active_tags_filename, query_bin, gt_bin, &dist_cmp); + active_tags_filename, &dist_cmp); } else { std::cout << "Unsupported type : " << index_type << "\n"; } diff --git a/tests/utils/bin_to_tsv.cpp b/tests/utils/bin_to_tsv.cpp index 37874e2437..9a7e180a42 100644 --- a/tests/utils/bin_to_tsv.cpp +++ b/tests/utils/bin_to_tsv.cpp @@ -22,7 +22,8 @@ void block_convert(std::ofstream& writer, std::ifstream& reader, T* read_buf, int main(int argc, char** argv) { if (argc != 4) { - std::cout << argv[0] << " input_bin output_tsv" << std::endl; + std::cout << argv[0] << " input_bin output_tsv" + << std::endl; exit(-1); } std::string type_string(argv[1]); @@ -50,9 +51,10 @@ int main(int argc, char** argv) { for (_u64 i = 0; i < nblks; i++) { _u64 cblk_size = std::min(npts - i * blk_size, blk_size); if (type_string == std::string("float")) - block_convert(writer, reader, (float*)read_buf, cblk_size, ndims); + block_convert(writer, reader, (float*) read_buf, cblk_size, ndims); else if (type_string == std::string("int8")) - block_convert(writer, reader, (int8_t*) read_buf, cblk_size, ndims); + block_convert(writer, reader, (int8_t*) read_buf, cblk_size, + ndims); else if (type_string == std::string("uint8")) block_convert(writer, reader, (uint8_t*) read_buf, cblk_size, ndims); diff --git a/tests/utils/float_bin_to_int8.cpp b/tests/utils/float_bin_to_int8.cpp index 4f422a2336..0620730a51 100644 --- a/tests/utils/float_bin_to_int8.cpp +++ b/tests/utils/float_bin_to_int8.cpp @@ -4,7 +4,6 @@ #include #include "utils.h" - void block_convert(std::ofstream& writer, int8_t* write_buf, std::ifstream& reader, float* read_buf, _u64 npts, _u64 ndims, float bias, float scale) { From 317b82273024273cdeba8b5273d43228d0ea2a87 Mon Sep 17 00:00:00 2001 From: t-adisin Date: Mon, 5 Jul 2021 11:54:07 +0000 Subject: [PATCH 5/5] All driver files work now, test_concurr_merge_insert works without tcmalloc only --- CMakeLists.txt | 2 +- src/index.cpp | 21 +- src/v2/index_merger.cpp | 4 + src/v2/merge_insert.cpp | 2 +- tests/CMakeLists.txt | 21 +- tests/lazy_reinsert_batch.cpp | 36 +- tests/search_memory_index_recovery.cpp | 200 -------- tests/test_concurr_merge_insert.cpp | 29 +- tests/test_delete_insert_cycles.cpp | 174 ------- tests/test_diskpriority_io.cpp | 106 ---- tests/test_index_merger.cpp | 98 ---- tests/test_index_merger_steady_state.cpp | 549 -------------------- tests/test_merge_insert.cpp | 625 ----------------------- 13 files changed, 60 insertions(+), 1807 deletions(-) delete mode 100644 tests/search_memory_index_recovery.cpp delete mode 100644 tests/test_delete_insert_cycles.cpp delete mode 100644 tests/test_diskpriority_io.cpp delete mode 100644 tests/test_index_merger.cpp delete mode 100644 tests/test_index_merger_steady_state.cpp delete mode 100644 tests/test_merge_insert.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 49210886ec..e6f51493f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,7 +92,7 @@ if(MSVC) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/Release) else() set(ENV{TCMALLOC_LARGE_ALLOC_REPORT_THRESHOLD} 500000000000) - # set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -DDEBUG -O0 -fsanitize=address -fsanitize=leak -fsanitize=undefined") + #set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -DDEBUG -O0 -fsanitize=address -fsanitize=leak -fsanitize=undefined") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -DDEBUG -Wall -Wextra") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast -DNDEBUG -march=native -mtune=native -ftree-vectorize") add_compile_options(-march=native -Wall -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fopenmp -fopenmp-simd -funroll-loops -Wfatal-errors -DUSE_ACCELERATED_PQ -DUSE_AVX2) diff --git a/src/index.cpp b/src/index.cpp index d7903090ee..4cbddb34c2 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -443,16 +443,7 @@ namespace diskann { << " size(_location_to_tag): " << _location_to_tag.size() << " size(_tag_to_location):" << _tag_to_location.size() << " Max points: " << _max_points << std::endl; - // auto point_count = _location_to_tag.size(); - // Since we haven't consolidated while save, during load, it is possible - // that we'll get locations > point_count. Hence commented - // for (auto lt : _location_to_tag) { - // if (lt.first > point_count) { - // std::cout << "Found location: " << lt.first << " for tag: " << - // lt.second - // << ", location > " << point_count << std::endl; - // } - //} + _change_lock.unlock(); } @@ -488,14 +479,15 @@ namespace diskann { // Sanity check. In case the user gave us fewer points as max_points than // the number // of points in the dataset, resize the _final_graph to the larger size. - if (_max_points < expected_num_points) { + if (_max_points < (expected_num_points - _num_frozen_pts)) { diskann::cout << "Number of points in data: " << expected_num_points - << " is less than max_points argument: " + << " is more than max_points argument: " << _final_graph.size() << " Setting max points to: " << expected_num_points << std::endl; _final_graph.resize(expected_num_points); - _max_points = expected_num_points; + _max_points = expected_num_points - _num_frozen_pts; + // changed expected_num to expected_num - frozen_num } size_t bytes_read = 24; @@ -2195,7 +2187,6 @@ namespace diskann { << " NOT found in delete set of size: " << _delete_set.size() << std::endl; } - print_delete_set(); diskann::cerr << sstream.str() << std::endl; throw diskann::ANNException(sstream.str(), -1, __FUNCSIG__, @@ -2708,8 +2699,6 @@ namespace diskann { << std::endl; diskann::cout << "Number of empty slots: " << _empty_slots.size() << std::endl; - // print_delete_set(); - // are_deleted_points_in_graph(); diskann::cout << std::boolalpha << "Data compacted: " << this->_data_compacted << " Lazy done: " << this->_lazy_done diff --git a/src/v2/index_merger.cpp b/src/v2/index_merger.cpp index cca21945ca..ebe9f33de4 100644 --- a/src/v2/index_merger.cpp +++ b/src/v2/index_merger.cpp @@ -148,6 +148,7 @@ namespace diskann { const uint32_t count = this->mem_npts[i]; size_t cur_cache_size = 0; +#ifdef USE_TCMALLOC MallocExtension::instance()->GetNumericProperty( "tcmalloc.max_total_thread_cache_bytes", &cur_cache_size); //diskann::cout << "Current cache size : " << (cur_cache_size >> 10) @@ -156,6 +157,7 @@ namespace diskann { MallocExtension::instance()->SetNumericProperty( "tcmalloc.max_total_thread_cache_bytes", 128 * 1024 * 1024); +#endif diskann::Timer timer; #pragma omp parallel for schedule(dynamic, 1) num_threads(MAX_INSERT_THREADS) // iteratively insert each point into full index @@ -1382,7 +1384,9 @@ namespace diskann { // TODO (correct) :: write to the right file //std::string tmp_file = TMP_FOLDER + "/index_ravi"; +#ifdef USE_TCMALLOC MallocExtension::instance()->ReleaseFreeMemory(); +#endif //this->output_writer.open(tmp_file, std::ios::out | std::ios::binary); //assert(this->output_writer.is_open()); diff --git a/src/v2/merge_insert.cpp b/src/v2/merge_insert.cpp index 35aa412251..f16fa5acb6 100644 --- a/src/v2/merge_insert.cpp +++ b/src/v2/merge_insert.cpp @@ -89,7 +89,7 @@ namespace diskann { _paras_disk.Set("saturate_graph", 0); _num_search_threads = parameters.Get<_u32>("num_search_threads"); - _beamwidth = parameters.Get("beamwidth"); + _beamwidth = parameters.Get("beamwidth"); _num_nodes_to_cache = parameters.Get<_u32>("nodes_to_cache"); _search_tpool = new ThreadPool(_num_search_threads); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d7a04bd7cf..1f4300f547 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -3,6 +3,15 @@ set(CMAKE_CXX_STANDARD 14) +add_executable(lazy_reinsert_batch lazy_reinsert_batch.cpp ) +if(MSVC) + target_link_options(lazy_reinsert_batch PRIVATE /MACHINE:x64 /DEBUG:FULL "/INCLUDE:_tcmalloc") + target_link_libraries(lazy_reinsert_batch debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskann_dll.lib ${PROJECT_SOURCE_DIR}/dependencies/windows/tcmalloc/libtcmalloc_minimal.lib) + target_link_libraries(lazy_reinsert_batch optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskann_dll.lib ${PROJECT_SOURCE_DIR}/dependencies/windows/tcmalloc/libtcmalloc_minimal.lib) +else() + target_link_libraries(lazy_reinsert_batch ${PROJECT_NAME} -ltcmalloc) +endif() + add_executable(build_memory_index build_memory_index.cpp ) if(MSVC) target_link_options(build_memory_index PRIVATE /MACHINE:x64 /DEBUG:FULL "/INCLUDE:_tcmalloc") @@ -49,7 +58,7 @@ if(MSVC) target_link_libraries(test_concurr_merge_insert debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/nsg_dll.lib) target_link_libraries(test_concurr_merge_insert optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/nsg_dll.lib) else() - target_link_libraries(test_concurr_merge_insert ${PROJECT_NAME} -ltcmalloc aio) + target_link_libraries(test_concurr_merge_insert ${PROJECT_NAME} aio) endif() add_executable(test_incremental_index test_incremental_index.cpp) @@ -77,14 +86,4 @@ add_executable(test_incr_intf test_incr_intf.cpp) target_link_libraries(test_incr_intf debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/nsg_dll.lib) target_link_libraries(test_incr_intf optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/nsg_dll.lib) endif() - - - -if(MSVC) - add_executable(test_diskpriority_io test_diskpriority_io.cpp ) - target_include_directories(test_diskpriority_io PRIVATE "F:/boost/boost_1_71_0") - target_link_options(test_diskpriority_io PRIVATE /MACHINE:x64 /DEBUG:FULL) - target_link_libraries(test_diskpriority_io debug ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}/diskpriority_io.lib) - target_link_libraries(test_diskpriority_io optimized ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}/diskpriority_io.lib) -endif() # formatter diff --git a/tests/lazy_reinsert_batch.cpp b/tests/lazy_reinsert_batch.cpp index de9e29d41c..88dcf71e8e 100644 --- a/tests/lazy_reinsert_batch.cpp +++ b/tests/lazy_reinsert_batch.cpp @@ -28,11 +28,13 @@ void search_kernel( T* query, size_t query_num, size_t query_aligned_dim, const int recall_at, std::vector<_u64> Lvec, diskann::Index& index, const std::string& truthset_file, - tsl::robin_set delete_list = tsl::robin_set()) { + tsl::robin_set active_tags = tsl::robin_set()) { unsigned* gt_ids = NULL; + unsigned* gt_tags = NULL; float* gt_dists = NULL; size_t gt_num, gt_dim; - diskann::load_truthset(truthset_file, gt_ids, gt_dists, gt_num, gt_dim); + diskann::load_truthset(truthset_file, gt_ids, gt_dists, gt_num, gt_dim, + >_tags); float* query_result_dists = new float[recall_at * query_num]; unsigned* query_result_ids = new unsigned[recall_at * query_num]; @@ -63,8 +65,8 @@ void search_kernel( for (int64_t i = 0; i < (int64_t) query_num; i++) { auto qs = std::chrono::high_resolution_clock::now(); index.search_with_tags(query + i * query_aligned_dim, recall_at, (_u32) L, - query_result_tags + i * recall_at, 1, - query_result_ids + i * recall_at); + query_result_tags + i * recall_at, + query_result_dists + i * recall_at); auto qe = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = qe - qs; latency_stats[i] = diff.count() * 1000; @@ -76,10 +78,10 @@ void search_kernel( float qps = (float) (query_num / diff.count()); float recall; - if (delete_list.size() > 0) { + if (active_tags.size() > 0) { recall = (float) diskann::calculate_recall( (_u32) query_num, gt_ids, gt_dists, (_u32) gt_dim, query_result_tags, - (_u32) recall_at, (_u32) recall_at, delete_list); + (_u32) recall_at, (_u32) recall_at, active_tags); } else { recall = (float) diskann::calculate_recall( (_u32) query_num, gt_ids, gt_dists, (_u32) gt_dim, query_result_tags, @@ -123,8 +125,8 @@ int build_incremental_index(const std::string& data_path, diskann::load_aligned_bin(data_path.c_str(), data_load, num_points, dim, aligned_dim); - diskann::Index index(diskann::Metric::L2, dim, num_points, 1, true, - true, 0); + diskann::Index index(diskann::Metric::L2, dim, num_points + 100, 1, + false, true, 0); auto tag_path = memory_index_file + ".tags"; index.load(memory_index_file.c_str()); @@ -143,6 +145,12 @@ int build_incremental_index(const std::string& data_path, while (delete_set.size() < delete_size) delete_set.insert(rand() % num_points); std::vector delete_vector(delete_set.begin(), delete_set.end()); + tsl::robin_set active_tags; + for (size_t j = 0; j < num_points; j++) { + if (delete_set.find(j) == delete_set.end()) { + active_tags.insert(j); + } + } diskann::cout << "\nDeleting " << delete_vector.size() << " elements... "; { @@ -155,7 +163,12 @@ int build_incremental_index(const std::string& data_path, std::cerr << "Failed to delete " << failed_tags.size() << " tags" << std::endl; } - + /* + std::string save_del_path = + save_path + "_" + std::to_string(i) + ".delete"; + index.save(save_del_path.c_str()); + index.load(save_del_path.c_str()); + */ diskann::Timer del_timer; diskann::cout << "Starting consolidation of deletes and compacting data....."; @@ -165,11 +178,10 @@ int build_incremental_index(const std::string& data_path, diskann::cout << "Search post deletion....." << std::endl; search_kernel(query, query_num, query_aligned_dim, recall_at, Lvec, index, - truthset_file, delete_set); + truthset_file, active_tags); } { - index.reposition_frozen_point_to_end(); diskann::Timer timer; #pragma omp parallel for for (size_t i = 0; i < delete_vector.size(); i++) { @@ -179,8 +191,6 @@ int build_incremental_index(const std::string& data_path, } diskann::cout << "Re-incremental time: " << timer.elapsed() / 1000 << "ms\n"; - index.prune_all_nbrs(paras); - index.compact_frozen_point(); search_kernel(query, query_num, query_aligned_dim, recall_at, Lvec, index, truthset_file); } diff --git a/tests/search_memory_index_recovery.cpp b/tests/search_memory_index_recovery.cpp deleted file mode 100644 index d33a503b7c..0000000000 --- a/tests/search_memory_index_recovery.cpp +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include -#include -#include -#include -#include -#include - -#ifndef _WINDOWS -#include -#include -#include -#include -#endif - -#include "aux_utils.h" -#include "index.h" -#include "memory_mapper.h" -#include "utils.h" - -template -int search_memory_index(int argc, char** argv) { - T* query = nullptr; - unsigned* gt_ids = nullptr; - unsigned* gt_tags = nullptr; - float* gt_dists = nullptr; - size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; - std::vector<_u64> Lvec; - - int arg_no = 2; - std::string data_file(argv[arg_no++]); - std::string memory_index_file(argv[arg_no++]); - int frozen_pt = std::atoi(argv[arg_no++]); - int tags = std::atoi(argv[arg_no++]); - std::string query_bin(argv[arg_no++]); - std::string truthset_bin(argv[arg_no++]); - _u64 recall_at = std::atoi(argv[arg_no++]); - std::string result_output_prefix(argv[arg_no++]); - - bool calc_recall_flag = false; - - for (int ctr = 10; ctr < argc; ctr++) { - _u64 curL = std::atoi(argv[ctr]); - if (curL >= recall_at) - Lvec.push_back(curL); - } - - if (Lvec.size() == 0) { - std::cout << "No valid Lsearch found. Lsearch must be at least recall_at." - << std::endl; - return -1; - } - - diskann::load_aligned_bin(query_bin, query, query_num, query_dim, - query_aligned_dim); - - if (file_exists(truthset_bin)) { - diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim, - >_tags); - if (gt_num != query_num) { - std::cout << "Error. Mismatch in number of queries and ground truth data" - << std::endl; - } - calc_recall_flag = true; - } - - std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); - std::cout.precision(2); - - _u64 data_num, data_dim; - diskann::get_bin_metadata(data_file, data_num, data_dim); - std::vector>> indices; - indices.reserve(6); - for (int j = 0; j < 6; j++) { - indices.emplace_back(std::make_shared>( - diskann::L2, data_dim, data_num, frozen_pt)); - if (tags == 1) - indices[j]->load(memory_index_file.c_str(), data_file.c_str(), true); - else { - indices[j]->load(memory_index_file.c_str(), data_file.c_str(), false); - } - } - std::cout << "Index loaded" << std::endl; - - diskann::Parameters paras; - std::string recall_string = "Recall@" + std::to_string(recall_at); - std::cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " << std::setw(18) - << "Mean Latency (ms)" << std::setw(15) << "99.9 Latency" - << std::setw(12) << recall_string << std::endl; - std::cout << "===============================================================" - "===============" - << std::endl; - - std::vector> query_result_ids(Lvec.size()); - std::vector> query_result_dists(Lvec.size()); - std::vector> query_result_tags(Lvec.size()); - - std::vector> latency_stats(6); - for (int j = 0; j < 6; j++) { - latency_stats[j].reserve(query_num); - for (int k = 0; k < query_num; k++) - latency_stats[j][k] = 0; - } - - for (uint32_t test_id = 0; test_id < Lvec.size(); test_id++) { - _u64 L = Lvec[test_id]; - // recall_at = L; - // query_result_ids[test_id].resize(recall_at * query_num); - // query_result_tags[test_id].resize(recall_at * query_num); - - auto s = std::chrono::high_resolution_clock::now(); - // #pragma omp parallel for schedule(dynamic, 1) num_threads(96) - for (int64_t i = 0; i < (int64_t) query_num; i++) { -#pragma omp parallel for num_threads(6) - for (int j = 0; j < 6; j++) { - std::vector result_ids(recall_at); - auto qs = std::chrono::high_resolution_clock::now(); - indices[j]->search(query + i * query_aligned_dim, recall_at, (_u32) L, - result_ids.data()); - auto qe = std::chrono::high_resolution_clock::now(); - std::chrono::duration diff = qe - qs; - latency_stats[j][i] = diff.count() * 1000; - } - } - auto e = std::chrono::high_resolution_clock::now(); - std::chrono::duration diff = e - s; - - float qps = (float) (query_num / diff.count()); - - float recall = 0; - // if (calc_recall_flag) - - /* recall = (float) diskann::calculate_recall( - (_u32) query_num, gt_ids, gt_dists, (_u32) gt_dim, - query_result_ids[test_id].data(), (_u32) recall_at, (_u32) - recall_at); - */ - - for (int j = 0; j < 6; j++) - std::sort(latency_stats[j].begin(), latency_stats[j].end()); - double mean_latency = 0; - for (uint64_t q = 0; q < query_num; q++) { - double mean_latency_temp = 0; - for (int j = 0; j < 6; j++) { - mean_latency_temp += latency_stats[j][q]; - } - mean_latency += (mean_latency_temp / 6); - } - mean_latency /= query_num; - - double latency_99 = 0; - for (int j = 0; j < 6; j++) { - latency_99 += latency_stats[j][(_u64)(0.99 * query_num)]; - } - - latency_99 /= 6; - - std::cout << std::setw(4) << L << std::setw(12) << qps << std::setw(18) - << (float) mean_latency << std::setw(15) << (float) latency_99 - << std::setw(12) << recall << std::endl; - } - - /* std::cout << "Done searching. Now saving results " << std::endl; - _u64 test_id = 0; - for (auto L : Lvec) { - // recall_at = L; - std::string cur_result_path = - result_output_prefix + "_" + std::to_string(L) + "_idx_uint32.bin"; - diskann::save_bin<_u32>(cur_result_path, query_result_ids[test_id].data(), - query_num, recall_at); - test_id++; - } - */ - diskann::aligned_free(query); - return 0; -} - -int main(int argc, char** argv) { - if (argc < 10) { - std::cout - << "Usage: " << argv[0] - << " [index_type] [data_file.bin] " - "[memory_index_path] [frozen_pt[0/1]] [tags[0/1]]" - " [query_file.bin] [truthset.bin (use \"null\" for none)] " - " [K] [result_output_prefix] " - " [L1] [L2] etc. See README for more information on parameters. " - << std::endl; - exit(-1); - } - if (std::string(argv[1]) == std::string("int8")) - search_memory_index(argc, argv); - else if (std::string(argv[1]) == std::string("uint8")) - search_memory_index(argc, argv); - else if (std::string(argv[1]) == std::string("float")) - search_memory_index(argc, argv); - else - std::cout << "Unsupported type. Use float/int8/uint8" << std::endl; -} diff --git a/tests/test_concurr_merge_insert.cpp b/tests/test_concurr_merge_insert.cpp index c8a6f73693..040831197a 100644 --- a/tests/test_concurr_merge_insert.cpp +++ b/tests/test_concurr_merge_insert.cpp @@ -447,9 +447,9 @@ void run_iter(diskann::MergeInsert & merge_insert, std::async(std::launch::async, merge_kernel, std::ref(merge_insert)); while (!(::_insertions_done.load() && ::_del_done.load())) { - /* std::cout << "Search at " << ::global_timer.elapsed() / 1000000 - << " seconds " << std::endl; - search_kernel(merge_insert, active_set);*/ + std::cout << "Search at " << ::global_timer.elapsed() / 1000000 + << " seconds " << std::endl; + search_kernel(merge_insert, active_set); std::this_thread::sleep_for(std::chrono::milliseconds(5000)); } @@ -457,11 +457,11 @@ void run_iter(diskann::MergeInsert & merge_insert, ::_insertions_done.store(false); ::_del_done.store(false); - std::cout << "Searching all indices" << std::endl; - std::cout << "Search at " << ::global_timer.elapsed() / 1000000 - << " seconds " << std::endl; - search_kernel(merge_insert, active_set, true); - + std::cout << "Searching all indices" << std::endl; + std::cout << "Search at " << ::global_timer.elapsed() / 1000000 + << " seconds " << std::endl; + search_kernel(merge_insert, active_set, true); + std::cout << "ITER: Seeding iteration" << "\n"; // seed the iteration @@ -478,10 +478,10 @@ void run_iter(diskann::MergeInsert & merge_insert, std::future_status merge_status; do { merge_status = ::merge_future.wait_for(std::chrono::milliseconds(1)); - /* std::cout << "Search at " << ::global_timer.elapsed() / 1000000 - << " seconds " << std::endl; - search_kernel(merge_insert, active_set); - */ + std::cout << "Search at " << ::global_timer.elapsed() / 1000000 + << " seconds " << std::endl; + search_kernel(merge_insert, active_set); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); } while ((merge_status != std::future_status::ready)); } @@ -652,6 +652,7 @@ void run_all_iters(std::string base_prefix, std::string merge_prefix, } int main(int argc, char **argv) { + std::cout << "Entering main()" << std::endl; if (argc < 20) { std::cout << "Correct usage: " << argv[0] << " " @@ -673,7 +674,6 @@ int main(int argc, char **argv) { int arg_no = 1; std::string index_type = argv[arg_no++]; TMP_FOLDER = argv[arg_no++]; - std::cout << "TMP_FOLDER : " << TMP_FOLDER << std::endl; std::string base_prefix(argv[arg_no++]); std::string merge_prefix(argv[arg_no++]); std::string mem_prefix(argv[arg_no++]); @@ -697,6 +697,7 @@ int main(int argc, char **argv) { ::Lvec.push_back(curL); } + std::cout << "Assigning parameters" << std::endl; params[std::string("n_iters")] = n_iters; params[std::string("insert_count")] = insert_count; params[std::string("delete_count")] = delete_count; @@ -727,6 +728,7 @@ int main(int argc, char **argv) { else active_tags_filename = base_prefix + "_disk.index.tags"; + std::cout << "Calling run_all_iters()" << std::endl; if (index_type == std::string("float")) { diskann::DistanceL2 dist_cmp; run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, @@ -743,4 +745,5 @@ int main(int argc, char **argv) { std::cout << "Unsupported type : " << index_type << "\n"; } std::cout << "Exiting\n"; + return 0; } diff --git a/tests/test_delete_insert_cycles.cpp b/tests/test_delete_insert_cycles.cpp deleted file mode 100644 index b48a6ad96b..0000000000 --- a/tests/test_delete_insert_cycles.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include -#include -#include -#include -#include -#include - -#include "utils.h" -#include "tsl/robin_set.h" - -#ifndef _WINDOWS -#include -#include -#include -#endif - -#include "memory_mapper.h" - -template -int build_incremental_index(const std::string& data_path, - const std::string& memory_index_file, - const unsigned L, const unsigned R, - const unsigned C, const unsigned num_rnds, - const float alpha, const std::string& save_path, - const unsigned num_cycles, int fraction, int tags, - int delete_mode) { - diskann::Parameters paras; - paras.Set("L", L); - paras.Set("R", R); - paras.Set("C", C); - paras.Set("alpha", alpha); - paras.Set("num_rnds", num_rnds); - - T* data_load = NULL; - size_t num_points, dim, aligned_dim; - - diskann::load_aligned_bin(data_path.c_str(), data_load, num_points, dim, - aligned_dim); - - typedef int TagT; - - bool eager; - if (delete_mode == 0) { - eager = false; - } else { - eager = true; - } - - diskann::Index index(diskann::L2, dim, num_points, 1, true, eager); - - if (tags == 0) - index.load(memory_index_file.c_str(), data_path.c_str()); - else { - auto tag_path = memory_index_file + ".tags"; - index.load(memory_index_file.c_str(), data_path.c_str(), true, - tag_path.c_str()); - } - - unsigned i = 0; - while (i < num_cycles) { - size_t delete_size = (num_points / 100) * fraction; - tsl::robin_set delete_set; - while (delete_set.size() < delete_size) - delete_set.insert(rand() % num_points); - std::vector delete_vector(delete_set.begin(), delete_set.end()); - diskann::cout << "\nDeleting " << delete_vector.size() << " elements... "; - - { - index.enable_delete(); - if (delete_mode == 0) { // Lazy delete - diskann::Timer del_timer; - std::vector failed_tags; - if (index.lazy_delete(delete_set, failed_tags) < 0) - std::cerr << "Error in delete_points" << std::endl; - if (failed_tags.size() > 0) - std::cerr << "Failed to delete " << failed_tags.size() << " tags" - << std::endl; - diskann::cout << "completed in " << del_timer.elapsed() / 1000000.0 - << "sec.\n" - << "Starting consolidation... " << std::flush; - - diskann::Timer timer; - if (index.disable_delete(paras, true) != 0) { - std::cerr << "Disable delete failed" << std::endl; - return -1; - } - diskann::cout << "completed in " << timer.elapsed() / 1000000.0 - << "sec.\n" - << std::endl; - - } else { // Eager delete - diskann::Timer timer; -#pragma omp parallel for - for (auto iter = delete_vector.begin(); iter < delete_vector.end(); - ++iter) { - if (index.eager_delete(*iter, paras, delete_mode) != 0) - std::cerr << "Delete tag " << *iter << " not found" << std::endl; - } - diskann::cout << "Eager delete time: " << timer.elapsed() / 1000000.0 - << "sec\n"; - if (index.disable_delete(paras, false) != 0) { - std::cerr << "Disable delete failed" << std::endl; - return -1; - } - } - } - - auto save_path_del = save_path + ".del" + std::to_string(i); - index.save(save_path_del.c_str()); - - { - diskann::Timer timer; -#pragma omp parallel for - for (size_t i = 0; i < delete_vector.size(); i++) { - unsigned p = delete_vector[i]; - index.insert_point(data_load + (size_t) p * (size_t) aligned_dim, paras, - p); - } - diskann::cout << "Re-incremental time: " << timer.elapsed() / 1000 - << "ms\n"; - } - - auto save_path_reinc = save_path + ".reinc" + std::to_string(i); - index.save(save_path_reinc.c_str()); - i++; - } - - delete[] data_load; - - return 0; -} - -int main(int argc, char** argv) { - if (argc != 14) { - diskann::cout - << "Correct usage: " << argv[0] - << " type[int8/uint8/float] data_file index_file L R C alpha " - "num_rounds " - << "save_graph_file #cycles " - "#percent_points_deleted_in_each_cycle tags_available?[0/1] " - "delete_mode[0-lazy/1-eager-all/2-eager-selected] " - << std::endl; - exit(-1); - } - - unsigned L = (unsigned) atoi(argv[4]); - unsigned R = (unsigned) atoi(argv[5]); - unsigned C = (unsigned) atoi(argv[6]); - float alpha = (float) std::atof(argv[7]); - unsigned num_rnds = (unsigned) std::atoi(argv[8]); - std::string save_path(argv[9]); - unsigned num_cycles = (unsigned) atoi(argv[10]); - int fraction = (int) atoi(argv[11]); - int tags = (int) atoi(argv[12]); - int delete_mode = (int) atoi(argv[13]); - - if (std::string(argv[1]) == std::string("int8")) - build_incremental_index(argv[2], argv[3], L, R, C, num_rnds, alpha, - save_path, num_cycles, fraction, tags, - delete_mode); - else if (std::string(argv[1]) == std::string("uint8")) - build_incremental_index(argv[2], argv[3], L, R, C, num_rnds, alpha, - save_path, num_cycles, fraction, tags, - delete_mode); - else if (std::string(argv[1]) == std::string("float")) - build_incremental_index(argv[2], argv[3], L, R, C, num_rnds, alpha, - save_path, num_cycles, fraction, tags, - delete_mode); - else - diskann::cout << "Unsupported type. Use float/int8/uint8" << std::endl; -} diff --git a/tests/test_diskpriority_io.cpp b/tests/test_diskpriority_io.cpp deleted file mode 100644 index be36c57146..0000000000 --- a/tests/test_diskpriority_io.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include -#include -#include -#include -#include "DiskPriorityIO.h" - -#define NUM_THREADS 4 -#define NUM_CHUNKS 16 - -std::string getTempFileName() { - char tempPath[256]; - char tempFileName[MAX_PATH]; - - GetTempPathA(256, tempPath); - GetTempFileNameA(tempPath, "KNN", 0, tempFileName); - - return std::string(tempFileName); -} - -void saveContents(const char* fileName, char* pBytes, int count) { - std::fstream file; - file.open(fileName, std::ios::binary | std::ios::out); - file.write(pBytes, count); - file.flush(); - file.close(); -} - -void processData(HANDLE evnt, __int8* readVec, - ANNIndex::AsyncReadRequest request, bool result) { - // What do we do here? - std::cout << "Entering callback: " << result << std::endl; - memcpy(readVec + request.m_offset, request.m_buffer, request.m_readSize); - SetEvent(evnt); -} - -int main(int argc, char** argv) { - size_t fileSize = ((size_t) NUM_CHUNKS) * 1024 * 1024; - char* pByte = (char*) malloc(fileSize); - char* readVec = (char*) malloc(fileSize); - memset(readVec, 0, fileSize); - - for (int i = 0; i < fileSize; i++) { - *(pByte + i) = (char) (rand() % 8); - } - std::string s = getTempFileName(); - saveContents(s.c_str(), pByte, fileSize); - std::cout << "Saved file of size " << fileSize << " to " << s << std::endl; - - int batchSize = fileSize / NUM_THREADS; - std::cout << "Sending " << NUM_CHUNKS << " requests per batch. " - << NUM_THREADS << " batches " << std::endl; - - for (int i = 0; i < NUM_THREADS; i++) { - diskann::DiskPriorityIO iohandler( - ANNIndex::DiskIOScenario::DIS_HighPriorityUserRead); - iohandler.Initialize(s.c_str()); - - HANDLE events[NUM_CHUNKS]; - std::vector requests; - requests.reserve(NUM_CHUNKS); - - int chunkSize = batchSize / NUM_CHUNKS; - for (int j = 0; j < NUM_CHUNKS; j++) { - ANNIndex::AsyncReadRequest& request = requests[j]; - request.m_buffer = new __int8[chunkSize]; - memset(request.m_buffer, 0, chunkSize); - request.m_offset = i * batchSize + j * chunkSize; - - assert(request.m_offset + chunkSize <= fileSize); - request.m_readSize = chunkSize; - - auto evnt = CreateEvent(NULL, FALSE, FALSE, NULL); - events[j] = evnt; - - std::function fptr = std::bind( - &processData, evnt, readVec, request, std::placeholders::_1); - request.m_callback = fptr; - - iohandler.ReadFileAsync(request); - } - - WaitForMultipleObjectsEx(NUM_CHUNKS, events, TRUE, INFINITE, TRUE); - - for (auto evnt : events) { - CloseHandle(evnt); - } - iohandler.ShutDown(); - } - - int k = 0; - for (k = 0; k < fileSize; k++) { - if (readVec[k] != pByte[k]) { - std::cerr << "Expected " << pByte[k] << " got " << readVec[k] - << " at index: " << k << std::endl; - break; - } - } - if (k == fileSize - 1) { - std::cout << "Successfully verified read." << std::endl; - } else { - std::cout << "Read verification failed." << std::endl; - } -} diff --git a/tests/test_index_merger.cpp b/tests/test_index_merger.cpp deleted file mode 100644 index a928806b2f..0000000000 --- a/tests/test_index_merger.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "v2/index_merger.h" - -#include -#include -#include -#include -#include -#include - -#include "aux_utils.h" -#include "utils.h" - -#ifndef _WINDOWS -#include -#include -#include -#endif - -template -void run(const char* disk_in, const std::vector& mem_in, - const char* disk_out, const char* deleted_tags, const uint32_t ndims, - diskann::Distance* dist, const uint32_t beam_width, - const uint32_t range, const uint32_t l_index, const float alpha, - const uint32_t maxc) { - diskann::cout << "Instantiating StreamingMerger\n"; - diskann::StreamingMerger merger(disk_in, mem_in, disk_out, deleted_tags, - ndims, dist, beam_width, range, l_index, - alpha, maxc); - - diskann::cout << "Starting merge\n"; - merger.merge(); - - diskann::cout << "Finished merging\n"; -} - -int main(int argc, char** argv) { - if (argc < 13) { - diskann::cout - << "Correct usage: " << argv[0] - << " " - << " " - " .." - << std::endl; - exit(-1); - } - diskann::cout.setf(std::ios::unitbuf); - - int arg_no = 1; - std::string index_type = argv[arg_no++]; - // assert(index_type == std::string("float")); - const char* disk_in = argv[arg_no++]; - diskann::cout << "Input SSD-DiskANN: " << disk_in << "\n"; - const char* disk_out = argv[arg_no++]; - diskann::cout << "Output SSD-DiskANN: " << disk_out << "\n"; - const char* delete_list_file = argv[arg_no++]; - diskann::cout << "Deleted tags file : " << delete_list_file << "\n"; - uint32_t data_dim = (uint32_t) atoi(argv[arg_no++]); - diskann::cout << "Data dim : " << data_dim << "\n"; - uint32_t beam_width = (uint32_t) atoi(argv[arg_no++]); - diskann::cout << "Beam Width : " << beam_width << "\n"; - uint32_t range = (uint32_t) atoi(argv[arg_no++]); - diskann::cout << "Range (max out-degree) : " << range << "\n"; - uint32_t L_index = (uint32_t) atoi(argv[arg_no++]); - diskann::cout << "L-index : " << L_index << "\n"; - float alpha = (float) atof(argv[arg_no++]); - diskann::cout << "alpha : " << alpha << "\n"; - uint32_t maxc = (uint32_t) atoi(argv[arg_no++]); - diskann::cout << "max-C : " << maxc << "\n"; - TMP_FOLDER = argv[arg_no++]; - diskann::cout << "Working folder : " << TMP_FOLDER << "\n"; - std::vector mem_in; - while (arg_no < argc) { - const char* cur_mem_in = argv[arg_no++]; - diskann::cout << "Mem-DiskANN index #" << mem_in.size() + 1 << " : " - << cur_mem_in << "\n"; - mem_in.emplace_back(cur_mem_in); - } - - if (index_type == std::string("float")) { - diskann::DistanceL2 dist_cmp; - run(disk_in, mem_in, disk_out, delete_list_file, data_dim, &dist_cmp, - beam_width, range, L_index, alpha, maxc); - } else if (index_type == std::string("uint8")) { - diskann::DistanceL2UInt8 dist_cmp; - run(disk_in, mem_in, disk_out, delete_list_file, data_dim, - &dist_cmp, beam_width, range, L_index, alpha, maxc); - } else if (index_type == std::string("int8")) { - diskann::DistanceL2Int8 dist_cmp; - run(disk_in, mem_in, disk_out, delete_list_file, data_dim, - &dist_cmp, beam_width, range, L_index, alpha, maxc); - } else { - diskann::cout << "Unsupported type : " << index_type << "\n"; - } - diskann::cout << "Exiting\n"; -} diff --git a/tests/test_index_merger_steady_state.cpp b/tests/test_index_merger_steady_state.cpp deleted file mode 100644 index 3157a635a5..0000000000 --- a/tests/test_index_merger_steady_state.cpp +++ /dev/null @@ -1,549 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "v2/index_merger.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "aux_utils.h" -#include "utils.h" - -#ifndef _WINDOWS -#include -#include -#include -#else -#include "bing_aligned_file_reader.h" -#endif - -#ifdef USE_TCMALLOC -#include -#endif - -// random number generator -std::random_device dev; -std::mt19937 rng(dev()); - -std::vector Lvec; -tsl::robin_map params; -float mem_alpha, merge_alpha; -uint32_t medoid_id = std::numeric_limits::max(); -bool save_index_as_one_file; -std::string TMP_FOLDER; - -template -void seed_iter(tsl::robin_set &active_set, - tsl::robin_set &inactive_set, T *all_points, - const std::string &inserted_points_file, - const std::string &inserted_tags_file, - const std::string &deleted_tags_file) { - const uint32_t insert_count = params[std::string("insert_count")]; - const uint32_t delete_count = params[std::string("delete_count")]; - const uint32_t ndims = params[std::string("ndims")]; - diskann::cout << "ITER: start = " << active_set.size() << ", " - << inactive_set.size() << "\n"; - - // pick `delete_count` tags - std::vector active_vec(active_set.begin(), active_set.end()); - std::shuffle(active_vec.begin(), active_vec.end(), rng); - std::vector delete_vec; - if (active_vec.size() < delete_count) - delete_vec.insert(delete_vec.end(), active_vec.begin(), active_vec.end()); - else - delete_vec.insert(delete_vec.end(), active_vec.begin(), - active_vec.begin() + delete_count); - // assert(delete_vec.size() == delete_count); - active_set.clear(); - active_set.insert(active_vec.begin() + delete_vec.size(), active_vec.end()); - diskann::cout << "ITER: DELETE - " << delete_vec.size() << " IDs in " - << deleted_tags_file << "\n"; - TagT *del_tags = new TagT[delete_vec.size()]; - for (size_t i = 0; i < delete_vec.size(); i++) - *(del_tags + i) = delete_vec[i]; - diskann::save_bin(deleted_tags_file, del_tags, delete_vec.size(), 1); - delete[] del_tags; - /* std::ofstream deleted_tags_writer(deleted_tags_file, std::ios::trunc); - for (auto &id : delete_vec) { - deleted_tags_writer << id << std::endl; - } - deleted_tags_writer.close(); */ - // pick `insert_count` tags - std::vector inactive_vec(inactive_set.begin(), inactive_set.end()); - std::shuffle(inactive_vec.begin(), inactive_vec.end(), rng); - std::vector insert_vec; - if (inactive_vec.size() < insert_count) - insert_vec.insert(insert_vec.end(), inactive_vec.begin(), - inactive_vec.end()); - else - insert_vec.insert(insert_vec.end(), inactive_vec.begin(), - inactive_vec.begin() + insert_count); - inactive_set.clear(); - diskann::cout << "ITER: INSERT - " << insert_vec.size() << " IDs in " - << inserted_tags_file << "\n"; - inactive_set.insert(inactive_vec.begin() + insert_vec.size(), - inactive_vec.end()); - std::sort(insert_vec.begin(), insert_vec.end()); - TagT *ins_tags = new TagT[insert_vec.size()]; - for (size_t i = 0; i < insert_vec.size(); i++) - *(ins_tags + i) = insert_vec[i]; - diskann::save_bin(inserted_tags_file, ins_tags, insert_vec.size(), 1); - delete[] ins_tags; - /* std::ofstream inserted_tags_writer(inserted_tags_file, std::ios::trunc); - for (auto &id : insert_vec) { - inserted_tags_writer << id << std::endl; - } - inserted_tags_writer.close(); - */ - std::ofstream inserted_points_writer(inserted_points_file, std::ios::binary); - T *new_pts = new T[(uint64_t) insert_vec.size() * (uint64_t) ndims]; - for (uint64_t idx = 0; idx < insert_vec.size(); idx++) { - uint32_t actual_idx = insert_vec[idx]; - T * src_ptr = all_points + actual_idx * (uint64_t) ndims; - T * dest_ptr = new_pts + idx * (uint64_t) ndims; - std::memcpy(dest_ptr, src_ptr, ndims * sizeof(T)); - } - uint32_t npts_u32 = (uint32_t) insert_vec.size(); - uint32_t ndims_u32 = ndims; - inserted_points_writer.write((char *) &npts_u32, sizeof(uint32_t)); - inserted_points_writer.write((char *) &ndims_u32, sizeof(uint32_t)); - inserted_points_writer.write( - (char *) new_pts, - (uint64_t) insert_vec.size() * (uint64_t) ndims * sizeof(T)); - inserted_points_writer.close(); - delete[] new_pts; - - // balance tags - inactive_set.insert(delete_vec.begin(), delete_vec.end()); - active_set.insert(insert_vec.begin(), insert_vec.end()); - diskann::cout << "ITER: end = " << active_set.size() << ", " - << inactive_set.size() << "\n"; - -#ifndef _WINDOWS - malloc_stats(); -#endif -} - -float compute_active_recall(const uint32_t *result_tags, - const uint32_t result_count, - const uint32_t *gs_tags, const uint64_t gs_count, - const tsl::robin_set &inactive_set) { - tsl::robin_set active_gs; - for (uint32_t i = 0; i < gs_count && active_gs.size() < result_count; i++) { - auto iter = inactive_set.find(gs_tags[i]); - if (iter == inactive_set.end()) { - active_gs.insert(gs_tags[i]); - } - } - uint32_t match = 0; - for (uint32_t i = 0; i < result_count; i++) { - match += (active_gs.find(result_tags[i]) != active_gs.end()); - } - return ((float) match / (float) result_count) * 100; -} - -// borrowed from tests/search_disk_index.cpp -template -void search_disk_index(const std::string & index_prefix_path, - const tsl::robin_set &active_tags, - const std::string & query_path, - const std::string & gs_path) { - std::string pq_prefix = index_prefix_path + "_pq"; - std::string disk_index_file = index_prefix_path + "_disk.index"; - std::string warmup_query_file = index_prefix_path + "_sample_data.bin"; - // uint64_t num_nodes_to_cache = - // params[std::string("disk_search_node_cache_count")]; - uint32_t num_threads = params[std::string("disk_search_nthreads")]; - uint32_t beamwidth = params[std::string("beam_width")]; - std::string query_bin = query_path; - std::string truthset_bin = gs_path; - uint64_t recall_at = params[std::string("recall_k")]; - // uint64_t search_L = params[std::string("search_L")]; - - // hold data - T * query = nullptr; - unsigned *gt_ids = nullptr; - uint32_t *gt_tags = nullptr; - float * gt_dists = nullptr; - size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; - - // load query + truthset - diskann::load_aligned_bin(query_bin, query, query_num, query_dim, - query_aligned_dim); - diskann::cout << "Loaded query file" << std::endl; - diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim); - diskann::cout << "Loaded truthset" << std::endl; - if (gt_num != query_num) { - diskann::cout - << "Error. Mismatch in number of queries and ground truth data" - << std::endl; - } - -#ifdef _WINDOWS - std::shared_ptr reader( - new diskann::BingAlignedFileReader()); -#else - std::shared_ptr reader(new LinuxAlignedFileReader()); -#endif - - // TODO: Change Metric - std::unique_ptr> pFlashIndex = - std::make_unique>( - diskann::Metric::L2, reader, ::save_index_as_one_file, true); - int res = pFlashIndex->load(index_prefix_path.c_str(), num_threads); - if (res != 0) { - std::cerr << "Failed to load index.\n"; - exit(-1); - } - - diskann::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); - diskann::cout.precision(2); - - std::string recall_string = "Recall@" + std::to_string(recall_at); - diskann::cout << std::setw(6) << "L" << std::setw(12) << "QPS" - << std::setw(16) << "Mean Latency" << std::setw(16) - << "90 Latency" << std::setw(16) << "95 Latency" - << std::setw(16) << "99 Latency" << std::setw(16) - << "99.9 Latency" << std::setw(16) << "Mean IOs" - << std::setw(16) << recall_string << std::setw(16) << "CPU (s)" - << std::endl; - // prep for search - std::vector query_result_tags; - std::vector query_result_dists; - query_result_dists.resize(recall_at * query_num); - query_result_tags.resize(recall_at * query_num); - - for (size_t test_id = 0; test_id < ::Lvec.size(); test_id++) { - diskann::QueryStats *stats = new diskann::QueryStats[query_num]; - uint32_t L = Lvec[test_id]; - auto s = std::chrono::high_resolution_clock::now(); -#pragma omp parallel for schedule(dynamic, 1) // num_threads(1) - for (_s64 i = 0; i < (int64_t) query_num; i++) { - int res_count = pFlashIndex->cached_beam_search( - query + (i * query_aligned_dim), recall_at, L, - query_result_tags.data() + (i * recall_at), - query_result_dists.data() + (i * recall_at), beamwidth, stats + i); - } - - auto e = std::chrono::high_resolution_clock::now(); - std::chrono::duration diff = e - s; - float qps = (float) ((1.0 * (double) query_num) / (1.0 * diff.count())); - // compute mean recall, IOs - double mean_recall = 0.0; - mean_recall = diskann::calculate_recall( - (unsigned) query_num, gt_ids, gt_dists, (unsigned) gt_dim, - query_result_tags.data(), (unsigned) recall_at, (unsigned) recall_at, - active_tags); - float mean_latency = (float) diskann::get_mean_stats( - stats, query_num, - [](const diskann::QueryStats &stats) { return stats.total_us; }); - - float latency_90 = (float) diskann::get_percentile_stats( - stats, query_num, (float) 0.900, - [](const diskann::QueryStats &stats) { return stats.total_us; }); - - float latency_95 = (float) diskann::get_percentile_stats( - stats, query_num, (float) 0.950, - [](const diskann::QueryStats &stats) { return stats.total_us; }); - - float latency_99 = (float) diskann::get_percentile_stats( - stats, query_num, (float) 0.990, - [](const diskann::QueryStats &stats) { return stats.total_us; }); - - float latency_999 = (float) diskann::get_percentile_stats( - stats, query_num, (float) 0.999, - [](const diskann::QueryStats &stats) { return stats.total_us; }); - - float mean_ios = (float) diskann::get_mean_stats( - stats, query_num, - [](const diskann::QueryStats &stats) { return stats.n_ios; }); - - float mean_cpuus = (float) diskann::get_mean_stats( - stats, query_num, - [](const diskann::QueryStats &stats) { return stats.cpu_us; }); - diskann::cout << std::setw(6) << L << std::setw(12) << qps << std::setw(16) - << mean_latency << std::setw(16) << latency_90 - << std::setw(16) << latency_95 << std::setw(16) << latency_99 - << std::setw(16) << latency_999 << std::setw(16) << mean_ios - << std::setw(16) << mean_recall << std::setw(16) << mean_cpuus - << std::endl; - delete[] stats; - } - diskann::aligned_free(query); - delete[] gt_ids; - delete[] gt_dists; - delete[] gt_tags; -} - -// borrowed from tests/build_memory_index.cpp -template -void build_in_memory_index(const std::string &data_path, - const std::string &save_path, - const std::string &tag_path) { - const uint32_t R = params[std::string("range")]; - const uint32_t L = params[std::string("mem_l_index")]; - const float alpha = ::mem_alpha; - const uint32_t num_threads = params[std::string("mem_nthreads")]; - - diskann::Parameters paras; - paras.Set("R", R); - paras.Set("L", L); - // maximum candidate set size during pruning procedure - paras.Set("C", 750); - paras.Set("alpha", alpha); - paras.Set("saturate_graph", 0); - paras.Set("num_threads", num_threads); - - _u64 data_num, data_dim; - diskann::get_bin_metadata(data_path, data_num, data_dim); - diskann::Index index(diskann::L2, data_dim, data_num, true, true, true, - false); - auto s = std::chrono::high_resolution_clock::now(); - index.build(data_path.c_str(), data_num, paras, tag_path.c_str()); - std::chrono::duration diff = - std::chrono::high_resolution_clock::now() - s; - - diskann::cout << "Indexing time: " << diff.count() << "\n"; - index.save(save_path.c_str()); -} - -// borrowed from tests/test_index_merger.cpp -template -void run_index_merger(const char * disk_in, - const std::vector &mem_in, - const char *disk_out, const char *deleted_tags, - diskann::Distance *dist) { - const uint32_t ndims = params[std::string("ndims")]; - const uint32_t beam_width = params[std::string("beam_width")]; - const uint32_t maxc = params[std::string("merge_maxc")]; - const float alpha = ::merge_alpha; - const uint32_t l_index = params[std::string("merge_l_index")]; - const uint32_t range = params[std::string("range")]; - diskann::cout << "ITER: MERGE " << disk_in << " + " << mem_in[0] << " -> " - << disk_out << "\n"; - - diskann::cout << "Instantiating StreamingMerger\n"; - diskann::Metric metric = diskann::Metric::L2; - diskann::StreamingMerger merger(ndims, dist, metric, beam_width, - range, l_index, alpha, maxc, - ::save_index_as_one_file); - diskann::cout << "Starting merge\n"; - const std::string working_folder = TMP_FOLDER; - // merger.merge(disk_in, mem_in, disk_out, deleted_tags, working_folder); - - diskann::cout << "Finished merging\n"; -} - -template -void run_iter(const std::string &base_prefix, const std::string &merge_prefix, - const std::string &mem_prefix, const std::string &deleted_tags, - tsl::robin_set &active_set, - tsl::robin_set &inactive_set, - const std::string &query_file, const std::string &gs_file, - T *data, diskann::Distance *dist_cmp) { - // uint64_t initial_count = active_set.size() + inactive_set.size(); - // files for mem-DiskANN - std::string mem_pts_file = mem_prefix + ".index.data"; - std::string mem_index_file = mem_prefix + ".index"; - std::string mem_tags_file = mem_prefix + ".index.tags"; - - diskann::cout << "ITER: Seeding iteration" - << "\n"; - - // seed the iteration - seed_iter(active_set, inactive_set, data, mem_pts_file, mem_tags_file, - deleted_tags); - - // assert(active_set.size() + inactive_set.size() == initial_count); - - diskann::cout << "ITER: Building memory index for inserted points" - << "\n"; - // build in-memory index - build_in_memory_index(mem_pts_file, mem_index_file, mem_tags_file); - - // run merge - std::vector mem_in; - mem_in.push_back(mem_index_file); - diskann::cout << "ITER: Folding mem-DiskANN into SSD-DiskANN" << std::endl; - - run_index_merger(base_prefix.c_str(), mem_in, merge_prefix.c_str(), - deleted_tags.c_str(), dist_cmp); - - // search PQ Flash Index - diskann::cout << "ITER: Searching SSD-DiskANN" << std::endl; - search_disk_index(merge_prefix, active_set, query_file, gs_file); -} - -template -void run_all_iters(const std::string &base_prefix, - const std::string &merge_prefix, - const std::string &mem_prefix, - const std::string &deleted_tags, - const std::string &data_file, - const std::string &active_tags_file, - const std::string &query_file, const std::string &gs_file, - diskann::Distance *dist_cmp, const uint32_t n_iters) { - // load all data points - std::unique_ptr data; - uint64_t npts = 0, ndims = 0; - diskann::load_bin(data_file, data, npts, ndims); - params[std::string("ndims")] = (uint32_t) ndims; - - // load active tags - size_t tags_pts, tags_dim; - TagT * active_tags_data; - - if (::save_index_as_one_file) { - uint64_t *metadata; - size_t nr, nc; - diskann::load_bin(active_tags_file, metadata, nr, nc); - diskann::load_bin(active_tags_file, active_tags_data, tags_pts, - tags_dim, metadata[7]); - } else { - diskann::load_bin(active_tags_file, active_tags_data, tags_pts, - tags_dim); - } - - diskann::cout << "Tag dim = " << tags_dim << ", Tags pts = " << tags_pts - << std::endl; - tsl::robin_set active_tags; - for (size_t i = 0; i < tags_pts; i++) - active_tags.insert(*(active_tags_data + i)); - - // read medoid ID from base_prefix - std::ifstream disk_reader(base_prefix + "_disk.index", std::ios::binary); - disk_reader.seekg(2 * sizeof(uint32_t), std::ios::beg); - disk_reader.seekg(2 * sizeof(uint64_t), std::ios::cur); - uint64_t medoid = std::numeric_limits::max(); - disk_reader.read((char *) &medoid, sizeof(uint64_t)); - diskann::cout << "Detected medoid = " << medoid - << " ==> excluding from insert/deletes.\n"; - ::medoid_id = (uint32_t) medoid; - - // generate inactive tags - tsl::robin_set inactive_tags; - for (uint32_t i = 0; i < npts; i++) { - auto iter = active_tags.find(i); - if (iter == active_tags.end()) { - inactive_tags.insert(i); - } - } - - // remove medoid from active_set - active_tags.erase((uint32_t)::medoid_id); - - diskann::cout << "Searching before any iterations" << std::endl; - search_disk_index(base_prefix, active_tags, query_file, gs_file); -#ifdef USE_TCMALLOC - MallocExtension::instance()->ReleaseFreeMemory(); -#endif - for (uint32_t i = 0; i < n_iters; i++) { - diskann::cout << "ITER: Iteration #" << i + 1 << "\n"; - std::string base, merge; - if (i % 2 == 0) { - base = base_prefix; - merge = merge_prefix; - } else { - base = merge_prefix; - merge = base_prefix; - } - - run_iter(base, merge, mem_prefix, deleted_tags, active_tags, - inactive_tags, query_file, gs_file, data.get(), dist_cmp); -#ifdef USE_TCMALLOC - MallocExtension::instance()->ReleaseFreeMemory(); -#endif - } -} - -int main(int argc, char **argv) { - if (argc < 17) { - diskann::cout - << "Correct usage: " << argv[0] - << " " - " " - << " " - " " - << " " - " ..." - << "\n WARNING: Other parameters set inside CPP source." << std::endl; - exit(-1); - } - diskann::cout.setf(std::ios::unitbuf); - - std::cout << "Press any key to continue" << std::endl; - char x; - std::cin >> x; - - int arg_no = 1; - std::string index_type = argv[arg_no++]; - ::TMP_FOLDER = argv[arg_no++]; - // assert(index_type == std::string("float")); - std::string base_prefix(argv[arg_no++]); - std::string merge_prefix(argv[arg_no++]); - std::string mem_prefix(argv[arg_no++]); - std::string deleted_tags_file(argv[arg_no++]); - std::string data_bin(argv[arg_no++]); - int single_file = atoi(argv[arg_no++]); - std::string query_bin(argv[arg_no++]); - std::string gt_bin(argv[arg_no++]); - uint32_t n_iters = (uint32_t) atoi(argv[arg_no++]); - uint32_t insert_count = (uint32_t) atoi(argv[arg_no++]); - uint32_t delete_count = (uint32_t) atoi(argv[arg_no++]); - uint32_t range = (uint32_t) atoi(argv[arg_no++]); - uint32_t recall_k = (uint32_t) atoi(argv[arg_no++]); - - for (int ctr = arg_no; ctr < argc; ctr++) { - _u32 curL = std::atoi(argv[ctr]); - if (curL >= recall_k) - ::Lvec.push_back(curL); - } - params[std::string("insert_count")] = insert_count; - params[std::string("delete_count")] = delete_count; - params[std::string("range")] = range; - params[std::string("recall_k")] = recall_k; - // params[std::string("search_L")] = search_L; - - // hard-coded params - params[std::string("disk_search_node_cache_count")] = 2000; - params[std::string("disk_search_nthreads")] = 20; - params[std::string("beam_width")] = 4; - params[std::string("mem_l_index")] = 75; - mem_alpha = (float) 1.2; - merge_alpha = (float) 1.2; - params[std::string("mem_nthreads")] = 20; - params[std::string("merge_maxc")] = (uint32_t)(range * 2.5); - params[std::string("merge_l_index")] = 75; - - ::save_index_as_one_file = (bool) single_file; - std::string active_tags_filename; - if (single_file) - active_tags_filename = base_prefix + "_disk.index"; - else - active_tags_filename = base_prefix + "_disk.index.tags"; - - if (index_type == std::string("float")) { - diskann::DistanceL2 dist_cmp; - run_all_iters(base_prefix, merge_prefix, mem_prefix, - deleted_tags_file, data_bin, active_tags_filename, - query_bin, gt_bin, &dist_cmp, n_iters); - } else if (index_type == std::string("uint8")) { - diskann::DistanceL2UInt8 dist_cmp; - run_all_iters(base_prefix, merge_prefix, mem_prefix, - deleted_tags_file, data_bin, active_tags_filename, - query_bin, gt_bin, &dist_cmp, n_iters); - } else if (index_type == std::string("int8")) { - diskann::DistanceL2Int8 dist_cmp; - run_all_iters(base_prefix, merge_prefix, mem_prefix, - deleted_tags_file, data_bin, active_tags_filename, - query_bin, gt_bin, &dist_cmp, n_iters); - } else { - diskann::cout << "Unsupported type : " << index_type << "\n"; - } - diskann::cout << "Exiting\n"; -} diff --git a/tests/test_merge_insert.cpp b/tests/test_merge_insert.cpp deleted file mode 100644 index 2b95ab27da..0000000000 --- a/tests/test_merge_insert.cpp +++ /dev/null @@ -1,625 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include "v2/index_merger.h" -#include "v2/merge_insert.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "aux_utils.h" -#include "utils.h" - -#ifndef _WINDOWS -#include -#include -#include -#endif - -#define NUM_INSERT_THREADS 30 -#define NUM_DELETE_THREADS 1 -#define NUM_SEARCH_THREADS 10 - -// random number generator -std::random_device dev; -std::mt19937 rng(dev()); - -tsl::robin_map params; -float mem_alpha, merge_alpha; -uint32_t medoid_id = std::numeric_limits::max(); -std::atomic_bool _insertions_done(false); -std::vector Lvec; - -template -void seed_iter(tsl::robin_set &active_set, - tsl::robin_set &inactive_set, T *all_points, - const std::string & inserted_points_file, - const std::string & inserted_tags_file, - tsl::robin_set &deleted_tags) { - const uint32_t insert_count = params[std::string("insert_count")]; - const uint32_t delete_count = params[std::string("delete_count")]; - const uint32_t ndims = params[std::string("ndims")]; - diskann::cout << "ITER: start = " << active_set.size() << ", " - << inactive_set.size() << "\n"; - - // pick `delete_count` tags - std::vector active_vec(active_set.begin(), active_set.end()); - std::shuffle(active_vec.begin(), active_vec.end(), rng); - std::vector delete_vec(active_vec.begin(), - active_vec.begin() + delete_count); - for (auto iter : delete_vec) - deleted_tags.insert(iter); - active_set.clear(); - active_set.insert(active_vec.begin() + delete_count, active_vec.end()); - // pick `insert_count` tags - std::vector inactive_vec(inactive_set.begin(), inactive_set.end()); - std::shuffle(inactive_vec.begin(), inactive_vec.end(), rng); - std::vector insert_vec(inactive_vec.begin(), - inactive_vec.begin() + insert_count); - inactive_set.clear(); - diskann::cout << "ITER: INSERT - " << insert_vec.size() << " IDs in " - << inserted_tags_file << "\n"; - inactive_set.insert(inactive_vec.begin() + insert_count, inactive_vec.end()); - std::sort(insert_vec.begin(), insert_vec.end()); - std::ofstream inserted_tags_writer(inserted_tags_file, std::ios::trunc); - for (auto &id : insert_vec) { - inserted_tags_writer << id << std::endl; - } - inserted_tags_writer.close(); - std::ofstream inserted_points_writer(inserted_points_file, std::ios::binary); - T *new_pts = new T[(uint64_t) insert_vec.size() * (uint64_t) ndims]; - for (uint64_t idx = 0; idx < insert_vec.size(); idx++) { - uint64_t actual_idx = insert_vec[idx]; - T * src_ptr = all_points + actual_idx * (uint64_t) ndims; - T * dest_ptr = new_pts + idx * (uint64_t) ndims; - std::memcpy(dest_ptr, src_ptr, ndims * sizeof(T)); - } - uint32_t npts_u32 = insert_vec.size(), ndims_u32 = ndims; - inserted_points_writer.write((char *) &npts_u32, sizeof(uint32_t)); - inserted_points_writer.write((char *) &ndims_u32, sizeof(uint32_t)); - inserted_points_writer.write( - (char *) new_pts, - (uint64_t) insert_vec.size() * (uint64_t) ndims * sizeof(T)); - inserted_points_writer.close(); - delete[] new_pts; - - // balance tags - inactive_set.insert(delete_vec.begin(), delete_vec.end()); - active_set.insert(insert_vec.begin(), insert_vec.end()); - diskann::cout << "ITER: end = " << active_set.size() << ", " - << inactive_set.size() << "\n"; - malloc_stats(); -} - -float compute_active_recall(const uint64_t *result_tags, - const uint32_t result_count, - const uint32_t *gs_tags, const uint32_t gs_count, - const tsl::robin_set &inactive_set) { - tsl::robin_set active_gs; - for (uint32_t i = 0; i < gs_count && active_gs.size() < result_count; i++) { - auto iter = inactive_set.find(gs_tags[i]); - if (iter == inactive_set.end()) { - active_gs.insert(gs_tags[i]); - } - } - uint32_t match = 0; - for (uint32_t i = 0; i < result_count; i++) { - match += (active_gs.find(result_tags[i]) != active_gs.end()); - } - return ((float) match / (float) result_count) * 100; -} - -template -void search_disk_index(const std::string & index_prefix_path, - const tsl::robin_set &inactive_tags, - const std::string & query_path, - const std::string & gs_path) { - std::string pq_prefix = index_prefix_path + "_pq"; - std::string disk_index_file = index_prefix_path + "_disk.index"; - std::string warmup_query_file = index_prefix_path + "_sample_data.bin"; - uint32_t beamwidth = params[std::string("beam_width")]; - uint32_t num_threads = params[std::string("disk_search_nthreads")]; - std::string query_bin = query_path; - std::string truthset_bin = gs_path; - uint64_t recall_at = params[std::string("recall_k")]; - uint64_t search_L = ::Lvec[0]; - // hold data - T * query = nullptr; - unsigned *gt_ids = nullptr; - uint32_t *gt_tags = nullptr; - float * gt_dists = nullptr; - size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; - - // load query + truthset - diskann::load_aligned_bin(query_bin, query, query_num, query_dim, - query_aligned_dim); - diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim, - >_tags); - if (gt_num != query_num) { - diskann::cout - << "Error. Mismatch in number of queries and ground truth data" - << std::endl; - } - - // load PQ Flash Index - std::shared_ptr reader(new LinuxAlignedFileReader()); - std::unique_ptr> _pFlashIndex( - new diskann::PQFlashIndex(reader)); - int res = _pFlashIndex->load(num_threads, pq_prefix.c_str(), - disk_index_file.c_str(), true); - if (res != 0) { - std::cerr << "Failed to load index.\n"; - exit(-1); - } - - // prep for search - std::vector query_result_ids; - std::vector query_result_tags; - std::vector query_result_dists; - query_result_ids.resize(recall_at * query_num); - query_result_dists.resize(recall_at * query_num); - query_result_tags.resize(recall_at * query_num); - diskann::QueryStats * stats = new diskann::QueryStats[query_num]; - std::vector query_result_ids_64(recall_at * query_num); -#pragma omp parallel for schedule(dynamic, 1) // num_threads(1) - for (_s64 i = 0; i < (int64_t) query_num; i++) { - _pFlashIndex->cached_beam_search( - query + (i * query_aligned_dim), recall_at, search_L, - query_result_ids_64.data() + (i * recall_at), - query_result_dists.data() + (i * recall_at), beamwidth, stats + i, - nullptr, query_result_tags.data() + (i * recall_at)); - } - - // compute mean recall, IOs - float mean_recall = 0.0f; - for (uint32_t i = 0; i < query_num; i++) { - auto *result_tags = query_result_tags.data() + (i * recall_at); - auto *gs_tags = gt_tags + (i * gt_dim); - float query_recall = compute_active_recall(result_tags, recall_at, gs_tags, - gt_dim, inactive_tags); - mean_recall += query_recall; - } - mean_recall /= query_num; - float mean_ios = (float) diskann::get_mean_stats( - stats, query_num, - [](const diskann::QueryStats &stats) { return stats.n_ios; }); - diskann::cout << "PQFlashIndex :: recall-" << recall_at << "@" << recall_at - << ": " << mean_recall << ", mean IOs: " << mean_ios << "\n"; - diskann::aligned_free(query); - delete[] stats; - delete[] gt_ids; - delete[] gt_dists; - delete[] gt_tags; -} - -template -void search_kernel(diskann::MergeInsert & merge_insert, - const tsl::robin_set &inactive_tags, - const std::string &query_path, const std::string &gs_path, - bool print_stats = false) { - uint32_t beamwidth = params[std::string("beam_width")]; - std::string query_bin = query_path; - std::string truthset_bin = gs_path; - uint64_t recall_at = params[std::string("recall_k")]; - - // hold data - T * query = nullptr; - unsigned *gt_ids = nullptr; - uint32_t *gt_tags = nullptr; - float * gt_dists = nullptr; - size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; - - // load query + truthset - diskann::load_aligned_bin(query_bin, query, query_num, query_dim, - query_aligned_dim); - diskann::load_truthset(truthset_bin, gt_ids, gt_dists, gt_num, gt_dim, - >_tags); - if (gt_num != query_num) { - diskann::cout - << "Error. Mismatch in number of queries and ground truth data" - << std::endl; - } - - if (print_stats) { - std::string recall_string = "Recall@" + std::to_string(recall_at); - diskann::cout << std::setw(4) << "Ls" << std::setw(12) << "QPS " - << std::setw(18) << "Mean Latency (ms)" << std::setw(15) - << "99.9 Latency" << std::setw(12) << recall_string - << std::setw(12) << "Mean disk IOs" << std::endl; - - diskann::cout - << "===============================================================" - "===============" - << std::endl; - } - - // prep for search - std::vector query_result_ids; - std::vector query_result_tags; - std::vector query_result_dists; - query_result_ids.resize(recall_at * query_num); - query_result_dists.resize(recall_at * query_num); - query_result_tags.resize(recall_at * query_num); - diskann::QueryStats * stats = new diskann::QueryStats[query_num]; - std::vector query_result_ids_64(recall_at * query_num); - - size_t end_count = 1; - if (print_stats) - end_count = ::Lvec.size(); - else - end_count = 1; - for (size_t test_id = 0; test_id < end_count; test_id++) { - uint32_t L = Lvec[test_id]; - if (print_stats) { - std::vector latency_stats(query_num, 0); - auto s = std::chrono::high_resolution_clock::now(); - for (_s64 i = 0; i < (int64_t) query_num; i++) { - auto qs = std::chrono::high_resolution_clock::now(); - merge_insert.search_sync(query + (i * query_aligned_dim), recall_at, L, - (query_result_tags.data() + (i * recall_at)), - query_result_dists.data() + (i * recall_at), - stats + i); - auto qe = std::chrono::high_resolution_clock::now(); - std::chrono::duration diff = qe - qs; - latency_stats[i] = diff.count() * 1000; - // std::this_thread::sleep_for(std::chrono::milliseconds(2)); - } - auto e = std::chrono::high_resolution_clock::now(); - std::chrono::duration diff = e - s; - float qps = (float) (query_num / diff.count()); - - // compute mean recall, IOs - float mean_recall = 0.0f; - for (uint32_t i = 0; i < query_num; i++) { - auto *result_tags = query_result_tags.data() + (i * recall_at); - auto *gs_tags = gt_tags + (i * gt_dim); - float query_recall = compute_active_recall( - result_tags, recall_at, gs_tags, gt_dim, inactive_tags); - mean_recall += query_recall; - } - mean_recall /= query_num; - float mean_ios = (float) diskann::get_mean_stats( - stats, query_num, - [](const diskann::QueryStats &stats) { return stats.n_ios; }); - std::sort(latency_stats.begin(), latency_stats.end()); - diskann::cout << std::setw(4) << L << std::setw(12) << qps - << std::setw(18) - << std::accumulate(latency_stats.begin(), - latency_stats.end(), 0) / - (float) query_num - << std::setw(15) - << (float) latency_stats[(_u64)(0.999 * query_num)] - << std::setw(12) << mean_recall << std::setw(12) << mean_ios - << std::endl; - } else { - diskann::Timer timer; -#pragma parallel omp for num_threads(NUM_SEARCH_THREADS) - for (_s64 i = 0; i < (int64_t) query_num; i++) { - merge_insert.search_sync(query + (i * query_aligned_dim), recall_at, L, - (query_result_tags.data() + (i * recall_at)), - query_result_dists.data() + (i * recall_at), - stats + i); - // std::this_thread::sleep_for(std::chrono::milliseconds(2)); - } - diskann::cout << "Concurrent search over " << NUM_SEARCH_THREADS - << " threads in " << timer.elapsed() / 1000 << " ms" - << std::endl; - } - } - diskann::aligned_free(query); - delete[] stats; - delete[] gt_ids; - delete[] gt_dists; - delete[] gt_tags; -} - -template -void insertion_kernel(diskann::MergeInsert &merge_insert, - const std::string & mem_pts_file, - const std::string & mem_tags_file) { - /* if(::_insertions_done.load()) - { - diskann::cout << "Insertions_done is true at the beginning of - insertion - kernel" << std::endl; - exit(-1); - } - std::this_thread::sleep_for(std::chrono::milliseconds(5000)); */ - T * data_insert = nullptr; - size_t npts, ndim, aligned_dim; - diskann::load_aligned_bin(mem_pts_file, data_insert, npts, ndim, - aligned_dim); - std::vector tags; - tags.reserve(npts); - tags.resize(npts); - std::ifstream tag_file; - tag_file = std::ifstream(mem_tags_file); - if (!tag_file.is_open()) { - std::cerr << "Tag file not found." << std::endl; - } - TagT tag; - size_t j = 0; - while (tag_file >> tag) { - tags[j] = tag; - j++; - } - diskann::cout << "Tags loaded." << std::endl; - tag_file.close(); - size_t i; - diskann::Timer timer; -#pragma omp parallel for num_threads(NUM_INSERT_THREADS) - for (i = 0; i < npts; i++) { - if (merge_insert.insert(data_insert + i * aligned_dim, tags[i]) != 0) - diskann::cout << "Point " << i << "could not be inserted." << std::endl; - } - diskann::cout << "Mem index insertion time : " << timer.elapsed() / 1000 - << " ms" << std::endl; - ::_insertions_done.store(true); - delete[] data_insert; -} - -template -void deletion_kernel(diskann::MergeInsert &merge_insert, - tsl::robin_set & del_tags) { - // std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - diskann::Timer timer; - for (auto iter : del_tags) { - merge_insert.lazy_delete(iter); - } - diskann::cout << "Deletion time : " << timer.elapsed() / 1000 << " ms" - << std::endl; -} - -template -void merge_kernel(diskann::MergeInsert &merge_insert) { - while (true) { - merge_insert.trigger_merge(); - if (::_insertions_done.load()) { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - } -} - -/*template -void merge_kernel(diskann::MergeInsert &merge_insert) { - merge_insert.final_merge(); -} -*/ -template -void run_iter(diskann::MergeInsert &merge_insert, - const std::string &base_prefix, const std::string &merge_prefix, - const std::string & mem_prefix, - tsl::robin_set &active_set, - tsl::robin_set &inactive_set, - const std::string &query_file, const std::string &gs_file, - T *data, diskann::Distance *dist_cmp) { - uint64_t initial_count = active_set.size() + inactive_set.size(); - // files for mem-DiskANN - std::string mem_pts_file = mem_prefix + ".data_orig"; - std::string mem_index_file = mem_prefix + ".index"; - std::string mem_tags_file = mem_prefix + ".tags_orig"; - - diskann::cout << "ITER: Seeding iteration" - << "\n"; - // seed the iteration - tsl::robin_set deleted_tags; - seed_iter(active_set, inactive_set, data, mem_pts_file, mem_tags_file, - deleted_tags); - assert(active_set.size() + inactive_set.size() == initial_count); - std::future delete_future = - std::async(std::launch::async, deletion_kernel, std::ref(merge_insert), - std::ref(deleted_tags)); - std::future insert_future; - insert_future = std::async(std::launch::async, insertion_kernel, - std::ref(merge_insert), std::ref(mem_pts_file), - std::ref(mem_tags_file)); - std::future merge_future = - std::async(std::launch::async, merge_kernel, std::ref(merge_insert)); - /* if(::_insertions_done.load()) - { - ::_insertions_done.store(false); - insert_future = std::async( - std::launch::async, insertion_kernel, std::ref(merge_insert), - std::ref(mem_pts_file), std::ref(mem_tags_file)); - } - */ - std::future_status insert_status, merge_status, delete_status; - - do { - insert_status = insert_future.wait_for(std::chrono::milliseconds(1)); - merge_status = merge_future.wait_for(std::chrono::milliseconds(1)); - delete_status = delete_future.wait_for(std::chrono::milliseconds(1)); - - if ((insert_status == std::future_status::timeout) || - (merge_status == std::future_status::timeout) || - (delete_status == std::future_status::timeout)) { - // search_kernel(merge_insert, inactive_set, query_file, gs_file); - } else { - if ((insert_status == std::future_status::ready) && - (merge_status == std::future_status::ready) && - (delete_status == std::future_status::ready)) { - merge_insert.final_merge(); - } - } - } while (insert_status != std::future_status::ready || - merge_status != std::future_status::ready); - - /* - do { - insert_status = insert_future.wait_for(std::chrono::milliseconds(1)); - merge_status = merge_future.wait_for(std::chrono::milliseconds(1)); - delete_status = delete_future.wait_for(std::chrono::milliseconds(1)); - - if ((merge_status == std::future_status::timeout) || - (delete_status == std::future_status::timeout)) { - search_kernel(merge_insert, inactive_set, query_file, gs_file); - } else { - if ((merge_status == std::future_status::ready) && - (delete_status == std::future_status::ready) && (insert_status == -std::future_status::ready)) { -// merge_insert.final_merge(); - break; - } - } - } while (delete_status != std::future_status::ready || insert_status != -std::future_status::ready || - merge_status != std::future_status::ready); -*/ - - // diskann::cout << "Searching all indices" << std::endl; - search_kernel(merge_insert, inactive_set, query_file, gs_file, true); -} - -template -void run_all_iters(std::string &base_prefix, std::string &merge_prefix, - const std::string &mem_prefix, const std::string &data_file, - const std::string &active_tags_file, - const std::string &query_file, const std::string &gs_file, - diskann::Distance *dist_cmp) { - // load all data points - std::unique_ptr data; - uint64_t npts = 0, ndims = 0; - diskann::load_bin(data_file, data, npts, ndims); - params[std::string("ndims")] = ndims; - - int n_iters = params["n_iters"]; - // load active tags - std::ifstream reader(active_tags_file); - tsl::robin_set active_tags; - uint32_t tag; - while (reader >> tag) { - active_tags.insert(tag); - } - - // read medoid ID from base_prefix - std::ifstream disk_reader(base_prefix + "_disk.index", std::ios::binary); - disk_reader.seekg(2 * sizeof(uint64_t), std::ios::beg); - uint64_t medoid = std::numeric_limits::max(); - disk_reader.read((char *) &medoid, sizeof(uint64_t)); - diskann::cout << "Detected medoid = " << medoid - << " ==> excluding from insert/deletes.\n"; - ::medoid_id = medoid; - - // generate inactive tags - tsl::robin_set inactive_tags; - for (uint32_t i = 0; i < npts; i++) { - auto iter = active_tags.find(i); - if (iter == active_tags.end()) { - inactive_tags.insert(i); - } - } - - // remove medoid from active_set - active_tags.erase(::medoid_id); - - diskann::Parameters paras; - paras.Set("L_mem", params[std::string("mem_l_index")]); - paras.Set("R_mem", params[std::string("range")]); - paras.Set("alpha_mem", ::mem_alpha); - paras.Set("L_disk", params[std::string("merge_l_index")]); - paras.Set("R_disk", params[std::string("range")]); - paras.Set("alpha_disk", ::merge_alpha); - paras.Set("C", params[std::string("merge_maxc")]); - paras.Set("beamwidth", params[std::string("beam_width")]); - paras.Set("nodes_to_cache", - params[std::string("disk_search_node_cache_count")]); - paras.Set("num_search_threads", - params[std::string("disk_search_nthreads")]); - - diskann::MergeInsert merge_insert(paras, 200000, ndims, mem_prefix, - base_prefix, merge_prefix, dist_cmp); - for (size_t i = 0; i < n_iters; i++) { - diskann::cout << "ITER : " << i << std::endl; - run_iter(merge_insert, base_prefix, merge_prefix, mem_prefix, - active_tags, inactive_tags, query_file, gs_file, data.get(), - dist_cmp); - } - // merge_kernel(merge_insert); -} - -int main(int argc, char **argv) { - if (argc < 19) { - diskann::cout - << "Correct usage: " << argv[0] - << " " - " " - " " - << " " - << " " - " " - " ...." - << "\n WARNING: Other parameters set inside CPP source." << std::endl; - exit(-1); - } - diskann::cout.setf(std::ios::unitbuf); - - int arg_no = 1; - std::string index_type = argv[arg_no++]; - TMP_FOLDER = argv[arg_no++]; - std::string base_prefix(argv[arg_no++]); - std::string merge_prefix(argv[arg_no++]); - std::string mem_prefix(argv[arg_no++]); - unsigned L_mem = (unsigned) atoi(argv[arg_no++]); - float alpha_mem = (float) atof(argv[arg_no++]); - unsigned L_disk = (unsigned) atoi(argv[arg_no++]); - float alpha_disk = (float) atof(argv[arg_no++]); - std::string data_bin(argv[arg_no++]); - std::string query_bin(argv[arg_no++]); - std::string gt_bin(argv[arg_no++]); - int n_iters = atoi(argv[arg_no++]); - uint32_t insert_count = (uint32_t) atoi(argv[arg_no++]); - uint32_t delete_count = (uint32_t) atoi(argv[arg_no++]); - uint32_t range = (uint32_t) atoi(argv[arg_no++]); - uint32_t recall_k = (uint32_t) atoi(argv[arg_no++]); - - for (int ctr = arg_no; ctr < argc; ctr++) { - _u64 curL = std::atoi(argv[ctr]); - if (curL >= recall_k) - ::Lvec.push_back(curL); - } - - params[std::string("n_iters")] = n_iters; - params[std::string("insert_count")] = insert_count; - params[std::string("delete_count")] = delete_count; - params[std::string("range")] = range; - params[std::string("recall_k")] = recall_k; - - // hard-coded params - params[std::string("disk_search_node_cache_count")] = 100; - params[std::string("disk_search_nthreads")] = 16; - params[std::string("beam_width")] = 4; - params[std::string("mem_l_index")] = L_mem; - mem_alpha = alpha_mem; - merge_alpha = alpha_disk; - params[std::string("mem_nthreads")] = 32; - params[std::string("merge_maxc")] = (uint32_t)(range * 2.5); - params[std::string("merge_l_index")] = L_disk; - - if (index_type == std::string("float")) { - diskann::DistanceL2 dist_cmp; - run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, - base_prefix + "_disk.index.tags", query_bin, gt_bin, - &dist_cmp); - } else if (index_type == std::string("uint8")) { - diskann::DistanceL2UInt8 dist_cmp; - run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, - base_prefix + "_disk.index.tags", query_bin, gt_bin, - &dist_cmp); - } else if (index_type == std::string("int8")) { - diskann::DistanceL2Int8 dist_cmp; - run_all_iters(base_prefix, merge_prefix, mem_prefix, data_bin, - base_prefix + "_disk.index.tags", query_bin, gt_bin, - &dist_cmp); - } else { - diskann::cout << "Unsupported type : " << index_type << "\n"; - } - diskann::cout << "Exiting\n"; -}

K8Spj+5P9cy_#u|5?xYNc$HrLMOn+s0 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ⅆ{kl)o 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%0AdHsQ8v2-pddI_>th{ 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 B8f*Xn literal 0 HcmV?d00001 diff --git a/dependencies/windows/dll/SSLEAY32.dll b/dependencies/windows/dll/SSLEAY32.dll new file mode 100644 index 0000000000000000000000000000000000000000..0aa61b0a9f3c80b46035154bd07723b710484af5 GIT binary patch literal 361984 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 g9A<+O3==qQK0lBaZ)3k%{m>0MM1 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

I|`@J$(N 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