From 237c9c766ebb17b6be9655cca3ee179711519145 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Wed, 12 Apr 2023 16:30:51 +0800 Subject: [PATCH 01/61] return max value while label is invalid --- src/index.cpp | 9 ++++----- src/pq_flash_index.cpp | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 4f8c940c6..e45574622 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -19,6 +19,7 @@ #include #endif #include "index.h" +#include #define MAX_POINTS_FOR_USING_BITSET 10000000 @@ -1868,11 +1869,9 @@ LabelT Index::get_converted_label(const std::string &raw_label) { return _label_map[raw_label]; } - std::stringstream stream; - stream << "Unable to find label in the Label Map"; - diskann::cerr << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); - exit(-1); + + // invalid label + return std::numeric_limits::max(); } template diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index ad7809ccb..16636d4cd 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -6,6 +6,7 @@ #include "timer.h" #include "pq_flash_index.h" #include "cosine_similarity.h" +#include #ifdef _WINDOWS #include "windows_aligned_file_reader.h" @@ -490,11 +491,9 @@ LabelT PQFlashIndex::get_converted_label(const std::string &filter_la { return _label_map[filter_label]; } - std::stringstream stream; - stream << "Unable to find label in the Label Map"; - diskann::cerr << stream.str() << std::endl; - throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); - exit(-1); + + // invalid label + return std::numeric_limits::max(); } template From 013db5749d9c688b208e30177c6c32cbcd3a9d18 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 27 Apr 2023 13:24:03 +0800 Subject: [PATCH 02/61] hotfix universal label --- include/pq_flash_index.h | 2 +- src/index.cpp | 7 ++++--- src/pq_flash_index.cpp | 7 ++++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/include/pq_flash_index.h b/include/pq_flash_index.h index f166219ac..94105bf86 100644 --- a/include/pq_flash_index.h +++ b/include/pq_flash_index.h @@ -187,7 +187,7 @@ template class PQFlashIndex tsl::robin_set _labels; std::unordered_map _filter_to_medoid_id; bool _use_universal_label; - _u32 _universal_filter_num; + _u32 _universal_filter_num = 0; std::vector _filter_list; tsl::robin_set<_u32> _dummy_pts; tsl::robin_set<_u32> _has_dummy_pts; diff --git a/src/index.cpp b/src/index.cpp index e45574622..3d7ec823b 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1869,9 +1869,10 @@ LabelT Index::get_converted_label(const std::string &raw_label) { return _label_map[raw_label]; } - - // invalid label - return std::numeric_limits::max(); + else + { + return _universal_label; + } } template diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index 16636d4cd..3af8e0b7c 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -491,9 +491,10 @@ LabelT PQFlashIndex::get_converted_label(const std::string &filter_la { return _label_map[filter_label]; } - - // invalid label - return std::numeric_limits::max(); + else + { + return static_cast(_universal_filter_num); + } } template From 68110456ecfcccb637c6cc7a1efbf3d58871f201 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Tue, 9 May 2023 15:00:16 +0800 Subject: [PATCH 03/61] reflector label looping --- include/index.h | 14 ++++++++++++++ src/index.cpp | 40 +++++++++++++++++++++++++++++++--------- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/include/index.h b/include/index.h index 962f758e3..0f96ac537 100644 --- a/include/index.h +++ b/include/index.h @@ -36,6 +36,20 @@ inline double estimate_ram_usage(_u64 size, _u32 dim, _u32 datasize, _u32 degree return OVERHEAD_FACTOR * (size_of_data + size_of_graph + size_of_locks + size_of_outer_vector); } +template +inline bool is_label_existed(const std::vector& node_labels, const LabelT& input_label) +{ + for (const auto& node_label : node_labels) + { + if (node_label == input_label) + { + return true; + } + } + + return false; +} + struct consolidation_report { enum status_code diff --git a/src/index.cpp b/src/index.cpp index 3d7ec823b..005ccfa0b 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1043,20 +1043,42 @@ std::pair Index::iterate_to_fixed_point( if (use_filter) { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. - std::vector common_filters; + // std::vector common_filters; auto &x = _pts_to_labels[id]; - std::set_intersection(filter_label.begin(), filter_label.end(), x.begin(), x.end(), - std::back_inserter(common_filters)); - if (_use_universal_label) + auto ret = false; + for (const auto& query_label : filter_label) { - if (std::find(filter_label.begin(), filter_label.end(), _universal_label) != - filter_label.end() || - std::find(x.begin(), x.end(), _universal_label) != x.end()) - common_filters.emplace_back(_universal_label); + ret = is_label_existed(x, query_label); + if (ret) + { + break; + } + } + if (!ret && _use_universal_label) + { + ret = is_label_existed(filter_label, _universal_label); + if (!ret) + { + ret = is_label_existed(x, _universal_label); + } } - if (common_filters.size() == 0) + if (!ret) + { continue; + } + //std::set_intersection(filter_label.begin(), filter_label.end(), x.begin(), x.end(), + // std::back_inserter(common_filters)); + //if (_use_universal_label) + //{ + // if (std::find(filter_label.begin(), filter_label.end(), _universal_label) != + // filter_label.end() || + // std::find(x.begin(), x.end(), _universal_label) != x.end()) + // common_filters.emplace_back(_universal_label); + //} + + //if (common_filters.size() == 0) + // continue; } if (is_not_visited(id)) From e402c8b922b5e2a5dfcbf6e927284ab0f2054949 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Wed, 10 May 2023 17:41:20 +0800 Subject: [PATCH 04/61] test bit mask --- include/index.h | 40 ++++++++++++++++ src/index.cpp | 124 +++++++++++++++++++++++++++++++++--------------- 2 files changed, 125 insertions(+), 39 deletions(-) diff --git a/include/index.h b/include/index.h index 0f96ac537..9c84d48f5 100644 --- a/include/index.h +++ b/include/index.h @@ -18,6 +18,7 @@ #include "utils.h" #include "windows_customizations.h" #include "scratch.h" +#include #define OVERHEAD_FACTOR 1.1 #define EXPAND_IF_FULL 0 @@ -73,6 +74,41 @@ struct consolidation_report } }; +class IBitSet +{ +public: + virtual bool test(size_t pos) const = 0; + + virtual void set(size_t pos) = 0; +}; + + +class bitmask_wrapper +{ +public: + bitmask_wrapper(size_t totalBits) + { + size_t count = (totalBits / 64) + (totalBits % 64); + _bitsets.resize(count); + } + + bool test(size_t pos) const + { + size_t index = pos / 64; + + return _bitsets[index].test(pos); + } + + void set(size_t pos) + { + size_t index = pos / 64; + _bitsets[index].set(pos); + } + +private: + std::vector> _bitsets; +}; + template class Index { /************************************************************************** @@ -238,6 +274,8 @@ template clas void parse_label_file(const std::string &label_file, size_t &num_pts_labels); + void parse_label_file_in_bitset(const std::string& label_file, size_t& num_points, size_t num_labels); + std::unordered_map load_label_map(const std::string &map_file); // Returns the locations of start point and frozen points suitable for use with iterate_to_fixed_point. @@ -421,6 +459,8 @@ template clas // Per node lock, cardinality=_max_points std::vector _locks; + std::vector _pts_label_bitsets; + static const float INDEX_GROWTH_FACTOR; }; } // namespace diskann diff --git a/src/index.cpp b/src/index.cpp index 005ccfa0b..06f3f5796 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -563,7 +563,9 @@ void Index::load(const char *filename, uint32_t num_threads, ui if (file_exists(labels_file)) { _label_map = load_label_map(labels_map_file); - parse_label_file(labels_file, label_num_pts); + // parse_label_file(labels_file, label_num_pts); + parse_label_file_in_bitset(labels_file, label_num_pts, _label_map.size()); + assert(label_num_pts == data_file_num_pts); if (file_exists(labels_to_medoids)) { @@ -956,6 +958,20 @@ std::pair Index::iterate_to_fixed_point( diskann::pq_dist_lookup(pq_coord_scratch, ids.size(), this->_num_pq_chunks, pq_dists, dists_out); }; + // check if input labels contain universal label + bool input_contain_universal_label = false; + if (_use_universal_label) + { + for (size_t i = 0; i < filter_label.size(); i++) + { + if (filter_label[i] == _universal_label) + { + input_contain_universal_label = true; + break; + } + } + } + // Initialize the candidate pool with starting points for (auto id : init_ids) { @@ -966,20 +982,20 @@ std::pair Index::iterate_to_fixed_point( __LINE__); } - if (use_filter) + if (use_filter && !input_contain_universal_label) { - std::vector common_filters; - auto &x = _pts_to_labels[id]; - std::set_intersection(filter_label.begin(), filter_label.end(), x.begin(), x.end(), - std::back_inserter(common_filters)); - if (_use_universal_label) + bool ret = false; + for (size_t i = 0; i < filter_label.size(); i++) { - if (std::find(filter_label.begin(), filter_label.end(), _universal_label) != filter_label.end() || - std::find(x.begin(), x.end(), _universal_label) != x.end()) - common_filters.emplace_back(_universal_label); + if (_pts_label_bitsets[id].test(filter_label[i] - 1) + || (_use_universal_label && _pts_label_bitsets[id].test(_universal_label - 1))) + { + ret = true; + break; + } } - if (common_filters.size() == 0) + if (!ret) continue; } @@ -1040,45 +1056,23 @@ std::pair Index::iterate_to_fixed_point( { assert(id < _max_points + _num_frozen_pts); - if (use_filter) + if (use_filter && !input_contain_universal_label) { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. // std::vector common_filters; - auto &x = _pts_to_labels[id]; - auto ret = false; - for (const auto& query_label : filter_label) + bool ret = false; + for (size_t i = 0; i < filter_label.size(); i++) { - ret = is_label_existed(x, query_label); - if (ret) + if (_pts_label_bitsets[id].test(filter_label[i] - 1) + || (_use_universal_label && _pts_label_bitsets[id].test(_universal_label - 1))) { + ret = true; break; } } - if (!ret && _use_universal_label) - { - ret = is_label_existed(filter_label, _universal_label); - if (!ret) - { - ret = is_label_existed(x, _universal_label); - } - } if (!ret) - { continue; - } - //std::set_intersection(filter_label.begin(), filter_label.end(), x.begin(), x.end(), - // std::back_inserter(common_filters)); - //if (_use_universal_label) - //{ - // if (std::find(filter_label.begin(), filter_label.end(), _universal_label) != - // filter_label.end() || - // std::find(x.begin(), x.end(), _universal_label) != x.end()) - // common_filters.emplace_back(_universal_label); - //} - - //if (common_filters.size() == 0) - // continue; } if (is_not_visited(id)) @@ -1948,6 +1942,58 @@ void Index::parse_label_file(const std::string &label_file, siz diskann::cout << "Identified " << _labels.size() << " distinct label(s)" << std::endl; } +template +void Index::parse_label_file_in_bitset(const std::string& label_file, size_t& num_points, size_t num_labels) +{ + std::ifstream infile(label_file); + if (infile.fail()) + { + throw diskann::ANNException(std::string("Failed to open file ") + label_file, -1); + } + + std::string line, token; + unsigned line_cnt = 0; + + while (std::getline(infile, line)) + { + line_cnt++; + } + + _pts_label_bitsets.resize(line_cnt, num_labels); + + infile.clear(); + infile.seekg(0, std::ios::beg); + line_cnt = 0; + + while (std::getline(infile, line)) + { + std::istringstream iss(line); + std::vector lbls(0); + getline(iss, token, '\t'); + std::istringstream new_iss(token); + while (getline(new_iss, token, ',')) + { + token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); + token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); + LabelT token_as_num = std::stoul(token); + _pts_label_bitsets[line_cnt].set(token_as_num - 1); + + // lbls.push_back(token_as_num); + _labels.insert(token_as_num); + } + //if (lbls.size() <= 0) + //{ + // diskann::cout << "No label found"; + // exit(-1); + //} + // std::sort(lbls.begin(), lbls.end()); + // _pts_to_labels[line_cnt] = lbls; + line_cnt++; + } + num_points = (size_t)line_cnt; + diskann::cout << "Identified " << _labels.size() << " distinct label(s)" << std::endl; +} + template void Index::set_universal_label(const LabelT &label) { From b43e493bde98b1d128fe1723ebf26953fd3b4c5a Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Wed, 10 May 2023 17:54:48 +0800 Subject: [PATCH 05/61] fix some issue --- include/index.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/index.h b/include/index.h index 9c84d48f5..6228ecbe8 100644 --- a/include/index.h +++ b/include/index.h @@ -88,7 +88,7 @@ class bitmask_wrapper public: bitmask_wrapper(size_t totalBits) { - size_t count = (totalBits / 64) + (totalBits % 64); + size_t count = (totalBits / 64) + ((totalBits % 64) == 0 ? 0 : 1); _bitsets.resize(count); } From 77aded7d65768f37927e4f1275e36f54f4f45533 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 11:18:32 +0800 Subject: [PATCH 06/61] simple bitmask --- include/index.h | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/include/index.h b/include/index.h index 6228ecbe8..a2a10fa9d 100644 --- a/include/index.h +++ b/include/index.h @@ -88,25 +88,33 @@ class bitmask_wrapper public: bitmask_wrapper(size_t totalBits) { - size_t count = (totalBits / 64) + ((totalBits % 64) == 0 ? 0 : 1); - _bitsets.resize(count); + std::uint64_t bytes = (totalBits + 7) / 8; + std::uint64_t aligned_bytes = bytes + sizeof(std::uint64_t) - 1; + aligned_bytes = aligned_bytes - (aligned_bytes % sizeof(std::uint64_t)); + _size = aligned_bytes / sizeof(std::uint64_t); + + _bitsets = (std::uint64_t*)malloc(aligned_bytes); + memset(_bitsets, 0, aligned_bytes); } bool test(size_t pos) const { - size_t index = pos / 64; - - return _bitsets[index].test(pos); + std::uint64_t mask = (std::uint64_t)1 << (pos & (8 * sizeof(std::uint64_t) - 1)); + size_t index = pos / 8 / sizeof(std::uint64_t); + std::uint64_t val = _bitsets[index]; + return 0 != (val & mask); } void set(size_t pos) { - size_t index = pos / 64; - _bitsets[index].set(pos); + std::uint64_t mask = (std::uint64_t)1 << (pos & (8 * sizeof(std::uint64_t) - 1)); + size_t index = pos / 8 / sizeof(std::uint64_t); + _bitsets[index] |= mask; } private: - std::vector> _bitsets; + std::uint64_t* _bitsets; + std::uint64_t _size; }; template class Index From c815b8a752e04abd9853eb3b7344065611dd3b79 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 11:55:13 +0800 Subject: [PATCH 07/61] fix issue --- src/index.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index.cpp b/src/index.cpp index 06f3f5796..2ae8383ec 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1959,7 +1959,11 @@ void Index::parse_label_file_in_bitset(const std::string& label line_cnt++; } - _pts_label_bitsets.resize(line_cnt, num_labels); + _pts_label_bitsets.reserve(line_cnt); + for (size_t i = 0; i < line_cnt; i++) + { + _pts_label_bitsets.push_back(num_labels); + } infile.clear(); infile.seekg(0, std::ios::beg); From ad0b4edbeb74a7c26a3dc86e67837d0adc0eee31 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 14:00:16 +0800 Subject: [PATCH 08/61] limit to one input label --- include/index.h | 24 +++++++++++++++++++++--- src/index.cpp | 31 +++++++++---------------------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/include/index.h b/include/index.h index a2a10fa9d..a66033539 100644 --- a/include/index.h +++ b/include/index.h @@ -82,11 +82,16 @@ class IBitSet virtual void set(size_t pos) = 0; }; +struct simple_bitmask_val +{ + size_t _index = 0; + std::uint64_t _mask = 0; +}; -class bitmask_wrapper +class simple_bitmask { public: - bitmask_wrapper(size_t totalBits) + simple_bitmask(size_t totalBits) { std::uint64_t bytes = (totalBits + 7) / 8; std::uint64_t aligned_bytes = bytes + sizeof(std::uint64_t) - 1; @@ -105,6 +110,19 @@ class bitmask_wrapper return 0 != (val & mask); } + static simple_bitmask_val get_bitmask_val(size_t pos) + { + simple_bitmask_val bitmask_val; + bitmask_val._mask = (std::uint64_t)1 << (pos & (8 * sizeof(std::uint64_t) - 1)); + bitmask_val._index = pos / 8 / sizeof(std::uint64_t); + } + + bool test_mask_val(const simple_bitmask_val& bitmask_val) const + { + std::uint64_t val = _bitsets[bitmask_val._index]; + return 0 != (val & bitmask_val._mask); + } + void set(size_t pos) { std::uint64_t mask = (std::uint64_t)1 << (pos & (8 * sizeof(std::uint64_t) - 1)); @@ -467,7 +485,7 @@ template clas // Per node lock, cardinality=_max_points std::vector _locks; - std::vector _pts_label_bitsets; + std::vector _pts_label_bitsets; static const float INDEX_GROWTH_FACTOR; }; diff --git a/src/index.cpp b/src/index.cpp index 2ae8383ec..8587bcc27 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -972,6 +972,9 @@ std::pair Index::iterate_to_fixed_point( } } + // only support one filter label + auto bitmask_val = simple_bitmask::get_bitmask_val(filter_label[0] - 1); + auto universal_bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); // Initialize the candidate pool with starting points for (auto id : init_ids) { @@ -984,19 +987,11 @@ std::pair Index::iterate_to_fixed_point( if (use_filter && !input_contain_universal_label) { - bool ret = false; - for (size_t i = 0; i < filter_label.size(); i++) + if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) + && (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val))) { - if (_pts_label_bitsets[id].test(filter_label[i] - 1) - || (_use_universal_label && _pts_label_bitsets[id].test(_universal_label - 1))) - { - ret = true; - break; - } - } - - if (!ret) continue; + } } if (is_not_visited(id)) @@ -1060,19 +1055,11 @@ std::pair Index::iterate_to_fixed_point( { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. // std::vector common_filters; - bool ret = false; - for (size_t i = 0; i < filter_label.size(); i++) + if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) + && (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val))) { - if (_pts_label_bitsets[id].test(filter_label[i] - 1) - || (_use_universal_label && _pts_label_bitsets[id].test(_universal_label - 1))) - { - ret = true; - break; - } - } - - if (!ret) continue; + } } if (is_not_visited(id)) From 1bc3ff262f6e55dcc63d9e2c5a3eeae2a779643d Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 14:08:36 +0800 Subject: [PATCH 09/61] fix issue --- include/index.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/index.h b/include/index.h index a66033539..b94f2ab3c 100644 --- a/include/index.h +++ b/include/index.h @@ -115,6 +115,8 @@ class simple_bitmask simple_bitmask_val bitmask_val; bitmask_val._mask = (std::uint64_t)1 << (pos & (8 * sizeof(std::uint64_t) - 1)); bitmask_val._index = pos / 8 / sizeof(std::uint64_t); + + return bitmask_val; } bool test_mask_val(const simple_bitmask_val& bitmask_val) const From a944bd9117a21a5fb9c609a876a05bdf4ceba763 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 14:27:04 +0800 Subject: [PATCH 10/61] fix some issue --- src/index.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 8587bcc27..550dd7ade 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -974,7 +974,11 @@ std::pair Index::iterate_to_fixed_point( // only support one filter label auto bitmask_val = simple_bitmask::get_bitmask_val(filter_label[0] - 1); - auto universal_bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); + simple_bitmask_val universal_bitmask_val; + if (_use_universal_label) + { + universal_bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); + } // Initialize the candidate pool with starting points for (auto id : init_ids) { @@ -988,7 +992,8 @@ std::pair Index::iterate_to_fixed_point( if (use_filter && !input_contain_universal_label) { if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) - && (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val))) + && (!_use_universal_label + || (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) { continue; } @@ -1056,7 +1061,8 @@ std::pair Index::iterate_to_fixed_point( // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. // std::vector common_filters; if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) - && (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val))) + && (!_use_universal_label || + (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) { continue; } From 31cd3c808e3d5997f4f12cdb281190fc593ee22c Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 15:09:13 +0800 Subject: [PATCH 11/61] move id check first --- src/index.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 550dd7ade..8a493d9f3 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1056,6 +1056,11 @@ std::pair Index::iterate_to_fixed_point( { assert(id < _max_points + _num_frozen_pts); + if (!is_not_visited(id)) + { + continue; + } + if (use_filter && !input_contain_universal_label) { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. @@ -1068,10 +1073,7 @@ std::pair Index::iterate_to_fixed_point( } } - if (is_not_visited(id)) - { - id_scratch.push_back(id); - } + id_scratch.push_back(id); } if (_dynamic_index) From 079881b40c08f3cbb16d29ba15b72a085567b28d Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 16:34:06 +0800 Subject: [PATCH 12/61] fix issue --- src/index.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index.cpp b/src/index.cpp index 8a493d9f3..221e8a36e 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -973,7 +973,11 @@ std::pair Index::iterate_to_fixed_point( } // only support one filter label - auto bitmask_val = simple_bitmask::get_bitmask_val(filter_label[0] - 1); + simple_bitmask_val bitmask_val; + if (filter_label.size() > 0) + { + bitmask_val = simple_bitmask::get_bitmask_val(filter_label[0] - 1); + } simple_bitmask_val universal_bitmask_val; if (_use_universal_label) { From 73a230f378c6233837737ee8f9485c3095befd05 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 17:14:25 +0800 Subject: [PATCH 13/61] test remove filter code --- src/index.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 221e8a36e..ce32f2a08 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1065,17 +1065,17 @@ std::pair Index::iterate_to_fixed_point( continue; } - if (use_filter && !input_contain_universal_label) - { - // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. - // std::vector common_filters; - if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) - && (!_use_universal_label || - (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) - { - continue; - } - } + //if (use_filter && !input_contain_universal_label) + //{ + // // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. + //// std::vector common_filters; + // if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) + // && (!_use_universal_label || + // (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) + // { + // continue; + // } + //} id_scratch.push_back(id); } From 2963c9d189671e2788c20a15c9c5476c419298b6 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 17:26:52 +0800 Subject: [PATCH 14/61] update log --- src/index.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.cpp b/src/index.cpp index ce32f2a08..95d2a3008 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1026,6 +1026,7 @@ std::pair Index::iterate_to_fixed_point( uint32_t hops = 0; uint32_t cmps = 0; + cmps += static_cast(init_ids.size()); while (best_L_nodes.has_unexpanded_node()) { From 5e8739228df5d2581ac02a2f8e9f44da8ee5c20a Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 17:32:56 +0800 Subject: [PATCH 15/61] fix logging --- src/index.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 95d2a3008..b552dce10 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1065,7 +1065,7 @@ std::pair Index::iterate_to_fixed_point( { continue; } - + cmps++; //if (use_filter && !input_contain_universal_label) //{ // // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. @@ -1122,7 +1122,7 @@ std::pair Index::iterate_to_fixed_point( _distance->compare(aligned_query, _data + _aligned_dim * (size_t)id, (unsigned)_aligned_dim)); } } - cmps += id_scratch.size(); +// cmps += id_scratch.size(); // Insert pairs into the pool of candidates for (size_t m = 0; m < id_scratch.size(); ++m) From 74327601fcf88ec1bb90e27b3c3f31d6a17c006c Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 18:33:12 +0800 Subject: [PATCH 16/61] revert test code --- src/index.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index b552dce10..7669679b4 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1066,17 +1066,17 @@ std::pair Index::iterate_to_fixed_point( continue; } cmps++; - //if (use_filter && !input_contain_universal_label) - //{ - // // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. - //// std::vector common_filters; - // if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) - // && (!_use_universal_label || - // (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) - // { - // continue; - // } - //} + if (use_filter && !input_contain_universal_label) + { + // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. + // std::vector common_filters; + if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) + && (!_use_universal_label || + (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) + { + continue; + } + } id_scratch.push_back(id); } From cd1ff23809073b7bca7134128b116169d0cd1454 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 11 May 2023 19:04:16 +0800 Subject: [PATCH 17/61] insert filted node to visited map --- src/index.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/index.cpp b/src/index.cpp index 7669679b4..76014cc52 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1074,6 +1074,15 @@ std::pair Index::iterate_to_fixed_point( && (!_use_universal_label || (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) { + if (fast_iterate) + { + inserted_into_pool_bs[id] = 1; + } + else + { + inserted_into_pool_rs.insert(id); + } + continue; } } From 4823436b195c06c9348e1c4a8a6eaa96f6c47977 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Fri, 12 May 2023 11:42:22 +0800 Subject: [PATCH 18/61] change to vector to hold bitmask --- include/index.h | 47 +++++++++++++++++++++++++++++++++++++---------- src/index.cpp | 29 ++++++++++++++++++----------- 2 files changed, 55 insertions(+), 21 deletions(-) diff --git a/include/index.h b/include/index.h index b94f2ab3c..ed2397a55 100644 --- a/include/index.h +++ b/include/index.h @@ -88,18 +88,35 @@ struct simple_bitmask_val std::uint64_t _mask = 0; }; +struct simple_bitmask_buf +{ + std::uint64_t* get_bitmask(std::uint64_t index) + { + return _buf.data() + index * _bitmask_size; + } + + std::vector _buf; + std::uint64_t _bitmask_size = 0; + +}; + class simple_bitmask { public: - simple_bitmask(size_t totalBits) + //simple_bitmask(size_t totalBits) + //{ + // std::uint64_t bytes = (totalBits + 7) / 8; + // std::uint64_t aligned_bytes = bytes + sizeof(std::uint64_t) - 1; + // aligned_bytes = aligned_bytes - (aligned_bytes % sizeof(std::uint64_t)); + // _size = aligned_bytes / sizeof(std::uint64_t); + + // _bitsets = (std::uint64_t*)malloc(aligned_bytes); + // memset(_bitsets, 0, aligned_bytes); + //} + + simple_bitmask(std::uint64_t* bitsets) + : _bitsets(bitsets) { - std::uint64_t bytes = (totalBits + 7) / 8; - std::uint64_t aligned_bytes = bytes + sizeof(std::uint64_t) - 1; - aligned_bytes = aligned_bytes - (aligned_bytes % sizeof(std::uint64_t)); - _size = aligned_bytes / sizeof(std::uint64_t); - - _bitsets = (std::uint64_t*)malloc(aligned_bytes); - memset(_bitsets, 0, aligned_bytes); } bool test(size_t pos) const @@ -119,6 +136,14 @@ class simple_bitmask return bitmask_val; } + static std::uint64_t get_bitmask_size(std::uint64_t totalBits) + { + std::uint64_t bytes = (totalBits + 7) / 8; + std::uint64_t aligned_bytes = bytes + sizeof(std::uint64_t) - 1; + aligned_bytes = aligned_bytes - (aligned_bytes % sizeof(std::uint64_t)); + return aligned_bytes / sizeof(std::uint64_t); + } + bool test_mask_val(const simple_bitmask_val& bitmask_val) const { std::uint64_t val = _bitsets[bitmask_val._index]; @@ -134,7 +159,7 @@ class simple_bitmask private: std::uint64_t* _bitsets; - std::uint64_t _size; +// std::uint64_t _size; }; template class Index @@ -487,7 +512,9 @@ template clas // Per node lock, cardinality=_max_points std::vector _locks; - std::vector _pts_label_bitsets; +// std::vector _pts_label_bitsets; + + simple_bitmask_buf _bitmask_buf; static const float INDEX_GROWTH_FACTOR; }; diff --git a/src/index.cpp b/src/index.cpp index 76014cc52..a5195b7c9 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -995,9 +995,11 @@ std::pair Index::iterate_to_fixed_point( if (use_filter && !input_contain_universal_label) { - if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) + simple_bitmask bm(_bitmask_buf.get_bitmask(id)); + + if (!bm.test_mask_val(bitmask_val) && (!_use_universal_label - || (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) + || (_use_universal_label && !bm.test_mask_val(universal_bitmask_val)))) { continue; } @@ -1070,9 +1072,11 @@ std::pair Index::iterate_to_fixed_point( { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. // std::vector common_filters; - if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) + simple_bitmask bm(_bitmask_buf.get_bitmask(id)); + + if (!bm.test_mask_val(bitmask_val) && (!_use_universal_label || - (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) + (_use_universal_label && !bm.test_mask_val(universal_bitmask_val)))) { if (fast_iterate) { @@ -1968,11 +1972,13 @@ void Index::parse_label_file_in_bitset(const std::string& label line_cnt++; } - _pts_label_bitsets.reserve(line_cnt); - for (size_t i = 0; i < line_cnt; i++) - { - _pts_label_bitsets.push_back(num_labels); - } + _bitmask_buf._bitmask_size = simple_bitmask::get_bitmask_size(num_labels); + _bitmask_buf._buf.resize(line_cnt * _bitmask_buf._bitmask_size, 0); +// _pts_label_bitsets.reserve(line_cnt); + //for (size_t i = 0; i < line_cnt; i++) + //{ + // _pts_label_bitsets.push_back(num_labels); + //} infile.clear(); infile.seekg(0, std::ios::beg); @@ -1989,8 +1995,9 @@ void Index::parse_label_file_in_bitset(const std::string& label token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); LabelT token_as_num = std::stoul(token); - _pts_label_bitsets[line_cnt].set(token_as_num - 1); - + // _pts_label_bitsets[line_cnt].set(token_as_num - 1); + simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt)); + bm.set(token_as_num - 1); // lbls.push_back(token_as_num); _labels.insert(token_as_num); } From 81ff09c561a61f4b183a8cf70fd5a64f5f198556 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Fri, 12 May 2023 13:19:38 +0800 Subject: [PATCH 19/61] pre-create bitmask object --- include/index.h | 2 +- src/index.cpp | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/index.h b/include/index.h index ed2397a55..30c11cb72 100644 --- a/include/index.h +++ b/include/index.h @@ -512,7 +512,7 @@ template clas // Per node lock, cardinality=_max_points std::vector _locks; -// std::vector _pts_label_bitsets; + std::vector _pts_label_bitsets; simple_bitmask_buf _bitmask_buf; diff --git a/src/index.cpp b/src/index.cpp index a5195b7c9..ebbecab84 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -995,11 +995,11 @@ std::pair Index::iterate_to_fixed_point( if (use_filter && !input_contain_universal_label) { - simple_bitmask bm(_bitmask_buf.get_bitmask(id)); + // simple_bitmask bm(_bitmask_buf.get_bitmask(id)); - if (!bm.test_mask_val(bitmask_val) + if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) && (!_use_universal_label - || (_use_universal_label && !bm.test_mask_val(universal_bitmask_val)))) + || (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) { continue; } @@ -1072,11 +1072,11 @@ std::pair Index::iterate_to_fixed_point( { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. // std::vector common_filters; - simple_bitmask bm(_bitmask_buf.get_bitmask(id)); + // simple_bitmask bm(_bitmask_buf.get_bitmask(id)); - if (!bm.test_mask_val(bitmask_val) + if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) && (!_use_universal_label || - (_use_universal_label && !bm.test_mask_val(universal_bitmask_val)))) + (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) { if (fast_iterate) { @@ -1974,11 +1974,11 @@ void Index::parse_label_file_in_bitset(const std::string& label _bitmask_buf._bitmask_size = simple_bitmask::get_bitmask_size(num_labels); _bitmask_buf._buf.resize(line_cnt * _bitmask_buf._bitmask_size, 0); -// _pts_label_bitsets.reserve(line_cnt); - //for (size_t i = 0; i < line_cnt; i++) - //{ - // _pts_label_bitsets.push_back(num_labels); - //} + _pts_label_bitsets.reserve(line_cnt); + for (size_t i = 0; i < line_cnt; i++) + { + _pts_label_bitsets.push_back(_bitmask_buf.get_bitmask(i)); + } infile.clear(); infile.seekg(0, std::ios::beg); @@ -1995,9 +1995,9 @@ void Index::parse_label_file_in_bitset(const std::string& label token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); LabelT token_as_num = std::stoul(token); - // _pts_label_bitsets[line_cnt].set(token_as_num - 1); - simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt)); - bm.set(token_as_num - 1); + _pts_label_bitsets[line_cnt].set(token_as_num - 1); + //simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt)); + //bm.set(token_as_num - 1); // lbls.push_back(token_as_num); _labels.insert(token_as_num); } From e0e7036694c3a5fd986bea269c1c5561df42eedc Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Fri, 12 May 2023 14:48:06 +0800 Subject: [PATCH 20/61] revert pre-create bitmask --- include/index.h | 2 +- src/index.cpp | 37 ++++++++++++++----------------------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/include/index.h b/include/index.h index 30c11cb72..ed2397a55 100644 --- a/include/index.h +++ b/include/index.h @@ -512,7 +512,7 @@ template clas // Per node lock, cardinality=_max_points std::vector _locks; - std::vector _pts_label_bitsets; +// std::vector _pts_label_bitsets; simple_bitmask_buf _bitmask_buf; diff --git a/src/index.cpp b/src/index.cpp index ebbecab84..1bcb09d2e 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -995,11 +995,11 @@ std::pair Index::iterate_to_fixed_point( if (use_filter && !input_contain_universal_label) { - // simple_bitmask bm(_bitmask_buf.get_bitmask(id)); + simple_bitmask bm(_bitmask_buf.get_bitmask(id)); - if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) + if (!bm.test_mask_val(bitmask_val) && (!_use_universal_label - || (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) + || (_use_universal_label && !bm.test_mask_val(universal_bitmask_val)))) { continue; } @@ -1072,21 +1072,12 @@ std::pair Index::iterate_to_fixed_point( { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. // std::vector common_filters; - // simple_bitmask bm(_bitmask_buf.get_bitmask(id)); + simple_bitmask bm(_bitmask_buf.get_bitmask(id)); - if (!_pts_label_bitsets[id].test_mask_val(bitmask_val) + if (!bm.test_mask_val(bitmask_val) && (!_use_universal_label || - (_use_universal_label && !_pts_label_bitsets[id].test_mask_val(universal_bitmask_val)))) + (_use_universal_label && !bm.test_mask_val(universal_bitmask_val)))) { - if (fast_iterate) - { - inserted_into_pool_bs[id] = 1; - } - else - { - inserted_into_pool_rs.insert(id); - } - continue; } } @@ -1974,11 +1965,11 @@ void Index::parse_label_file_in_bitset(const std::string& label _bitmask_buf._bitmask_size = simple_bitmask::get_bitmask_size(num_labels); _bitmask_buf._buf.resize(line_cnt * _bitmask_buf._bitmask_size, 0); - _pts_label_bitsets.reserve(line_cnt); - for (size_t i = 0; i < line_cnt; i++) - { - _pts_label_bitsets.push_back(_bitmask_buf.get_bitmask(i)); - } + //_pts_label_bitsets.reserve(line_cnt); + //for (size_t i = 0; i < line_cnt; i++) + //{ + // _pts_label_bitsets.push_back(_bitmask_buf.get_bitmask(i)); + //} infile.clear(); infile.seekg(0, std::ios::beg); @@ -1995,9 +1986,9 @@ void Index::parse_label_file_in_bitset(const std::string& label token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); LabelT token_as_num = std::stoul(token); - _pts_label_bitsets[line_cnt].set(token_as_num - 1); - //simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt)); - //bm.set(token_as_num - 1); + // _pts_label_bitsets[line_cnt].set(token_as_num - 1); + simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt)); + bm.set(token_as_num - 1); // lbls.push_back(token_as_num); _labels.insert(token_as_num); } From fe19ce6b79eb0658d59973d011e8bed0d4133751 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Fri, 12 May 2023 17:00:43 +0800 Subject: [PATCH 21/61] support multiple label --- include/index.h | 42 ++++++++++++++++++++++++++---------- include/scratch.h | 10 ++++++++- src/index.cpp | 55 ++++++++++++++++++++++++++++++----------------- src/scratch.cpp | 8 ++++++- 4 files changed, 82 insertions(+), 33 deletions(-) diff --git a/include/index.h b/include/index.h index ed2397a55..f13f9c101 100644 --- a/include/index.h +++ b/include/index.h @@ -74,20 +74,26 @@ struct consolidation_report } }; -class IBitSet -{ -public: - virtual bool test(size_t pos) const = 0; - - virtual void set(size_t pos) = 0; -}; - struct simple_bitmask_val { size_t _index = 0; std::uint64_t _mask = 0; }; +struct simple_bitmask_full_val +{ + simple_bitmask_full_val() + { + } + + void merge_bitmask_val(simple_bitmask_val& bitmask_val) + { + _mask[bitmask_val._index] |= bitmask_val._mask; + } + + std::uint64_t* _mask = nullptr; +}; + struct simple_bitmask_buf { std::uint64_t* get_bitmask(std::uint64_t index) @@ -114,8 +120,9 @@ class simple_bitmask // memset(_bitsets, 0, aligned_bytes); //} - simple_bitmask(std::uint64_t* bitsets) + simple_bitmask(std::uint64_t* bitsets, std::uint64_t bitmask_size) : _bitsets(bitsets) + , _bitmask_size(bitmask_size) { } @@ -150,6 +157,19 @@ class simple_bitmask return 0 != (val & bitmask_val._mask); } + bool test_full_mask_val(const simple_bitmask_full_val& bitmask_full_val) const + { + for (size_t i = 0; i < _bitmask_size; i++) + { + if ((bitmask_full_val._mask[i] & _bitsets[i]) != 0) + { + return true; + } + } + + return false; + } + void set(size_t pos) { std::uint64_t mask = (std::uint64_t)1 << (pos & (8 * sizeof(std::uint64_t) - 1)); @@ -159,7 +179,7 @@ class simple_bitmask private: std::uint64_t* _bitsets; -// std::uint64_t _size; + std::uint64_t _bitmask_size; }; template class Index @@ -389,7 +409,7 @@ template clas const unsigned maxc, const float alpha, InMemQueryScratch *scratch); void initialize_query_scratch(uint32_t num_threads, uint32_t search_l, uint32_t indexing_l, uint32_t r, - uint32_t maxc, size_t dim); + uint32_t maxc, size_t dim, size_t bitmask_size = 0); // Do not call without acquiring appropriate locks // call public member functions save and load to invoke these. diff --git a/include/scratch.h b/include/scratch.h index 92348ecc5..7a2cbb861 100644 --- a/include/scratch.h +++ b/include/scratch.h @@ -35,7 +35,7 @@ template class InMemQueryScratch public: ~InMemQueryScratch(); InMemQueryScratch(uint32_t search_l, uint32_t indexing_l, uint32_t r, uint32_t maxc, size_t dim, - bool init_pq_scratch = false); + bool init_pq_scratch = false, size_t bitmask_size = 0); void resize_for_new_L(uint32_t new_search_l); void clear(); @@ -100,6 +100,11 @@ template class InMemQueryScratch return _occlude_list_output; } + inline std::vector& query_label_bitmask() + { + return _query_label_bitmask; + } + private: uint32_t _L; uint32_t _R; @@ -142,6 +147,9 @@ template class InMemQueryScratch tsl::robin_set _expanded_nodes_set; std::vector _expanded_nghrs_vec; std::vector _occlude_list_output; + + // bitmask buffer in searching time + std::vector _query_label_bitmask; }; // diff --git a/src/index.cpp b/src/index.cpp index 1bcb09d2e..1f57c1059 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -164,11 +164,11 @@ template Index::~I template void Index::initialize_query_scratch(uint32_t num_threads, uint32_t search_l, uint32_t indexing_l, - uint32_t r, uint32_t maxc, size_t dim) + uint32_t r, uint32_t maxc, size_t dim, size_t bitmask_size) { for (uint32_t i = 0; i < num_threads; i++) { - auto scratch = new InMemQueryScratch(search_l, indexing_l, r, maxc, dim, _pq_dist); + auto scratch = new InMemQueryScratch(search_l, indexing_l, r, maxc, dim, _pq_dist, bitmask_size); _query_scratch.push(scratch); } } @@ -629,7 +629,7 @@ void Index::load(const char *filename, uint32_t num_threads, ui if (_query_scratch.size() == 0) { initialize_query_scratch(num_threads, search_l, search_l, (uint32_t)_max_range_of_loaded_graph, _indexingMaxC, - _dim); + _dim, _bitmask_buf._bitmask_size); } } @@ -898,6 +898,8 @@ std::pair Index::iterate_to_fixed_point( normalize((float *)aligned_query, _dim); } + std::vector& query_bitmask_buf = scratch->query_label_bitmask(); + float *query_float; float *query_rotated; float *pq_dists; @@ -973,16 +975,33 @@ std::pair Index::iterate_to_fixed_point( } // only support one filter label - simple_bitmask_val bitmask_val; - if (filter_label.size() > 0) - { - bitmask_val = simple_bitmask::get_bitmask_val(filter_label[0] - 1); - } - simple_bitmask_val universal_bitmask_val; - if (_use_universal_label) + simple_bitmask_full_val bitmask_full_val; + if (use_filter) { - universal_bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); + query_bitmask_buf.resize(_bitmask_buf._bitmask_size, 0); + bitmask_full_val._mask = query_bitmask_buf.data(); + for (size_t i = 0; i < filter_label.size(); i++) + { + auto bitmask_val = simple_bitmask::get_bitmask_val(filter_label[i] - 1); + bitmask_full_val.merge_bitmask_val(bitmask_val); + } + + if (_use_universal_label) + { + auto bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); + bitmask_full_val.merge_bitmask_val(bitmask_val); + } } + //simple_bitmask_val bitmask_val; + //if (filter_label.size() > 0) + //{ + // bitmask_val = simple_bitmask::get_bitmask_val(filter_label[0] - 1); + //} + //simple_bitmask_val universal_bitmask_val; + //if (_use_universal_label) + //{ + // universal_bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); + //} // Initialize the candidate pool with starting points for (auto id : init_ids) { @@ -995,11 +1014,9 @@ std::pair Index::iterate_to_fixed_point( if (use_filter && !input_contain_universal_label) { - simple_bitmask bm(_bitmask_buf.get_bitmask(id)); + simple_bitmask bm(_bitmask_buf.get_bitmask(id), _bitmask_buf._bitmask_size); - if (!bm.test_mask_val(bitmask_val) - && (!_use_universal_label - || (_use_universal_label && !bm.test_mask_val(universal_bitmask_val)))) + if (!bm.test_full_mask_val(bitmask_full_val)) { continue; } @@ -1072,11 +1089,9 @@ std::pair Index::iterate_to_fixed_point( { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. // std::vector common_filters; - simple_bitmask bm(_bitmask_buf.get_bitmask(id)); + simple_bitmask bm(_bitmask_buf.get_bitmask(id), _bitmask_buf._bitmask_size); - if (!bm.test_mask_val(bitmask_val) - && (!_use_universal_label || - (_use_universal_label && !bm.test_mask_val(universal_bitmask_val)))) + if (!bm.test_full_mask_val(bitmask_full_val)) { continue; } @@ -1987,7 +2002,7 @@ void Index::parse_label_file_in_bitset(const std::string& label token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); LabelT token_as_num = std::stoul(token); // _pts_label_bitsets[line_cnt].set(token_as_num - 1); - simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt)); + simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt), _bitmask_buf._bitmask_size); bm.set(token_as_num - 1); // lbls.push_back(token_as_num); _labels.insert(token_as_num); diff --git a/src/scratch.cpp b/src/scratch.cpp index c83ecac9f..9f369c61f 100644 --- a/src/scratch.cpp +++ b/src/scratch.cpp @@ -13,7 +13,7 @@ namespace diskann // template InMemQueryScratch::InMemQueryScratch(uint32_t search_l, uint32_t indexing_l, uint32_t r, uint32_t maxc, size_t dim, - bool init_pq_scratch) + bool init_pq_scratch, size_t bitmask_size) : _L(0), _R(r), _maxc(maxc) { if (search_l == 0 || indexing_l == 0 || r == 0 || dim == 0) @@ -39,6 +39,11 @@ InMemQueryScratch::InMemQueryScratch(uint32_t search_l, uint32_t indexing_l, _dist_scratch.reserve(std::ceil(1.5 * GRAPH_SLACK_FACTOR * _R)); resize_for_new_L(std::max(search_l, indexing_l)); + + if (bitmask_size > 0) + { + _query_label_bitmask.resize(bitmask_size, 0); + } } template void InMemQueryScratch::clear() @@ -56,6 +61,7 @@ template void InMemQueryScratch::clear() _expanded_nodes_set.clear(); _expanded_nghrs_vec.clear(); _occlude_list_output.clear(); + _query_label_bitmask.clear(); } template void InMemQueryScratch::resize_for_new_L(uint32_t new_l) From 56e892a7e350c384c3b4036cbf5fdc693b630725 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Mon, 15 May 2023 11:54:50 +0800 Subject: [PATCH 22/61] use local bitmask in small size --- src/index.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 1f57c1059..a45e08046 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -975,11 +975,21 @@ std::pair Index::iterate_to_fixed_point( } // only support one filter label + std::array local_buf; simple_bitmask_full_val bitmask_full_val; if (use_filter) { - query_bitmask_buf.resize(_bitmask_buf._bitmask_size, 0); - bitmask_full_val._mask = query_bitmask_buf.data(); + if (_bitmask_buf._bitmask_size <= 10) + { + local_buf.assign(0); + bitmask_full_val._mask = local_buf.data(); + } + else + { + query_bitmask_buf.resize(_bitmask_buf._bitmask_size, 0); + bitmask_full_val._mask = query_bitmask_buf.data(); + } + for (size_t i = 0; i < filter_label.size(); i++) { auto bitmask_val = simple_bitmask::get_bitmask_val(filter_label[i] - 1); From f32b0472703ea7b45bef7cb90c915bdb37599951 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Mon, 15 May 2023 12:02:51 +0800 Subject: [PATCH 23/61] add header file --- src/index.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.cpp b/src/index.cpp index a45e08046..acdb54739 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "tsl/robin_set.h" #include "tsl/robin_map.h" From 9072f16d66b50b9e344c84526818c0ebba2aaf43 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Mon, 15 May 2023 12:05:07 +0800 Subject: [PATCH 24/61] fix some issue --- src/index.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.cpp b/src/index.cpp index acdb54739..52f2b7c94 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -982,7 +982,7 @@ std::pair Index::iterate_to_fixed_point( { if (_bitmask_buf._bitmask_size <= 10) { - local_buf.assign(0); + local_buf.fill(0); bitmask_full_val._mask = local_buf.data(); } else From ec2bcf0eeda8b3caefb987c24fb2c1af2f91050c Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Mon, 15 May 2023 13:41:06 +0800 Subject: [PATCH 25/61] add prefetch --- src/index.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/index.cpp b/src/index.cpp index 52f2b7c94..421956150 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1087,10 +1087,19 @@ std::pair Index::iterate_to_fixed_point( { if (_dynamic_index) _locks[n].lock(); - for (auto id : _final_graph[n]) +// for (auto id : _final_graph[n]) + for (size_t i = 0; i < _final_graph[n].size(); i++) { + auto id = _final_graph[n][i]; assert(id < _max_points + _num_frozen_pts); + if (i < _final_graph[n].size() - 1) + { + auto nextId = _final_graph[n][i + 1]; + diskann::prefetch_vector((const char*)_bitmask_buf.get_bitmask(nextId), + _bitmask_buf._bitmask_size * sizeof(std::uint64_t)); + } + if (!is_not_visited(id)) { continue; From 47e430fa524f5cfd6f73664f83d6a63dbb1fa0e6 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Mon, 15 May 2023 14:22:34 +0800 Subject: [PATCH 26/61] revert perfetch --- src/index.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 421956150..52f2b7c94 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1087,19 +1087,10 @@ std::pair Index::iterate_to_fixed_point( { if (_dynamic_index) _locks[n].lock(); -// for (auto id : _final_graph[n]) - for (size_t i = 0; i < _final_graph[n].size(); i++) + for (auto id : _final_graph[n]) { - auto id = _final_graph[n][i]; assert(id < _max_points + _num_frozen_pts); - if (i < _final_graph[n].size() - 1) - { - auto nextId = _final_graph[n][i + 1]; - diskann::prefetch_vector((const char*)_bitmask_buf.get_bitmask(nextId), - _bitmask_buf._bitmask_size * sizeof(std::uint64_t)); - } - if (!is_not_visited(id)) { continue; From 79c3bc958d29358ada53956c706c1a4eb0511ebd Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Tue, 16 May 2023 12:30:35 +0800 Subject: [PATCH 27/61] cleanup code --- include/index.h | 26 -------------------------- src/index.cpp | 27 +-------------------------- 2 files changed, 1 insertion(+), 52 deletions(-) diff --git a/include/index.h b/include/index.h index f13f9c101..bcb7b5832 100644 --- a/include/index.h +++ b/include/index.h @@ -37,19 +37,6 @@ inline double estimate_ram_usage(_u64 size, _u32 dim, _u32 datasize, _u32 degree return OVERHEAD_FACTOR * (size_of_data + size_of_graph + size_of_locks + size_of_outer_vector); } -template -inline bool is_label_existed(const std::vector& node_labels, const LabelT& input_label) -{ - for (const auto& node_label : node_labels) - { - if (node_label == input_label) - { - return true; - } - } - - return false; -} struct consolidation_report { @@ -109,17 +96,6 @@ struct simple_bitmask_buf class simple_bitmask { public: - //simple_bitmask(size_t totalBits) - //{ - // std::uint64_t bytes = (totalBits + 7) / 8; - // std::uint64_t aligned_bytes = bytes + sizeof(std::uint64_t) - 1; - // aligned_bytes = aligned_bytes - (aligned_bytes % sizeof(std::uint64_t)); - // _size = aligned_bytes / sizeof(std::uint64_t); - - // _bitsets = (std::uint64_t*)malloc(aligned_bytes); - // memset(_bitsets, 0, aligned_bytes); - //} - simple_bitmask(std::uint64_t* bitsets, std::uint64_t bitmask_size) : _bitsets(bitsets) , _bitmask_size(bitmask_size) @@ -532,8 +508,6 @@ template clas // Per node lock, cardinality=_max_points std::vector _locks; -// std::vector _pts_label_bitsets; - simple_bitmask_buf _bitmask_buf; static const float INDEX_GROWTH_FACTOR; diff --git a/src/index.cpp b/src/index.cpp index 52f2b7c94..c7cf9ced0 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -564,7 +564,6 @@ void Index::load(const char *filename, uint32_t num_threads, ui if (file_exists(labels_file)) { _label_map = load_label_map(labels_map_file); - // parse_label_file(labels_file, label_num_pts); parse_label_file_in_bitset(labels_file, label_num_pts, _label_map.size()); assert(label_num_pts == data_file_num_pts); @@ -1003,16 +1002,7 @@ std::pair Index::iterate_to_fixed_point( bitmask_full_val.merge_bitmask_val(bitmask_val); } } - //simple_bitmask_val bitmask_val; - //if (filter_label.size() > 0) - //{ - // bitmask_val = simple_bitmask::get_bitmask_val(filter_label[0] - 1); - //} - //simple_bitmask_val universal_bitmask_val; - //if (_use_universal_label) - //{ - // universal_bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); - //} + // Initialize the candidate pool with starting points for (auto id : init_ids) { @@ -1099,7 +1089,6 @@ std::pair Index::iterate_to_fixed_point( if (use_filter && !input_contain_universal_label) { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. - // std::vector common_filters; simple_bitmask bm(_bitmask_buf.get_bitmask(id), _bitmask_buf._bitmask_size); if (!bm.test_full_mask_val(bitmask_full_val)) @@ -1991,11 +1980,6 @@ void Index::parse_label_file_in_bitset(const std::string& label _bitmask_buf._bitmask_size = simple_bitmask::get_bitmask_size(num_labels); _bitmask_buf._buf.resize(line_cnt * _bitmask_buf._bitmask_size, 0); - //_pts_label_bitsets.reserve(line_cnt); - //for (size_t i = 0; i < line_cnt; i++) - //{ - // _pts_label_bitsets.push_back(_bitmask_buf.get_bitmask(i)); - //} infile.clear(); infile.seekg(0, std::ios::beg); @@ -2012,19 +1996,10 @@ void Index::parse_label_file_in_bitset(const std::string& label token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); LabelT token_as_num = std::stoul(token); - // _pts_label_bitsets[line_cnt].set(token_as_num - 1); simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt), _bitmask_buf._bitmask_size); bm.set(token_as_num - 1); - // lbls.push_back(token_as_num); _labels.insert(token_as_num); } - //if (lbls.size() <= 0) - //{ - // diskann::cout << "No label found"; - // exit(-1); - //} - // std::sort(lbls.begin(), lbls.end()); - // _pts_to_labels[line_cnt] = lbls; line_cnt++; } num_points = (size_t)line_cnt; From 417a47a6b1e9928aedb3ed1d293c5c333999be9b Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Wed, 17 May 2023 15:32:54 +0800 Subject: [PATCH 28/61] apply bitmask in index build --- include/index.h | 16 ++++++++++ include/utils.h | 12 +++++-- src/index.cpp | 85 ++++++++++++++++++++++++++++++++++++------------- 3 files changed, 87 insertions(+), 26 deletions(-) diff --git a/include/index.h b/include/index.h index bcb7b5832..10efe1323 100644 --- a/include/index.h +++ b/include/index.h @@ -146,6 +146,20 @@ class simple_bitmask return false; } + bool test_full_mask_contain(const simple_bitmask& bitmask_full_val) const + { + for (size_t i = 0; i < _bitmask_size; i++) + { + auto mask = bitmask_full_val._bitsets[i]; + if ((mask & _bitsets[i]) != mask) + { + return false; + } + } + + return true; + } + void set(size_t pos) { std::uint64_t mask = (std::uint64_t)1 << (pos & (8 * sizeof(std::uint64_t) - 1)); @@ -325,6 +339,8 @@ template clas void parse_label_file_in_bitset(const std::string& label_file, size_t& num_points, size_t num_labels); + void convert_pts_label_to_bitmask(std::vector>& pts_to_labels, simple_bitmask_buf& bitmask_buf, size_t num_labels); + std::unordered_map load_label_map(const std::string &map_file); // Returns the locations of start point and frozen points suitable for use with iterate_to_fixed_point. diff --git a/include/utils.h b/include/utils.h index b5d5874c8..a011aca1e 100644 --- a/include/utils.h +++ b/include/utils.h @@ -159,13 +159,14 @@ inline int delete_file(const std::string &fileName) } inline void convert_labels_string_to_int(const std::string &inFileName, const std::string &outFileName, - const std::string &mapFileName, const std::string &unv_label) + const std::string &mapFileName, const std::string &unv_label, + _u32& unv_label_id) { std::unordered_map string_int_map; std::ofstream label_writer(outFileName); std::ifstream label_reader(inFileName); - if (unv_label != "") - string_int_map[unv_label] = 0; + //if (unv_label != "") + // string_int_map[unv_label] = 0; std::string line, token; while (std::getline(label_reader, line)) { @@ -197,6 +198,11 @@ inline void convert_labels_string_to_int(const std::string &inFileName, const st } label_writer.close(); + if (unv_label != "") + { + unv_label_id = string_int_map[unv_label]; + } + std::ofstream map_writer(mapFileName); for (auto mp : string_int_map) { diff --git a/src/index.cpp b/src/index.cpp index c7cf9ced0..ad459a6f4 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -961,18 +961,18 @@ std::pair Index::iterate_to_fixed_point( }; // check if input labels contain universal label - bool input_contain_universal_label = false; - if (_use_universal_label) - { - for (size_t i = 0; i < filter_label.size(); i++) - { - if (filter_label[i] == _universal_label) - { - input_contain_universal_label = true; - break; - } - } - } + //bool input_contain_universal_label = false; + //if (_use_universal_label) + //{ + // for (size_t i = 0; i < filter_label.size(); i++) + // { + // if (filter_label[i] == _universal_label) + // { + // input_contain_universal_label = true; + // break; + // } + // } + //} // only support one filter label std::array local_buf; @@ -1013,7 +1013,7 @@ std::pair Index::iterate_to_fixed_point( __LINE__); } - if (use_filter && !input_contain_universal_label) + if (use_filter /*&& !input_contain_universal_label*/) { simple_bitmask bm(_bitmask_buf.get_bitmask(id), _bitmask_buf._bitmask_size); @@ -1086,7 +1086,7 @@ std::pair Index::iterate_to_fixed_point( continue; } cmps++; - if (use_filter && !input_contain_universal_label) + if (use_filter /*&& !input_contain_universal_label*/) { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. simple_bitmask bm(_bitmask_buf.get_bitmask(id), _bitmask_buf._bitmask_size); @@ -1254,7 +1254,13 @@ void Index::occlude_list(const unsigned location, std::vectorid; _u32 b = iter2->id; - for (auto &x : _pts_to_labels[b]) + + simple_bitmask bm1(_bitmask_buf.get_bitmask(a), _bitmask_buf._bitmask_size); + simple_bitmask bm2(_bitmask_buf.get_bitmask(b), _bitmask_buf._bitmask_size); + + prune_allowed = bm1.test_full_mask_contain(bm2); + + /* for (auto &x : _pts_to_labels[b]) { if (std::find(_pts_to_labels[a].begin(), _pts_to_labels[a].end(), x) == _pts_to_labels[a].end()) { @@ -1262,7 +1268,7 @@ void Index::occlude_list(const unsigned location, std::vector::parse_label_file(const std::string &label_file, siz diskann::cout << "Identified " << _labels.size() << " distinct label(s)" << std::endl; } +template +void Index::convert_pts_label_to_bitmask(std::vector>& pts_to_labels, simple_bitmask_buf& bitmask_buf, size_t num_labels) +{ + _bitmask_buf._bitmask_size = simple_bitmask::get_bitmask_size(num_labels); + _bitmask_buf._buf.resize(pts_to_labels.size() * _bitmask_buf._bitmask_size, 0); + + for (size_t i = 0; i < pts_to_labels.size(); i++) + { + for (size_t j = 0; j < pts_to_labels[i].size(); j++) + { + simple_bitmask bm(_bitmask_buf.get_bitmask(i), _bitmask_buf._bitmask_size); + bm.set(pts_to_labels[i][j] - 1); + } + } +} + template void Index::parse_label_file_in_bitset(const std::string& label_file, size_t& num_points, size_t num_labels) { @@ -2026,25 +2048,42 @@ void Index::build_filtered_index(const char *filename, const st num_points_labels); // determines medoid for each label and // identifies the points to label mapping - std::unordered_map> label_to_points; + convert_pts_label_to_bitmask(_pts_to_labels, _bitmask_buf, _labels.size()); + std::unordered_map> label_to_points; + std::vector label_bitmask; for (int lbl = 0; lbl < _labels.size(); lbl++) { auto itr = _labels.begin(); std::advance(itr, lbl); auto &x = *itr; + + label_bitmask.clear(); + label_bitmask.resize(_bitmask_buf._bitmask_size); + + simple_bitmask_full_val bitmask_full_val; + auto bitmask_val = simple_bitmask::get_bitmask_val(x - 1); + bitmask_full_val.merge_bitmask_val(bitmask_val); + if (_use_universal_label) + { + auto bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); + bitmask_full_val.merge_bitmask_val(bitmask_val); + } std::vector<_u32> labeled_points; for (_u32 point_id = 0; point_id < num_points_to_load; point_id++) { - bool pt_has_lbl = std::find(_pts_to_labels[point_id].begin(), _pts_to_labels[point_id].end(), x) != - _pts_to_labels[point_id].end(); + simple_bitmask bm(_bitmask_buf.get_bitmask(point_id), _bitmask_buf._bitmask_size); + bool pt_has_lbl = bm.test_full_mask_val(bitmask_full_val); + + //bool pt_has_lbl = std::find(_pts_to_labels[point_id].begin(), _pts_to_labels[point_id].end(), x) != + // _pts_to_labels[point_id].end(); - bool pt_has_univ_lbl = - (_use_universal_label && (std::find(_pts_to_labels[point_id].begin(), _pts_to_labels[point_id].end(), - _universal_label) != _pts_to_labels[point_id].end())); + //bool pt_has_univ_lbl = + // (_use_universal_label && (std::find(_pts_to_labels[point_id].begin(), _pts_to_labels[point_id].end(), + // _universal_label) != _pts_to_labels[point_id].end())); - if (pt_has_lbl || pt_has_univ_lbl) + if (pt_has_lbl) { labeled_points.emplace_back(point_id); } From a2993df152c08d5e5ef092ffcf0d227026a9fc4b Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Wed, 17 May 2023 15:43:31 +0800 Subject: [PATCH 29/61] fix compile issue --- src/disk_utils.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/disk_utils.cpp b/src/disk_utils.cpp index aaf3dd71d..a2372abc3 100644 --- a/src/disk_utils.cpp +++ b/src/disk_utils.cpp @@ -1184,8 +1184,9 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const std::string augmented_data_file, augmented_labels_file; if (use_filters) { + std::uint32_t universal_label_id = 0; convert_labels_string_to_int(labels_file_original, labels_file_to_use, disk_labels_int_map_file, - universal_label); + universal_label, universal_label_id); augmented_data_file = index_prefix_path + "_augmented_data.bin"; augmented_labels_file = index_prefix_path + "_augmented_labels.txt"; if (filter_threshold != 0) From a4855aa291e2299964d9b247ef93caf0456140c9 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Wed, 17 May 2023 16:12:52 +0800 Subject: [PATCH 30/61] Fix some issue --- src/index.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.cpp b/src/index.cpp index ad459a6f4..4bf79efc4 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2059,9 +2059,10 @@ void Index::build_filtered_index(const char *filename, const st auto &x = *itr; label_bitmask.clear(); - label_bitmask.resize(_bitmask_buf._bitmask_size); + label_bitmask.resize(_bitmask_buf._bitmask_size, 0); simple_bitmask_full_val bitmask_full_val; + bitmask_full_val._mask = label_bitmask.data(); auto bitmask_val = simple_bitmask::get_bitmask_val(x - 1); bitmask_full_val.merge_bitmask_val(bitmask_val); if (_use_universal_label) From 2dcb482e873a2b884625d11607f67e4fb8cb0ea7 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Wed, 17 May 2023 17:17:40 +0800 Subject: [PATCH 31/61] use original label id --- src/index.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 4bf79efc4..eb3d09a16 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -992,13 +992,13 @@ std::pair Index::iterate_to_fixed_point( for (size_t i = 0; i < filter_label.size(); i++) { - auto bitmask_val = simple_bitmask::get_bitmask_val(filter_label[i] - 1); + auto bitmask_val = simple_bitmask::get_bitmask_val(filter_label[i]); bitmask_full_val.merge_bitmask_val(bitmask_val); } if (_use_universal_label) { - auto bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); + auto bitmask_val = simple_bitmask::get_bitmask_val(_universal_label); bitmask_full_val.merge_bitmask_val(bitmask_val); } } @@ -1978,7 +1978,7 @@ void Index::convert_pts_label_to_bitmask(std::vector::parse_label_file_in_bitset(const std::string& label token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); LabelT token_as_num = std::stoul(token); simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt), _bitmask_buf._bitmask_size); - bm.set(token_as_num - 1); + bm.set(token_as_num); _labels.insert(token_as_num); } line_cnt++; @@ -2063,11 +2063,11 @@ void Index::build_filtered_index(const char *filename, const st simple_bitmask_full_val bitmask_full_val; bitmask_full_val._mask = label_bitmask.data(); - auto bitmask_val = simple_bitmask::get_bitmask_val(x - 1); + auto bitmask_val = simple_bitmask::get_bitmask_val(x); bitmask_full_val.merge_bitmask_val(bitmask_val); if (_use_universal_label) { - auto bitmask_val = simple_bitmask::get_bitmask_val(_universal_label - 1); + auto bitmask_val = simple_bitmask::get_bitmask_val(_universal_label); bitmask_full_val.merge_bitmask_val(bitmask_val); } From 94a5a122ca6a8a1b1d85d42ce71e8ba60f0d3903 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 18 May 2023 13:54:50 +0800 Subject: [PATCH 32/61] return max value for invaild label --- include/pq_flash_index.h | 2 +- src/index.cpp | 6 +++++- src/pq_flash_index.cpp | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/include/pq_flash_index.h b/include/pq_flash_index.h index 94105bf86..807658837 100644 --- a/include/pq_flash_index.h +++ b/include/pq_flash_index.h @@ -186,7 +186,7 @@ template class PQFlashIndex _u32 *_pts_to_labels = nullptr; tsl::robin_set _labels; std::unordered_map _filter_to_medoid_id; - bool _use_universal_label; + bool _use_universal_label = false; _u32 _universal_filter_num = 0; std::vector _filter_list; tsl::robin_set<_u32> _dummy_pts; diff --git a/src/index.cpp b/src/index.cpp index eb3d09a16..8bfacfc2a 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1910,10 +1910,14 @@ LabelT Index::get_converted_label(const std::string &raw_label) { return _label_map[raw_label]; } - else + else if (_use_universal_label) { return _universal_label; } + else + { + return std::numeric_limits::max(); + } } template diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index 3af8e0b7c..050d20546 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -491,10 +491,14 @@ LabelT PQFlashIndex::get_converted_label(const std::string &filter_la { return _label_map[filter_label]; } - else + else if (_use_universal_label) { return static_cast(_universal_filter_num); } + else + { + return std::numeric_limits::max(); + } } template From 3681b56da065ca6dcc1e33d2a2c5f35354d52917 Mon Sep 17 00:00:00 2001 From: Jerry Gao Date: Thu, 18 May 2023 14:20:03 +0800 Subject: [PATCH 33/61] cleanup code --- src/index.cpp | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 8bfacfc2a..d348a510f 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -960,20 +960,6 @@ std::pair Index::iterate_to_fixed_point( diskann::pq_dist_lookup(pq_coord_scratch, ids.size(), this->_num_pq_chunks, pq_dists, dists_out); }; - // check if input labels contain universal label - //bool input_contain_universal_label = false; - //if (_use_universal_label) - //{ - // for (size_t i = 0; i < filter_label.size(); i++) - // { - // if (filter_label[i] == _universal_label) - // { - // input_contain_universal_label = true; - // break; - // } - // } - //} - // only support one filter label std::array local_buf; simple_bitmask_full_val bitmask_full_val; @@ -1013,7 +999,7 @@ std::pair Index::iterate_to_fixed_point( __LINE__); } - if (use_filter /*&& !input_contain_universal_label*/) + if (use_filter) { simple_bitmask bm(_bitmask_buf.get_bitmask(id), _bitmask_buf._bitmask_size); @@ -1086,7 +1072,7 @@ std::pair Index::iterate_to_fixed_point( continue; } cmps++; - if (use_filter /*&& !input_contain_universal_label*/) + if (use_filter) { // NOTE: NEED TO CHECK IF THIS CORRECT WITH NEW LOCKS. simple_bitmask bm(_bitmask_buf.get_bitmask(id), _bitmask_buf._bitmask_size); @@ -1259,16 +1245,6 @@ void Index::occlude_list(const unsigned location, std::vector::build_filtered_index(const char *filename, const st simple_bitmask bm(_bitmask_buf.get_bitmask(point_id), _bitmask_buf._bitmask_size); bool pt_has_lbl = bm.test_full_mask_val(bitmask_full_val); - //bool pt_has_lbl = std::find(_pts_to_labels[point_id].begin(), _pts_to_labels[point_id].end(), x) != - // _pts_to_labels[point_id].end(); - - //bool pt_has_univ_lbl = - // (_use_universal_label && (std::find(_pts_to_labels[point_id].begin(), _pts_to_labels[point_id].end(), - // _universal_label) != _pts_to_labels[point_id].end())); - if (pt_has_lbl) { labeled_points.emplace_back(point_id); From 07938b9470f48d2963c6e57bcbff7f72a942f876 Mon Sep 17 00:00:00 2001 From: Jerry Gao <109158931+Sanhaoji2@users.noreply.github.com> Date: Fri, 18 Aug 2023 17:56:42 +0800 Subject: [PATCH 34/61] Jegao/label hot fix with main2 (#430) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add codebook passing and pq/opq dim overwrite. * Support per query filter (#279) * Transferring Varun's chagges from external fork with squash merge * generating multiple gt's for each filter label + search with multiple filter labels (code cleanup) * supporting no-filter + one filter label + filter label file (multiple filters) while computing GT * generating multiple gt's + refactoring code for readability & cleanliness * adding more tests for filtered search * updating pr-test to test filtered cases * lowering recall requirement for disk index * transferred functions to filter_utils * adding more test for build and search without universal label * adding one_per_point distribution to generate_synthetic_labels + cleaning up artifacts after compute gt+ removing minor errors * refactoring search_disk_index to use a query filter vector --------- Co-authored-by: patelyash Co-authored-by: Varun Sivashankar * Rebasing main's latest commits onto ravi/filter_support_rebased (#225) - add code for two variants of filtered index, readme and CI tests - add utils for synthetic label generation and CI tests. * Add co-authors Co-authored-by: ravishankar Co-authored-by: Varun Sivashankar --------- Co-authored-by: ravishankar Co-authored-by: David Kaczynski Co-authored-by: Siddharth Gollapudi Co-authored-by: Neelam Mahapatro Co-authored-by: Harsha Vardhan Simhadri Co-authored-by: Harsha Vardhan Simhadri Co-authored-by: REDMOND\patelyash Co-authored-by: Varun Sivashankar * Clang-format now errors on push and PR if formatting is incorrect (#236) * Rather than sift through all the *.cpp and *.h in the root directory, we're looking for only the sources in our main repository for formatting. Git submodules are excluded * Removing the --Werror flag only until we actually format all of the code in a future commit * We're choosing to base our style on the Microsoft style guide and not make any changes * Running format action on source code. Settling on Google styling. Settled on '.clang-format' instead of '_clang-format'. Fixed instructions such that only clang-format 12 is installed (13 changes SortIncludes options from true/false to a trinary set of options, none of which include the word 'false') * Enabling error on malformatted file * Revert "Enabling error on malformatted file" This reverts commit fa33e8284cb9ee815d882e516aaeb7be6800a982. * Revert "Running format action on source code. Settling on Google styling. Settled on '.clang-format' instead of '_clang-format'. Fixed instructions such that only clang-format 12 is installed (13 changes SortIncludes options from true/false to a trinary set of options, none of which include the word 'false')" This reverts commit e0281bec8c265ecd3b56d65f61e768238ed8b1c1. * Trying again; formatting rules based on Google rules, disables sorting includes as that breaks us, and enabling check on build. * Somehow this was missed in the mass format. Formatting include/distance.h. * Manually fixing the formatting because clang-format wouldn't, but WOULD flag it as invalid * Update SSD_index.md (#258) Fix typo in SSD index readme * Add filter-diskann paper link to readme (#275) * Update README.md (#277) * update citation (#281) * Some fixes to pass internal building pipeline (#282) Remove warnings affecting internal build pipelines --------- Co-authored-by: Yiyong Lin * Add support for multiple frozen points (#283) * Add support for multiple frozen points * Add the missing parameters to the constructor. * Added filtered disk index readme (#276) * Added filtered disk index readme * Support per query filter (#279) * Transferring Varun's chagges from external fork with squash merge * generating multiple gt's for each filter label + search with multiple filter labels (code cleanup) * supporting no-filter + one filter label + filter label file (multiple filters) while computing GT * generating multiple gt's + refactoring code for readability & cleanliness * adding more tests for filtered search * updating pr-test to test filtered cases * lowering recall requirement for disk index * transferred functions to filter_utils * adding more test for build and search without universal label * adding one_per_point distribution to generate_synthetic_labels + cleaning up artifacts after compute gt+ removing minor errors * refactoring search_disk_index to use a query filter vector --------- Co-authored-by: patelyash Co-authored-by: Varun Sivashankar * udpate merging code * Using boost program options under Visual Studio MSVC 14.0 Assertion failed * some commts and rewriting * add back LF which might be confict with MSVC 14.0 * clang formating change * clang formating * revert back to Lf * unexpected failure on UT re-try * adding default string to the path * fix reference issue * Fixing Build errors in remove_extra_typedef (#290) remove _u, _s typedefs * converting uint64's to size_t where they represent array offsets --------- Co-authored-by: harsha vardhan simhadri * clang format * bump it up to 512 for MAX_PQ_CHUNKS * default codebook prefix value pass in for generate_quantized_data * add check for disabling both -B and -QD pass in * remove rules for force only one of -B and -QD * clange change * change clang format * bring back -B params * generate_quantized_data pass in referemce instead of const string * update clang and param reference * updated dockerfile (#299) * updated dockerfile * add parallel build flag to dockerfile * Adds CI jobs to build our docker container (#302) * Adding a step that at least builds the docker container. I'm not yet sure how I want to actually integrate tests within the container, but at the least we should verify it builds * docker build needs a path. i honestly thought it defaulted to the CWD --------- Co-authored-by: Dax Pryce * Python API and Test Suite (#300) * The first step in the python-api-enhancements branch. We need to fix a problem with the Parameters class with a double free or segfault on deletion. * Removing the parameters class in favor of the IndexRead and IndexWrite parameters classes. * API changes and python packaging changes for linux. It's almost ready for PR, but definitely ready for push. * Suppressing the CIBuildWheel step on windows * added in-mem static and dynamic index class to python bindings (#301) * Advancing our version number to 0.5.0 * Some more updates as per harsha's comments on PR #300. The diskann_bindings.cpp still need some more tlc and the wrapper needs to make use of it, and we also want to include some examples, but this is a good place to bring into main and then do further enhancements --------- Co-authored-by: Harsha Vardhan Simhadri * reducing number of L values for stitched search (#307) * reducing number of L values for stitched search in CI * add a warning in prune_neighbor if zero distance neighbor is detected (#320) * Fix condition on ubuntu version in README (#246) * Fix building SSD index performance issue (#321) Fix performance gap between in-mem and SSD based graph built by passing an appropriate number of threads. --------- Co-authored-by: Yiyong Lin Co-authored-by: Harsha Vardhan Simhadri * remove the distance 0 warning in prune candidate the list, since diskann::cerr does not seem thread safe (#330) * Set compile warning as error for core projects (#331) * set(CMAKE_COMPILE_WARNING_AS_ERROR ON) --------- Co-authored-by: Yiyong Lin * Create a data store abstraction (#305) Create a virtual data store base class and a derived in-mem store class. In-mem index now uses the data store class. --------- Co-authored-by: Gopal Srinivasa Co-authored-by: ravishankar Co-authored-by: yashpatel007 * Disabling Python builds (#338) * Disabling Python builds debian stretch no longer seems to have valid apt repos - or at least not ones that we can access - which means our cibuildwheel is failing. * New python interface, build setup, apps and unit tests (#308) --------- Co-authored-by: Dax Pryce * Adding some diagnostics to a pr build in an attempt to see what is going on with our systems prior to running our streaming/incremental tests * fix cast error and add some status prints to in-mem-dynamic app * Adding unit tests for both memory and disk index builder methods * After the refactor and polish of the API was left half done, I also left half a jillion bugs in the library. At least I'm confident that build_memory_index and StaticMemoryIndex work in some cases, whereas before they barely were getting off the ground * Sanity checks of static index (not comprehensive coverage), and tombstone file for test_dynamic_memory_index * Argument range checks of some of the static memory index values. * fixes for dynamic index in python interface (#334) * create separate default number of frozen points for dynamic indices * consolidate works * remove superfluous param from dynamic index * remove superfluous param from dynamic index * batch insert and args modification to apps * batch insert and args modification to apps * typo * Committing the updated unit tests. At least the initial sanity checks of StaticMemory are done * Fixing an error in the static memory index ctor * Formatting python with black * Have to disable initial load with DynamicMemoryIndex, as there is no way to build a memory index with an associated tags file yet, making it impossible to load an index without tags * Working on unit tests and need to pull harsha's changes * I think I aligned this such that we can execute it via command line with the right behaviors * Providing rest of parameters build_memory_index requires * For some reason argparse is allowing a bunch of blank space to come in on arguments and they need stripped. It also needs to be using the right types. * Recall test now works * More unit tests for dynamic memory index * Adding different range check for alpha, as the values are only really that realistic between 1 and 2. Below 1 is an error, and above 2 we'll probably make a warning going forward * Storing this while I cut a new branch and walk back some work for a future branch * Undoing the auto load of the dynamic index until I can debug why my tag vector files cause an error in diskann * Updating the documentation for the python bindings. It's a lot closer than it was. * Fixing a unit test * add timers to dyanmic apps (#337) * add timers to dyanmic apps * clang format * np.uintc vs. int for dtype of tags * fixes to types in dynamic app * cast tags to np.uintc array * more timers * added example code in comments in app file * round elapsed * fix typo * fix typo --------- Co-authored-by: Harsha Vardhan Simhadri Co-authored-by: harsha vardhan simhadri * Harshasi/timer python app (#341) * added timer and QPS to static search app * search only option to static index * search only option to static index * exposing metric in static function * Force error on warnings and add casts to test directory (#342) * Force error on warnings and add casts to test directory * Use size_t for index of point IDs * Refactor iterator and conditions for printing labels --------- Co-authored-by: David Kaczynski * Enable Windows python bindings (#343) * Use int64 for counter to fix windows compilation error * Fix windows python bindings by adding install_lib command to move windows build output into python package * Update to use Path instead of os * Change batch_insert num_inserts signature to signed type for OpenMP compatibility * Update num_inserts to int32_t per PR request --------- Co-authored-by: Nick Caurvina * Use new macro(ENABLE_CUSTOM_LOGGER) to turn on Custom logger (#345) * custom logger --------- Co-authored-by: Yiyong Lin * updting from std cpp 14 to cpp 17 (#352) * updting from std cpp 14 to cpp 17 * adding cmake_cxx_standard flag * CICD Refactor (#354) * Refactored the build processes. Broke things into components as much as possible. We have standalone actions for the build processes to make sure they are consistent across push or PR builds, a format-check that doesn't rely on cmake to be there to work, and centralized our randomized data generation into a single action that can be called in each section. We now are reusing as many of the steps as we can without copy/pasting, which should ensure we're not making mistakes. * Fixing the dynamic tests, the paths to the data were wrong --------- Co-authored-by: yashpatel007 * Fix the disparity between disk and memory search for Universal label (#347) * UNV Search Fix for Memory * two places to update * clang format * unify find_common_filters function * fix comments - only return size of common filters from the find_common_filters function * dummy comments * clang format * Reduce repetitive calls * changing name and return type of function * Remove compute_groundtruth from labels.yml (#363) Co-authored-by: Yiyong Lin * Handle some corner cases in generate_cache_list_from_sample_queries (#361) Co-authored-by: Yiyong Lin * Reduce the size of coord_scratch in SSDQueryScratch to reduce memory usage (#362) * Remove useless coord_scratch in SSDQueryScratch to reduce memory usage --------- Co-authored-by: Yiyong Lin * Upload data and binary files to artifact in CI workflows (#366) * Upload data and binary files to artifact so that we could debug issue locally when the workflows fails * use different artifact name for different scenarios --------- Co-authored-by: Yiyong Lin * Python Type Enhancements (#364) * Adding cosine distance - I didn't know we had that as a first level distance metric * Making our mkl and iomp linking game more rigorously defined for the ubuntus * Included latest as a path fragment twice on accident * libmkl_def.so is named something different when installed via the intel oneapi installer * Making a number of changes to homogenize our api (same parameters, minimize parameters as much as possible, etc) * Stashing this and going to work on the CICD stuff, it's driving me nuts * Fairly happy with the Python API now. Documentation needs another pass, the @overloads in the .pyi files need to be addressed, and documentation checked again. The apps folder also needs updating to use fire instead of argparse * Updated build to not use tcmalloc for pybind, as well as fixed the pyproject.toml so that cibuildwheel can actually successfully build our project. * Making a change to in-mem-static for the new api and also adjusting the comment in in-mem-dynamic a bit, though... I probably shouldn't have * Add unit test project based on boost_unit_test_framework (#365) * Add unit test project based on boost_unit_test_framework * Add another dockerfile for developers * update path --------- Co-authored-by: Yiyong Lin * Fix inefficiency in constructing reverse label map (#373) * single loop for reverse label map * clang formatting * unnecessary comments removed * minor --------- Co-authored-by: Varun Sivashankar * fixed a bug with loading medoids for sharded filtered index, and adde… (#368) * fixed a bug with loading medoids for sharded filtered index, and added better caching for filtered index clang-format fixed minor cout error addressed Yiyong's comments, and fixed a bug for finding medoid in sharded+filtered index Fixed windows compile error (warnings) Fix inefficiency in constructing reverse label map (#373) * single loop for reverse label map * clang formatting * unnecessary comments removed * minor --------- Co-authored-by: Varun Sivashankar clang-formatted * minor cleanup * clang-format --------- Co-authored-by: ravishankar * patelyash/index factory (#340) * gi# This is a combination of 2 commits. remove _u, _s typedefs * added some seed files * add seed files * New distance metric hierarchy * Refactoring changes * Fixing compile errors in refactored code * Fixing compile errors * DiskANN Builds with initial refactoring changes * Saving changes for Ravi * More refactoring * Refactor * Fixed most of the bugs related to _data * add seed files * gi# This is a combination of 2 commits. remove _u, _s typedefs * added some seed files * New distance metric hierarchy * Refactoring changes * Fixing compile errors in refactored code * Fixing compile errors * DiskANN Builds with initial refactoring changes * Saving changes for Ravi * More refactoring * Refactor * Fixed most of the bugs related to _data * Post merge with main * Refactored version which compiles on Windows * now compiles on linux * minor clean-up * minor bug fix * minor bug * clang format fix + build error fix * clang format fix * minor changes * added back the fast_l2 feature * added back set_start_points in index.cpp * Version for review * Incorporating Harsha's comments - 2 * move implementation of abstract data store methods to a cpp file * clang format * clang format * Added slot manager file (empty) and fixed compile errors * fixed a linux compile error * clang * debugging workflow failure * clang * more debug * more debug * debug for workflow * remove slot manager * Removed the #ifdef WINDOWS directive from class definitions * Refactoring alignment factor into distance hierarchy * Fixing cosine distance * Ensuring we call preprocess_query always * Fixed distance invocations * fixed cosine bug, clang-formatted * cleaned up and added comments * clang-formatted * more clang-format * clang-format 3 * remove deleted code in scratch.cpp * reverted clang to Microsoft * small change * Removed slot_manager from this PR * newline at EOF in_mem_Graph_store.cpp * rename distance_metric to distance_fn * resolving PR comments * minor bug fix for initialization * creating index_factory * using index factory to build inmem index * clang format fix * minor bug fix * fixing build error * replacing mem_store with abstract_mem_store + injecting data_store to Index * minor fix * clang format fix * commenting data_store injection to prevent double invocation and mem leak (for now) * fixing the build for fiters * moving abstract index to abstract_index.h * IndexBuildParamsbuilder to build IndexBuildParams properly with error checking * fixing build errors * fixing minor error * refactoring index search to be simple * clang format fix * refactoring search_mem_index to use index factory * clang fix * minor fix * minor fix for build * optimize for fast l2 restore * removing comments * removing comments * adding templating to IndexFactory (can't avoide it anymore) * fixing build error * fixing ubuntu build error * ubuntu build exception fix * passing num_pq_bytes * giving one more shot to config dricen arch with boost::any (type erasure) * clang fix * modifying search to use boost::any * fixing ubuntu build errors/warning * created indexconfigbuilder and fixed a typo * fixing error in pq build * some comments + lazy_delete impl * bumping to std c++17 & replacing boost::any with std::any * clang fix * c++ std 17 for ubuntu * minor fix * converting search to batch_search + A vector wrapper using std::any to store vector as a shared ptr * adding AnyVector to encapsulate vector in std::any + adding basic yaml parser(WIP) * adding wrapper code for vector and set, checked with Andrija * fixinh ubuntu build error * trying to resolve ubuntu build error * testing test streaming index with IndexFactory * fixing ubuntu build error * fixing search for test insert delete consolidate * refactored test_streaming_scenario * refactored test_insert_delete_consolidate to use AbstractIndex and Indexfactory * fixing ubuntu build error * making build method in abstract index consistent * some code cleanup + abstract_cpp to add implementation * remoing coments and code cleanup * build error fix * fixing -Wreorder warning * separating build structs to their header + refactor search and remove batch search * fixing ubuntu build errors * resolving segfault error from search_mem_index * fixing query_result_tag allocation * minor update * search fix * trying to fix windows latest build for dynamic index * ading temp loggin to debug windows latest build issue * removing logging for debug * fixning windows latest build error for dynamix index search * moving any wrappers to separate file + organizing code * fixing check error * updating private vsr naming convention * minor update * unravelig search methods in abstract index. Iteraton 1 * minor fix * unused vars remove * returning a unique_ptr to Abstract Index from index factory * adding implementation from abstract_index.h to abstract_index.cpp * making abstract index api to be more explicit (expriment) * some code cleanup * removing detected memory leaks (free up index) * separtaing enums for data and graph stratagy * Index ctor(config) now uses injected datastore from IndexFactory * distance in index population in new config ctor * resolving some comments from Andrija * Resolving some restructuring comments by Andrija * minor fix * fixing ubuntu build error * warning fix * simplified get() in anywrappers * making index config a unique ptr and owned by IndexFactory * removing complex if/else calling recursively + added unimplemented TagT to AbsIdx * renaming get_instance to create_instance * clang format fix * removing const_cast from any_wrapper * fixing andrija's comments * removing warnings --------- Co-authored-by: harsha vardhan simhadri Co-authored-by: Gopal Srinivasa Co-authored-by: ravishankar Co-authored-by: Harsha Vardhan Simhadri * patelyash/index factory (#340) (#380) --------- Co-authored-by: Yash Patel <47032340+yashpatel007@users.noreply.github.com> Co-authored-by: harsha vardhan simhadri Co-authored-by: Gopal Srinivasa Co-authored-by: ravishankar Co-authored-by: Harsha Vardhan Simhadri * hot fix for python build (#383) * some bug fix when enable the EXEC_EnV_OLS (#377) * some bug fix when enable the EXEC_EnV_OLS * avoid unit test failure * unit test testing * changed based on gopal's suggestion * update load_impl(AlignedFileReader &reader) * change the load_impl to be identical to objectstore * remvoe blank * Output distance file in memory index search (#382) * Output distance file * fix --------- Co-authored-by: Shengjie Qian * Add WIN macro for non-win function (#360) * Add WIN macro for non-win funtion * fix vc16 compile issue * fix compile issue * fix compile issue * fix compile issue * clean up code * small EXEC_ENV_OLS bug fix (#387) * small bug fix * test ubuntu fail * formatting * re-triggering unitest * Python Refactor (#385) * Refactor of diskannpy module code. * 0.5.0.rc1 for python and enabling the build-python portion of the pr-test process. * clang-format changes * In theory this should speed up the python build drastically by only building the wheel for the python version and OS we're attempting to fan out to in our CICD job tree * Missed a dollar sign * Copy/pasting left a CICD step name that implied we were running a code formatting check when instead we were building a wheel. This is now fixed. * In theory, readying the release action too. We won't know if it works until it merges and we cut a release, but at least the paths have been fixed * Designated initializers just happened to work on linux but shouldn't have as they weren't added until cpp20 * Formatting * Jinweizhang/filter paramsfix (#388) * small bug fix * test ubuntu fail * formatting * re-triggering unitest * cause error, remove two character params * cause error, remove two character params * unit test fix * clean up code * add more accurate error handelling * fix filter build * re-trigger test * try lower recall number * test witl more value * revert back to test unit test * Update python-release.yml Github actions fix: composite action `python-wheel` publishes wheels to the `wheels` artifact. `python-release` workflow then looks for it in the `dist` artifact, which does not exist. This is a CICD change only. * Fixed inputs type-o (#391) * Fixed inputs type-o * Action 'checkout@v2' is deprecated * Update pyproject.toml Trying a new release of the python lib to see if there was a packaging error in the publication of rc1. * Fixed param documentation (#393) * Fixed param name in comments * Hide rust/target * Bypass errors in logging for non-msft-prod environments (#392) * Removed the logger and verified that the logging capability is the root cause of our consistent segfault errors in python. Perhaps it also will fix any issues in our label test too? I'd like to push it to GH and see. * Formatting fixes * Revert "Formatting fixes" This reverts commit 9042595614c0f3b5e72f61090538abdb6510af14. * Revert "Removed the logger and verified that the logging capability is the root cause of our consistent segfault errors in python. Perhaps it also will fix any issues in our label test too? I'd like to push it to GH and see." This reverts commit 7561009932ff109ed386c4f5d50983859e49b9e7. * The custom logging implementation is causing segfaults in python. We're not sure exactly where, but this is the easiest and quickest way to getting a working python release. * All the integration tests are failing, and there's a chance the virtual dtor on AbstractDataStore might be the culprit, though I am not sure why. I'm hoping it is so it won't fall on the logging changes. * Formatting. Again. * Improve help formatting in CLI tools (#390) * Added utilities to standardize help across cli tools. #370 * Made three option groupings (required/optional/print) * Moved common parameter descriptions to a common file. #370 * Updated usage statement for search_disk_app #370 * Updated range_search_disk_index to use the new required/optional format. #370 * Updated test apps to use the new help format. #370 * Fixed format issue. #370 * Updated help format for the 'build' apps. #370 * Fixed code formatting. #370 * Added src/*.hpp to the clang format. #370 * Moved header into the headers directory. #370 * Added missing configs. #370 * Removed superflous paths from include. #370 * Added #pragma once. #370 * Type-o fixes. #370 * Fixed capitolization of constant. #370 * Make fail_if_recall description more accurate. #370 * Changed to using set notation. #370 * Better explanations for some options. #370 * Added short explanation of file format. #370 --------- Co-authored-by: Jon McLean Co-authored-by: Jonathan McLean * Python build with a far more portable wheel (#396) * Identified the appropriate build flags to get a working python build that doesn't rely on -march=native or -mtune=native. We've run benchmarks on multiple computers that indicate the only important flag other than -mavx2 -msse2 -mfma is -funroll-loops. Optimization levels such as -O1, -O2, or -O3 actually makes for less performant code. -Ofast is unavailble for use in Python, as it causes problems with floating point math in Python * 1.22 was left in a comment despite 1.25 being the value specified * Python 3.8 is not supported by numpy 1.25, so we're removing it. * Jomclean/write timings (#397) * Work-in-progress commit adding JSON output for timings. in-mem-static is complete * Added timings to dynamic and total-time to static * Update pyproject.toml (#398) Using the correct README for our publication to pypi. * Added filename to log (#399) * Jinwei/fix in memory compile error (#401) * small bug fix * test ubuntu fail * formatting * re-triggering unitest * add small fix for in_mem_data_store when EXEC_ENV_OLS is enabed * fix: use the passed in io_limit (#403) * fix: use the passed in io_limit * fix to be clang-formatted * DynamicMemoryIndex bug fixes (#404) * While simply creating a unit test to repro Issue #400, I found a number of bugs that I needed to address just to get it to work the way I had intended. This does not yet have what I would consider a comprehensive suite of test coverage for the DynamicMemoryIndex, but we at least do save it with the metadata file, we can load it correctly, and saving *always* consolidate_deletes() prior to save if any item has been marked for deletion prior to save. * We actually cannot save without compacting before save anyway. Removing the parameter from save() and hardcoding it to True until we can actually support it. * Addressing some PR comments and readying a 0.5.0.rc5 release * Pass nullptr as nullT when creating thread_data that's of ConcurrentQueue type, otherwise the default null_T is uninitialized, could point to arbitraty memory (#408) * Preparing for 0.6.0 diskannpy release (#407) * Some early staging for README updates and pyproject updates for a 0.6.0 release for diskannpy. * Trying to fix the CI badge to point toward main's latest build * Updating documentation for pdoc generation * Documentation updates. Tightened up the API to drop list support (there were entirely too many cases where it wouldn't work, and it's easier to just tell people to convert it themselves) * Some module reorganization to make pdoc actually display the docstrings for variables re-exported at the top level * A copy paste happened that shouldn't have. * Updating the apps to use the new 0.6.0 api * Addressing PR feedback * Some of the documentation changes didn't get made in both from_file or the constructor * Fix compile issue * fix some issue * fix universal label * fix label file path * add unv label filepath in separate path function * fix empty path issue --------- Co-authored-by: jinwei14 Co-authored-by: Yash Patel <47032340+yashpatel007@users.noreply.github.com> Co-authored-by: patelyash Co-authored-by: Varun Sivashankar Co-authored-by: David Kaczynski Co-authored-by: ravishankar Co-authored-by: David Kaczynski Co-authored-by: Siddharth Gollapudi Co-authored-by: Neelam Mahapatro Co-authored-by: Harsha Vardhan Simhadri Co-authored-by: Harsha Vardhan Simhadri Co-authored-by: Dax Pryce Co-authored-by: Jakub Tarnawski Co-authored-by: Yiyong Lin Co-authored-by: Yiyong Lin Co-authored-by: Andrija Antonijevic Co-authored-by: Neelam Mahapatro <37527155+NeelamMahapatro@users.noreply.github.com> Co-authored-by: harsha vardhan simhadri Co-authored-by: gopalrs <33950290+gopalrs@users.noreply.github.com> Co-authored-by: Gopal Srinivasa Co-authored-by: yashpatel007 Co-authored-by: nicaurvi Co-authored-by: Nick Caurvina Co-authored-by: Varun Sivashankar <44419819+varunsivashankar@users.noreply.github.com> Co-authored-by: rakri <78582691+rakri@users.noreply.github.com> Co-authored-by: varat73 <124637813+varat73@users.noreply.github.com> Co-authored-by: JieCin <1875919175@qq.com> Co-authored-by: Shengjie Qian Co-authored-by: Jon McLean <4429525+jonmclean@users.noreply.github.com> Co-authored-by: Jon McLean Co-authored-by: Jonathan McLean Co-authored-by: litan1 <106347144+ltan1ms@users.noreply.github.com> --- .github/actions/build/action.yml | 28 + .github/actions/format-check/action.yml | 13 + .github/actions/generate-random/action.yml | 35 + .github/actions/python-wheel/action.yml | 22 + .github/workflows/build-python.yml | 42 + .github/workflows/common.yml | 28 + .github/workflows/disk-pq.yml | 107 + .github/workflows/dynamic.yml | 75 + .github/workflows/in-mem-no-pq.yml | 81 + .github/workflows/in-mem-pq.yml | 56 + .github/workflows/labels.yml | 106 + .github/workflows/pr-test.yml | 279 +-- .github/workflows/push-test.yml | 76 +- .github/workflows/python-release.yml | 37 +- .github/workflows/unit-tests.yml | 32 + .gitignore | 7 + CMakeLists.txt | 110 +- Dockerfile | 24 +- DockerfileDev | 17 + MANIFEST.in | 1 - README.md | 28 +- apps/CMakeLists.txt | 42 + apps/build_disk_index.cpp | 189 ++ apps/build_memory_index.cpp | 206 ++ apps/build_stitched_index.cpp | 439 ++++ {tests => apps}/python/README.md | 0 {tests => apps}/python/requirements.txt | 0 {tests => apps}/python/restapi/__init__.py | 0 .../python/restapi/disk_ann_util.py | 4 +- .../python/restapi/test_ssd_rest_api.py | 2 +- {tests => apps}/range_search_disk_index.cpp | 107 +- {tests => apps}/restapi/CMakeLists.txt | 2 +- {tests => apps}/restapi/client.cpp | 0 {tests => apps}/restapi/inmem_server.cpp | 0 {tests => apps}/restapi/main.cpp | 0 .../restapi/multiple_ssdindex_server.cpp | 0 {tests => apps}/restapi/ssd_server.cpp | 0 {tests => apps}/search_disk_index.cpp | 189 +- {tests => apps}/search_memory_index.cpp | 255 ++- .../test_insert_deletes_consolidate.cpp | 203 +- {tests => apps}/test_streaming_scenario.cpp | 209 +- {tests => apps}/utils/CMakeLists.txt | 41 +- {tests => apps}/utils/bin_to_fvecs.cpp | 25 +- {tests => apps}/utils/bin_to_tsv.cpp | 23 +- {tests => apps}/utils/calculate_recall.cpp | 11 +- {tests => apps}/utils/compute_groundtruth.cpp | 367 ++-- .../utils/compute_groundtruth_for_filters.cpp | 924 +++++++++ {tests => apps}/utils/count_bfs_levels.cpp | 6 +- {tests => apps}/utils/create_disk_layout.cpp | 0 {tests => apps}/utils/float_bin_to_int8.cpp | 32 +- {tests => apps}/utils/fvecs_to_bin.cpp | 56 +- {tests => apps}/utils/fvecs_to_bvecs.cpp | 30 +- {tests => apps}/utils/gen_random_slice.cpp | 0 {tests => apps}/utils/generate_pq.cpp | 14 +- .../utils/generate_synthetic_labels.cpp | 57 +- {tests => apps}/utils/int8_to_float.cpp | 0 {tests => apps}/utils/int8_to_float_scale.cpp | 32 +- {tests => apps}/utils/ivecs_to_bin.cpp | 41 +- {tests => apps}/utils/merge_shards.cpp | 10 +- {tests => apps}/utils/partition_data.cpp | 2 +- .../utils/partition_with_ram_budget.cpp | 2 +- {tests => apps}/utils/rand_data_gen.cpp | 65 +- .../utils/simulate_aggregate_recall.cpp | 24 +- {tests => apps}/utils/stats_label_data.cpp | 30 +- {tests => apps}/utils/tsv_to_bin.cpp | 40 +- {tests => apps}/utils/uint32_to_uint8.cpp | 0 {tests => apps}/utils/uint8_to_float.cpp | 0 {tests => apps}/utils/vector_analysis.cpp | 42 +- clang-format.cmake | 2 +- include/abstract_data_store.h | 115 ++ include/abstract_graph_store.h | 31 + include/abstract_index.h | 118 ++ include/ann_exception.h | 4 +- include/any_wrappers.h | 53 + include/cached_io.h | 4 +- include/common_includes.h | 1 + include/concurrent_queue.h | 4 +- include/defaults.h | 24 + include/disk_utils.h | 25 +- include/distance.h | 127 +- include/filter_utils.h | 217 ++ include/in_mem_data_store.h | 82 + include/in_mem_graph_store.h | 23 + include/index.h | 200 +- include/index_build_params.h | 72 + include/index_config.h | 224 ++ include/index_factory.h | 37 + include/logger.h | 13 +- include/logger_impl.h | 38 +- include/natural_number_map.h | 8 +- include/parameters.h | 145 +- include/pq.h | 49 +- include/pq_flash_index.h | 117 +- include/program_options_utils.hpp | 79 + include/scratch.h | 35 +- include/timer.h | 2 +- include/types.h | 21 + include/utils.h | 298 ++- pyproject.toml | 47 +- python/CMakeLists.txt | 24 +- python/README.md | 55 + python/apps/cli/__main__.py | 152 ++ python/apps/cluster.py | 28 + python/apps/in-mem-dynamic.py | 161 ++ python/apps/in-mem-static.py | 149 ++ python/apps/insert-in-clustered-order.py | 103 + python/apps/requirements.txt | 2 + python/apps/utils.py | 120 ++ python/include/builder.h | 26 + python/include/common.h | 24 + python/include/dynamic_memory_index.h | 53 + python/include/static_disk_index.h | 52 + python/include/static_memory_index.h | 34 + python/src/__init__.py | 138 ++ python/src/_builder.py | 280 +++ python/src/_builder.pyi | 74 + python/src/_common.py | 249 +++ python/src/_dynamic_memory_index.py | 509 +++++ python/src/_files.py | 111 + python/src/_static_disk_index.py | 197 ++ python/src/_static_memory_index.py | 187 ++ python/src/builder.cpp | 82 + python/src/defaults.py | 71 + python/src/diskann_bindings.cpp | 548 ----- python/src/dynamic_memory_index.cpp | 171 ++ python/src/module.cpp | 134 ++ python/src/py.typed | 0 python/src/static_disk_index.cpp | 108 + python/src/static_memory_index.cpp | 77 + python/tests/fixtures/__init__.py | 6 + python/tests/fixtures/build_memory_index.py | 51 + python/tests/fixtures/create_test_data.py | 40 + python/tests/fixtures/recall.py | 24 + python/tests/test_build_disk_index.py | 26 - python/tests/test_builder.py | 137 ++ python/tests/test_dynamic_memory_index.py | 440 ++++ python/tests/test_search_disk_index.py | 105 - python/tests/test_search_disk_index_numpy.py | 62 - python/tests/test_static_disk_index.py | 146 ++ python/tests/test_static_memory_index.py | 162 ++ rust/Cargo.lock | 1814 +++++++++++++++++ rust/Cargo.toml | 23 + .../Cargo.toml | 14 + .../src/main.rs | 420 ++++ .../build_and_insert_memory_index/Cargo.toml | 14 + .../build_and_insert_memory_index/src/main.rs | 382 ++++ rust/cmd_drivers/build_disk_index/Cargo.toml | 14 + rust/cmd_drivers/build_disk_index/src/main.rs | 377 ++++ .../cmd_drivers/build_memory_index/Cargo.toml | 15 + .../build_memory_index/src/args.rs | 62 + .../build_memory_index/src/main.rs | 174 ++ .../convert_f32_to_bf16/Cargo.toml | 11 + .../convert_f32_to_bf16/src/main.rs | 154 ++ .../load_and_insert_memory_index/Cargo.toml | 14 + .../load_and_insert_memory_index/src/main.rs | 313 +++ .../search_memory_index/Cargo.toml | 16 + .../search_memory_index/src/main.rs | 430 ++++ .../src/search_index_utils.rs | 186 ++ rust/diskann/Cargo.toml | 45 + rust/diskann/benches/distance_bench.rs | 47 + rust/diskann/benches/kmeans_bench.rs | 70 + rust/diskann/benches/neighbor_bench.rs | 49 + rust/diskann/src/algorithm/mod.rs | 7 + rust/diskann/src/algorithm/prune/mod.rs | 6 + rust/diskann/src/algorithm/prune/prune.rs | 288 +++ rust/diskann/src/algorithm/search/mod.rs | 7 + rust/diskann/src/algorithm/search/search.rs | 359 ++++ rust/diskann/src/common/aligned_allocator.rs | 281 +++ rust/diskann/src/common/ann_result.rs | 179 ++ rust/diskann/src/common/mod.rs | 9 + .../src/index/disk_index/ann_disk_index.rs | 54 + .../src/index/disk_index/disk_index.rs | 161 ++ rust/diskann/src/index/disk_index/mod.rs | 9 + .../src/index/inmem_index/ann_inmem_index.rs | 97 + .../src/index/inmem_index/inmem_index.rs | 1033 ++++++++++ .../index/inmem_index/inmem_index_storage.rs | 304 +++ rust/diskann/src/index/inmem_index/mod.rs | 12 + rust/diskann/src/index/mod.rs | 11 + .../disk_index_build_logger.rs | 57 + .../src/instrumentation/index_logger.rs | 47 + rust/diskann/src/instrumentation/mod.rs | 9 + rust/diskann/src/lib.rs | 26 + .../disk_index_build_parameter.rs | 85 + .../configuration/index_configuration.rs | 92 + .../configuration/index_write_parameters.rs | 245 +++ rust/diskann/src/model/configuration/mod.rs | 12 + .../model/data_store/disk_scratch_dataset.rs | 76 + .../src/model/data_store/inmem_dataset.rs | 285 +++ rust/diskann/src/model/data_store/mod.rs | 11 + .../diskann/src/model/graph/adjacency_list.rs | 64 + rust/diskann/src/model/graph/disk_graph.rs | 179 ++ rust/diskann/src/model/graph/inmem_graph.rs | 141 ++ rust/diskann/src/model/graph/mod.rs | 20 + rust/diskann/src/model/graph/sector_graph.rs | 87 + .../src/model/graph/vertex_and_neighbors.rs | 159 ++ rust/diskann/src/model/mod.rs | 29 + rust/diskann/src/model/neighbor/mod.rs | 13 + rust/diskann/src/model/neighbor/neighbor.rs | 104 + .../model/neighbor/neighbor_priority_queue.rs | 241 +++ .../model/neighbor/sorted_neighbor_vector.rs | 37 + .../src/model/pq/fixed_chunk_pq_table.rs | 483 +++++ rust/diskann/src/model/pq/mod.rs | 9 + rust/diskann/src/model/pq/pq_construction.rs | 398 ++++ .../src/model/scratch/concurrent_queue.rs | 312 +++ .../src/model/scratch/inmem_query_scratch.rs | 186 ++ rust/diskann/src/model/scratch/mod.rs | 28 + rust/diskann/src/model/scratch/pq_scratch.rs | 105 + .../model/scratch/scratch_store_manager.rs | 84 + .../src/model/scratch/scratch_traits.rs | 8 + .../src/model/scratch/ssd_io_context.rs | 38 + .../src/model/scratch/ssd_query_scratch.rs | 132 ++ .../src/model/scratch/ssd_thread_data.rs | 92 + rust/diskann/src/model/vertex/dimension.rs | 22 + rust/diskann/src/model/vertex/mod.rs | 10 + rust/diskann/src/model/vertex/vertex.rs | 68 + .../model/windows_aligned_file_reader/mod.rs | 7 + .../windows_aligned_file_reader.rs | 414 ++++ .../diskann/src/storage/disk_graph_storage.rs | 37 + .../diskann/src/storage/disk_index_storage.rs | 363 ++++ rust/diskann/src/storage/mod.rs | 12 + rust/diskann/src/storage/pq_storage.rs | 367 ++++ .../test_utils/inmem_index_initialization.rs | 74 + rust/diskann/src/test_utils/mod.rs | 11 + rust/diskann/src/utils/bit_vec_extension.rs | 45 + rust/diskann/src/utils/cached_reader.rs | 160 ++ rust/diskann/src/utils/cached_writer.rs | 142 ++ rust/diskann/src/utils/file_util.rs | 377 ++++ rust/diskann/src/utils/hashset_u32.rs | 46 + rust/diskann/src/utils/kmeans.rs | 430 ++++ rust/diskann/src/utils/math_util.rs | 481 +++++ rust/diskann/src/utils/mod.rs | 34 + rust/diskann/src/utils/partition.rs | 151 ++ rust/diskann/src/utils/rayon_util.rs | 33 + rust/diskann/src/utils/timer.rs | 101 + rust/diskann/src/utils/utils.rs | 154 ++ rust/diskann/tests/data/delete_set_50pts.bin | Bin 0 -> 1024 bytes ...k_index_node_data_aligned_reader_truth.bin | Bin 0 -> 30696 bytes ...pts_R4_L50_A1.2_alligned_reader_test.index | Bin 0 -> 155648 bytes ...tsmall_learn_256pts_R4_L50_A1.2_disk.index | Bin 0 -> 155648 bytes ...ftsmall_learn_256pts_R4_L50_A1.2_mem.index | Bin 0 -> 5144 bytes rust/diskann/tests/data/siftsmall_learn.bin | Bin 0 -> 12800008 bytes .../siftsmall_learn.bin_pq_compressed.bin | Bin 0 -> 25008 bytes .../data/siftsmall_learn.bin_pq_pivots.bin | Bin 0 -> 135712 bytes .../tests/data/siftsmall_learn_256pts.fbin | Bin 0 -> 131080 bytes .../tests/data/siftsmall_learn_256pts_2.fbin | Bin 0 -> 131080 bytes ...tsmall_learn_256pts_R4_L50_A1.2_disk.index | Bin 0 -> 155648 bytes ...dex_siftsmall_learn_256pts_1+2_R4_L50_A1.2 | Bin 0 -> 10236 bytes ...all_learn_256pts_1+2_saturated_R4_L50_A1.2 | Bin 0 -> 10264 bytes ...h_index_siftsmall_learn_256pts_R4_L50_A1.2 | Bin 0 -> 5108 bytes ...ex_siftsmall_learn_256pts_R4_L50_A1.2.data | Bin 0 -> 131080 bytes rust/logger/Cargo.toml | 29 + rust/logger/build.rs | 33 + rust/logger/src/error_logger.rs | 29 + rust/logger/src/examples/trace_example.rs | 30 + rust/logger/src/indexlog.proto | 50 + rust/logger/src/lib.rs | 19 + rust/logger/src/log_error.rs | 27 + rust/logger/src/message_handler.rs | 167 ++ rust/logger/src/trace_logger.rs | 41 + rust/platform/Cargo.toml | 13 + rust/platform/src/file_handle.rs | 212 ++ rust/platform/src/file_io.rs | 154 ++ rust/platform/src/io_completion_port.rs | 142 ++ rust/platform/src/lib.rs | 20 + rust/platform/src/perf.rs | 50 + rust/project.code-workspace | 58 + rust/readme.md | 25 + rust/rust-toolchain.toml | 4 + rust/vector/Cargo.toml | 24 + rust/vector/build.rs | 29 + rust/vector/distance.c | 35 + rust/vector/src/distance.rs | 442 ++++ rust/vector/src/distance_test.rs | 152 ++ rust/vector/src/half.rs | 82 + rust/vector/src/l2_float_distance.rs | 78 + rust/vector/src/lib.rs | 26 + rust/vector/src/metric.rs | 36 + rust/vector/src/test_util.rs | 29 + rust/vector/src/utils.rs | 21 + rust/vector_base64/Cargo.toml | 15 + rust/vector_base64/src/main.rs | 82 + scripts/dev/install-dev-deps-ubuntu.bash | 12 + setup.py | 46 +- src/CMakeLists.txt | 14 +- src/abstract_data_store.cpp | 46 + src/abstract_index.cpp | 280 +++ src/ann_exception.cpp | 4 +- src/disk_utils.cpp | 453 ++-- src/distance.cpp | 142 +- src/dll/CMakeLists.txt | 8 +- src/filter_utils.cpp | 284 +++ src/in_mem_data_store.cpp | 370 ++++ src/in_mem_graph_store.cpp | 31 + src/index.cpp | 1340 +++++++----- src/index_factory.cpp | 150 ++ src/logger.cpp | 16 +- src/math_utils.cpp | 18 +- src/natural_number_map.cpp | 8 +- src/partition.cpp | 81 +- src/pq.cpp | 295 +-- src/pq_flash_index.cpp | 510 +++-- src/restapi/search_wrapper.cpp | 2 +- src/scratch.cpp | 27 +- src/utils.cpp | 71 +- src/windows_aligned_file_reader.cpp | 44 +- tests/CMakeLists.txt | 46 +- tests/README.md | 11 + tests/build_disk_index.cpp | 181 -- tests/build_memory_index.cpp | 202 -- tests/build_stitched_index.cpp | 800 -------- .../index_write_parameters_builder_tests.cpp | 63 + tests/main.cpp | 6 + windows/packages.config.in | 1 + workflows/SSD_index.md | 16 +- workflows/dynamic_index.md | 30 +- workflows/filtered_in_memory.md | 34 +- workflows/filtered_ssd_index.md | 28 +- workflows/in_memory_index.md | 16 +- workflows/rest_api.md | 4 +- 319 files changed, 30059 insertions(+), 4937 deletions(-) create mode 100644 .github/actions/build/action.yml create mode 100644 .github/actions/format-check/action.yml create mode 100644 .github/actions/generate-random/action.yml create mode 100644 .github/actions/python-wheel/action.yml create mode 100644 .github/workflows/build-python.yml create mode 100644 .github/workflows/common.yml create mode 100644 .github/workflows/disk-pq.yml create mode 100644 .github/workflows/dynamic.yml create mode 100644 .github/workflows/in-mem-no-pq.yml create mode 100644 .github/workflows/in-mem-pq.yml create mode 100644 .github/workflows/labels.yml create mode 100644 .github/workflows/unit-tests.yml create mode 100644 DockerfileDev create mode 100644 apps/CMakeLists.txt create mode 100644 apps/build_disk_index.cpp create mode 100644 apps/build_memory_index.cpp create mode 100644 apps/build_stitched_index.cpp rename {tests => apps}/python/README.md (100%) rename {tests => apps}/python/requirements.txt (100%) rename {tests => apps}/python/restapi/__init__.py (100%) rename {tests => apps}/python/restapi/disk_ann_util.py (93%) rename {tests => apps}/python/restapi/test_ssd_rest_api.py (98%) rename {tests => apps}/range_search_disk_index.cpp (72%) rename {tests => apps}/restapi/CMakeLists.txt (98%) rename {tests => apps}/restapi/client.cpp (100%) rename {tests => apps}/restapi/inmem_server.cpp (100%) rename {tests => apps}/restapi/main.cpp (100%) rename {tests => apps}/restapi/multiple_ssdindex_server.cpp (100%) rename {tests => apps}/restapi/ssd_server.cpp (100%) rename {tests => apps}/search_disk_index.cpp (66%) rename {tests => apps}/search_memory_index.cpp (52%) rename {tests => apps}/test_insert_deletes_consolidate.cpp (61%) rename {tests => apps}/test_streaming_scenario.cpp (56%) rename {tests => apps}/utils/CMakeLists.txt (69%) rename {tests => apps}/utils/bin_to_fvecs.cpp (70%) rename {tests => apps}/utils/bin_to_tsv.cpp (75%) rename {tests => apps}/utils/calculate_recall.cpp (79%) rename {tests => apps}/utils/compute_groundtruth.cpp (63%) create mode 100644 apps/utils/compute_groundtruth_for_filters.cpp rename {tests => apps}/utils/count_bfs_levels.cpp (95%) rename {tests => apps}/utils/create_disk_layout.cpp (100%) rename {tests => apps}/utils/float_bin_to_int8.cpp (63%) rename {tests => apps}/utils/fvecs_to_bin.cpp (57%) rename {tests => apps}/utils/fvecs_to_bvecs.cpp (68%) rename {tests => apps}/utils/gen_random_slice.cpp (100%) rename {tests => apps}/utils/generate_pq.cpp (77%) rename {tests => apps}/utils/generate_synthetic_labels.cpp (73%) rename {tests => apps}/utils/int8_to_float.cpp (100%) rename {tests => apps}/utils/int8_to_float_scale.cpp (63%) rename {tests => apps}/utils/ivecs_to_bin.cpp (50%) rename {tests => apps}/utils/merge_shards.cpp (83%) rename {tests => apps}/utils/partition_data.cpp (96%) rename {tests => apps}/utils/partition_with_ram_budget.cpp (96%) rename {tests => apps}/utils/rand_data_gen.cpp (74%) rename {tests => apps}/utils/simulate_aggregate_recall.cpp (72%) rename {tests => apps}/utils/stats_label_data.cpp (84%) rename {tests => apps}/utils/tsv_to_bin.cpp (75%) rename {tests => apps}/utils/uint32_to_uint8.cpp (100%) rename {tests => apps}/utils/uint8_to_float.cpp (100%) rename {tests => apps}/utils/vector_analysis.cpp (78%) create mode 100644 include/abstract_data_store.h create mode 100644 include/abstract_graph_store.h create mode 100644 include/abstract_index.h create mode 100644 include/any_wrappers.h create mode 100644 include/defaults.h create mode 100644 include/filter_utils.h create mode 100644 include/in_mem_data_store.h create mode 100644 include/in_mem_graph_store.h create mode 100644 include/index_build_params.h create mode 100644 include/index_config.h create mode 100644 include/index_factory.h create mode 100644 include/program_options_utils.hpp create mode 100644 include/types.h create mode 100644 python/README.md create mode 100644 python/apps/cli/__main__.py create mode 100644 python/apps/cluster.py create mode 100644 python/apps/in-mem-dynamic.py create mode 100644 python/apps/in-mem-static.py create mode 100644 python/apps/insert-in-clustered-order.py create mode 100644 python/apps/requirements.txt create mode 100644 python/apps/utils.py create mode 100644 python/include/builder.h create mode 100644 python/include/common.h create mode 100644 python/include/dynamic_memory_index.h create mode 100644 python/include/static_disk_index.h create mode 100644 python/include/static_memory_index.h create mode 100644 python/src/__init__.py create mode 100644 python/src/_builder.py create mode 100644 python/src/_builder.pyi create mode 100644 python/src/_common.py create mode 100644 python/src/_dynamic_memory_index.py create mode 100644 python/src/_files.py create mode 100644 python/src/_static_disk_index.py create mode 100644 python/src/_static_memory_index.py create mode 100644 python/src/builder.cpp create mode 100644 python/src/defaults.py create mode 100644 python/src/dynamic_memory_index.cpp create mode 100644 python/src/module.cpp create mode 100644 python/src/py.typed create mode 100644 python/src/static_disk_index.cpp create mode 100644 python/src/static_memory_index.cpp create mode 100644 python/tests/fixtures/__init__.py create mode 100644 python/tests/fixtures/build_memory_index.py create mode 100644 python/tests/fixtures/create_test_data.py create mode 100644 python/tests/fixtures/recall.py delete mode 100644 python/tests/test_build_disk_index.py create mode 100644 python/tests/test_builder.py create mode 100644 python/tests/test_dynamic_memory_index.py delete mode 100644 python/tests/test_search_disk_index.py delete mode 100644 python/tests/test_search_disk_index_numpy.py create mode 100644 python/tests/test_static_disk_index.py create mode 100644 python/tests/test_static_memory_index.py create mode 100644 rust/Cargo.lock create mode 100644 rust/Cargo.toml create mode 100644 rust/cmd_drivers/build_and_insert_delete_memory_index/Cargo.toml create mode 100644 rust/cmd_drivers/build_and_insert_delete_memory_index/src/main.rs create mode 100644 rust/cmd_drivers/build_and_insert_memory_index/Cargo.toml create mode 100644 rust/cmd_drivers/build_and_insert_memory_index/src/main.rs create mode 100644 rust/cmd_drivers/build_disk_index/Cargo.toml create mode 100644 rust/cmd_drivers/build_disk_index/src/main.rs create mode 100644 rust/cmd_drivers/build_memory_index/Cargo.toml create mode 100644 rust/cmd_drivers/build_memory_index/src/args.rs create mode 100644 rust/cmd_drivers/build_memory_index/src/main.rs create mode 100644 rust/cmd_drivers/convert_f32_to_bf16/Cargo.toml create mode 100644 rust/cmd_drivers/convert_f32_to_bf16/src/main.rs create mode 100644 rust/cmd_drivers/load_and_insert_memory_index/Cargo.toml create mode 100644 rust/cmd_drivers/load_and_insert_memory_index/src/main.rs create mode 100644 rust/cmd_drivers/search_memory_index/Cargo.toml create mode 100644 rust/cmd_drivers/search_memory_index/src/main.rs create mode 100644 rust/cmd_drivers/search_memory_index/src/search_index_utils.rs create mode 100644 rust/diskann/Cargo.toml create mode 100644 rust/diskann/benches/distance_bench.rs create mode 100644 rust/diskann/benches/kmeans_bench.rs create mode 100644 rust/diskann/benches/neighbor_bench.rs create mode 100644 rust/diskann/src/algorithm/mod.rs create mode 100644 rust/diskann/src/algorithm/prune/mod.rs create mode 100644 rust/diskann/src/algorithm/prune/prune.rs create mode 100644 rust/diskann/src/algorithm/search/mod.rs create mode 100644 rust/diskann/src/algorithm/search/search.rs create mode 100644 rust/diskann/src/common/aligned_allocator.rs create mode 100644 rust/diskann/src/common/ann_result.rs create mode 100644 rust/diskann/src/common/mod.rs create mode 100644 rust/diskann/src/index/disk_index/ann_disk_index.rs create mode 100644 rust/diskann/src/index/disk_index/disk_index.rs create mode 100644 rust/diskann/src/index/disk_index/mod.rs create mode 100644 rust/diskann/src/index/inmem_index/ann_inmem_index.rs create mode 100644 rust/diskann/src/index/inmem_index/inmem_index.rs create mode 100644 rust/diskann/src/index/inmem_index/inmem_index_storage.rs create mode 100644 rust/diskann/src/index/inmem_index/mod.rs create mode 100644 rust/diskann/src/index/mod.rs create mode 100644 rust/diskann/src/instrumentation/disk_index_build_logger.rs create mode 100644 rust/diskann/src/instrumentation/index_logger.rs create mode 100644 rust/diskann/src/instrumentation/mod.rs create mode 100644 rust/diskann/src/lib.rs create mode 100644 rust/diskann/src/model/configuration/disk_index_build_parameter.rs create mode 100644 rust/diskann/src/model/configuration/index_configuration.rs create mode 100644 rust/diskann/src/model/configuration/index_write_parameters.rs create mode 100644 rust/diskann/src/model/configuration/mod.rs create mode 100644 rust/diskann/src/model/data_store/disk_scratch_dataset.rs create mode 100644 rust/diskann/src/model/data_store/inmem_dataset.rs create mode 100644 rust/diskann/src/model/data_store/mod.rs create mode 100644 rust/diskann/src/model/graph/adjacency_list.rs create mode 100644 rust/diskann/src/model/graph/disk_graph.rs create mode 100644 rust/diskann/src/model/graph/inmem_graph.rs create mode 100644 rust/diskann/src/model/graph/mod.rs create mode 100644 rust/diskann/src/model/graph/sector_graph.rs create mode 100644 rust/diskann/src/model/graph/vertex_and_neighbors.rs create mode 100644 rust/diskann/src/model/mod.rs create mode 100644 rust/diskann/src/model/neighbor/mod.rs create mode 100644 rust/diskann/src/model/neighbor/neighbor.rs create mode 100644 rust/diskann/src/model/neighbor/neighbor_priority_queue.rs create mode 100644 rust/diskann/src/model/neighbor/sorted_neighbor_vector.rs create mode 100644 rust/diskann/src/model/pq/fixed_chunk_pq_table.rs create mode 100644 rust/diskann/src/model/pq/mod.rs create mode 100644 rust/diskann/src/model/pq/pq_construction.rs create mode 100644 rust/diskann/src/model/scratch/concurrent_queue.rs create mode 100644 rust/diskann/src/model/scratch/inmem_query_scratch.rs create mode 100644 rust/diskann/src/model/scratch/mod.rs create mode 100644 rust/diskann/src/model/scratch/pq_scratch.rs create mode 100644 rust/diskann/src/model/scratch/scratch_store_manager.rs create mode 100644 rust/diskann/src/model/scratch/scratch_traits.rs create mode 100644 rust/diskann/src/model/scratch/ssd_io_context.rs create mode 100644 rust/diskann/src/model/scratch/ssd_query_scratch.rs create mode 100644 rust/diskann/src/model/scratch/ssd_thread_data.rs create mode 100644 rust/diskann/src/model/vertex/dimension.rs create mode 100644 rust/diskann/src/model/vertex/mod.rs create mode 100644 rust/diskann/src/model/vertex/vertex.rs create mode 100644 rust/diskann/src/model/windows_aligned_file_reader/mod.rs create mode 100644 rust/diskann/src/model/windows_aligned_file_reader/windows_aligned_file_reader.rs create mode 100644 rust/diskann/src/storage/disk_graph_storage.rs create mode 100644 rust/diskann/src/storage/disk_index_storage.rs create mode 100644 rust/diskann/src/storage/mod.rs create mode 100644 rust/diskann/src/storage/pq_storage.rs create mode 100644 rust/diskann/src/test_utils/inmem_index_initialization.rs create mode 100644 rust/diskann/src/test_utils/mod.rs create mode 100644 rust/diskann/src/utils/bit_vec_extension.rs create mode 100644 rust/diskann/src/utils/cached_reader.rs create mode 100644 rust/diskann/src/utils/cached_writer.rs create mode 100644 rust/diskann/src/utils/file_util.rs create mode 100644 rust/diskann/src/utils/hashset_u32.rs create mode 100644 rust/diskann/src/utils/kmeans.rs create mode 100644 rust/diskann/src/utils/math_util.rs create mode 100644 rust/diskann/src/utils/mod.rs create mode 100644 rust/diskann/src/utils/partition.rs create mode 100644 rust/diskann/src/utils/rayon_util.rs create mode 100644 rust/diskann/src/utils/timer.rs create mode 100644 rust/diskann/src/utils/utils.rs create mode 100644 rust/diskann/tests/data/delete_set_50pts.bin create mode 100644 rust/diskann/tests/data/disk_index_node_data_aligned_reader_truth.bin create mode 100644 rust/diskann/tests/data/disk_index_siftsmall_learn_256pts_R4_L50_A1.2_alligned_reader_test.index create mode 100644 rust/diskann/tests/data/disk_index_siftsmall_learn_256pts_R4_L50_A1.2_disk.index create mode 100644 rust/diskann/tests/data/disk_index_siftsmall_learn_256pts_R4_L50_A1.2_mem.index create mode 100644 rust/diskann/tests/data/siftsmall_learn.bin create mode 100644 rust/diskann/tests/data/siftsmall_learn.bin_pq_compressed.bin create mode 100644 rust/diskann/tests/data/siftsmall_learn.bin_pq_pivots.bin create mode 100644 rust/diskann/tests/data/siftsmall_learn_256pts.fbin create mode 100644 rust/diskann/tests/data/siftsmall_learn_256pts_2.fbin create mode 100644 rust/diskann/tests/data/truth_disk_index_siftsmall_learn_256pts_R4_L50_A1.2_disk.index create mode 100644 rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_1+2_R4_L50_A1.2 create mode 100644 rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_1+2_saturated_R4_L50_A1.2 create mode 100644 rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_R4_L50_A1.2 create mode 100644 rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_R4_L50_A1.2.data create mode 100644 rust/logger/Cargo.toml create mode 100644 rust/logger/build.rs create mode 100644 rust/logger/src/error_logger.rs create mode 100644 rust/logger/src/examples/trace_example.rs create mode 100644 rust/logger/src/indexlog.proto create mode 100644 rust/logger/src/lib.rs create mode 100644 rust/logger/src/log_error.rs create mode 100644 rust/logger/src/message_handler.rs create mode 100644 rust/logger/src/trace_logger.rs create mode 100644 rust/platform/Cargo.toml create mode 100644 rust/platform/src/file_handle.rs create mode 100644 rust/platform/src/file_io.rs create mode 100644 rust/platform/src/io_completion_port.rs create mode 100644 rust/platform/src/lib.rs create mode 100644 rust/platform/src/perf.rs create mode 100644 rust/project.code-workspace create mode 100644 rust/readme.md create mode 100644 rust/rust-toolchain.toml create mode 100644 rust/vector/Cargo.toml create mode 100644 rust/vector/build.rs create mode 100644 rust/vector/distance.c create mode 100644 rust/vector/src/distance.rs create mode 100644 rust/vector/src/distance_test.rs create mode 100644 rust/vector/src/half.rs create mode 100644 rust/vector/src/l2_float_distance.rs create mode 100644 rust/vector/src/lib.rs create mode 100644 rust/vector/src/metric.rs create mode 100644 rust/vector/src/test_util.rs create mode 100644 rust/vector/src/utils.rs create mode 100644 rust/vector_base64/Cargo.toml create mode 100644 rust/vector_base64/src/main.rs create mode 100755 scripts/dev/install-dev-deps-ubuntu.bash create mode 100644 src/abstract_data_store.cpp create mode 100644 src/abstract_index.cpp create mode 100644 src/filter_utils.cpp create mode 100644 src/in_mem_data_store.cpp create mode 100644 src/in_mem_graph_store.cpp create mode 100644 src/index_factory.cpp create mode 100644 tests/README.md delete mode 100644 tests/build_disk_index.cpp delete mode 100644 tests/build_memory_index.cpp delete mode 100644 tests/build_stitched_index.cpp create mode 100644 tests/index_write_parameters_builder_tests.cpp create mode 100644 tests/main.cpp diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml new file mode 100644 index 000000000..2b470d9dc --- /dev/null +++ b/.github/actions/build/action.yml @@ -0,0 +1,28 @@ +name: 'DiskANN Build Bootstrap' +description: 'Prepares DiskANN build environment and executes build' +runs: + using: "composite" + steps: + # ------------ Linux Build --------------- + - name: Prepare and Execute Build + if: ${{ runner.os == 'Linux' }} + run: | + sudo scripts/dev/install-dev-deps-ubuntu.bash + cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DUNIT_TEST=True + cmake --build build -- -j + cmake --install build --prefix="dist" + shell: bash + # ------------ End Linux Build --------------- + # ------------ Windows Build --------------- + - name: Add VisualStudio command line tools into path + if: runner.os == 'Windows' + uses: ilammy/msvc-dev-cmd@v1 + - name: Run configure and build for Windows + if: runner.os == 'Windows' + run: | + mkdir build && cd build && cmake .. -DUNIT_TEST=True && msbuild diskann.sln /m /nologo /t:Build /p:Configuration="Release" /property:Platform="x64" -consoleloggerparameters:"ErrorsOnly;Summary" + cd .. + mkdir dist + mklink /j .\dist\bin .\x64\Release\ + shell: cmd + # ------------ End Windows Build --------------- \ No newline at end of file diff --git a/.github/actions/format-check/action.yml b/.github/actions/format-check/action.yml new file mode 100644 index 000000000..6ed08c095 --- /dev/null +++ b/.github/actions/format-check/action.yml @@ -0,0 +1,13 @@ +name: 'Checking code formatting...' +description: 'Ensures code complies with code formatting rules' +runs: + using: "composite" + steps: + - name: Checking code formatting... + run: | + sudo apt install clang-format + find include -name '*.h' -type f -print0 | xargs -0 -P 16 /usr/bin/clang-format --Werror --dry-run + find src -name '*.cpp' -type f -print0 | xargs -0 -P 16 /usr/bin/clang-format --Werror --dry-run + find apps -name '*.cpp' -type f -print0 | xargs -0 -P 16 /usr/bin/clang-format --Werror --dry-run + find python -name '*.cpp' -type f -print0 | xargs -0 -P 16 /usr/bin/clang-format --Werror --dry-run + shell: bash diff --git a/.github/actions/generate-random/action.yml b/.github/actions/generate-random/action.yml new file mode 100644 index 000000000..75554773e --- /dev/null +++ b/.github/actions/generate-random/action.yml @@ -0,0 +1,35 @@ +name: 'Generating Random Data (Basic)' +description: 'Generates the random data files used in acceptance tests' +runs: + using: "composite" + steps: + - name: Generate Random Data (Basic) + run: | + mkdir data + + echo "Generating random vectors for index" + dist/bin/rand_data_gen --data_type float --output_file data/rand_float_10D_10K_norm1.0.bin -D 10 -N 10000 --norm 1.0 + dist/bin/rand_data_gen --data_type int8 --output_file data/rand_int8_10D_10K_norm50.0.bin -D 10 -N 10000 --norm 50.0 + dist/bin/rand_data_gen --data_type uint8 --output_file data/rand_uint8_10D_10K_norm50.0.bin -D 10 -N 10000 --norm 50.0 + + echo "Generating random vectors for query" + dist/bin/rand_data_gen --data_type float --output_file data/rand_float_10D_1K_norm1.0.bin -D 10 -N 1000 --norm 1.0 + dist/bin/rand_data_gen --data_type int8 --output_file data/rand_int8_10D_1K_norm50.0.bin -D 10 -N 1000 --norm 50.0 + dist/bin/rand_data_gen --data_type uint8 --output_file data/rand_uint8_10D_1K_norm50.0.bin -D 10 -N 1000 --norm 50.0 + + echo "Computing ground truth for floats across l2, mips, and cosine distance functions" + dist/bin/compute_groundtruth --data_type float --dist_fn l2 --base_file data/rand_float_10D_10K_norm1.0.bin --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --K 100 + dist/bin/compute_groundtruth --data_type float --dist_fn mips --base_file data/rand_float_10D_10K_norm1.0.bin --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/mips_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --K 100 + dist/bin/compute_groundtruth --data_type float --dist_fn cosine --base_file data/rand_float_10D_10K_norm1.0.bin --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/cosine_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --K 100 + + echo "Computing ground truth for int8s across l2, mips, and cosine distance functions" + dist/bin/compute_groundtruth --data_type int8 --dist_fn l2 --base_file data/rand_int8_10D_10K_norm50.0.bin --query_file data/rand_int8_10D_1K_norm50.0.bin --gt_file data/l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 + dist/bin/compute_groundtruth --data_type int8 --dist_fn mips --base_file data/rand_int8_10D_10K_norm50.0.bin --query_file data/rand_int8_10D_1K_norm50.0.bin --gt_file data/mips_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 + dist/bin/compute_groundtruth --data_type int8 --dist_fn cosine --base_file data/rand_int8_10D_10K_norm50.0.bin --query_file data/rand_int8_10D_1K_norm50.0.bin --gt_file data/cosine_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 + + echo "Computing ground truth for uint8s across l2, mips, and cosine distance functions" + dist/bin/compute_groundtruth --data_type uint8 --dist_fn l2 --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 + dist/bin/compute_groundtruth --data_type uint8 --dist_fn mips --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/mips_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 + dist/bin/compute_groundtruth --data_type uint8 --dist_fn cosine --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/cosine_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 + + shell: bash diff --git a/.github/actions/python-wheel/action.yml b/.github/actions/python-wheel/action.yml new file mode 100644 index 000000000..6a2880c6d --- /dev/null +++ b/.github/actions/python-wheel/action.yml @@ -0,0 +1,22 @@ +name: Build Python Wheel +description: Builds a python wheel with cibuildwheel +inputs: + cibw-identifier: + description: "CI build wheel identifier to build" + required: true +runs: + using: "composite" + steps: + - uses: actions/setup-python@v3 + - name: Install cibuildwheel + run: python -m pip install cibuildwheel==2.11.3 + shell: bash + - name: Building Python ${{inputs.cibw-identifier}} Wheel + run: python -m cibuildwheel --output-dir dist + env: + CIBW_BUILD: ${{inputs.cibw-identifier}} + shell: bash + - uses: actions/upload-artifact@v3 + with: + name: wheels + path: ./dist/*.whl diff --git a/.github/workflows/build-python.yml b/.github/workflows/build-python.yml new file mode 100644 index 000000000..b825398d1 --- /dev/null +++ b/.github/workflows/build-python.yml @@ -0,0 +1,42 @@ +name: DiskANN Build Python Wheel +on: [workflow_call] +jobs: + linux-build: + name: Python - Ubuntu - ${{matrix.cibw-identifier}} + strategy: + fail-fast: false + matrix: + cibw-identifier: ["cp39-manylinux_x86_64", "cp310-manylinux_x86_64", "cp311-manylinux_x86_64"] + runs-on: ubuntu-latest + defaults: + run: + shell: bash + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Building python wheel ${{matrix.cibw-identifier}} + uses: ./.github/actions/python-wheel + with: + cibw-identifier: ${{matrix.cibw-identifier}} + windows-build: + name: Python - Windows - ${{matrix.cibw-identifier}} + strategy: + fail-fast: false + matrix: + cibw-identifier: ["cp39-win_amd64", "cp310-win_amd64", "cp311-win_amd64"] + runs-on: windows-latest + defaults: + run: + shell: bash + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + submodules: true + fetch-depth: 1 + - name: Building python wheel ${{matrix.cibw-identifier}} + uses: ./.github/actions/python-wheel + with: + cibw-identifier: ${{matrix.cibw-identifier}} diff --git a/.github/workflows/common.yml b/.github/workflows/common.yml new file mode 100644 index 000000000..09c020abe --- /dev/null +++ b/.github/workflows/common.yml @@ -0,0 +1,28 @@ +name: DiskANN Common Checks +# common means common to both pr-test and push-test +on: [workflow_call] +jobs: + formatting-check: + strategy: + fail-fast: true + name: Code Formatting Test + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Checking code formatting... + uses: ./.github/actions/format-check + docker-container-build: + name: Docker Container Build + needs: [formatting-check] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Docker build + run: | + docker build . \ No newline at end of file diff --git a/.github/workflows/disk-pq.yml b/.github/workflows/disk-pq.yml new file mode 100644 index 000000000..35c662184 --- /dev/null +++ b/.github/workflows/disk-pq.yml @@ -0,0 +1,107 @@ +name: Disk With PQ +on: [workflow_call] +jobs: + acceptance-tests-disk-pq: + name: Disk, PQ + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2019, windows-latest] + runs-on: ${{matrix.os}} + defaults: + run: + shell: bash + steps: + - name: Checkout repository + if: ${{ runner.os == 'Linux' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Checkout repository + if: ${{ runner.os == 'Windows' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + submodules: true + - name: DiskANN Build CLI Applications + uses: ./.github/actions/build + + - name: Generate Data + uses: ./.github/actions/generate-random + + - name: build and search disk index (one shot graph build, L2, no diskPQ) (float) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type float --dist_fn l2 --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_oneshot -R 16 -L 32 -B 0.00003 -M 1 + dist/bin/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_oneshot --result_path /tmp/res --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name: build and search disk index (one shot graph build, L2, no diskPQ) (int8) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type int8 --dist_fn l2 --data_path data/rand_int8_10D_10K_norm50.0.bin --index_path_prefix data/disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_oneshot -R 16 -L 32 -B 0.00003 -M 1 + dist/bin/search_disk_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_oneshot --result_path /tmp/res --query_file data/rand_int8_10D_1K_norm50.0.bin --gt_file data/l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name: build and search disk index (one shot graph build, L2, no diskPQ) (uint8) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type uint8 --dist_fn l2 --data_path data/rand_uint8_10D_10K_norm50.0.bin --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_oneshot -R 16 -L 32 -B 0.00003 -M 1 + dist/bin/search_disk_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_oneshot --result_path /tmp/res --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + + - name: build and search disk index (one shot graph build, L2, no diskPQ, build with PQ distance comparisons) (float) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type float --dist_fn l2 --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_oneshot_buildpq5 -R 16 -L 32 -B 0.00003 -M 1 --build_PQ_bytes 5 + dist/bin/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_oneshot_buildpq5 --result_path /tmp/res --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name: build and search disk index (one shot graph build, L2, no diskPQ, build with PQ distance comparisons) (int8) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type int8 --dist_fn l2 --data_path data/rand_int8_10D_10K_norm50.0.bin --index_path_prefix data/disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_oneshot_buildpq5 -R 16 -L 32 -B 0.00003 -M 1 --build_PQ_bytes 5 + dist/bin/search_disk_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_oneshot_buildpq5 --result_path /tmp/res --query_file data/rand_int8_10D_1K_norm50.0.bin --gt_file data/l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16\ + - name: build and search disk index (one shot graph build, L2, no diskPQ, build with PQ distance comparisons) (uint8) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type uint8 --dist_fn l2 --data_path data/rand_uint8_10D_10K_norm50.0.bin --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_oneshot_buildpq5 -R 16 -L 32 -B 0.00003 -M 1 --build_PQ_bytes 5 + dist/bin/search_disk_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_oneshot_buildpq5 --result_path /tmp/res --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + + - name: build and search disk index (sharded graph build, L2, no diskPQ) (float) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type float --dist_fn l2 --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_sharded -R 16 -L 32 -B 0.00003 -M 0.00006 + dist/bin/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_sharded --result_path /tmp/res --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name: build and search disk index (sharded graph build, L2, no diskPQ) (int8) + run: | + dist/bin/build_disk_index --data_type int8 --dist_fn l2 --data_path data/rand_int8_10D_10K_norm50.0.bin --index_path_prefix data/disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_sharded -R 16 -L 32 -B 0.00003 -M 0.00006 + dist/bin/search_disk_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_sharded --result_path /tmp/res --query_file data/rand_int8_10D_1K_norm50.0.bin --gt_file data/l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name: build and search disk index (sharded graph build, L2, no diskPQ) (uint8) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type uint8 --dist_fn l2 --data_path data/rand_uint8_10D_10K_norm50.0.bin --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_sharded -R 16 -L 32 -B 0.00003 -M 0.00006 + dist/bin/search_disk_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_sharded --result_path /tmp/res --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + + - name: build and search disk index (one shot graph build, L2, diskPQ) (float) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type float --dist_fn l2 --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/disk_index_l2_rand_float_10D_10K_norm1.0_diskpq_oneshot -R 16 -L 32 -B 0.00003 -M 1 --PQ_disk_bytes 5 + dist/bin/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_float_10D_10K_norm1.0_diskpq_oneshot --result_path /tmp/res --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name: build and search disk index (one shot graph build, L2, diskPQ) (int8) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type int8 --dist_fn l2 --data_path data/rand_int8_10D_10K_norm50.0.bin --index_path_prefix data/disk_index_l2_rand_int8_10D_10K_norm50.0_diskpq_oneshot -R 16 -L 32 -B 0.00003 -M 1 --PQ_disk_bytes 5 + dist/bin/search_disk_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_int8_10D_10K_norm50.0_diskpq_oneshot --result_path /tmp/res --query_file data/rand_int8_10D_1K_norm50.0.bin --gt_file data/l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name: build and search disk index (one shot graph build, L2, diskPQ) (uint8) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type uint8 --dist_fn l2 --data_path data/rand_uint8_10D_10K_norm50.0.bin --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50.0_diskpq_oneshot -R 16 -L 32 -B 0.00003 -M 1 --PQ_disk_bytes 5 + dist/bin/search_disk_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50.0_diskpq_oneshot --result_path /tmp/res --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + + - name: build and search disk index (sharded graph build, MIPS, diskPQ) (float) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type float --dist_fn mips --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/disk_index_mips_rand_float_10D_10K_norm1.0_diskpq_sharded -R 16 -L 32 -B 0.00003 -M 0.00006 --PQ_disk_bytes 5 + dist/bin/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/disk_index_mips_rand_float_10D_10K_norm1.0_diskpq_sharded --result_path /tmp/res --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/mips_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + + - name: upload data and bin + uses: actions/upload-artifact@v3 + with: + name: disk-pq + path: | + ./dist/** + ./data/** diff --git a/.github/workflows/dynamic.yml b/.github/workflows/dynamic.yml new file mode 100644 index 000000000..35eb6d42d --- /dev/null +++ b/.github/workflows/dynamic.yml @@ -0,0 +1,75 @@ +name: Dynamic +on: [workflow_call] +jobs: + acceptance-tests-dynamic: + name: Dynamic + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2019, windows-latest] + runs-on: ${{matrix.os}} + defaults: + run: + shell: bash + steps: + - name: Checkout repository + if: ${{ runner.os == 'Linux' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Checkout repository + if: ${{ runner.os == 'Windows' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + submodules: true + - name: DiskANN Build CLI Applications + uses: ./.github/actions/build + + - name: Generate Data + uses: ./.github/actions/generate-random + + - name: test a streaming index (float) + run: | + dist/bin/test_streaming_scenario --data_type float --dist_fn l2 --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/index_stream -R 64 -L 600 --alpha 1.2 --insert_threads 4 --consolidate_threads 4 --max_points_to_insert 10000 --active_window 4000 --consolidate_interval 2000 --start_point_norm 3.2 + dist/bin/compute_groundtruth --data_type float --dist_fn l2 --base_file data/index_stream.after-streaming-act4000-cons2000-max10000.data --query_file data/rand_float_10D_1K_norm1.0.bin --K 100 --gt_file data/gt100_base-act4000-cons2000-max10000 --tags_file data/index_stream.after-streaming-act4000-cons2000-max10000.tags + dist/bin/search_memory_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_stream.after-streaming-act4000-cons2000-max10000 --result_path data/res_stream --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/gt100_base-act4000-cons2000-max10000 -K 10 -L 20 40 60 80 100 -T 64 --dynamic true --tags 1 + - name: test a streaming index (int8) + if: success() || failure() + run: | + dist/bin/test_streaming_scenario --data_type int8 --dist_fn l2 --data_path data/rand_int8_10D_10K_norm50.0.bin --index_path_prefix data/index_stream -R 64 -L 600 --alpha 1.2 --insert_threads 4 --consolidate_threads 4 --max_points_to_insert 10000 --active_window 4000 --consolidate_interval 2000 --start_point_norm 200 + dist/bin/compute_groundtruth --data_type int8 --dist_fn l2 --base_file data/index_stream.after-streaming-act4000-cons2000-max10000.data --query_file data/rand_int8_10D_1K_norm50.0.bin --K 100 --gt_file data/gt100_base-act4000-cons2000-max10000 --tags_file data/index_stream.after-streaming-act4000-cons2000-max10000.tags + dist/bin/search_memory_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_stream.after-streaming-act4000-cons2000-max10000 --result_path res_stream --query_file data/rand_int8_10D_1K_norm50.0.bin --gt_file data/gt100_base-act4000-cons2000-max10000 -K 10 -L 20 40 60 80 100 -T 64 --dynamic true --tags 1 + - name: test a streaming index + if: success() || failure() + run: | + dist/bin/test_streaming_scenario --data_type uint8 --dist_fn l2 --data_path data/rand_uint8_10D_10K_norm50.0.bin --index_path_prefix data/index_stream -R 64 -L 600 --alpha 1.2 --insert_threads 4 --consolidate_threads 4 --max_points_to_insert 10000 --active_window 4000 --consolidate_interval 2000 --start_point_norm 200 + dist/bin/compute_groundtruth --data_type uint8 --dist_fn l2 --base_file data/index_stream.after-streaming-act4000-cons2000-max10000.data --query_file data/rand_uint8_10D_1K_norm50.0.bin --K 100 --gt_file data/gt100_base-act4000-cons2000-max10000 --tags_file data/index_stream.after-streaming-act4000-cons2000-max10000.tags + dist/bin/search_memory_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_stream.after-streaming-act4000-cons2000-max10000 --result_path data/res_stream --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/gt100_base-act4000-cons2000-max10000 -K 10 -L 20 40 60 80 100 -T 64 --dynamic true --tags 1 + + - name: build and search an incremental index (float) + if: success() || failure() + run: | + dist/bin/test_insert_deletes_consolidate --data_type float --dist_fn l2 --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/index_ins_del -R 64 -L 300 --alpha 1.2 -T 8 --points_to_skip 0 --max_points_to_insert 7500 --beginning_index_size 0 --points_per_checkpoint 1000 --checkpoints_per_snapshot 0 --points_to_delete_from_beginning 2500 --start_deletes_after 5000 --do_concurrent true --start_point_norm 3.2; + dist/bin/compute_groundtruth --data_type float --dist_fn l2 --base_file data/index_ins_del.after-concurrent-delete-del2500-7500.data --query_file data/rand_float_10D_1K_norm1.0.bin --K 100 --gt_file data/gt100_random10D_1K-conc-2500-7500 --tags_file data/index_ins_del.after-concurrent-delete-del2500-7500.tags + dist/bin/search_memory_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_ins_del.after-concurrent-delete-del2500-7500 --result_path data/res_ins_del --query_file data/rand_float_10D_1K_norm1.0.bin --gt_file data/gt100_random10D_1K-conc-2500-7500 -K 10 -L 20 40 60 80 100 -T 8 --dynamic true --tags 1 + - name: build and search an incremental index (int8) + if: success() || failure() + run: | + dist/bin/test_insert_deletes_consolidate --data_type int8 --dist_fn l2 --data_path data/rand_int8_10D_10K_norm50.0.bin --index_path_prefix data/index_ins_del -R 64 -L 300 --alpha 1.2 -T 8 --points_to_skip 0 --max_points_to_insert 7500 --beginning_index_size 0 --points_per_checkpoint 1000 --checkpoints_per_snapshot 0 --points_to_delete_from_beginning 2500 --start_deletes_after 5000 --do_concurrent true --start_point_norm 200 + dist/bin/compute_groundtruth --data_type int8 --dist_fn l2 --base_file data/index_ins_del.after-concurrent-delete-del2500-7500.data --query_file data/rand_int8_10D_1K_norm50.0.bin --K 100 --gt_file data/gt100_random10D_1K-conc-2500-7500 --tags_file data/index_ins_del.after-concurrent-delete-del2500-7500.tags + dist/bin/search_memory_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_ins_del.after-concurrent-delete-del2500-7500 --result_path data/res_ins_del --query_file data/rand_int8_10D_1K_norm50.0.bin --gt_file data/gt100_random10D_1K-conc-2500-7500 -K 10 -L 20 40 60 80 100 -T 8 --dynamic true --tags 1 + - name: build and search an incremental index (uint8) + if: success() || failure() + run: | + dist/bin/test_insert_deletes_consolidate --data_type uint8 --dist_fn l2 --data_path data/rand_uint8_10D_10K_norm50.0.bin --index_path_prefix data/index_ins_del -R 64 -L 300 --alpha 1.2 -T 8 --points_to_skip 0 --max_points_to_insert 7500 --beginning_index_size 0 --points_per_checkpoint 1000 --checkpoints_per_snapshot 0 --points_to_delete_from_beginning 2500 --start_deletes_after 5000 --do_concurrent true --start_point_norm 200 + dist/bin/compute_groundtruth --data_type uint8 --dist_fn l2 --base_file data/index_ins_del.after-concurrent-delete-del2500-7500.data --query_file data/rand_uint8_10D_1K_norm50.0.bin --K 100 --gt_file data/gt100_random10D_10K-conc-2500-7500 --tags_file data/index_ins_del.after-concurrent-delete-del2500-7500.tags + dist/bin/search_memory_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_ins_del.after-concurrent-delete-del2500-7500 --result_path data/res_ins_del --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/gt100_random10D_10K-conc-2500-7500 -K 10 -L 20 40 60 80 100 -T 8 --dynamic true --tags 1 + + - name: upload data and bin + uses: actions/upload-artifact@v3 + with: + name: dynamic + path: | + ./dist/** + ./data/** diff --git a/.github/workflows/in-mem-no-pq.yml b/.github/workflows/in-mem-no-pq.yml new file mode 100644 index 000000000..0039754d2 --- /dev/null +++ b/.github/workflows/in-mem-no-pq.yml @@ -0,0 +1,81 @@ +name: In-Memory Without PQ +on: [workflow_call] +jobs: + acceptance-tests-mem-no-pq: + name: In-Mem, Without PQ + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2019, windows-latest] + runs-on: ${{matrix.os}} + defaults: + run: + shell: bash + steps: + - name: Checkout repository + if: ${{ runner.os == 'Linux' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Checkout repository + if: ${{ runner.os == 'Windows' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + submodules: true + - name: DiskANN Build CLI Applications + uses: ./.github/actions/build + + - name: Generate Data + uses: ./.github/actions/generate-random + + - name: build and search in-memory index with L2 metrics (float) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type float --dist_fn l2 --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/index_l2_rand_float_10D_10K_norm1.0 + dist/bin/search_memory_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_float_10D_10K_norm1.0 --query_file data/rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file data/l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 + - name: build and search in-memory index with L2 metrics (int8) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type int8 --dist_fn l2 --data_path data/rand_int8_10D_10K_norm50.0.bin --index_path_prefix data/index_l2_rand_int8_10D_10K_norm50.0 + dist/bin/search_memory_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_int8_10D_10K_norm50.0 --query_file data/rand_int8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 + - name: build and search in-memory index with L2 metrics (uint8) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type uint8 --dist_fn l2 --data_path data/rand_uint8_10D_10K_norm50.0.bin --index_path_prefix data/index_l2_rand_uint8_10D_10K_norm50.0 + dist/bin/search_memory_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_uint8_10D_10K_norm50.0 --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 + + - name: Searching with fast_l2 distance function (float) + if: runner.os != 'Windows' && (success() || failure()) + run: | + dist/bin/search_memory_index --data_type float --dist_fn fast_l2 --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_float_10D_10K_norm1.0 --query_file data/rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file data/l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 + + - name: build and search in-memory index with MIPS metric (float) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type float --dist_fn mips --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/index_mips_rand_float_10D_10K_norm1.0 + dist/bin/search_memory_index --data_type float --dist_fn mips --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_float_10D_10K_norm1.0 --query_file data/rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file data/mips_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 + + - name: build and search in-memory index with cosine metric (float) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type float --dist_fn cosine --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/index_cosine_rand_float_10D_10K_norm1.0 + dist/bin/search_memory_index --data_type float --dist_fn cosine --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_float_10D_10K_norm1.0 --query_file data/rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file data/cosine_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 + - name: build and search in-memory index with cosine metric (int8) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type int8 --dist_fn cosine --data_path data/rand_int8_10D_10K_norm50.0.bin --index_path_prefix data/index_cosine_rand_int8_10D_10K_norm50.0 + dist/bin/search_memory_index --data_type int8 --dist_fn cosine --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_int8_10D_10K_norm50.0 --query_file data/rand_int8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/cosine_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 + - name: build and search in-memory index with cosine metric + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type uint8 --dist_fn cosine --data_path data/rand_uint8_10D_10K_norm50.0.bin --index_path_prefix data/index_cosine_rand_uint8_10D_10K_norm50.0 + dist/bin/search_memory_index --data_type uint8 --dist_fn cosine --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_uint8_10D_10K_norm50.0 --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/cosine_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 + + - name: upload data and bin + uses: actions/upload-artifact@v3 + with: + name: in-memory-no-pq + path: | + ./dist/** + ./data/** diff --git a/.github/workflows/in-mem-pq.yml b/.github/workflows/in-mem-pq.yml new file mode 100644 index 000000000..f9276adfc --- /dev/null +++ b/.github/workflows/in-mem-pq.yml @@ -0,0 +1,56 @@ +name: In-Memory With PQ +on: [workflow_call] +jobs: + acceptance-tests-mem-pq: + name: In-Mem, PQ + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2019, windows-latest] + runs-on: ${{matrix.os}} + defaults: + run: + shell: bash + steps: + - name: Checkout repository + if: ${{ runner.os == 'Linux' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Checkout repository + if: ${{ runner.os == 'Windows' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + submodules: true + - name: DiskANN Build CLI Applications + uses: ./.github/actions/build + + - name: Generate Data + uses: ./.github/actions/generate-random + + - name: build and search in-memory index with L2 metric with PQ based distance comparisons (float) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type float --dist_fn l2 --data_path data/rand_float_10D_10K_norm1.0.bin --index_path_prefix data/index_l2_rand_float_10D_10K_norm1.0_buildpq5 --build_PQ_bytes 5 + dist/bin/search_memory_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_float_10D_10K_norm1.0_buildpq5 --query_file data/rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file data/l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 + + - name: build and search in-memory index with L2 metrics with PQ base distance comparisons (int8) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type int8 --dist_fn l2 --data_path data/rand_int8_10D_10K_norm50.0.bin --index_path_prefix data/index_l2_rand_int8_10D_10K_norm50.0_buildpq5 --build_PQ_bytes 5 + dist/bin/search_memory_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_int8_10D_10K_norm50.0_buildpq5 --query_file data/rand_int8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 + + - name: build and search in-memory index with L2 metrics with PQ base distance comparisons (uint8) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type uint8 --dist_fn l2 --data_path data/rand_uint8_10D_10K_norm50.0.bin --index_path_prefix data/index_l2_rand_uint8_10D_10K_norm50.0_buildpq5 --build_PQ_bytes 5 + dist/bin/search_memory_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_uint8_10D_10K_norm50.0_buildpq5 --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 + + - name: upload data and bin + uses: actions/upload-artifact@v3 + with: + name: in-memory-pq + path: | + ./dist/** + ./data/** \ No newline at end of file diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml new file mode 100644 index 000000000..e811c1ff5 --- /dev/null +++ b/.github/workflows/labels.yml @@ -0,0 +1,106 @@ +name: Labels +on: [workflow_call] +jobs: + acceptance-tests-labels: + name: Labels + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2019, windows-latest] + runs-on: ${{matrix.os}} + defaults: + run: + shell: bash + steps: + - name: Checkout repository + if: ${{ runner.os == 'Linux' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Checkout repository + if: ${{ runner.os == 'Windows' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + submodules: true + - name: DiskANN Build CLI Applications + uses: ./.github/actions/build + + - name: Generate Data + uses: ./.github/actions/generate-random + + - name: Generate Labels + run: | + echo "Generating synthetic labels and computing ground truth for filtered search with universal label" + dist/bin/generate_synthetic_labels --num_labels 50 --num_points 10000 --output_file data/rand_labels_50_10K.txt --distribution_type random + dist/bin/compute_groundtruth_for_filters --data_type uint8 --dist_fn l2 --universal_label 0 --filter_label 10 --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --label_file data/rand_labels_50_10K.txt --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --K 100 + dist/bin/compute_groundtruth_for_filters --data_type uint8 --dist_fn mips --universal_label 0 --filter_label 10 --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --label_file data/rand_labels_50_10K.txt --gt_file data/mips_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --K 100 + dist/bin/compute_groundtruth_for_filters --data_type uint8 --dist_fn cosine --universal_label 0 --filter_label 10 --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --label_file data/rand_labels_50_10K.txt --gt_file data/cosine_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --K 100 + + echo "Generating synthetic labels with a zipf distribution and computing ground truth for filtered search with universal label" + dist/bin/generate_synthetic_labels --num_labels 50 --num_points 10000 --output_file data/zipf_labels_50_10K.txt --distribution_type zipf + dist/bin/compute_groundtruth_for_filters --data_type uint8 --dist_fn l2 --universal_label 0 --filter_label 5 --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --gt_file data/l2_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --K 100 + dist/bin/compute_groundtruth_for_filters --data_type uint8 --dist_fn mips --universal_label 0 --filter_label 5 --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --gt_file data/mips_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --K 100 + dist/bin/compute_groundtruth_for_filters --data_type uint8 --dist_fn cosine --universal_label 0 --filter_label 5 --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --gt_file data/cosine_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --K 100 + + echo "Generating synthetic labels and computing ground truth for filtered search without a universal label" + dist/bin/compute_groundtruth_for_filters --data_type uint8 --dist_fn l2 --filter_label 5 --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --gt_file data/l2_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel_nouniversal --K 100 + dist/bin/generate_synthetic_labels --num_labels 10 --num_points 1000 --output_file data/query_labels_1K.txt --distribution_type one_per_point + dist/bin/compute_groundtruth_for_filters --data_type uint8 --dist_fn l2 --universal_label 0 --filter_label_file data/query_labels_1K.txt --base_file data/rand_uint8_10D_10K_norm50.0.bin --query_file data/rand_uint8_10D_1K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --gt_file data/combined_l2_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --K 100 + + - name: build and search in-memory index with labels using L2 and Cosine metrics (random distributed labels) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type uint8 --dist_fn l2 --FilteredLbuild 90 --universal_label 0 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/rand_labels_50_10K.txt --index_path_prefix data/index_l2_rand_uint8_10D_10K_norm50_wlabel + dist/bin/build_memory_index --data_type uint8 --dist_fn cosine --FilteredLbuild 90 --universal_label 0 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/rand_labels_50_10K.txt --index_path_prefix data/index_cosine_rand_uint8_10D_10K_norm50_wlabel + dist/bin/search_memory_index --data_type uint8 --dist_fn l2 --filter_label 10 --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_uint8_10D_10K_norm50_wlabel --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -L 16 32 + dist/bin/search_memory_index --data_type uint8 --dist_fn cosine --filter_label 10 --fail_if_recall_below 70 --index_path_prefix data/index_cosine_rand_uint8_10D_10K_norm50_wlabel --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/cosine_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -L 16 32 + - name: build and search disk index with labels using L2 and Cosine metrics (random distributed labels) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type uint8 --dist_fn l2 --universal_label 0 --FilteredLbuild 90 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/rand_labels_50_10K.txt --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50_wlabel -R 16 -L 32 -B 0.00003 -M 1 + dist/bin/search_disk_index --data_type uint8 --dist_fn l2 --filter_label 10 --fail_if_recall_below 50 --index_path_prefix data/disk_index_l2_rand_uint8_10D_10K_norm50_wlabel --result_path /tmp/res --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name: build and search in-memory index with labels using L2 and Cosine metrics (zipf distributed labels) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type uint8 --dist_fn l2 --FilteredLbuild 90 --universal_label 0 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --index_path_prefix data/index_l2_zipf_uint8_10D_10K_norm50_wlabel + dist/bin/build_memory_index --data_type uint8 --dist_fn cosine --FilteredLbuild 90 --universal_label 0 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --index_path_prefix data/index_cosine_zipf_uint8_10D_10K_norm50_wlabel + dist/bin/search_memory_index --data_type uint8 --dist_fn l2 --filter_label 5 --fail_if_recall_below 70 --index_path_prefix data/index_l2_zipf_uint8_10D_10K_norm50_wlabel --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/l2_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -L 16 32 + dist/bin/search_memory_index --data_type uint8 --dist_fn cosine --filter_label 5 --fail_if_recall_below 70 --index_path_prefix data/index_cosine_zipf_uint8_10D_10K_norm50_wlabel --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/cosine_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -L 16 32 + - name: build and search disk index with labels using L2 and Cosine metrics (zipf distributed labels) + if: success() || failure() + run: | + dist/bin/build_disk_index --data_type uint8 --dist_fn l2 --universal_label 0 --FilteredLbuild 90 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --index_path_prefix data/disk_index_l2_zipf_uint8_10D_10K_norm50_wlabel -R 16 -L 32 -B 0.00003 -M 1 + dist/bin/search_disk_index --data_type uint8 --dist_fn l2 --filter_label 5 --fail_if_recall_below 50 --index_path_prefix data/disk_index_l2_zipf_uint8_10D_10K_norm50_wlabel --result_path /tmp/res --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/l2_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name : build and search in-memory and disk index (without universal label, zipf distributed) + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type uint8 --dist_fn l2 --FilteredLbuild 90 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --index_path_prefix data/index_l2_zipf_uint8_10D_10K_norm50_wlabel_nouniversal + dist/bin/build_disk_index --data_type uint8 --dist_fn l2 --FilteredLbuild 90 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --index_path_prefix data/disk_index_l2_zipf_uint8_10D_10K_norm50_wlabel_nouniversal -R 16 -L 32 -B 0.00003 -M 1 + dist/bin/search_memory_index --data_type uint8 --dist_fn l2 --filter_label 5 --fail_if_recall_below 70 --index_path_prefix data/index_l2_zipf_uint8_10D_10K_norm50_wlabel_nouniversal --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/l2_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel_nouniversal -L 16 32 + dist/bin/search_disk_index --data_type uint8 --dist_fn l2 --filter_label 5 --index_path_prefix data/disk_index_l2_zipf_uint8_10D_10K_norm50_wlabel_nouniversal --result_path /tmp/res --query_file data/rand_uint8_10D_1K_norm50.0.bin --gt_file data/l2_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel_nouniversal --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 + - name: Generate combined GT for each query with a separate label and search + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type uint8 --dist_fn l2 --FilteredLbuild 90 --universal_label 0 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt --index_path_prefix data/index_l2_zipf_uint8_10D_10K_norm50_wlabel + dist/bin/search_memory_index --data_type uint8 --dist_fn l2 --query_filters_file data/query_labels_1K.txt --fail_if_recall_below 70 --index_path_prefix data/index_l2_zipf_uint8_10D_10K_norm50_wlabel --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/combined_l2_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -L 16 32 + - name: build and search in-memory index with pq_dist of 5 with 10 dimensions + if: success() || failure() + run: | + dist/bin/build_memory_index --data_type uint8 --dist_fn l2 --FilteredLbuild 90 --universal_label 0 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/rand_labels_50_10K.txt --index_path_prefix data/index_l2_rand_uint8_10D_10K_norm50_wlabel --build_PQ_bytes 5 + dist/bin/search_memory_index --data_type uint8 --dist_fn l2 --filter_label 10 --fail_if_recall_below 70 --index_path_prefix data/index_l2_rand_uint8_10D_10K_norm50_wlabel --query_file data/rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -L 16 32 + - name: Build and search stitched vamana with random and zipf distributed labels + if: success() || failure() + run: | + dist/bin/build_stitched_index --num_threads 48 --data_type uint8 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/rand_labels_50_10K.txt -R 32 -L 100 --alpha 1.2 --stitched_R 64 --index_path_prefix data/stit_rand_32_100_64_new --universal_label 0 + dist/bin/build_stitched_index --num_threads 48 --data_type uint8 --data_path data/rand_uint8_10D_10K_norm50.0.bin --label_file data/zipf_labels_50_10K.txt -R 32 -L 100 --alpha 1.2 --stitched_R 64 --index_path_prefix data/stit_zipf_32_100_64_new --universal_label 0 + dist/bin/search_memory_index --num_threads 48 --data_type uint8 --dist_fn l2 --filter_label 10 --index_path_prefix data/stit_rand_32_100_64_new --query_file data/rand_uint8_10D_1K_norm50.0.bin --result_path data/rand_stit_96_10_90_new --gt_file data/l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -K 10 -L 16 32 150 + dist/bin/search_memory_index --num_threads 48 --data_type uint8 --dist_fn l2 --filter_label 5 --index_path_prefix data/stit_zipf_32_100_64_new --query_file data/rand_uint8_10D_1K_norm50.0.bin --result_path data/zipf_stit_96_10_90_new --gt_file data/l2_zipf_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -K 10 -L 16 32 150 + + - name: upload data and bin + uses: actions/upload-artifact@v3 + with: + name: labels + path: | + ./dist/** + ./data/** diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 46495dbf6..38eefb3ff 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -1,258 +1,29 @@ name: DiskANN Pull Request Build and Test on: [pull_request] jobs: - build-and-run: - name: Build and run tests for ${{ matrix.os }} - runs-on: ${{ matrix.os }} - + common: strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, windows-2019, windows-latest] - - # Use bash for Windows as well. - defaults: - run: - shell: bash - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - with: - submodules: true - - name: Install dependencies - if: runner.os != 'Windows' - run: | - sudo apt install cmake g++ libaio-dev libgoogle-perftools-dev libunwind-dev clang-format libboost-dev libboost-program-options-dev libmkl-full-dev - - name: Ubuntu CMake Configure - if: runner.os != 'Windows' - run: | - mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. - - - name: Clang Format Check - if: ${{ matrix.os == 'ubuntu-latest' }} - run: | - cd build && make checkformat - - - name: build - if: runner.os != 'Windows' - run: | - cd build && make -j - - - name: Add VisualStudio command line tools into path - if: runner.os == 'Windows' - uses: ilammy/msvc-dev-cmd@v1 - - - name: Run configure and build for Windows - if: runner.os == 'Windows' - run: | - mkdir build && cd build && cmake .. && msbuild diskann.sln /m /nologo /t:Build /p:Configuration="Release" /property:Platform="x64" -consoleloggerparameters:"ErrorsOnly;Summary" - shell: cmd - - - name: Set environment variables for running the tests on ${{ runner.os }} - if: runner.os != 'Windows' - run: | - echo "diskann_built_tests=./build/tests" >> $GITHUB_ENV - echo "diskann_built_utils=./build/tests/utils" >> $GITHUB_ENV - - - name: Set environment variables for running the tests on ${{ runner.os }} - if: runner.os == 'Windows' - run: | - echo "diskann_built_tests=./x64/Release" >> $GITHUB_ENV - echo "diskann_built_utils=./x64/Release" >> $GITHUB_ENV - - - name: Generate 10K random float32 index vectors, 1K query vectors, in 10 dims and compute GT - run: | - ${{ env.diskann_built_utils }}/rand_data_gen --data_type float --output_file ./rand_float_10D_10K_norm1.0.bin -D 10 -N 10000 --norm 1.0 - ${{ env.diskann_built_utils }}/rand_data_gen --data_type float --output_file ./rand_float_10D_1K_norm1.0.bin -D 10 -N 1000 --norm 1.0 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type float --dist_fn l2 --base_file ./rand_float_10D_10K_norm1.0.bin --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file ./l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --K 100 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type float --dist_fn mips --base_file ./rand_float_10D_10K_norm1.0.bin --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file ./mips_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --K 100 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type float --dist_fn cosine --base_file ./rand_float_10D_10K_norm1.0.bin --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file ./cosine_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --K 100 - - name: build and search in-memory index with L2 metrics - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type float --dist_fn l2 --data_path ./rand_float_10D_10K_norm1.0.bin --index_path_prefix ./index_l2_rand_float_10D_10K_norm1.0 - ${{ env.diskann_built_tests }}/search_memory_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_float_10D_10K_norm1.0 --query_file ./rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file ./l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 - - name: Searching with fast_l2 distance function - if: runner.os != 'Windows' - run: | - ${{ env.diskann_built_tests }}/search_memory_index --data_type float --dist_fn fast_l2 --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_float_10D_10K_norm1.0 --query_file ./rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file ./l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 - - name: build and search in-memory index with MIPS metric - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type float --dist_fn mips --data_path ./rand_float_10D_10K_norm1.0.bin --index_path_prefix ./index_mips_rand_float_10D_10K_norm1.0 - ${{ env.diskann_built_tests }}/search_memory_index --data_type float --dist_fn mips --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_float_10D_10K_norm1.0 --query_file ./rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file ./mips_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 - - name: build and search in-memory index with cosine metric - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type float --dist_fn cosine --data_path ./rand_float_10D_10K_norm1.0.bin --index_path_prefix ./index_cosine_rand_float_10D_10K_norm1.0 - ${{ env.diskann_built_tests }}/search_memory_index --data_type float --dist_fn cosine --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_float_10D_10K_norm1.0 --query_file ./rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file ./cosine_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 - - name: build and search in-memory index with L2 metric with PQ based distance comparisons - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type float --dist_fn l2 --data_path ./rand_float_10D_10K_norm1.0.bin --index_path_prefix ./index_l2_rand_float_10D_10K_norm1.0_buildpq5 --build_PQ_bytes 5 - ${{ env.diskann_built_tests }}/search_memory_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_float_10D_10K_norm1.0_buildpq5 --query_file ./rand_float_10D_1K_norm1.0.bin --recall_at 10 --result_path temp --gt_file ./l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 -L 16 32 - - name: build and search disk index (one shot graph build, L2, no diskPQ) - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type float --dist_fn l2 --data_path ./rand_float_10D_10K_norm1.0.bin --index_path_prefix ./disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_oneshot -R 16 -L 32 -B 0.00003 -M 1 - ${{ env.diskann_built_tests }}/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_oneshot --result_path /tmp/res --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file ./l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (one shot graph build, L2, no diskPQ, build with PQ distance comparisons) - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type float --dist_fn l2 --data_path ./rand_float_10D_10K_norm1.0.bin --index_path_prefix ./disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_oneshot_buildpq5 -R 16 -L 32 -B 0.00003 -M 1 --build_PQ_bytes 5 - ${{ env.diskann_built_tests }}/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_oneshot_buildpq5 --result_path /tmp/res --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file ./l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (sharded graph build, L2, no diskPQ) - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type float --dist_fn l2 --data_path ./rand_float_10D_10K_norm1.0.bin --index_path_prefix ./disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_sharded -R 16 -L 32 -B 0.00003 -M 0.00006 - ${{ env.diskann_built_tests }}/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_float_10D_10K_norm1.0_diskfull_sharded --result_path /tmp/res --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file ./l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (one shot graph build, L2, diskPQ) - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type float --dist_fn l2 --data_path ./rand_float_10D_10K_norm1.0.bin --index_path_prefix ./disk_index_l2_rand_float_10D_10K_norm1.0_diskpq_oneshot -R 16 -L 32 -B 0.00003 -M 1 --PQ_disk_bytes 5 - ${{ env.diskann_built_tests }}/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_float_10D_10K_norm1.0_diskpq_oneshot --result_path /tmp/res --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file ./l2_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (sharded graph build, MIPS, diskPQ) - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type float --dist_fn mips --data_path ./rand_float_10D_10K_norm1.0.bin --index_path_prefix ./disk_index_mips_rand_float_10D_10K_norm1.0_diskpq_sharded -R 16 -L 32 -B 0.00003 -M 0.00006 --PQ_disk_bytes 5 - ${{ env.diskann_built_tests }}/search_disk_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_mips_rand_float_10D_10K_norm1.0_diskpq_sharded --result_path /tmp/res --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file ./mips_rand_float_10D_10K_norm1.0_10D_1K_norm1.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search an incremental index - run: | - ${{ env.diskann_built_tests }}/test_insert_deletes_consolidate --data_type float --dist_fn l2 --data_path rand_float_10D_10K_norm1.0.bin --index_path_prefix index_ins_del -R 64 -L 300 --alpha 1.2 -T 8 --points_to_skip 0 --max_points_to_insert 7500 --beginning_index_size 0 --points_per_checkpoint 1000 --checkpoints_per_snapshot 0 --points_to_delete_from_beginning 2500 --start_deletes_after 5000 --do_concurrent true --start_point_norm 3.2; - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type float --dist_fn l2 --base_file index_ins_del.after-concurrent-delete-del2500-7500.data --query_file rand_float_10D_1K_norm1.0.bin --K 100 --gt_file gt100_random10D_1K-conc-2500-7500 --tags_file index_ins_del.after-concurrent-delete-del2500-7500.tags - ${{ env.diskann_built_tests }}/search_memory_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix index_ins_del.after-concurrent-delete-del2500-7500 --result_path res_ins_del --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file gt100_random10D_1K-conc-2500-7500 -K 10 -L 20 40 60 80 100 -T 8 --dynamic true --tags 1 - - name: test a streaming index - run: | - ${{ env.diskann_built_tests }}/test_streaming_scenario --data_type float --dist_fn l2 --data_path rand_float_10D_10K_norm1.0.bin --index_path_prefix index_stream -R 64 -L 600 --alpha 1.2 --insert_threads 4 --consolidate_threads 4 --max_points_to_insert 10000 --active_window 4000 --consolidate_interval 2000 --start_point_norm 3.2 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type float --dist_fn l2 --base_file index_stream.after-streaming-act4000-cons2000-max10000.data --query_file rand_float_10D_1K_norm1.0.bin --K 100 --gt_file gt100_base-act4000-cons2000-max10000 --tags_file index_stream.after-streaming-act4000-cons2000-max10000.tags - ${{ env.diskann_built_tests }}/search_memory_index --data_type float --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix index_stream.after-streaming-act4000-cons2000-max10000 --result_path res_stream --query_file ./rand_float_10D_1K_norm1.0.bin --gt_file gt100_base-act4000-cons2000-max10000 -K 10 -L 20 40 60 80 100 -T 64 --dynamic true --tags 1 - - - - name: Generate 10K random int8 index vectors, 1K query vectors, in 10 dims and compute GT - run: | - ${{ env.diskann_built_utils }}/rand_data_gen --data_type int8 --output_file ./rand_int8_10D_10K_norm50.0.bin -D 10 -N 10000 --norm 50.0 - ${{ env.diskann_built_utils }}/rand_data_gen --data_type int8 --output_file ./rand_int8_10D_1K_norm50.0.bin -D 10 -N 1000 --norm 50.0 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type int8 --dist_fn l2 --base_file ./rand_int8_10D_10K_norm50.0.bin --query_file ./rand_int8_10D_1K_norm50.0.bin --gt_file ./l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type int8 --dist_fn mips --base_file ./rand_int8_10D_10K_norm50.0.bin --query_file ./rand_int8_10D_1K_norm50.0.bin --gt_file ./mips_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type int8 --dist_fn cosine --base_file ./rand_int8_10D_10K_norm50.0.bin --query_file ./rand_int8_10D_1K_norm50.0.bin --gt_file ./cosine_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 - - name: build and search in-memory index with L2 metrics - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type int8 --dist_fn l2 --data_path ./rand_int8_10D_10K_norm50.0.bin --index_path_prefix ./index_l2_rand_int8_10D_10K_norm50.0 - ${{ env.diskann_built_tests }}/search_memory_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_int8_10D_10K_norm50.0 --query_file ./rand_int8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file ./l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 - - name: build and search in-memory index with cosine metric - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type int8 --dist_fn cosine --data_path ./rand_int8_10D_10K_norm50.0.bin --index_path_prefix ./index_cosine_rand_int8_10D_10K_norm50.0 - ${{ env.diskann_built_tests }}/search_memory_index --data_type int8 --dist_fn cosine --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_int8_10D_10K_norm50.0 --query_file ./rand_int8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file ./cosine_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 - - name: build and search in-memory index with L2 metrics with PQ base distance comparisons - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type int8 --dist_fn l2 --data_path ./rand_int8_10D_10K_norm50.0.bin --index_path_prefix ./index_l2_rand_int8_10D_10K_norm50.0_buildpq5 --build_PQ_bytes 5 - ${{ env.diskann_built_tests }}/search_memory_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_int8_10D_10K_norm50.0_buildpq5 --query_file ./rand_int8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file ./l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 - - name: build and search disk index (one shot graph build, L2, no diskPQ) - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type int8 --dist_fn l2 --data_path ./rand_int8_10D_10K_norm50.0.bin --index_path_prefix ./disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_oneshot -R 16 -L 32 -B 0.00003 -M 1 - ${{ env.diskann_built_tests }}/search_disk_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_oneshot --result_path /tmp/res --query_file ./rand_int8_10D_1K_norm50.0.bin --gt_file ./l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (one shot graph build, L2, no diskPQ, build with PQ distance comparisons) - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type int8 --dist_fn l2 --data_path ./rand_int8_10D_10K_norm50.0.bin --index_path_prefix ./disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_oneshot_buildpq5 -R 16 -L 32 -B 0.00003 -M 1 --build_PQ_bytes 5 - ${{ env.diskann_built_tests }}/search_disk_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_oneshot_buildpq5 --result_path /tmp/res --query_file ./rand_int8_10D_1K_norm50.0.bin --gt_file ./l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (sharded graph build, L2, no diskPQ) - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type int8 --dist_fn l2 --data_path ./rand_int8_10D_10K_norm50.0.bin --index_path_prefix ./disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_sharded -R 16 -L 32 -B 0.00003 -M 0.00006 - ${{ env.diskann_built_tests }}/search_disk_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_int8_10D_10K_norm50.0_diskfull_sharded --result_path /tmp/res --query_file ./rand_int8_10D_1K_norm50.0.bin --gt_file ./l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (one shot graph build, L2, diskPQ) - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type int8 --dist_fn l2 --data_path ./rand_int8_10D_10K_norm50.0.bin --index_path_prefix ./disk_index_l2_rand_int8_10D_10K_norm50.0_diskpq_oneshot -R 16 -L 32 -B 0.00003 -M 1 --PQ_disk_bytes 5 - ${{ env.diskann_built_tests }}/search_disk_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_int8_10D_10K_norm50.0_diskpq_oneshot --result_path /tmp/res --query_file ./rand_int8_10D_1K_norm50.0.bin --gt_file ./l2_rand_int8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search an incremental index - run: | - ${{ env.diskann_built_tests }}/test_insert_deletes_consolidate --data_type int8 --dist_fn l2 --data_path rand_int8_10D_10K_norm50.0.bin --index_path_prefix index_ins_del -R 64 -L 300 --alpha 1.2 -T 8 --points_to_skip 0 --max_points_to_insert 7500 --beginning_index_size 0 --points_per_checkpoint 1000 --checkpoints_per_snapshot 0 --points_to_delete_from_beginning 2500 --start_deletes_after 5000 --do_concurrent true --start_point_norm 200 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type int8 --dist_fn l2 --base_file index_ins_del.after-concurrent-delete-del2500-7500.data --query_file rand_int8_10D_1K_norm50.0.bin --K 100 --gt_file gt100_random10D_1K-conc-2500-7500 --tags_file index_ins_del.after-concurrent-delete-del2500-7500.tags - ${{ env.diskann_built_tests }}/search_memory_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix index_ins_del.after-concurrent-delete-del2500-7500 --result_path res_ins_del --query_file ./rand_int8_10D_1K_norm50.0.bin --gt_file gt100_random10D_1K-conc-2500-7500 -K 10 -L 20 40 60 80 100 -T 8 --dynamic true --tags 1 - - name: test a streaming index - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/test_streaming_scenario --data_type int8 --dist_fn l2 --data_path rand_int8_10D_10K_norm50.0.bin --index_path_prefix index_stream -R 64 -L 600 --alpha 1.2 --insert_threads 4 --consolidate_threads 4 --max_points_to_insert 10000 --active_window 4000 --consolidate_interval 2000 --start_point_norm 200 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type int8 --dist_fn l2 --base_file index_stream.after-streaming-act4000-cons2000-max10000.data --query_file rand_int8_10D_1K_norm50.0.bin --K 100 --gt_file gt100_base-act4000-cons2000-max10000 --tags_file index_stream.after-streaming-act4000-cons2000-max10000.tags - ${{ env.diskann_built_tests }}/search_memory_index --data_type int8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix index_stream.after-streaming-act4000-cons2000-max10000 --result_path res_stream --query_file ./rand_int8_10D_1K_norm50.0.bin --gt_file gt100_base-act4000-cons2000-max10000 -K 10 -L 20 40 60 80 100 -T 64 --dynamic true --tags 1 - - - - name: Generate 10K random uint8 index vectors, 1K query vectors, in 10 dims and compute GT - if: success() || failure() - run: | - ${{ env.diskann_built_utils }}/rand_data_gen --data_type uint8 --output_file ./rand_uint8_10D_10K_norm50.0.bin -D 10 -N 10000 --norm 50.0 - ${{ env.diskann_built_utils }}/rand_data_gen --data_type uint8 --output_file ./rand_uint8_10D_1K_norm50.0.bin -D 10 -N 1000 --norm 50.0 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type uint8 --dist_fn l2 --base_file ./rand_uint8_10D_10K_norm50.0.bin --query_file ./rand_uint8_10D_1K_norm50.0.bin --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type uint8 --dist_fn mips --base_file ./rand_uint8_10D_10K_norm50.0.bin --query_file ./rand_uint8_10D_1K_norm50.0.bin --gt_file ./mips_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type uint8 --dist_fn cosine --base_file ./rand_uint8_10D_10K_norm50.0.bin --query_file ./rand_uint8_10D_1K_norm50.0.bin --gt_file ./cosine_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --K 100 - - name: build and search in-memory index with L2 metrics - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type uint8 --dist_fn l2 --data_path ./rand_uint8_10D_10K_norm50.0.bin --index_path_prefix ./index_l2_rand_uint8_10D_10K_norm50.0 - ${{ env.diskann_built_tests }}/search_memory_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_uint8_10D_10K_norm50.0 --query_file ./rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 - - name: build and search in-memory index with cosine metric - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type uint8 --dist_fn cosine --data_path ./rand_uint8_10D_10K_norm50.0.bin --index_path_prefix ./index_cosine_rand_uint8_10D_10K_norm50.0 - ${{ env.diskann_built_tests }}/search_memory_index --data_type uint8 --dist_fn cosine --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_uint8_10D_10K_norm50.0 --query_file ./rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file ./cosine_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 - - name: build and search in-memory index with L2 metrics with PQ base distance comparisons - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type uint8 --dist_fn l2 --data_path ./rand_uint8_10D_10K_norm50.0.bin --index_path_prefix ./index_l2_rand_uint8_10D_10K_norm50.0_buildpq5 --build_PQ_bytes 5 - ${{ env.diskann_built_tests }}/search_memory_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_uint8_10D_10K_norm50.0_buildpq5 --query_file ./rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 -L 16 32 - - name: build and search disk index (one shot graph build, L2, no diskPQ) - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type uint8 --dist_fn l2 --data_path ./rand_uint8_10D_10K_norm50.0.bin --index_path_prefix ./disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_oneshot -R 16 -L 32 -B 0.00003 -M 1 - ${{ env.diskann_built_tests }}/search_disk_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_oneshot --result_path /tmp/res --query_file ./rand_uint8_10D_1K_norm50.0.bin --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (one shot graph build, L2, no diskPQ, build with PQ distance comparisons) - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type uint8 --dist_fn l2 --data_path ./rand_uint8_10D_10K_norm50.0.bin --index_path_prefix ./disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_oneshot_buildpq5 -R 16 -L 32 -B 0.00003 -M 1 --build_PQ_bytes 5 - ${{ env.diskann_built_tests }}/search_disk_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_oneshot_buildpq5 --result_path /tmp/res --query_file ./rand_uint8_10D_1K_norm50.0.bin --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (sharded graph build, L2, no diskPQ) - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type uint8 --dist_fn l2 --data_path ./rand_uint8_10D_10K_norm50.0.bin --index_path_prefix ./disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_sharded -R 16 -L 32 -B 0.00003 -M 0.00006 - ${{ env.diskann_built_tests }}/search_disk_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_uint8_10D_10K_norm50.0_diskfull_sharded --result_path /tmp/res --query_file ./rand_uint8_10D_1K_norm50.0.bin --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search disk index (one shot graph build, L2, diskPQ) - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_disk_index --data_type uint8 --dist_fn l2 --data_path ./rand_uint8_10D_10K_norm50.0.bin --index_path_prefix ./disk_index_l2_rand_uint8_10D_10K_norm50.0_diskpq_oneshot -R 16 -L 32 -B 0.00003 -M 1 --PQ_disk_bytes 5 - ${{ env.diskann_built_tests }}/search_disk_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix ./disk_index_l2_rand_uint8_10D_10K_norm50.0_diskpq_oneshot --result_path /tmp/res --query_file ./rand_uint8_10D_1K_norm50.0.bin --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100 --recall_at 5 -L 5 12 -W 2 --num_nodes_to_cache 10 -T 16 - - name: build and search an incremental index - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/test_insert_deletes_consolidate --data_type uint8 --dist_fn l2 --data_path rand_uint8_10D_10K_norm50.0.bin --index_path_prefix index_ins_del -R 64 -L 300 --alpha 1.2 -T 8 --points_to_skip 0 --max_points_to_insert 7500 --beginning_index_size 0 --points_per_checkpoint 1000 --checkpoints_per_snapshot 0 --points_to_delete_from_beginning 2500 --start_deletes_after 5000 --do_concurrent true --start_point_norm 200; - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type uint8 --dist_fn l2 --base_file index_ins_del.after-concurrent-delete-del2500-7500.data --query_file rand_uint8_10D_1K_norm50.0.bin --K 100 --gt_file gt100_random10D_10K-conc-2500-7500 --tags_file index_ins_del.after-concurrent-delete-del2500-7500.tags - ${{ env.diskann_built_tests }}/search_memory_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix index_ins_del.after-concurrent-delete-del2500-7500 --result_path res_ins_del --query_file ./rand_uint8_10D_1K_norm50.0.bin --gt_file gt100_random10D_10K-conc-2500-7500 -K 10 -L 20 40 60 80 100 -T 8 --dynamic true --tags 1 - - name: test a streaming index - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/test_streaming_scenario --data_type uint8 --dist_fn l2 --data_path rand_uint8_10D_10K_norm50.0.bin --index_path_prefix index_stream -R 64 -L 600 --alpha 1.2 --insert_threads 4 --consolidate_threads 4 --max_points_to_insert 10000 --active_window 4000 --consolidate_interval 2000 --start_point_norm 200 - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type uint8 --dist_fn l2 --base_file index_stream.after-streaming-act4000-cons2000-max10000.data --query_file rand_uint8_10D_1K_norm50.0.bin --K 100 --gt_file gt100_base-act4000-cons2000-max10000 --tags_file index_stream.after-streaming-act4000-cons2000-max10000.tags - ${{ env.diskann_built_tests }}/search_memory_index --data_type uint8 --dist_fn l2 --fail_if_recall_below 70 --index_path_prefix index_stream.after-streaming-act4000-cons2000-max10000 --result_path res_stream --query_file ./rand_uint8_10D_1K_norm50.0.bin --gt_file gt100_base-act4000-cons2000-max10000 -K 10 -L 20 40 60 80 100 -T 64 --dynamic true --tags 1 - - - name: Generate 10K random uint8 index vectors, 1K query vectors, 10K Label Points (50 unique labels), in 10 dims and compute GT - if: success() || failure() - run: | - ${{ env.diskann_built_utils }}/rand_data_gen --data_type uint8 --output_file ./rand_uint8_10D_10K_norm50.0.bin -D 10 -N 10000 --norm 50.0 - ${{ env.diskann_built_utils }}/rand_data_gen --data_type uint8 --output_file ./rand_uint8_10D_1K_norm50.0.bin -D 10 -N 1000 --norm 50.0 - ${{ env.diskann_built_utils }}/generate_synthetic_labels --num_labels 50 --num_points 10000 --output_file ./rand_labels_10_10K.txt - ${{ env.diskann_built_utils }}/compute_groundtruth --data_type uint8 --dist_fn l2 --universal_label 0 --filter_label 10 --base_file ./rand_uint8_10D_10K_norm50.0.bin --query_file ./rand_uint8_10D_1K_norm50.0.bin --label_file ./rand_labels_10_10K.txt --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel --K 100 - - name: build and search in-memory index with labels using L2 metrics - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type uint8 --dist_fn l2 --FilteredLbuild 90 --universal_label 0 --data_path ./rand_uint8_10D_10K_norm50.0.bin --label_file ./rand_labels_10_10K.txt --index_path_prefix ./index_l2_rand_uint8_10D_10K_norm50_wlabel - ${{ env.diskann_built_tests }}/search_memory_index --data_type uint8 --dist_fn l2 --filter_label 10 --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_uint8_10D_10K_norm50_wlabel --query_file ./rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -L 16 32 - - - name: build and search in-memory index with pq_dist of 5 with 10 dimensions - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_memory_index --data_type uint8 --dist_fn l2 --FilteredLbuild 90 --universal_label 0 --data_path ./rand_uint8_10D_10K_norm50.0.bin --label_file ./rand_labels_10_10K.txt --index_path_prefix ./index_l2_rand_uint8_10D_10K_norm50_wlabel --build_PQ_bytes 5 - ${{ env.diskann_built_tests }}/search_memory_index --data_type uint8 --dist_fn l2 --filter_label 10 --fail_if_recall_below 70 --index_path_prefix ./index_l2_rand_uint8_10D_10K_norm50_wlabel --query_file ./rand_uint8_10D_1K_norm50.0.bin --recall_at 10 --result_path temp --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -L 16 32 - - - name: Build and search stitched vamana - if: success() || failure() - run: | - ${{ env.diskann_built_tests }}/build_stitched_index --num_threads 48 --data_type uint8 --data_path ./rand_uint8_10D_10K_norm50.0.bin --label_file ./rand_labels_10_10K.txt -R 32 -L 100 --alpha 1.2 --stitched_R 64 --index_path_prefix ./stit_32_100_64_new --universal_label 0 - ${{ env.diskann_built_tests }}/search_memory_index --num_threads 48 --data_type uint8 --dist_fn l2 --filter_label 10 --index_path_prefix ./stit_32_100_64_new --query_file ./rand_uint8_10D_1K_norm50.0.bin --result_path ./rand_stit_96_10_90_new --gt_file ./l2_rand_uint8_10D_10K_norm50.0_10D_1K_norm50.0_gt100_wlabel -K 10 -L 10 10 10 10 10 30 50 70 90 110 130 150 170 190 210 230 250 270 290 310 330 350 370 390 410 - - uses: actions/setup-python@v3 - - name: Install cibuildwheel - run: python -m pip install cibuildwheel==2.11.3 - - name: build wheels - run: python -m cibuildwheel --output-dir wheelhouse - env: - CIBW_ARCHS_WINDOWS: AMD64 - CIBW_ARCHS_LINUX: x86_64 + fail-fast: true + name: DiskANN Common Build Checks + uses: ./.github/workflows/common.yml + unit-tests: + name: Unit tests + uses: ./.github/workflows/unit-tests.yml + in-mem-pq: + name: In-Memory with PQ + uses: ./.github/workflows/in-mem-pq.yml + in-mem-no-pq: + name: In-Memory without PQ + uses: ./.github/workflows/in-mem-no-pq.yml + disk-pq: + name: Disk with PQ + uses: ./.github/workflows/disk-pq.yml + labels: + name: Labels + uses: ./.github/workflows/labels.yml + dynamic: + name: Dynamic + uses: ./.github/workflows/dynamic.yml + python: + name: Python + uses: ./.github/workflows/build-python.yml diff --git a/.github/workflows/push-test.yml b/.github/workflows/push-test.yml index cd186af9d..4de999014 100644 --- a/.github/workflows/push-test.yml +++ b/.github/workflows/push-test.yml @@ -1,55 +1,35 @@ name: DiskANN Push Build on: [push] jobs: - ubuntu-latest-build: - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - name: Install deps - run: | - sudo apt install cmake g++ libaio-dev libgoogle-perftools-dev libunwind-dev clang-format libboost-dev libboost-program-options-dev libmkl-full-dev libcpprest-dev - - name: Clang Format Check - run: | - mkdir build && cd build && cmake -DRESTAPI=True -DCMAKE_BUILD_TYPE=Release .. - make checkformat - - name: build - run: | - cd build && make -j - - uses: actions/setup-python@v3 - with: - python-version: "3.10" - - name: Install Python Build Module - run: python -m pip install build - - name: Python Build - run: python -m build - - windows-build: - name: Build for ${{ matrix.os }} - runs-on: ${{ matrix.os }} - + common: + strategy: + fail-fast: true + name: DiskANN Common Build Checks + uses: ./.github/workflows/common.yml + build: strategy: + fail-fast: false matrix: - os: [windows-2019, windows-latest] - + os: [ ubuntu-latest, windows-2019, windows-latest ] + name: Build for ${{matrix.os}} + runs-on: ${{matrix.os}} + defaults: + run: + shell: bash steps: - - name: Checkout repository - uses: actions/checkout@v2 - with: + - name: Checkout repository + if: ${{ runner.os == 'Linux' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Checkout repository + if: ${{ runner.os == 'Windows' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 submodules: true - - - name: Add VisualStudio command line tools into path - uses: ilammy/msvc-dev-cmd@v1 - - - name: Run configure and build - run: | - mkdir build && cd build && cmake .. && msbuild diskann.sln /m /nologo /t:Build /p:Configuration="Release" /property:Platform="x64" -consoleloggerparameters:"ErrorsOnly;Summary" - shell: cmd - - - uses: actions/setup-python@v3 - with: - python-version: "3.10" - - name: Install Python Build Module - run: python -m pip install build - - name: Python Build - run: python -m build + - name: DiskANN Build CLI Applications + uses: ./.github/actions/build +# python: +# name: DiskANN Build Python Wheel +# uses: ./.github/workflows/build-python.yml diff --git a/.github/workflows/python-release.yml b/.github/workflows/python-release.yml index 2651328b8..a1e72ad90 100644 --- a/.github/workflows/python-release.yml +++ b/.github/workflows/python-release.yml @@ -3,39 +3,20 @@ on: release: types: [published] jobs: - build_wheels: - name: Build wheels on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, windows-latest] - steps: - - uses: actions/checkout@v3 - with: - submodules: true - - uses: actions/setup-python@v3 - - name: Install cibuildwheel - run: python -m pip install cibuildwheel==2.11.3 - - name: build wheels - run: python -m cibuildwheel --output-dir wheelhouse - env: - CIBW_ARCHS_WINDOWS: AMD64 - CIBW_ARCHS_LINUX: x86_64 - - uses: actions/upload-artifact@v3 - with: - name: wheelhouse - path: ./wheelhouse/*.whl + python-release-wheels: + name: Python + uses: ./.github/workflows/build-python.yml release: runs-on: ubuntu-latest - needs: build_wheels + needs: python-release-wheels steps: - uses: actions/download-artifact@v3 with: - name: wheelhouse - path: wheelhouse/ + name: wheels + path: dist/ - name: Generate SHA256 files for each wheel run: | - sha256sum wheelhouse/*.whl > checksums.txt + sha256sum dist/*.whl > checksums.txt cat checksums.txt - uses: actions/setup-python@v3 - name: Install twine @@ -45,11 +26,11 @@ jobs: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | - twine upload wheelhouse/*.whl + twine upload dist/*.whl - name: Update release with SHA256 and Artifacts uses: softprops/action-gh-release@v1 with: token: ${{ secrets.GITHUB_TOKEN }} files: | - wheelhouse/*.whl + dist/*.whl checksums.txt diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml new file mode 100644 index 000000000..6ae6877b8 --- /dev/null +++ b/.github/workflows/unit-tests.yml @@ -0,0 +1,32 @@ +name: Unit Tests +on: [workflow_call] +jobs: + acceptance-tests-labels: + name: Unit Tests + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-2019, windows-latest] + runs-on: ${{matrix.os}} + defaults: + run: + shell: bash + steps: + - name: Checkout repository + if: ${{ runner.os == 'Linux' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + - name: Checkout repository + if: ${{ runner.os == 'Windows' }} + uses: actions/checkout@v3 + with: + fetch-depth: 1 + submodules: true + - name: DiskANN Build CLI Applications + uses: ./.github/actions/build + + - name: Run Unit Tests + run: | + cd build + ctest -C Release \ No newline at end of file diff --git a/.gitignore b/.gitignore index d7a8e4741..f80e5c682 100644 --- a/.gitignore +++ b/.gitignore @@ -357,6 +357,8 @@ MigrationBackup/ cscope* build/ +build_linux/ +!.github/actions/build # jetbrains specific stuff .idea/ @@ -371,3 +373,8 @@ wheelhouse/* dist/* venv*/** *.swp + +gperftools + +# Rust +rust/target diff --git a/CMakeLists.txt b/CMakeLists.txt index f29e13f3a..89530f818 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,16 +15,19 @@ # Contact for this feature: gopalrs. # Some variables like MSVC are defined only after project(), so put that first. -project(diskann) - cmake_minimum_required(VERSION 3.15) +project(diskann) -set(CMAKE_STANDARD 14) +set(CMAKE_STANDARD 17) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) if(NOT MSVC) set(CMAKE_CXX_COMPILER g++) endif() +set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}") + # Install nuget packages for dependencies. if (MSVC) find_program(NUGET_EXE NAMES nuget) @@ -42,7 +45,7 @@ if (MSVC) if (RESTAPI) set(DISKANN_MSVC_RESTAPI_PACKAGES_CONFIG ${CMAKE_BINARY_DIR}/restapi/packages.config) configure_file(${PROJECT_SOURCE_DIR}/windows/packages_restapi.config.in ${DISKANN_MSVC_RESTAPI_PACKAGES_CONFIG}) - exec_program(${NUGET_EXE} ARGS install \"${DISKANN_MSVC_RESTAPI_PACKAGES_CONFIG}\" -ExcludeVersion -OutputDirectory \"${DISKANN_MSVC_PACKAGES}\") + exec_program(${NUGET_EXE} ARGS install \"${DISKANN_MSVC_RESTAPI_PACKAGES_CONFIG}\" -ExcludeVersion -OutputDirectory \"${DISKANN_MSVC_PACKAGES}\") endif() message(STATUS "Finished setting up nuget dependencies") endif() @@ -136,18 +139,63 @@ if (MSVC) "${DISKANN_MKL_LIB_PATH}/mkl_intel_thread.lib") else() # expected path for manual intel mkl installs - set(OMP_PATH /opt/intel/oneapi/compiler/2022.0.2/linux/compiler/lib/intel64_lin/ CACHE PATH "Intel OneAPI OpenMP library implementation path") - set(MKL_ROOT /opt/intel/oneapi/mkl/latest CACHE PATH "Intel OneAPI MKL library implementation path") - link_directories(${OMP_PATH} ${MKL_ROOT}/lib/intel64) - include_directories(${MKL_ROOT}/include) - - # expected path for apt packaged intel mkl installs - link_directories(/usr/lib/x86_64-linux-gnu/mkl) - include_directories(/usr/include/mkl) + set(POSSIBLE_OMP_PATHS "/opt/intel/oneapi/compiler/latest/linux/compiler/lib/intel64_lin/libiomp5.so;/usr/lib/x86_64-linux-gnu/libiomp5.so;/opt/intel/lib/intel64_lin/libiomp5.so") + foreach(POSSIBLE_OMP_PATH ${POSSIBLE_OMP_PATHS}) + if (EXISTS ${POSSIBLE_OMP_PATH}) + get_filename_component(OMP_PATH ${POSSIBLE_OMP_PATH} DIRECTORY) + endif() + endforeach() + + if(NOT OMP_PATH) + message(FATAL_ERROR "Could not find Intel OMP in standard locations; use -DOMP_PATH to specify the install location for your environment") + endif() + link_directories(${OMP_PATH}) + + set(POSSIBLE_MKL_LIB_PATHS "/opt/intel/oneapi/mkl/latest/lib/intel64/libmkl_core.so;/usr/lib/x86_64-linux-gnu/libmkl_core.so;/opt/intel/mkl/lib/intel64/libmkl_core.so") + foreach(POSSIBLE_MKL_LIB_PATH ${POSSIBLE_MKL_LIB_PATHS}) + if (EXISTS ${POSSIBLE_MKL_LIB_PATH}) + get_filename_component(MKL_PATH ${POSSIBLE_MKL_LIB_PATH} DIRECTORY) + endif() + endforeach() + + set(POSSIBLE_MKL_INCLUDE_PATHS "/opt/intel/oneapi/mkl/latest/include;/usr/include/mkl;/opt/intel/mkl/include/;") + foreach(POSSIBLE_MKL_INCLUDE_PATH ${POSSIBLE_MKL_INCLUDE_PATHS}) + if (EXISTS ${POSSIBLE_MKL_INCLUDE_PATH}) + set(MKL_INCLUDE_PATH ${POSSIBLE_MKL_INCLUDE_PATH}) + endif() + endforeach() + if(NOT MKL_PATH) + message(FATAL_ERROR "Could not find Intel MKL in standard locations; use -DMKL_PATH to specify the install location for your environment") + elseif(NOT MKL_INCLUDE_PATH) + message(FATAL_ERROR "Could not find Intel MKL in standard locations; use -DMKL_INCLUDE_PATH to specify the install location for headers for your environment") + endif() + if (EXISTS ${MKL_PATH}/libmkl_def.so.2) + set(MKL_DEF_SO ${MKL_PATH}/libmkl_def.so.2) + elseif(EXISTS ${MKL_PATH}/libmkl_def.so) + set(MKL_DEF_SO ${MKL_PATH}/libmkl_def.so) + else() + message(FATAL_ERROR "Despite finding MKL, libmkl_def.so was not found in expected locations.") + endif() + link_directories(${MKL_PATH}) + include_directories(${MKL_INCLUDE_PATH}) # compile flags and link libraries add_compile_options(-m64 -Wl,--no-as-needed) - link_libraries(mkl_intel_ilp64 mkl_intel_thread mkl_core iomp5 pthread m dl) + if (NOT PYBIND) + link_libraries(mkl_intel_ilp64 mkl_intel_thread mkl_core iomp5 pthread m dl) + else() + # static linking for python so as to minimize customer dependency issues + link_libraries( + ${MKL_PATH}/libmkl_intel_ilp64.a + ${MKL_PATH}/libmkl_intel_thread.a + ${MKL_PATH}/libmkl_core.a + ${MKL_DEF_SO} + iomp5 + pthread + m + dl + ) + endif() endif() add_definitions(-DMKL_ILP64) @@ -193,7 +241,7 @@ if (MSVC) add_dependencies(libtcmalloc_minimal_for_exe build_libtcmalloc_minimal) set(DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS libtcmalloc_minimal_for_exe) -else() +elseif(NOT PYBIND) set(DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS "-ltcmalloc") endif() @@ -212,7 +260,7 @@ endif() #Main compiler/linker settings if(MSVC) #language options - add_compile_options(/permissive- /openmp:experimental /Zc:twoPhase- /Zc:inline /WX- /std:c++14 /Gd /W3 /MP /Zi /FC /nologo) + add_compile_options(/permissive- /openmp:experimental /Zc:twoPhase- /Zc:inline /WX- /std:c++17 /Gd /W3 /MP /Zi /FC /nologo) #code generation options add_compile_options(/arch:AVX2 /fp:fast /fp:except- /EHsc /GS- /Gy) #optimization options @@ -231,19 +279,30 @@ if(MSVC) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/Release) 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 -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_AVX2) - if (PYBIND) - add_compile_options(-fPIC) + set(ENV{TCMALLOC_LARGE_ALLOC_REPORT_THRESHOLD} 500000000000) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -mfma -msse2 -ftree-vectorize -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -fopenmp -fopenmp-simd -funroll-loops -Wfatal-errors -DUSE_AVX2") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -DDEBUG") + if (NOT PYBIND) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG -Ofast") + if (NOT PORTABLE) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=native -mtune=native") + endif() + else() + # -Ofast is not supported in a python extension module + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG -fPIC") endif() endif() add_subdirectory(src) -add_subdirectory(tests) -add_subdirectory(tests/utils) +if (NOT PYBIND) + add_subdirectory(apps) + add_subdirectory(apps/utils) +endif() + +if (UNIT_TEST) + enable_testing() + add_subdirectory(tests) +endif() if (MSVC) message(STATUS "The ${PROJECT_NAME}.sln has been created, opened it from VisualStudio to build Release or Debug configurations.\n" @@ -258,12 +317,11 @@ if (RESTAPI) link_libraries("${DISKANN_CPPRESTSDK}/x64/lib/cpprest142_2_10.lib") include_directories("${DISKANN_CPPRESTSDK}/include") endif() - add_subdirectory(tests/restapi) + add_subdirectory(apps/restapi) endif() include(clang-format.cmake) - if(PYBIND) add_subdirectory(python) endif() diff --git a/Dockerfile b/Dockerfile index 95c5f3494..ea1979f3f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,17 @@ -FROM ubuntu:16.04 -MAINTAINER Changxu Wang +#Copyright(c) Microsoft Corporation.All rights reserved. +#Licensed under the MIT license. -RUN apt-get update -y -RUN apt-get install -y g++ cmake libboost-dev libgoogle-perftools-dev +FROM ubuntu:jammy -COPY . /opt/nsg +RUN apt update +RUN apt install -y software-properties-common +RUN add-apt-repository -y ppa:git-core/ppa +RUN apt update +RUN DEBIAN_FRONTEND=noninteractive apt install -y git make cmake g++ libaio-dev libgoogle-perftools-dev libunwind-dev clang-format libboost-dev libboost-program-options-dev libmkl-full-dev libcpprest-dev python3.10 -WORKDIR /opt/nsg - -RUN mkdir -p build && cd build && \ - cmake -DCMAKE_BUILD_TYPE=Release .. && \ - make -j $(nproc) +WORKDIR /app +RUN git clone https://github.com/microsoft/DiskANN.git +WORKDIR /app/DiskANN +RUN mkdir build +RUN cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +RUN cmake --build build -- -j diff --git a/DockerfileDev b/DockerfileDev new file mode 100644 index 000000000..0e95e405f --- /dev/null +++ b/DockerfileDev @@ -0,0 +1,17 @@ +#Copyright(c) Microsoft Corporation.All rights reserved. +#Licensed under the MIT license. + +FROM ubuntu:jammy + +RUN apt update +RUN apt install -y software-properties-common +RUN add-apt-repository -y ppa:git-core/ppa +RUN apt update +RUN DEBIAN_FRONTEND=noninteractive apt install -y git make cmake g++ libaio-dev libgoogle-perftools-dev libunwind-dev clang-format libboost-dev libboost-program-options-dev libboost-test-dev libmkl-full-dev libcpprest-dev python3.10 + +WORKDIR /app +RUN git clone https://github.com/microsoft/DiskANN.git +WORKDIR /app/DiskANN +RUN mkdir build +RUN cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DUNIT_TEST=True +RUN cmake --build build -- -j diff --git a/MANIFEST.in b/MANIFEST.in index f6b8b82c0..0735c2783 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -10,4 +10,3 @@ recursive-include python * recursive-include windows * prune python/tests recursive-include src * -recursive-include tests * diff --git a/README.md b/README.md index 41f2fae4f..2922c16c1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ # DiskANN -[![DiskANN Pull Request Build and Test](https://github.com/microsoft/DiskANN/actions/workflows/pr-test.yml/badge.svg)](https://github.com/microsoft/DiskANN/actions/workflows/pr-test.yml) +[![DiskANN Paper](https://img.shields.io/badge/Paper-NeurIPS%3A_DiskANN-blue)](https://papers.nips.cc/paper/9527-rand-nsg-fast-accurate-billion-point-nearest-neighbor-search-on-a-single-node.pdf) +[![DiskANN Paper](https://img.shields.io/badge/Paper-Arxiv%3A_Fresh--DiskANN-blue)](https://arxiv.org/abs/2105.09613) +[![DiskANN Paper](https://img.shields.io/badge/Paper-Filtered--DiskANN-blue)](https://harsha-simhadri.org/pubs/Filtered-DiskANN23.pdf) +[![DiskANN Main](https://github.com/microsoft/DiskANN/actions/workflows/push-test.yml/badge.svg?branch=main)](https://github.com/microsoft/DiskANN/actions/workflows/push-test.yml) +[![PyPI version](https://img.shields.io/pypi/v/diskannpy.svg)](https://pypi.org/project/diskannpy/) +[![Downloads shield](https://pepy.tech/badge/diskannpy)](https://pepy.tech/project/diskannpy) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) DiskANN is a suite of scalable, accurate and cost-effective approximate nearest neighbor search algorithms for large-scale vector search that support real-time changes and simple filters. This code is based on ideas from the [DiskANN](https://papers.nips.cc/paper/9527-rand-nsg-fast-accurate-billion-point-nearest-neighbor-search-on-a-single-node.pdf), [Fresh-DiskANN](https://arxiv.org/abs/2105.09613) and the [Filtered-DiskANN](https://harsha-simhadri.org/pubs/Filtered-DiskANN23.pdf) papers with further improvements. @@ -12,8 +18,6 @@ contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additio See [guidelines](CONTRIBUTING.md) for contributing to this project. - - ## Linux build: Install the following packages through apt-get @@ -23,7 +27,7 @@ sudo apt install make cmake g++ libaio-dev libgoogle-perftools-dev clang-format ``` ### Install Intel MKL -#### Ubuntu 20.04 +#### Ubuntu 20.04 or newer ```bash sudo apt install libmkl-full-dev ``` @@ -71,12 +75,16 @@ OR for Visual Studio 2017 and earlier: ``` \cmake .. ``` -* This will create a diskann.sln solution. Open it from VisualStudio and build either Release or Debug configuration. - * Alternatively, use MSBuild: +**This will create a diskann.sln solution**. Now you can: + +- Open it from VisualStudio and build either Release or Debug configuration. +- `\cmake --build build` +- Use MSBuild: ``` msbuild.exe diskann.sln /m /nologo /t:Build /p:Configuration="Release" /property:Platform="x64" ``` - * This will also build gperftools submodule for libtcmalloc_minimal dependency. + +* This will also build gperftools submodule for libtcmalloc_minimal dependency. * Generated binaries are stored in the x64/Release or x64/Debug directories. ## Usage: @@ -88,16 +96,16 @@ Please see the following pages on using the compiled code: - [Commandline examples for using in-memory streaming indices](workflows/dynamic_index.md) - [Commandline interface for building and search in memory indices with label data and filters](workflows/filtered_in_memory.md) - [Commandline interface for building and search SSD based indices with label data and filters](workflows/filtered_ssd_index.md) -- To be added: Python interfaces and docker files +- [diskannpy - DiskANN as a python extension module](python/README.md) Please cite this software in your work as: ``` @misc{diskann-github, - author = {Simhadri, Harsha Vardhan and Krishnaswamy, Ravishankar and Srinivasa, Gopal and Subramanya, Suhas Jayaram and Antonijevic, Andrija and Pryce, Dax and Kaczynski, David and Williams, Shane and Gollapudi, Siddarth and Sivashankar, Varun and Karia, Neel and Singh, Aditi and Jaiswal, Shikhar and Mahapatro, Neelam and Adams, Philip and Tower, Bryan}}, + author = {Simhadri, Harsha Vardhan and Krishnaswamy, Ravishankar and Srinivasa, Gopal and Subramanya, Suhas Jayaram and Antonijevic, Andrija and Pryce, Dax and Kaczynski, David and Williams, Shane and Gollapudi, Siddarth and Sivashankar, Varun and Karia, Neel and Singh, Aditi and Jaiswal, Shikhar and Mahapatro, Neelam and Adams, Philip and Tower, Bryan and Patel, Yash}}, title = {{DiskANN: Graph-structured Indices for Scalable, Fast, Fresh and Filtered Approximate Nearest Neighbor Search}}, url = {https://github.com/Microsoft/DiskANN}, - version = {0.5}, + version = {0.6.0}, year = {2023} } ``` diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt new file mode 100644 index 000000000..e42c0b6cb --- /dev/null +++ b/apps/CMakeLists.txt @@ -0,0 +1,42 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_COMPILE_WARNING_AS_ERROR ON) + +add_executable(build_memory_index build_memory_index.cpp) +target_link_libraries(build_memory_index ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) + +add_executable(build_stitched_index build_stitched_index.cpp) +target_link_libraries(build_stitched_index ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) + +add_executable(search_memory_index search_memory_index.cpp) +target_link_libraries(search_memory_index ${PROJECT_NAME} ${DISKANN_ASYNC_LIB} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) + +add_executable(build_disk_index build_disk_index.cpp) +target_link_libraries(build_disk_index ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} ${DISKANN_ASYNC_LIB} Boost::program_options) + +add_executable(search_disk_index search_disk_index.cpp) +target_link_libraries(search_disk_index ${PROJECT_NAME} ${DISKANN_ASYNC_LIB} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) + +add_executable(range_search_disk_index range_search_disk_index.cpp) +target_link_libraries(range_search_disk_index ${PROJECT_NAME} ${DISKANN_ASYNC_LIB} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) + +add_executable(test_streaming_scenario test_streaming_scenario.cpp) +target_link_libraries(test_streaming_scenario ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) + +add_executable(test_insert_deletes_consolidate test_insert_deletes_consolidate.cpp) +target_link_libraries(test_insert_deletes_consolidate ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) + +if (NOT MSVC) + install(TARGETS build_memory_index + build_stitched_index + search_memory_index + build_disk_index + search_disk_index + range_search_disk_index + test_streaming_scenario + test_insert_deletes_consolidate + RUNTIME + ) +endif() diff --git a/apps/build_disk_index.cpp b/apps/build_disk_index.cpp new file mode 100644 index 000000000..b617a5f4a --- /dev/null +++ b/apps/build_disk_index.cpp @@ -0,0 +1,189 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include + +#include "utils.h" +#include "disk_utils.h" +#include "math_utils.h" +#include "index.h" +#include "partition.h" +#include "program_options_utils.hpp" + +namespace po = boost::program_options; + +int main(int argc, char **argv) +{ + std::string data_type, dist_fn, data_path, index_path_prefix, codebook_prefix, label_file, universal_label, + label_type; + uint32_t num_threads, R, L, disk_PQ, build_PQ, QD, Lf, filter_threshold; + float B, M; + bool append_reorder_data = false; + bool use_opq = false; + + po::options_description desc{ + program_options_utils::make_program_description("build_disk_index", "Build a disk-based index.")}; + try + { + desc.add_options()("help,h", "Print information on arguments"); + + // Required parameters + po::options_description required_configs("Required"); + required_configs.add_options()("data_type", po::value(&data_type)->required(), + program_options_utils::DATA_TYPE_DESCRIPTION); + required_configs.add_options()("dist_fn", po::value(&dist_fn)->required(), + program_options_utils::DISTANCE_FUNCTION_DESCRIPTION); + required_configs.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), + program_options_utils::INDEX_PATH_PREFIX_DESCRIPTION); + required_configs.add_options()("data_path", po::value(&data_path)->required(), + program_options_utils::INPUT_DATA_PATH); + required_configs.add_options()("search_DRAM_budget,B", po::value(&B)->required(), + "DRAM budget in GB for searching the index to set the " + "compressed level for data while search happens"); + required_configs.add_options()("build_DRAM_budget,M", po::value(&M)->required(), + "DRAM budget in GB for building the index"); + + // Optional parameters + po::options_description optional_configs("Optional"); + optional_configs.add_options()("num_threads,T", + po::value(&num_threads)->default_value(omp_get_num_procs()), + program_options_utils::NUMBER_THREADS_DESCRIPTION); + optional_configs.add_options()("max_degree,R", po::value(&R)->default_value(64), + program_options_utils::MAX_BUILD_DEGREE); + optional_configs.add_options()("Lbuild,L", po::value(&L)->default_value(100), + program_options_utils::GRAPH_BUILD_COMPLEXITY); + optional_configs.add_options()("QD", po::value(&QD)->default_value(0), + " Quantized Dimension for compression"); + optional_configs.add_options()("codebook_prefix", po::value(&codebook_prefix)->default_value(""), + "Path prefix for pre-trained codebook"); + optional_configs.add_options()("PQ_disk_bytes", po::value(&disk_PQ)->default_value(0), + "Number of bytes to which vectors should be compressed " + "on SSD; 0 for no compression"); + optional_configs.add_options()("append_reorder_data", po::bool_switch()->default_value(false), + "Include full precision data in the index. Use only in " + "conjuction with compressed data on SSD."); + optional_configs.add_options()("build_PQ_bytes", po::value(&build_PQ)->default_value(0), + program_options_utils::BUIlD_GRAPH_PQ_BYTES); + optional_configs.add_options()("use_opq", po::bool_switch()->default_value(false), + program_options_utils::USE_OPQ); + optional_configs.add_options()("label_file", po::value(&label_file)->default_value(""), + program_options_utils::LABEL_FILE); + optional_configs.add_options()("universal_label", po::value(&universal_label)->default_value(""), + program_options_utils::UNIVERSAL_LABEL); + optional_configs.add_options()("FilteredLbuild", po::value(&Lf)->default_value(0), + program_options_utils::FILTERED_LBUILD); + optional_configs.add_options()("filter_threshold,F", po::value(&filter_threshold)->default_value(0), + "Threshold to break up the existing nodes to generate new graph " + "internally where each node has a maximum F labels."); + optional_configs.add_options()("label_type", po::value(&label_type)->default_value("uint"), + program_options_utils::LABEL_TYPE_DESCRIPTION); + + // Merge required and optional parameters + desc.add(required_configs).add(optional_configs); + + po::variables_map vm; + po::store(po::parse_command_line(argc, argv, desc), vm); + if (vm.count("help")) + { + std::cout << desc; + return 0; + } + po::notify(vm); + if (vm["append_reorder_data"].as()) + append_reorder_data = true; + if (vm["use_opq"].as()) + use_opq = true; + } + catch (const std::exception &ex) + { + std::cerr << ex.what() << '\n'; + return -1; + } + + bool use_filters = (label_file != "") ? true : false; + diskann::Metric metric; + if (dist_fn == std::string("l2")) + metric = diskann::Metric::L2; + else if (dist_fn == std::string("mips")) + metric = diskann::Metric::INNER_PRODUCT; + else + { + std::cout << "Error. Only l2 and mips distance functions are supported" << std::endl; + return -1; + } + + if (append_reorder_data) + { + if (disk_PQ == 0) + { + std::cout << "Error: It is not necessary to append data for reordering " + "when vectors are not compressed on disk." + << std::endl; + return -1; + } + if (data_type != std::string("float")) + { + std::cout << "Error: Appending data for reordering currently only " + "supported for float data type." + << std::endl; + return -1; + } + } + + std::string params = std::string(std::to_string(R)) + " " + std::string(std::to_string(L)) + " " + + std::string(std::to_string(B)) + " " + std::string(std::to_string(M)) + " " + + std::string(std::to_string(num_threads)) + " " + std::string(std::to_string(disk_PQ)) + " " + + std::string(std::to_string(append_reorder_data)) + " " + + std::string(std::to_string(build_PQ)) + " " + std::string(std::to_string(QD)); + + try + { + if (label_file != "" && label_type == "ushort") + { + if (data_type == std::string("int8")) + return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), params.c_str(), + metric, use_opq, codebook_prefix, use_filters, label_file, + universal_label, filter_threshold, Lf); + else if (data_type == std::string("uint8")) + return diskann::build_disk_index( + data_path.c_str(), index_path_prefix.c_str(), params.c_str(), metric, use_opq, codebook_prefix, + use_filters, label_file, universal_label, filter_threshold, Lf); + else if (data_type == std::string("float")) + return diskann::build_disk_index( + data_path.c_str(), index_path_prefix.c_str(), params.c_str(), metric, use_opq, codebook_prefix, + use_filters, label_file, universal_label, filter_threshold, Lf); + else + { + diskann::cerr << "Error. Unsupported data type" << std::endl; + return -1; + } + } + else + { + if (data_type == std::string("int8")) + return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), params.c_str(), + metric, use_opq, codebook_prefix, use_filters, label_file, + universal_label, filter_threshold, Lf); + else if (data_type == std::string("uint8")) + return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), params.c_str(), + metric, use_opq, codebook_prefix, use_filters, label_file, + universal_label, filter_threshold, Lf); + else if (data_type == std::string("float")) + return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), params.c_str(), + metric, use_opq, codebook_prefix, use_filters, label_file, + universal_label, filter_threshold, Lf); + else + { + diskann::cerr << "Error. Unsupported data type" << std::endl; + return -1; + } + } + } + catch (const std::exception &e) + { + std::cout << std::string(e.what()) << std::endl; + diskann::cerr << "Index build failed." << std::endl; + return -1; + } +} diff --git a/apps/build_memory_index.cpp b/apps/build_memory_index.cpp new file mode 100644 index 000000000..92b269f4f --- /dev/null +++ b/apps/build_memory_index.cpp @@ -0,0 +1,206 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include + +#include "index.h" +#include "utils.h" +#include "program_options_utils.hpp" + +#ifndef _WINDOWS +#include +#include +#else +#include +#endif + +#include "memory_mapper.h" +#include "ann_exception.h" +#include "index_factory.h" + +namespace po = boost::program_options; + +template +int build_in_memory_index(const diskann::Metric &metric, const std::string &data_path, const uint32_t R, + const uint32_t L, const float alpha, const std::string &save_path, const uint32_t num_threads, + const bool use_pq_build, const size_t num_pq_bytes, const bool use_opq, + const std::string &label_file, const std::string &universal_label, const uint32_t Lf) +{ + diskann::IndexWriteParameters paras = diskann::IndexWriteParametersBuilder(L, R) + .with_filter_list_size(Lf) + .with_alpha(alpha) + .with_saturate_graph(false) + .with_num_threads(num_threads) + .build(); + std::string labels_file_to_use = save_path + "_label_formatted.txt"; + std::string mem_labels_int_map_file = save_path + "_labels_map.txt"; + + size_t data_num, data_dim; + diskann::get_bin_metadata(data_path, data_num, data_dim); + + diskann::Index index(metric, data_dim, data_num, false, false, false, use_pq_build, num_pq_bytes, + use_opq); + auto s = std::chrono::high_resolution_clock::now(); + if (label_file == "") + { + index.build(data_path.c_str(), data_num, paras); + } + else + { + convert_labels_string_to_int(label_file, labels_file_to_use, mem_labels_int_map_file, universal_label); + if (universal_label != "") + { + LabelT unv_label_as_num = 0; + index.set_universal_label(unv_label_as_num); + } + index.build_filtered_index(data_path.c_str(), labels_file_to_use, data_num, paras); + } + std::chrono::duration diff = std::chrono::high_resolution_clock::now() - s; + + std::cout << "Indexing time: " << diff.count() << "\n"; + index.save(save_path.c_str()); + if (label_file != "") + std::remove(labels_file_to_use.c_str()); + return 0; +} + +int main(int argc, char **argv) +{ + std::string data_type, dist_fn, data_path, index_path_prefix, label_file, universal_label, label_type; + uint32_t num_threads, R, L, Lf, build_PQ_bytes; + float alpha; + bool use_pq_build, use_opq; + + po::options_description desc{ + program_options_utils::make_program_description("build_memory_index", "Build a memory-based DiskANN index.")}; + try + { + desc.add_options()("help,h", "Print information on arguments"); + + // Required parameters + po::options_description required_configs("Required"); + required_configs.add_options()("data_type", po::value(&data_type)->required(), + program_options_utils::DATA_TYPE_DESCRIPTION); + required_configs.add_options()("dist_fn", po::value(&dist_fn)->required(), + program_options_utils::DISTANCE_FUNCTION_DESCRIPTION); + required_configs.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), + program_options_utils::INDEX_PATH_PREFIX_DESCRIPTION); + required_configs.add_options()("data_path", po::value(&data_path)->required(), + program_options_utils::INPUT_DATA_PATH); + + // Optional parameters + po::options_description optional_configs("Optional"); + optional_configs.add_options()("num_threads,T", + po::value(&num_threads)->default_value(omp_get_num_procs()), + program_options_utils::NUMBER_THREADS_DESCRIPTION); + optional_configs.add_options()("max_degree,R", po::value(&R)->default_value(64), + program_options_utils::MAX_BUILD_DEGREE); + optional_configs.add_options()("Lbuild,L", po::value(&L)->default_value(100), + program_options_utils::GRAPH_BUILD_COMPLEXITY); + optional_configs.add_options()("alpha", po::value(&alpha)->default_value(1.2f), + program_options_utils::GRAPH_BUILD_ALPHA); + optional_configs.add_options()("build_PQ_bytes", po::value(&build_PQ_bytes)->default_value(0), + program_options_utils::BUIlD_GRAPH_PQ_BYTES); + optional_configs.add_options()("use_opq", po::bool_switch()->default_value(false), + program_options_utils::USE_OPQ); + optional_configs.add_options()("label_file", po::value(&label_file)->default_value(""), + program_options_utils::LABEL_FILE); + optional_configs.add_options()("universal_label", po::value(&universal_label)->default_value(""), + program_options_utils::UNIVERSAL_LABEL); + + optional_configs.add_options()("FilteredLbuild", po::value(&Lf)->default_value(0), + program_options_utils::FILTERED_LBUILD); + optional_configs.add_options()("label_type", po::value(&label_type)->default_value("uint"), + program_options_utils::LABEL_TYPE_DESCRIPTION); + + // Merge required and optional parameters + desc.add(required_configs).add(optional_configs); + + po::variables_map vm; + po::store(po::parse_command_line(argc, argv, desc), vm); + if (vm.count("help")) + { + std::cout << desc; + return 0; + } + po::notify(vm); + use_pq_build = (build_PQ_bytes > 0); + use_opq = vm["use_opq"].as(); + } + catch (const std::exception &ex) + { + std::cerr << ex.what() << '\n'; + return -1; + } + + diskann::Metric metric; + if (dist_fn == std::string("mips")) + { + metric = diskann::Metric::INNER_PRODUCT; + } + else if (dist_fn == std::string("l2")) + { + metric = diskann::Metric::L2; + } + else if (dist_fn == std::string("cosine")) + { + metric = diskann::Metric::COSINE; + } + else + { + std::cout << "Unsupported distance function. Currently only L2/ Inner " + "Product/Cosine are supported." + << std::endl; + return -1; + } + + try + { + diskann::cout << "Starting index build with R: " << R << " Lbuild: " << L << " alpha: " << alpha + << " #threads: " << num_threads << std::endl; + + size_t data_num, data_dim; + diskann::get_bin_metadata(data_path, data_num, data_dim); + + auto config = diskann::IndexConfigBuilder() + .with_metric(metric) + .with_dimension(data_dim) + .with_max_points(data_num) + .with_data_load_store_strategy(diskann::MEMORY) + .with_data_type(data_type) + .with_label_type(label_type) + .is_dynamic_index(false) + .is_enable_tags(false) + .is_use_opq(use_opq) + .is_pq_dist_build(use_pq_build) + .with_num_pq_chunks(build_PQ_bytes) + .build(); + + auto index_build_params = diskann::IndexWriteParametersBuilder(L, R) + .with_filter_list_size(Lf) + .with_alpha(alpha) + .with_saturate_graph(false) + .with_num_threads(num_threads) + .build(); + + auto build_params = diskann::IndexBuildParamsBuilder(index_build_params) + .with_universal_label(universal_label) + .with_label_file(label_file) + .with_save_path_prefix(index_path_prefix) + .build(); + auto index_factory = diskann::IndexFactory(config); + auto index = index_factory.create_instance(); + index->build(data_path, data_num, build_params); + index->save(index_path_prefix.c_str()); + index.reset(); + return 0; + } + catch (const std::exception &e) + { + std::cout << std::string(e.what()) << std::endl; + diskann::cerr << "Index build failed." << std::endl; + return -1; + } +} diff --git a/apps/build_stitched_index.cpp b/apps/build_stitched_index.cpp new file mode 100644 index 000000000..80481f8b0 --- /dev/null +++ b/apps/build_stitched_index.cpp @@ -0,0 +1,439 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include +#include +#include "filter_utils.h" +#include +#ifndef _WINDOWS +#include +#endif + +#include "index.h" +#include "memory_mapper.h" +#include "parameters.h" +#include "utils.h" +#include "program_options_utils.hpp" + +namespace po = boost::program_options; +typedef std::tuple>, uint64_t> stitch_indices_return_values; + +/* + * Inline function to display progress bar. + */ +inline void print_progress(double percentage) +{ + int val = (int)(percentage * 100); + int lpad = (int)(percentage * PBWIDTH); + int rpad = PBWIDTH - lpad; + printf("\r%3d%% [%.*s%*s]", val, lpad, PBSTR, rpad, ""); + fflush(stdout); +} + +/* + * Inline function to generate a random integer in a range. + */ +inline size_t random(size_t range_from, size_t range_to) +{ + std::random_device rand_dev; + std::mt19937 generator(rand_dev()); + std::uniform_int_distribution distr(range_from, range_to); + return distr(generator); +} + +/* + * function to handle command line parsing. + * + * Arguments are merely the inputs from the command line. + */ +void handle_args(int argc, char **argv, std::string &data_type, path &input_data_path, path &final_index_path_prefix, + path &label_data_path, std::string &universal_label, uint32_t &num_threads, uint32_t &R, uint32_t &L, + uint32_t &stitched_R, float &alpha) +{ + po::options_description desc{ + program_options_utils::make_program_description("build_stitched_index", "Build a stitched DiskANN index.")}; + try + { + desc.add_options()("help,h", "Print information on arguments"); + + // Required parameters + po::options_description required_configs("Required"); + required_configs.add_options()("data_type", po::value(&data_type)->required(), + program_options_utils::DATA_TYPE_DESCRIPTION); + required_configs.add_options()("index_path_prefix", + po::value(&final_index_path_prefix)->required(), + program_options_utils::INDEX_PATH_PREFIX_DESCRIPTION); + required_configs.add_options()("data_path", po::value(&input_data_path)->required(), + program_options_utils::INPUT_DATA_PATH); + + // Optional parameters + po::options_description optional_configs("Optional"); + optional_configs.add_options()("num_threads,T", + po::value(&num_threads)->default_value(omp_get_num_procs()), + program_options_utils::NUMBER_THREADS_DESCRIPTION); + optional_configs.add_options()("max_degree,R", po::value(&R)->default_value(64), + program_options_utils::MAX_BUILD_DEGREE); + optional_configs.add_options()("Lbuild,L", po::value(&L)->default_value(100), + program_options_utils::GRAPH_BUILD_COMPLEXITY); + optional_configs.add_options()("alpha", po::value(&alpha)->default_value(1.2f), + program_options_utils::GRAPH_BUILD_ALPHA); + optional_configs.add_options()("label_file", po::value(&label_data_path)->default_value(""), + program_options_utils::LABEL_FILE); + optional_configs.add_options()("universal_label", po::value(&universal_label)->default_value(""), + program_options_utils::UNIVERSAL_LABEL); + optional_configs.add_options()("stitched_R", po::value(&stitched_R)->default_value(100), + "Degree to prune final graph down to"); + + // Merge required and optional parameters + desc.add(required_configs).add(optional_configs); + + po::variables_map vm; + po::store(po::parse_command_line(argc, argv, desc), vm); + if (vm.count("help")) + { + std::cout << desc; + exit(0); + } + po::notify(vm); + } + catch (const std::exception &ex) + { + std::cerr << ex.what() << '\n'; + throw; + } +} + +/* + * Custom index save to write the in-memory index to disk. + * Also writes required files for diskANN API - + * 1. labels_to_medoids + * 2. universal_label + * 3. data (redundant for static indices) + * 4. labels (redundant for static indices) + */ +void save_full_index(path final_index_path_prefix, path input_data_path, uint64_t final_index_size, + std::vector> stitched_graph, + tsl::robin_map entry_points, std::string universal_label, + path label_data_path) +{ + // aux. file 1 + auto saving_index_timer = std::chrono::high_resolution_clock::now(); + std::ifstream original_label_data_stream; + original_label_data_stream.exceptions(std::ios::badbit | std::ios::failbit); + original_label_data_stream.open(label_data_path, std::ios::binary); + std::ofstream new_label_data_stream; + new_label_data_stream.exceptions(std::ios::badbit | std::ios::failbit); + new_label_data_stream.open(final_index_path_prefix + "_labels.txt", std::ios::binary); + new_label_data_stream << original_label_data_stream.rdbuf(); + original_label_data_stream.close(); + new_label_data_stream.close(); + + // aux. file 2 + std::ifstream original_input_data_stream; + original_input_data_stream.exceptions(std::ios::badbit | std::ios::failbit); + original_input_data_stream.open(input_data_path, std::ios::binary); + std::ofstream new_input_data_stream; + new_input_data_stream.exceptions(std::ios::badbit | std::ios::failbit); + new_input_data_stream.open(final_index_path_prefix + ".data", std::ios::binary); + new_input_data_stream << original_input_data_stream.rdbuf(); + original_input_data_stream.close(); + new_input_data_stream.close(); + + // aux. file 3 + std::ofstream labels_to_medoids_writer; + labels_to_medoids_writer.exceptions(std::ios::badbit | std::ios::failbit); + labels_to_medoids_writer.open(final_index_path_prefix + "_labels_to_medoids.txt"); + for (auto iter : entry_points) + labels_to_medoids_writer << iter.first << ", " << iter.second << std::endl; + labels_to_medoids_writer.close(); + + // aux. file 4 (only if we're using a universal label) + if (universal_label != "") + { + std::ofstream universal_label_writer; + universal_label_writer.exceptions(std::ios::badbit | std::ios::failbit); + universal_label_writer.open(final_index_path_prefix + "_universal_label.txt"); + universal_label_writer << universal_label << std::endl; + universal_label_writer.close(); + } + + // main index + uint64_t index_num_frozen_points = 0, index_num_edges = 0; + uint32_t index_max_observed_degree = 0, index_entry_point = 0; + const size_t METADATA = 2 * sizeof(uint64_t) + 2 * sizeof(uint32_t); + for (auto &point_neighbors : stitched_graph) + { + index_max_observed_degree = std::max(index_max_observed_degree, (uint32_t)point_neighbors.size()); + } + + std::ofstream stitched_graph_writer; + stitched_graph_writer.exceptions(std::ios::badbit | std::ios::failbit); + stitched_graph_writer.open(final_index_path_prefix, std::ios_base::binary); + + stitched_graph_writer.write((char *)&final_index_size, sizeof(uint64_t)); + stitched_graph_writer.write((char *)&index_max_observed_degree, sizeof(uint32_t)); + stitched_graph_writer.write((char *)&index_entry_point, sizeof(uint32_t)); + stitched_graph_writer.write((char *)&index_num_frozen_points, sizeof(uint64_t)); + + size_t bytes_written = METADATA; + for (uint32_t node_point = 0; node_point < stitched_graph.size(); node_point++) + { + uint32_t current_node_num_neighbors = (uint32_t)stitched_graph[node_point].size(); + std::vector current_node_neighbors = stitched_graph[node_point]; + stitched_graph_writer.write((char *)¤t_node_num_neighbors, sizeof(uint32_t)); + bytes_written += sizeof(uint32_t); + for (const auto ¤t_node_neighbor : current_node_neighbors) + { + stitched_graph_writer.write((char *)¤t_node_neighbor, sizeof(uint32_t)); + bytes_written += sizeof(uint32_t); + } + index_num_edges += current_node_num_neighbors; + } + + if (bytes_written != final_index_size) + { + std::cerr << "Error: written bytes does not match allocated space" << std::endl; + throw; + } + + stitched_graph_writer.close(); + + std::chrono::duration saving_index_time = std::chrono::high_resolution_clock::now() - saving_index_timer; + std::cout << "Stitched graph written in " << saving_index_time.count() << " seconds" << std::endl; + std::cout << "Stitched graph average degree: " << ((float)index_num_edges) / ((float)(stitched_graph.size())) + << std::endl; + std::cout << "Stitched graph max degree: " << index_max_observed_degree << std::endl << std::endl; +} + +/* + * Unions the per-label graph indices together via the following policy: + * - any two nodes can only have at most one edge between them - + * + * Returns the "stitched" graph and its expected file size. + */ +template +stitch_indices_return_values stitch_label_indices( + path final_index_path_prefix, uint32_t total_number_of_points, label_set all_labels, + tsl::robin_map labels_to_number_of_points, + tsl::robin_map &label_entry_points, + tsl::robin_map> label_id_to_orig_id_map) +{ + size_t final_index_size = 0; + std::vector> stitched_graph(total_number_of_points); + + auto stitching_index_timer = std::chrono::high_resolution_clock::now(); + for (const auto &lbl : all_labels) + { + path curr_label_index_path(final_index_path_prefix + "_" + lbl); + std::vector> curr_label_index; + uint64_t curr_label_index_size; + uint32_t curr_label_entry_point; + + std::tie(curr_label_index, curr_label_index_size) = + diskann::load_label_index(curr_label_index_path, labels_to_number_of_points[lbl]); + curr_label_entry_point = (uint32_t)random(0, curr_label_index.size()); + label_entry_points[lbl] = label_id_to_orig_id_map[lbl][curr_label_entry_point]; + + for (uint32_t node_point = 0; node_point < curr_label_index.size(); node_point++) + { + uint32_t original_point_id = label_id_to_orig_id_map[lbl][node_point]; + for (auto &node_neighbor : curr_label_index[node_point]) + { + uint32_t original_neighbor_id = label_id_to_orig_id_map[lbl][node_neighbor]; + std::vector curr_point_neighbors = stitched_graph[original_point_id]; + if (std::find(curr_point_neighbors.begin(), curr_point_neighbors.end(), original_neighbor_id) == + curr_point_neighbors.end()) + { + stitched_graph[original_point_id].push_back(original_neighbor_id); + final_index_size += sizeof(uint32_t); + } + } + } + } + + const size_t METADATA = 2 * sizeof(uint64_t) + 2 * sizeof(uint32_t); + final_index_size += (total_number_of_points * sizeof(uint32_t) + METADATA); + + std::chrono::duration stitching_index_time = + std::chrono::high_resolution_clock::now() - stitching_index_timer; + std::cout << "stitched graph generated in memory in " << stitching_index_time.count() << " seconds" << std::endl; + + return std::make_tuple(stitched_graph, final_index_size); +} + +/* + * Applies the prune_neighbors function from src/index.cpp to + * every node in the stitched graph. + * + * This is an optional step, hence the saving of both the full + * and pruned graph. + */ +template +void prune_and_save(path final_index_path_prefix, path full_index_path_prefix, path input_data_path, + std::vector> stitched_graph, uint32_t stitched_R, + tsl::robin_map label_entry_points, std::string universal_label, + path label_data_path, uint32_t num_threads) +{ + size_t dimension, number_of_label_points; + auto diskann_cout_buffer = diskann::cout.rdbuf(nullptr); + auto std_cout_buffer = std::cout.rdbuf(nullptr); + auto pruning_index_timer = std::chrono::high_resolution_clock::now(); + + diskann::get_bin_metadata(input_data_path, number_of_label_points, dimension); + diskann::Index index(diskann::Metric::L2, dimension, number_of_label_points, false, false); + + // not searching this index, set search_l to 0 + index.load(full_index_path_prefix.c_str(), num_threads, 1); + + std::cout << "parsing labels" << std::endl; + + index.prune_all_neighbors(stitched_R, 750, 1.2); + index.save((final_index_path_prefix).c_str()); + + diskann::cout.rdbuf(diskann_cout_buffer); + std::cout.rdbuf(std_cout_buffer); + std::chrono::duration pruning_index_time = std::chrono::high_resolution_clock::now() - pruning_index_timer; + std::cout << "pruning performed in " << pruning_index_time.count() << " seconds\n" << std::endl; +} + +/* + * Delete all temporary artifacts. + * In the process of creating the stitched index, some temporary artifacts are + * created: + * 1. the separate bin files for each labels' points + * 2. the separate diskANN indices built for each label + * 3. the '.data' file created while generating the indices + */ +void clean_up_artifacts(path input_data_path, path final_index_path_prefix, label_set all_labels) +{ + for (const auto &lbl : all_labels) + { + path curr_label_input_data_path(input_data_path + "_" + lbl); + path curr_label_index_path(final_index_path_prefix + "_" + lbl); + path curr_label_index_path_data(curr_label_index_path + ".data"); + + if (std::remove(curr_label_index_path.c_str()) != 0) + throw; + if (std::remove(curr_label_input_data_path.c_str()) != 0) + throw; + if (std::remove(curr_label_index_path_data.c_str()) != 0) + throw; + } +} + +int main(int argc, char **argv) +{ + // 1. handle cmdline inputs + std::string data_type; + path input_data_path, final_index_path_prefix, label_data_path; + std::string universal_label; + uint32_t num_threads, R, L, stitched_R; + float alpha; + + auto index_timer = std::chrono::high_resolution_clock::now(); + handle_args(argc, argv, data_type, input_data_path, final_index_path_prefix, label_data_path, universal_label, + num_threads, R, L, stitched_R, alpha); + + path labels_file_to_use = final_index_path_prefix + "_label_formatted.txt"; + path labels_map_file = final_index_path_prefix + "_labels_map.txt"; + + convert_labels_string_to_int(label_data_path, labels_file_to_use, labels_map_file, universal_label); + + // 2. parse label file and create necessary data structures + std::vector point_ids_to_labels; + tsl::robin_map labels_to_number_of_points; + label_set all_labels; + + std::tie(point_ids_to_labels, labels_to_number_of_points, all_labels) = + diskann::parse_label_file(labels_file_to_use, universal_label); + + // 3. for each label, make a separate data file + tsl::robin_map> label_id_to_orig_id_map; + uint32_t total_number_of_points = (uint32_t)point_ids_to_labels.size(); + +#ifndef _WINDOWS + if (data_type == "uint8") + label_id_to_orig_id_map = diskann::generate_label_specific_vector_files( + input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); + else if (data_type == "int8") + label_id_to_orig_id_map = diskann::generate_label_specific_vector_files( + input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); + else if (data_type == "float") + label_id_to_orig_id_map = diskann::generate_label_specific_vector_files( + input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); + else + throw; +#else + if (data_type == "uint8") + label_id_to_orig_id_map = diskann::generate_label_specific_vector_files_compat( + input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); + else if (data_type == "int8") + label_id_to_orig_id_map = diskann::generate_label_specific_vector_files_compat( + input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); + else if (data_type == "float") + label_id_to_orig_id_map = diskann::generate_label_specific_vector_files_compat( + input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); + else + throw; +#endif + + // 4. for each created data file, create a vanilla diskANN index + if (data_type == "uint8") + diskann::generate_label_indices(input_data_path, final_index_path_prefix, all_labels, R, L, alpha, + num_threads); + else if (data_type == "int8") + diskann::generate_label_indices(input_data_path, final_index_path_prefix, all_labels, R, L, alpha, + num_threads); + else if (data_type == "float") + diskann::generate_label_indices(input_data_path, final_index_path_prefix, all_labels, R, L, alpha, + num_threads); + else + throw; + + // 5. "stitch" the indices together + std::vector> stitched_graph; + tsl::robin_map label_entry_points; + uint64_t stitched_graph_size; + + if (data_type == "uint8") + std::tie(stitched_graph, stitched_graph_size) = + stitch_label_indices(final_index_path_prefix, total_number_of_points, all_labels, + labels_to_number_of_points, label_entry_points, label_id_to_orig_id_map); + else if (data_type == "int8") + std::tie(stitched_graph, stitched_graph_size) = + stitch_label_indices(final_index_path_prefix, total_number_of_points, all_labels, + labels_to_number_of_points, label_entry_points, label_id_to_orig_id_map); + else if (data_type == "float") + std::tie(stitched_graph, stitched_graph_size) = + stitch_label_indices(final_index_path_prefix, total_number_of_points, all_labels, + labels_to_number_of_points, label_entry_points, label_id_to_orig_id_map); + else + throw; + path full_index_path_prefix = final_index_path_prefix + "_full"; + // 5a. save the stitched graph to disk + save_full_index(full_index_path_prefix, input_data_path, stitched_graph_size, stitched_graph, label_entry_points, + universal_label, labels_file_to_use); + + // 6. run a prune on the stitched index, and save to disk + if (data_type == "uint8") + prune_and_save(final_index_path_prefix, full_index_path_prefix, input_data_path, stitched_graph, + stitched_R, label_entry_points, universal_label, labels_file_to_use, num_threads); + else if (data_type == "int8") + prune_and_save(final_index_path_prefix, full_index_path_prefix, input_data_path, stitched_graph, + stitched_R, label_entry_points, universal_label, labels_file_to_use, num_threads); + else if (data_type == "float") + prune_and_save(final_index_path_prefix, full_index_path_prefix, input_data_path, stitched_graph, + stitched_R, label_entry_points, universal_label, labels_file_to_use, num_threads); + else + throw; + + std::chrono::duration index_time = std::chrono::high_resolution_clock::now() - index_timer; + std::cout << "pruned/stitched graph generated in " << index_time.count() << " seconds" << std::endl; + + clean_up_artifacts(input_data_path, final_index_path_prefix, all_labels); +} diff --git a/tests/python/README.md b/apps/python/README.md similarity index 100% rename from tests/python/README.md rename to apps/python/README.md diff --git a/tests/python/requirements.txt b/apps/python/requirements.txt similarity index 100% rename from tests/python/requirements.txt rename to apps/python/requirements.txt diff --git a/tests/python/restapi/__init__.py b/apps/python/restapi/__init__.py similarity index 100% rename from tests/python/restapi/__init__.py rename to apps/python/restapi/__init__.py diff --git a/tests/python/restapi/disk_ann_util.py b/apps/python/restapi/disk_ann_util.py similarity index 93% rename from tests/python/restapi/disk_ann_util.py rename to apps/python/restapi/disk_ann_util.py index 624a68538..ec8931035 100644 --- a/tests/python/restapi/disk_ann_util.py +++ b/apps/python/restapi/disk_ann_util.py @@ -20,7 +20,7 @@ def output_vectors( # there is probably a clever way to have numpy write out C++ friendly floats, so feel free to remove this in # favor of something more sane later vectors_as_bin_path = os.path.join(temporary_file_path, "vectors.bin") - tsv_to_bin_path = os.path.join(diskann_build_path, "tests", "utils", "tsv_to_bin") + tsv_to_bin_path = os.path.join(diskann_build_path, "apps", "utils", "tsv_to_bin") number_of_points, dimensions = vectors.shape args = [ @@ -45,7 +45,7 @@ def build_ssd_index( ): vectors_as_bin_path = output_vectors(diskann_build_path, temporary_file_path, vectors, timeout=per_process_timeout) - ssd_builder_path = os.path.join(diskann_build_path, "tests", "build_disk_index") + ssd_builder_path = os.path.join(diskann_build_path, "apps", "build_disk_index") args = [ ssd_builder_path, "--data_type", "float", diff --git a/tests/python/restapi/test_ssd_rest_api.py b/apps/python/restapi/test_ssd_rest_api.py similarity index 98% rename from tests/python/restapi/test_ssd_rest_api.py rename to apps/python/restapi/test_ssd_rest_api.py index 6493893c7..281d246d3 100644 --- a/tests/python/restapi/test_ssd_rest_api.py +++ b/apps/python/restapi/test_ssd_rest_api.py @@ -67,7 +67,7 @@ def setUpClass(cls): rest_port = rng.integers(10000, 10100) cls._rest_address = f"http://127.0.0.1:{rest_port}/" - ssd_server_path = os.path.join(diskann_build_dir, "tests", "restapi", "ssd_server") + ssd_server_path = os.path.join(diskann_build_dir, "apps", "restapi", "ssd_server") args = [ ssd_server_path, diff --git a/tests/range_search_disk_index.cpp b/apps/range_search_disk_index.cpp similarity index 72% rename from tests/range_search_disk_index.cpp rename to apps/range_search_disk_index.cpp index 2120c2f6c..31675724b 100644 --- a/tests/range_search_disk_index.cpp +++ b/apps/range_search_disk_index.cpp @@ -15,6 +15,7 @@ #include "pq_flash_index.h" #include "partition.h" #include "timer.h" +#include "program_options_utils.hpp" #ifndef _WINDOWS #include @@ -51,8 +52,8 @@ void print_stats(std::string category, std::vector percentiles, std::vect template int search_disk_index(diskann::Metric &metric, const std::string &index_path_prefix, const std::string &query_file, - std::string >_file, const unsigned num_threads, const float search_range, - const unsigned beamwidth, const unsigned num_nodes_to_cache, const std::vector &Lvec) + std::string >_file, const uint32_t num_threads, const float search_range, + const uint32_t beamwidth, const uint32_t num_nodes_to_cache, const std::vector &Lvec) { std::string pq_prefix = index_path_prefix + "_pq"; std::string disk_index_file = index_path_prefix + "_disk.index"; @@ -66,7 +67,7 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre // load query bin T *query = nullptr; - std::vector> groundtruth_ids; + std::vector> groundtruth_ids; size_t query_num, query_dim, query_aligned_dim, gt_num; diskann::load_aligned_bin(query_file, query, query_num, query_dim, query_aligned_dim); @@ -110,7 +111,8 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre 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); + // 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(); @@ -129,7 +131,7 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre } else { - warmup_num = (std::min)((_u32)150000, (_u32)15000 * num_threads); + warmup_num = (std::min)((uint32_t)150000, (uint32_t)15000 * num_threads); warmup_dim = query_dim; warmup_aligned_dim = query_aligned_dim; diskann::alloc_aligned(((void **)&warmup), warmup_num * warmup_aligned_dim * sizeof(T), 8 * sizeof(T)); @@ -150,7 +152,7 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre 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++) + for (int64_t 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), @@ -183,7 +185,7 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre for (uint32_t test_id = 0; test_id < Lvec.size(); test_id++) { - _u64 L = Lvec[test_id]; + uint32_t L = Lvec[test_id]; if (beamwidth <= 0) { @@ -200,16 +202,17 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre 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++) + for (int64_t i = 0; i < (int64_t)query_num; i++) { - std::vector<_u64> indices; + std::vector indices; std::vector distances; - _u32 res_count = _pFlashIndex->range_search(query + (i * query_aligned_dim), search_range, L, max_list_size, - indices, distances, optimized_beamwidth, stats + i); + uint32_t res_count = + _pFlashIndex->range_search(query + (i * query_aligned_dim), search_range, L, max_list_size, indices, + distances, optimized_beamwidth, stats + i); query_result_ids[test_id][i].reserve(res_count); query_result_ids[test_id][i].resize(res_count); - for (_u32 idx = 0; idx < res_count; idx++) - query_result_ids[test_id][i][idx] = indices[idx]; + for (uint32_t idx = 0; idx < res_count; idx++) + query_result_ids[test_id][i][idx] = (uint32_t)indices[idx]; } auto e = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = e - s; @@ -221,24 +224,25 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre auto latency_999 = diskann::get_percentile_stats( stats, query_num, 0.999, [](const diskann::QueryStats &stats) { return stats.total_us; }); - auto mean_ios = diskann::get_mean_stats(stats, query_num, + auto mean_ios = diskann::get_mean_stats(stats, query_num, [](const diskann::QueryStats &stats) { return stats.n_ios; }); - float mean_cpuus = diskann::get_mean_stats( + double mean_cpuus = diskann::get_mean_stats( stats, query_num, [](const diskann::QueryStats &stats) { return stats.cpu_us; }); - float recall = 0; - float ratio_of_sums = 0; + double recall = 0; + double ratio_of_sums = 0; if (calc_recall_flag) { - recall = diskann::calculate_range_search_recall(query_num, groundtruth_ids, query_result_ids[test_id]); + recall = + diskann::calculate_range_search_recall((uint32_t)query_num, groundtruth_ids, query_result_ids[test_id]); - _u32 total_true_positive = 0; - _u32 total_positive = 0; - for (_u32 i = 0; i < query_num; i++) + uint32_t total_true_positive = 0; + uint32_t total_positive = 0; + for (uint32_t i = 0; i < query_num; i++) { - total_true_positive += query_result_ids[test_id][i].size(); - total_positive += groundtruth_ids[i].size(); + total_true_positive += (uint32_t)query_result_ids[test_id][i].size(); + total_positive += (uint32_t)groundtruth_ids[i].size(); } ratio_of_sums = (1.0 * total_true_positive) / (1.0 * total_positive); @@ -266,33 +270,46 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre int main(int argc, char **argv) { std::string data_type, dist_fn, index_path_prefix, result_path_prefix, query_file, gt_file; - unsigned num_threads, W, num_nodes_to_cache; - std::vector Lvec; + uint32_t num_threads, W, num_nodes_to_cache; + std::vector Lvec; float range; - po::options_description desc{"Arguments"}; + po::options_description desc{program_options_utils::make_program_description( + "range_search_disk_index", "Searches disk DiskANN indexes using ranges")}; try { desc.add_options()("help,h", "Print information on arguments"); - desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); - desc.add_options()("dist_fn", po::value(&dist_fn)->required(), - "distance function "); - desc.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), - "Path prefix to the index"); - desc.add_options()("query_file", po::value(&query_file)->required(), - "Query file in binary format"); - desc.add_options()("gt_file", po::value(>_file)->default_value(std::string("null")), - "ground truth file for the queryset"); - desc.add_options()("range_threshold,K", po::value(&range)->required(), - "Number of neighbors to be returned"); - desc.add_options()("search_list,L", po::value>(&Lvec)->multitoken(), - "List of L values of search"); - desc.add_options()("beamwidth,W", po::value(&W)->default_value(2), "Beamwidth for search"); - desc.add_options()("num_nodes_to_cache", po::value(&num_nodes_to_cache)->default_value(100000), - "Beamwidth for search"); - desc.add_options()("num_threads,T", po::value(&num_threads)->default_value(omp_get_num_procs()), - "Number of threads used for building index (defaults to " - "omp_get_num_procs())"); + + // Required parameters + po::options_description required_configs("Required"); + required_configs.add_options()("data_type", po::value(&data_type)->required(), + program_options_utils::DATA_TYPE_DESCRIPTION); + required_configs.add_options()("dist_fn", po::value(&dist_fn)->required(), + program_options_utils::DISTANCE_FUNCTION_DESCRIPTION); + required_configs.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), + program_options_utils::INDEX_PATH_PREFIX_DESCRIPTION); + required_configs.add_options()("query_file", po::value(&query_file)->required(), + program_options_utils::QUERY_FILE_DESCRIPTION); + required_configs.add_options()("search_list,L", + po::value>(&Lvec)->multitoken()->required(), + program_options_utils::SEARCH_LIST_DESCRIPTION); + required_configs.add_options()("range_threshold,K", po::value(&range)->required(), + "Number of neighbors to be returned"); + + // Optional parameters + po::options_description optional_configs("Optional"); + optional_configs.add_options()("num_threads,T", + po::value(&num_threads)->default_value(omp_get_num_procs()), + program_options_utils::NUMBER_THREADS_DESCRIPTION); + optional_configs.add_options()("gt_file", po::value(>_file)->default_value(std::string("null")), + program_options_utils::GROUND_TRUTH_FILE_DESCRIPTION); + optional_configs.add_options()("num_nodes_to_cache", po::value(&num_nodes_to_cache)->default_value(0), + program_options_utils::NUMBER_OF_NODES_TO_CACHE); + optional_configs.add_options()("beamwidth,W", po::value(&W)->default_value(2), + program_options_utils::BEAMWIDTH); + + // Merge required and optional parameters + desc.add(required_configs).add(optional_configs); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); diff --git a/tests/restapi/CMakeLists.txt b/apps/restapi/CMakeLists.txt similarity index 98% rename from tests/restapi/CMakeLists.txt rename to apps/restapi/CMakeLists.txt index e0f31a9c1..c73b427d2 100644 --- a/tests/restapi/CMakeLists.txt +++ b/apps/restapi/CMakeLists.txt @@ -1,7 +1,7 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT license. -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) add_executable(inmem_server inmem_server.cpp) if(MSVC) diff --git a/tests/restapi/client.cpp b/apps/restapi/client.cpp similarity index 100% rename from tests/restapi/client.cpp rename to apps/restapi/client.cpp diff --git a/tests/restapi/inmem_server.cpp b/apps/restapi/inmem_server.cpp similarity index 100% rename from tests/restapi/inmem_server.cpp rename to apps/restapi/inmem_server.cpp diff --git a/tests/restapi/main.cpp b/apps/restapi/main.cpp similarity index 100% rename from tests/restapi/main.cpp rename to apps/restapi/main.cpp diff --git a/tests/restapi/multiple_ssdindex_server.cpp b/apps/restapi/multiple_ssdindex_server.cpp similarity index 100% rename from tests/restapi/multiple_ssdindex_server.cpp rename to apps/restapi/multiple_ssdindex_server.cpp diff --git a/tests/restapi/ssd_server.cpp b/apps/restapi/ssd_server.cpp similarity index 100% rename from tests/restapi/ssd_server.cpp rename to apps/restapi/ssd_server.cpp diff --git a/tests/search_disk_index.cpp b/apps/search_disk_index.cpp similarity index 66% rename from tests/search_disk_index.cpp rename to apps/search_disk_index.cpp index b1d04d7c6..b46b37aef 100644 --- a/tests/search_disk_index.cpp +++ b/apps/search_disk_index.cpp @@ -12,6 +12,7 @@ #include "pq_flash_index.h" #include "timer.h" #include "percentile_stats.h" +#include "program_options_utils.hpp" #ifndef _WINDOWS #include @@ -49,34 +50,43 @@ void print_stats(std::string category, std::vector percentiles, std::vect template int search_disk_index(diskann::Metric &metric, const std::string &index_path_prefix, const std::string &result_output_prefix, const std::string &query_file, std::string >_file, - const unsigned num_threads, const unsigned recall_at, const unsigned beamwidth, - const unsigned num_nodes_to_cache, const _u32 search_io_limit, const std::vector &Lvec, - const float fail_if_recall_below, const bool use_reorder_data = false, - const std::string &filter_label = "") + const uint32_t num_threads, const uint32_t recall_at, const uint32_t beamwidth, + const uint32_t num_nodes_to_cache, const uint32_t search_io_limit, + const std::vector &Lvec, const float fail_if_recall_below, + const std::vector &query_filters, const bool use_reorder_data = false) { diskann::cout << "Search parameters: #threads: " << num_threads << ", "; if (beamwidth <= 0) diskann::cout << "beamwidth to be optimized for each L value" << std::flush; else diskann::cout << " beamwidth: " << beamwidth << std::flush; - if (search_io_limit == std::numeric_limits<_u32>::max()) + if (search_io_limit == std::numeric_limits::max()) diskann::cout << "." << std::endl; else diskann::cout << ", io_limit: " << search_io_limit << "." << std::endl; - bool filtered_search = false; - if (filter_label != "") - filtered_search = true; - std::string warmup_query_file = index_path_prefix + "_sample_data.bin"; // load query bin T *query = nullptr; - unsigned *gt_ids = nullptr; + uint32_t *gt_ids = nullptr; float *gt_dists = nullptr; size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; diskann::load_aligned_bin(query_file, query, query_num, query_dim, query_aligned_dim); + bool filtered_search = false; + if (!query_filters.empty()) + { + filtered_search = true; + if (query_filters.size() != 1 && query_filters.size() != query_num) + { + std::cout << "Error. Mismatch in number of queries and size of query " + "filters file" + << std::endl; + return -1; // To return -1 or some other error handling? + } + } + bool calc_recall_flag = false; if (gt_file != std::string("null") && gt_file != std::string("NULL") && file_exists(gt_file)) { @@ -133,7 +143,7 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre } else { - warmup_num = (std::min)((_u32)150000, (_u32)15000 * num_threads); + warmup_num = (std::min)((uint32_t)150000, (uint32_t)15000 * num_threads); warmup_dim = query_dim; warmup_aligned_dim = query_aligned_dim; diskann::alloc_aligned(((void **)&warmup), warmup_num * warmup_aligned_dim * sizeof(T), 8 * sizeof(T)); @@ -154,7 +164,7 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre 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++) + for (int64_t 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), @@ -185,11 +195,11 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre uint32_t optimized_beamwidth = 2; - float best_recall = 0.0; + double best_recall = 0.0; for (uint32_t test_id = 0; test_id < Lvec.size(); test_id++) { - _u64 L = Lvec[test_id]; + uint32_t L = Lvec[test_id]; if (L < recall_at) { @@ -215,7 +225,7 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre 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++) + for (int64_t i = 0; i < (int64_t)query_num; i++) { if (!filtered_search) { @@ -226,7 +236,15 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre } else { - LabelT label_for_search = _pFlashIndex->get_converted_label(filter_label); + LabelT label_for_search; + if (query_filters.size() == 1) + { // one label for all queries + label_for_search = _pFlashIndex->get_converted_label(query_filters[0]); + } + else + { // one label for each query + label_for_search = _pFlashIndex->get_converted_label(query_filters[i]); + } _pFlashIndex->cached_beam_search( query + (i * query_aligned_dim), recall_at, L, query_result_ids_64.data() + (i * recall_at), query_result_dists[test_id].data() + (i * recall_at), optimized_beamwidth, true, label_for_search, @@ -235,7 +253,7 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre } auto e = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = e - s; - float qps = (1.0 * query_num) / (1.0 * diff.count()); + double qps = (1.0 * query_num) / (1.0 * diff.count()); diskann::convert_types(query_result_ids_64.data(), query_result_ids[test_id].data(), query_num, recall_at); @@ -246,17 +264,17 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre auto latency_999 = diskann::get_percentile_stats( stats, query_num, 0.999, [](const diskann::QueryStats &stats) { return stats.total_us; }); - auto mean_ios = diskann::get_mean_stats(stats, query_num, + auto mean_ios = diskann::get_mean_stats(stats, query_num, [](const diskann::QueryStats &stats) { return stats.n_ios; }); auto mean_cpuus = diskann::get_mean_stats(stats, query_num, [](const diskann::QueryStats &stats) { return stats.cpu_us; }); - float recall = 0; + double 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 = diskann::calculate_recall((uint32_t)query_num, gt_ids, gt_dists, (uint32_t)gt_dim, + query_result_ids[test_id].data(), recall_at, recall_at); best_recall = std::max(recall, best_recall); } @@ -273,14 +291,14 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre } diskann::cout << "Done searching. Now saving results " << std::endl; - _u64 test_id = 0; + uint64_t test_id = 0; for (auto L : Lvec) { if (L < recall_at) continue; 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); + diskann::save_bin(cur_result_path, query_result_ids[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); @@ -295,51 +313,68 @@ int search_disk_index(diskann::Metric &metric, const std::string &index_path_pre int main(int argc, char **argv) { std::string data_type, dist_fn, index_path_prefix, result_path_prefix, query_file, gt_file, filter_label, - label_type; - unsigned num_threads, K, W, num_nodes_to_cache, search_io_limit; - std::vector Lvec; + label_type, query_filters_file; + uint32_t num_threads, K, W, num_nodes_to_cache, search_io_limit; + std::vector Lvec; bool use_reorder_data = false; float fail_if_recall_below = 0.0f; - po::options_description desc{"Arguments"}; + po::options_description desc{ + program_options_utils::make_program_description("search_disk_index", "Searches on-disk DiskANN indexes")}; try { desc.add_options()("help,h", "Print information on arguments"); - desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); - desc.add_options()("dist_fn", po::value(&dist_fn)->required(), - "distance function "); - desc.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), - "Path prefix to the index"); - desc.add_options()("result_path", po::value(&result_path_prefix)->required(), - "Path prefix for saving results of the queries"); - desc.add_options()("query_file", po::value(&query_file)->required(), - "Query file in binary format"); - desc.add_options()("gt_file", po::value(>_file)->default_value(std::string("null")), - "ground truth file for the queryset"); - desc.add_options()("recall_at,K", po::value(&K)->required(), "Number of neighbors to be returned"); - desc.add_options()("search_list,L", po::value>(&Lvec)->multitoken(), - "List of L values of search"); - desc.add_options()("beamwidth,W", po::value(&W)->default_value(2), - "Beamwidth for search. Set 0 to optimize internally."); - desc.add_options()("num_nodes_to_cache", po::value(&num_nodes_to_cache)->default_value(0), - "Beamwidth for search"); - desc.add_options()("search_io_limit", - po::value(&search_io_limit)->default_value(std::numeric_limits<_u32>::max()), - "Max #IOs for search"); - desc.add_options()("num_threads,T", po::value(&num_threads)->default_value(omp_get_num_procs()), - "Number of threads used for building index (defaults to " - "omp_get_num_procs())"); - desc.add_options()("use_reorder_data", po::bool_switch()->default_value(false), - "Include full precision data in the index. Use only in " - "conjuction with compressed data on SSD."); - desc.add_options()("filter_label", po::value(&filter_label)->default_value(std::string("")), - "Filter Label for Filtered Search"); - desc.add_options()("label_type", po::value(&label_type)->default_value("uint"), - "Storage type of Labels , default value is uint which " - "will consume memory 4 bytes per filter"); - desc.add_options()("fail_if_recall_below", po::value(&fail_if_recall_below)->default_value(0.0f), - "If set to a value >0 and <100%, program returns -1 if best recall " - "found is below this threshold. "); + + // Required parameters + po::options_description required_configs("Required"); + required_configs.add_options()("data_type", po::value(&data_type)->required(), + program_options_utils::DATA_TYPE_DESCRIPTION); + required_configs.add_options()("dist_fn", po::value(&dist_fn)->required(), + program_options_utils::DISTANCE_FUNCTION_DESCRIPTION); + required_configs.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), + program_options_utils::INDEX_PATH_PREFIX_DESCRIPTION); + required_configs.add_options()("result_path", po::value(&result_path_prefix)->required(), + program_options_utils::RESULT_PATH_DESCRIPTION); + required_configs.add_options()("query_file", po::value(&query_file)->required(), + program_options_utils::QUERY_FILE_DESCRIPTION); + required_configs.add_options()("recall_at,K", po::value(&K)->required(), + program_options_utils::NUMBER_OF_RESULTS_DESCRIPTION); + required_configs.add_options()("search_list,L", + po::value>(&Lvec)->multitoken()->required(), + program_options_utils::SEARCH_LIST_DESCRIPTION); + + // Optional parameters + po::options_description optional_configs("Optional"); + optional_configs.add_options()("gt_file", po::value(>_file)->default_value(std::string("null")), + program_options_utils::GROUND_TRUTH_FILE_DESCRIPTION); + optional_configs.add_options()("beamwidth,W", po::value(&W)->default_value(2), + program_options_utils::BEAMWIDTH); + optional_configs.add_options()("num_nodes_to_cache", po::value(&num_nodes_to_cache)->default_value(0), + program_options_utils::NUMBER_OF_NODES_TO_CACHE); + optional_configs.add_options()( + "search_io_limit", + po::value(&search_io_limit)->default_value(std::numeric_limits::max()), + "Max #IOs for search. Default value: uint32::max()"); + optional_configs.add_options()("num_threads,T", + po::value(&num_threads)->default_value(omp_get_num_procs()), + program_options_utils::NUMBER_THREADS_DESCRIPTION); + optional_configs.add_options()("use_reorder_data", po::bool_switch()->default_value(false), + "Include full precision data in the index. Use only in " + "conjuction with compressed data on SSD. Default value: false"); + optional_configs.add_options()("filter_label", + po::value(&filter_label)->default_value(std::string("")), + program_options_utils::FILTER_LABEL_DESCRIPTION); + optional_configs.add_options()("query_filters_file", + po::value(&query_filters_file)->default_value(std::string("")), + program_options_utils::FILTERS_FILE_DESCRIPTION); + optional_configs.add_options()("label_type", po::value(&label_type)->default_value("uint"), + program_options_utils::LABEL_TYPE_DESCRIPTION); + optional_configs.add_options()("fail_if_recall_below", + po::value(&fail_if_recall_below)->default_value(0.0f), + program_options_utils::FAIL_IF_RECALL_BELOW); + + // Merge required and optional parameters + desc.add(required_configs).add(optional_configs); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); @@ -393,22 +428,38 @@ int main(int argc, char **argv) return -1; } + if (filter_label != "" && query_filters_file != "") + { + std::cerr << "Only one of filter_label and query_filters_file should be provided" << std::endl; + return -1; + } + + std::vector query_filters; + if (filter_label != "") + { + query_filters.push_back(filter_label); + } + else if (query_filters_file != "") + { + query_filters = read_file_to_vector_of_strings(query_filters_file); + } + try { - if (filter_label != "" && label_type == "ushort") + if (!query_filters.empty() && label_type == "ushort") { if (data_type == std::string("float")) return search_disk_index( metric, index_path_prefix, result_path_prefix, query_file, gt_file, num_threads, K, W, - num_nodes_to_cache, search_io_limit, Lvec, fail_if_recall_below, use_reorder_data, filter_label); + num_nodes_to_cache, search_io_limit, Lvec, fail_if_recall_below, query_filters, use_reorder_data); else if (data_type == std::string("int8")) return search_disk_index( metric, index_path_prefix, result_path_prefix, query_file, gt_file, num_threads, K, W, - num_nodes_to_cache, search_io_limit, Lvec, fail_if_recall_below, use_reorder_data, filter_label); + num_nodes_to_cache, search_io_limit, Lvec, fail_if_recall_below, query_filters, use_reorder_data); else if (data_type == std::string("uint8")) return search_disk_index( metric, index_path_prefix, result_path_prefix, query_file, gt_file, num_threads, K, W, - num_nodes_to_cache, search_io_limit, Lvec, fail_if_recall_below, use_reorder_data, filter_label); + num_nodes_to_cache, search_io_limit, Lvec, fail_if_recall_below, query_filters, use_reorder_data); else { std::cerr << "Unsupported data type. Use float or int8 or uint8" << std::endl; @@ -420,15 +471,15 @@ int main(int argc, char **argv) if (data_type == std::string("float")) return search_disk_index(metric, index_path_prefix, result_path_prefix, query_file, gt_file, num_threads, K, W, num_nodes_to_cache, search_io_limit, Lvec, - fail_if_recall_below, use_reorder_data, filter_label); + fail_if_recall_below, query_filters, use_reorder_data); else if (data_type == std::string("int8")) return search_disk_index(metric, index_path_prefix, result_path_prefix, query_file, gt_file, num_threads, K, W, num_nodes_to_cache, search_io_limit, Lvec, - fail_if_recall_below, use_reorder_data, filter_label); + fail_if_recall_below, query_filters, use_reorder_data); else if (data_type == std::string("uint8")) return search_disk_index(metric, index_path_prefix, result_path_prefix, query_file, gt_file, num_threads, K, W, num_nodes_to_cache, search_io_limit, Lvec, - fail_if_recall_below, use_reorder_data, filter_label); + fail_if_recall_below, query_filters, use_reorder_data); else { std::cerr << "Unsupported data type. Use float or int8 or uint8" << std::endl; diff --git a/tests/search_memory_index.cpp b/apps/search_memory_index.cpp similarity index 52% rename from tests/search_memory_index.cpp rename to apps/search_memory_index.cpp index 4e093998d..44817242c 100644 --- a/tests/search_memory_index.cpp +++ b/apps/search_memory_index.cpp @@ -20,24 +20,26 @@ #include "index.h" #include "memory_mapper.h" #include "utils.h" +#include "program_options_utils.hpp" +#include "index_factory.h" namespace po = boost::program_options; template int search_memory_index(diskann::Metric &metric, const std::string &index_path, const std::string &result_path_prefix, - const std::string &query_file, const std::string &truthset_file, const unsigned num_threads, - const unsigned recall_at, const bool print_all_recalls, const std::vector &Lvec, + const std::string &query_file, const std::string &truthset_file, const uint32_t num_threads, + const uint32_t recall_at, const bool print_all_recalls, const std::vector &Lvec, const bool dynamic, const bool tags, const bool show_qps_per_thread, - const std::string &filter_label, const float fail_if_recall_below) + const std::vector &query_filters, const float fail_if_recall_below) { + using TagT = uint32_t; // Load the query file T *query = nullptr; - unsigned *gt_ids = nullptr; + uint32_t *gt_ids = nullptr; float *gt_dists = nullptr; size_t query_num, query_dim, query_aligned_dim, gt_num, gt_dim; diskann::load_aligned_bin(query_file, query, query_num, query_dim, query_aligned_dim); - // Check for ground truth bool calc_recall_flag = false; if (truthset_file != std::string("null") && file_exists(truthset_file)) { @@ -54,30 +56,50 @@ int search_memory_index(diskann::Metric &metric, const std::string &index_path, } bool filtered_search = false; - if (filter_label != "") + if (!query_filters.empty()) { filtered_search = true; + if (query_filters.size() != 1 && query_filters.size() != query_num) + { + std::cout << "Error. Mismatch in number of queries and size of query " + "filters file" + << std::endl; + return -1; // To return -1 or some other error handling? + } } - using TagT = uint32_t; - const bool concurrent = false, pq_dist_build = false, use_opq = false; - const size_t num_pq_chunks = 0; - using IndexType = diskann::Index; - const size_t num_frozen_pts = IndexType::get_graph_num_frozen_points(index_path); - IndexType index(metric, query_dim, 0, dynamic, tags, concurrent, pq_dist_build, num_pq_chunks, use_opq, - num_frozen_pts); - std::cout << "Index class instantiated" << std::endl; - index.load(index_path.c_str(), num_threads, *(std::max_element(Lvec.begin(), Lvec.end()))); + const size_t num_frozen_pts = diskann::get_graph_num_frozen_points(index_path); + + auto config = diskann::IndexConfigBuilder() + .with_metric(metric) + .with_dimension(query_dim) + .with_max_points(0) + .with_data_load_store_strategy(diskann::MEMORY) + .with_data_type(diskann_type_to_name()) + .with_label_type(diskann_type_to_name()) + .with_tag_type(diskann_type_to_name()) + .is_dynamic_index(dynamic) + .is_enable_tags(tags) + .is_concurrent_consolidate(false) + .is_pq_dist_build(false) + .is_use_opq(false) + .with_num_pq_chunks(0) + .with_num_frozen_pts(num_frozen_pts) + .build(); + + auto index_factory = diskann::IndexFactory(config); + auto index = index_factory.create_instance(); + index->load(index_path.c_str(), num_threads, *(std::max_element(Lvec.begin(), Lvec.end()))); std::cout << "Index loaded" << std::endl; + if (metric == diskann::FAST_L2) - index.optimize_index_layout(); + index->optimize_index_layout(); std::cout << "Using " << num_threads << " threads to search" << std::endl; - diskann::Parameters paras; std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield); std::cout.precision(2); const std::string qps_title = show_qps_per_thread ? "QPS/thread" : "QPS"; - unsigned table_width = 0; + uint32_t table_width = 0; if (tags) { std::cout << std::setw(4) << "Ls" << std::setw(12) << qps_title << std::setw(20) << "Mean Latency (mus)" @@ -90,11 +112,11 @@ int search_memory_index(diskann::Metric &metric, const std::string &index_path, << std::setw(20) << "Mean Latency (mus)" << std::setw(15) << "99.9 Latency"; table_width += 4 + 12 + 18 + 20 + 15; } - unsigned recalls_to_print = 0; - const unsigned first_recall = print_all_recalls ? 1 : recall_at; + uint32_t recalls_to_print = 0; + const uint32_t first_recall = print_all_recalls ? 1 : recall_at; if (calc_recall_flag) { - for (unsigned curr_recall = first_recall; curr_recall <= recall_at; curr_recall++) + for (uint32_t curr_recall = first_recall; curr_recall <= recall_at; curr_recall++) { std::cout << std::setw(12) << ("Recall@" + std::to_string(curr_recall)); } @@ -107,10 +129,10 @@ int search_memory_index(diskann::Metric &metric, const std::string &index_path, std::vector> query_result_ids(Lvec.size()); std::vector> query_result_dists(Lvec.size()); std::vector latency_stats(query_num, 0); - std::vector cmp_stats; + std::vector cmp_stats; if (not tags) { - cmp_stats = std::vector(query_num, 0); + cmp_stats = std::vector(query_num, 0); } std::vector query_result_tags; @@ -119,11 +141,11 @@ int search_memory_index(diskann::Metric &metric, const std::string &index_path, query_result_tags.resize(recall_at * query_num); } - float best_recall = 0.0; + double best_recall = 0.0; for (uint32_t test_id = 0; test_id < Lvec.size(); test_id++) { - _u64 L = Lvec[test_id]; + uint32_t L = Lvec[test_id]; if (L < recall_at) { diskann::cout << "Ignoring search with L:" << L << " since it's smaller than K:" << recall_at << std::endl; @@ -142,21 +164,22 @@ int search_memory_index(diskann::Metric &metric, const std::string &index_path, auto qs = std::chrono::high_resolution_clock::now(); if (filtered_search) { - LabelT filter_label_as_num = index.get_converted_label(filter_label); - auto retval = index.search_with_filters(query + i * query_aligned_dim, filter_label_as_num, recall_at, - L, query_result_ids[test_id].data() + i * recall_at, - query_result_dists[test_id].data() + i * recall_at); + std::string raw_filter = query_filters.size() == 1 ? query_filters[0] : query_filters[i]; + + auto retval = index->search_with_filters(query + i * query_aligned_dim, raw_filter, recall_at, L, + query_result_ids[test_id].data() + i * recall_at, + query_result_dists[test_id].data() + i * recall_at); cmp_stats[i] = retval.second; } else if (metric == diskann::FAST_L2) { - index.search_with_optimized_layout(query + i * query_aligned_dim, recall_at, L, - query_result_ids[test_id].data() + i * recall_at); + index->search_with_optimized_layout(query + i * query_aligned_dim, recall_at, L, + query_result_ids[test_id].data() + i * recall_at); } else if (tags) { - index.search_with_tags(query + i * query_aligned_dim, recall_at, L, - query_result_tags.data() + i * recall_at, nullptr, res); + index->search_with_tags(query + i * query_aligned_dim, recall_at, L, + query_result_tags.data() + i * recall_at, nullptr, res); for (int64_t r = 0; r < (int64_t)recall_at; r++) { query_result_ids[test_id][recall_at * i + r] = query_result_tags[recall_at * i + r]; @@ -165,34 +188,34 @@ int search_memory_index(diskann::Metric &metric, const std::string &index_path, else { cmp_stats[i] = index - .search(query + i * query_aligned_dim, recall_at, L, - query_result_ids[test_id].data() + i * recall_at) + ->search(query + i * query_aligned_dim, recall_at, L, + query_result_ids[test_id].data() + i * recall_at) .second; } auto qe = std::chrono::high_resolution_clock::now(); std::chrono::duration diff = qe - qs; - latency_stats[i] = diff.count() * 1000000; + latency_stats[i] = (float)(diff.count() * 1000000); } std::chrono::duration diff = std::chrono::high_resolution_clock::now() - s; - float displayed_qps = static_cast(query_num) / diff.count(); + double displayed_qps = query_num / diff.count(); if (show_qps_per_thread) displayed_qps /= num_threads; - std::vector recalls; + std::vector recalls; if (calc_recall_flag) { recalls.reserve(recalls_to_print); - for (unsigned curr_recall = first_recall; curr_recall <= recall_at; curr_recall++) + for (uint32_t curr_recall = first_recall; curr_recall <= recall_at; curr_recall++) { - recalls.push_back(diskann::calculate_recall(query_num, gt_ids, gt_dists, gt_dim, + recalls.push_back(diskann::calculate_recall((uint32_t)query_num, gt_ids, gt_dists, (uint32_t)gt_dim, query_result_ids[test_id].data(), recall_at, curr_recall)); } } std::sort(latency_stats.begin(), latency_stats.end()); - float mean_latency = + double mean_latency = std::accumulate(latency_stats.begin(), latency_stats.end(), 0.0) / static_cast(query_num); float avg_cmps = (float)std::accumulate(cmp_stats.begin(), cmp_stats.end(), 0) / (float)query_num; @@ -200,15 +223,15 @@ int search_memory_index(diskann::Metric &metric, const std::string &index_path, if (tags) { std::cout << std::setw(4) << L << std::setw(12) << displayed_qps << std::setw(20) << (float)mean_latency - << std::setw(15) << (float)latency_stats[(_u64)(0.999 * query_num)]; + << std::setw(15) << (float)latency_stats[(uint64_t)(0.999 * query_num)]; } else { std::cout << std::setw(4) << L << std::setw(12) << displayed_qps << std::setw(18) << avg_cmps << std::setw(20) << (float)mean_latency << std::setw(15) - << (float)latency_stats[(_u64)(0.999 * query_num)]; + << (float)latency_stats[(uint64_t)(0.999 * query_num)]; } - for (float recall : recalls) + for (double recall : recalls) { std::cout << std::setw(12) << recall; best_recall = std::max(recall, best_recall); @@ -217,7 +240,7 @@ int search_memory_index(diskann::Metric &metric, const std::string &index_path, } std::cout << "Done searching. Now saving results " << std::endl; - _u64 test_id = 0; + uint64_t test_id = 0; for (auto L : Lvec) { if (L < recall_at) @@ -225,63 +248,89 @@ int search_memory_index(diskann::Metric &metric, const std::string &index_path, diskann::cout << "Ignoring search with L:" << L << " since it's smaller than K:" << recall_at << std::endl; continue; } - std::string cur_result_path = result_path_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); + std::string cur_result_path_prefix = result_path_prefix + "_" + std::to_string(L); + + std::string cur_result_path = cur_result_path_prefix + "_idx_uint32.bin"; + diskann::save_bin(cur_result_path, query_result_ids[test_id].data(), query_num, recall_at); + + cur_result_path = cur_result_path_prefix + "_dists_float.bin"; + diskann::save_bin(cur_result_path, query_result_dists[test_id].data(), query_num, recall_at); + test_id++; } diskann::aligned_free(query); - return best_recall >= fail_if_recall_below ? 0 : -1; } int main(int argc, char **argv) { - std::string data_type, dist_fn, index_path_prefix, result_path, query_file, gt_file, filter_label, label_type; - unsigned num_threads, K; - std::vector Lvec; + std::string data_type, dist_fn, index_path_prefix, result_path, query_file, gt_file, filter_label, label_type, + query_filters_file; + uint32_t num_threads, K; + std::vector Lvec; bool print_all_recalls, dynamic, tags, show_qps_per_thread; float fail_if_recall_below = 0.0f; - po::options_description desc{"Arguments"}; + po::options_description desc{ + program_options_utils::make_program_description("search_memory_index", "Searches in-memory DiskANN indexes")}; try { - desc.add_options()("help,h", "Print information on arguments"); - desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); - desc.add_options()("dist_fn", po::value(&dist_fn)->required(), - "distance function "); - desc.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), - "Path prefix to the index"); - desc.add_options()("result_path", po::value(&result_path)->required(), - "Path prefix for saving results of the queries"); - desc.add_options()("query_file", po::value(&query_file)->required(), - "Query file in binary format"); - desc.add_options()("filter_label", po::value(&filter_label)->default_value(std::string("")), - "Filter Label for Filtered Search"); - desc.add_options()("label_type", po::value(&label_type)->default_value("uint"), - "Storage type of Labels , default value is uint which " - "will consume memory 4 bytes per filter"); - desc.add_options()("gt_file", po::value(>_file)->default_value(std::string("null")), - "ground truth file for the queryset"); - desc.add_options()("recall_at,K", po::value(&K)->required(), "Number of neighbors to be returned"); - desc.add_options()("print_all_recalls", po::bool_switch(&print_all_recalls), - "Print recalls at all positions, from 1 up to specified " - "recall_at value"); - desc.add_options()("search_list,L", po::value>(&Lvec)->multitoken(), - "List of L values of search"); - desc.add_options()("num_threads,T", po::value(&num_threads)->default_value(omp_get_num_procs()), - "Number of threads used for building index (defaults to " - "omp_get_num_procs())"); - desc.add_options()("dynamic", po::value(&dynamic)->default_value(false), - "Whether the index is dynamic. Default false."); - desc.add_options()("tags", po::value(&tags)->default_value(false), - "Whether to search with tags. Default false."); - desc.add_options()("qps_per_thread", po::bool_switch(&show_qps_per_thread), - "Print overall QPS divided by the number of threads in " - "the output table"); - desc.add_options()("fail_if_recall_below", po::value(&fail_if_recall_below)->default_value(0.0f), - "If set to a value >0 and <100%, program returns -1 if best recall " - "found is below this threshold. "); + desc.add_options()("help,h", "Print this information on arguments"); + + // Required parameters + po::options_description required_configs("Required"); + required_configs.add_options()("data_type", po::value(&data_type)->required(), + program_options_utils::DATA_TYPE_DESCRIPTION); + required_configs.add_options()("dist_fn", po::value(&dist_fn)->required(), + program_options_utils::DISTANCE_FUNCTION_DESCRIPTION); + required_configs.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), + program_options_utils::INDEX_PATH_PREFIX_DESCRIPTION); + required_configs.add_options()("result_path", po::value(&result_path)->required(), + program_options_utils::RESULT_PATH_DESCRIPTION); + required_configs.add_options()("query_file", po::value(&query_file)->required(), + program_options_utils::QUERY_FILE_DESCRIPTION); + required_configs.add_options()("recall_at,K", po::value(&K)->required(), + program_options_utils::NUMBER_OF_RESULTS_DESCRIPTION); + required_configs.add_options()("search_list,L", + po::value>(&Lvec)->multitoken()->required(), + program_options_utils::SEARCH_LIST_DESCRIPTION); + + // Optional parameters + po::options_description optional_configs("Optional"); + optional_configs.add_options()("filter_label", + po::value(&filter_label)->default_value(std::string("")), + program_options_utils::FILTER_LABEL_DESCRIPTION); + optional_configs.add_options()("query_filters_file", + po::value(&query_filters_file)->default_value(std::string("")), + program_options_utils::FILTERS_FILE_DESCRIPTION); + optional_configs.add_options()("label_type", po::value(&label_type)->default_value("uint"), + program_options_utils::LABEL_TYPE_DESCRIPTION); + optional_configs.add_options()("gt_file", po::value(>_file)->default_value(std::string("null")), + program_options_utils::GROUND_TRUTH_FILE_DESCRIPTION); + optional_configs.add_options()("num_threads,T", + po::value(&num_threads)->default_value(omp_get_num_procs()), + program_options_utils::NUMBER_THREADS_DESCRIPTION); + optional_configs.add_options()( + "dynamic", po::value(&dynamic)->default_value(false), + "Whether the index is dynamic. Dynamic indices must have associated tags. Default false."); + optional_configs.add_options()("tags", po::value(&tags)->default_value(false), + "Whether to search with external identifiers (tags). Default false."); + optional_configs.add_options()("fail_if_recall_below", + po::value(&fail_if_recall_below)->default_value(0.0f), + program_options_utils::FAIL_IF_RECALL_BELOW); + + // Output controls + po::options_description output_controls("Output controls"); + output_controls.add_options()("print_all_recalls", po::bool_switch(&print_all_recalls), + "Print recalls at all positions, from 1 up to specified " + "recall_at value"); + output_controls.add_options()("print_qps_per_thread", po::bool_switch(&show_qps_per_thread), + "Print overall QPS divided by the number of threads in " + "the output table"); + + // Merge required and optional parameters + desc.add(required_configs).add(optional_configs).add(output_controls); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); @@ -336,27 +385,43 @@ int main(int argc, char **argv) return -1; } + if (filter_label != "" && query_filters_file != "") + { + std::cerr << "Only one of filter_label and query_filters_file should be provided" << std::endl; + return -1; + } + + std::vector query_filters; + if (filter_label != "") + { + query_filters.push_back(filter_label); + } + else if (query_filters_file != "") + { + query_filters = read_file_to_vector_of_strings(query_filters_file); + } + try { - if (filter_label != "" && label_type == "ushort") + if (!query_filters.empty() && label_type == "ushort") { if (data_type == std::string("int8")) { return search_memory_index( metric, index_path_prefix, result_path, query_file, gt_file, num_threads, K, print_all_recalls, - Lvec, dynamic, tags, show_qps_per_thread, filter_label, fail_if_recall_below); + Lvec, dynamic, tags, show_qps_per_thread, query_filters, fail_if_recall_below); } else if (data_type == std::string("uint8")) { return search_memory_index( metric, index_path_prefix, result_path, query_file, gt_file, num_threads, K, print_all_recalls, - Lvec, dynamic, tags, show_qps_per_thread, filter_label, fail_if_recall_below); + Lvec, dynamic, tags, show_qps_per_thread, query_filters, fail_if_recall_below); } else if (data_type == std::string("float")) { return search_memory_index(metric, index_path_prefix, result_path, query_file, gt_file, num_threads, K, print_all_recalls, Lvec, dynamic, tags, - show_qps_per_thread, filter_label, fail_if_recall_below); + show_qps_per_thread, query_filters, fail_if_recall_below); } else { @@ -370,19 +435,19 @@ int main(int argc, char **argv) { return search_memory_index(metric, index_path_prefix, result_path, query_file, gt_file, num_threads, K, print_all_recalls, Lvec, dynamic, tags, - show_qps_per_thread, filter_label, fail_if_recall_below); + show_qps_per_thread, query_filters, fail_if_recall_below); } else if (data_type == std::string("uint8")) { return search_memory_index(metric, index_path_prefix, result_path, query_file, gt_file, num_threads, K, print_all_recalls, Lvec, dynamic, tags, - show_qps_per_thread, filter_label, fail_if_recall_below); + show_qps_per_thread, query_filters, fail_if_recall_below); } else if (data_type == std::string("float")) { return search_memory_index(metric, index_path_prefix, result_path, query_file, gt_file, num_threads, K, print_all_recalls, Lvec, dynamic, tags, - show_qps_per_thread, filter_label, fail_if_recall_below); + show_qps_per_thread, query_filters, fail_if_recall_below); } else { diff --git a/tests/test_insert_deletes_consolidate.cpp b/apps/test_insert_deletes_consolidate.cpp similarity index 61% rename from tests/test_insert_deletes_consolidate.cpp rename to apps/test_insert_deletes_consolidate.cpp index ef598c659..700f4d7b6 100644 --- a/tests/test_insert_deletes_consolidate.cpp +++ b/apps/test_insert_deletes_consolidate.cpp @@ -11,6 +11,8 @@ #include #include "utils.h" +#include "program_options_utils.hpp" +#include "index_factory.h" #ifndef _WINDOWS #include @@ -37,8 +39,8 @@ inline void load_aligned_bin_part(const std::string &bin_file, T *data, size_t o int npts_i32, dim_i32; reader.read((char *)&npts_i32, sizeof(int)); reader.read((char *)&dim_i32, sizeof(int)); - size_t npts = (unsigned)npts_i32; - size_t dim = (unsigned)dim_i32; + size_t npts = (uint32_t)npts_i32; + size_t dim = (uint32_t)dim_i32; size_t expected_actual_file_size = npts * dim * sizeof(T) + 2 * sizeof(uint32_t); if (actual_file_size != expected_actual_file_size) @@ -90,7 +92,7 @@ std::string get_save_filename(const std::string &save_path, size_t points_to_ski } template -void insert_till_next_checkpoint(diskann::Index &index, size_t start, size_t end, size_t thread_count, T *data, +void insert_till_next_checkpoint(diskann::AbstractIndex &index, size_t start, size_t end, int32_t thread_count, T *data, size_t aligned_dim) { diskann::Timer insert_timer; @@ -106,8 +108,8 @@ void insert_till_next_checkpoint(diskann::Index &index, size_t start, s } template -void delete_from_beginning(diskann::Index &index, diskann::Parameters &delete_params, size_t points_to_skip, - size_t points_to_delete_from_beginning) +void delete_from_beginning(diskann::AbstractIndex &index, diskann::IndexWriteParameters &delete_params, + size_t points_to_skip, size_t points_to_delete_from_beginning) { try { @@ -115,7 +117,7 @@ void delete_from_beginning(diskann::Index &index, diskann::Parameters & << "Lazy deleting points " << points_to_skip << " to " << points_to_skip + points_to_delete_from_beginning << "... "; for (size_t i = points_to_skip; i < points_to_skip + points_to_delete_from_beginning; ++i) - index.lazy_delete(i + 1); // Since tags are data location + 1 + index.lazy_delete(static_cast(i + 1)); // Since tags are data location + 1 std::cout << "done." << std::endl; auto report = index.consolidate_deletes(delete_params); @@ -125,8 +127,8 @@ void delete_from_beginning(diskann::Index &index, diskann::Parameters & << "deletes processed: " << report._slots_released << std::endl << "latest delete size: " << report._delete_set_size << std::endl << "rate: (" << points_to_delete_from_beginning / report._time << " points/second overall, " - << points_to_delete_from_beginning / report._time / delete_params.Get("num_threads") - << " per thread)" << std::endl; + << points_to_delete_from_beginning / report._time / delete_params.num_threads << " per thread)" + << std::endl; } catch (std::system_error &e) { @@ -135,34 +137,39 @@ void delete_from_beginning(diskann::Index &index, diskann::Parameters & } template -void build_incremental_index(const std::string &data_path, const unsigned L, const unsigned R, const float alpha, - const unsigned thread_count, size_t points_to_skip, size_t max_points_to_insert, - size_t beginning_index_size, float start_point_norm, unsigned num_start_pts, - size_t points_per_checkpoint, size_t checkpoints_per_snapshot, +void build_incremental_index(const std::string &data_path, diskann::IndexWriteParameters ¶ms, size_t points_to_skip, + size_t max_points_to_insert, size_t beginning_index_size, float start_point_norm, + uint32_t num_start_pts, size_t points_per_checkpoint, size_t checkpoints_per_snapshot, const std::string &save_path, size_t points_to_delete_from_beginning, size_t start_deletes_after, bool concurrent) { - const unsigned C = 500; - const bool saturate_graph = false; - - diskann::Parameters params; - params.Set("L", L); - params.Set("R", R); - params.Set("C", C); - params.Set("alpha", alpha); - params.Set("saturate_graph", saturate_graph); - params.Set("num_rnds", 1); - params.Set("num_threads", thread_count); - params.Set("Lf", 0); // TODO: get this from params and default to some - // value to make it backward compatible. - params.Set("num_frozen_pts", num_start_pts); - size_t dim, aligned_dim; size_t num_points; - diskann::get_bin_metadata(data_path, num_points, dim); aligned_dim = ROUND_UP(dim, 8); + bool enable_tags = true; + using TagT = uint32_t; + auto data_type = diskann_type_to_name(); + auto tag_type = diskann_type_to_name(); + diskann::IndexConfig index_config = diskann::IndexConfigBuilder() + .with_metric(diskann::L2) + .with_dimension(dim) + .with_max_points(max_points_to_insert) + .is_dynamic_index(true) + .with_index_write_params(params) + .with_search_threads(params.num_threads) + .with_initial_search_list_size(params.search_list_size) + .with_data_type(data_type) + .with_tag_type(tag_type) + .with_data_load_store_strategy(diskann::MEMORY) + .is_enable_tags(enable_tags) + .is_concurrent_consolidate(concurrent) + .build(); + + diskann::IndexFactory index_factory = diskann::IndexFactory(index_config); + auto index = index_factory.create_instance(); + if (points_to_skip > num_points) { throw diskann::ANNException("Asked to skip more points than in data file", -1, __FUNCSIG__, __FILE__, __LINE__); @@ -180,12 +187,6 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con << " points since the data file has only that many" << std::endl; } - using TagT = uint32_t; - const bool enable_tags = true; - - diskann::Index index(diskann::L2, dim, max_points_to_insert, true, params, params, enable_tags, - concurrent); - size_t current_point_offset = points_to_skip; const size_t last_point_threshold = points_to_skip + max_points_to_insert; @@ -214,13 +215,11 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con if (beginning_index_size > 0) { - index.build(data, beginning_index_size, params, tags); - index.enable_delete(); + index->build(data, beginning_index_size, params, tags); } else { - index.set_start_points_at_random(static_cast(start_point_norm)); - index.enable_delete(); + index->set_start_points_at_random(static_cast(start_point_norm)); } const double elapsedSeconds = timer.elapsed() / 1000000.0; @@ -231,14 +230,14 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con if (points_to_delete_from_beginning > max_points_to_insert) { - points_to_delete_from_beginning = static_cast(max_points_to_insert); + points_to_delete_from_beginning = static_cast(max_points_to_insert); std::cerr << "WARNING: Reducing points to delete from beginning to " << points_to_delete_from_beginning << " points since the data file has only that many" << std::endl; } if (concurrent) { - int sub_threads = (thread_count + 1) / 2; + int32_t sub_threads = (params.num_threads + 1) / 2; bool delete_launched = false; std::future delete_task; @@ -252,7 +251,7 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con auto insert_task = std::async(std::launch::async, [&]() { load_aligned_bin_part(data_path, data, start, end - start); - insert_till_next_checkpoint(index, start, end, sub_threads, data, aligned_dim); + insert_till_next_checkpoint(*index, start, end, sub_threads, data, aligned_dim); }); insert_task.wait(); @@ -260,10 +259,12 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con end >= points_to_skip + points_to_delete_from_beginning) { delete_launched = true; - params.Set("num_threads", sub_threads); + diskann::IndexWriteParameters delete_params = + diskann::IndexWriteParametersBuilder(params).with_num_threads(sub_threads).build(); delete_task = std::async(std::launch::async, [&]() { - delete_from_beginning(index, params, points_to_skip, points_to_delete_from_beginning); + delete_from_beginning(*index, delete_params, points_to_skip, + points_to_delete_from_beginning); }); } } @@ -272,7 +273,7 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con std::cout << "Time Elapsed " << timer.elapsed() / 1000 << "ms\n"; const auto save_path_inc = get_save_filename(save_path + ".after-concurrent-delete-", points_to_skip, points_to_delete_from_beginning, last_point_threshold); - index.save(save_path_inc.c_str(), true); + index->save(save_path_inc.c_str(), true); } else { @@ -286,7 +287,7 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con std::cout << std::endl << "Inserting from " << start << " to " << end << std::endl; load_aligned_bin_part(data_path, data, start, end - start); - insert_till_next_checkpoint(index, start, end, thread_count, data, aligned_dim); + insert_till_next_checkpoint(*index, start, end, (int32_t)params.num_threads, data, aligned_dim); if (checkpoints_per_snapshot > 0 && --num_checkpoints_till_snapshot == 0) { @@ -294,7 +295,7 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con const auto save_path_inc = get_save_filename(save_path + ".inc-", points_to_skip, points_to_delete_from_beginning, end); - index.save(save_path_inc.c_str(), false); + index->save(save_path_inc.c_str(), false); const double elapsedSeconds = save_timer.elapsed() / 1000000.0; const size_t points_saved = end - points_to_skip; @@ -317,11 +318,11 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con if (points_to_delete_from_beginning > 0) { - delete_from_beginning(index, params, points_to_skip, points_to_delete_from_beginning); + delete_from_beginning(*index, params, points_to_skip, points_to_delete_from_beginning); } const auto save_path_inc = get_save_filename(save_path + ".after-delete-", points_to_skip, points_to_delete_from_beginning, last_point_threshold); - index.save(save_path_inc.c_str(), true); + index->save(save_path_inc.c_str(), true); } diskann::aligned_free(data); @@ -330,50 +331,68 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con int main(int argc, char **argv) { std::string data_type, dist_fn, data_path, index_path_prefix; - unsigned num_threads, R, L, num_start_pts; + uint32_t num_threads, R, L, num_start_pts; float alpha, start_point_norm; size_t points_to_skip, max_points_to_insert, beginning_index_size, points_per_checkpoint, checkpoints_per_snapshot, points_to_delete_from_beginning, start_deletes_after; bool concurrent; - po::options_description desc{"Arguments"}; + po::options_description desc{program_options_utils::make_program_description("test_insert_deletes_consolidate", + "Test insert deletes & consolidate")}; try { desc.add_options()("help,h", "Print information on arguments"); - desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); - desc.add_options()("dist_fn", po::value(&dist_fn)->required(), "distance function "); - desc.add_options()("data_path", po::value(&data_path)->required(), - "Input data file in bin format"); - desc.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), - "Path prefix for saving index file components"); - desc.add_options()("max_degree,R", po::value(&R)->default_value(64), "Maximum graph degree"); - desc.add_options()("Lbuild,L", po::value(&L)->default_value(100), - "Build complexity, higher value results in better graphs"); - desc.add_options()("alpha", po::value(&alpha)->default_value(1.2f), - "alpha controls density and diameter of graph, set 1 for sparse graph, " - "1.2 or 1.4 for denser graphs with lower diameter"); - desc.add_options()("num_threads,T", po::value(&num_threads)->default_value(omp_get_num_procs()), - "Number of threads used for building index (defaults to " - "omp_get_num_procs())"); - desc.add_options()("points_to_skip", po::value(&points_to_skip)->required(), - "Skip these first set of points from file"); - desc.add_options()("max_points_to_insert", po::value(&max_points_to_insert)->default_value(0), - "These number of points from the file are inserted after " - "points_to_skip"); - desc.add_options()("beginning_index_size", po::value(&beginning_index_size)->required(), - "Batch build will be called on these set of points"); - desc.add_options()("points_per_checkpoint", po::value(&points_per_checkpoint)->required(), - "Insertions are done in batches of points_per_checkpoint"); - desc.add_options()("checkpoints_per_snapshot", po::value(&checkpoints_per_snapshot)->required(), - "Save the index to disk every few checkpoints"); - desc.add_options()("points_to_delete_from_beginning", - po::value(&points_to_delete_from_beginning)->required(), ""); - desc.add_options()("do_concurrent", po::value(&concurrent)->default_value(false), ""); - desc.add_options()("start_deletes_after", po::value(&start_deletes_after)->default_value(0), ""); - desc.add_options()("start_point_norm", po::value(&start_point_norm)->default_value(0), - "Set the start point to a random point on a sphere of this radius"); - desc.add_options()("num_start_points", po::value(&num_start_pts)->default_value(0), - "Set the number of random start (frozen) points to use when inserting and searching"); + + // Required parameters + po::options_description required_configs("Required"); + required_configs.add_options()("data_type", po::value(&data_type)->required(), + program_options_utils::DATA_TYPE_DESCRIPTION); + required_configs.add_options()("dist_fn", po::value(&dist_fn)->required(), + program_options_utils::DISTANCE_FUNCTION_DESCRIPTION); + required_configs.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), + program_options_utils::INDEX_PATH_PREFIX_DESCRIPTION); + required_configs.add_options()("data_path", po::value(&data_path)->required(), + program_options_utils::INPUT_DATA_PATH); + required_configs.add_options()("points_to_skip", po::value(&points_to_skip)->required(), + "Skip these first set of points from file"); + required_configs.add_options()("beginning_index_size", po::value(&beginning_index_size)->required(), + "Batch build will be called on these set of points"); + required_configs.add_options()("points_per_checkpoint", po::value(&points_per_checkpoint)->required(), + "Insertions are done in batches of points_per_checkpoint"); + required_configs.add_options()("checkpoints_per_snapshot", + po::value(&checkpoints_per_snapshot)->required(), + "Save the index to disk every few checkpoints"); + required_configs.add_options()("points_to_delete_from_beginning", + po::value(&points_to_delete_from_beginning)->required(), ""); + + // Optional parameters + po::options_description optional_configs("Optional"); + optional_configs.add_options()("num_threads,T", + po::value(&num_threads)->default_value(omp_get_num_procs()), + program_options_utils::NUMBER_THREADS_DESCRIPTION); + optional_configs.add_options()("max_degree,R", po::value(&R)->default_value(64), + program_options_utils::MAX_BUILD_DEGREE); + optional_configs.add_options()("Lbuild,L", po::value(&L)->default_value(100), + program_options_utils::GRAPH_BUILD_COMPLEXITY); + optional_configs.add_options()("alpha", po::value(&alpha)->default_value(1.2f), + program_options_utils::GRAPH_BUILD_ALPHA); + optional_configs.add_options()("max_points_to_insert", + po::value(&max_points_to_insert)->default_value(0), + "These number of points from the file are inserted after " + "points_to_skip"); + optional_configs.add_options()("do_concurrent", po::value(&concurrent)->default_value(false), ""); + optional_configs.add_options()("start_deletes_after", + po::value(&start_deletes_after)->default_value(0), ""); + optional_configs.add_options()("start_point_norm", po::value(&start_point_norm)->default_value(0), + "Set the start point to a random point on a sphere of this radius"); + optional_configs.add_options()( + "num_start_points", + po::value(&num_start_pts)->default_value(diskann::defaults::NUM_FROZEN_POINTS_DYNAMIC), + "Set the number of random start (frozen) points to use when " + "inserting and searching"); + + // Merge required and optional parameters + desc.add(required_configs).add(optional_configs); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); @@ -386,7 +405,8 @@ int main(int argc, char **argv) if (beginning_index_size == 0) if (start_point_norm == 0) { - std::cout << "When beginning_index_size is 0, use a start point with " + std::cout << "When beginning_index_size is 0, use a start " + "point with " "appropriate norm" << std::endl; return -1; @@ -400,18 +420,25 @@ int main(int argc, char **argv) try { + diskann::IndexWriteParameters params = diskann::IndexWriteParametersBuilder(L, R) + .with_max_occlusion_size(500) + .with_alpha(alpha) + .with_num_threads(num_threads) + .with_num_frozen_points(num_start_pts) + .build(); + if (data_type == std::string("int8")) - build_incremental_index(data_path, L, R, alpha, num_threads, points_to_skip, max_points_to_insert, + build_incremental_index(data_path, params, points_to_skip, max_points_to_insert, beginning_index_size, start_point_norm, num_start_pts, points_per_checkpoint, checkpoints_per_snapshot, index_path_prefix, points_to_delete_from_beginning, start_deletes_after, concurrent); else if (data_type == std::string("uint8")) - build_incremental_index(data_path, L, R, alpha, num_threads, points_to_skip, max_points_to_insert, + build_incremental_index(data_path, params, points_to_skip, max_points_to_insert, beginning_index_size, start_point_norm, num_start_pts, points_per_checkpoint, checkpoints_per_snapshot, index_path_prefix, points_to_delete_from_beginning, start_deletes_after, concurrent); else if (data_type == std::string("float")) - build_incremental_index(data_path, L, R, alpha, num_threads, points_to_skip, max_points_to_insert, + build_incremental_index(data_path, params, points_to_skip, max_points_to_insert, beginning_index_size, start_point_norm, num_start_pts, points_per_checkpoint, checkpoints_per_snapshot, index_path_prefix, points_to_delete_from_beginning, start_deletes_after, concurrent); diff --git a/tests/test_streaming_scenario.cpp b/apps/test_streaming_scenario.cpp similarity index 56% rename from tests/test_streaming_scenario.cpp rename to apps/test_streaming_scenario.cpp index b1f655162..55e4e61cf 100644 --- a/tests/test_streaming_scenario.cpp +++ b/apps/test_streaming_scenario.cpp @@ -9,8 +9,11 @@ #include #include #include +#include +#include #include "utils.h" +#include "program_options_utils.hpp" #ifndef _WINDOWS #include @@ -36,8 +39,8 @@ inline void load_aligned_bin_part(const std::string &bin_file, T *data, size_t o int npts_i32, dim_i32; reader.read((char *)&npts_i32, sizeof(int)); reader.read((char *)&dim_i32, sizeof(int)); - size_t npts = (unsigned)npts_i32; - size_t dim = (unsigned)dim_i32; + size_t npts = (uint32_t)npts_i32; + size_t dim = (uint32_t)dim_i32; size_t expected_actual_file_size = npts * dim * sizeof(T) + 2 * sizeof(uint32_t); if (actual_file_size != expected_actual_file_size) @@ -81,8 +84,8 @@ std::string get_save_filename(const std::string &save_path, size_t active_window return final_path; } -template -void insert_next_batch(diskann::Index &index, size_t start, size_t end, size_t insert_threads, T *data, +template +void insert_next_batch(diskann::AbstractIndex &index, size_t start, size_t end, size_t insert_threads, T *data, size_t aligned_dim) { try @@ -91,7 +94,7 @@ void insert_next_batch(diskann::Index &index, size_t start, siz std::cout << std::endl << "Inserting from " << start << " to " << end << std::endl; size_t num_failed = 0; -#pragma omp parallel for num_threads(insert_threads) schedule(dynamic) reduction(+ : num_failed) +#pragma omp parallel for num_threads((int32_t)insert_threads) schedule(dynamic) reduction(+ : num_failed) for (int64_t j = start; j < (int64_t)end; j++) { if (index.insert_point(&data[(j - start) * aligned_dim], 1 + static_cast(j)) != 0) @@ -113,15 +116,15 @@ void insert_next_batch(diskann::Index &index, size_t start, siz } } -template -void delete_and_consolidate(diskann::Index &index, diskann::Parameters &delete_params, size_t start, +template +void delete_and_consolidate(diskann::AbstractIndex &index, diskann::IndexWriteParameters &delete_params, size_t start, size_t end) { try { std::cout << std::endl << "Lazy deleting points " << start << " to " << end << "... "; for (size_t i = start; i < end; ++i) - index.lazy_delete(1 + i); + index.lazy_delete(static_cast(1 + i)); std::cout << "lazy delete done." << std::endl; auto report = index.consolidate_deletes(delete_params); @@ -149,14 +152,13 @@ void delete_and_consolidate(diskann::Index &index, diskann::Par } auto points_processed = report._active_points + report._slots_released; auto deletion_rate = points_processed / report._time; - std::cout << "#active points: " << report._active_points << std::endl + std::cout << "#active points: " << report._active_points << std::endl << "max points: " << report._max_points << std::endl << "empty slots: " << report._empty_slots << std::endl << "deletes processed: " << report._slots_released << std::endl << "latest delete size: " << report._delete_set_size << std::endl << "Deletion rate: " << deletion_rate << "/sec " - << "Deletion rate: " << deletion_rate / delete_params.Get("num_threads") << "/thread/sec " - << std::endl; + << "Deletion rate: " << deletion_rate / delete_params.num_threads << "/thread/sec " << std::endl; } catch (std::system_error &e) { @@ -166,62 +168,79 @@ void delete_and_consolidate(diskann::Index &index, diskann::Par } template -void build_incremental_index(const std::string &data_path, const unsigned L, const unsigned R, const float alpha, - const unsigned insert_threads, const unsigned consolidate_threads, +void build_incremental_index(const std::string &data_path, const uint32_t L, const uint32_t R, const float alpha, + const uint32_t insert_threads, const uint32_t consolidate_threads, size_t max_points_to_insert, size_t active_window, size_t consolidate_interval, - const float start_point_norm, unsigned num_start_pts, const std::string &save_path) + const float start_point_norm, uint32_t num_start_pts, const std::string &save_path) { - const unsigned C = 500; + const uint32_t C = 500; const bool saturate_graph = false; + using TagT = uint32_t; + using LabelT = uint32_t; - diskann::Parameters params; - params.Set("L", L); - params.Set("R", R); - params.Set("C", C); - params.Set("alpha", alpha); - params.Set("saturate_graph", saturate_graph); - params.Set("num_rnds", 1); - params.Set("num_threads", insert_threads); - params.Set("Lf", 0); - params.Set("num_frozen_pts", num_start_pts); - diskann::Parameters delete_params; - delete_params.Set("L", L); - delete_params.Set("R", R); - delete_params.Set("C", C); - delete_params.Set("alpha", alpha); - delete_params.Set("saturate_graph", saturate_graph); - delete_params.Set("num_rnds", 1); - delete_params.Set("num_threads", consolidate_threads); + diskann::IndexWriteParameters params = diskann::IndexWriteParametersBuilder(L, R) + .with_max_occlusion_size(C) + .with_alpha(alpha) + .with_saturate_graph(saturate_graph) + .with_num_threads(insert_threads) + .with_num_frozen_points(num_start_pts) + .build(); + + diskann::IndexWriteParameters delete_params = diskann::IndexWriteParametersBuilder(L, R) + .with_max_occlusion_size(C) + .with_alpha(alpha) + .with_saturate_graph(saturate_graph) + .with_num_threads(consolidate_threads) + .build(); size_t dim, aligned_dim; size_t num_points; diskann::get_bin_metadata(data_path, num_points, dim); + diskann::cout << "metadata: file " << data_path << " has " << num_points << " points in " << dim << " dims" + << std::endl; aligned_dim = ROUND_UP(dim, 8); + auto index_config = diskann::IndexConfigBuilder() + .with_metric(diskann::L2) + .with_dimension(dim) + .with_max_points(active_window + 4 * consolidate_interval) + .is_dynamic_index(true) + .is_enable_tags(true) + .is_use_opq(false) + .with_num_pq_chunks(0) + .is_pq_dist_build(false) + .with_search_threads(insert_threads) + .with_initial_search_list_size(L) + .with_tag_type(diskann_type_to_name()) + .with_label_type(diskann_type_to_name()) + .with_data_type(diskann_type_to_name()) + .with_index_write_params(params) + .with_data_load_store_strategy(diskann::MEMORY) + .build(); + + diskann::IndexFactory index_factory = diskann::IndexFactory(index_config); + auto index = index_factory.create_instance(); + if (max_points_to_insert == 0) { max_points_to_insert = num_points; } if (num_points < max_points_to_insert) - throw diskann::ANNException("num_points < max_points_to_insert", -1, __FUNCSIG__, __FILE__, __LINE__); + throw diskann::ANNException(std::string("num_points(") + std::to_string(num_points) + + ") < max_points_to_insert(" + std::to_string(max_points_to_insert) + ")", + -1, __FUNCSIG__, __FILE__, __LINE__); if (max_points_to_insert < active_window + consolidate_interval) - throw diskann::ANNException("ERROR: max_points_to_insert < active_window + consolidate_interval", -1, - __FUNCSIG__, __FILE__, __LINE__); + throw diskann::ANNException("ERROR: max_points_to_insert < " + "active_window + consolidate_interval", + -1, __FUNCSIG__, __FILE__, __LINE__); if (consolidate_interval < max_points_to_insert / 1000) throw diskann::ANNException("ERROR: consolidate_interval is too small", -1, __FUNCSIG__, __FILE__, __LINE__); - using TagT = uint32_t; - using LabelT = uint32_t; - const bool enable_tags = true; - - diskann::Index index(diskann::L2, dim, active_window + 4 * consolidate_interval, true, params, - params, enable_tags, true); - index.set_start_points_at_random(static_cast(start_point_norm)); - index.enable_delete(); + index->set_start_points_at_random(static_cast(start_point_norm)); T *data = nullptr; diskann::alloc_aligned((void **)&data, std::max(consolidate_interval, active_window) * aligned_dim * sizeof(T), @@ -236,7 +255,7 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con auto insert_task = std::async(std::launch::async, [&]() { load_aligned_bin_part(data_path, data, 0, active_window); - insert_next_batch(index, 0, active_window, insert_threads, data, aligned_dim); + insert_next_batch(*index, (size_t)0, active_window, params.num_threads, data, aligned_dim); }); insert_task.wait(); @@ -246,7 +265,7 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con auto end = std::min(start + consolidate_interval, max_points_to_insert); auto insert_task = std::async(std::launch::async, [&]() { load_aligned_bin_part(data_path, data, start, end - start); - insert_next_batch(index, start, end, insert_threads, data, aligned_dim); + insert_next_batch(*index, start, end, params.num_threads, data, aligned_dim); }); insert_task.wait(); @@ -257,10 +276,9 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con auto start_del = start - active_window - consolidate_interval; auto end_del = start - active_window; - params.Set("num_threads", consolidate_threads); - - delete_tasks.emplace_back(std::async( - std::launch::async, [&]() { delete_and_consolidate(index, delete_params, start_del, end_del); })); + delete_tasks.emplace_back(std::async(std::launch::async, [&]() { + delete_and_consolidate(*index, delete_params, (size_t)start_del, (size_t)end_del); + })); } } if (delete_tasks.size() > 0) @@ -269,7 +287,7 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con std::cout << "Time Elapsed " << timer.elapsed() / 1000 << "ms\n"; const auto save_path_inc = get_save_filename(save_path + ".after-streaming-", active_window, consolidate_interval, max_points_to_insert); - index.save(save_path_inc.c_str(), true); + index->save(save_path_inc.c_str(), true); diskann::aligned_free(data); } @@ -277,48 +295,65 @@ void build_incremental_index(const std::string &data_path, const unsigned L, con int main(int argc, char **argv) { std::string data_type, dist_fn, data_path, index_path_prefix; - unsigned insert_threads, consolidate_threads; - unsigned R, L, num_start_pts; + uint32_t insert_threads, consolidate_threads; + uint32_t R, L, num_start_pts; float alpha, start_point_norm; size_t max_points_to_insert, active_window, consolidate_interval; - po::options_description desc{"Arguments"}; + po::options_description desc{program_options_utils::make_program_description("test_streaming_scenario", + "Test insert deletes & consolidate")}; try { desc.add_options()("help,h", "Print information on arguments"); - desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); - desc.add_options()("dist_fn", po::value(&dist_fn)->required(), "distance function "); - desc.add_options()("data_path", po::value(&data_path)->required(), - "Input data file in bin format"); - desc.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), - "Path prefix for saving index file components"); - desc.add_options()("max_degree,R", po::value(&R)->default_value(64), "Maximum graph degree"); - desc.add_options()("Lbuild,L", po::value(&L)->default_value(100), - "Build complexity, higher value results in better graphs"); - desc.add_options()("alpha", po::value(&alpha)->default_value(1.2f), - "alpha controls density and diameter of graph, set 1 for sparse graph, " - "1.2 or 1.4 for denser graphs with lower diameter"); - desc.add_options()("insert_threads", - po::value(&insert_threads)->default_value(omp_get_num_procs() / 2), - "Number of threads used for inserting into the index (defaults to " - "omp_get_num_procs()/2)"); - desc.add_options()("consolidate_threads", - po::value(&consolidate_threads)->default_value(omp_get_num_procs() / 2), - "Number of threads used for consolidating deletes to " - "the index (defaults to omp_get_num_procs()/2)"); - - desc.add_options()("max_points_to_insert", po::value(&max_points_to_insert)->default_value(0), - "The number of points from the file that the program streams over "); - desc.add_options()("active_window", po::value(&active_window)->required(), - "Program maintains an index over an active window of " - "this size that slides through the data"); - desc.add_options()("consolidate_interval", po::value(&consolidate_interval)->required(), - "The program simultaneously adds this number of points to the right of " - "the window while deleting the same number from the left"); - desc.add_options()("start_point_norm", po::value(&start_point_norm)->required(), - "Set the start point to a random point on a sphere of this radius"); - desc.add_options()("num_start_points", po::value(&num_start_pts)->default_value(0), - "Set the number of random start (frozen) points to use when inserting and searching"); + + // Required parameters + po::options_description required_configs("Required"); + required_configs.add_options()("data_type", po::value(&data_type)->required(), + program_options_utils::DATA_TYPE_DESCRIPTION); + required_configs.add_options()("dist_fn", po::value(&dist_fn)->required(), + program_options_utils::DISTANCE_FUNCTION_DESCRIPTION); + required_configs.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), + program_options_utils::INDEX_PATH_PREFIX_DESCRIPTION); + required_configs.add_options()("data_path", po::value(&data_path)->required(), + program_options_utils::INPUT_DATA_PATH); + required_configs.add_options()("active_window", po::value(&active_window)->required(), + "Program maintains an index over an active window of " + "this size that slides through the data"); + required_configs.add_options()("consolidate_interval", po::value(&consolidate_interval)->required(), + "The program simultaneously adds this number of points to the " + "right of " + "the window while deleting the same number from the left"); + required_configs.add_options()("start_point_norm", po::value(&start_point_norm)->required(), + "Set the start point to a random point on a sphere of this radius"); + + // Optional parameters + po::options_description optional_configs("Optional"); + optional_configs.add_options()("max_degree,R", po::value(&R)->default_value(64), + program_options_utils::MAX_BUILD_DEGREE); + optional_configs.add_options()("Lbuild,L", po::value(&L)->default_value(100), + program_options_utils::GRAPH_BUILD_COMPLEXITY); + optional_configs.add_options()("alpha", po::value(&alpha)->default_value(1.2f), + program_options_utils::GRAPH_BUILD_ALPHA); + optional_configs.add_options()("insert_threads", + po::value(&insert_threads)->default_value(omp_get_num_procs() / 2), + "Number of threads used for inserting into the index (defaults to " + "omp_get_num_procs()/2)"); + optional_configs.add_options()( + "consolidate_threads", po::value(&consolidate_threads)->default_value(omp_get_num_procs() / 2), + "Number of threads used for consolidating deletes to " + "the index (defaults to omp_get_num_procs()/2)"); + optional_configs.add_options()("max_points_to_insert", + po::value(&max_points_to_insert)->default_value(0), + "The number of points from the file that the program streams " + "over "); + optional_configs.add_options()( + "num_start_points", + po::value(&num_start_pts)->default_value(diskann::defaults::NUM_FROZEN_POINTS_DYNAMIC), + "Set the number of random start (frozen) points to use when " + "inserting and searching"); + + // Merge required and optional parameters + desc.add(required_configs).add(optional_configs); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); diff --git a/tests/utils/CMakeLists.txt b/apps/utils/CMakeLists.txt similarity index 69% rename from tests/utils/CMakeLists.txt rename to apps/utils/CMakeLists.txt index 40aa050c8..3b8cf223c 100644 --- a/tests/utils/CMakeLists.txt +++ b/apps/utils/CMakeLists.txt @@ -1,7 +1,9 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT license. -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_COMPILE_WARNING_AS_ERROR ON) + add_executable(fvecs_to_bin fvecs_to_bin.cpp) @@ -44,11 +46,15 @@ add_executable(simulate_aggregate_recall simulate_aggregate_recall.cpp) add_executable(calculate_recall calculate_recall.cpp) target_link_libraries(calculate_recall ${PROJECT_NAME} ${DISKANN_ASYNC_LIB} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS}) -# This is the only thing outside of DiskANN main source that depends on MKL. +# Compute ground truth thing outside of DiskANN main source that depends on MKL. add_executable(compute_groundtruth compute_groundtruth.cpp) target_include_directories(compute_groundtruth PRIVATE ${DISKANN_MKL_INCLUDE_DIRECTORIES}) target_link_libraries(compute_groundtruth ${PROJECT_NAME} ${DISKANN_MKL_LINK_LIBRARIES} ${DISKANN_ASYNC_LIB} Boost::program_options) +add_executable(compute_groundtruth_for_filters compute_groundtruth_for_filters.cpp) +target_include_directories(compute_groundtruth_for_filters PRIVATE ${DISKANN_MKL_INCLUDE_DIRECTORIES}) +target_link_libraries(compute_groundtruth_for_filters ${PROJECT_NAME} ${DISKANN_MKL_LINK_LIBRARIES} ${DISKANN_ASYNC_LIB} Boost::program_options) + add_executable(generate_pq generate_pq.cpp) target_link_libraries(generate_pq ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS}) @@ -71,3 +77,34 @@ target_link_libraries(generate_synthetic_labels ${PROJECT_NAME} Boost::program_o add_executable(stats_label_data stats_label_data.cpp) target_link_libraries(stats_label_data ${PROJECT_NAME} Boost::program_options) + +if (NOT MSVC) + include(GNUInstallDirs) + install(TARGETS fvecs_to_bin + fvecs_to_bvecs + rand_data_gen + float_bin_to_int8 + ivecs_to_bin + count_bfs_levels + tsv_to_bin + bin_to_tsv + int8_to_float + int8_to_float_scale + uint8_to_float + uint32_to_uint8 + vector_analysis + gen_random_slice + simulate_aggregate_recall + calculate_recall + compute_groundtruth + compute_groundtruth_for_filters + generate_pq + partition_data + partition_with_ram_budget + merge_shards + create_disk_layout + generate_synthetic_labels + stats_label_data + RUNTIME + ) +endif() \ No newline at end of file diff --git a/tests/utils/bin_to_fvecs.cpp b/apps/utils/bin_to_fvecs.cpp similarity index 70% rename from tests/utils/bin_to_fvecs.cpp rename to apps/utils/bin_to_fvecs.cpp index 13803b74c..e9a6a8ecc 100644 --- a/tests/utils/bin_to_fvecs.cpp +++ b/apps/utils/bin_to_fvecs.cpp @@ -4,11 +4,12 @@ #include #include "util.h" -void block_convert(std::ifstream &writr, std::ofstream &readr, float *read_buf, float *write_buf, _u64 npts, _u64 ndims) +void block_convert(std::ifstream &writr, std::ofstream &readr, float *read_buf, float *write_buf, uint64_t npts, + uint64_t ndims) { writr.write((char *)read_buf, npts * (ndims * sizeof(float) + sizeof(unsigned))); #pragma omp parallel for - for (_u64 i = 0; i < npts; i++) + for (uint64_t i = 0; i < npts; i++) { memcpy(write_buf + i * ndims, (read_buf + i * (ndims + 1)) + 1, ndims * sizeof(float)); } @@ -25,31 +26,31 @@ int main(int argc, char **argv) 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)); + readr.read((char *)&npts_s32, sizeof(int32_t)); + readr.read((char *)&ndims_s32, sizeof(int32_t)); size_t npts = npts_s32; size_t ndims = ndims_s32; - _u32 ndims_u32 = (_u32)ndims_s32; - // _u64 fsize = writr.tellg(); + uint32_t ndims_u32 = (uint32_t)ndims_s32; + // uint64_t fsize = writr.tellg(); readr.seekg(0, std::ios::beg); unsigned ndims_u32; 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)); + uint64_t ndims = (uint64_t)ndims_u32; + uint64_t npts = fsize / ((ndims + 1) * sizeof(float)); std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims << std::endl; - _u64 blk_size = 131072; - _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + uint64_t blk_size = 131072; + uint64_t nblks = ROUND_UP(npts, blk_size) / blk_size; std::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]; - for (_u64 i = 0; i < nblks; i++) + for (uint64_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + uint64_t 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; } diff --git a/tests/utils/bin_to_tsv.cpp b/apps/utils/bin_to_tsv.cpp similarity index 75% rename from tests/utils/bin_to_tsv.cpp rename to apps/utils/bin_to_tsv.cpp index 813fa6e9f..7851bef6d 100644 --- a/tests/utils/bin_to_tsv.cpp +++ b/apps/utils/bin_to_tsv.cpp @@ -4,13 +4,14 @@ #include #include "utils.h" -template void block_convert(std::ofstream &writer, std::ifstream &reader, T *read_buf, _u64 npts, _u64 ndims) +template +void block_convert(std::ofstream &writer, std::ifstream &reader, T *read_buf, size_t npts, size_t ndims) { reader.read((char *)read_buf, npts * ndims * sizeof(float)); - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { - for (_u64 d = 0; d < ndims; d++) + for (size_t d = 0; d < ndims; d++) { writer << read_buf[d + i * ndims]; if (d < ndims - 1) @@ -36,22 +37,22 @@ int main(int argc, char **argv) } std::ifstream reader(argv[2], std::ios::binary); - _u32 npts_u32; - _u32 ndims_u32; - reader.read((char *)&npts_u32, sizeof(_s32)); - reader.read((char *)&ndims_u32, sizeof(_s32)); + uint32_t npts_u32; + uint32_t ndims_u32; + reader.read((char *)&npts_u32, sizeof(uint32_t)); + reader.read((char *)&ndims_u32, sizeof(uint32_t)); size_t npts = npts_u32; size_t ndims = ndims_u32; std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims << std::endl; - _u64 blk_size = 131072; - _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + size_t blk_size = 131072; + size_t nblks = ROUND_UP(npts, blk_size) / blk_size; std::ofstream writer(argv[3]); char *read_buf = new char[blk_size * ndims * 4]; - for (_u64 i = 0; i < nblks; i++) + for (size_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + size_t 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); else if (type_string == std::string("int8")) diff --git a/tests/utils/calculate_recall.cpp b/apps/utils/calculate_recall.cpp similarity index 79% rename from tests/utils/calculate_recall.cpp rename to apps/utils/calculate_recall.cpp index 3307104ce..dc76252cc 100644 --- a/tests/utils/calculate_recall.cpp +++ b/apps/utils/calculate_recall.cpp @@ -19,9 +19,9 @@ int main(int argc, char **argv) std::cout << argv[0] << " " << std::endl; return -1; } - unsigned *gold_std = NULL; + uint32_t *gold_std = NULL; float *gs_dist = nullptr; - unsigned *our_results = NULL; + uint32_t *our_results = NULL; float *or_dist = nullptr; size_t points_num, points_num_gs, points_num_or; size_t dim_gs; @@ -31,7 +31,9 @@ int main(int argc, char **argv) if (points_num_gs != points_num_or) { - std::cout << "Error. Number of queries mismatch in ground truth and our results" << std::endl; + std::cout << "Error. Number of queries mismatch in ground truth and " + "our results" + << std::endl; return -1; } points_num = points_num_gs; @@ -45,7 +47,8 @@ int main(int argc, char **argv) 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); + double recall_val = diskann::calculate_recall((uint32_t)points_num, gold_std, gs_dist, (uint32_t)dim_gs, + our_results, (uint32_t)dim_or, (uint32_t)recall_at); // double avg_recall = (recall*1.0)/(points_num*1.0); std::cout << "Avg. recall@" << recall_at << " is " << recall_val << "\n"; diff --git a/tests/utils/compute_groundtruth.cpp b/apps/utils/compute_groundtruth.cpp similarity index 63% rename from tests/utils/compute_groundtruth.cpp rename to apps/utils/compute_groundtruth.cpp index 231579d77..f33a26b84 100644 --- a/tests/utils/compute_groundtruth.cpp +++ b/apps/utils/compute_groundtruth.cpp @@ -18,13 +18,15 @@ #include #include #include +#include +#include #ifdef _WINDOWS #include #else #include #endif - +#include "filter_utils.h" #include "utils.h" // WORKS FOR UPTO 2 BILLION POINTS (as we use INT INSTEAD OF UNSIGNED) @@ -32,6 +34,10 @@ #define PARTSIZE 10000000 #define ALIGNMENT 512 +// custom types (for readability) +typedef tsl::robin_set label_set; +typedef std::string path; + namespace po = boost::program_options; template T div_round_up(const T numerator, const T denominator) @@ -39,7 +45,7 @@ template T div_round_up(const T numerator, const T denominator) return (numerator % denominator == 0) ? (numerator / denominator) : 1 + (numerator / denominator); } -using pairIF = std::pair; +using pairIF = std::pair; struct cmpmaxstruct { bool operator()(const pairIF &l, const pairIF &r) @@ -64,13 +70,13 @@ inline bool custom_dist(const std::pair &a, const std::pair::epsilon(); } - for (_u32 j = 0; j < dim; j++) + for (uint32_t j = 0; j < dim; j++) { points[i * dim + j] = points_in[i * dim + j] / norm; } } #pragma omp parallel for schedule(static, 4096) - for (_s64 i = 0; i < (_s64)nqueries; i++) + for (int64_t i = 0; i < (int64_t)nqueries; i++) { float norm = std::sqrt(queries_l2sq[i]); if (norm == 0) { norm = std::numeric_limits::epsilon(); } - for (_u32 j = 0; j < dim; j++) + for (uint32_t j = 0; j < dim; j++) { queries[i * dim + j] = queries_in[i * dim + j] / norm; } @@ -186,7 +192,7 @@ void exact_knn(const size_t dim, const size_t k, size_t q_batch_size = (1 << 9); float *dist_matrix = new float[(size_t)q_batch_size * (size_t)npoints]; - for (_u64 b = 0; b < div_round_up(nqueries, q_batch_size); ++b) + for (size_t b = 0; b < div_round_up(nqueries, q_batch_size); ++b) { int64_t q_b = b * q_batch_size; int64_t q_e = ((b + 1) * q_batch_size > nqueries) ? nqueries : (b + 1) * q_batch_size; @@ -207,9 +213,9 @@ void exact_knn(const size_t dim, const size_t k, for (long long q = q_b; q < q_e; q++) { maxPQIFCS point_dist; - for (_u64 p = 0; p < k; p++) + for (size_t p = 0; p < k; p++) point_dist.emplace(p, dist_matrix[(ptrdiff_t)p + (ptrdiff_t)(q - q_b) * (ptrdiff_t)npoints]); - for (_u64 p = k; p < npoints; p++) + for (size_t p = k; p < npoints; p++) { if (point_dist.top().second > dist_matrix[(ptrdiff_t)p + (ptrdiff_t)(q - q_b) * (ptrdiff_t)npoints]) point_dist.emplace(p, dist_matrix[(ptrdiff_t)p + (ptrdiff_t)(q - q_b) * (ptrdiff_t)npoints]); @@ -251,13 +257,14 @@ template inline int get_num_parts(const char *filename) reader.read((char *)&ndims_i32, sizeof(int)); std::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; + uint32_t num_parts = + (npts_i32 % PARTSIZE) == 0 ? npts_i32 / PARTSIZE : (uint32_t)std::floor(npts_i32 / PARTSIZE) + 1; std::cout << "Number of parts: " << num_parts << std::endl; return num_parts; } template -inline void load_bin_as_float(const char *filename, float *&data, size_t &npts_u64, size_t &ndims_u64, int part_num) +inline void load_bin_as_float(const char *filename, float *&data, size_t &npts, size_t &ndims, int part_num) { std::ifstream reader; reader.exceptions(std::ios::failbit | std::ios::badbit); @@ -268,87 +275,28 @@ inline void load_bin_as_float(const char *filename, float *&data, size_t &npts_u reader.read((char *)&ndims_i32, sizeof(int)); uint64_t start_id = part_num * PARTSIZE; uint64_t end_id = (std::min)(start_id + PARTSIZE, (uint64_t)npts_i32); - npts_u64 = end_id - start_id; - ndims_u64 = (uint64_t)ndims_i32; - std::cout << "#pts in part = " << npts_u64 << ", #dims = " << ndims_u64 - << ", size = " << npts_u64 * ndims_u64 * sizeof(T) << "B" << std::endl; - - reader.seekg(start_id * ndims_u64 * sizeof(T) + 2 * sizeof(uint32_t), std::ios::beg); - T *data_T = new T[npts_u64 * ndims_u64]; - reader.read((char *)data_T, sizeof(T) * npts_u64 * ndims_u64); - std::cout << "Finished reading part of the bin file." << std::endl; - reader.close(); - data = aligned_malloc(npts_u64 * ndims_u64, ALIGNMENT); -#pragma omp parallel for schedule(dynamic, 32768) - for (int64_t i = 0; i < (int64_t)npts_u64; i++) - { - for (int64_t j = 0; j < (int64_t)ndims_u64; j++) - { - float cur_val_float = (float)data_T[i * ndims_u64 + j]; - std::memcpy((char *)(data + i * ndims_u64 + j), (char *)&cur_val_float, sizeof(float)); - } - } - delete[] data_T; - std::cout << "Finished converting part data to float." << std::endl; -} - -template -inline std::vector load_filtered_bin_as_float(const char *filename, float *&data, size_t &npts, size_t &ndims, - int part_num, const char *label_file, - const std::string &filter_label, - const std::string &universal_label, size_t &npoints_filt, - std::vector> &pts_to_labels) -{ - std::ifstream reader(filename, std::ios::binary); - if (reader.fail()) - { - throw diskann::ANNException(std::string("Failed to open file ") + filename, -1); - } - - std::cout << "Reading bin file " << filename << " ...\n"; - int npts_i32, ndims_i32; - std::vector rev_map; - reader.read((char *)&npts_i32, sizeof(int)); - reader.read((char *)&ndims_i32, sizeof(int)); - uint64_t start_id = part_num * PARTSIZE; - uint64_t end_id = (std::min)(start_id + PARTSIZE, (uint64_t)npts_i32); npts = end_id - start_id; - ndims = (unsigned)ndims_i32; - uint64_t nptsuint64_t = (uint64_t)npts; - uint64_t ndimsuint64_t = (uint64_t)ndims; - npoints_filt = 0; - std::cout << "#pts in part = " << npts << ", #dims = " << ndims - << ", size = " << nptsuint64_t * ndimsuint64_t * sizeof(T) << "B" << std::endl; - std::cout << "start and end ids: " << start_id << ", " << end_id << std::endl; - reader.seekg(start_id * ndims * sizeof(T) + 2 * sizeof(uint32_t), std::ios::beg); + ndims = (uint64_t)ndims_i32; + std::cout << "#pts in part = " << npts << ", #dims = " << ndims << ", size = " << npts * ndims * sizeof(T) << "B" + << std::endl; - T *data_T = new T[nptsuint64_t * ndimsuint64_t]; - reader.read((char *)data_T, sizeof(T) * nptsuint64_t * ndimsuint64_t); + reader.seekg(start_id * ndims * sizeof(T) + 2 * sizeof(uint32_t), std::ios::beg); + T *data_T = new T[npts * ndims]; + reader.read((char *)data_T, sizeof(T) * npts * ndims); std::cout << "Finished reading part of the bin file." << std::endl; reader.close(); - - data = aligned_malloc(nptsuint64_t * ndimsuint64_t, ALIGNMENT); - - for (int64_t i = 0; i < (int64_t)nptsuint64_t; i++) + data = aligned_malloc(npts * ndims, ALIGNMENT); +#pragma omp parallel for schedule(dynamic, 32768) + for (int64_t i = 0; i < (int64_t)npts; i++) { - if (std::find(pts_to_labels[start_id + i].begin(), pts_to_labels[start_id + i].end(), filter_label) != - pts_to_labels[start_id + i].end() || - std::find(pts_to_labels[start_id + i].begin(), pts_to_labels[start_id + i].end(), universal_label) != - pts_to_labels[start_id + i].end()) + for (int64_t j = 0; j < (int64_t)ndims; j++) { - rev_map.push_back(start_id + i); - for (int64_t j = 0; j < (int64_t)ndimsuint64_t; j++) - { - float cur_val_float = (float)data_T[i * ndimsuint64_t + j]; - std::memcpy((char *)(data + npoints_filt * ndimsuint64_t + j), (char *)&cur_val_float, sizeof(float)); - } - npoints_filt++; + float cur_val_float = (float)data_T[i * ndims + j]; + std::memcpy((char *)(data + i * ndims + j), (char *)&cur_val_float, sizeof(float)); } } delete[] data_T; - std::cout << "Finished converting part data to float.. identified " << npoints_filt - << " points matching the filter." << std::endl; - return rev_map; + std::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) @@ -377,7 +325,7 @@ inline void save_groundtruth_as_one_file(const std::string filename, int32_t *da 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) + << npts << ", dim = " << ndims << ", size = " << 2 * npts * ndims * sizeof(uint32_t) + 2 * sizeof(int) << "B" << std::endl; writer.write((char *)data, npts * ndims * sizeof(uint32_t)); @@ -386,153 +334,73 @@ inline void save_groundtruth_as_one_file(const std::string filename, int32_t *da std::cout << "Finished writing truthset" << std::endl; } -inline void parse_label_file_into_vec(size_t &line_cnt, const std::string &map_file, - std::vector> &pts_to_labels) +template +std::vector>> processUnfilteredParts(const std::string &base_file, + size_t &nqueries, size_t &npoints, + size_t &dim, size_t &k, float *query_data, + const diskann::Metric &metric, + std::vector &location_to_tag) { - std::ifstream infile(map_file); - std::string line, token; - std::set labels; - infile.clear(); - infile.seekg(0, std::ios::beg); - while (std::getline(infile, line)) + float *base_data = nullptr; + int num_parts = get_num_parts(base_file.c_str()); + std::vector>> res(nqueries); + for (int p = 0; p < num_parts; p++) { - std::istringstream iss(line); - std::vector lbls(0); + size_t start_id = p * PARTSIZE; + load_bin_as_float(base_file.c_str(), base_data, npoints, dim, p); - getline(iss, token, '\t'); - std::istringstream new_iss(token); - while (getline(new_iss, token, ',')) - { - token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); - token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); - lbls.push_back(token); - labels.insert(token); - } - if (lbls.size() <= 0) + size_t *closest_points_part = new size_t[nqueries * k]; + float *dist_closest_points_part = new float[nqueries * k]; + + auto part_k = k < npoints ? k : npoints; + exact_knn(dim, part_k, closest_points_part, dist_closest_points_part, npoints, base_data, nqueries, query_data, + metric); + + for (size_t i = 0; i < nqueries; i++) { - std::cout << "No label found"; - exit(-1); + for (size_t j = 0; j < part_k; j++) + { + if (!location_to_tag.empty()) + if (location_to_tag[closest_points_part[i * k + j] + start_id] == 0) + continue; + + res[i].push_back(std::make_pair((uint32_t)(closest_points_part[i * part_k + j] + start_id), + dist_closest_points_part[i * part_k + j])); + } } - std::sort(lbls.begin(), lbls.end()); - pts_to_labels.push_back(lbls); + + delete[] closest_points_part; + delete[] dist_closest_points_part; + + diskann::aligned_free(base_data); } - std::cout << "Identified " << labels.size() << " distinct label(s), and populated labels for " - << pts_to_labels.size() << " points" << std::endl; -} + return res; +}; template -int aux_main(const std::string &base_file, const std::string &label_file, const std::string &query_file, - const std::string >_file, size_t k, const std::string &filter_label, const std::string &universal_label, +int aux_main(const std::string &base_file, const std::string &query_file, const std::string >_file, size_t k, const diskann::Metric &metric, const std::string &tags_file = std::string("")) { - size_t npoints, nqueries, dim, npoints_filt; + size_t npoints, nqueries, dim; - float *base_data; float *query_data; - const bool tags_enabled = tags_file.empty() ? false : true; - - int num_parts = get_num_parts(base_file.c_str()); load_bin_as_float(query_file.c_str(), query_data, nqueries, dim, 0); if (nqueries > PARTSIZE) std::cerr << "WARNING: #Queries provided (" << nqueries << ") is greater than " << PARTSIZE << ". Computing GT only for the first " << PARTSIZE << " queries." << std::endl; // load tags - std::vector location_to_tag; - if (tags_enabled) - { - size_t tag_file_ndims, tag_file_npts; - std::uint32_t *tag_data; - diskann::load_bin(tags_file, tag_data, tag_file_npts, tag_file_ndims); - if (tag_file_ndims != 1) - { - diskann::cerr << "tags file error" << std::endl; - throw diskann::ANNException("tag file error", -1, __FUNCSIG__, __FILE__, __LINE__); - } - - // check if the point count match - size_t base_file_npts, base_file_ndims; - diskann::get_bin_metadata(base_file, base_file_npts, base_file_ndims); - if (base_file_npts != tag_file_npts) - { - diskann::cerr << "point num in tags file mismatch" << std::endl; - throw diskann::ANNException("point num in tags file mismatch", -1, __FUNCSIG__, __FILE__, __LINE__); - } - - location_to_tag.assign(tag_data, tag_data + tag_file_npts); - delete[] tag_data; - } - - std::vector>> results(nqueries); + const bool tags_enabled = tags_file.empty() ? false : true; + std::vector location_to_tag = diskann::loadTags(tags_file, base_file); int *closest_points = new int[nqueries * k]; float *dist_closest_points = new float[nqueries * k]; - std::vector> pts_to_labels; - if (filter_label != "") - parse_label_file_into_vec(npoints, label_file, pts_to_labels); - std::vector rev_map; + std::vector>> results = + processUnfilteredParts(base_file, nqueries, npoints, dim, k, query_data, metric, location_to_tag); - for (int p = 0; p < num_parts; p++) - { - size_t start_id = p * PARTSIZE; - if (filter_label == "") - { - load_bin_as_float(base_file.c_str(), base_data, npoints, dim, p); - } - else - { - rev_map = load_filtered_bin_as_float(base_file.c_str(), base_data, npoints, dim, p, label_file.c_str(), - filter_label, universal_label, npoints_filt, pts_to_labels); - } - int *closest_points_part = new int[nqueries * k]; - float *dist_closest_points_part = new float[nqueries * k]; - - _u32 part_k; - if (filter_label == "") - { - part_k = k < npoints ? k : npoints; - exact_knn(dim, part_k, closest_points_part, dist_closest_points_part, npoints, base_data, nqueries, - query_data, metric); - } - else - { - part_k = k < npoints_filt ? k : npoints_filt; - if (npoints_filt > 0) - { - exact_knn(dim, part_k, closest_points_part, dist_closest_points_part, npoints_filt, base_data, nqueries, - query_data, metric); - } - } - - for (_u64 i = 0; i < nqueries; i++) - { - for (_u64 j = 0; j < part_k; j++) - { - if (tags_enabled) - if (location_to_tag[closest_points_part[i * k + j] + start_id] == 0) - continue; - if (filter_label == "") - { - results[i].push_back(std::make_pair((uint32_t)(closest_points_part[i * part_k + j] + start_id), - dist_closest_points_part[i * part_k + j])); - } - else - { - results[i].push_back(std::make_pair((uint32_t)(rev_map[closest_points_part[i * part_k + j]]), - dist_closest_points_part[i * part_k + j])); - } - } - } - - delete[] closest_points_part; - delete[] dist_closest_points_part; - - diskann::aligned_free(base_data); - } - - for (_u64 i = 0; i < nqueries; i++) + for (size_t i = 0; i < nqueries; i++) { std::vector> &cur_res = results[i]; std::sort(cur_res.begin(), cur_res.end(), custom_dist); @@ -563,16 +431,65 @@ int aux_main(const std::string &base_file, const std::string &label_file, const } save_groundtruth_as_one_file(gt_file, closest_points, dist_closest_points, nqueries, k); - diskann::aligned_free(query_data); delete[] closest_points; delete[] dist_closest_points; + diskann::aligned_free(query_data); + return 0; } +void load_truthset(const std::string &bin_file, uint32_t *&ids, float *&dists, size_t &npts, size_t &dim) +{ + size_t read_blk_size = 64 * 1024 * 1024; + cached_ifstream reader(bin_file, read_blk_size); + diskann::cout << "Reading truthset file " << bin_file.c_str() << " ..." << std::endl; + size_t actual_file_size = reader.get_file_size(); + + int npts_i32, dim_i32; + reader.read((char *)&npts_i32, sizeof(int)); + reader.read((char *)&dim_i32, sizeof(int)); + npts = (uint32_t)npts_i32; + dim = (uint32_t)dim_i32; + + diskann::cout << "Metadata: #pts = " << npts << ", #dims = " << dim << "... " << std::endl; + + int truthset_type = -1; // 1 means truthset has ids and distances, 2 means + // only ids, -1 is error + size_t expected_file_size_with_dists = 2 * npts * dim * sizeof(uint32_t) + 2 * sizeof(uint32_t); + + if (actual_file_size == expected_file_size_with_dists) + truthset_type = 1; + + size_t expected_file_size_just_ids = npts * dim * sizeof(uint32_t) + 2 * sizeof(uint32_t); + + if (actual_file_size == expected_file_size_just_ids) + truthset_type = 2; + + if (truthset_type == -1) + { + std::stringstream stream; + stream << "Error. File size mismatch. File should have bin format, with " + "npts followed by ngt followed by npts*ngt ids and optionally " + "followed by npts*ngt distance values; actual size: " + << actual_file_size << ", expected: " << expected_file_size_with_dists << " or " + << expected_file_size_just_ids; + diskann::cout << stream.str(); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); + } + + ids = new uint32_t[npts * dim]; + reader.read((char *)ids, npts * dim * sizeof(uint32_t)); + + if (truthset_type == 1) + { + dists = new float[npts * dim]; + reader.read((char *)dists, npts * dim * sizeof(float)); + } +} + int main(int argc, char **argv) { - std::string data_type, dist_fn, base_file, query_file, gt_file, tags_file, label_file, filter_label, - universal_label; + std::string data_type, dist_fn, base_file, query_file, gt_file, tags_file; uint64_t K; try @@ -587,15 +504,12 @@ int main(int argc, char **argv) "File containing the base vectors in binary format"); desc.add_options()("query_file", po::value(&query_file)->required(), "File containing the query vectors in binary format"); - desc.add_options()("label_file", po::value(&label_file)->default_value(""), - "Input labels file in txt format if present"); - desc.add_options()("filter_label", po::value(&filter_label)->default_value(""), - "Input filter label if doing filtered groundtruth"); - desc.add_options()("universal_label", po::value(&universal_label)->default_value(""), - "Universal label, if using it, only in conjunction with label_file"); - desc.add_options()("gt_file", po::value(>_file)->required(), - "File name for the writing ground truth in binary format"); + "File name for the writing ground truth in binary " + "format, please don' append .bin at end if " + "no filter_label or filter_label_file is provided it " + "will save the file with '.bin' at end." + "else it will save the file as filename_label.bin"); desc.add_options()("K", po::value(&K)->required(), "Number of ground truth nearest neighbors to compute"); desc.add_options()("tags_file", po::value(&tags_file)->default_value(std::string()), @@ -644,14 +558,11 @@ int main(int argc, char **argv) try { if (data_type == std::string("float")) - aux_main(base_file, label_file, query_file, gt_file, K, filter_label, universal_label, metric, - tags_file); + aux_main(base_file, query_file, gt_file, K, metric, tags_file); if (data_type == std::string("int8")) - aux_main(base_file, label_file, query_file, gt_file, K, filter_label, universal_label, metric, - tags_file); + aux_main(base_file, query_file, gt_file, K, metric, tags_file); if (data_type == std::string("uint8")) - aux_main(base_file, label_file, query_file, gt_file, K, filter_label, universal_label, metric, - tags_file); + aux_main(base_file, query_file, gt_file, K, metric, tags_file); } catch (const std::exception &e) { diff --git a/apps/utils/compute_groundtruth_for_filters.cpp b/apps/utils/compute_groundtruth_for_filters.cpp new file mode 100644 index 000000000..5be7135e1 --- /dev/null +++ b/apps/utils/compute_groundtruth_for_filters.cpp @@ -0,0 +1,924 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WINDOWS +#include +#else +#include +#endif + +#include "filter_utils.h" +#include "utils.h" + +// WORKS FOR UPTO 2 BILLION POINTS (as we use INT INSTEAD OF UNSIGNED) + +#define PARTSIZE 10000000 +#define ALIGNMENT 512 + +// custom types (for readability) +typedef tsl::robin_set label_set; +typedef std::string path; + +namespace po = boost::program_options; + +template T div_round_up(const T numerator, const T denominator) +{ + return (numerator % denominator == 0) ? (numerator / denominator) : 1 + (numerator / denominator); +} + +using pairIF = std::pair; +struct cmpmaxstruct +{ + bool operator()(const pairIF &l, const pairIF &r) + { + return l.second < r.second; + }; +}; + +using maxPQIFCS = std::priority_queue, cmpmaxstruct>; + +template T *aligned_malloc(const size_t n, const size_t alignment) +{ +#ifdef _WINDOWS + return (T *)_aligned_malloc(sizeof(T) * n, alignment); +#else + return static_cast(aligned_alloc(alignment, sizeof(T) * n)); +#endif +} + +inline bool custom_dist(const std::pair &a, const std::pair &b) +{ + return a.second < b.second; +} + +void compute_l2sq(float *const points_l2sq, const float *const matrix, const int64_t num_points, const uint64_t dim) +{ + assert(points_l2sq != NULL); +#pragma omp parallel for schedule(static, 65536) + for (int64_t d = 0; d < num_points; ++d) + points_l2sq[d] = cblas_sdot((int64_t)dim, matrix + (ptrdiff_t)d * (ptrdiff_t)dim, 1, + matrix + (ptrdiff_t)d * (ptrdiff_t)dim, 1); +} + +void distsq_to_points(const size_t dim, + float *dist_matrix, // Col Major, cols are queries, rows are points + size_t npoints, const float *const points, + const float *const points_l2sq, // points in Col major + size_t nqueries, const float *const queries, + const float *const queries_l2sq, // queries in Col major + float *ones_vec = NULL) // Scratchspace of num_data size and init to 1.0 +{ + bool ones_vec_alloc = false; + if (ones_vec == NULL) + { + ones_vec = new float[nqueries > npoints ? nqueries : npoints]; + std::fill_n(ones_vec, nqueries > npoints ? nqueries : npoints, (float)1.0); + ones_vec_alloc = true; + } + cblas_sgemm(CblasColMajor, CblasTrans, CblasNoTrans, npoints, nqueries, dim, (float)-2.0, points, dim, queries, dim, + (float)0.0, dist_matrix, npoints); + cblas_sgemm(CblasColMajor, CblasNoTrans, CblasTrans, npoints, nqueries, 1, (float)1.0, points_l2sq, npoints, + ones_vec, nqueries, (float)1.0, dist_matrix, npoints); + cblas_sgemm(CblasColMajor, CblasNoTrans, CblasTrans, npoints, nqueries, 1, (float)1.0, ones_vec, npoints, + queries_l2sq, nqueries, (float)1.0, dist_matrix, npoints); + if (ones_vec_alloc) + delete[] ones_vec; +} + +void inner_prod_to_points(const size_t dim, + float *dist_matrix, // Col Major, cols are queries, rows are points + size_t npoints, const float *const points, size_t nqueries, const float *const queries, + float *ones_vec = NULL) // Scratchspace of num_data size and init to 1.0 +{ + bool ones_vec_alloc = false; + if (ones_vec == NULL) + { + ones_vec = new float[nqueries > npoints ? nqueries : npoints]; + std::fill_n(ones_vec, nqueries > npoints ? nqueries : npoints, (float)1.0); + ones_vec_alloc = true; + } + cblas_sgemm(CblasColMajor, CblasTrans, CblasNoTrans, npoints, nqueries, dim, (float)-1.0, points, dim, queries, dim, + (float)0.0, dist_matrix, npoints); + + if (ones_vec_alloc) + delete[] ones_vec; +} + +void exact_knn(const size_t dim, const size_t k, + size_t *const closest_points, // k * num_queries preallocated, col + // major, queries columns + float *const dist_closest_points, // k * num_queries + // preallocated, Dist to + // corresponding closes_points + size_t npoints, + float *points_in, // points in Col major + size_t nqueries, float *queries_in, + diskann::Metric metric = diskann::Metric::L2) // queries in Col major +{ + float *points_l2sq = new float[npoints]; + float *queries_l2sq = new float[nqueries]; + compute_l2sq(points_l2sq, points_in, npoints, dim); + compute_l2sq(queries_l2sq, queries_in, nqueries, dim); + + float *points = points_in; + float *queries = queries_in; + + if (metric == diskann::Metric::COSINE) + { // we convert cosine distance as + // normalized L2 distnace + points = new float[npoints * dim]; + queries = new float[nqueries * dim]; +#pragma omp parallel for schedule(static, 4096) + for (int64_t i = 0; i < (int64_t)npoints; i++) + { + float norm = std::sqrt(points_l2sq[i]); + if (norm == 0) + { + norm = std::numeric_limits::epsilon(); + } + for (uint32_t j = 0; j < dim; j++) + { + points[i * dim + j] = points_in[i * dim + j] / norm; + } + } + +#pragma omp parallel for schedule(static, 4096) + for (int64_t i = 0; i < (int64_t)nqueries; i++) + { + float norm = std::sqrt(queries_l2sq[i]); + if (norm == 0) + { + norm = std::numeric_limits::epsilon(); + } + for (uint32_t j = 0; j < dim; j++) + { + queries[i * dim + j] = queries_in[i * dim + j] / norm; + } + } + // recalculate norms after normalizing, they should all be one. + compute_l2sq(points_l2sq, points, npoints, dim); + compute_l2sq(queries_l2sq, queries, nqueries, dim); + } + + std::cout << "Going to compute " << k << " NNs for " << nqueries << " queries over " << npoints << " points in " + << dim << " dimensions using"; + if (metric == diskann::Metric::INNER_PRODUCT) + std::cout << " MIPS "; + else if (metric == diskann::Metric::COSINE) + std::cout << " Cosine "; + else + std::cout << " L2 "; + std::cout << "distance fn. " << std::endl; + + size_t q_batch_size = (1 << 9); + float *dist_matrix = new float[(size_t)q_batch_size * (size_t)npoints]; + + for (uint64_t b = 0; b < div_round_up(nqueries, q_batch_size); ++b) + { + int64_t q_b = b * q_batch_size; + int64_t q_e = ((b + 1) * q_batch_size > nqueries) ? nqueries : (b + 1) * q_batch_size; + + if (metric == diskann::Metric::L2 || metric == diskann::Metric::COSINE) + { + 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); + } + else + { + inner_prod_to_points(dim, dist_matrix, npoints, points, q_e - q_b, + queries + (ptrdiff_t)q_b * (ptrdiff_t)dim); + } + std::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++) + { + maxPQIFCS point_dist; + for (size_t p = 0; p < k; p++) + point_dist.emplace(p, dist_matrix[(ptrdiff_t)p + (ptrdiff_t)(q - q_b) * (ptrdiff_t)npoints]); + for (size_t p = k; p < npoints; p++) + { + if (point_dist.top().second > dist_matrix[(ptrdiff_t)p + (ptrdiff_t)(q - q_b) * (ptrdiff_t)npoints]) + point_dist.emplace(p, dist_matrix[(ptrdiff_t)p + (ptrdiff_t)(q - q_b) * (ptrdiff_t)npoints]); + if (point_dist.size() > k) + point_dist.pop(); + } + for (ptrdiff_t l = 0; l < (ptrdiff_t)k; ++l) + { + closest_points[(ptrdiff_t)(k - 1 - l) + (ptrdiff_t)q * (ptrdiff_t)k] = point_dist.top().first; + dist_closest_points[(ptrdiff_t)(k - 1 - l) + (ptrdiff_t)q * (ptrdiff_t)k] = point_dist.top().second; + point_dist.pop(); + } + assert(std::is_sorted(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; + } + + delete[] dist_matrix; + + delete[] points_l2sq; + delete[] queries_l2sq; + + if (metric == diskann::Metric::COSINE) + { + delete[] points; + delete[] queries; + } +} + +template inline int get_num_parts(const char *filename) +{ + std::ifstream reader; + reader.exceptions(std::ios::failbit | std::ios::badbit); + reader.open(filename, std::ios::binary); + std::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; + reader.close(); + int num_parts = (npts_i32 % PARTSIZE) == 0 ? npts_i32 / PARTSIZE : (uint32_t)std::floor(npts_i32 / PARTSIZE) + 1; + std::cout << "Number of parts: " << num_parts << std::endl; + return num_parts; +} + +template +inline void load_bin_as_float(const char *filename, float *&data, size_t &npts_u64, size_t &ndims_u64, int part_num) +{ + std::ifstream reader; + reader.exceptions(std::ios::failbit | std::ios::badbit); + reader.open(filename, std::ios::binary); + std::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)); + uint64_t start_id = part_num * PARTSIZE; + uint64_t end_id = (std::min)(start_id + PARTSIZE, (uint64_t)npts_i32); + npts_u64 = end_id - start_id; + ndims_u64 = (uint64_t)ndims_i32; + std::cout << "#pts in part = " << npts_u64 << ", #dims = " << ndims_u64 + << ", size = " << npts_u64 * ndims_u64 * sizeof(T) << "B" << std::endl; + + reader.seekg(start_id * ndims_u64 * sizeof(T) + 2 * sizeof(uint32_t), std::ios::beg); + T *data_T = new T[npts_u64 * ndims_u64]; + reader.read((char *)data_T, sizeof(T) * npts_u64 * ndims_u64); + std::cout << "Finished reading part of the bin file." << std::endl; + reader.close(); + data = aligned_malloc(npts_u64 * ndims_u64, ALIGNMENT); +#pragma omp parallel for schedule(dynamic, 32768) + for (int64_t i = 0; i < (int64_t)npts_u64; i++) + { + for (int64_t j = 0; j < (int64_t)ndims_u64; j++) + { + float cur_val_float = (float)data_T[i * ndims_u64 + j]; + std::memcpy((char *)(data + i * ndims_u64 + j), (char *)&cur_val_float, sizeof(float)); + } + } + delete[] data_T; + std::cout << "Finished converting part data to float." << std::endl; +} + +template +inline std::vector load_filtered_bin_as_float(const char *filename, float *&data, size_t &npts, size_t &ndims, + int part_num, const char *label_file, + const std::string &filter_label, + const std::string &universal_label, size_t &npoints_filt, + std::vector> &pts_to_labels) +{ + std::ifstream reader(filename, std::ios::binary); + if (reader.fail()) + { + throw diskann::ANNException(std::string("Failed to open file ") + filename, -1); + } + + std::cout << "Reading bin file " << filename << " ...\n"; + int npts_i32, ndims_i32; + std::vector rev_map; + reader.read((char *)&npts_i32, sizeof(int)); + reader.read((char *)&ndims_i32, sizeof(int)); + uint64_t start_id = part_num * PARTSIZE; + uint64_t end_id = (std::min)(start_id + PARTSIZE, (uint64_t)npts_i32); + npts = end_id - start_id; + ndims = (uint32_t)ndims_i32; + uint64_t nptsuint64_t = (uint64_t)npts; + uint64_t ndimsuint64_t = (uint64_t)ndims; + npoints_filt = 0; + std::cout << "#pts in part = " << npts << ", #dims = " << ndims + << ", size = " << nptsuint64_t * ndimsuint64_t * sizeof(T) << "B" << std::endl; + std::cout << "start and end ids: " << start_id << ", " << end_id << std::endl; + reader.seekg(start_id * ndims * sizeof(T) + 2 * sizeof(uint32_t), std::ios::beg); + + 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; + reader.close(); + + data = aligned_malloc(nptsuint64_t * ndimsuint64_t, ALIGNMENT); + + for (int64_t i = 0; i < (int64_t)nptsuint64_t; i++) + { + if (std::find(pts_to_labels[start_id + i].begin(), pts_to_labels[start_id + i].end(), filter_label) != + pts_to_labels[start_id + i].end() || + std::find(pts_to_labels[start_id + i].begin(), pts_to_labels[start_id + i].end(), universal_label) != + pts_to_labels[start_id + i].end()) + { + rev_map.push_back(start_id + i); + for (int64_t j = 0; j < (int64_t)ndimsuint64_t; j++) + { + float cur_val_float = (float)data_T[i * ndimsuint64_t + j]; + std::memcpy((char *)(data + npoints_filt * ndimsuint64_t + j), (char *)&cur_val_float, sizeof(float)); + } + npoints_filt++; + } + } + delete[] data_T; + std::cout << "Finished converting part data to float.. identified " << npoints_filt + << " points matching the filter." << std::endl; + return rev_map; +} + +template inline void save_bin(const std::string filename, T *data, size_t npts, size_t ndims) +{ + std::ofstream writer; + writer.exceptions(std::ios::failbit | std::ios::badbit); + writer.open(filename, std::ios::binary | std::ios::out); + std::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; + + writer.write((char *)data, npts * ndims * sizeof(T)); + writer.close(); + std::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) +{ + 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(uint32_t) + 2 * sizeof(int) + << "B" << std::endl; + + writer.write((char *)data, npts * ndims * sizeof(uint32_t)); + writer.write((char *)distances, npts * ndims * sizeof(float)); + writer.close(); + std::cout << "Finished writing truthset" << std::endl; +} + +inline void parse_label_file_into_vec(size_t &line_cnt, const std::string &map_file, + std::vector> &pts_to_labels) +{ + std::ifstream infile(map_file); + std::string line, token; + std::set labels; + infile.clear(); + infile.seekg(0, std::ios::beg); + while (std::getline(infile, line)) + { + std::istringstream iss(line); + std::vector lbls(0); + + getline(iss, token, '\t'); + std::istringstream new_iss(token); + while (getline(new_iss, token, ',')) + { + token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); + token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); + lbls.push_back(token); + labels.insert(token); + } + if (lbls.size() <= 0) + { + std::cout << "No label found"; + exit(-1); + } + std::sort(lbls.begin(), lbls.end()); + pts_to_labels.push_back(lbls); + } + std::cout << "Identified " << labels.size() << " distinct label(s), and populated labels for " + << pts_to_labels.size() << " points" << std::endl; +} + +template +std::vector>> processUnfilteredParts(const std::string &base_file, + size_t &nqueries, size_t &npoints, + size_t &dim, size_t &k, float *query_data, + const diskann::Metric &metric, + std::vector &location_to_tag) +{ + float *base_data = nullptr; + int num_parts = get_num_parts(base_file.c_str()); + std::vector>> res(nqueries); + for (int p = 0; p < num_parts; p++) + { + size_t start_id = p * PARTSIZE; + load_bin_as_float(base_file.c_str(), base_data, npoints, dim, p); + + size_t *closest_points_part = new size_t[nqueries * k]; + float *dist_closest_points_part = new float[nqueries * k]; + + auto part_k = k < npoints ? k : npoints; + exact_knn(dim, part_k, closest_points_part, dist_closest_points_part, npoints, base_data, nqueries, query_data, + metric); + + for (size_t i = 0; i < nqueries; i++) + { + for (uint64_t j = 0; j < part_k; j++) + { + if (!location_to_tag.empty()) + if (location_to_tag[closest_points_part[i * k + j] + start_id] == 0) + continue; + + res[i].push_back(std::make_pair((uint32_t)(closest_points_part[i * part_k + j] + start_id), + dist_closest_points_part[i * part_k + j])); + } + } + + delete[] closest_points_part; + delete[] dist_closest_points_part; + + diskann::aligned_free(base_data); + } + return res; +}; + +template +std::vector>> processFilteredParts( + const std::string &base_file, const std::string &label_file, const std::string &filter_label, + const std::string &universal_label, size_t &nqueries, size_t &npoints, size_t &dim, size_t &k, float *query_data, + const diskann::Metric &metric, std::vector &location_to_tag) +{ + size_t npoints_filt = 0; + float *base_data = nullptr; + std::vector>> res(nqueries); + int num_parts = get_num_parts(base_file.c_str()); + + std::vector> pts_to_labels; + if (filter_label != "") + parse_label_file_into_vec(npoints, label_file, pts_to_labels); + + for (int p = 0; p < num_parts; p++) + { + size_t start_id = p * PARTSIZE; + std::vector rev_map; + if (filter_label != "") + rev_map = load_filtered_bin_as_float(base_file.c_str(), base_data, npoints, dim, p, label_file.c_str(), + filter_label, universal_label, npoints_filt, pts_to_labels); + size_t *closest_points_part = new size_t[nqueries * k]; + float *dist_closest_points_part = new float[nqueries * k]; + + auto part_k = k < npoints_filt ? k : npoints_filt; + if (npoints_filt > 0) + { + exact_knn(dim, part_k, closest_points_part, dist_closest_points_part, npoints_filt, base_data, nqueries, + query_data, metric); + } + + for (size_t i = 0; i < nqueries; i++) + { + for (uint64_t j = 0; j < part_k; j++) + { + if (!location_to_tag.empty()) + if (location_to_tag[closest_points_part[i * k + j] + start_id] == 0) + continue; + + res[i].push_back(std::make_pair((uint32_t)(rev_map[closest_points_part[i * part_k + j]]), + dist_closest_points_part[i * part_k + j])); + } + } + + delete[] closest_points_part; + delete[] dist_closest_points_part; + + diskann::aligned_free(base_data); + } + return res; +}; + +template +int aux_main(const std::string &base_file, const std::string &label_file, const std::string &query_file, + const std::string >_file, size_t k, const std::string &universal_label, const diskann::Metric &metric, + const std::string &filter_label, const std::string &tags_file = std::string("")) +{ + size_t npoints, nqueries, dim; + + float *query_data = nullptr; + + load_bin_as_float(query_file.c_str(), query_data, nqueries, dim, 0); + if (nqueries > PARTSIZE) + std::cerr << "WARNING: #Queries provided (" << nqueries << ") is greater than " << PARTSIZE + << ". Computing GT only for the first " << PARTSIZE << " queries." << std::endl; + + // load tags + const bool tags_enabled = tags_file.empty() ? false : true; + std::vector location_to_tag = diskann::loadTags(tags_file, base_file); + + int *closest_points = new int[nqueries * k]; + float *dist_closest_points = new float[nqueries * k]; + + std::vector>> results; + if (filter_label == "") + { + results = processUnfilteredParts(base_file, nqueries, npoints, dim, k, query_data, metric, location_to_tag); + } + else + { + results = processFilteredParts(base_file, label_file, filter_label, universal_label, nqueries, npoints, dim, + k, query_data, metric, location_to_tag); + } + + for (size_t i = 0; i < nqueries; i++) + { + std::vector> &cur_res = results[i]; + std::sort(cur_res.begin(), cur_res.end(), custom_dist); + size_t j = 0; + for (auto iter : cur_res) + { + if (j == k) + break; + if (tags_enabled) + { + std::uint32_t index_with_tag = location_to_tag[iter.first]; + closest_points[i * k + j] = (int32_t)index_with_tag; + } + else + { + closest_points[i * k + j] = (int32_t)iter.first; + } + + if (metric == diskann::Metric::INNER_PRODUCT) + dist_closest_points[i * k + j] = -iter.second; + else + dist_closest_points[i * k + j] = iter.second; + + ++j; + } + if (j < k) + std::cout << "WARNING: found less than k GT entries for query " << i << std::endl; + } + + save_groundtruth_as_one_file(gt_file, closest_points, dist_closest_points, nqueries, k); + delete[] closest_points; + delete[] dist_closest_points; + diskann::aligned_free(query_data); + + return 0; +} + +void load_truthset(const std::string &bin_file, uint32_t *&ids, float *&dists, size_t &npts, size_t &dim) +{ + size_t read_blk_size = 64 * 1024 * 1024; + cached_ifstream reader(bin_file, read_blk_size); + diskann::cout << "Reading truthset file " << bin_file.c_str() << " ..." << std::endl; + size_t actual_file_size = reader.get_file_size(); + + int npts_i32, dim_i32; + reader.read((char *)&npts_i32, sizeof(int)); + reader.read((char *)&dim_i32, sizeof(int)); + npts = (uint32_t)npts_i32; + dim = (uint32_t)dim_i32; + + diskann::cout << "Metadata: #pts = " << npts << ", #dims = " << dim << "... " << std::endl; + + int truthset_type = -1; // 1 means truthset has ids and distances, 2 means + // only ids, -1 is error + size_t expected_file_size_with_dists = 2 * npts * dim * sizeof(uint32_t) + 2 * sizeof(uint32_t); + + if (actual_file_size == expected_file_size_with_dists) + truthset_type = 1; + + size_t expected_file_size_just_ids = npts * dim * sizeof(uint32_t) + 2 * sizeof(uint32_t); + + if (actual_file_size == expected_file_size_just_ids) + truthset_type = 2; + + if (truthset_type == -1) + { + std::stringstream stream; + stream << "Error. File size mismatch. File should have bin format, with " + "npts followed by ngt followed by npts*ngt ids and optionally " + "followed by npts*ngt distance values; actual size: " + << actual_file_size << ", expected: " << expected_file_size_with_dists << " or " + << expected_file_size_just_ids; + diskann::cout << stream.str(); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); + } + + ids = new uint32_t[npts * dim]; + reader.read((char *)ids, npts * dim * sizeof(uint32_t)); + + if (truthset_type == 1) + { + dists = new float[npts * dim]; + reader.read((char *)dists, npts * dim * sizeof(float)); + } +} + +int main(int argc, char **argv) +{ + std::string data_type, dist_fn, base_file, query_file, gt_file, tags_file, label_file, filter_label, + universal_label, filter_label_file; + uint64_t K; + + try + { + po::options_description desc{"Arguments"}; + + desc.add_options()("help,h", "Print information on arguments"); + + desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); + desc.add_options()("dist_fn", po::value(&dist_fn)->required(), "distance function "); + desc.add_options()("base_file", po::value(&base_file)->required(), + "File containing the base vectors in binary format"); + desc.add_options()("query_file", po::value(&query_file)->required(), + "File containing the query vectors in binary format"); + desc.add_options()("label_file", po::value(&label_file)->default_value(""), + "Input labels file in txt format if present"); + desc.add_options()("filter_label", po::value(&filter_label)->default_value(""), + "Input filter label if doing filtered groundtruth"); + desc.add_options()("universal_label", po::value(&universal_label)->default_value(""), + "Universal label, if using it, only in conjunction with label_file"); + desc.add_options()("gt_file", po::value(>_file)->required(), + "File name for the writing ground truth in binary " + "format, please don' append .bin at end if " + "no filter_label or filter_label_file is provided it " + "will save the file with '.bin' at end." + "else it will save the file as filename_label.bin"); + desc.add_options()("K", po::value(&K)->required(), + "Number of ground truth nearest neighbors to compute"); + desc.add_options()("tags_file", po::value(&tags_file)->default_value(std::string()), + "File containing the tags in binary format"); + desc.add_options()("filter_label_file", + po::value(&filter_label_file)->default_value(std::string("")), + "Filter file for Queries for Filtered Search "); + + po::variables_map vm; + po::store(po::parse_command_line(argc, argv, desc), vm); + if (vm.count("help")) + { + std::cout << desc; + return 0; + } + po::notify(vm); + } + catch (const std::exception &ex) + { + std::cerr << ex.what() << '\n'; + return -1; + } + + if (data_type != std::string("float") && data_type != std::string("int8") && data_type != std::string("uint8")) + { + std::cout << "Unsupported type. float, int8 and uint8 types are supported." << std::endl; + return -1; + } + + if (filter_label != "" && filter_label_file != "") + { + std::cerr << "Only one of filter_label and query_filters_file should be provided" << std::endl; + return -1; + } + + diskann::Metric metric; + if (dist_fn == std::string("l2")) + { + metric = diskann::Metric::L2; + } + else if (dist_fn == std::string("mips")) + { + metric = diskann::Metric::INNER_PRODUCT; + } + else if (dist_fn == std::string("cosine")) + { + metric = diskann::Metric::COSINE; + } + else + { + std::cerr << "Unsupported distance function. Use l2/mips/cosine." << std::endl; + return -1; + } + + std::vector filter_labels; + if (filter_label != "") + { + filter_labels.push_back(filter_label); + } + else if (filter_label_file != "") + { + filter_labels = read_file_to_vector_of_strings(filter_label_file, false); + } + + // only when there is no filter label or 1 filter label for all queries + if (filter_labels.size() == 1) + { + try + { + if (data_type == std::string("float")) + aux_main(base_file, label_file, query_file, gt_file, K, universal_label, metric, + filter_labels[0], tags_file); + if (data_type == std::string("int8")) + aux_main(base_file, label_file, query_file, gt_file, K, universal_label, metric, + filter_labels[0], tags_file); + if (data_type == std::string("uint8")) + aux_main(base_file, label_file, query_file, gt_file, K, universal_label, metric, + filter_labels[0], tags_file); + } + catch (const std::exception &e) + { + std::cout << std::string(e.what()) << std::endl; + diskann::cerr << "Compute GT failed." << std::endl; + return -1; + } + } + else + { // Each query has its own filter label + // Split up data and query bins into label specific ones + tsl::robin_map labels_to_number_of_points; + tsl::robin_map labels_to_number_of_queries; + + label_set all_labels; + for (size_t i = 0; i < filter_labels.size(); i++) + { + std::string label = filter_labels[i]; + all_labels.insert(label); + + if (labels_to_number_of_queries.find(label) == labels_to_number_of_queries.end()) + { + labels_to_number_of_queries[label] = 0; + } + labels_to_number_of_queries[label] += 1; + } + + size_t npoints; + std::vector> point_to_labels; + parse_label_file_into_vec(npoints, label_file, point_to_labels); + std::vector point_ids_to_labels(point_to_labels.size()); + std::vector query_ids_to_labels(filter_labels.size()); + + for (size_t i = 0; i < point_to_labels.size(); i++) + { + for (size_t j = 0; j < point_to_labels[i].size(); j++) + { + std::string label = point_to_labels[i][j]; + if (all_labels.find(label) != all_labels.end()) + { + point_ids_to_labels[i].insert(point_to_labels[i][j]); + if (labels_to_number_of_points.find(label) == labels_to_number_of_points.end()) + { + labels_to_number_of_points[label] = 0; + } + labels_to_number_of_points[label] += 1; + } + } + } + + for (size_t i = 0; i < filter_labels.size(); i++) + { + query_ids_to_labels[i].insert(filter_labels[i]); + } + + tsl::robin_map> label_id_to_orig_id; + tsl::robin_map> label_query_id_to_orig_id; + + if (data_type == std::string("float")) + { + label_id_to_orig_id = diskann::generate_label_specific_vector_files_compat( + base_file, labels_to_number_of_points, point_ids_to_labels, all_labels); + + label_query_id_to_orig_id = diskann::generate_label_specific_vector_files_compat( + query_file, labels_to_number_of_queries, query_ids_to_labels, + all_labels); // query_filters acts like query_ids_to_labels + } + else if (data_type == std::string("int8")) + { + label_id_to_orig_id = diskann::generate_label_specific_vector_files_compat( + base_file, labels_to_number_of_points, point_ids_to_labels, all_labels); + + label_query_id_to_orig_id = diskann::generate_label_specific_vector_files_compat( + query_file, labels_to_number_of_queries, query_ids_to_labels, + all_labels); // query_filters acts like query_ids_to_labels + } + else if (data_type == std::string("uint8")) + { + label_id_to_orig_id = diskann::generate_label_specific_vector_files_compat( + base_file, labels_to_number_of_points, point_ids_to_labels, all_labels); + + label_query_id_to_orig_id = diskann::generate_label_specific_vector_files_compat( + query_file, labels_to_number_of_queries, query_ids_to_labels, + all_labels); // query_filters acts like query_ids_to_labels + } + else + { + diskann::cerr << "Invalid data type" << std::endl; + return -1; + } + + // Generate label specific ground truths + + try + { + for (const auto &label : all_labels) + { + std::string filtered_base_file = base_file + "_" + label; + std::string filtered_query_file = query_file + "_" + label; + std::string filtered_gt_file = gt_file + "_" + label; + if (data_type == std::string("float")) + aux_main(filtered_base_file, "", filtered_query_file, filtered_gt_file, K, "", metric, ""); + if (data_type == std::string("int8")) + aux_main(filtered_base_file, "", filtered_query_file, filtered_gt_file, K, "", metric, ""); + if (data_type == std::string("uint8")) + aux_main(filtered_base_file, "", filtered_query_file, filtered_gt_file, K, "", metric, ""); + } + } + catch (const std::exception &e) + { + std::cout << std::string(e.what()) << std::endl; + diskann::cerr << "Compute GT failed." << std::endl; + return -1; + } + + // Combine the label specific ground truths to produce a single GT file + + uint32_t *gt_ids = nullptr; + float *gt_dists = nullptr; + size_t gt_num, gt_dim; + + std::vector> final_gt_ids; + std::vector> final_gt_dists; + + uint32_t query_num = 0; + for (const auto &lbl : all_labels) + { + query_num += labels_to_number_of_queries[lbl]; + } + + for (uint32_t i = 0; i < query_num; i++) + { + final_gt_ids.push_back(std::vector(K)); + final_gt_dists.push_back(std::vector(K)); + } + + for (const auto &lbl : all_labels) + { + std::string filtered_gt_file = gt_file + "_" + lbl; + load_truthset(filtered_gt_file, gt_ids, gt_dists, gt_num, gt_dim); + + for (uint32_t i = 0; i < labels_to_number_of_queries[lbl]; i++) + { + uint32_t orig_query_id = label_query_id_to_orig_id[lbl][i]; + for (uint64_t j = 0; j < K; j++) + { + final_gt_ids[orig_query_id][j] = label_id_to_orig_id[lbl][gt_ids[i * K + j]]; + final_gt_dists[orig_query_id][j] = gt_dists[i * K + j]; + } + } + } + + int32_t *closest_points = new int32_t[query_num * K]; + float *dist_closest_points = new float[query_num * K]; + + for (uint32_t i = 0; i < query_num; i++) + { + for (uint32_t j = 0; j < K; j++) + { + closest_points[i * K + j] = final_gt_ids[i][j]; + dist_closest_points[i * K + j] = final_gt_dists[i][j]; + } + } + + save_groundtruth_as_one_file(gt_file, closest_points, dist_closest_points, query_num, K); + + // cleanup artifacts + std::cout << "Cleaning up artifacts..." << std::endl; + tsl::robin_set paths_to_clean{gt_file, base_file, query_file}; + clean_up_artifacts(paths_to_clean, all_labels); + } +} diff --git a/tests/utils/count_bfs_levels.cpp b/apps/utils/count_bfs_levels.cpp similarity index 95% rename from tests/utils/count_bfs_levels.cpp rename to apps/utils/count_bfs_levels.cpp index fa38bef34..ddc4eaf0b 100644 --- a/tests/utils/count_bfs_levels.cpp +++ b/apps/utils/count_bfs_levels.cpp @@ -23,7 +23,7 @@ namespace po = boost::program_options; -template void bfs_count(const std::string &index_path, unsigned data_dims) +template void bfs_count(const std::string &index_path, uint32_t data_dims) { using TagT = uint32_t; using LabelT = uint32_t; @@ -37,7 +37,7 @@ template void bfs_count(const std::string &index_path, unsigned dat int main(int argc, char **argv) { std::string data_type, index_path_prefix; - unsigned data_dims; + uint32_t data_dims; po::options_description desc{"Arguments"}; try @@ -46,7 +46,7 @@ int main(int argc, char **argv) desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); desc.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), "Path prefix to the index"); - desc.add_options()("data_dims", po::value(&data_dims)->required(), "Dimensionality of the data"); + desc.add_options()("data_dims", po::value(&data_dims)->required(), "Dimensionality of the data"); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); diff --git a/tests/utils/create_disk_layout.cpp b/apps/utils/create_disk_layout.cpp similarity index 100% rename from tests/utils/create_disk_layout.cpp rename to apps/utils/create_disk_layout.cpp diff --git a/tests/utils/float_bin_to_int8.cpp b/apps/utils/float_bin_to_int8.cpp similarity index 63% rename from tests/utils/float_bin_to_int8.cpp rename to apps/utils/float_bin_to_int8.cpp index fd63cb353..1982005af 100644 --- a/tests/utils/float_bin_to_int8.cpp +++ b/apps/utils/float_bin_to_int8.cpp @@ -4,14 +4,14 @@ #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) +void block_convert(std::ofstream &writer, int8_t *write_buf, std::ifstream &reader, float *read_buf, size_t npts, + size_t ndims, float bias, float scale) { reader.read((char *)read_buf, npts * ndims * sizeof(float)); - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { - for (_u64 d = 0; d < ndims; d++) + for (size_t d = 0; d < ndims; d++) { write_buf[d + i * ndims] = (int8_t)((read_buf[d + i * ndims] - bias) * (254.0 / scale)); } @@ -28,29 +28,29 @@ int main(int argc, char **argv) } std::ifstream reader(argv[1], std::ios::binary); - _u32 npts_u32; - _u32 ndims_u32; - reader.read((char *)&npts_u32, sizeof(_s32)); - reader.read((char *)&ndims_u32, sizeof(_s32)); + uint32_t npts_u32; + uint32_t ndims_u32; + reader.read((char *)&npts_u32, sizeof(uint32_t)); + reader.read((char *)&ndims_u32, sizeof(uint32_t)); size_t npts = npts_u32; size_t ndims = ndims_u32; std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims << std::endl; - _u64 blk_size = 131072; - _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + size_t blk_size = 131072; + size_t nblks = ROUND_UP(npts, blk_size) / blk_size; std::ofstream writer(argv[2], std::ios::binary); auto read_buf = new float[blk_size * ndims]; auto write_buf = new int8_t[blk_size * ndims]; - float bias = atof(argv[3]); - float scale = atof(argv[4]); + float bias = (float)atof(argv[3]); + float scale = (float)atof(argv[4]); - writer.write((char *)(&npts_u32), sizeof(_u32)); - writer.write((char *)(&ndims_u32), sizeof(_u32)); + writer.write((char *)(&npts_u32), sizeof(uint32_t)); + writer.write((char *)(&ndims_u32), sizeof(uint32_t)); - for (_u64 i = 0; i < nblks; i++) + for (size_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + size_t cblk_size = std::min(npts - i * blk_size, blk_size); block_convert(writer, write_buf, reader, read_buf, cblk_size, ndims, bias, scale); std::cout << "Block #" << i << " written" << std::endl; } diff --git a/tests/utils/fvecs_to_bin.cpp b/apps/utils/fvecs_to_bin.cpp similarity index 57% rename from tests/utils/fvecs_to_bin.cpp rename to apps/utils/fvecs_to_bin.cpp index 10e28076a..873ad3b0c 100644 --- a/tests/utils/fvecs_to_bin.cpp +++ b/apps/utils/fvecs_to_bin.cpp @@ -5,11 +5,11 @@ #include "utils.h" // Convert float types -void block_convert_float(std::ifstream &reader, std::ofstream &writer, float *read_buf, float *write_buf, _u64 npts, - _u64 ndims) +void block_convert_float(std::ifstream &reader, std::ofstream &writer, float *read_buf, float *write_buf, size_t npts, + size_t ndims) { - reader.read((char *)read_buf, npts * (ndims * sizeof(float) + sizeof(unsigned))); - for (_u64 i = 0; i < npts; i++) + reader.read((char *)read_buf, npts * (ndims * sizeof(float) + sizeof(uint32_t))); + for (size_t i = 0; i < npts; i++) { memcpy(write_buf + i * ndims, (read_buf + i * (ndims + 1)) + 1, ndims * sizeof(float)); } @@ -17,16 +17,16 @@ void block_convert_float(std::ifstream &reader, std::ofstream &writer, float *re } // Convert byte types -void block_convert_byte(std::ifstream &reader, std::ofstream &writer, _u8 *read_buf, _u8 *write_buf, _u64 npts, - _u64 ndims) +void block_convert_byte(std::ifstream &reader, std::ofstream &writer, uint8_t *read_buf, uint8_t *write_buf, + size_t npts, size_t ndims) { - reader.read((char *)read_buf, npts * (ndims * sizeof(_u8) + sizeof(unsigned))); - for (_u64 i = 0; i < npts; i++) + reader.read((char *)read_buf, npts * (ndims * sizeof(uint8_t) + sizeof(uint32_t))); + for (size_t i = 0; i < npts; i++) { - memcpy(write_buf + i * ndims, (read_buf + i * (ndims + sizeof(unsigned))) + sizeof(unsigned), - ndims * sizeof(_u8)); + memcpy(write_buf + i * ndims, (read_buf + i * (ndims + sizeof(uint32_t))) + sizeof(uint32_t), + ndims * sizeof(uint8_t)); } - writer.write((char *)write_buf, npts * ndims * sizeof(_u8)); + writer.write((char *)write_buf, npts * ndims * sizeof(uint8_t)); } int main(int argc, char **argv) @@ -41,7 +41,7 @@ int main(int argc, char **argv) if (strcmp(argv[1], "uint8") == 0 || strcmp(argv[1], "int8") == 0) { - datasize = sizeof(_u8); + datasize = sizeof(uint8_t); } else if (strcmp(argv[1], "float") != 0) { @@ -50,32 +50,32 @@ int main(int argc, char **argv) } std::ifstream reader(argv[2], std::ios::binary | std::ios::ate); - _u64 fsize = reader.tellg(); + size_t fsize = reader.tellg(); reader.seekg(0, std::ios::beg); - unsigned ndims_u32; - reader.read((char *)&ndims_u32, sizeof(unsigned)); + uint32_t ndims_u32; + reader.read((char *)&ndims_u32, sizeof(uint32_t)); reader.seekg(0, std::ios::beg); - _u64 ndims = (_u64)ndims_u32; - _u64 npts = fsize / ((ndims * datasize) + sizeof(unsigned)); + size_t ndims = (size_t)ndims_u32; + size_t npts = fsize / ((ndims * datasize) + sizeof(uint32_t)); std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims << std::endl; - _u64 blk_size = 131072; - _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + size_t blk_size = 131072; + size_t nblks = ROUND_UP(npts, blk_size) / blk_size; std::cout << "# blks: " << nblks << std::endl; std::ofstream writer(argv[3], std::ios::binary); - _s32 npts_s32 = (_s32)npts; - _s32 ndims_s32 = (_s32)ndims; - writer.write((char *)&npts_s32, sizeof(_s32)); - writer.write((char *)&ndims_s32, sizeof(_s32)); + int32_t npts_s32 = (int32_t)npts; + int32_t ndims_s32 = (int32_t)ndims; + writer.write((char *)&npts_s32, sizeof(int32_t)); + writer.write((char *)&ndims_s32, sizeof(int32_t)); - _u64 chunknpts = std::min(npts, blk_size); - _u8 *read_buf = new _u8[chunknpts * ((ndims * datasize) + sizeof(unsigned))]; - _u8 *write_buf = new _u8[chunknpts * ndims * datasize]; + size_t chunknpts = std::min(npts, blk_size); + uint8_t *read_buf = new uint8_t[chunknpts * ((ndims * datasize) + sizeof(uint32_t))]; + uint8_t *write_buf = new uint8_t[chunknpts * ndims * datasize]; - for (_u64 i = 0; i < nblks; i++) + for (size_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + size_t cblk_size = std::min(npts - i * blk_size, blk_size); if (datasize == sizeof(float)) { block_convert_float(reader, writer, (float *)read_buf, (float *)write_buf, cblk_size, ndims); diff --git a/tests/utils/fvecs_to_bvecs.cpp b/apps/utils/fvecs_to_bvecs.cpp similarity index 68% rename from tests/utils/fvecs_to_bvecs.cpp rename to apps/utils/fvecs_to_bvecs.cpp index 8324e9df7..f9c2aa71b 100644 --- a/tests/utils/fvecs_to_bvecs.cpp +++ b/apps/utils/fvecs_to_bvecs.cpp @@ -4,14 +4,14 @@ #include #include "utils.h" -void block_convert(std::ifstream &reader, std::ofstream &writer, float *read_buf, uint8_t *write_buf, _u64 npts, - _u64 ndims) +void block_convert(std::ifstream &reader, std::ofstream &writer, float *read_buf, uint8_t *write_buf, size_t npts, + size_t ndims) { - reader.read((char *)read_buf, npts * (ndims * sizeof(float) + sizeof(unsigned))); - for (_u64 i = 0; i < npts; i++) + reader.read((char *)read_buf, npts * (ndims * sizeof(float) + sizeof(uint32_t))); + for (size_t i = 0; i < npts; i++) { - memcpy(write_buf + i * (ndims + 4), read_buf + i * (ndims + 1), sizeof(unsigned)); - for (_u64 d = 0; d < ndims; d++) + memcpy(write_buf + i * (ndims + 4), read_buf + i * (ndims + 1), sizeof(uint32_t)); + for (size_t d = 0; d < ndims; d++) write_buf[i * (ndims + 4) + 4 + d] = (uint8_t)read_buf[i * (ndims + 1) + 1 + d]; } writer.write((char *)write_buf, npts * (ndims * 1 + 4)); @@ -25,25 +25,25 @@ int main(int argc, char **argv) exit(-1); } std::ifstream reader(argv[1], std::ios::binary | std::ios::ate); - _u64 fsize = reader.tellg(); + size_t fsize = reader.tellg(); reader.seekg(0, std::ios::beg); - unsigned ndims_u32; - reader.read((char *)&ndims_u32, sizeof(unsigned)); + uint32_t ndims_u32; + reader.read((char *)&ndims_u32, sizeof(uint32_t)); reader.seekg(0, std::ios::beg); - _u64 ndims = (_u64)ndims_u32; - _u64 npts = fsize / ((ndims + 1) * sizeof(float)); + size_t ndims = (size_t)ndims_u32; + size_t npts = fsize / ((ndims + 1) * sizeof(float)); std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims << std::endl; - _u64 blk_size = 131072; - _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + size_t blk_size = 131072; + size_t nblks = ROUND_UP(npts, blk_size) / blk_size; std::cout << "# blks: " << nblks << std::endl; std::ofstream writer(argv[2], std::ios::binary); auto read_buf = new float[npts * (ndims + 1)]; auto write_buf = new uint8_t[npts * (ndims + 4)]; - for (_u64 i = 0; i < nblks; i++) + for (size_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + size_t 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; } diff --git a/tests/utils/gen_random_slice.cpp b/apps/utils/gen_random_slice.cpp similarity index 100% rename from tests/utils/gen_random_slice.cpp rename to apps/utils/gen_random_slice.cpp diff --git a/tests/utils/generate_pq.cpp b/apps/utils/generate_pq.cpp similarity index 77% rename from tests/utils/generate_pq.cpp rename to apps/utils/generate_pq.cpp index 761983129..a881b1104 100644 --- a/tests/utils/generate_pq.cpp +++ b/apps/utils/generate_pq.cpp @@ -22,16 +22,16 @@ bool generate_pq(const std::string &data_path, const std::string &index_prefix_p if (opq) { - diskann::generate_opq_pivots(train_data, train_size, train_dim, num_pq_centers, num_pq_chunks, pq_pivots_path, - true); + diskann::generate_opq_pivots(train_data, train_size, (uint32_t)train_dim, (uint32_t)num_pq_centers, + (uint32_t)num_pq_chunks, pq_pivots_path, true); } else { - diskann::generate_pq_pivots(train_data, train_size, train_dim, num_pq_centers, num_pq_chunks, - KMEANS_ITERS_FOR_PQ, pq_pivots_path); + diskann::generate_pq_pivots(train_data, train_size, (uint32_t)train_dim, (uint32_t)num_pq_centers, + (uint32_t)num_pq_chunks, KMEANS_ITERS_FOR_PQ, pq_pivots_path); } - diskann::generate_pq_data_from_pivots(data_path, num_pq_centers, num_pq_chunks, pq_pivots_path, - pq_compressed_vectors_path, true); + diskann::generate_pq_data_from_pivots(data_path, (uint32_t)num_pq_centers, (uint32_t)num_pq_chunks, + pq_pivots_path, pq_compressed_vectors_path, true); delete[] train_data; @@ -55,7 +55,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]); const bool opq = atoi(argv[6]) == 0 ? false : true; if (std::string(argv[1]) == std::string("float")) diff --git a/tests/utils/generate_synthetic_labels.cpp b/apps/utils/generate_synthetic_labels.cpp similarity index 73% rename from tests/utils/generate_synthetic_labels.cpp rename to apps/utils/generate_synthetic_labels.cpp index c96d3361d..6741760cb 100644 --- a/tests/utils/generate_synthetic_labels.cpp +++ b/apps/utils/generate_synthetic_labels.cpp @@ -12,19 +12,19 @@ namespace po = boost::program_options; class ZipfDistribution { public: - ZipfDistribution(int num_points, int num_labels) - : uniform_zero_to_one(std::uniform_real_distribution<>(0.0, 1.0)), num_points(num_points), - num_labels(num_labels) + ZipfDistribution(uint64_t num_points, uint32_t num_labels) + : num_labels(num_labels), num_points(num_points), + uniform_zero_to_one(std::uniform_real_distribution<>(0.0, 1.0)) { } - std::unordered_map createDistributionMap() + std::unordered_map createDistributionMap() { - std::unordered_map map; - int primary_label_freq = ceil(num_points * distribution_factor); - for (int i{1}; i < num_labels + 1; i++) + std::unordered_map map; + uint32_t primary_label_freq = (uint32_t)ceil(num_points * distribution_factor); + for (uint32_t i{1}; i < num_labels + 1; i++) { - map[i] = ceil(primary_label_freq / i); + map[i] = (uint32_t)ceil(primary_label_freq / i); } return map; } @@ -32,15 +32,13 @@ class ZipfDistribution int writeDistribution(std::ofstream &outfile) { auto distribution_map = createDistributionMap(); - auto primary_label_frequency = num_points * distribution_factor; - for (int i{0}; i < num_points; i++) + for (uint32_t i{0}; i < num_points; i++) { bool label_written = false; - for (auto it = distribution_map.cbegin(), next_it = it; it != distribution_map.cend(); it = next_it) + for (auto it = distribution_map.cbegin(); it != distribution_map.cend(); it++) { - next_it++; auto label_selection_probability = std::bernoulli_distribution(distribution_factor / (double)it->first); - if (label_selection_probability(rand_engine)) + if (label_selection_probability(rand_engine) && distribution_map[it->first] > 0) { if (label_written) { @@ -50,10 +48,6 @@ class ZipfDistribution label_written = true; // remove label from map if we have used all labels distribution_map[it->first] -= 1; - if (distribution_map[it->first] == 0) - { - distribution_map.erase(it); - } } } if (!label_written) @@ -81,8 +75,8 @@ class ZipfDistribution } private: - int num_labels; - const int num_points; + const uint32_t num_labels; + const uint64_t num_points; const double distribution_factor = 0.7; std::knuth_b rand_engine; const std::uniform_real_distribution uniform_zero_to_one; @@ -91,7 +85,8 @@ class ZipfDistribution int main(int argc, char **argv) { std::string output_file, distribution_type; - _u64 num_labels, num_points; + uint32_t num_labels; + uint64_t num_points; try { @@ -101,10 +96,11 @@ int main(int argc, char **argv) desc.add_options()("output_file,O", po::value(&output_file)->required(), "Filename for saving the label file"); desc.add_options()("num_points,N", po::value(&num_points)->required(), "Number of points in dataset"); - desc.add_options()("num_labels,L", po::value(&num_labels)->required(), + desc.add_options()("num_labels,L", po::value(&num_labels)->required(), "Number of unique labels, up to 5000"); desc.add_options()("distribution_type,DT", po::value(&distribution_type)->default_value("random"), - "Distribution function for labels defaults to random"); + "Distribution function for labels defaults " + "to random"); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); @@ -152,10 +148,10 @@ int main(int argc, char **argv) } else if (distribution_type == "random") { - for (int i = 0; i < num_points; i++) + for (size_t i = 0; i < num_points; i++) { bool label_written = false; - for (int j = 1; j <= num_labels; j++) + for (size_t j = 1; j <= num_labels; j++) { // 50% chance to assign each label if (rand() > (RAND_MAX / 2)) @@ -178,6 +174,19 @@ int main(int argc, char **argv) } } } + else if (distribution_type == "one_per_point") + { + std::random_device rd; // obtain a random number from hardware + std::mt19937 gen(rd()); // seed the generator + std::uniform_int_distribution<> distr(0, num_labels); // define the range + + for (size_t i = 0; i < num_points; i++) + { + outfile << distr(gen); + if (i != num_points - 1) + outfile << '\n'; + } + } if (outfile.is_open()) { outfile.close(); diff --git a/tests/utils/int8_to_float.cpp b/apps/utils/int8_to_float.cpp similarity index 100% rename from tests/utils/int8_to_float.cpp rename to apps/utils/int8_to_float.cpp diff --git a/tests/utils/int8_to_float_scale.cpp b/apps/utils/int8_to_float_scale.cpp similarity index 63% rename from tests/utils/int8_to_float_scale.cpp rename to apps/utils/int8_to_float_scale.cpp index 42aa06d0e..19fbc6c43 100644 --- a/tests/utils/int8_to_float_scale.cpp +++ b/apps/utils/int8_to_float_scale.cpp @@ -4,14 +4,14 @@ #include #include "utils.h" -void block_convert(std::ofstream &writer, float *write_buf, std::ifstream &reader, int8_t *read_buf, _u64 npts, - _u64 ndims, float bias, float scale) +void block_convert(std::ofstream &writer, float *write_buf, std::ifstream &reader, int8_t *read_buf, size_t npts, + size_t ndims, float bias, float scale) { reader.read((char *)read_buf, npts * ndims * sizeof(int8_t)); - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { - for (_u64 d = 0; d < ndims; d++) + for (size_t d = 0; d < ndims; d++) { write_buf[d + i * ndims] = (((float)read_buf[d + i * ndims] - bias) * scale); } @@ -28,29 +28,29 @@ int main(int argc, char **argv) } std::ifstream reader(argv[1], std::ios::binary); - _u32 npts_u32; - _u32 ndims_u32; - reader.read((char *)&npts_u32, sizeof(_s32)); - reader.read((char *)&ndims_u32, sizeof(_s32)); + uint32_t npts_u32; + uint32_t ndims_u32; + reader.read((char *)&npts_u32, sizeof(uint32_t)); + reader.read((char *)&ndims_u32, sizeof(uint32_t)); size_t npts = npts_u32; size_t ndims = ndims_u32; std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims << std::endl; - _u64 blk_size = 131072; - _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + size_t blk_size = 131072; + size_t nblks = ROUND_UP(npts, blk_size) / blk_size; std::ofstream writer(argv[2], std::ios::binary); auto read_buf = new int8_t[blk_size * ndims]; auto write_buf = new float[blk_size * ndims]; - float bias = atof(argv[3]); - float scale = atof(argv[4]); + float bias = (float)atof(argv[3]); + float scale = (float)atof(argv[4]); - writer.write((char *)(&npts_u32), sizeof(_u32)); - writer.write((char *)(&ndims_u32), sizeof(_u32)); + writer.write((char *)(&npts_u32), sizeof(uint32_t)); + writer.write((char *)(&ndims_u32), sizeof(uint32_t)); - for (_u64 i = 0; i < nblks; i++) + for (size_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + size_t cblk_size = std::min(npts - i * blk_size, blk_size); block_convert(writer, write_buf, reader, read_buf, cblk_size, ndims, bias, scale); std::cout << "Block #" << i << " written" << std::endl; } diff --git a/tests/utils/ivecs_to_bin.cpp b/apps/utils/ivecs_to_bin.cpp similarity index 50% rename from tests/utils/ivecs_to_bin.cpp rename to apps/utils/ivecs_to_bin.cpp index b7ee2304a..ea8a4a3d2 100644 --- a/tests/utils/ivecs_to_bin.cpp +++ b/apps/utils/ivecs_to_bin.cpp @@ -4,14 +4,15 @@ #include #include "utils.h" -void block_convert(std::ifstream &reader, std::ofstream &writer, _u32 *read_buf, _u32 *write_buf, _u64 npts, _u64 ndims) +void block_convert(std::ifstream &reader, std::ofstream &writer, uint32_t *read_buf, uint32_t *write_buf, size_t npts, + size_t ndims) { - reader.read((char *)read_buf, npts * (ndims * sizeof(_u32) + sizeof(unsigned))); - for (_u64 i = 0; i < npts; i++) + reader.read((char *)read_buf, npts * (ndims * sizeof(uint32_t) + sizeof(uint32_t))); + for (size_t i = 0; i < npts; i++) { - memcpy(write_buf + i * ndims, (read_buf + i * (ndims + 1)) + 1, ndims * sizeof(_u32)); + memcpy(write_buf + i * ndims, (read_buf + i * (ndims + 1)) + 1, ndims * sizeof(uint32_t)); } - writer.write((char *)write_buf, npts * ndims * sizeof(_u32)); + writer.write((char *)write_buf, npts * ndims * sizeof(uint32_t)); } int main(int argc, char **argv) @@ -22,29 +23,29 @@ int main(int argc, char **argv) exit(-1); } std::ifstream reader(argv[1], std::ios::binary | std::ios::ate); - _u64 fsize = reader.tellg(); + size_t fsize = reader.tellg(); reader.seekg(0, std::ios::beg); - unsigned ndims_u32; - reader.read((char *)&ndims_u32, sizeof(unsigned)); + uint32_t ndims_u32; + reader.read((char *)&ndims_u32, sizeof(uint32_t)); reader.seekg(0, std::ios::beg); - _u64 ndims = (_u64)ndims_u32; - _u64 npts = fsize / ((ndims + 1) * sizeof(_u32)); + size_t ndims = (size_t)ndims_u32; + size_t npts = fsize / ((ndims + 1) * sizeof(uint32_t)); std::cout << "Dataset: #pts = " << npts << ", # dims = " << ndims << std::endl; - _u64 blk_size = 131072; - _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + size_t blk_size = 131072; + size_t nblks = ROUND_UP(npts, blk_size) / blk_size; std::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)); - _u32 *read_buf = new _u32[npts * (ndims + 1)]; - _u32 *write_buf = new _u32[npts * ndims]; - for (_u64 i = 0; i < nblks; i++) + int npts_s32 = (int)npts; + int ndims_s32 = (int)ndims; + writer.write((char *)&npts_s32, sizeof(int)); + writer.write((char *)&ndims_s32, sizeof(int)); + uint32_t *read_buf = new uint32_t[npts * (ndims + 1)]; + uint32_t *write_buf = new uint32_t[npts * ndims]; + for (size_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + size_t 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; } diff --git a/tests/utils/merge_shards.cpp b/apps/utils/merge_shards.cpp similarity index 83% rename from tests/utils/merge_shards.cpp rename to apps/utils/merge_shards.cpp index 5e14fb14d..106c15eef 100644 --- a/tests/utils/merge_shards.cpp +++ b/apps/utils/merge_shards.cpp @@ -19,8 +19,10 @@ int main(int argc, char **argv) if (argc != 9) { std::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] " + << " vamana_index_prefix[1] vamana_index_suffix[2] " + "idmaps_prefix[3] " + "idmaps_suffix[4] n_shards[5] max_degree[6] " + "output_vamana_path[7] " "output_medoids_path[8]" << std::endl; exit(-1); @@ -30,8 +32,8 @@ int main(int argc, char **argv) std::string vamana_suffix(argv[2]); std::string idmaps_prefix(argv[3]); std::string idmaps_suffix(argv[4]); - _u64 nshards = (_u64)std::atoi(argv[5]); - _u32 max_degree = (_u64)std::atoi(argv[6]); + uint64_t nshards = (uint64_t)std::atoi(argv[5]); + uint32_t max_degree = (uint64_t)std::atoi(argv[6]); std::string output_index(argv[7]); std::string output_medoids(argv[8]); diff --git a/tests/utils/partition_data.cpp b/apps/utils/partition_data.cpp similarity index 96% rename from tests/utils/partition_data.cpp rename to apps/utils/partition_data.cpp index 2c505315c..2520f3f4a 100644 --- a/tests/utils/partition_data.cpp +++ b/apps/utils/partition_data.cpp @@ -23,7 +23,7 @@ int main(int argc, char **argv) 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]); diff --git a/tests/utils/partition_with_ram_budget.cpp b/apps/utils/partition_with_ram_budget.cpp similarity index 96% rename from tests/utils/partition_with_ram_budget.cpp rename to apps/utils/partition_with_ram_budget.cpp index 3c546801a..937b68d2c 100644 --- a/tests/utils/partition_with_ram_budget.cpp +++ b/apps/utils/partition_with_ram_budget.cpp @@ -23,7 +23,7 @@ int main(int argc, char **argv) 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]); diff --git a/tests/utils/rand_data_gen.cpp b/apps/utils/rand_data_gen.cpp similarity index 74% rename from tests/utils/rand_data_gen.cpp rename to apps/utils/rand_data_gen.cpp index c4461137d..a6f9305c8 100644 --- a/tests/utils/rand_data_gen.cpp +++ b/apps/utils/rand_data_gen.cpp @@ -11,7 +11,7 @@ namespace po = boost::program_options; -int block_write_float(std::ofstream &writer, _u64 ndims, _u64 npts, float norm) +int block_write_float(std::ofstream &writer, size_t ndims, size_t npts, float norm) { auto vec = new float[ndims]; @@ -19,14 +19,14 @@ int block_write_float(std::ofstream &writer, _u64 ndims, _u64 npts, float norm) std::mt19937 gen{rd()}; std::normal_distribution<> normal_rand{0, 1}; - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { float sum = 0; - for (_u64 d = 0; d < ndims; ++d) - vec[d] = normal_rand(gen); - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) + vec[d] = (float)normal_rand(gen); + for (size_t d = 0; d < ndims; ++d) sum += vec[d] * vec[d]; - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) vec[d] = vec[d] * norm / std::sqrt(sum); writer.write((char *)vec, ndims * sizeof(float)); @@ -36,7 +36,7 @@ int block_write_float(std::ofstream &writer, _u64 ndims, _u64 npts, float norm) return 0; } -int block_write_int8(std::ofstream &writer, _u64 ndims, _u64 npts, float norm) +int block_write_int8(std::ofstream &writer, size_t ndims, size_t npts, float norm) { auto vec = new float[ndims]; auto vec_T = new int8_t[ndims]; @@ -45,19 +45,19 @@ int block_write_int8(std::ofstream &writer, _u64 ndims, _u64 npts, float norm) std::mt19937 gen{rd()}; std::normal_distribution<> normal_rand{0, 1}; - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { float sum = 0; - for (_u64 d = 0; d < ndims; ++d) - vec[d] = normal_rand(gen); - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) + vec[d] = (float)normal_rand(gen); + for (size_t d = 0; d < ndims; ++d) sum += vec[d] * vec[d]; - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) vec[d] = vec[d] * norm / std::sqrt(sum); - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) { - vec_T[d] = std::round(vec[d]); + vec_T[d] = (int8_t)std::round(vec[d]); } writer.write((char *)vec_T, ndims * sizeof(int8_t)); @@ -68,7 +68,7 @@ int block_write_int8(std::ofstream &writer, _u64 ndims, _u64 npts, float norm) return 0; } -int block_write_uint8(std::ofstream &writer, _u64 ndims, _u64 npts, float norm) +int block_write_uint8(std::ofstream &writer, size_t ndims, size_t npts, float norm) { auto vec = new float[ndims]; auto vec_T = new int8_t[ndims]; @@ -77,19 +77,19 @@ int block_write_uint8(std::ofstream &writer, _u64 ndims, _u64 npts, float norm) std::mt19937 gen{rd()}; std::normal_distribution<> normal_rand{0, 1}; - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { float sum = 0; - for (_u64 d = 0; d < ndims; ++d) - vec[d] = normal_rand(gen); - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) + vec[d] = (float)normal_rand(gen); + for (size_t d = 0; d < ndims; ++d) sum += vec[d] * vec[d]; - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) vec[d] = vec[d] * norm / std::sqrt(sum); - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) { - vec_T[d] = 128 + std::round(vec[d]); + vec_T[d] = 128 + (int8_t)std::round(vec[d]); } writer.write((char *)vec_T, ndims * sizeof(uint8_t)); @@ -103,7 +103,7 @@ int block_write_uint8(std::ofstream &writer, _u64 ndims, _u64 npts, float norm) int main(int argc, char **argv) { std::string data_type, output_file; - _u64 ndims, npts; + size_t ndims, npts; float norm; try @@ -149,7 +149,8 @@ int main(int argc, char **argv) { if (norm > 127) { - std::cerr << "Error: for int8/uint8 datatypes, L2 norm can not be greater " + std::cerr << "Error: for int8/uint8 datatypes, L2 norm can not be " + "greater " "than 127" << std::endl; return -1; @@ -161,19 +162,19 @@ int main(int argc, char **argv) std::ofstream writer; writer.exceptions(std::ofstream::failbit | std::ofstream::badbit); writer.open(output_file, 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)); + auto npts_u32 = (uint32_t)npts; + auto ndims_u32 = (uint32_t)ndims; + writer.write((char *)&npts_u32, sizeof(uint32_t)); + writer.write((char *)&ndims_u32, sizeof(uint32_t)); - _u64 blk_size = 131072; - _u64 nblks = ROUND_UP(npts, blk_size) / blk_size; + size_t blk_size = 131072; + size_t nblks = ROUND_UP(npts, blk_size) / blk_size; std::cout << "# blks: " << nblks << std::endl; int ret = 0; - for (_u64 i = 0; i < nblks; i++) + for (size_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + size_t cblk_size = std::min(npts - i * blk_size, blk_size); if (data_type == std::string("float")) { ret = block_write_float(writer, ndims, cblk_size, norm); diff --git a/tests/utils/simulate_aggregate_recall.cpp b/apps/utils/simulate_aggregate_recall.cpp similarity index 72% rename from tests/utils/simulate_aggregate_recall.cpp rename to apps/utils/simulate_aggregate_recall.cpp index bb096cf20..73c4ea0f7 100644 --- a/tests/utils/simulate_aggregate_recall.cpp +++ b/apps/utils/simulate_aggregate_recall.cpp @@ -6,11 +6,11 @@ #include #include -inline float aggregate_recall(const unsigned k_aggr, const unsigned k, const unsigned npart, unsigned *count, +inline float aggregate_recall(const uint32_t k_aggr, const uint32_t k, const uint32_t npart, uint32_t *count, const std::vector &recalls) { float found = 0; - for (unsigned i = 0; i < npart; ++i) + for (uint32_t i = 0; i < npart; ++i) { size_t max_found = std::min(count[i], k); found += recalls[max_found - 1] * max_found; @@ -18,23 +18,23 @@ inline float aggregate_recall(const unsigned k_aggr, const unsigned k, const uns return found / (float)k_aggr; } -void simulate(const unsigned k_aggr, const unsigned k, const unsigned npart, const unsigned nsim, +void simulate(const uint32_t k_aggr, const uint32_t k, const uint32_t npart, const uint32_t nsim, const std::vector &recalls) { std::random_device r; std::default_random_engine randeng(r()); std::uniform_int_distribution uniform_dist(0, npart - 1); - unsigned *count = new unsigned[npart]; + uint32_t *count = new uint32_t[npart]; double aggr_recall = 0; - for (unsigned i = 0; i < nsim; ++i) + for (uint32_t i = 0; i < nsim; ++i) { - for (unsigned p = 0; p < npart; ++p) + for (uint32_t p = 0; p < npart; ++p) { count[p] = 0; } - for (unsigned t = 0; t < k_aggr; ++t) + for (uint32_t t = 0; t < k_aggr; ++t) { count[uniform_dist(randeng)]++; } @@ -53,15 +53,15 @@ int main(int argc, char **argv) exit(-1); } - const unsigned k_aggr = atoi(argv[1]); - const unsigned k = atoi(argv[2]); - const unsigned npart = atoi(argv[3]); - const unsigned nsim = atoi(argv[4]); + const uint32_t k_aggr = atoi(argv[1]); + const uint32_t k = atoi(argv[2]); + const uint32_t npart = atoi(argv[3]); + const uint32_t nsim = atoi(argv[4]); std::vector recalls; for (int ctr = 5; ctr < argc; ctr++) { - recalls.push_back(atof(argv[ctr])); + recalls.push_back((float)atof(argv[ctr])); } if (recalls.size() != k) diff --git a/tests/utils/stats_label_data.cpp b/apps/utils/stats_label_data.cpp similarity index 84% rename from tests/utils/stats_label_data.cpp rename to apps/utils/stats_label_data.cpp index c5aabd5ff..3342672ff 100644 --- a/tests/utils/stats_label_data.cpp +++ b/apps/utils/stats_label_data.cpp @@ -28,26 +28,26 @@ #endif namespace po = boost::program_options; -void stats_analysis(const std::string labels_file, std::string univeral_label, _u32 density = 10) +void stats_analysis(const std::string labels_file, std::string univeral_label, uint32_t density = 10) { std::string token, line; std::ifstream labels_stream(labels_file); - std::unordered_map label_counts; + std::unordered_map label_counts; std::string label_with_max_points; - _u32 max_points = 0; + uint32_t max_points = 0; long long sum = 0; long long point_cnt = 0; - float avg_labels_per_pt, avg_labels_per_pt_incl_0, mean_label_size, mean_label_size_incl_0; + float avg_labels_per_pt, mean_label_size; - std::vector<_u32> labels_per_point; - _u32 dense_pts = 0; + std::vector labels_per_point; + uint32_t dense_pts = 0; if (labels_stream.is_open()) { while (getline(labels_stream, line)) { point_cnt++; std::stringstream iss(line); - _u32 lbl_cnt = 0; + uint32_t lbl_cnt = 0; while (getline(iss, token, ',')) { lbl_cnt++; @@ -69,7 +69,7 @@ void stats_analysis(const std::string labels_file, std::string univeral_label, _ << " labels = " << (float)dense_pts / (float)labels_per_point.size() << std::endl; std::sort(labels_per_point.begin(), labels_per_point.end()); - std::vector> label_count_vec; + std::vector> label_count_vec; for (auto it = label_counts.begin(); it != label_counts.end(); it++) { @@ -84,14 +84,14 @@ void stats_analysis(const std::string labels_file, std::string univeral_label, _ } sort(label_count_vec.begin(), label_count_vec.end(), - [](const std::pair &lhs, const std::pair &rhs) { + [](const std::pair &lhs, const std::pair &rhs) { return lhs.second < rhs.second; }); for (float p = 0; p < 1; p += 0.05) { - std::cout << "Percentile " << (100 * p) << "\t" << label_count_vec[(_u32)(p * label_count_vec.size())].first - << " with count=" << label_count_vec[(_u32)(p * label_count_vec.size())].second << std::endl; + std::cout << "Percentile " << (100 * p) << "\t" << label_count_vec[(size_t)(p * label_count_vec.size())].first + << " with count=" << label_count_vec[(size_t)(p * label_count_vec.size())].second << std::endl; } std::cout << "Most common label " @@ -105,8 +105,8 @@ void stats_analysis(const std::string labels_file, std::string univeral_label, _ std::cout << "Third common label " << "\t" << label_count_vec[label_count_vec.size() - 3].first << " with count=" << label_count_vec[label_count_vec.size() - 3].second << std::endl; - avg_labels_per_pt = (sum) / (float)point_cnt; - mean_label_size = (sum) / label_counts.size(); + avg_labels_per_pt = sum / (float)point_cnt; + mean_label_size = sum / (float)label_counts.size(); std::cout << "Total number of points = " << point_cnt << ", number of labels = " << label_counts.size() << std::endl; std::cout << "Average number of labels per point = " << avg_labels_per_pt << std::endl; @@ -117,7 +117,7 @@ void stats_analysis(const std::string labels_file, std::string univeral_label, _ int main(int argc, char **argv) { std::string labels_file, universal_label; - _u32 density; + uint32_t density; po::options_description desc{"Arguments"}; try @@ -127,7 +127,7 @@ int main(int argc, char **argv) "path to labels data file."); desc.add_options()("universal_label", po::value(&universal_label)->required(), "Universal label used in labels file."); - desc.add_options()("density", po::value<_u32>(&density)->default_value(1), + desc.add_options()("density", po::value(&density)->default_value(1), "Number of labels each point in labels file, defaults to 1"); po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); diff --git a/tests/utils/tsv_to_bin.cpp b/apps/utils/tsv_to_bin.cpp similarity index 75% rename from tests/utils/tsv_to_bin.cpp rename to apps/utils/tsv_to_bin.cpp index 5aaa9a03c..c590a8f73 100644 --- a/tests/utils/tsv_to_bin.cpp +++ b/apps/utils/tsv_to_bin.cpp @@ -4,16 +4,16 @@ #include #include "utils.h" -void block_convert_float(std::ifstream &reader, std::ofstream &writer, _u64 npts, _u64 ndims) +void block_convert_float(std::ifstream &reader, std::ofstream &writer, size_t npts, size_t ndims) { auto read_buf = new float[npts * (ndims + 1)]; auto cursor = read_buf; float val; - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) { reader >> val; *cursor = val; @@ -24,16 +24,16 @@ void block_convert_float(std::ifstream &reader, std::ofstream &writer, _u64 npts delete[] read_buf; } -void block_convert_int8(std::ifstream &reader, std::ofstream &writer, _u64 npts, _u64 ndims) +void block_convert_int8(std::ifstream &reader, std::ofstream &writer, size_t npts, size_t ndims) { auto read_buf = new int8_t[npts * (ndims + 1)]; auto cursor = read_buf; int val; - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) { reader >> val; *cursor = (int8_t)val; @@ -44,16 +44,16 @@ void block_convert_int8(std::ifstream &reader, std::ofstream &writer, _u64 npts, delete[] read_buf; } -void block_convert_uint8(std::ifstream &reader, std::ofstream &writer, _u64 npts, _u64 ndims) +void block_convert_uint8(std::ifstream &reader, std::ofstream &writer, size_t npts, size_t ndims) { auto read_buf = new uint8_t[npts * (ndims + 1)]; auto cursor = read_buf; int val; - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { - for (_u64 d = 0; d < ndims; ++d) + for (size_t d = 0; d < ndims; ++d) { reader >> val; *cursor = (uint8_t)val; @@ -81,26 +81,26 @@ int main(int argc, char **argv) std::cout << "Unsupported type. float, int8 and uint8 types are supported." << std::endl; } - _u64 ndims = atoi(argv[4]); - _u64 npts = atoi(argv[5]); + size_t ndims = atoi(argv[4]); + size_t npts = atoi(argv[5]); std::ifstream reader(argv[2], std::ios::binary | std::ios::ate); - // _u64 fsize = reader.tellg(); + // size_t 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; + size_t blk_size = 131072; + size_t 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)); + auto npts_u32 = (uint32_t)npts; + auto ndims_u32 = (uint32_t)ndims; + writer.write((char *)&npts_u32, sizeof(uint32_t)); + writer.write((char *)&ndims_u32, sizeof(uint32_t)); - for (_u64 i = 0; i < nblks; i++) + for (size_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + size_t cblk_size = std::min(npts - i * blk_size, blk_size); if (std::string(argv[1]) == std::string("float")) { block_convert_float(reader, writer, cblk_size, ndims); diff --git a/tests/utils/uint32_to_uint8.cpp b/apps/utils/uint32_to_uint8.cpp similarity index 100% rename from tests/utils/uint32_to_uint8.cpp rename to apps/utils/uint32_to_uint8.cpp diff --git a/tests/utils/uint8_to_float.cpp b/apps/utils/uint8_to_float.cpp similarity index 100% rename from tests/utils/uint8_to_float.cpp rename to apps/utils/uint8_to_float.cpp diff --git a/tests/utils/vector_analysis.cpp b/apps/utils/vector_analysis.cpp similarity index 78% rename from tests/utils/vector_analysis.cpp rename to apps/utils/vector_analysis.cpp index 99e5627b1..009df6d05 100644 --- a/tests/utils/vector_analysis.cpp +++ b/apps/utils/vector_analysis.cpp @@ -24,19 +24,19 @@ template int analyze_norm(std::string base_file) { std::cout << "Analyzing data norms" << std::endl; T *data; - _u64 npts, ndims; + size_t npts, ndims; diskann::load_bin(base_file, data, npts, ndims); std::vector norms(npts, 0); #pragma omp parallel for schedule(dynamic) - for (_s64 i = 0; i < (_s64)npts; i++) + for (int64_t i = 0; i < (int64_t)npts; i++) { - for (_u32 d = 0; d < ndims; d++) + for (size_t d = 0; d < ndims; d++) norms[i] += data[i * ndims + d] * data[i * ndims + d]; norms[i] = std::sqrt(norms[i]); } std::sort(norms.begin(), norms.end()); - for (_u32 p = 0; p < 100; p += 5) - std::cout << "percentile " << p << ": " << norms[std::floor((p / 100.0) * npts)] << std::endl; + for (int p = 0; p < 100; p += 5) + std::cout << "percentile " << p << ": " << norms[(uint64_t)(std::floor((p / 100.0) * npts))] << std::endl; std::cout << "percentile 100" << ": " << norms[npts - 1] << std::endl; delete[] data; @@ -47,18 +47,18 @@ template int normalize_base(std::string base_file, std::string out_ { std::cout << "Normalizing base" << std::endl; T *data; - _u64 npts, ndims; + size_t npts, ndims; diskann::load_bin(base_file, data, npts, ndims); // std::vector norms(npts, 0); #pragma omp parallel for schedule(dynamic) - for (_s64 i = 0; i < (_s64)npts; i++) + for (int64_t i = 0; i < (int64_t)npts; i++) { float pt_norm = 0; - for (_u32 d = 0; d < ndims; d++) + for (size_t d = 0; d < ndims; d++) pt_norm += data[i * ndims + d] * data[i * ndims + d]; pt_norm = std::sqrt(pt_norm); - for (_u32 d = 0; d < ndims; d++) - data[i * ndims + d] = data[i * ndims + d] / pt_norm; + for (size_t d = 0; d < ndims; d++) + data[i * ndims + d] = static_cast(data[i * ndims + d] / pt_norm); } diskann::save_bin(out_file, data, npts, ndims); delete[] data; @@ -69,14 +69,14 @@ template int augment_base(std::string base_file, std::string out_fi { std::cout << "Analyzing data norms" << std::endl; T *data; - _u64 npts, ndims; + size_t npts, ndims; diskann::load_bin(base_file, data, npts, ndims); std::vector norms(npts, 0); float max_norm = 0; #pragma omp parallel for schedule(dynamic) - for (_s64 i = 0; i < (_s64)npts; i++) + for (int64_t i = 0; i < (int64_t)npts; i++) { - for (_u32 d = 0; d < ndims; d++) + for (size_t d = 0; d < ndims; d++) norms[i] += data[i * ndims + d] * data[i * ndims + d]; max_norm = norms[i] > max_norm ? norms[i] : max_norm; } @@ -84,19 +84,19 @@ template int augment_base(std::string base_file, std::string out_fi max_norm = std::sqrt(max_norm); std::cout << "Max norm: " << max_norm << std::endl; T *new_data; - _u64 newdims = ndims + 1; + size_t newdims = ndims + 1; new_data = new T[npts * newdims]; - for (_u64 i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { if (prep_base) { - for (_u64 j = 0; j < ndims; j++) + for (size_t j = 0; j < ndims; j++) { - new_data[i * newdims + j] = data[i * ndims + j] / max_norm; + new_data[i * newdims + j] = static_cast(data[i * ndims + j] / max_norm); } float diff = 1 - (norms[i] / (max_norm * max_norm)); diff = diff <= 0 ? 0 : std::sqrt(diff); - new_data[i * newdims + ndims] = diff; + new_data[i * newdims + ndims] = static_cast(diff); if (diff <= 0) { std::cout << i << " has large max norm, investigate if needed. diff = " << diff << std::endl; @@ -104,9 +104,9 @@ template int augment_base(std::string base_file, std::string out_fi } else { - for (_u64 j = 0; j < ndims; j++) + for (size_t j = 0; j < ndims; j++) { - new_data[i * newdims + j] = data[i * ndims + j] / std::sqrt(norms[i]); + new_data[i * newdims + j] = static_cast(data[i * ndims + j] / std::sqrt(norms[i])); } new_data[i * newdims + ndims] = 0; } @@ -120,7 +120,7 @@ template int augment_base(std::string base_file, std::string out_fi template int aux_main(char **argv) { std::string base_file(argv[2]); - _u32 option = atoi(argv[3]); + uint32_t option = atoi(argv[3]); if (option == 1) analyze_norm(base_file); else if (option == 2) diff --git a/clang-format.cmake b/clang-format.cmake index cbe6694b4..19bb3a850 100644 --- a/clang-format.cmake +++ b/clang-format.cmake @@ -2,7 +2,7 @@ if (NOT MSVC) message(STATUS "Setting up `make format` and `make checkformat`") # additional target to perform clang-format run, requires clang-format # get all project files - file(GLOB_RECURSE ALL_SOURCE_FILES include/*.h python/src/*.cpp src/*.cpp tests/*.cpp) + file(GLOB_RECURSE ALL_SOURCE_FILES include/*.h include/*.hpp python/src/*.cpp src/*.cpp src/*.hpp apps/*.cpp apps/*.hpp) message(status ${ALL_SOURCE_FILES}) diff --git a/include/abstract_data_store.h b/include/abstract_data_store.h new file mode 100644 index 000000000..976174378 --- /dev/null +++ b/include/abstract_data_store.h @@ -0,0 +1,115 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include +#include + +#include "types.h" +#include "windows_customizations.h" +#include "distance.h" + +namespace diskann +{ + +template class AbstractDataStore +{ + public: + AbstractDataStore(const location_t capacity, const size_t dim); + + // virtual ~AbstractDataStore() = default; + + // Return number of points returned + virtual location_t load(const std::string &filename) = 0; + + // Why does store take num_pts? Since store only has capacity, but we allow + // resizing we can end up in a situation where the store has spare capacity. + // To optimize disk utilization, we pass the number of points that are "true" + // points, so that the store can discard the empty locations before saving. + virtual size_t save(const std::string &filename, const location_t num_pts) = 0; + + DISKANN_DLLEXPORT virtual location_t capacity() const; + + DISKANN_DLLEXPORT virtual size_t get_dims() const; + + // Implementers can choose to return _dim if they are not + // concerned about memory alignment. + // Some distance metrics (like l2) need data vectors to be aligned, so we + // align the dimension by padding zeros. + virtual size_t get_aligned_dim() const = 0; + + // populate the store with vectors (either from a pointer or bin file), + // potentially after pre-processing the vectors if the metric deems so + // e.g., normalizing vectors for cosine distance over floating-point vectors + // useful for bulk or static index building. + virtual void populate_data(const data_t *vectors, const location_t num_pts) = 0; + virtual void populate_data(const std::string &filename, const size_t offset) = 0; + + // save the first num_pts many vectors back to bin file + // note: cannot undo the pre-processing done in populate data + virtual void extract_data_to_bin(const std::string &filename, const location_t num_pts) = 0; + + // Returns the updated capacity of the datastore. Clients should check + // if resize actually changed the capacity to new_num_points before + // proceeding with operations. See the code below: + // auto new_capcity = data_store->resize(new_num_points); + // if ( new_capacity >= new_num_points) { + // //PROCEED + // else + // //ERROR. + virtual location_t resize(const location_t new_num_points); + + // operations on vectors + // like populate_data function, but over one vector at a time useful for + // streaming setting + virtual void get_vector(const location_t i, data_t *dest) const = 0; + virtual void set_vector(const location_t i, const data_t *const vector) = 0; + virtual void prefetch_vector(const location_t loc) = 0; + + // internal shuffle operations to move around vectors + // will bulk-move all the vectors in [old_start_loc, old_start_loc + + // num_points) to [new_start_loc, new_start_loc + num_points) and set the old + // positions to zero vectors. + virtual void move_vectors(const location_t old_start_loc, const location_t new_start_loc, + const location_t num_points) = 0; + + // same as above, without resetting the vectors in [from_loc, from_loc + + // num_points) to zero + virtual void copy_vectors(const location_t from_loc, const location_t to_loc, const location_t num_points) = 0; + + // metric specific operations + + virtual float get_distance(const data_t *query, const location_t loc) const = 0; + virtual void get_distance(const data_t *query, const location_t *locations, const uint32_t location_count, + float *distances) const = 0; + virtual float get_distance(const location_t loc1, const location_t loc2) const = 0; + + // stats of the data stored in store + // Returns the point in the dataset that is closest to the mean of all points + // in the dataset + virtual location_t calculate_medoid() const = 0; + + virtual Distance *get_dist_fn() = 0; + + // search helpers + // if the base data is aligned per the request of the metric, this will tell + // how to align the query vector in a consistent manner + virtual size_t get_alignment_factor() const = 0; + + protected: + // Expand the datastore to new_num_points. Returns the new capacity created, + // which should be == new_num_points in the normal case. Implementers can also + // return _capacity to indicate that there are not implementing this method. + virtual location_t expand(const location_t new_num_points) = 0; + + // Shrink the datastore to new_num_points. It is NOT an error if shrink + // doesn't reduce the capacity so callers need to check this correctly. See + // also for "default" implementation + virtual location_t shrink(const location_t new_num_points) = 0; + + location_t _capacity; + size_t _dim; +}; + +} // namespace diskann diff --git a/include/abstract_graph_store.h b/include/abstract_graph_store.h new file mode 100644 index 000000000..f7735b79a --- /dev/null +++ b/include/abstract_graph_store.h @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include +#include + +#include "types.h" + +namespace diskann +{ + +class AbstractGraphStore +{ + public: + AbstractGraphStore(const size_t max_pts) : _capacity(max_pts) + { + } + + virtual int load(const std::string &index_path_prefix) = 0; + virtual int store(const std::string &index_path_prefix) = 0; + + virtual void get_adj_list(const location_t i, std::vector &neighbors) = 0; + virtual void set_adj_list(const location_t i, std::vector &neighbors) = 0; + + private: + size_t _capacity; +}; + +} // namespace diskann diff --git a/include/abstract_index.h b/include/abstract_index.h new file mode 100644 index 000000000..1a32bf8da --- /dev/null +++ b/include/abstract_index.h @@ -0,0 +1,118 @@ +#pragma once +#include "distance.h" +#include "parameters.h" +#include "utils.h" +#include "types.h" +#include "index_config.h" +#include "index_build_params.h" +#include + +namespace diskann +{ +struct consolidation_report +{ + enum status_code + { + SUCCESS = 0, + FAIL = 1, + LOCK_FAIL = 2, + INCONSISTENT_COUNT_ERROR = 3 + }; + status_code _status; + size_t _active_points, _max_points, _empty_slots, _slots_released, _delete_set_size, _num_calls_to_process_delete; + double _time; + + consolidation_report(status_code status, size_t active_points, size_t max_points, size_t empty_slots, + size_t slots_released, size_t delete_set_size, size_t num_calls_to_process_delete, + double time_secs) + : _status(status), _active_points(active_points), _max_points(max_points), _empty_slots(empty_slots), + _slots_released(slots_released), _delete_set_size(delete_set_size), + _num_calls_to_process_delete(num_calls_to_process_delete), _time(time_secs) + { + } +}; + +/* A templated independent class for intercation with Index. Uses Type Erasure to add virtual implemetation of methods +that can take any type(using std::any) and Provides a clean API that can be inherited by different type of Index. +*/ +class AbstractIndex +{ + public: + AbstractIndex() = default; + virtual ~AbstractIndex() = default; + + virtual void build(const std::string &data_file, const size_t num_points_to_load, + IndexBuildParams &build_params) = 0; + + template + void build(const data_type *data, const size_t num_points_to_load, const IndexWriteParameters ¶meters, + const std::vector &tags); + + virtual void save(const char *filename, bool compact_before_save = false) = 0; + +#ifdef EXEC_ENV_OLS + virtual void load(AlignedFileReader &reader, uint32_t num_threads, uint32_t search_l) = 0; +#else + virtual void load(const char *index_file, uint32_t num_threads, uint32_t search_l) = 0; +#endif + + // For FastL2 search on optimized layout + template + void search_with_optimized_layout(const data_type *query, size_t K, size_t L, uint32_t *indices); + + // Initialize space for res_vectors before calling. + template + size_t search_with_tags(const data_type *query, const uint64_t K, const uint32_t L, tag_type *tags, + float *distances, std::vector &res_vectors); + + // Added search overload that takes L as parameter, so that we + // can customize L on a per-query basis without tampering with "Parameters" + // IDtype is either uint32_t or uint64_t + template + std::pair search(const data_type *query, const size_t K, const uint32_t L, IDType *indices, + float *distances = nullptr); + + // Filter support search + // IndexType is either uint32_t or uint64_t + template + std::pair search_with_filters(const DataType &query, const std::string &raw_label, + const size_t K, const uint32_t L, IndexType *indices, + float *distances); + + template int insert_point(const data_type *point, const tag_type tag); + + template int lazy_delete(const tag_type &tag); + + template + void lazy_delete(const std::vector &tags, std::vector &failed_tags); + + template void get_active_tags(tsl::robin_set &active_tags); + + template void set_start_points_at_random(data_type radius, uint32_t random_seed = 0); + + virtual consolidation_report consolidate_deletes(const IndexWriteParameters ¶meters) = 0; + + virtual void optimize_index_layout() = 0; + + // memory should be allocated for vec before calling this function + template int get_vector_by_tag(tag_type &tag, data_type *vec); + + private: + virtual void _build(const DataType &data, const size_t num_points_to_load, const IndexWriteParameters ¶meters, + TagVector &tags) = 0; + virtual std::pair _search(const DataType &query, const size_t K, const uint32_t L, + std::any &indices, float *distances = nullptr) = 0; + virtual std::pair _search_with_filters(const DataType &query, const std::string &filter_label, + const size_t K, const uint32_t L, std::any &indices, + float *distances) = 0; + virtual int _insert_point(const DataType &data_point, const TagType tag) = 0; + virtual int _lazy_delete(const TagType &tag) = 0; + virtual void _lazy_delete(TagVector &tags, TagVector &failed_tags) = 0; + virtual void _get_active_tags(TagRobinSet &active_tags) = 0; + virtual void _set_start_points_at_random(DataType radius, uint32_t random_seed = 0) = 0; + virtual int _get_vector_by_tag(TagType &tag, DataType &vec) = 0; + virtual size_t _search_with_tags(const DataType &query, const uint64_t K, const uint32_t L, const TagType &tags, + float *distances, DataVector &res_vectors) = 0; + virtual void _search_with_optimized_layout(const DataType &query, size_t K, size_t L, uint32_t *indices) = 0; +}; +} // namespace diskann diff --git a/include/ann_exception.h b/include/ann_exception.h index ff3bb33d9..6b81373c1 100644 --- a/include/ann_exception.h +++ b/include/ann_exception.h @@ -19,7 +19,7 @@ class ANNException : public std::runtime_error public: DISKANN_DLLEXPORT ANNException(const std::string &message, int errorCode); DISKANN_DLLEXPORT ANNException(const std::string &message, int errorCode, const std::string &funcSig, - const std::string &fileName, unsigned int lineNum); + const std::string &fileName, uint32_t lineNum); private: int _errorCode; @@ -29,6 +29,6 @@ class FileException : public ANNException { public: DISKANN_DLLEXPORT FileException(const std::string &filename, std::system_error &e, const std::string &funcSig, - const std::string &fileName, unsigned int lineNum); + const std::string &fileName, uint32_t lineNum); }; } // namespace diskann diff --git a/include/any_wrappers.h b/include/any_wrappers.h new file mode 100644 index 000000000..da9005cfb --- /dev/null +++ b/include/any_wrappers.h @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include +#include +#include +#include +#include "tsl/robin_set.h" + +namespace AnyWrapper +{ + +/* + * Base Struct to hold refrence to the data. + * Note: No memory mamagement, caller need to keep object alive. + */ +struct AnyReference +{ + template AnyReference(Ty &reference) : _data(&reference) + { + } + + template Ty &get() + { + auto ptr = std::any_cast(_data); + return *ptr; + } + + private: + std::any _data; +}; +struct AnyRobinSet : public AnyReference +{ + template AnyRobinSet(const tsl::robin_set &robin_set) : AnyReference(robin_set) + { + } + template AnyRobinSet(tsl::robin_set &robin_set) : AnyReference(robin_set) + { + } +}; + +struct AnyVector : public AnyReference +{ + template AnyVector(const std::vector &vector) : AnyReference(vector) + { + } + template AnyVector(std::vector &vector) : AnyReference(vector) + { + } +}; +} // namespace AnyWrapper diff --git a/include/cached_io.h b/include/cached_io.h index a41c03431..daef2f2f7 100644 --- a/include/cached_io.h +++ b/include/cached_io.h @@ -95,8 +95,8 @@ class cached_ifstream reader.read(cache_buf, cache_size); cur_off = 0; } - // note that if size_left < cache_size, then cur_off = cache_size, so - // subsequent reads will all be directly from file + // note that if size_left < cache_size, then cur_off = cache_size, + // so subsequent reads will all be directly from file } } diff --git a/include/common_includes.h b/include/common_includes.h index 96de5a46c..e1a51bdec 100644 --- a/include/common_includes.h +++ b/include/common_includes.h @@ -23,4 +23,5 @@ #include #include #include +#include #include diff --git a/include/concurrent_queue.h b/include/concurrent_queue.h index 405b90617..1e57bbf0f 100644 --- a/include/concurrent_queue.h +++ b/include/concurrent_queue.h @@ -88,8 +88,8 @@ template class ConcurrentQueue { T ret = this->q.front(); this->q.pop(); - // diskann::cout << "thread_id: " << std::this_thread::get_id() << ", - // ctx: " + // diskann::cout << "thread_id: " << std::this_thread::get_id() << + // ", ctx: " // << ret.ctx << "\n"; lk.unlock(); return ret; diff --git a/include/defaults.h b/include/defaults.h new file mode 100644 index 000000000..2f157cb25 --- /dev/null +++ b/include/defaults.h @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once +#include + +namespace diskann +{ +namespace defaults +{ +const float ALPHA = 1.2f; +const uint32_t NUM_THREADS = 0; +const uint32_t MAX_OCCLUSION_SIZE = 750; +const uint32_t FILTER_LIST_SIZE = 0; +const uint32_t NUM_FROZEN_POINTS_STATIC = 0; +const uint32_t NUM_FROZEN_POINTS_DYNAMIC = 1; +// following constants should always be specified, but are useful as a +// sensible default at cli / python boundaries +const uint32_t MAX_DEGREE = 64; +const uint32_t BUILD_LIST_SIZE = 100; +const uint32_t SATURATE_GRAPH = false; +const uint32_t SEARCH_LIST_SIZE = 100; +} // namespace defaults +} // namespace diskann diff --git a/include/disk_utils.h b/include/disk_utils.h index ff0619e74..08f046dcd 100644 --- a/include/disk_utils.h +++ b/include/disk_utils.h @@ -49,7 +49,7 @@ DISKANN_DLLEXPORT void add_new_file_to_single_index(std::string index_file, std: DISKANN_DLLEXPORT size_t calculate_num_pq_chunks(double final_index_ram_limit, size_t points_num, uint32_t dim); -DISKANN_DLLEXPORT void read_idmap(const std::string &fname, std::vector &ivecs); +DISKANN_DLLEXPORT void read_idmap(const std::string &fname, std::vector &ivecs); #ifdef EXEC_ENV_OLS template @@ -63,7 +63,7 @@ DISKANN_DLLEXPORT T *load_warmup(const std::string &cache_warmup_file, uint64_t DISKANN_DLLEXPORT int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suffix, const std::string &idmaps_prefix, const std::string &idmaps_suffix, - const _u64 nshards, unsigned max_degree, const std::string &output_vamana, + const uint64_t nshards, uint32_t max_degree, const std::string &output_vamana, const std::string &medoids_file, bool use_filters = false, const std::string &labels_to_medoids_file = std::string("")); @@ -75,27 +75,30 @@ DISKANN_DLLEXPORT std::string preprocess_base_file(const std::string &infile, co diskann::Metric &distMetric); 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, +DISKANN_DLLEXPORT int build_merged_vamana_index(std::string base_file, diskann::Metric _compareMetric, uint32_t L, + uint32_t R, double sampling_rate, double ram_budget, std::string mem_index_path, std::string medoids_file, std::string centroids_file, size_t build_pq_bytes, bool use_opq, - bool use_filters = false, + uint32_t num_threads, bool use_filters = false, const std::string &label_file = std::string(""), const std::string &labels_to_medoids_file = std::string(""), - const std::string &universal_label = "", const _u32 Lf = 0); + const std::string &universal_label = "", const uint32_t Lf = 0); 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); + T *tuning_sample, uint64_t tuning_sample_num, + uint64_t tuning_sample_aligned_dim, uint32_t L, uint32_t nthreads, + uint32_t start_bw = 2); template DISKANN_DLLEXPORT int build_disk_index( const char *dataFilePath, const char *indexFilePath, const char *indexBuildParameters, - diskann::Metric _compareMetric, bool use_opq = false, bool use_filters = false, + diskann::Metric _compareMetric, bool use_opq = false, + const std::string &codebook_prefix = "", // default is empty for no codebook pass in + bool use_filters = false, const std::string &label_file = std::string(""), // default is empty string for no label_file - const std::string &universal_label = "", const _u32 filter_threshold = 0, - const _u32 Lf = 0); // default is empty string for no universal label + const std::string &universal_label = "", const uint32_t filter_threshold = 0, + const uint32_t Lf = 0); // default is empty string for no universal label template DISKANN_DLLEXPORT void create_disk_layout(const std::string base_file, const std::string mem_index_file, diff --git a/include/distance.h b/include/distance.h index e04be7ee2..8b20e586b 100644 --- a/include/distance.h +++ b/include/distance.h @@ -1,5 +1,6 @@ #pragma once #include "windows_customizations.h" +#include namespace diskann { @@ -14,21 +15,77 @@ enum Metric template class Distance { public: - virtual float compare(const T *a, const T *b, uint32_t length) const = 0; - virtual ~Distance() + DISKANN_DLLEXPORT Distance(diskann::Metric dist_metric) : _distance_metric(dist_metric) { } + + // distance comparison function + DISKANN_DLLEXPORT virtual float compare(const T *a, const T *b, uint32_t length) const = 0; + + // Needed only for COSINE-BYTE and INNER_PRODUCT-BYTE + DISKANN_DLLEXPORT virtual float compare(const T *a, const T *b, const float normA, const float normB, + uint32_t length) const; + + // For MIPS, normalization adds an extra dimension to the vectors. + // This function lets callers know if the normalization process + // changes the dimension. + DISKANN_DLLEXPORT virtual uint32_t post_normalization_dimension(uint32_t orig_dimension) const; + + DISKANN_DLLEXPORT virtual diskann::Metric get_metric() const; + + // This is for efficiency. If no normalization is required, the callers + // can simply ignore the normalize_data_for_build() function. + DISKANN_DLLEXPORT virtual bool preprocessing_required() const; + + // Check the preprocessing_required() function before calling this. + // Clients can call the function like this: + // + // if (metric->preprocessing_required()){ + // T* normalized_data_batch; + // Split data into batches of batch_size and for each, call: + // metric->preprocess_base_points(data_batch, batch_size); + // + // TODO: This does not take into account the case for SSD inner product + // where the dimensions change after normalization. + DISKANN_DLLEXPORT virtual void preprocess_base_points(T *original_data, const size_t orig_dim, + const size_t num_points); + + // Invokes normalization for a single vector during search. The scratch space + // has to be created by the caller keeping track of the fact that + // normalization might change the dimension of the query vector. + DISKANN_DLLEXPORT virtual void preprocess_query(const T *query_vec, const size_t query_dim, T *scratch_query); + + // If an algorithm has a requirement that some data be aligned to a certain + // boundary it can use this function to indicate that requirement. Currently, + // we are setting it to 8 because that works well for AVX2. If we have AVX512 + // implementations of distance algos, they might have to set this to 16 + // (depending on how they are implemented) + DISKANN_DLLEXPORT virtual size_t get_required_alignment() const; + + // Providing a default implementation for the virtual destructor because we + // don't expect most metric implementations to need it. + DISKANN_DLLEXPORT virtual ~Distance(); + + protected: + diskann::Metric _distance_metric; + size_t _alignment_factor = 8; }; class DistanceCosineInt8 : public Distance { public: + DistanceCosineInt8() : Distance(diskann::Metric::COSINE) + { + } DISKANN_DLLEXPORT virtual float compare(const int8_t *a, const int8_t *b, uint32_t length) const; }; class DistanceL2Int8 : public Distance { public: + DistanceL2Int8() : Distance(diskann::Metric::L2) + { + } DISKANN_DLLEXPORT virtual float compare(const int8_t *a, const int8_t *b, uint32_t size) const; }; @@ -36,18 +93,28 @@ class DistanceL2Int8 : public Distance class AVXDistanceL2Int8 : public Distance { public: + AVXDistanceL2Int8() : Distance(diskann::Metric::L2) + { + } DISKANN_DLLEXPORT virtual float compare(const int8_t *a, const int8_t *b, uint32_t length) const; }; class DistanceCosineFloat : public Distance { public: + DistanceCosineFloat() : Distance(diskann::Metric::COSINE) + { + } DISKANN_DLLEXPORT virtual float compare(const float *a, const float *b, uint32_t length) const; }; class DistanceL2Float : public Distance { public: + DistanceL2Float() : Distance(diskann::Metric::L2) + { + } + #ifdef _WINDOWS DISKANN_DLLEXPORT virtual float compare(const float *a, const float *b, uint32_t size) const; #else @@ -58,46 +125,49 @@ class DistanceL2Float : public Distance class AVXDistanceL2Float : public Distance { public: + AVXDistanceL2Float() : Distance(diskann::Metric::L2) + { + } DISKANN_DLLEXPORT virtual float compare(const float *a, const float *b, uint32_t length) const; }; -class SlowDistanceL2Float : public Distance +template class SlowDistanceL2 : public Distance { public: - DISKANN_DLLEXPORT virtual float compare(const float *a, const float *b, uint32_t length) const; + SlowDistanceL2() : Distance(diskann::Metric::L2) + { + } + DISKANN_DLLEXPORT virtual float compare(const T *a, const T *b, uint32_t length) const; }; class SlowDistanceCosineUInt8 : public Distance { public: + SlowDistanceCosineUInt8() : Distance(diskann::Metric::COSINE) + { + } DISKANN_DLLEXPORT virtual float compare(const uint8_t *a, const uint8_t *b, uint32_t length) const; }; class DistanceL2UInt8 : public Distance { public: + DistanceL2UInt8() : Distance(diskann::Metric::L2) + { + } DISKANN_DLLEXPORT virtual float compare(const uint8_t *a, const uint8_t *b, uint32_t size) const; }; -// Simple implementations for non-AVX machines. Compiler can optimize. -template class SlowDistanceL2Int : public Distance +template class DistanceInnerProduct : public Distance { public: - // Implementing here because this is a template function - DISKANN_DLLEXPORT virtual float compare(const T *a, const T *b, uint32_t length) const + DistanceInnerProduct() : Distance(diskann::Metric::INNER_PRODUCT) { - uint32_t result = 0; - 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])); - } - return (float)result; } -}; -template class DistanceInnerProduct : public Distance -{ - public: + DistanceInnerProduct(diskann::Metric metric) : Distance(metric) + { + } inline float inner_product(const T *a, const T *b, unsigned size) const; inline float compare(const T *a, const T *b, unsigned size) const @@ -115,6 +185,9 @@ template class DistanceFastL2 : public DistanceInnerProduct // currently defined only for float. // templated for future use. public: + DistanceFastL2() : DistanceInnerProduct(diskann::Metric::FAST_L2) + { + } float norm(const T *a, unsigned size) const; float compare(const T *a, const T *b, float norm, unsigned size) const; }; @@ -122,6 +195,9 @@ template class DistanceFastL2 : public DistanceInnerProduct class AVXDistanceInnerProductFloat : public Distance { public: + AVXDistanceInnerProductFloat() : Distance(diskann::Metric::INNER_PRODUCT) + { + } DISKANN_DLLEXPORT virtual float compare(const float *a, const float *b, uint32_t length) const; }; @@ -130,13 +206,28 @@ class AVXNormalizedCosineDistanceFloat : public Distance private: AVXDistanceInnerProductFloat _innerProduct; + protected: + void normalize_and_copy(const float *a, uint32_t length, float *a_norm) const; + public: + AVXNormalizedCosineDistanceFloat() : Distance(diskann::Metric::COSINE) + { + } DISKANN_DLLEXPORT virtual float compare(const float *a, const float *b, uint32_t length) const { // Inner product returns negative values to indicate distance. // This will ensure that cosine is between -1 and 1. return 1.0f + _innerProduct.compare(a, b, length); } + DISKANN_DLLEXPORT virtual uint32_t post_normalization_dimension(uint32_t orig_dimension) const override; + + DISKANN_DLLEXPORT virtual bool preprocessing_required() const; + + DISKANN_DLLEXPORT virtual void preprocess_base_points(float *original_data, const size_t orig_dim, + const size_t num_points) override; + + DISKANN_DLLEXPORT virtual void preprocess_query(const float *query_vec, const size_t query_dim, + float *scratch_query_vector) override; }; template Distance *get_distance_function(Metric m); diff --git a/include/filter_utils.h b/include/filter_utils.h new file mode 100644 index 000000000..df1970be4 --- /dev/null +++ b/include/filter_utils.h @@ -0,0 +1,217 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __APPLE__ +#else +#include +#endif + +#ifdef _WINDOWS +#include +typedef HANDLE FileHandle; +#else +#include +typedef int FileHandle; +#endif + +#ifndef _WINDOWS +#include +#endif + +#include "cached_io.h" +#include "common_includes.h" +#include "memory_mapper.h" +#include "utils.h" +#include "windows_customizations.h" + +// custom types (for readability) +typedef tsl::robin_set label_set; +typedef std::string path; + +// structs for returning multiple items from a function +typedef std::tuple, tsl::robin_map, tsl::robin_set> + parse_label_file_return_values; +typedef std::tuple>, uint64_t> load_label_index_return_values; + +namespace diskann +{ +template +DISKANN_DLLEXPORT void generate_label_indices(path input_data_path, path final_index_path_prefix, label_set all_labels, + unsigned R, unsigned L, float alpha, unsigned num_threads); + +DISKANN_DLLEXPORT load_label_index_return_values load_label_index(path label_index_path, + uint32_t label_number_of_points); + +DISKANN_DLLEXPORT parse_label_file_return_values parse_label_file(path label_data_path, std::string universal_label); + +template +DISKANN_DLLEXPORT tsl::robin_map> generate_label_specific_vector_files_compat( + path input_data_path, tsl::robin_map labels_to_number_of_points, + std::vector point_ids_to_labels, label_set all_labels); + +/* + * For each label, generates a file containing all vectors that have said label. + * Also copies data from original bin file to new dimension-aligned file. + * + * Utilizes POSIX functions mmap and writev in order to minimize memory + * overhead, so we include an STL version as well. + * + * Each data file is saved under the following format: + * input_data_path + "_" + label + */ +#ifndef _WINDOWS +template +inline tsl::robin_map> generate_label_specific_vector_files( + path input_data_path, tsl::robin_map labels_to_number_of_points, + std::vector point_ids_to_labels, label_set all_labels) +{ +#ifndef _WINDOWS + auto file_writing_timer = std::chrono::high_resolution_clock::now(); + diskann::MemoryMapper input_data(input_data_path); + char *input_start = input_data.getBuf(); + + uint32_t number_of_points, dimension; + std::memcpy(&number_of_points, input_start, sizeof(uint32_t)); + std::memcpy(&dimension, input_start + sizeof(uint32_t), sizeof(uint32_t)); + const uint32_t VECTOR_SIZE = dimension * sizeof(T); + const size_t METADATA = 2 * sizeof(uint32_t); + if (number_of_points != point_ids_to_labels.size()) + { + std::cerr << "Error: number of points in labels file and data file differ." << std::endl; + throw; + } + + tsl::robin_map label_to_iovec_map; + tsl::robin_map label_to_curr_iovec; + tsl::robin_map> label_id_to_orig_id; + + // setup iovec list for each label + for (const auto &lbl : all_labels) + { + iovec *label_iovecs = (iovec *)malloc(labels_to_number_of_points[lbl] * sizeof(iovec)); + if (label_iovecs == nullptr) + { + throw; + } + label_to_iovec_map[lbl] = label_iovecs; + label_to_curr_iovec[lbl] = 0; + label_id_to_orig_id[lbl].reserve(labels_to_number_of_points[lbl]); + } + + // each point added to corresponding per-label iovec list + for (uint32_t point_id = 0; point_id < number_of_points; point_id++) + { + char *curr_point = input_start + METADATA + (VECTOR_SIZE * point_id); + iovec curr_iovec; + + curr_iovec.iov_base = curr_point; + curr_iovec.iov_len = VECTOR_SIZE; + for (const auto &lbl : point_ids_to_labels[point_id]) + { + *(label_to_iovec_map[lbl] + label_to_curr_iovec[lbl]) = curr_iovec; + label_to_curr_iovec[lbl]++; + label_id_to_orig_id[lbl].push_back(point_id); + } + } + + // write each label iovec to resp. file + for (const auto &lbl : all_labels) + { + int label_input_data_fd; + path curr_label_input_data_path(input_data_path + "_" + lbl); + uint32_t curr_num_pts = labels_to_number_of_points[lbl]; + + label_input_data_fd = + open(curr_label_input_data_path.c_str(), O_CREAT | O_WRONLY | O_TRUNC | O_APPEND, (mode_t)0644); + if (label_input_data_fd == -1) + throw; + + // write metadata + uint32_t metadata[2] = {curr_num_pts, dimension}; + int return_value = write(label_input_data_fd, metadata, sizeof(uint32_t) * 2); + if (return_value == -1) + { + throw; + } + + // limits on number of iovec structs per writev means we need to perform + // multiple writevs + size_t i = 0; + while (curr_num_pts > IOV_MAX) + { + return_value = writev(label_input_data_fd, (label_to_iovec_map[lbl] + (IOV_MAX * i)), IOV_MAX); + if (return_value == -1) + { + close(label_input_data_fd); + throw; + } + curr_num_pts -= IOV_MAX; + i += 1; + } + return_value = writev(label_input_data_fd, (label_to_iovec_map[lbl] + (IOV_MAX * i)), curr_num_pts); + if (return_value == -1) + { + close(label_input_data_fd); + throw; + } + + free(label_to_iovec_map[lbl]); + close(label_input_data_fd); + } + + std::chrono::duration file_writing_time = std::chrono::high_resolution_clock::now() - file_writing_timer; + std::cout << "generated " << all_labels.size() << " label-specific vector files for index building in time " + << file_writing_time.count() << "\n" + << std::endl; + + return label_id_to_orig_id; +#endif +} +#endif + +inline std::vector loadTags(const std::string &tags_file, const std::string &base_file) +{ + const bool tags_enabled = tags_file.empty() ? false : true; + std::vector location_to_tag; + if (tags_enabled) + { + size_t tag_file_ndims, tag_file_npts; + std::uint32_t *tag_data; + diskann::load_bin(tags_file, tag_data, tag_file_npts, tag_file_ndims); + if (tag_file_ndims != 1) + { + diskann::cerr << "tags file error" << std::endl; + throw diskann::ANNException("tag file error", -1, __FUNCSIG__, __FILE__, __LINE__); + } + + // check if the point count match + size_t base_file_npts, base_file_ndims; + diskann::get_bin_metadata(base_file, base_file_npts, base_file_ndims); + if (base_file_npts != tag_file_npts) + { + diskann::cerr << "point num in tags file mismatch" << std::endl; + throw diskann::ANNException("point num in tags file mismatch", -1, __FUNCSIG__, __FILE__, __LINE__); + } + + location_to_tag.assign(tag_data, tag_data + tag_file_npts); + delete[] tag_data; + } + return location_to_tag; +} + +} // namespace diskann diff --git a/include/in_mem_data_store.h b/include/in_mem_data_store.h new file mode 100644 index 000000000..0509b3b82 --- /dev/null +++ b/include/in_mem_data_store.h @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include + +#include "tsl/robin_map.h" +#include "tsl/robin_set.h" +#include "tsl/sparse_map.h" +// #include "boost/dynamic_bitset.hpp" + +#include "abstract_data_store.h" + +#include "distance.h" +#include "natural_number_map.h" +#include "natural_number_set.h" +#include "aligned_file_reader.h" + +namespace diskann +{ +template class InMemDataStore : public AbstractDataStore +{ + public: + InMemDataStore(const location_t capacity, const size_t dim, std::shared_ptr> distance_fn); + virtual ~InMemDataStore(); + + virtual location_t load(const std::string &filename) override; + virtual size_t save(const std::string &filename, const location_t num_points) override; + + virtual size_t get_aligned_dim() const override; + + // Populate internal data from unaligned data while doing alignment and any + // normalization that is required. + virtual void populate_data(const data_t *vectors, const location_t num_pts) override; + virtual void populate_data(const std::string &filename, const size_t offset) override; + + virtual void extract_data_to_bin(const std::string &filename, const location_t num_pts) override; + + virtual void get_vector(const location_t i, data_t *target) const override; + virtual void set_vector(const location_t i, const data_t *const vector) override; + virtual void prefetch_vector(const location_t loc) override; + + virtual void move_vectors(const location_t old_location_start, const location_t new_location_start, + const location_t num_points) override; + virtual void copy_vectors(const location_t from_loc, const location_t to_loc, const location_t num_points) override; + + virtual float get_distance(const data_t *query, const location_t loc) const override; + virtual float get_distance(const location_t loc1, const location_t loc2) const override; + virtual void get_distance(const data_t *query, const location_t *locations, const uint32_t location_count, + float *distances) const override; + + virtual location_t calculate_medoid() const override; + + virtual Distance *get_dist_fn() override; + + virtual size_t get_alignment_factor() const override; + + protected: + virtual location_t expand(const location_t new_size) override; + virtual location_t shrink(const location_t new_size) override; + + virtual location_t load_impl(const std::string &filename); +#ifdef EXEC_ENV_OLS + virtual location_t load_impl(AlignedFileReader &reader); +#endif + + private: + data_t *_data = nullptr; + + size_t _aligned_dim; + + // It may seem weird to put distance metric along with the data store class, + // but this gives us perf benefits as the datastore can do distance + // computations during search and compute norms of vectors internally without + // have to copy data back and forth. + std::shared_ptr> _distance_fn; + + // in case we need to save vector norms for optimization + std::shared_ptr _pre_computed_norms; +}; + +} // namespace diskann \ No newline at end of file diff --git a/include/in_mem_graph_store.h b/include/in_mem_graph_store.h new file mode 100644 index 000000000..98a9e4dc5 --- /dev/null +++ b/include/in_mem_graph_store.h @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include "abstract_graph_store.h" + +namespace diskann +{ + +class InMemGraphStore : public AbstractGraphStore +{ + public: + InMemGraphStore(const size_t max_pts); + + int load(const std::string &index_path_prefix); + int store(const std::string &index_path_prefix); + + void get_adj_list(const location_t i, std::vector &neighbors); + void set_adj_list(const location_t i, std::vector &neighbors); +}; + +} // namespace diskann diff --git a/include/index.h b/include/index.h index 10efe1323..7c38db00e 100644 --- a/include/index.h +++ b/include/index.h @@ -18,6 +18,8 @@ #include "utils.h" #include "windows_customizations.h" #include "scratch.h" +#include "in_mem_data_store.h" +#include "abstract_index.h" #include #define OVERHEAD_FACTOR 1.1 @@ -27,40 +29,16 @@ namespace diskann { -inline double estimate_ram_usage(_u64 size, _u32 dim, _u32 datasize, _u32 degree) +inline double estimate_ram_usage(size_t size, uint32_t dim, uint32_t datasize, uint32_t degree) { double size_of_data = ((double)size) * ROUND_UP(dim, 8) * datasize; - double size_of_graph = ((double)size) * degree * sizeof(unsigned) * GRAPH_SLACK_FACTOR; + double size_of_graph = ((double)size) * degree * sizeof(uint32_t) * GRAPH_SLACK_FACTOR; double size_of_locks = ((double)size) * sizeof(non_recursive_mutex); double size_of_outer_vector = ((double)size) * sizeof(ptrdiff_t); return OVERHEAD_FACTOR * (size_of_data + size_of_graph + size_of_locks + size_of_outer_vector); } - -struct consolidation_report -{ - enum status_code - { - SUCCESS = 0, - FAIL = 1, - LOCK_FAIL = 2, - INCONSISTENT_COUNT_ERROR = 3 - }; - status_code _status; - size_t _active_points, _max_points, _empty_slots, _slots_released, _delete_set_size, _num_calls_to_process_delete; - double _time; - - consolidation_report(status_code status, size_t active_points, size_t max_points, size_t empty_slots, - size_t slots_released, size_t delete_set_size, size_t num_calls_to_process_delete, - double time_secs) - : _status(status), _active_points(active_points), _max_points(max_points), _empty_slots(empty_slots), - _slots_released(slots_released), _delete_set_size(delete_set_size), - _num_calls_to_process_delete(num_calls_to_process_delete), _time(time_secs) - { - } -}; - struct simple_bitmask_val { size_t _index = 0; @@ -172,7 +150,7 @@ class simple_bitmask std::uint64_t _bitmask_size; }; -template class Index +template class Index : public AbstractIndex { /************************************************************************** * @@ -188,14 +166,18 @@ template clas DISKANN_DLLEXPORT Index(Metric m, const size_t dim, const size_t max_points = 1, const bool dynamic_index = false, const bool enable_tags = false, const bool concurrent_consolidate = false, const bool pq_dist_build = false, const size_t num_pq_chunks = 0, - const bool use_opq = false, const size_t num_frozen_pts = 0); + const bool use_opq = false, const size_t num_frozen_pts = 0, + const bool init_data_store = true); // Constructor for incremental index DISKANN_DLLEXPORT Index(Metric m, const size_t dim, const size_t max_points, const bool dynamic_index, - const Parameters &indexParameters, const Parameters &searchParameters, - const bool enable_tags = false, const bool concurrent_consolidate = false, - const bool pq_dist_build = false, const size_t num_pq_chunks = 0, - const bool use_opq = false); + const IndexWriteParameters &indexParameters, const uint32_t initial_search_list_size, + const uint32_t search_threads, const bool enable_tags = false, + const bool concurrent_consolidate = false, const bool pq_dist_build = false, + const size_t num_pq_chunks = 0, const bool use_opq = false); + + DISKANN_DLLEXPORT Index(const IndexConfig &index_config, std::unique_ptr> data_store + /* std::unique_ptr graph_store*/); DISKANN_DLLEXPORT ~Index(); @@ -216,21 +198,28 @@ template clas DISKANN_DLLEXPORT size_t get_num_points(); DISKANN_DLLEXPORT size_t get_max_points(); + DISKANN_DLLEXPORT bool detect_common_filters(uint32_t point_id, bool search_invocation, + const std::vector &incoming_labels); + // Batch build from a file. Optionally pass tags vector. - DISKANN_DLLEXPORT void build(const char *filename, const size_t num_points_to_load, Parameters ¶meters, + DISKANN_DLLEXPORT void build(const char *filename, const size_t num_points_to_load, + const IndexWriteParameters ¶meters, const std::vector &tags = std::vector()); // Batch build from a file. Optionally pass tags file. - DISKANN_DLLEXPORT void build(const char *filename, const size_t num_points_to_load, Parameters ¶meters, - const char *tag_filename); + DISKANN_DLLEXPORT void build(const char *filename, const size_t num_points_to_load, + const IndexWriteParameters ¶meters, const char *tag_filename); // Batch build from a data array, which must pad vectors to aligned_dim - DISKANN_DLLEXPORT void build(const T *data, const size_t num_points_to_load, Parameters ¶meters, + DISKANN_DLLEXPORT void build(const T *data, const size_t num_points_to_load, const IndexWriteParameters ¶meters, const std::vector &tags); + DISKANN_DLLEXPORT void build(const std::string &data_file, const size_t num_points_to_load, + IndexBuildParams &build_params); + // Filtered Support DISKANN_DLLEXPORT void build_filtered_index(const char *filename, const std::string &label_file, - const size_t num_points_to_load, Parameters ¶meters, + const size_t num_points_to_load, IndexWriteParameters ¶meters, const std::vector &tags = std::vector()); DISKANN_DLLEXPORT void set_universal_label(const LabelT &label); @@ -244,28 +233,28 @@ template clas // Set starting points to random points on a sphere of certain radius. // A fixed random seed can be specified for scenarios where it's important // to have higher consistency between index builds. - DISKANN_DLLEXPORT void set_start_points_at_random(T radius, unsigned int random_seed = 0); + DISKANN_DLLEXPORT void set_start_points_at_random(T radius, uint32_t random_seed = 0); // For FastL2 search on a static index, we interleave the data with graph DISKANN_DLLEXPORT void optimize_index_layout(); // For FastL2 search on optimized layout - DISKANN_DLLEXPORT void search_with_optimized_layout(const T *query, size_t K, size_t L, unsigned *indices); + DISKANN_DLLEXPORT void search_with_optimized_layout(const T *query, size_t K, size_t L, uint32_t *indices); // Added search overload that takes L as parameter, so that we // can customize L on a per-query basis without tampering with "Parameters" template - DISKANN_DLLEXPORT std::pair search(const T *query, const size_t K, const unsigned L, + DISKANN_DLLEXPORT std::pair search(const T *query, const size_t K, const uint32_t L, IDType *indices, float *distances = nullptr); // Initialize space for res_vectors before calling. - DISKANN_DLLEXPORT size_t search_with_tags(const T *query, const uint64_t K, const unsigned L, TagT *tags, + DISKANN_DLLEXPORT size_t search_with_tags(const T *query, const uint64_t K, const uint32_t L, TagT *tags, float *distances, std::vector &res_vectors); // Filter support search template DISKANN_DLLEXPORT std::pair search_with_filters(const T *query, const LabelT &filter_label, - const size_t K, const unsigned L, + const size_t K, const uint32_t L, IndexType *indices, float *distances); // Will fail if tag already in the index or if tag=0. @@ -286,17 +275,18 @@ template clas // Returns number of live points left after consolidation // If _conc_consolidates is set in the ctor, then this call can be invoked // alongside inserts and lazy deletes, else it acquires _update_lock - DISKANN_DLLEXPORT consolidation_report consolidate_deletes(const Parameters ¶meters); + DISKANN_DLLEXPORT consolidation_report consolidate_deletes(const IndexWriteParameters ¶meters); - DISKANN_DLLEXPORT void prune_all_nbrs(const Parameters ¶meters); + DISKANN_DLLEXPORT void prune_all_neighbors(const uint32_t max_degree, const uint32_t max_occlusion, + const float alpha); DISKANN_DLLEXPORT bool is_index_saved(); // 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_points(unsigned old_location_start, unsigned new_location_start, - unsigned num_locations); + DISKANN_DLLEXPORT void reposition_points(uint32_t old_location_start, uint32_t new_location_start, + uint32_t num_locations); // DISKANN_DLLEXPORT void save_index_as_one_file(bool flag); @@ -320,20 +310,48 @@ template clas // ******************************** protected: + // overload of abstract index virtual methods + virtual void _build(const DataType &data, const size_t num_points_to_load, const IndexWriteParameters ¶meters, + TagVector &tags) override; + + virtual std::pair _search(const DataType &query, const size_t K, const uint32_t L, + std::any &indices, float *distances = nullptr) override; + virtual std::pair _search_with_filters(const DataType &query, + const std::string &filter_label_raw, const size_t K, + const uint32_t L, std::any &indices, + float *distances) override; + + virtual int _insert_point(const DataType &data_point, const TagType tag) override; + + virtual int _lazy_delete(const TagType &tag) override; + + virtual void _lazy_delete(TagVector &tags, TagVector &failed_tags) override; + + virtual void _get_active_tags(TagRobinSet &active_tags) override; + + virtual void _set_start_points_at_random(DataType radius, uint32_t random_seed = 0) override; + + virtual int _get_vector_by_tag(TagType &tag, DataType &vec) override; + + virtual void _search_with_optimized_layout(const DataType &query, size_t K, size_t L, uint32_t *indices) override; + + virtual size_t _search_with_tags(const DataType &query, const uint64_t K, const uint32_t L, const TagType &tags, + float *distances, DataVector &res_vectors) override; + // No copy/assign. Index(const Index &) = delete; Index &operator=(const Index &) = delete; // Use after _data and _nd have been populated // Acquire exclusive _update_lock before calling - void build_with_data_populated(Parameters ¶meters, const std::vector &tags); + void build_with_data_populated(const IndexWriteParameters ¶meters, const std::vector &tags); // generates 1 frozen point that will never be deleted from the graph // This is not visible to the user void generate_frozen_point(); // determines navigating node of the graph by calculating medoid of datafopt - unsigned calculate_entry_point(); + uint32_t calculate_entry_point(); void parse_label_file(const std::string &label_file, size_t &num_pts_labels); @@ -343,44 +361,47 @@ template clas std::unordered_map load_label_map(const std::string &map_file); - // Returns the locations of start point and frozen points suitable for use with iterate_to_fixed_point. - std::vector get_init_ids(); + // Returns the locations of start point and frozen points suitable for use + // with iterate_to_fixed_point. + std::vector get_init_ids(); - std::pair iterate_to_fixed_point(const T *node_coords, const unsigned Lindex, - const std::vector &init_ids, + std::pair iterate_to_fixed_point(const T *node_coords, const uint32_t Lindex, + const std::vector &init_ids, InMemQueryScratch *scratch, bool use_filter, const std::vector &filters, bool search_invocation); - void search_for_point_and_prune(int location, _u32 Lindex, std::vector &pruned_list, - InMemQueryScratch *scratch, bool use_filter = false, _u32 filteredLindex = 0); + void search_for_point_and_prune(int location, uint32_t Lindex, std::vector &pruned_list, + InMemQueryScratch *scratch, bool use_filter = false, + uint32_t filteredLindex = 0); - void prune_neighbors(const unsigned location, std::vector &pool, std::vector &pruned_list, + void prune_neighbors(const uint32_t location, std::vector &pool, std::vector &pruned_list, InMemQueryScratch *scratch); - void prune_neighbors(const unsigned location, std::vector &pool, const _u32 range, - const _u32 max_candidate_size, const float alpha, std::vector &pruned_list, + void prune_neighbors(const uint32_t location, std::vector &pool, const uint32_t range, + const uint32_t max_candidate_size, const float alpha, std::vector &pruned_list, InMemQueryScratch *scratch); // Prunes candidates in @pool to a shorter list @result // @pool must be sorted before calling - void occlude_list(const unsigned location, std::vector &pool, const float alpha, const unsigned degree, - const unsigned maxc, std::vector &result, InMemQueryScratch *scratch, - const tsl::robin_set *const delete_set_ptr = nullptr); + void occlude_list(const uint32_t location, std::vector &pool, const float alpha, const uint32_t degree, + const uint32_t maxc, std::vector &result, InMemQueryScratch *scratch, + const tsl::robin_set *const delete_set_ptr = nullptr); // add reverse links from all the visited nodes to node n. - void inter_insert(unsigned n, std::vector &pruned_list, const _u32 range, InMemQueryScratch *scratch); + void inter_insert(uint32_t n, std::vector &pruned_list, const uint32_t range, + InMemQueryScratch *scratch); - void inter_insert(unsigned n, std::vector &pruned_list, InMemQueryScratch *scratch); + void inter_insert(uint32_t n, std::vector &pruned_list, InMemQueryScratch *scratch); // Acquire exclusive _update_lock before calling - void link(Parameters ¶meters); + void link(const IndexWriteParameters ¶meters); // Acquire exclusive _tag_lock and _delete_lock before calling int reserve_location(); // Acquire exclusive _tag_lock before calling size_t release_location(int location); - size_t release_locations(const tsl::robin_set &locations); + size_t release_locations(const tsl::robin_set &locations); // Resize the index when no slots are left for insertion. // Acquire exclusive _update_lock and _tag_lock before calling. @@ -397,18 +418,18 @@ template clas // Remove deleted nodes from adjacency list of node loc // Replace removed neighbors with second order neighbors. // Also acquires _locks[i] for i = loc and out-neighbors of loc. - void process_delete(const tsl::robin_set &old_delete_set, size_t loc, const unsigned range, - const unsigned maxc, const float alpha, InMemQueryScratch *scratch); + void process_delete(const tsl::robin_set &old_delete_set, size_t loc, const uint32_t range, + const uint32_t maxc, const float alpha, InMemQueryScratch *scratch); void initialize_query_scratch(uint32_t num_threads, uint32_t search_l, uint32_t indexing_l, uint32_t r, uint32_t maxc, size_t dim, size_t bitmask_size = 0); // Do not call without acquiring appropriate locks // call public member functions save and load to invoke these. - DISKANN_DLLEXPORT _u64 save_graph(std::string filename); - DISKANN_DLLEXPORT _u64 save_data(std::string filename); - DISKANN_DLLEXPORT _u64 save_tags(std::string filename); - DISKANN_DLLEXPORT _u64 save_delete_list(const std::string &filename); + DISKANN_DLLEXPORT size_t save_graph(std::string filename); + DISKANN_DLLEXPORT size_t save_data(std::string filename); + DISKANN_DLLEXPORT size_t save_tags(std::string filename); + DISKANN_DLLEXPORT size_t save_delete_list(const std::string &filename); #ifdef EXEC_ENV_OLS DISKANN_DLLEXPORT size_t load_graph(AlignedFileReader &reader, size_t expected_num_points); DISKANN_DLLEXPORT size_t load_data(AlignedFileReader &reader); @@ -424,35 +445,37 @@ template clas private: // Distance functions Metric _dist_metric = diskann::L2; - Distance *_distance = nullptr; + std::shared_ptr> _distance; // Data - T *_data = nullptr; + std::unique_ptr> _data_store; char *_opt_graph = nullptr; // Graph related data structures - std::vector> _final_graph; + std::vector> _final_graph; + T *_data = nullptr; // coordinates of all base points // Dimensions size_t _dim = 0; - size_t _aligned_dim = 0; 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 - // Number of points which are used as initial candidates when iterating to - // closest point(s). These are not visible externally and won't be returned - // by search. DiskANN forces at least 1 frozen point for dynamic index. - // The frozen points have consecutive locations. See also _start below. + + // _num_frozen_pts is the number of points which are used as initial + // candidates when iterating to closest point(s). These are not visible + // externally and won't be returned by search. At least 1 frozen point is + // needed for a dynamic index. The frozen points have consecutive locations. + // See also _start below. size_t _num_frozen_pts = 0; size_t _max_range_of_loaded_graph = 0; size_t _node_size; size_t _data_len; size_t _neighbor_len; - unsigned _max_observed_degree = 0; + uint32_t _max_observed_degree = 0; // Start point of the search. When _num_frozen_pts is greater than zero, // this is the location of the first frozen point. Otherwise, this is a // location of one of the points in index. - unsigned _start = 0; + uint32_t _start = 0; bool _has_built = false; bool _saturate_graph = false; @@ -460,6 +483,7 @@ template clas bool _dynamic_index = false; bool _enable_tags = false; bool _normalize_vecs = false; // Using normalied L2 for cosine. + bool _deletes_enabled = false; // Filter Support @@ -467,8 +491,8 @@ template clas std::vector> _pts_to_labels; tsl::robin_set _labels; std::string _labels_file; - std::unordered_map _label_to_medoid_id; - std::unordered_map<_u32, _u32> _medoid_counts; + std::unordered_map _label_to_medoid_id; + std::unordered_map _medoid_counts; bool _use_universal_label = false; LabelT _universal_label = 0; uint32_t _filterIndexingQueueSize; @@ -487,7 +511,7 @@ template clas bool _pq_dist = false; bool _use_opq = false; size_t _num_pq_chunks = 0; - _u8 *_pq_data = nullptr; + uint8_t *_pq_data = nullptr; bool _pq_generated = false; FixedChunkPQTable _pq_table; @@ -497,18 +521,18 @@ template clas // lazy_delete removes entry from _location_to_tag and _tag_to_location. If // _location_to_tag does not resolve a location, infer that it was deleted. - tsl::sparse_map _tag_to_location; - natural_number_map _location_to_tag; + tsl::sparse_map _tag_to_location; + natural_number_map _location_to_tag; // _empty_slots has unallocated slots and those freed by consolidate_delete. // _delete_set has locations marked deleted by lazy_delete. Will not be // immediately available for insert. consolidate_delete will release these // slots to _empty_slots. - natural_number_set _empty_slots; - std::unique_ptr> _delete_set; + natural_number_set _empty_slots; + std::unique_ptr> _delete_set; bool _data_compacted = true; // true if data has been compacted - bool _is_saved = false; // Gopal. Checking if the index is already saved. + bool _is_saved = false; // Checking if the index is already saved. bool _conc_consolidate = false; // use _lock while searching // Acquire locks in the order below when acquiring multiple locks diff --git a/include/index_build_params.h b/include/index_build_params.h new file mode 100644 index 000000000..ff68c5001 --- /dev/null +++ b/include/index_build_params.h @@ -0,0 +1,72 @@ +#include "common_includes.h" +#include "parameters.h" + +namespace diskann +{ +struct IndexBuildParams +{ + public: + diskann::IndexWriteParameters index_write_params; + std::string save_path_prefix; + std::string label_file; + std::string universal_label; + uint32_t filter_threshold = 0; + + private: + IndexBuildParams(const IndexWriteParameters &index_write_params, const std::string &save_path_prefix, + const std::string &label_file, const std::string &universal_label, uint32_t filter_threshold) + : index_write_params(index_write_params), save_path_prefix(save_path_prefix), label_file(label_file), + universal_label(universal_label), filter_threshold(filter_threshold) + { + } + + friend class IndexBuildParamsBuilder; +}; +class IndexBuildParamsBuilder +{ + public: + IndexBuildParamsBuilder(const diskann::IndexWriteParameters ¶s) : _index_write_params(paras){}; + + IndexBuildParamsBuilder &with_save_path_prefix(const std::string &save_path_prefix) + { + if (save_path_prefix.empty() || save_path_prefix == "") + throw ANNException("Error: save_path_prefix can't be empty", -1); + this->_save_path_prefix = save_path_prefix; + return *this; + } + + IndexBuildParamsBuilder &with_label_file(const std::string &label_file) + { + this->_label_file = label_file; + return *this; + } + + IndexBuildParamsBuilder &with_universal_label(const std::string &univeral_label) + { + this->_universal_label = univeral_label; + return *this; + } + + IndexBuildParamsBuilder &with_filter_threshold(const std::uint32_t &filter_threshold) + { + this->_filter_threshold = filter_threshold; + return *this; + } + + IndexBuildParams build() + { + return IndexBuildParams(_index_write_params, _save_path_prefix, _label_file, _universal_label, + _filter_threshold); + } + + IndexBuildParamsBuilder(const IndexBuildParamsBuilder &) = delete; + IndexBuildParamsBuilder &operator=(const IndexBuildParamsBuilder &) = delete; + + private: + diskann::IndexWriteParameters _index_write_params; + std::string _save_path_prefix; + std::string _label_file; + std::string _universal_label; + uint32_t _filter_threshold = 0; +}; +} // namespace diskann diff --git a/include/index_config.h b/include/index_config.h new file mode 100644 index 000000000..b291c744d --- /dev/null +++ b/include/index_config.h @@ -0,0 +1,224 @@ +#include "common_includes.h" +#include "parameters.h" + +namespace diskann +{ +enum DataStoreStrategy +{ + MEMORY +}; + +enum GraphStoreStrategy +{ +}; +struct IndexConfig +{ + DataStoreStrategy data_strategy; + GraphStoreStrategy graph_strategy; + + Metric metric; + size_t dimension; + size_t max_points; + + bool dynamic_index; + bool enable_tags; + bool pq_dist_build; + bool concurrent_consolidate; + bool use_opq; + + size_t num_pq_chunks; + size_t num_frozen_pts; + + std::string label_type; + std::string tag_type; + std::string data_type; + + std::shared_ptr index_write_params; + + uint32_t search_threads; + uint32_t initial_search_list_size; + + private: + IndexConfig(DataStoreStrategy data_strategy, GraphStoreStrategy graph_strategy, Metric metric, size_t dimension, + size_t max_points, size_t num_pq_chunks, size_t num_frozen_points, bool dynamic_index, bool enable_tags, + bool pq_dist_build, bool concurrent_consolidate, bool use_opq, const std::string &data_type, + const std::string &tag_type, const std::string &label_type, + std::shared_ptr index_write_params, uint32_t search_threads, + uint32_t initial_search_list_size) + : data_strategy(data_strategy), graph_strategy(graph_strategy), metric(metric), dimension(dimension), + max_points(max_points), dynamic_index(dynamic_index), enable_tags(enable_tags), pq_dist_build(pq_dist_build), + concurrent_consolidate(concurrent_consolidate), use_opq(use_opq), num_pq_chunks(num_pq_chunks), + num_frozen_pts(num_frozen_points), label_type(label_type), tag_type(tag_type), data_type(data_type), + index_write_params(index_write_params), search_threads(search_threads), + initial_search_list_size(initial_search_list_size) + { + } + + friend class IndexConfigBuilder; +}; + +class IndexConfigBuilder +{ + public: + IndexConfigBuilder() + { + } + + IndexConfigBuilder &with_metric(Metric m) + { + this->_metric = m; + return *this; + } + + IndexConfigBuilder &with_graph_load_store_strategy(GraphStoreStrategy graph_strategy) + { + this->_graph_strategy = graph_strategy; + return *this; + } + + IndexConfigBuilder &with_data_load_store_strategy(DataStoreStrategy data_strategy) + { + this->_data_strategy = data_strategy; + return *this; + } + + IndexConfigBuilder &with_dimension(size_t dimension) + { + this->_dimension = dimension; + return *this; + } + + IndexConfigBuilder &with_max_points(size_t max_points) + { + this->_max_points = max_points; + return *this; + } + + IndexConfigBuilder &is_dynamic_index(bool dynamic_index) + { + this->_dynamic_index = dynamic_index; + return *this; + } + + IndexConfigBuilder &is_enable_tags(bool enable_tags) + { + this->_enable_tags = enable_tags; + return *this; + } + + IndexConfigBuilder &is_pq_dist_build(bool pq_dist_build) + { + this->_pq_dist_build = pq_dist_build; + return *this; + } + + IndexConfigBuilder &is_concurrent_consolidate(bool concurrent_consolidate) + { + this->_concurrent_consolidate = concurrent_consolidate; + return *this; + } + + IndexConfigBuilder &is_use_opq(bool use_opq) + { + this->_use_opq = use_opq; + return *this; + } + + IndexConfigBuilder &with_num_pq_chunks(size_t num_pq_chunks) + { + this->_num_pq_chunks = num_pq_chunks; + return *this; + } + + IndexConfigBuilder &with_num_frozen_pts(size_t num_frozen_pts) + { + this->_num_frozen_pts = num_frozen_pts; + return *this; + } + + IndexConfigBuilder &with_label_type(const std::string &label_type) + { + this->_label_type = label_type; + return *this; + } + + IndexConfigBuilder &with_tag_type(const std::string &tag_type) + { + this->_tag_type = tag_type; + return *this; + } + + IndexConfigBuilder &with_data_type(const std::string &data_type) + { + this->_data_type = data_type; + return *this; + } + + IndexConfigBuilder &with_index_write_params(IndexWriteParameters &index_write_params) + { + this->_index_write_params = std::make_shared(index_write_params); + return *this; + } + + IndexConfigBuilder &with_search_threads(uint32_t search_threads) + { + this->_search_threads = search_threads; + return *this; + } + + IndexConfigBuilder &with_initial_search_list_size(uint32_t search_list_size) + { + this->_initial_search_list_size = search_list_size; + return *this; + } + + IndexConfig build() + { + if (_data_type == "" || _data_type.empty()) + throw ANNException("Error: data_type can not be empty", -1); + + if (_dynamic_index && _index_write_params != nullptr) + { + if (_search_threads == 0) + throw ANNException("Error: please pass search_threads for building dynamic index.", -1); + + if (_initial_search_list_size == 0) + throw ANNException("Error: please pass initial_search_list_size for building dynamic index.", -1); + } + + return IndexConfig(_data_strategy, _graph_strategy, _metric, _dimension, _max_points, _num_pq_chunks, + _num_frozen_pts, _dynamic_index, _enable_tags, _pq_dist_build, _concurrent_consolidate, + _use_opq, _data_type, _tag_type, _label_type, _index_write_params, _search_threads, + _initial_search_list_size); + } + + IndexConfigBuilder(const IndexConfigBuilder &) = delete; + IndexConfigBuilder &operator=(const IndexConfigBuilder &) = delete; + + private: + DataStoreStrategy _data_strategy; + GraphStoreStrategy _graph_strategy; + + Metric _metric; + size_t _dimension; + size_t _max_points; + + bool _dynamic_index = false; + bool _enable_tags = false; + bool _pq_dist_build = false; + bool _concurrent_consolidate = false; + bool _use_opq = false; + + size_t _num_pq_chunks = 0; + size_t _num_frozen_pts = 0; + + std::string _label_type = "uint32"; + std::string _tag_type = "uint32"; + std::string _data_type; + + std::shared_ptr _index_write_params; + + uint32_t _search_threads; + uint32_t _initial_search_list_size; +}; +} // namespace diskann diff --git a/include/index_factory.h b/include/index_factory.h new file mode 100644 index 000000000..3d1eb7992 --- /dev/null +++ b/include/index_factory.h @@ -0,0 +1,37 @@ +#include "index.h" +#include "abstract_graph_store.h" +#include "in_mem_graph_store.h" + +namespace diskann +{ +class IndexFactory +{ + public: + DISKANN_DLLEXPORT explicit IndexFactory(const IndexConfig &config); + DISKANN_DLLEXPORT std::unique_ptr create_instance(); + + private: + void check_config(); + + template + std::unique_ptr> construct_datastore(DataStoreStrategy stratagy, size_t num_points, + size_t dimension); + + std::unique_ptr construct_graphstore(GraphStoreStrategy stratagy, size_t size); + + template + std::unique_ptr create_instance(); + + std::unique_ptr create_instance(const std::string &data_type, const std::string &tag_type, + const std::string &label_type); + + template + std::unique_ptr create_instance(const std::string &tag_type, const std::string &label_type); + + template + std::unique_ptr create_instance(const std::string &label_type); + + std::unique_ptr _config; +}; + +} // namespace diskann diff --git a/include/logger.h b/include/logger.h index 28a9f619c..0b17807db 100644 --- a/include/logger.h +++ b/include/logger.h @@ -6,10 +6,21 @@ #include #include "windows_customizations.h" +#ifdef EXEC_ENV_OLS +#ifndef ENABLE_CUSTOM_LOGGER +#define ENABLE_CUSTOM_LOGGER +#endif // !ENABLE_CUSTOM_LOGGER +#endif // EXEC_ENV_OLS + namespace diskann { +#ifdef ENABLE_CUSTOM_LOGGER DISKANN_DLLEXPORT extern std::basic_ostream cout; DISKANN_DLLEXPORT extern std::basic_ostream cerr; +#else +using std::cerr; +using std::cout; +#endif enum class DISKANN_DLLEXPORT LogLevel { @@ -18,7 +29,7 @@ enum class DISKANN_DLLEXPORT LogLevel LL_Count }; -#ifdef EXEC_ENV_OLS +#ifdef ENABLE_CUSTOM_LOGGER DISKANN_DLLEXPORT void SetCustomLogger(std::function logger); #endif } // namespace diskann diff --git a/include/logger_impl.h b/include/logger_impl.h index af6108c06..03c65e0ce 100644 --- a/include/logger_impl.h +++ b/include/logger_impl.h @@ -11,6 +11,7 @@ namespace diskann { +#ifdef ENABLE_CUSTOM_LOGGER class ANNStreamBuf : public std::basic_streambuf { public: @@ -36,30 +37,25 @@ class ANNStreamBuf : public std::basic_streambuf int flush(); void logImpl(char *str, int numchars); -// Why the two buffer-sizes? If we are running normally, we are basically -// interacting with a character output system, so we short-circuit the -// output process by keeping an empty buffer and writing each character -// to stdout/stderr. But if we are running in OLS, we have to take all -// the text that is written to diskann::cout/diskann:cerr, consolidate it -// and push it out in one-shot, because the OLS infra does not give us -// character based output. Therefore, we use a larger buffer that is large -// enough to store the longest message, and continuously add characters -// to it. When the calling code outputs a std::endl or std::flush, sync() -// will be called and will output a log level, component name, and the text -// that has been collected. (sync() is also called if the buffer is full, so -// overflows/missing text are not a concern). -// This implies calling code _must_ either print std::endl or std::flush -// to ensure that the message is written immediately. -#ifdef EXEC_ENV_OLS + // Why the two buffer-sizes? If we are running normally, we are basically + // interacting with a character output system, so we short-circuit the + // output process by keeping an empty buffer and writing each character + // to stdout/stderr. But if we are running in OLS, we have to take all + // the text that is written to diskann::cout/diskann:cerr, consolidate it + // and push it out in one-shot, because the OLS infra does not give us + // character based output. Therefore, we use a larger buffer that is large + // enough to store the longest message, and continuously add characters + // to it. When the calling code outputs a std::endl or std::flush, sync() + // will be called and will output a log level, component name, and the text + // that has been collected. (sync() is also called if the buffer is full, so + // overflows/missing text are not a concern). + // This implies calling code _must_ either print std::endl or std::flush + // to ensure that the message is written immediately. + static const int BUFFER_SIZE = 1024; -#else - // Allocating an arbitrarily small buffer here because the overflow() and - // other function implementations push the BUFFER_SIZE chars into the - // buffer before flushing to fwrite. - static const int BUFFER_SIZE = 4; -#endif ANNStreamBuf(const ANNStreamBuf &); ANNStreamBuf &operator=(const ANNStreamBuf &); }; +#endif } // namespace diskann diff --git a/include/natural_number_map.h b/include/natural_number_map.h index dd4b09e41..820ac3fdf 100644 --- a/include/natural_number_map.h +++ b/include/natural_number_map.h @@ -7,7 +7,7 @@ #include #include -#include "boost_dynamic_bitset_fwd.h" +#include namespace diskann { @@ -35,9 +35,9 @@ template class natural_number_map struct position { size_t _key; - // The number of keys that were enumerated when iterating through the map - // so far. Used to early-terminate enumeration when ithere - // are no more entries in the map. + // The number of keys that were enumerated when iterating through the + // map so far. Used to early-terminate enumeration when ithere are no + // more entries in the map. size_t _keys_already_enumerated; // Returns whether it's valid to access the element at this position in diff --git a/include/parameters.h b/include/parameters.h index e24681e7b..81a336da7 100644 --- a/include/parameters.h +++ b/include/parameters.h @@ -6,91 +6,112 @@ #include #include +#include "omp.h" +#include "defaults.h" + namespace diskann { -class Parameters +class IndexWriteParameters + { public: - Parameters() + const uint32_t search_list_size; // L + const uint32_t max_degree; // R + const bool saturate_graph; + const uint32_t max_occlusion_size; // C + const float alpha; + const uint32_t num_threads; + const uint32_t filter_list_size; // Lf + const uint32_t num_frozen_points; + + private: + IndexWriteParameters(const uint32_t search_list_size, const uint32_t max_degree, const bool saturate_graph, + const uint32_t max_occlusion_size, const float alpha, const uint32_t num_threads, + const uint32_t filter_list_size, const uint32_t num_frozen_points) + : search_list_size(search_list_size), max_degree(max_degree), saturate_graph(saturate_graph), + max_occlusion_size(max_occlusion_size), alpha(alpha), num_threads(num_threads), + filter_list_size(filter_list_size), num_frozen_points(num_frozen_points) { - int *p = new int; - *p = 0; - params["num_threads"] = p; } - template inline void Set(const std::string &name, const ParamType &value) + friend class IndexWriteParametersBuilder; +}; + +class IndexWriteParametersBuilder +{ + /** + * Fluent builder pattern to keep track of the 7 non-default properties + * and their order. The basic ctor was getting unwieldy. + */ + public: + IndexWriteParametersBuilder(const uint32_t search_list_size, // L + const uint32_t max_degree // R + ) + : _search_list_size(search_list_size), _max_degree(max_degree) { - // ParamType *ptr = (ParamType *) malloc(sizeof(ParamType)); - if (params.find(name) != params.end()) - { - free(params[name]); - } - ParamType *ptr = new ParamType; - *ptr = value; - params[name] = (void *)ptr; } - template inline ParamType Get(const std::string &name) const + IndexWriteParametersBuilder &with_max_occlusion_size(const uint32_t max_occlusion_size) { - auto item = params.find(name); - if (item == params.end()) - { - throw std::invalid_argument("Invalid parameter name."); - } - else - { - // return ConvertStrToValue(item->second); - if (item->second == nullptr) - { - throw std::invalid_argument(std::string("Parameter ") + name + " has value null."); - } - else - { - return *(static_cast(item->second)); - } - } + _max_occlusion_size = max_occlusion_size; + return *this; } - template inline ParamType Get(const std::string &name, const ParamType &default_value) const + IndexWriteParametersBuilder &with_saturate_graph(const bool saturate_graph) { - try - { - return Get(name); - } - catch (std::invalid_argument e) - { - return default_value; - } + _saturate_graph = saturate_graph; + return *this; } - ~Parameters() + IndexWriteParametersBuilder &with_alpha(const float alpha) { - for (auto iter = params.begin(); iter != params.end(); iter++) - { - if (iter->second != nullptr) - free(iter->second); - // delete iter->second; - } + _alpha = alpha; + return *this; } - private: - std::unordered_map params; + IndexWriteParametersBuilder &with_num_threads(const uint32_t num_threads) + { + _num_threads = num_threads == 0 ? omp_get_num_threads() : num_threads; + return *this; + } - Parameters(const Parameters &); - Parameters &operator=(const Parameters &); + IndexWriteParametersBuilder &with_filter_list_size(const uint32_t filter_list_size) + { + _filter_list_size = filter_list_size == 0 ? _search_list_size : filter_list_size; + return *this; + } + + IndexWriteParametersBuilder &with_num_frozen_points(const uint32_t num_frozen_points) + { + _num_frozen_points = num_frozen_points; + return *this; + } - template inline ParamType ConvertStrToValue(const std::string &str) const + IndexWriteParameters build() const { - std::stringstream sstream(str); - ParamType value; - if (!(sstream >> value) || !sstream.eof()) - { - std::stringstream err; - err << "Failed to convert value '" << str << "' to type: " << typeid(value).name(); - throw std::runtime_error(err.str()); - } - return value; + return IndexWriteParameters(_search_list_size, _max_degree, _saturate_graph, _max_occlusion_size, _alpha, + _num_threads, _filter_list_size, _num_frozen_points); } + + IndexWriteParametersBuilder(const IndexWriteParameters &wp) + : _search_list_size(wp.search_list_size), _max_degree(wp.max_degree), + _max_occlusion_size(wp.max_occlusion_size), _saturate_graph(wp.saturate_graph), _alpha(wp.alpha), + _filter_list_size(wp.filter_list_size), _num_frozen_points(wp.num_frozen_points) + { + } + IndexWriteParametersBuilder(const IndexWriteParametersBuilder &) = delete; + IndexWriteParametersBuilder &operator=(const IndexWriteParametersBuilder &) = delete; + + private: + uint32_t _search_list_size{}; + uint32_t _max_degree{}; + uint32_t _max_occlusion_size{defaults::MAX_OCCLUSION_SIZE}; + bool _saturate_graph{defaults::SATURATE_GRAPH}; + float _alpha{defaults::ALPHA}; + uint32_t _num_threads{defaults::NUM_THREADS}; + uint32_t _filter_list_size{defaults::FILTER_LIST_SIZE}; + uint32_t _num_frozen_points{defaults::NUM_FROZEN_POINTS_STATIC}; }; + } // namespace diskann diff --git a/include/pq.h b/include/pq.h index 9f6e50ee4..acfa1b30a 100644 --- a/include/pq.h +++ b/include/pq.h @@ -10,17 +10,17 @@ #define MAX_OPQ_ITERS 20 #define NUM_KMEANS_REPS_PQ 12 #define MAX_PQ_TRAINING_SET_SIZE 256000 -#define MAX_PQ_CHUNKS 256 +#define MAX_PQ_CHUNKS 512 namespace diskann { class FixedChunkPQTable { float *tables = nullptr; // pq_tables = float array of size [256 * ndims] - _u64 ndims = 0; // ndims = true dimension of vectors - _u64 n_chunks = 0; + uint64_t ndims = 0; // ndims = true dimension of vectors + uint64_t n_chunks = 0; bool use_rotation = false; - _u32 *chunk_offsets = nullptr; + uint32_t *chunk_offsets = nullptr; float *centroid = nullptr; float *tables_tr = nullptr; // same as pq_tables, but col-major float *rotmat_tr = nullptr; @@ -36,19 +36,19 @@ class FixedChunkPQTable void load_pq_centroid_bin(const char *pq_table_file, size_t num_chunks); #endif - _u32 get_num_chunks(); + uint32_t get_num_chunks(); void preprocess_query(float *query_vec); // assumes pre-processed query void populate_chunk_distances(const float *query_vec, float *dist_vec); - float l2_distance(const float *query_vec, _u8 *base_vec); + float l2_distance(const float *query_vec, uint8_t *base_vec); - float inner_product(const float *query_vec, _u8 *base_vec); + float inner_product(const float *query_vec, uint8_t *base_vec); // assumes no rotation is involved - void inflate_vector(_u8 *base_vec, float *out_vec); + void inflate_vector(uint8_t *base_vec, float *out_vec); void populate_chunk_inner_products(const float *query_vec, float *dist_vec); }; @@ -57,16 +57,17 @@ template struct PQScratch { float *aligned_pqtable_dist_scratch = nullptr; // MUST BE AT LEAST [256 * NCHUNKS] float *aligned_dist_scratch = nullptr; // MUST BE AT LEAST diskann MAX_DEGREE - _u8 *aligned_pq_coord_scratch = nullptr; // MUST BE AT LEAST [N_CHUNKS * MAX_DEGREE] + uint8_t *aligned_pq_coord_scratch = nullptr; // MUST BE AT LEAST [N_CHUNKS * MAX_DEGREE] float *rotated_query = nullptr; float *aligned_query_float = nullptr; PQScratch(size_t graph_degree, size_t aligned_dim) { diskann::alloc_aligned((void **)&aligned_pq_coord_scratch, - (_u64)graph_degree * (_u64)MAX_PQ_CHUNKS * sizeof(_u8), 256); - diskann::alloc_aligned((void **)&aligned_pqtable_dist_scratch, 256 * (_u64)MAX_PQ_CHUNKS * sizeof(float), 256); - diskann::alloc_aligned((void **)&aligned_dist_scratch, (_u64)graph_degree * sizeof(float), 256); + (size_t)graph_degree * (size_t)MAX_PQ_CHUNKS * sizeof(uint8_t), 256); + diskann::alloc_aligned((void **)&aligned_pqtable_dist_scratch, 256 * (size_t)MAX_PQ_CHUNKS * sizeof(float), + 256); + diskann::alloc_aligned((void **)&aligned_dist_scratch, (size_t)graph_degree * sizeof(float), 256); diskann::alloc_aligned((void **)&aligned_query_float, aligned_dim * sizeof(float), 8 * sizeof(float)); diskann::alloc_aligned((void **)&rotated_query, aligned_dim * sizeof(float), 8 * sizeof(float)); @@ -86,15 +87,16 @@ template struct PQScratch } }; -void aggregate_coords(const std::vector &ids, const _u8 *all_coords, const _u64 ndims, _u8 *out); +void aggregate_coords(const std::vector &ids, const uint8_t *all_coords, const uint64_t ndims, uint8_t *out); -void pq_dist_lookup(const _u8 *pq_ids, const _u64 n_pts, const _u64 pq_nchunks, const float *pq_dists, +void pq_dist_lookup(const uint8_t *pq_ids, const size_t n_pts, const size_t pq_nchunks, const float *pq_dists, std::vector &dists_out); // Need to replace calls to these with calls to vector& based functions above -void aggregate_coords(const unsigned *ids, const _u64 n_ids, const _u8 *all_coords, const _u64 ndims, _u8 *out); +void aggregate_coords(const unsigned *ids, const uint64_t n_ids, const uint8_t *all_coords, const uint64_t ndims, + uint8_t *out); -void pq_dist_lookup(const _u8 *pq_ids, const _u64 n_pts, const _u64 pq_nchunks, const float *pq_dists, +void pq_dist_lookup(const uint8_t *pq_ids, const size_t n_pts, const size_t pq_nchunks, const float *pq_dists, float *dists_out); DISKANN_DLLEXPORT int generate_pq_pivots(const float *const train_data, size_t num_train, unsigned dim, @@ -106,17 +108,18 @@ DISKANN_DLLEXPORT int generate_opq_pivots(const float *train_data, size_t num_tr bool make_zero_mean = false); 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, +int generate_pq_data_from_pivots(const std::string &data_file, unsigned num_centers, unsigned num_pq_chunks, + const std::string &pq_pivots_path, const std::string &pq_compressed_vectors_path, bool use_opq = false); template -void generate_disk_quantized_data(const std::string data_file_to_use, const std::string disk_pq_pivots_path, - const std::string disk_pq_compressed_vectors_path, +void generate_disk_quantized_data(const std::string &data_file_to_use, const std::string &disk_pq_pivots_path, + const std::string &disk_pq_compressed_vectors_path, const diskann::Metric compareMetric, const double p_val, size_t &disk_pq_dims); template -void generate_quantized_data(const std::string data_file_to_use, const std::string pq_pivots_path, - const std::string pq_compressed_vectors_path, const diskann::Metric compareMetric, - const double p_val, const size_t num_pq_chunks, const bool use_opq); +void generate_quantized_data(const std::string &data_file_to_use, const std::string &pq_pivots_path, + const std::string &pq_compressed_vectors_path, const diskann::Metric compareMetric, + const double p_val, const uint64_t num_pq_chunks, const bool use_opq, + const std::string &codebook_prefix = ""); } // namespace diskann diff --git a/include/pq_flash_index.h b/include/pq_flash_index.h index 807658837..ba76cd47e 100644 --- a/include/pq_flash_index.h +++ b/include/pq_flash_index.h @@ -38,55 +38,60 @@ template class PQFlashIndex #ifdef EXEC_ENV_OLS DISKANN_DLLEXPORT int load_from_separate_paths(diskann::MemoryMappedFiles &files, uint32_t num_threads, const char *index_filepath, const char *pivots_filepath, - const char *compressed_filepath); + const char *compressed_filepath, const char* labels_filepath, const char* labels_to_medoids_filepath, + const char* labels_map_filepath, const char* unv_label_filepath); #else DISKANN_DLLEXPORT int load_from_separate_paths(uint32_t num_threads, const char *index_filepath, - const char *pivots_filepath, const char *compressed_filepath); + const char *pivots_filepath, const char *compressed_filepath, + const char *labels_filepath, const char *labels_to_medoids_filepath, + const char *labels_map_filepath, const char* unv_label_filepath); #endif DISKANN_DLLEXPORT void load_cache_list(std::vector &node_list); #ifdef EXEC_ENV_OLS DISKANN_DLLEXPORT void 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, + uint64_t l_search, uint64_t beamwidth, + uint64_t num_nodes_to_cache, uint32_t nthreads, std::vector &node_list); #else - DISKANN_DLLEXPORT void generate_cache_list_from_sample_queries(std::string sample_bin, _u64 l_search, - _u64 beamwidth, _u64 num_nodes_to_cache, + DISKANN_DLLEXPORT void generate_cache_list_from_sample_queries(std::string sample_bin, uint64_t l_search, + uint64_t beamwidth, uint64_t num_nodes_to_cache, uint32_t num_threads, std::vector &node_list); #endif - DISKANN_DLLEXPORT void cache_bfs_levels(_u64 num_nodes_to_cache, std::vector &node_list, + DISKANN_DLLEXPORT void cache_bfs_levels(uint64_t num_nodes_to_cache, std::vector &node_list, const bool shuffle = false); - 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, + DISKANN_DLLEXPORT void cached_beam_search(const T *query, const uint64_t k_search, const uint64_t l_search, + uint64_t *res_ids, float *res_dists, const uint64_t beam_width, const bool use_reorder_data = false, QueryStats *stats = nullptr); - 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, const bool use_filter, - const LabelT &filter_label, const bool use_reorder_data = false, - QueryStats *stats = nullptr); - - 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, const _u32 io_limit, + DISKANN_DLLEXPORT void cached_beam_search(const T *query, const uint64_t k_search, const uint64_t l_search, + uint64_t *res_ids, float *res_dists, const uint64_t beam_width, + const bool use_filter, const LabelT &filter_label, const bool use_reorder_data = false, QueryStats *stats = nullptr); - 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, const bool use_filter, - const LabelT &filter_label, const _u32 io_limit, - const bool use_reorder_data = false, QueryStats *stats = nullptr); + DISKANN_DLLEXPORT void cached_beam_search(const T *query, const uint64_t k_search, const uint64_t l_search, + uint64_t *res_ids, float *res_dists, const uint64_t beam_width, + const uint32_t io_limit, const bool use_reorder_data = false, + QueryStats *stats = nullptr); + + DISKANN_DLLEXPORT void cached_beam_search(const T *query, const uint64_t k_search, const uint64_t l_search, + uint64_t *res_ids, float *res_dists, const uint64_t beam_width, + const bool use_filter, const LabelT &filter_label, + const uint32_t io_limit, const bool use_reorder_data = false, + QueryStats *stats = nullptr); DISKANN_DLLEXPORT LabelT get_converted_label(const std::string &filter_label); - DISKANN_DLLEXPORT _u32 range_search(const T *query1, const double range, const _u64 min_l_search, - const _u64 max_l_search, std::vector<_u64> &indices, - std::vector &distances, const _u64 min_beam_width, - QueryStats *stats = nullptr); + DISKANN_DLLEXPORT uint32_t range_search(const T *query1, const double range, const uint64_t min_l_search, + const uint64_t max_l_search, std::vector &indices, + std::vector &distances, const uint64_t min_beam_width, + QueryStats *stats = nullptr); - DISKANN_DLLEXPORT _u64 get_data_dim(); + DISKANN_DLLEXPORT uint64_t get_data_dim(); std::shared_ptr &reader; @@ -94,16 +99,18 @@ template class PQFlashIndex protected: DISKANN_DLLEXPORT void use_medoids_data_as_centroids(); - DISKANN_DLLEXPORT void setup_thread_data(_u64 nthreads, _u64 visited_reserve = 4096); + DISKANN_DLLEXPORT void setup_thread_data(uint64_t nthreads, uint64_t visited_reserve = 4096); DISKANN_DLLEXPORT void set_universal_label(const LabelT &label); private: - DISKANN_DLLEXPORT inline bool point_has_label(_u32 point_id, _u32 label_id); + DISKANN_DLLEXPORT inline bool point_has_label(uint32_t point_id, uint32_t label_id); std::unordered_map load_label_map(const std::string &map_file); DISKANN_DLLEXPORT void parse_label_file(const std::string &map_file, size_t &num_pts_labels); - DISKANN_DLLEXPORT void get_label_file_metadata(std::string map_file, _u32 &num_pts, _u32 &num_total_labels); + DISKANN_DLLEXPORT void get_label_file_metadata(std::string map_file, uint32_t &num_pts, uint32_t &num_total_labels); DISKANN_DLLEXPORT inline int32_t get_filter_number(const LabelT &filter_label); + DISKANN_DLLEXPORT void generate_random_labels(std::vector &labels, const uint32_t num_labels, + const uint32_t nthreads); // index info // nhood of node `i` is in sector: [i / nnodes_per_sector] @@ -111,10 +118,10 @@ template class PQFlashIndex // nnbrs of node `i`: *(unsigned*) (buf) // nbrs of node `i`: ((unsigned*)buf) + 1 - _u64 max_node_len = 0, nnodes_per_sector = 0, max_degree = 0; + uint64_t max_node_len = 0, nnodes_per_sector = 0, max_degree = 0; // Data used for searching with re-order vectors - _u64 ndims_reorder_vecs = 0, reorder_data_start_sector = 0, nvecs_per_sector = 0; + uint64_t ndims_reorder_vecs = 0, reorder_data_start_sector = 0, nvecs_per_sector = 0; diskann::Metric metric = diskann::Metric::L2; @@ -123,25 +130,25 @@ template class PQFlashIndex float max_base_norm = 0.0f; // data info - _u64 num_points = 0; - _u64 num_frozen_points = 0; - _u64 frozen_location = 0; - _u64 data_dim = 0; - _u64 disk_data_dim = 0; // will be different from data_dim only if we use - // PQ for disk data (very large dimensionality) - _u64 aligned_dim = 0; - _u64 disk_bytes_per_point = 0; + uint64_t num_points = 0; + uint64_t num_frozen_points = 0; + uint64_t frozen_location = 0; + uint64_t data_dim = 0; + uint64_t disk_data_dim = 0; // will be different from data_dim only if we use + // PQ for disk data (very large dimensionality) + uint64_t aligned_dim = 0; + uint64_t disk_bytes_per_point = 0; std::string disk_index_file; - std::vector> node_visit_counter; + std::vector> node_visit_counter; // PQ data // n_chunks = # of chunks ndims is split into - // data: _u8 * n_chunks + // data: char * n_chunks // chunk_size = chunk size of each dimension chunk // pq_tables = float* [[2^8 * [chunk_size]] * n_chunks] - _u8 *data = nullptr; - _u64 n_chunks; + uint8_t *data = nullptr; + uint64_t n_chunks; FixedChunkPQTable pq_table; // distance comparator @@ -150,7 +157,7 @@ template class PQFlashIndex // for very large datasets: we use PQ even for the disk resident index bool use_disk_index_pq = false; - _u64 disk_pq_n_chunks = 0; + uint64_t disk_pq_n_chunks = 0; FixedChunkPQTable disk_pq_table; // medoid/start info @@ -167,32 +174,32 @@ template class PQFlashIndex // nhood_cache unsigned *nhood_cache_buf = nullptr; - tsl::robin_map<_u32, std::pair<_u32, _u32 *>> nhood_cache; + tsl::robin_map> nhood_cache; // coord_cache T *coord_cache_buf = nullptr; - tsl::robin_map<_u32, T *> coord_cache; + tsl::robin_map coord_cache; // thread-specific scratch ConcurrentQueue *> thread_data; - _u64 max_nthreads; + uint64_t max_nthreads; bool load_flag = false; bool count_visited_nodes = false; bool reorder_data_exists = false; - _u64 reoreder_data_offset = 0; + uint64_t reoreder_data_offset = 0; // filter support - _u32 *_pts_to_label_offsets = nullptr; - _u32 *_pts_to_labels = nullptr; + uint32_t *_pts_to_label_offsets = nullptr; + uint32_t *_pts_to_labels = nullptr; tsl::robin_set _labels; - std::unordered_map _filter_to_medoid_id; + std::unordered_map> _filter_to_medoid_ids; bool _use_universal_label = false; - _u32 _universal_filter_num = 0; + uint32_t _universal_filter_num; std::vector _filter_list; - tsl::robin_set<_u32> _dummy_pts; - tsl::robin_set<_u32> _has_dummy_pts; - tsl::robin_map<_u32, _u32> _dummy_to_real_map; - tsl::robin_map<_u32, std::vector<_u32>> _real_to_dummy_map; + tsl::robin_set _dummy_pts; + tsl::robin_set _has_dummy_pts; + tsl::robin_map _dummy_to_real_map; + tsl::robin_map> _real_to_dummy_map; std::unordered_map _label_map; #ifdef EXEC_ENV_OLS diff --git a/include/program_options_utils.hpp b/include/program_options_utils.hpp new file mode 100644 index 000000000..71077b7b2 --- /dev/null +++ b/include/program_options_utils.hpp @@ -0,0 +1,79 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include + +namespace program_options_utils +{ +const std::string make_program_description(const char *executable_name, const char *description) +{ + return std::string("\n") + .append(description) + .append("\n\n") + .append("Usage: ") + .append(executable_name) + .append(" [OPTIONS]"); +} + +// Required parameters +const char *DATA_TYPE_DESCRIPTION = "data type, one of {int8, uint8, float} - float is single precision (32 bit)"; +const char *DISTANCE_FUNCTION_DESCRIPTION = + "distance function {l2, mips, fast_l2, cosine}. 'fast l2' and 'mips' only support data_type float"; +const char *INDEX_PATH_PREFIX_DESCRIPTION = "Path prefix to the index, e.g. '/mnt/data/my_ann_index'"; +const char *RESULT_PATH_DESCRIPTION = + "Path prefix for saving results of the queries, e.g. '/mnt/data/query_file_X.bin'"; +const char *QUERY_FILE_DESCRIPTION = "Query file in binary format, e.g. '/mnt/data/query_file_X.bin'"; +const char *NUMBER_OF_RESULTS_DESCRIPTION = "Number of neighbors to be returned (K in the DiskANN white paper)"; +const char *SEARCH_LIST_DESCRIPTION = + "Size of search list to use. This value is the number of neighbor/distance pairs to keep in memory at the same " + "time while performing a query. This can also be described as the size of the working set at query time. This " + "must be greater than or equal to the number of results/neighbors to return (K in the white paper). Corresponds " + "to L in the DiskANN white paper."; +const char *INPUT_DATA_PATH = "Input data file in bin format. This is the file you want to build the index over. " + "File format: Shape of the vector followed by the vector of embeddings as binary data."; + +// Optional parameters +const char *FILTER_LABEL_DESCRIPTION = + "Filter to use when running a query. 'filter_label' and 'query_filters_file' are mutually exclusive."; +const char *FILTERS_FILE_DESCRIPTION = + "Filter file for Queries for Filtered Search. File format is text with one filter per line. File must " + "have exactly one filter OR the same number of filters as there are queries in the 'query_file'."; +const char *LABEL_TYPE_DESCRIPTION = + "Storage type of Labels {uint/uint32, ushort/uint16}, default value is uint which will consume memory 4 bytes per " + "filter. 'uint' is an alias for 'uint32' and 'ushort' is an alias for 'uint16'."; +const char *GROUND_TRUTH_FILE_DESCRIPTION = + "ground truth file for the queryset"; // what's the format, what's the requirements? does it need to include an + // entry for every item or just a small subset? I have so many questions about + // this file +const char *NUMBER_THREADS_DESCRIPTION = "Number of threads used for building index. Defaults to number of logical " + "processor cores on your this machine returned by omp_get_num_procs()"; +const char *FAIL_IF_RECALL_BELOW = + "Value between 0 (inclusive) and 100 (exclusive) indicating the recall tolerance percentage threshold before " + "program fails with a non-zero exit code. The default value of 0 means that the program will complete " + "successfully with any recall value. A non-zero value indicates the floor for acceptable recall values. If the " + "calculated recall value is below this threshold then the program will write out the results but return a non-zero " + "exit code as a signal that the recall was not acceptable."; // does it continue running or die immediately? Will I + // still get my results even if the return code is -1? + +const char *NUMBER_OF_NODES_TO_CACHE = "Number of BFS nodes around medoid(s) to cache. Default value: 0"; +const char *BEAMWIDTH = "Beamwidth for search. Set 0 to optimize internally. Default value: 2"; +const char *MAX_BUILD_DEGREE = "Maximum graph degree"; +const char *GRAPH_BUILD_COMPLEXITY = + "Size of the search working set during build time. This is the numer of neighbor/distance pairs to keep in memory " + "while building the index. Higher value results in a higher quality graph but it will take more time to build the " + "graph."; +const char *GRAPH_BUILD_ALPHA = "Alpha controls density and diameter of graph, set 1 for sparse graph, 1.2 or 1.4 for " + "denser graphs with lower diameter"; +const char *BUIlD_GRAPH_PQ_BYTES = "Number of PQ bytes to build the index; 0 for full precision build"; +const char *USE_OPQ = "Use Optimized Product Quantization (OPQ)."; +const char *LABEL_FILE = "Input label file in txt format for Filtered Index build. The file should contain comma " + "separated filters for each node with each line corresponding to a graph node"; +const char *UNIVERSAL_LABEL = + "Universal label, Use only in conjunction with label file for filtered index build. If a " + "graph node has all the labels against it, we can assign a special universal filter to the " + "point instead of comma separated filters for that point"; +const char *FILTERED_LBUILD = "Build complexity for filtered points, higher value results in better graphs"; + +} // namespace program_options_utils diff --git a/include/scratch.h b/include/scratch.h index 7a2cbb861..dd84c7f2f 100644 --- a/include/scratch.h +++ b/include/scratch.h @@ -6,7 +6,7 @@ #include #include "boost_dynamic_bitset_fwd.h" -//#include "boost/dynamic_bitset.hpp" +// #include "boost/dynamic_bitset.hpp" #include "tsl/robin_set.h" #include "tsl/robin_map.h" #include "tsl/sparse_map.h" @@ -21,12 +21,12 @@ // SSD Index related limits #define MAX_GRAPH_DEGREE 512 -#define MAX_N_CMPS 16384 -#define SECTOR_LEN (_u64)4096 +#define SECTOR_LEN (size_t)4096 #define MAX_N_SECTOR_READS 128 namespace diskann { + // // Scratch space for in-memory index based search // @@ -34,8 +34,9 @@ template class InMemQueryScratch { public: ~InMemQueryScratch(); - InMemQueryScratch(uint32_t search_l, uint32_t indexing_l, uint32_t r, uint32_t maxc, size_t dim, - bool init_pq_scratch = false, size_t bitmask_size = 0); + // REFACTOR TODO: move all parameters to a new class. + InMemQueryScratch(uint32_t search_l, uint32_t indexing_l, uint32_t r, uint32_t maxc, size_t dim, size_t aligned_dim, + size_t alignment_factor, bool init_pq_scratch = false, size_t bitmask_size = 0); void resize_for_new_L(uint32_t new_search_l); void clear(); @@ -71,7 +72,7 @@ template class InMemQueryScratch { return _occlude_factor; } - inline tsl::robin_set &inserted_into_pool_rs() + inline tsl::robin_set &inserted_into_pool_rs() { return _inserted_into_pool_rs; } @@ -79,7 +80,7 @@ template class InMemQueryScratch { return *_inserted_into_pool_bs; } - inline std::vector &id_scratch() + inline std::vector &id_scratch() { return _id_scratch; } @@ -87,7 +88,7 @@ template class InMemQueryScratch { return _dist_scratch; } - inline tsl::robin_set &expanded_nodes_set() + inline tsl::robin_set &expanded_nodes_set() { return _expanded_nodes_set; } @@ -95,7 +96,7 @@ template class InMemQueryScratch { return _expanded_nghrs_vec; } - inline std::vector &occlude_list_output() + inline std::vector &occlude_list_output() { return _occlude_list_output; } @@ -129,7 +130,7 @@ template class InMemQueryScratch std::vector _occlude_factor; // Capacity initialized to 20L - tsl::robin_set _inserted_into_pool_rs; + tsl::robin_set _inserted_into_pool_rs; // Use a pointer here to allow for forward declaration of dynamic_bitset // in public headers to avoid making boost a dependency for clients @@ -137,17 +138,16 @@ template class InMemQueryScratch boost::dynamic_bitset<> *_inserted_into_pool_bs; // _id_scratch.size() must be > R*GRAPH_SLACK_FACTOR for iterate_to_fp - std::vector _id_scratch; + std::vector _id_scratch; // _dist_scratch must be > R*GRAPH_SLACK_FACTOR for iterate_to_fp // _dist_scratch should be at least the size of id_scratch std::vector _dist_scratch; // Buffers used in process delete, capacity increases as needed - tsl::robin_set _expanded_nodes_set; + tsl::robin_set _expanded_nodes_set; std::vector _expanded_nghrs_vec; - std::vector _occlude_list_output; - + std::vector _occlude_list_output; // bitmask buffer in searching time std::vector _query_label_bitmask; }; @@ -159,17 +159,16 @@ template class InMemQueryScratch template class SSDQueryScratch { public: - T *coord_scratch = nullptr; // MUST BE AT LEAST [MAX_N_CMPS * data_dim] - _u64 coord_idx = 0; // index of next [data_dim] scratch to use + T *coord_scratch = nullptr; // MUST BE AT LEAST [sizeof(T) * data_dim] char *sector_scratch = nullptr; // MUST BE AT LEAST [MAX_N_SECTOR_READS * SECTOR_LEN] - _u64 sector_idx = 0; // index of next [SECTOR_LEN] scratch to use + size_t sector_idx = 0; // index of next [SECTOR_LEN] scratch to use T *aligned_query_T = nullptr; PQScratch *_pq_scratch; - tsl::robin_set<_u64> visited; + tsl::robin_set visited; NeighborPriorityQueue retset; std::vector full_retset; diff --git a/include/timer.h b/include/timer.h index 963927bd7..5ddc3c857 100644 --- a/include/timer.h +++ b/include/timer.h @@ -27,7 +27,7 @@ class Timer float elapsed_seconds() const { - return (float)elapsed() / 1000000.0; + return (float)elapsed() / 1000000.0f; } std::string elapsed_seconds_for_step(const std::string &step) const diff --git a/include/types.h b/include/types.h new file mode 100644 index 000000000..b95848869 --- /dev/null +++ b/include/types.h @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include +#include +#include +#include "any_wrappers.h" + +namespace diskann +{ +typedef uint32_t location_t; + +using DataType = std::any; +using TagType = std::any; +using LabelType = std::any; +using TagVector = AnyWrapper::AnyVector; +using DataVector = AnyWrapper::AnyVector; +using TagRobinSet = AnyWrapper::AnyRobinSet; +} // namespace diskann diff --git a/include/utils.h b/include/utils.h index a011aca1e..f81f6a68b 100644 --- a/include/utils.h +++ b/include/utils.h @@ -2,6 +2,7 @@ // Licensed under the MIT license. #pragma once + #include #include "common_includes.h" @@ -25,16 +26,14 @@ typedef int FileHandle; #include "ann_exception.h" #include "windows_customizations.h" #include "tsl/robin_set.h" +#include "types.h" +#include #ifdef EXEC_ENV_OLS #include "content_buf.h" #include "memory_mapped_files.h" #endif -#include -#include -#include - // taken from // https://github.com/Microsoft/BLAS-on-flash/blob/master/include/utils.h // round up X to the nearest multiple of Y @@ -53,7 +52,10 @@ typedef int FileHandle; 4096 // all metadata of individual sub-component files is written in first // 4KB for unified files -#define BUFFER_SIZE_FOR_CACHED_IO (_u64)1024 * (_u64)1048576 +#define BUFFER_SIZE_FOR_CACHED_IO (size_t)1024 * (size_t)1048576 + +#define PBSTR "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" +#define PBWIDTH 60 inline bool file_exists(const std::string &name, bool dirCheck = false) { @@ -63,8 +65,8 @@ inline bool file_exists(const std::string &name, bool dirCheck = false) val = stat(name.c_str(), &buffer); #else // It is the 21st century but Windows API still thinks in 32-bit terms. - // Turns out calling stat() on a file > 4GB results in errno = 132 (OVERFLOW). - // How silly is this!? So calling _stat64() + // Turns out calling stat() on a file > 4GB results in errno = 132 + // (OVERFLOW). How silly is this!? So calling _stat64() struct _stat64 buffer; val = _stat64(name.c_str(), &buffer); #endif @@ -92,15 +94,6 @@ inline bool file_exists(const std::string &name, bool dirCheck = false) } } -typedef uint64_t _u64; -typedef int64_t _s64; -typedef uint32_t _u32; -typedef int32_t _s32; -typedef uint16_t _u16; -typedef int16_t _s16; -typedef uint8_t _u8; -typedef int8_t _s8; - inline void open_file_to_write(std::ofstream &writer, const std::string &filename) { writer.exceptions(std::ofstream::failbit | std::ofstream::badbit); @@ -113,21 +106,22 @@ inline void open_file_to_write(std::ofstream &writer, const std::string &filenam { char buff[1024]; #ifdef _WINDOWS - strerror_s(buff, 1024, errno); + auto ret = std::to_string(strerror_s(buff, 1024, errno)); #else - strerror_r(errno, buff, 1024); + auto ret = std::string(strerror_r(errno, buff, 1024)); #endif - diskann::cerr << std::string("Failed to open file") + filename + " for write because " + buff << std::endl; - throw diskann::ANNException(std::string("Failed to open file ") + filename + " for write because: " + buff, -1); + auto message = std::string("Failed to open file") + filename + " for write because " + buff + ", ret=" + ret; + diskann::cerr << message << std::endl; + throw diskann::ANNException(message, -1); } } -inline _u64 get_file_size(const std::string &fname) +inline size_t 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(); + size_t end_pos = reader.tellg(); reader.close(); return end_pos; } @@ -146,7 +140,8 @@ inline int delete_file(const std::string &fileName) if (rc != 0) { diskann::cerr << "Could not delete file: " << fileName - << " even though it exists. This might indicate a permissions issue. " + << " even though it exists. This might indicate a permissions " + "issue. " "If you see this message, please contact the diskann team." << std::endl; } @@ -160,9 +155,9 @@ inline int delete_file(const std::string &fileName) inline void convert_labels_string_to_int(const std::string &inFileName, const std::string &outFileName, const std::string &mapFileName, const std::string &unv_label, - _u32& unv_label_id) + uint32_t& unv_label_id) { - std::unordered_map string_int_map; + std::unordered_map string_int_map; std::ofstream label_writer(outFileName); std::ifstream label_reader(inFileName); //if (unv_label != "") @@ -171,14 +166,14 @@ inline void convert_labels_string_to_int(const std::string &inFileName, const st while (std::getline(label_reader, line)) { std::istringstream new_iss(line); - std::vector<_u32> lbls; + std::vector lbls; while (getline(new_iss, token, ',')) { token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); if (string_int_map.find(token) == string_int_map.end()) { - _u32 nextId = (_u32)string_int_map.size() + 1; + uint32_t nextId = (uint32_t)string_int_map.size() + 1; string_int_map[token] = nextId; } lbls.push_back(string_int_map[token]); @@ -349,6 +344,26 @@ inline void get_bin_metadata(const std::string &bin_file, size_t &nrows, size_t } // get_bin_metadata functions END +#ifndef EXEC_ENV_OLS +inline size_t get_graph_num_frozen_points(const std::string &graph_file) +{ + size_t expected_file_size; + uint32_t max_observed_degree, start; + size_t file_frozen_pts; + + std::ifstream in; + in.exceptions(std::ios::badbit | std::ios::failbit); + + in.open(graph_file, std::ios::binary); + in.read((char *)&expected_file_size, sizeof(size_t)); + in.read((char *)&max_observed_degree, sizeof(uint32_t)); + in.read((char *)&start, sizeof(uint32_t)); + in.read((char *)&file_frozen_pts, sizeof(size_t)); + + return file_frozen_pts; +} +#endif + template inline std::string getValues(T *data, size_t num) { std::stringstream stream; @@ -448,7 +463,7 @@ inline void wait_for_keystroke() 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; + size_t read_blk_size = 64 * 1024 * 1024; cached_ifstream reader(bin_file, read_blk_size); diskann::cout << "Reading truthset file " << bin_file.c_str() << " ..." << std::endl; size_t actual_file_size = reader.get_file_size(); @@ -496,9 +511,9 @@ inline void load_truthset(const std::string &bin_file, uint32_t *&ids, float *&d } inline void prune_truthset_for_range(const std::string &bin_file, float range, - std::vector> &groundtruth, size_t &npts) + std::vector> &groundtruth, size_t &npts) { - _u64 read_blk_size = 64 * 1024 * 1024; + size_t read_blk_size = 64 * 1024 * 1024; cached_ifstream reader(bin_file, read_blk_size); diskann::cout << "Reading truthset file " << bin_file.c_str() << "... " << std::endl; size_t actual_file_size = reader.get_file_size(); @@ -507,8 +522,8 @@ inline void prune_truthset_for_range(const std::string &bin_file, float range, reader.read((char *)&npts_i32, sizeof(int)); reader.read((char *)&dim_i32, sizeof(int)); npts = (unsigned)npts_i32; - _u64 dim = (unsigned)dim_i32; - _u32 *ids; + uint64_t dim = (unsigned)dim_i32; + uint32_t *ids; float *dists; diskann::cout << "Metadata: #pts = " << npts << ", #dims = " << dim << "... " << std::endl; @@ -542,10 +557,10 @@ inline void prune_truthset_for_range(const std::string &bin_file, float range, float min_dist = std::numeric_limits::max(); float max_dist = 0; groundtruth.resize(npts); - for (_u32 i = 0; i < npts; i++) + for (uint32_t i = 0; i < npts; i++) { groundtruth[i].clear(); - for (_u32 j = 0; j < dim; j++) + for (uint32_t j = 0; j < dim; j++) { if (dists[i * dim + j] <= range) { @@ -561,23 +576,24 @@ inline void prune_truthset_for_range(const std::string &bin_file, float range, delete[] dists; } -inline void load_range_truthset(const std::string &bin_file, std::vector> &groundtruth, _u64 >_num) +inline void load_range_truthset(const std::string &bin_file, std::vector> &groundtruth, + uint64_t >_num) { - _u64 read_blk_size = 64 * 1024 * 1024; + size_t read_blk_size = 64 * 1024 * 1024; cached_ifstream reader(bin_file, read_blk_size); diskann::cout << "Reading truthset file " << bin_file.c_str() << "... " << std::flush; size_t actual_file_size = reader.get_file_size(); - int npts_u32, total_u32; - reader.read((char *)&npts_u32, sizeof(int)); - reader.read((char *)&total_u32, sizeof(int)); + int nptsuint32_t, totaluint32_t; + reader.read((char *)&nptsuint32_t, sizeof(int)); + reader.read((char *)&totaluint32_t, sizeof(int)); - gt_num = (_u64)npts_u32; - _u64 total_res = (_u64)total_u32; + gt_num = (uint64_t)nptsuint32_t; + uint64_t total_res = (uint64_t)totaluint32_t; diskann::cout << "Metadata: #pts = " << gt_num << ", #total_results = " << total_res << "..." << std::endl; - size_t expected_file_size = 2 * sizeof(_u32) + gt_num * sizeof(_u32) + total_res * sizeof(_u32); + size_t expected_file_size = 2 * sizeof(uint32_t) + gt_num * sizeof(uint32_t) + total_res * sizeof(uint32_t); if (actual_file_size != expected_file_size) { @@ -589,26 +605,26 @@ inline void load_range_truthset(const std::string &bin_file, std::vector gt_count(gt_num); + std::vector gt_count(gt_num); - reader.read((char *)gt_count.data(), sizeof(_u32) * gt_num); + reader.read((char *)gt_count.data(), sizeof(uint32_t) * gt_num); - std::vector<_u32> gt_stats(gt_count); + std::vector gt_stats(gt_count); std::sort(gt_stats.begin(), gt_stats.end()); std::cout << "GT count percentiles:" << std::endl; - for (_u32 p = 0; p < 100; p += 5) + for (uint32_t p = 0; p < 100; p += 5) std::cout << "percentile " << p << ": " << gt_stats[static_cast(std::floor((p / 100.0) * gt_num))] << std::endl; std::cout << "percentile 100" << ": " << gt_stats[gt_num - 1] << std::endl; - for (_u32 i = 0; i < gt_num; i++) + for (uint32_t i = 0; i < gt_num; i++) { groundtruth[i].clear(); groundtruth[i].resize(gt_count[i]); if (gt_count[i] != 0) - reader.read((char *)groundtruth[i].data(), sizeof(_u32) * gt_count[i]); + reader.read((char *)groundtruth[i].data(), sizeof(uint32_t) * gt_count[i]); } } @@ -645,8 +661,8 @@ DISKANN_DLLEXPORT double calculate_recall(unsigned num_queries, unsigned *gold_s const tsl::robin_set &active_tags); DISKANN_DLLEXPORT double calculate_range_search_recall(unsigned num_queries, - std::vector> &groundtruth, - std::vector> &our_results); + std::vector> &groundtruth, + std::vector> &our_results); template inline void load_bin(const std::string &bin_file, std::unique_ptr &data, size_t &npts, size_t &dim, @@ -669,18 +685,19 @@ inline void open_file_to_write(std::ofstream &writer, const std::string &filenam { char buff[1024]; #ifdef _WINDOWS - strerror_s(buff, 1024, errno); + auto ret = std::to_string(strerror_s(buff, 1024, errno)); #else - strerror_r(errno, buff, 1024); + auto ret = std::string(strerror_r(errno, buff, 1024)); #endif - std::string error_message = std::string("Failed to open file") + filename + " for write because " + buff; + std::string error_message = + std::string("Failed to open file") + filename + " for write because " + buff + ", ret=" + ret; diskann::cerr << error_message << std::endl; throw diskann::ANNException(error_message, -1); } } template -inline uint64_t save_bin(const std::string &filename, T *data, size_t npts, size_t ndims, size_t offset = 0) +inline size_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); @@ -699,6 +716,16 @@ inline uint64_t save_bin(const std::string &filename, T *data, size_t npts, size diskann::cout << "Finished writing bin." << std::endl; return bytes_written; } + +inline void print_progress(double percentage) +{ + int val = (int)(percentage * 100); + int lpad = (int)(percentage * PBWIDTH); + int rpad = PBWIDTH - lpad; + printf("\r%3d%% [%.*s%*s]", val, lpad, PBSTR, rpad, ""); + fflush(stdout); +} + // load_aligned_bin functions START template @@ -784,7 +811,7 @@ template void convert_types(const InType *srcmat, OutType *destmat, size_t npts, size_t dim) { #pragma omp parallel for schedule(static, 65536) - for (int64_t i = 0; i < (_s64)npts; i++) + for (int64_t i = 0; i < (int64_t)npts; i++) { for (uint64_t j = 0; j < dim; j++) { @@ -806,17 +833,17 @@ template float prepare_base_for_inner_products(const std::string in std::cout << "Pre-processing base file by adding extra coordinate" << std::endl; std::ifstream in_reader(in_file.c_str(), std::ios::binary); std::ofstream out_writer(out_file.c_str(), std::ios::binary); - _u64 npts, in_dims, out_dims; + uint64_t npts, in_dims, out_dims; float max_norm = 0; - _u32 npts32, dims32; + uint32_t npts32, dims32; in_reader.read((char *)&npts32, sizeof(uint32_t)); in_reader.read((char *)&dims32, sizeof(uint32_t)); npts = npts32; in_dims = dims32; out_dims = in_dims + 1; - _u32 outdims32 = (_u32)out_dims; + uint32_t outdims32 = (uint32_t)out_dims; out_writer.write((char *)&npts32, sizeof(uint32_t)); out_writer.write((char *)&outdims32, sizeof(uint32_t)); @@ -827,19 +854,19 @@ template float prepare_base_for_inner_products(const std::string in std::unique_ptr out_block_data = std::make_unique(block_size * out_dims); std::memset(out_block_data.get(), 0, sizeof(float) * block_size * out_dims); - _u64 num_blocks = DIV_ROUND_UP(npts, block_size); + uint64_t num_blocks = DIV_ROUND_UP(npts, block_size); std::vector norms(npts, 0); - for (_u64 b = 0; b < num_blocks; b++) + for (uint64_t b = 0; b < num_blocks; b++) { - _u64 start_id = b * block_size; - _u64 end_id = (b + 1) * block_size < npts ? (b + 1) * block_size : npts; - _u64 block_pts = end_id - start_id; + uint64_t start_id = b * block_size; + uint64_t end_id = (b + 1) * block_size < npts ? (b + 1) * block_size : npts; + uint64_t block_pts = end_id - start_id; in_reader.read((char *)in_block_data.get(), block_pts * in_dims * sizeof(T)); - for (_u64 p = 0; p < block_pts; p++) + for (uint64_t p = 0; p < block_pts; p++) { - for (_u64 j = 0; j < in_dims; j++) + for (uint64_t j = 0; j < in_dims; j++) { norms[start_id + p] += in_block_data[p * in_dims + j] * in_block_data[p * in_dims + j]; } @@ -849,16 +876,16 @@ template float prepare_base_for_inner_products(const std::string in max_norm = std::sqrt(max_norm); - in_reader.seekg(2 * sizeof(_u32), std::ios::beg); - for (_u64 b = 0; b < num_blocks; b++) + in_reader.seekg(2 * sizeof(uint32_t), std::ios::beg); + for (uint64_t b = 0; b < num_blocks; b++) { - _u64 start_id = b * block_size; - _u64 end_id = (b + 1) * block_size < npts ? (b + 1) * block_size : npts; - _u64 block_pts = end_id - start_id; + uint64_t start_id = b * block_size; + uint64_t end_id = (b + 1) * block_size < npts ? (b + 1) * block_size : npts; + uint64_t block_pts = end_id - start_id; in_reader.read((char *)in_block_data.get(), block_pts * in_dims * sizeof(T)); - for (_u64 p = 0; p < block_pts; p++) + for (uint64_t p = 0; p < block_pts; p++) { - for (_u64 j = 0; j < in_dims; j++) + for (uint64_t j = 0; j < in_dims; j++) { out_block_data[p * out_dims + j] = in_block_data[p * in_dims + j] / max_norm; } @@ -883,7 +910,7 @@ template void save_Tvecs(const char *filename, T *data, size_t npts unsigned dims_u32 = (unsigned)ndims; // start writing - for (uint64_t i = 0; i < npts; i++) + for (size_t i = 0; i < npts; i++) { // write dims in u32 writer.write((char *)&dims_u32, sizeof(unsigned)); @@ -894,13 +921,13 @@ template void save_Tvecs(const char *filename, T *data, size_t npts } } 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) +inline size_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); + size_t 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)); @@ -958,7 +985,7 @@ inline void prefetch_vector_l2(const char *vec, size_t vecsize) } // NOTE: Implementation in utils.cpp. -void block_convert(std::ofstream &writr, std::ifstream &readr, float *read_buf, _u64 npts, _u64 ndims); +void block_convert(std::ofstream &writr, std::ifstream &readr, float *read_buf, uint64_t npts, uint64_t ndims); DISKANN_DLLEXPORT void normalize_data_file(const std::string &inFileName, const std::string &outFileName); @@ -1006,21 +1033,130 @@ inline bool validate_index_file_size(std::ifstream &in) return true; } -// This function is valid only for float data type. -template inline void normalize(T *arr, size_t dim) +template inline float get_norm(T *arr, const size_t dim) { float sum = 0.0f; for (uint32_t i = 0; i < dim; i++) { sum += arr[i] * arr[i]; } - sum = sqrt(sum); + return sqrt(sum); +} + +// This function is valid only for float data type. +template inline void normalize(T *arr, const size_t dim) +{ + float norm = get_norm(arr, dim); for (uint32_t i = 0; i < dim; i++) { - arr[i] = (T)(arr[i] / sum); + arr[i] = (T)(arr[i] / norm); } } +inline std::vector read_file_to_vector_of_strings(const std::string &filename, bool unique = false) +{ + std::vector result; + std::set elementSet; + if (filename != "") + { + std::ifstream file(filename); + if (file.fail()) + { + throw diskann::ANNException(std::string("Failed to open file ") + filename, -1); + } + std::string line; + while (std::getline(file, line)) + { + if (line.empty()) + { + break; + } + if (line.find(',') != std::string::npos) + { + std::cerr << "Every query must have exactly one filter" << std::endl; + exit(-1); + } + if (!line.empty() && (line.back() == '\r' || line.back() == '\n')) + { + line.erase(line.size() - 1); + } + if (!elementSet.count(line)) + { + result.push_back(line); + } + if (unique) + { + elementSet.insert(line); + } + } + file.close(); + } + else + { + throw diskann::ANNException(std::string("Failed to open file. filename can not be blank"), -1); + } + return result; +} + +inline void clean_up_artifacts(tsl::robin_set paths_to_clean, tsl::robin_set path_suffixes) +{ + try + { + for (const auto &path : paths_to_clean) + { + for (const auto &suffix : path_suffixes) + { + std::string curr_path_to_clean(path + "_" + suffix); + if (std::remove(curr_path_to_clean.c_str()) != 0) + diskann::cout << "Warning: Unable to remove file :" << curr_path_to_clean << std::endl; + } + } + diskann::cout << "Cleaned all artifacts" << std::endl; + } + catch (const std::exception &e) + { + diskann::cout << "Warning: Unable to clean all artifacts " << e.what() << std::endl; + } +} + +template inline const char *diskann_type_to_name() = delete; +template <> inline const char *diskann_type_to_name() +{ + return "float"; +} +template <> inline const char *diskann_type_to_name() +{ + return "uint8"; +} +template <> inline const char *diskann_type_to_name() +{ + return "int8"; +} +template <> inline const char *diskann_type_to_name() +{ + return "uint16"; +} +template <> inline const char *diskann_type_to_name() +{ + return "int16"; +} +template <> inline const char *diskann_type_to_name() +{ + return "uint32"; +} +template <> inline const char *diskann_type_to_name() +{ + return "int32"; +} +template <> inline const char *diskann_type_to_name() +{ + return "uint64"; +} +template <> inline const char *diskann_type_to_name() +{ + return "int64"; +} + #ifdef _WINDOWS #include #include diff --git a/pyproject.toml b/pyproject.toml index 107d56886..fb4349fab 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,39 +3,54 @@ requires = [ "setuptools>=59.6", "pybind11>=2.10.0", "cmake>=3.22", - "numpy>=1.21", + "numpy==1.25", # this is important to keep fixed. It also means anyone using something other than 1.25 won't be able to use this library "wheel", + "ninja" ] build-backend = "setuptools.build_meta" [project] name = "diskannpy" -version = "0.4.0" +version = "0.6.0" description = "DiskANN Python extension module" -# readme = "../README.md" -requires-python = ">=3.7" +readme = "python/README.md" +requires-python = ">=3.9" license = {text = "MIT License"} dependencies = [ - "numpy" + "numpy==1.25" ] authors = [ {name = "Harsha Vardhan Simhadri", email = "harshasi@microsoft.com"}, {name = "Dax Pryce", email = "daxpryce@microsoft.com"} ] +[project.optional-dependencies] +dev = ["black", "isort", "mypy"] + +[tool.setuptools] +package-dir = {"" = "python/src"} + +[tool.isort] +profile = "black" +multi_line_output = 3 + +[tool.mypy] +plugins = "numpy.typing.mypy_plugin" + [tool.cibuildwheel] -manylinux-x86_64-image = "manylinux_2_24" +manylinux-x86_64-image = "manylinux_2_28" +test-requires = ["scikit-learn~=1.2"] build-frontend = "build" -skip = "pp* *musllinux*" -test-command = "python -m unittest discover -s {package}/tests" - +skip = ["pp*", "*-win32", "*-manylinux_i686", "*-musllinux*"] +test-command = "python -m unittest discover {project}/python/tests" [tool.cibuildwheel.linux] -before-all = """\ - apt-get update && \ - apt-get -y upgrade && \ - apt-get install -y wget make cmake g++ libaio-dev libgoogle-perftools-dev libunwind-dev clang-format libboost-dev libboost-program-options-dev && \ - wget https://registrationcenter-download.intel.com/akdlm/irc_nas/18487/l_BaseKit_p_2022.1.2.146.sh && \ - sh l_BaseKit_p_2022.1.2.146.sh -a --components intel.oneapi.lin.mkl.devel --action install --eula accept -s --ignore-errors \ -""" +before-build = [ + "dnf makecache --refresh", + "dnf install -y epel-release", + "dnf config-manager -y --add-repo https://yum.repos.intel.com/mkl/setup/intel-mkl.repo", + "rpm --import https://yum.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB", + "dnf makecache --refresh -y", + "dnf install -y wget make cmake gcc-c++ libaio-devel gperftools-libs libunwind-devel clang-tools-extra boost-devel boost-program-options intel-mkl-2020.4-912" +] diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index d93d80422..d4faebf9b 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.18...3.22) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) if (PYTHON_EXECUTABLE) set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE}) @@ -26,14 +26,22 @@ execute_process(COMMAND ${Python3_EXECUTABLE} -c "import numpy; print(numpy.get_ # pybind11_add_module(diskannpy MODULE src/diskann_bindings.cpp) # the following is fairly synonymous with pybind11_add_module, but we need more target_link_libraries # see https://pybind11.readthedocs.io/en/latest/compiling.html#advanced-interface-library-targets for more details -add_library(diskannpy MODULE src/diskann_bindings.cpp) +add_library(_diskannpy MODULE + src/module.cpp + src/builder.cpp + src/dynamic_memory_index.cpp + src/static_memory_index.cpp + src/static_disk_index.cpp +) + +target_include_directories(_diskannpy AFTER PRIVATE include) if (MSVC) - target_compile_options(diskannpy PRIVATE /U_WINDLL) + target_compile_options(_diskannpy PRIVATE /U_WINDLL) endif() target_link_libraries( - diskannpy + _diskannpy PRIVATE pybind11::module pybind11::lto @@ -43,13 +51,13 @@ target_link_libraries( ${DISKANN_ASYNC_LIB} ) -pybind11_extension(diskannpy) +pybind11_extension(_diskannpy) if(NOT MSVC AND NOT ${CMAKE_BUILD_TYPE} MATCHES Debug|RelWithDebInfo) # Strip unnecessary sections of the binary on Linux/macOS - pybind11_strip(diskannpy) + pybind11_strip(_diskannpy) endif() -set_target_properties(diskannpy PROPERTIES CXX_VISIBILITY_PRESET "hidden" +set_target_properties(_diskannpy PROPERTIES CXX_VISIBILITY_PRESET "hidden" CUDA_VISIBILITY_PRESET "hidden") # generally, the VERSION_INFO flag is set by pyproject.toml, by way of setup.py. @@ -59,4 +67,4 @@ set_target_properties(diskannpy PROPERTIES CXX_VISIBILITY_PRESET "hidden" if(NOT VERSION_INFO) set(VERSION_INFO "0.0.0dev") endif() -target_compile_definitions(diskannpy PRIVATE VERSION_INFO="${VERSION_INFO}") +target_compile_definitions(_diskannpy PRIVATE VERSION_INFO="${VERSION_INFO}") diff --git a/python/README.md b/python/README.md new file mode 100644 index 000000000..1365fb422 --- /dev/null +++ b/python/README.md @@ -0,0 +1,55 @@ +# diskannpy + +[![DiskANN Paper](https://img.shields.io/badge/Paper-NeurIPS%3A_DiskANN-blue)](https://papers.nips.cc/paper/9527-rand-nsg-fast-accurate-billion-point-nearest-neighbor-search-on-a-single-node.pdf) +[![DiskANN Paper](https://img.shields.io/badge/Paper-Arxiv%3A_Fresh--DiskANN-blue)](https://arxiv.org/abs/2105.09613) +[![DiskANN Paper](https://img.shields.io/badge/Paper-Filtered--DiskANN-blue)](https://harsha-simhadri.org/pubs/Filtered-DiskANN23.pdf) +[![DiskANN Main](https://github.com/microsoft/DiskANN/actions/workflows/push-test.yml/badge.svg?branch=main)](https://github.com/microsoft/DiskANN/actions/workflows/push-test.yml) +[![PyPI version](https://img.shields.io/pypi/v/diskannpy.svg)](https://pypi.org/project/diskannpy/) +[![Downloads shield](https://pepy.tech/badge/diskannpy)](https://pepy.tech/project/diskannpy) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +## Installation +Packages published to PyPI will always be built using the latest numpy major.minor release (at this time, 1.25). + +Conda distributions for versions 1.19-1.25 will be completed as a future effort. In the meantime, feel free to +clone this repository and build it yourself. + +## Local Build Instructions +Please see the [Project README](https://github.com/microsoft/DiskANN/blob/main/README.md) for system dependencies and requirements. + +After ensuring you've followed the directions to build the project library and executables, you will be ready to also +build `diskannpy` with these additional instructions. + +### Changing Numpy Version +In the root folder of DiskANN, there is a file `pyproject.toml`. You will need to edit the version of numpy in both the +`[build-system.requires]` section, as well as the `[project.dependencies]` section. The version numbers must match. + +#### Linux +```bash +python3.11 -m venv venv # versions from python3.9 and up should work +source venv/bin/activate +pip install build +python -m build +``` + +#### Windows +```powershell +py -3.11 -m venv venv # versions from python3.9 and up should work +venv\Scripts\Activate.ps1 +pip install build +python -m build +``` + +The built wheel will be placed in the `dist` directory in your DiskANN root. Install it using `pip install dist/.whl` + +## Citations +Please cite this software in your work as: +``` +@misc{diskann-github, + author = {Simhadri, Harsha Vardhan and Krishnaswamy, Ravishankar and Srinivasa, Gopal and Subramanya, Suhas Jayaram and Antonijevic, Andrija and Pryce, Dax and Kaczynski, David and Williams, Shane and Gollapudi, Siddarth and Sivashankar, Varun and Karia, Neel and Singh, Aditi and Jaiswal, Shikhar and Mahapatro, Neelam and Adams, Philip and Tower, Bryan and Patel, Yash}}, + title = {{DiskANN: Graph-structured Indices for Scalable, Fast, Fresh and Filtered Approximate Nearest Neighbor Search}}, + url = {https://github.com/Microsoft/DiskANN}, + version = {0.6.0}, + year = {2023} +} +``` diff --git a/python/apps/cli/__main__.py b/python/apps/cli/__main__.py new file mode 100644 index 000000000..d2c999052 --- /dev/null +++ b/python/apps/cli/__main__.py @@ -0,0 +1,152 @@ +import diskannpy as dap +import numpy as np +import numpy.typing as npt + +import fire + +from contextlib import contextmanager +from time import perf_counter + +from typing import Tuple + + +def _basic_setup( + dtype: str, + query_vectors_file: str +) -> Tuple[dap.VectorDType, npt.NDArray[dap.VectorDType]]: + _dtype = dap.valid_dtype(dtype) + vectors_to_query = dap.vectors_from_binary(query_vectors_file, dtype=_dtype) + return _dtype, vectors_to_query + + +def dynamic( + dtype: str, + index_vectors_file: str, + query_vectors_file: str, + build_complexity: int, + graph_degree: int, + K: int, + search_complexity: int, + num_insert_threads: int, + num_search_threads: int, + gt_file: str = "", +): + _dtype, vectors_to_query = _basic_setup(dtype, query_vectors_file) + vectors_to_index = dap.vectors_from_binary(index_vectors_file, dtype=_dtype) + + npts, ndims = vectors_to_index.shape + index = dap.DynamicMemoryIndex( + "l2", _dtype, ndims, npts, build_complexity, graph_degree + ) + + tags = np.arange(1, npts+1, dtype=np.uintc) + timer = Timer() + + with timer.time("batch insert"): + index.batch_insert(vectors_to_index, tags, num_insert_threads) + + delete_tags = np.random.choice( + np.array(range(1, npts + 1, 1), dtype=np.uintc), + size=int(0.5 * npts), + replace=False + ) + with timer.time("mark deletion"): + for tag in delete_tags: + index.mark_deleted(tag) + + with timer.time("consolidation"): + index.consolidate_delete() + + deleted_data = vectors_to_index[delete_tags - 1, :] + + with timer.time("re-insertion"): + index.batch_insert(deleted_data, delete_tags, num_insert_threads) + + with timer.time("batch searched"): + tags, dists = index.batch_search(vectors_to_query, K, search_complexity, num_search_threads) + + # res_ids = tags - 1 + # if gt_file != "": + # recall = utils.calculate_recall_from_gt_file(K, res_ids, gt_file) + # print(f"recall@{K} is {recall}") + +def static( + dtype: str, + index_directory: str, + index_vectors_file: str, + query_vectors_file: str, + build_complexity: int, + graph_degree: int, + K: int, + search_complexity: int, + num_threads: int, + gt_file: str = "", + index_prefix: str = "ann" +): + _dtype, vectors_to_query = _basic_setup(dtype, query_vectors_file) + timer = Timer() + with timer.time("build static index"): + # build index + dap.build_memory_index( + data=index_vectors_file, + metric="l2", + vector_dtype=_dtype, + index_directory=index_directory, + complexity=build_complexity, + graph_degree=graph_degree, + num_threads=num_threads, + index_prefix=index_prefix, + alpha=1.2, + use_pq_build=False, + num_pq_bytes=8, + use_opq=False, + ) + + with timer.time("load static index"): + # ready search object + index = dap.StaticMemoryIndex( + metric="l2", + vector_dtype=_dtype, + data_path=index_vectors_file, + index_directory=index_directory, + num_threads=num_threads, # this can be different at search time if you would like + initial_search_complexity=search_complexity, + index_prefix=index_prefix + ) + + ids, dists = index.batch_search(vectors_to_query, K, search_complexity, num_threads) + + # if gt_file != "": + # recall = utils.calculate_recall_from_gt_file(K, ids, gt_file) + # print(f"recall@{K} is {recall}") + +def dynamic_clustered(): + pass + +def generate_clusters(): + pass + + +class Timer: + def __init__(self): + self._start = -1 + + @contextmanager + def time(self, message: str): + start = perf_counter() + if self._start == -1: + self._start = start + yield + now = perf_counter() + print(f"Operation {message} completed in {(now - start):.3f}s, total: {(now - self._start):.3f}s") + + + + +if __name__ == "__main__": + fire.Fire({ + "in-mem-dynamic": dynamic, + "in-mem-static": static, + "in-mem-dynamic-clustered": dynamic_clustered, + "generate-clusters": generate_clusters + }, name="cli") diff --git a/python/apps/cluster.py b/python/apps/cluster.py new file mode 100644 index 000000000..27a34bb70 --- /dev/null +++ b/python/apps/cluster.py @@ -0,0 +1,28 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import argparse +import utils + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + prog="cluster", description="kmeans cluster points in a file" + ) + + parser.add_argument("-d", "--data_type", required=True) + parser.add_argument("-i", "--indexdata_file", required=True) + parser.add_argument("-k", "--num_clusters", type=int, required=True) + args = parser.parse_args() + + npts, ndims = get_bin_metadata(indexdata_file) + + data = utils.bin_to_numpy(args.data_type, args.indexdata_file) + + offsets, permutation = utils.cluster_and_permute( + args.data_type, npts, ndims, data, args.num_clusters + ) + + permuted_data = data[permutation] + + utils.numpy_to_bin(permuted_data, args.indexdata_file + ".cluster") diff --git a/python/apps/in-mem-dynamic.py b/python/apps/in-mem-dynamic.py new file mode 100644 index 000000000..f97e1313f --- /dev/null +++ b/python/apps/in-mem-dynamic.py @@ -0,0 +1,161 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import argparse + +import diskannpy +import numpy as np +import utils + +def insert_and_search( + dtype_str, + indexdata_file, + querydata_file, + Lb, + graph_degree, + K, + Ls, + num_insert_threads, + num_search_threads, + gt_file, +) -> dict[str, float]: + """ + + :param dtype_str: + :param indexdata_file: + :param querydata_file: + :param Lb: + :param graph_degree: + :param K: + :param Ls: + :param num_insert_threads: + :param num_search_threads: + :param gt_file: + :return: Dictionary of timings. Key is the event and value is the number of seconds the event took + """ + timer_results: dict[str, float] = {} + + method_timer: utils.Timer = utils.Timer() + + npts, ndims = utils.get_bin_metadata(indexdata_file) + + if dtype_str == "float": + dtype = np.float32 + elif dtype_str == "int8": + dtype = np.int8 + elif dtype_str == "uint8": + dtype = np.uint8 + else: + raise ValueError("data_type must be float, int8 or uint8") + + index = diskannpy.DynamicMemoryIndex( + distance_metric="l2", + vector_dtype=dtype, + dimensions=ndims, + max_vectors=npts, + complexity=Lb, + graph_degree=graph_degree + ) + queries = diskannpy.vectors_from_file(querydata_file, dtype) + data = diskannpy.vectors_from_file(indexdata_file, dtype) + + tags = np.zeros(npts, dtype=np.uintc) + timer = utils.Timer() + for i in range(npts): + tags[i] = i + 1 + index.batch_insert(data, tags, num_insert_threads) + compute_seconds = timer.elapsed() + print('batch_insert complete in', compute_seconds, 's') + timer_results["batch_insert_seconds"] = compute_seconds + + delete_tags = np.random.choice( + np.array(range(1, npts + 1, 1), dtype=np.uintc), + size=int(0.5 * npts), + replace=False + ) + + timer.reset() + for tag in delete_tags: + index.mark_deleted(tag) + compute_seconds = timer.elapsed() + timer_results['mark_deletion_seconds'] = compute_seconds + print('mark deletion completed in', compute_seconds, 's') + + timer.reset() + index.consolidate_delete() + compute_seconds = timer.elapsed() + print('consolidation completed in', compute_seconds, 's') + timer_results['consolidation_completed_seconds'] = compute_seconds + + deleted_data = data[delete_tags - 1, :] + + timer.reset() + index.batch_insert(deleted_data, delete_tags, num_insert_threads) + compute_seconds = timer.elapsed() + print('re-insertion completed in', compute_seconds, 's') + timer_results['re-insertion_seconds'] = compute_seconds + + timer.reset() + tags, dists = index.batch_search(queries, K, Ls, num_search_threads) + compute_seconds = timer.elapsed() + print('Batch searched', queries.shape[0], ' queries in ', compute_seconds, 's') + timer_results['batch_searched_seconds'] = compute_seconds + + res_ids = tags - 1 + if gt_file != "": + timer.reset() + recall = utils.calculate_recall_from_gt_file(K, res_ids, gt_file) + print(f"recall@{K} is {recall}") + timer_results['recall_computed_seconds'] = timer.elapsed() + + timer_results['total_time_seconds'] = method_timer.elapsed() + + return timer_results + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + prog="in-mem-dynamic", + description="Inserts points dynamically in a clustered order and search from vectors in a file.", + ) + + parser.add_argument("-d", "--data_type", required=True) + parser.add_argument("-i", "--indexdata_file", required=True) + parser.add_argument("-q", "--querydata_file", required=True) + parser.add_argument("-Lb", "--Lbuild", default=50, type=int) + parser.add_argument("-Ls", "--Lsearch", default=50, type=int) + parser.add_argument("-R", "--graph_degree", default=32, type=int) + parser.add_argument("-TI", "--num_insert_threads", default=8, type=int) + parser.add_argument("-TS", "--num_search_threads", default=8, type=int) + parser.add_argument("-K", default=10, type=int) + parser.add_argument("--gt_file", default="") + parser.add_argument("--json_timings_output", required=False, default=None, help="File to write out timings to as JSON. If not specified, timings will not be written out.") + args = parser.parse_args() + + timings = insert_and_search( + args.data_type, + args.indexdata_file, + args.querydata_file, + args.Lbuild, + args.graph_degree, # Build args + args.K, + args.Lsearch, + args.num_insert_threads, + args.num_search_threads, # search args + args.gt_file, + ) + + if args.json_timings_output is not None: + import json + timings['log_file'] = args.json_timings_output + with open(args.json_timings_output, "w") as f: + json.dump(timings, f) + +""" +An ingest optimized example with SIFT1M +source venv/bin/activate +python python/apps/in-mem-dynamic.py -d float \ +-i "$HOME/data/sift/sift_base.fbin" -q "$HOME/data/sift/sift_query.fbin" --gt_file "$HOME/data/sift/gt100_base" \ +-Lb 10 -R 30 -Ls 200 +""" + diff --git a/python/apps/in-mem-static.py b/python/apps/in-mem-static.py new file mode 100644 index 000000000..9fb9a2cce --- /dev/null +++ b/python/apps/in-mem-static.py @@ -0,0 +1,149 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import argparse +from xml.dom.pulldom import default_bufsize + +import diskannpy +import numpy as np +import utils + +def build_and_search( + metric, + dtype_str, + index_directory, + indexdata_file, + querydata_file, + Lb, + graph_degree, + K, + Ls, + num_threads, + gt_file, + index_prefix, + search_only +) -> dict[str, float]: + """ + + :param metric: + :param dtype_str: + :param index_directory: + :param indexdata_file: + :param querydata_file: + :param Lb: + :param graph_degree: + :param K: + :param Ls: + :param num_threads: + :param gt_file: + :param index_prefix: + :param search_only: + :return: Dictionary of timings. Key is the event and value is the number of seconds the event took + in wall-clock-time. + """ + timer_results: dict[str, float] = {} + + method_timer: utils.Timer = utils.Timer() + + if dtype_str == "float": + dtype = np.single + elif dtype_str == "int8": + dtype = np.byte + elif dtype_str == "uint8": + dtype = np.ubyte + else: + raise ValueError("data_type must be float, int8 or uint8") + + # build index + if not search_only: + build_index_timer = utils.Timer() + diskannpy.build_memory_index( + data=indexdata_file, + distance_metric=metric, + vector_dtype=dtype, + index_directory=index_directory, + complexity=Lb, + graph_degree=graph_degree, + num_threads=num_threads, + index_prefix=index_prefix, + alpha=1.2, + use_pq_build=False, + num_pq_bytes=8, + use_opq=False, + ) + timer_results["build_index_seconds"] = build_index_timer.elapsed() + + # ready search object + load_index_timer = utils.Timer() + index = diskannpy.StaticMemoryIndex( + distance_metric=metric, + vector_dtype=dtype, + index_directory=index_directory, + num_threads=num_threads, # this can be different at search time if you would like + initial_search_complexity=Ls, + index_prefix=index_prefix + ) + timer_results["load_index_seconds"] = load_index_timer.elapsed() + + queries = utils.bin_to_numpy(dtype, querydata_file) + + query_timer = utils.Timer() + ids, dists = index.batch_search(queries, 10, Ls, num_threads) + query_time = query_timer.elapsed() + qps = round(queries.shape[0]/query_time, 1) + print('Batch searched', queries.shape[0], 'in', query_time, 's @', qps, 'QPS') + timer_results["query_seconds"] = query_time + + if gt_file != "": + recall_timer = utils.Timer() + recall = utils.calculate_recall_from_gt_file(K, ids, gt_file) + print(f"recall@{K} is {recall}") + timer_results["recall_seconds"] = recall_timer.elapsed() + + timer_results['total_time_seconds'] = method_timer.elapsed() + + return timer_results + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + prog="in-mem-static", + description="Static in-memory build and search from vectors in a file", + ) + + parser.add_argument("-m", "--metric", required=False, default="l2") + parser.add_argument("-d", "--data_type", required=True) + parser.add_argument("-id", "--index_directory", required=False, default=".") + parser.add_argument("-i", "--indexdata_file", required=True) + parser.add_argument("-q", "--querydata_file", required=True) + parser.add_argument("-Lb", "--Lbuild", default=50, type=int) + parser.add_argument("-Ls", "--Lsearch", default=50, type=int) + parser.add_argument("-R", "--graph_degree", default=32, type=int) + parser.add_argument("-T", "--num_threads", default=8, type=int) + parser.add_argument("-K", default=10, type=int) + parser.add_argument("-G", "--gt_file", default="") + parser.add_argument("-ip", "--index_prefix", required=False, default="ann") + parser.add_argument("--search_only", required=False, default=False) + parser.add_argument("--json_timings_output", required=False, default=None, help="File to write out timings to as JSON. If not specified, timings will not be written out.") + args = parser.parse_args() + + timings: dict[str, float] = build_and_search( + args.metric, + args.data_type, + args.index_directory.strip(), + args.indexdata_file.strip(), + args.querydata_file.strip(), + args.Lbuild, + args.graph_degree, # Build args + args.K, + args.Lsearch, + args.num_threads, # search args + args.gt_file, + args.index_prefix, + args.search_only + ) + + if args.json_timings_output is not None: + import json + timings['log_file'] = args.json_timings_output + with open(args.json_timings_output, "w") as f: + json.dump(timings, f) diff --git a/python/apps/insert-in-clustered-order.py b/python/apps/insert-in-clustered-order.py new file mode 100644 index 000000000..25cb9d53c --- /dev/null +++ b/python/apps/insert-in-clustered-order.py @@ -0,0 +1,103 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import argparse + +import diskannpy +import numpy as np +import utils + + +def insert_and_search( + dtype_str, + indexdata_file, + querydata_file, + Lb, + graph_degree, + num_clusters, + num_insert_threads, + K, + Ls, + num_search_threads, + gt_file, +): + npts, ndims = utils.get_bin_metadata(indexdata_file) + + if dtype_str == "float": + dtype = np.float32 + elif dtype_str == "int8": + dtype = np.int8 + elif dtype_str == "uint8": + dtype = np.uint8 + else: + raise ValueError("data_type must be float, int8 or uint8") + + index = diskannpy.DynamicMemoryIndex( + distance_metric="l2", + vector_dtype=dtype, + dimensions=ndims, + max_vectors=npts, + complexity=Lb, + graph_degree=graph_degree + ) + queries = diskannpy.vectors_from_file(querydata_file, dtype) + data = diskannpy.vectors_from_file(indexdata_file, dtype) + + offsets, permutation = utils.cluster_and_permute( + dtype_str, npts, ndims, data, num_clusters + ) + + i = 0 + timer = utils.Timer() + for c in range(num_clusters): + cluster_index_range = range(offsets[c], offsets[c + 1]) + cluster_indices = np.array(permutation[cluster_index_range], dtype=np.uint32) + cluster_data = data[cluster_indices, :] + index.batch_insert(cluster_data, cluster_indices + 1, num_insert_threads) + print('Inserted cluster', c, 'in', timer.elapsed(), 's') + tags, dists = index.batch_search(queries, K, Ls, num_search_threads) + print('Batch searched', queries.shape[0], 'queries in', timer.elapsed(), 's') + res_ids = tags - 1 + + if gt_file != "": + recall = utils.calculate_recall_from_gt_file(K, res_ids, gt_file) + print(f"recall@{K} is {recall}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + prog="in-mem-dynamic", + description="Inserts points dynamically in a clustered order and search from vectors in a file.", + ) + + parser.add_argument("-d", "--data_type", required=True) + parser.add_argument("-i", "--indexdata_file", required=True) + parser.add_argument("-q", "--querydata_file", required=True) + parser.add_argument("-Lb", "--Lbuild", default=50, type=int) + parser.add_argument("-Ls", "--Lsearch", default=50, type=int) + parser.add_argument("-R", "--graph_degree", default=32, type=int) + parser.add_argument("-TI", "--num_insert_threads", default=8, type=int) + parser.add_argument("-TS", "--num_search_threads", default=8, type=int) + parser.add_argument("-C", "--num_clusters", default=32, type=int) + parser.add_argument("-K", default=10, type=int) + parser.add_argument("--gt_file", default="") + args = parser.parse_args() + + insert_and_search( + args.data_type, + args.indexdata_file, + args.querydata_file, + args.Lbuild, + args.graph_degree, # Build args + args.num_clusters, + args.num_insert_threads, + args.K, + args.Lsearch, + args.num_search_threads, # search args + args.gt_file, + ) + +# An ingest optimized example with SIFT1M +# python3 ~/DiskANN/python/apps/insert-in-clustered-order.py -d float \ +# -i sift_base.fbin -q sift_query.fbin --gt_file gt100_base \ +# -Lb 10 -R 30 -Ls 200 -C 32 \ No newline at end of file diff --git a/python/apps/requirements.txt b/python/apps/requirements.txt new file mode 100644 index 000000000..87b4a72cc --- /dev/null +++ b/python/apps/requirements.txt @@ -0,0 +1,2 @@ +diskannpy +fire diff --git a/python/apps/utils.py b/python/apps/utils.py new file mode 100644 index 000000000..a52698470 --- /dev/null +++ b/python/apps/utils.py @@ -0,0 +1,120 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import numpy as np +from scipy.cluster.vq import vq, kmeans2 +from typing import Tuple +from time import perf_counter + + +def get_bin_metadata(bin_file) -> Tuple[int, int]: + array = np.fromfile(file=bin_file, dtype=np.uint32, count=2) + return array[0], array[1] + + +def bin_to_numpy(dtype, bin_file) -> np.ndarray: + npts, ndims = get_bin_metadata(bin_file) + return np.fromfile(file=bin_file, dtype=dtype, offset=8).reshape(npts, ndims) + + +class Timer: + last = perf_counter() + + def reset(self): + new = perf_counter() + self.last = new + + def elapsed(self, round_digit:int = 3): + new = perf_counter() + elapsed_time = new - self.last + self.last = new + return round(elapsed_time, round_digit) + + +def numpy_to_bin(array, out_file): + shape = np.shape(array) + npts = shape[0].astype(np.uint32) + ndims = shape[1].astype(np.uint32) + f = open(out_file, "wb") + f.write(npts.tobytes()) + f.write(ndims.tobytes()) + f.write(array.tobytes()) + f.close() + + +def read_gt_file(gt_file) -> Tuple[np.ndarray[int], np.ndarray[float]]: + """ + Return ids and distances to queries + """ + nq, K = get_bin_metadata(gt_file) + ids = np.fromfile(file=gt_file, dtype=np.uint32, offset=8, count=nq * K).reshape( + nq, K + ) + dists = np.fromfile( + file=gt_file, dtype=np.float32, offset=8 + nq * K * 4, count=nq * K + ).reshape(nq, K) + return ids, dists + + +def calculate_recall( + result_set_indices: np.ndarray[int], + truth_set_indices: np.ndarray[int], + recall_at: int = 5, +) -> float: + """ + result_set_indices and truth_set_indices correspond by row index. the columns in each row contain the indices of + the nearest neighbors, with result_set_indices being the approximate nearest neighbor results and truth_set_indices + being the brute force nearest neighbor calculation via sklearn's NearestNeighbor class. + :param result_set_indices: + :param truth_set_indices: + :param recall_at: + :return: + """ + found = 0 + for i in range(0, result_set_indices.shape[0]): + result_set_set = set(result_set_indices[i][0:recall_at]) + truth_set_set = set(truth_set_indices[i][0:recall_at]) + found += len(result_set_set.intersection(truth_set_set)) + return found / (result_set_indices.shape[0] * recall_at) + + +def calculate_recall_from_gt_file(K: int, ids: np.ndarray[int], gt_file: str) -> float: + """ + Calculate recall from ids returned from search and those read from file + """ + gt_ids, gt_dists = read_gt_file(gt_file) + return calculate_recall(ids, gt_ids, K) + + +def cluster_and_permute( + dtype_str, npts, ndims, data, num_clusters +) -> Tuple[np.ndarray[int], np.ndarray[int]]: + """ + Cluster the data and return permutation of row indices + that would group indices of the same cluster together + """ + sample_size = min(100000, npts) + sample_indices = np.random.choice(range(npts), size=sample_size, replace=False) + sampled_data = data[sample_indices, :] + centroids, sample_labels = kmeans2(sampled_data, num_clusters, minit="++", iter=10) + labels, dist = vq(data, centroids) + + count = np.zeros(num_clusters) + for i in range(npts): + count[labels[i]] += 1 + print("Cluster counts") + print(count) + + offsets = np.zeros(num_clusters + 1, dtype=int) + for i in range(0, num_clusters, 1): + offsets[i + 1] = offsets[i] + count[i] + + permutation = np.zeros(npts, dtype=int) + counters = np.zeros(num_clusters, dtype=int) + for i in range(npts): + label = labels[i] + row = offsets[label] + counters[label] + counters[label] += 1 + permutation[row] = i + + return offsets, permutation diff --git a/python/include/builder.h b/python/include/builder.h new file mode 100644 index 000000000..fc12976e7 --- /dev/null +++ b/python/include/builder.h @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include +#include + +#include "common.h" +#include "distance.h" + +namespace diskannpy +{ +template +void build_disk_index(diskann::Metric metric, const std::string &data_file_path, const std::string &index_prefix_path, + uint32_t complexity, uint32_t graph_degree, double final_index_ram_limit, + double indexing_ram_budget, uint32_t num_threads, uint32_t pq_disk_bytes); + +template +void build_memory_index(diskann::Metric metric, const std::string &vector_bin_path, + const std::string &index_output_path, uint32_t graph_degree, uint32_t complexity, + float alpha, uint32_t num_threads, bool use_pq_build, + size_t num_pq_bytes, bool use_opq, uint32_t filter_complexity, + bool use_tags = false); + +} diff --git a/python/include/common.h b/python/include/common.h new file mode 100644 index 000000000..7c63534fa --- /dev/null +++ b/python/include/common.h @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include +#include + +#include +#include + +namespace py = pybind11; + +namespace diskannpy +{ + +typedef uint32_t filterT; + +typedef uint32_t StaticIdType; +typedef uint32_t DynamicIdType; + +template using NeighborsAndDistances = std::pair, py::array_t>; + +}; // namespace diskannpy diff --git a/python/include/dynamic_memory_index.h b/python/include/dynamic_memory_index.h new file mode 100644 index 000000000..02d6b8cce --- /dev/null +++ b/python/include/dynamic_memory_index.h @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include +#include + +#include +#include + +#include "common.h" +#include "index.h" +#include "parameters.h" + +namespace py = pybind11; + +namespace diskannpy +{ + +template +class DynamicMemoryIndex +{ + public: + DynamicMemoryIndex(diskann::Metric m, size_t dimensions, size_t max_vectors, uint32_t complexity, + uint32_t graph_degree, bool saturate_graph, uint32_t max_occlusion_size, float alpha, + uint32_t num_threads, uint32_t filter_complexity, uint32_t num_frozen_points, + uint32_t initial_search_complexity, uint32_t initial_search_threads, + bool concurrent_consolidation); + + void load(const std::string &index_path); + int insert(const py::array_t &vector, DynamicIdType id); + py::array_t batch_insert(py::array_t &vectors, + py::array_t &ids, int32_t num_inserts, + int num_threads = 0); + int mark_deleted(DynamicIdType id); + void save(const std::string &save_path, bool compact_before_save = false); + NeighborsAndDistances search(py::array_t &query, uint64_t knn, + uint64_t complexity); + NeighborsAndDistances batch_search(py::array_t &queries, + uint64_t num_queries, uint64_t knn, uint64_t complexity, + uint32_t num_threads); + void consolidate_delete(); + size_t num_points(); + + + private: + const uint32_t _initial_search_complexity; + const diskann::IndexWriteParameters _write_parameters; + diskann::Index _index; +}; + +}; // namespace diskannpy \ No newline at end of file diff --git a/python/include/static_disk_index.h b/python/include/static_disk_index.h new file mode 100644 index 000000000..71a1b5aff --- /dev/null +++ b/python/include/static_disk_index.h @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include +#include + + +#include +#include + +#ifdef _WINDOWS +#include "windows_aligned_file_reader.h" +#else +#include "linux_aligned_file_reader.h" +#endif + +#include "common.h" +#include "pq_flash_index.h" + +namespace py = pybind11; + +namespace diskannpy { + +#ifdef _WINDOWS +typedef WindowsAlignedFileReader PlatformSpecificAlignedFileReader; +#else +typedef LinuxAlignedFileReader PlatformSpecificAlignedFileReader; +#endif + +template +class StaticDiskIndex +{ + public: + StaticDiskIndex(diskann::Metric metric, const std::string &index_path_prefix, uint32_t num_threads, + size_t num_nodes_to_cache, uint32_t cache_mechanism); + + void cache_bfs_levels(size_t num_nodes_to_cache); + + void cache_sample_paths(size_t num_nodes_to_cache, const std::string &warmup_query_file, uint32_t num_threads); + + NeighborsAndDistances search(py::array_t &query, uint64_t knn, + uint64_t complexity, uint64_t beam_width); + + NeighborsAndDistances batch_search(py::array_t &queries, uint64_t num_queries, + uint64_t knn, uint64_t complexity, uint64_t beam_width, uint32_t num_threads); + private: + std::shared_ptr _reader; + diskann::PQFlashIndex
_index; +}; +} diff --git a/python/include/static_memory_index.h b/python/include/static_memory_index.h new file mode 100644 index 000000000..33f3187ae --- /dev/null +++ b/python/include/static_memory_index.h @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#pragma once + +#include +#include + +#include +#include + +#include "common.h" +#include "index.h" + +namespace py = pybind11; + +namespace diskannpy { + +template +class StaticMemoryIndex +{ + public: + StaticMemoryIndex(diskann::Metric m, const std::string &index_prefix, size_t num_points, + size_t dimensions, uint32_t num_threads, uint32_t initial_search_complexity); + + NeighborsAndDistances search(py::array_t &query, uint64_t knn, + uint64_t complexity); + + NeighborsAndDistances batch_search(py::array_t &queries, + uint64_t num_queries, uint64_t knn, uint64_t complexity, uint32_t num_threads); + private: + diskann::Index _index; +}; +} \ No newline at end of file diff --git a/python/src/__init__.py b/python/src/__init__.py new file mode 100644 index 000000000..c2e1b07f6 --- /dev/null +++ b/python/src/__init__.py @@ -0,0 +1,138 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +""" +# Documentation Overview +`diskannpy` is mostly structured around 2 distinct processes: [Index Builder Functions](#index-builders) and [Search Classes](#search-classes) + +It also includes a few nascent [utilities](#utilities). + +And lastly, it makes substantial use of type hints, with various shorthand [type aliases](#parameter-and-response-type-aliases) documented. +When reading the `diskannpy` code we refer to the type aliases, though `pdoc` helpfully expands them. + +## Index Builders +- `build_disk_index` - To build an index that cannot fully fit into memory when searching +- `build_memory_index` - To build an index that can fully fit into memory when searching + +## Search Classes +- `StaticMemoryIndex` - for indices that can fully fit in memory and won't be changed during the search operations +- `StaticDiskIndex` - for indices that cannot fully fit in memory, thus relying on disk IO to search, and also won't be changed during search operations +- `DynamicMemoryIndex` - for indices that can fully fit in memory and will be mutated via insert/deletion operations as well as search operations + +## Parameter Defaults +- `diskannpy.defaults` - Default values exported from the C++ extension for Python users + +## Parameter and Response Type Aliases +- `DistanceMetric` - What distance metrics does `diskannpy` support? +- `VectorDType` - What vector datatypes does `diskannpy` support? +- `QueryResponse` - What can I expect as a response to my search? +- `QueryResponseBatch` - What can I expect as a response to my batch search? +- `VectorIdentifier` - What types do `diskannpy` support as vector identifiers? +- `VectorIdentifierBatch` - A batch of identifiers of the exact same type. The type can change, but they must **all** change. +- `VectorLike` - How does a vector look to `diskannpy`, to be inserted or searched with. +- `VectorLikeBatch` - A batch of those vectors, to be inserted or searched with. +- `Metadata` - DiskANN vector binary file metadata (num_points, vector_dim) + +## Utilities +- `vectors_to_file` - Turns a 2 dimensional `numpy.typing.NDArray[VectorDType]` with shape `(number_of_points, vector_dim)` into a DiskANN vector bin file. +- `vectors_from_file` - Reads a DiskANN vector bin file representing stored vectors into a numpy ndarray. +- `vectors_metadata_from_file` - Reads metadata stored in a DiskANN vector bin file without reading the entire file +- `tags_to_file` - Turns a 1 dimensional `numpy.typing.NDArray[VectorIdentifier]` into a DiskANN tags bin file. +- `tags_from_file` - Reads a DiskANN tags bin file representing stored tags into a numpy ndarray. +- `valid_dtype` - Checks if a given vector dtype is supported by `diskannpy` +""" + +from typing import Any, Literal, NamedTuple, Type, Union + +import numpy as np +from numpy import typing as npt + +DistanceMetric = Literal["l2", "mips", "cosine"] +""" Type alias for one of {"l2", "mips", "cosine"} """ +VectorDType = Union[Type[np.float32], Type[np.int8], Type[np.uint8]] +""" Type alias for one of {`numpy.float32`, `numpy.int8`, `numpy.uint8`} """ +VectorLike = npt.NDArray[VectorDType] +""" Type alias for something that can be treated as a vector """ +VectorLikeBatch = npt.NDArray[VectorDType] +""" Type alias for a batch of VectorLikes """ +VectorIdentifier = np.uint32 +""" +Type alias for a vector identifier, whether it be an implicit array index identifier from StaticMemoryIndex or +StaticDiskIndex, or an explicit tag identifier from DynamicMemoryIndex +""" +VectorIdentifierBatch = npt.NDArray[np.uint32] +""" Type alias for a batch of VectorIdentifiers """ + + +class QueryResponse(NamedTuple): + """ + Tuple with two values, identifiers and distances. Both are 1d arrays, positionally correspond, and will contain the + nearest neighbors from [0..k_neighbors) + """ + + identifiers: npt.NDArray[VectorIdentifier] + """ A `numpy.typing.NDArray[VectorIdentifier]` array of vector identifiers, 1 dimensional """ + distances: npt.NDArray[np.float32] + """ + A `numpy.typing.NDAarray[numpy.float32]` of distances as calculated by the distance metric function, 1 dimensional + """ + + +class QueryResponseBatch(NamedTuple): + """ + Tuple with two values, identifiers and distances. Both are 2d arrays, with dimensionality determined by the + rows corresponding to the number of queries made, and the columns corresponding to the k neighbors + requested. The two 2d arrays have an implicit, position-based relationship + """ + + identifiers: npt.NDArray[VectorIdentifier] + """ + A `numpy.typing.NDArray[VectorIdentifier]` array of vector identifiers, 2 dimensional. The row corresponds to index + of the query, and the column corresponds to the k neighbors requested + """ + distances: np.ndarray[np.float32] + """ + A `numpy.typing.NDAarray[numpy.float32]` of distances as calculated by the distance metric function, 2 dimensional. + The row corresponds to the index of the query, and the column corresponds to the distance of the query to the + *k-th* neighbor + """ + + +from . import defaults +from ._builder import build_disk_index, build_memory_index +from ._common import valid_dtype +from ._dynamic_memory_index import DynamicMemoryIndex +from ._files import ( + Metadata, + tags_from_file, + tags_to_file, + vectors_from_file, + vectors_metadata_from_file, + vectors_to_file, +) +from ._static_disk_index import StaticDiskIndex +from ._static_memory_index import StaticMemoryIndex + +__all__ = [ + "build_disk_index", + "build_memory_index", + "StaticDiskIndex", + "StaticMemoryIndex", + "DynamicMemoryIndex", + "defaults", + "DistanceMetric", + "VectorDType", + "QueryResponse", + "QueryResponseBatch", + "VectorIdentifier", + "VectorIdentifierBatch", + "VectorLike", + "VectorLikeBatch", + "Metadata", + "vectors_metadata_from_file", + "vectors_to_file", + "vectors_from_file", + "tags_to_file", + "tags_from_file", + "valid_dtype", +] diff --git a/python/src/_builder.py b/python/src/_builder.py new file mode 100644 index 000000000..18e9e9fa0 --- /dev/null +++ b/python/src/_builder.py @@ -0,0 +1,280 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import os +import shutil +from pathlib import Path +from typing import Optional, Tuple, Union + +import numpy as np + +from . import DistanceMetric, VectorDType, VectorIdentifierBatch, VectorLikeBatch +from . import _diskannpy as _native_dap +from ._common import ( + _assert, + _assert_is_nonnegative_uint32, + _assert_is_positive_uint32, + _castable_dtype_or_raise, + _valid_metric, + _write_index_metadata, + valid_dtype, +) +from ._diskannpy import defaults +from ._files import tags_to_file, vectors_metadata_from_file, vectors_to_file + + +def _valid_path_and_dtype( + data: Union[str, VectorLikeBatch], + vector_dtype: VectorDType, + index_path: str, + index_prefix: str, +) -> Tuple[str, VectorDType]: + if isinstance(data, str): + vector_bin_path = data + _assert( + Path(data).exists() and Path(data).is_file(), + "if data is of type `str`, it must both exist and be a file", + ) + vector_dtype_actual = valid_dtype(vector_dtype) + else: + vector_bin_path = os.path.join(index_path, f"{index_prefix}_vectors.bin") + if Path(vector_bin_path).exists(): + raise ValueError( + f"The path {vector_bin_path} already exists. Remove it and try again." + ) + vector_dtype_actual = valid_dtype(data.dtype) + vectors_to_file(vector_file=vector_bin_path, vectors=data) + + return vector_bin_path, vector_dtype_actual + + +def build_disk_index( + data: Union[str, VectorLikeBatch], + distance_metric: DistanceMetric, + index_directory: str, + complexity: int, + graph_degree: int, + search_memory_maximum: float, + build_memory_maximum: float, + num_threads: int, + pq_disk_bytes: int = defaults.PQ_DISK_BYTES, + vector_dtype: Optional[VectorDType] = None, + index_prefix: str = "ann", +) -> None: + """ + This function will construct a DiskANN disk index. Disk indices are ideal for very large datasets that + are too large to fit in memory. Memory is still used, but it is primarily used to provide precise disk + locations for fast retrieval of smaller subsets of the index without compromising much on recall. + + If you provide a numpy array, it will save this array to disk in a temp location + in the format DiskANN's PQ Flash Index builder requires. This temp folder is deleted upon index creation completion + or error. + + ### Parameters + - **data**: Either a `str` representing a path to a DiskANN vector bin file, or a numpy.ndarray, + of a supported dtype, in 2 dimensions. Note that `vector_dtype` must be provided if data is a `str` + - **distance_metric**: A `str`, strictly one of {"l2", "mips", "cosine"}. `l2` and `cosine` are supported for all 3 + vector dtypes, but `mips` is only available for single precision floats. + - **index_directory**: The index files will be saved to this **existing** directory path + - **complexity**: The size of the candidate nearest neighbor list to use when building the index. Values between 75 + and 200 are typical. Larger values will take more time to build but result in indices that provide higher recall + for the same search complexity. Use a value that is at least as large as `graph_degree` unless you are prepared + to compromise on quality + - **graph_degree**: The degree of the graph index, typically between 60 and 150. A larger maximum degree will + result in larger indices and longer indexing times, but better search quality. + - **search_memory_maximum**: Build index with the expectation that the search will use at most + `search_memory_maximum`, in gb. + - **build_memory_maximum**: Build index using at most `build_memory_maximum` in gb. Building processes typically + require more memory, while search memory can be reduced. + - **num_threads**: Number of threads to use when creating this index. `0` is used to indicate all available + logical processors should be used. + - **pq_disk_bytes**: Use `0` to store uncompressed data on SSD. This allows the index to asymptote to 100% + recall. If your vectors are too large to store in SSD, this parameter provides the option to compress the + vectors using PQ for storing on SSD. This will trade off recall. You would also want this to be greater + than the number of bytes used for the PQ compressed data stored in-memory. Default is `0`. + - **vector_dtype**: Required if the provided `data` is of type `str`, else we use the `data.dtype` if np array. + - **index_prefix**: The prefix of the index files. Defaults to "ann". + """ + + _assert( + (isinstance(data, str) and vector_dtype is not None) + or isinstance(data, np.ndarray), + "vector_dtype is required if data is a str representing a path to the vector bin file", + ) + dap_metric = _valid_metric(distance_metric) + _assert_is_positive_uint32(complexity, "complexity") + _assert_is_positive_uint32(graph_degree, "graph_degree") + _assert(search_memory_maximum > 0, "search_memory_maximum must be larger than 0") + _assert(build_memory_maximum > 0, "build_memory_maximum must be larger than 0") + _assert_is_nonnegative_uint32(num_threads, "num_threads") + _assert_is_nonnegative_uint32(pq_disk_bytes, "pq_disk_bytes") + _assert(index_prefix != "", "index_prefix cannot be an empty string") + + index_path = Path(index_directory) + _assert( + index_path.exists() and index_path.is_dir(), + "index_directory must both exist and be a directory", + ) + + vector_bin_path, vector_dtype_actual = _valid_path_and_dtype( + data, vector_dtype, index_directory, index_prefix + ) + + num_points, dimensions = vectors_metadata_from_file(vector_bin_path) + + if vector_dtype_actual == np.uint8: + _builder = _native_dap.build_disk_uint8_index + elif vector_dtype_actual == np.int8: + _builder = _native_dap.build_disk_int8_index + else: + _builder = _native_dap.build_disk_float_index + + index_prefix_path = os.path.join(index_directory, index_prefix) + + _builder( + distance_metric=dap_metric, + data_file_path=vector_bin_path, + index_prefix_path=index_prefix_path, + complexity=complexity, + graph_degree=graph_degree, + final_index_ram_limit=search_memory_maximum, + indexing_ram_budget=build_memory_maximum, + num_threads=num_threads, + pq_disk_bytes=pq_disk_bytes, + ) + _write_index_metadata( + index_prefix_path, vector_dtype_actual, dap_metric, num_points, dimensions + ) + + +def build_memory_index( + data: Union[str, VectorLikeBatch], + distance_metric: DistanceMetric, + index_directory: str, + complexity: int, + graph_degree: int, + num_threads: int, + alpha: float = defaults.ALPHA, + use_pq_build: bool = defaults.USE_PQ_BUILD, + num_pq_bytes: int = defaults.NUM_PQ_BYTES, + use_opq: bool = defaults.USE_OPQ, + vector_dtype: Optional[VectorDType] = None, + filter_complexity: int = defaults.FILTER_COMPLEXITY, + tags: Union[str, VectorIdentifierBatch] = "", + index_prefix: str = "ann", +) -> None: + """ + This function will construct a DiskANN memory index. Memory indices are ideal for smaller datasets whose + indices can fit into memory. Memory indices are faster than disk indices, but usually cannot scale to massive + sizes in an individual index on an individual machine. + + `diskannpy`'s memory indices take two forms: a `diskannpy.StaticMemoryIndex`, which will not be mutated, only + searched upon, and a `diskannpy.DynamicMemoryIndex`, which can be mutated AND searched upon in the same process. + + ## Important Note: + You **must** determine the type of index you are building for. If you are building for a + `diskannpy.DynamicMemoryIndex`, you **must** supply a valid value for the `tags` parameter. **Do not supply + tags if the index is intended to be `diskannpy.StaticMemoryIndex`**! + + ### Parameters + + - **data**: Either a `str` representing a path to an existing DiskANN vector bin file, or a numpy.ndarray of a + supported dtype in 2 dimensions. Note that `vector_dtype` must be provided if `data` is a `str`. + - **distance_metric**: A `str`, strictly one of {"l2", "mips", "cosine"}. `l2` and `cosine` are supported for all 3 + vector dtypes, but `mips` is only available for single precision floats. + - **index_directory**: The index files will be saved to this **existing** directory path + - **complexity**: The size of the candidate nearest neighbor list to use when building the index. Values between 75 + and 200 are typical. Larger values will take more time to build but result in indices that provide higher recall + for the same search complexity. Use a value that is at least as large as `graph_degree` unless you are prepared + to compromise on quality + - **graph_degree**: The degree of the graph index, typically between 60 and 150. A larger maximum degree will + result in larger indices and longer indexing times, but better search quality. + - **num_threads**: Number of threads to use when creating this index. `0` is used to indicate all available + logical processors should be used. + - **alpha**: The alpha parameter (>=1) is used to control the nature and number of points that are added to the + graph. A higher alpha value (e.g., 1.4) will result in fewer hops (and IOs) to convergence, but probably more + distance comparisons compared to a lower alpha value. + - **use_pq_build**: Use product quantization during build. Product quantization is a lossy compression technique + that can reduce the size of the index on disk. This will trade off recall. Default is `True`. + - **num_pq_bytes**: The number of bytes used to store the PQ compressed data in memory. This will trade off recall. + Default is `0`. + - **use_opq**: Use optimized product quantization during build. + - **vector_dtype**: Required if the provided `data` is of type `str`, else we use the `data.dtype` if np array. + - **filter_complexity**: Complexity to use when using filters. Default is 0. + - **tags**: A `str` representing a path to a pre-built tags file on disk, or a `numpy.ndarray` of uint32 ids + corresponding to the ordinal position of the vectors provided to build the index. Defaults to "". **This value + must be provided if you want to build a memory index intended for use with `diskannpy.DynamicMemoryIndex`**. + - **index_prefix**: The prefix of the index files. Defaults to "ann". + """ + _assert( + (isinstance(data, str) and vector_dtype is not None) + or isinstance(data, np.ndarray), + "vector_dtype is required if data is a str representing a path to the vector bin file", + ) + dap_metric = _valid_metric(distance_metric) + _assert_is_positive_uint32(complexity, "complexity") + _assert_is_positive_uint32(graph_degree, "graph_degree") + _assert( + alpha >= 1, + "alpha must be >= 1, and realistically should be kept between [1.0, 2.0)", + ) + _assert_is_nonnegative_uint32(num_threads, "num_threads") + _assert_is_nonnegative_uint32(num_pq_bytes, "num_pq_bytes") + _assert_is_nonnegative_uint32(filter_complexity, "filter_complexity") + _assert(index_prefix != "", "index_prefix cannot be an empty string") + + index_path = Path(index_directory) + _assert( + index_path.exists() and index_path.is_dir(), + "index_directory must both exist and be a directory", + ) + + vector_bin_path, vector_dtype_actual = _valid_path_and_dtype( + data, vector_dtype, index_directory, index_prefix + ) + + num_points, dimensions = vectors_metadata_from_file(vector_bin_path) + + if vector_dtype_actual == np.uint8: + _builder = _native_dap.build_memory_uint8_index + elif vector_dtype_actual == np.int8: + _builder = _native_dap.build_memory_int8_index + else: + _builder = _native_dap.build_memory_float_index + + index_prefix_path = os.path.join(index_directory, index_prefix) + + if isinstance(tags, str) and tags != "": + use_tags = True + shutil.copy(tags, index_prefix_path + ".tags") + elif not isinstance(tags, str): + use_tags = True + tags_as_array = _castable_dtype_or_raise(tags, expected=np.uint32) + _assert(len(tags_as_array.shape) == 1, "Provided tags must be 1 dimensional") + _assert( + tags_as_array.shape[0] == num_points, + "Provided tags must contain an identical population to the number of points, " + f"{tags_as_array.shape[0]=}, {num_points=}", + ) + tags_to_file(index_prefix_path + ".tags", tags_as_array) + else: + use_tags = False + + _builder( + distance_metric=dap_metric, + data_file_path=vector_bin_path, + index_output_path=index_prefix_path, + complexity=complexity, + graph_degree=graph_degree, + alpha=alpha, + num_threads=num_threads, + use_pq_build=use_pq_build, + num_pq_bytes=num_pq_bytes, + use_opq=use_opq, + filter_complexity=filter_complexity, + use_tags=use_tags, + ) + + _write_index_metadata( + index_prefix_path, vector_dtype_actual, dap_metric, num_points, dimensions + ) diff --git a/python/src/_builder.pyi b/python/src/_builder.pyi new file mode 100644 index 000000000..5014880c6 --- /dev/null +++ b/python/src/_builder.pyi @@ -0,0 +1,74 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +from typing import BinaryIO, Optional, overload + +import numpy as np + +from . import DistanceMetric, VectorDType, VectorIdentifierBatch, VectorLikeBatch + +def numpy_to_diskann_file(vectors: np.ndarray, file_handler: BinaryIO): ... +@overload +def build_disk_index( + data: str, + distance_metric: DistanceMetric, + index_directory: str, + complexity: int, + graph_degree: int, + search_memory_maximum: float, + build_memory_maximum: float, + num_threads: int, + pq_disk_bytes: int, + vector_dtype: VectorDType, + index_prefix: str, +) -> None: ... +@overload +def build_disk_index( + data: VectorLikeBatch, + distance_metric: DistanceMetric, + index_directory: str, + complexity: int, + graph_degree: int, + search_memory_maximum: float, + build_memory_maximum: float, + num_threads: int, + pq_disk_bytes: int, + index_prefix: str, +) -> None: ... +@overload +def build_memory_index( + data: VectorLikeBatch, + distance_metric: DistanceMetric, + index_directory: str, + complexity: int, + graph_degree: int, + alpha: float, + num_threads: int, + use_pq_build: bool, + num_pq_bytes: int, + use_opq: bool, + label_file: str, + universal_label: str, + filter_complexity: int, + tags: Optional[VectorIdentifierBatch], + index_prefix: str, +) -> None: ... +@overload +def build_memory_index( + data: str, + distance_metric: DistanceMetric, + index_directory: str, + complexity: int, + graph_degree: int, + alpha: float, + num_threads: int, + use_pq_build: bool, + num_pq_bytes: int, + use_opq: bool, + vector_dtype: VectorDType, + label_file: str, + universal_label: str, + filter_complexity: int, + tags: Optional[str], + index_prefix: str, +) -> None: ... diff --git a/python/src/_common.py b/python/src/_common.py new file mode 100644 index 000000000..53f1dbcab --- /dev/null +++ b/python/src/_common.py @@ -0,0 +1,249 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import os +import warnings +from enum import Enum +from pathlib import Path +from typing import Literal, NamedTuple, Optional, Tuple, Type, Union + +import numpy as np + +from . import ( + DistanceMetric, + VectorDType, + VectorIdentifierBatch, + VectorLike, + VectorLikeBatch, +) +from . import _diskannpy as _native_dap + +__ALL__ = ["valid_dtype"] + +_VALID_DTYPES = [np.float32, np.int8, np.uint8] + + +def valid_dtype(dtype: Type) -> VectorDType: + """ + Utility method to determine whether the provided dtype is supported by `diskannpy`, and if so, the canonical + dtype we will use internally (e.g. np.single -> np.float32) + """ + _assert_dtype(dtype) + if dtype == np.uint8: + return np.uint8 + if dtype == np.int8: + return np.int8 + if dtype == np.float32: + return np.float32 + + +def _assert(statement_eval: bool, message: str): + if not statement_eval: + raise ValueError(message) + + +def _valid_metric(metric: str) -> _native_dap.Metric: + if not isinstance(metric, str): + raise ValueError("distance_metric must be a string") + if metric.lower() == "l2": + return _native_dap.L2 + elif metric.lower() == "mips": + return _native_dap.INNER_PRODUCT + elif metric.lower() == "cosine": + return _native_dap.COSINE + else: + raise ValueError("distance_metric must be one of 'l2', 'mips', or 'cosine'") + + +def _assert_dtype(dtype: Type): + _assert( + any(np.can_cast(dtype, _dtype) for _dtype in _VALID_DTYPES), + f"Vector dtype must be of one of type {{(np.single, np.float32), (np.byte, np.int8), (np.ubyte, np.uint8)}}", + ) + + +def _castable_dtype_or_raise( + data: Union[VectorLike, VectorLikeBatch, VectorIdentifierBatch], expected: np.dtype +) -> np.ndarray: + if isinstance(data, np.ndarray) and np.can_cast(data.dtype, expected): + return data.astype(expected, casting="safe") + else: + raise TypeError( + f"expecting a numpy ndarray of dtype {expected}, not a {type(data)}" + ) + + +def _assert_2d(vectors: np.ndarray, name: str): + _assert(len(vectors.shape) == 2, f"{name} must be 2d numpy array") + + +__MAX_UINT32_VAL = 4_294_967_295 + + +def _assert_is_positive_uint32(test_value: int, parameter: str): + _assert( + test_value is not None and 0 < test_value < __MAX_UINT32_VAL, + f"{parameter} must be a positive integer in the uint32 range", + ) + + +def _assert_is_nonnegative_uint32(test_value: int, parameter: str): + _assert( + test_value is not None and -1 < test_value < __MAX_UINT32_VAL, + f"{parameter} must be a non-negative integer in the uint32 range", + ) + + +def _assert_is_nonnegative_uint64(test_value: int, parameter: str): + _assert( + -1 < test_value, + f"{parameter} must be a non-negative integer in the uint64 range", + ) + + +def _assert_existing_directory(path: str, parameter: str): + _path = Path(path) + _assert( + _path.exists() and _path.is_dir(), f"{parameter} must be an existing directory" + ) + + +def _assert_existing_file(path: str, parameter: str): + _path = Path(path) + _assert(_path.exists() and _path.is_file(), f"{parameter} must be an existing file") + + +class _DataType(Enum): + FLOAT32 = 0 + INT8 = 1 + UINT8 = 2 + + @classmethod + def from_type(cls, vector_dtype: VectorDType) -> "DataType": + if vector_dtype == np.float32: + return cls.FLOAT32 + if vector_dtype == np.int8: + return cls.INT8 + if vector_dtype == np.uint8: + return cls.UINT8 + + def to_type(self) -> VectorDType: + if self is _DataType.FLOAT32: + return np.float32 + if self is _DataType.INT8: + return np.int8 + if self is _DataType.UINT8: + return np.uint8 + + +class _Metric(Enum): + L2 = 0 + MIPS = 1 + COSINE = 2 + + @classmethod + def from_native(cls, metric: _native_dap.Metric) -> "_Metric": + if metric == _native_dap.L2: + return cls.L2 + if metric == _native_dap.INNER_PRODUCT: + return cls.MIPS + if metric == _native_dap.COSINE: + return cls.COSINE + + def to_native(self) -> _native_dap.Metric: + if self is _Metric.L2: + return _native_dap.L2 + if self is _Metric.MIPS: + return _native_dap.INNER_PRODUCT + if self is _Metric.COSINE: + return _native_dap.COSINE + + def to_str(self) -> _native_dap.Metric: + if self is _Metric.L2: + return "l2" + if self is _Metric.MIPS: + return "mips" + if self is _Metric.COSINE: + return "cosine" + + +def _build_metadata_path(index_path_and_prefix: str) -> str: + return index_path_and_prefix + "_metadata.bin" + + +def _write_index_metadata( + index_path_and_prefix: str, + dtype: VectorDType, + metric: _native_dap.Metric, + num_points: int, + dimensions: int, +): + np.array( + [ + _DataType.from_type(dtype).value, + _Metric.from_native(metric).value, + num_points, + dimensions, + ], + dtype=np.uint64, + ).tofile(_build_metadata_path(index_path_and_prefix)) + + +def _read_index_metadata( + index_path_and_prefix: str, +) -> Optional[Tuple[VectorDType, str, np.uint64, np.uint64]]: + path = _build_metadata_path(index_path_and_prefix) + if not Path(path).exists(): + return None + else: + metadata = np.fromfile(path, dtype=np.uint64, count=-1) + return ( + _DataType(int(metadata[0])).to_type(), + _Metric(int(metadata[1])).to_str(), + metadata[2], + metadata[3], + ) + + +def _ensure_index_metadata( + index_path_and_prefix: str, + vector_dtype: Optional[VectorDType], + distance_metric: Optional[DistanceMetric], + max_vectors: int, + dimensions: Optional[int], +) -> Tuple[VectorDType, str, np.uint64, np.uint64]: + possible_metadata = _read_index_metadata(index_path_and_prefix) + if possible_metadata is None: + _assert( + all([vector_dtype, distance_metric, dimensions]), + "distance_metric, vector_dtype, and dimensions must provided if a corresponding metadata file has not " + "been built for this index, such as when an index was built via the CLI tools or prior to the addition " + "of a metadata file", + ) + _assert_dtype(vector_dtype) + _assert_is_positive_uint32(max_vectors, "max_vectors") + _assert_is_positive_uint32(dimensions, "dimensions") + return vector_dtype, distance_metric, max_vectors, dimensions # type: ignore + else: + vector_dtype, distance_metric, num_vectors, dimensions = possible_metadata + if max_vectors is not None and num_vectors > max_vectors: + warnings.warn( + "The number of vectors in the saved index exceeds the max_vectors parameter. " + "max_vectors is being adjusted to accommodate the dataset, but any insertions will fail." + ) + max_vectors = num_vectors + if num_vectors == max_vectors: + warnings.warn( + "The number of vectors in the saved index equals max_vectors parameter. Any insertions will fail." + ) + return possible_metadata + + +def _valid_index_prefix(index_directory: str, index_prefix: str) -> str: + _assert( + index_directory is not None and index_directory != "", + "index_directory cannot be None or empty", + ) + _assert_existing_directory(index_directory, "index_directory") + _assert(index_prefix != "", "index_prefix cannot be an empty string") + return os.path.join(index_directory, index_prefix) diff --git a/python/src/_dynamic_memory_index.py b/python/src/_dynamic_memory_index.py new file mode 100644 index 000000000..9570b8345 --- /dev/null +++ b/python/src/_dynamic_memory_index.py @@ -0,0 +1,509 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import os +import warnings +from pathlib import Path +from typing import Optional + +import numpy as np + +from . import ( + DistanceMetric, + QueryResponse, + QueryResponseBatch, + VectorDType, + VectorIdentifier, + VectorIdentifierBatch, + VectorLike, + VectorLikeBatch, +) +from . import _diskannpy as _native_dap +from ._common import ( + _assert, + _assert_2d, + _assert_dtype, + _assert_existing_directory, + _assert_is_nonnegative_uint32, + _assert_is_positive_uint32, + _castable_dtype_or_raise, + _ensure_index_metadata, + _valid_index_prefix, + _valid_metric, + _write_index_metadata, +) +from ._diskannpy import defaults + +__ALL__ = ["DynamicMemoryIndex"] + + +class DynamicMemoryIndex: + """ + A DynamicMemoryIndex instance is used to both search and mutate a `diskannpy` memory index. This index is unlike + either `diskannpy.StaticMemoryIndex` or `diskannpy.StaticDiskIndex` in the following ways: + + - It requires an explicit vector identifier for each vector added to it. + - Insert and (lazy) deletion operations are provided for a flexible, living index + + The mutable aspect of this index will absolutely impact search time performance as new vectors are added and + old deleted. `DynamicMemoryIndex.consolidate_deletes()` should be called periodically to restructure the index + to remove deleted vectors and improve per-search performance, at the cost of an expensive index consolidation to + occur. + """ + + @classmethod + def from_file( + cls, + index_directory: str, + max_vectors: int, + complexity: int, + graph_degree: int, + saturate_graph: bool = defaults.SATURATE_GRAPH, + max_occlusion_size: int = defaults.MAX_OCCLUSION_SIZE, + alpha: float = defaults.ALPHA, + num_threads: int = defaults.NUM_THREADS, + filter_complexity: int = defaults.FILTER_COMPLEXITY, + num_frozen_points: int = defaults.NUM_FROZEN_POINTS_DYNAMIC, + initial_search_complexity: int = 0, + search_threads: int = 0, + concurrent_consolidation: bool = True, + index_prefix: str = "ann", + distance_metric: Optional[DistanceMetric] = None, + vector_dtype: Optional[VectorDType] = None, + dimensions: Optional[int] = None, + ) -> "DynamicMemoryIndex": + """ + The `from_file` classmethod is used to load a previously saved index from disk. This index *must* have been + created with a valid `tags` file or `tags` np.ndarray of `diskannpy.VectorIdentifier`s. It is *strongly* + recommended that you use the same parameters as the `diskannpy.build_memory_index()` function that created + the index. + + ### Parameters + - **index_directory**: The directory containing the index files. This directory must contain the following + files: + - `{index_prefix}.data` + - `{index_prefix}.tags` + - `{index_prefix}` + + It may also include the following optional files: + - `{index_prefix}_vectors.bin`: Optional. `diskannpy` builder functions may create this file in the + `index_directory` if the index was created from a numpy array + - `{index_prefix}_metadata.bin`: Optional. `diskannpy` builder functions create this file to store metadata + about the index, such as vector dtype, distance metric, number of vectors and vector dimensionality. + If an index is built from the `diskann` cli tools, this file will not exist. + - **max_vectors**: Capacity of the memory index including space for future insertions. + - **complexity**: Complexity (a.k.a `L`) references the size of the list we store candidate approximate + neighbors in. It's used during save (which is an index rebuild), and it's used as an initial search size to + warm up our index and lower the latency for initial real searches. + - **graph_degree**: Graph degree (a.k.a. `R`) is the maximum degree allowed for a node in the index's graph + structure. This degree will be pruned throughout the course of the index build, but it will never grow beyond + this value. Higher R values require longer index build times, but may result in an index showing excellent + recall and latency characteristics. + - **saturate_graph**: If True, the adjacency list of each node will be saturated with neighbors to have exactly + `graph_degree` neighbors. If False, each node will have between 1 and `graph_degree` neighbors. + - **max_occlusion_size**: The maximum number of points that can be considered by occlude_list function. + - **alpha**: The alpha parameter (>=1) is used to control the nature and number of points that are added to the + graph. A higher alpha value (e.g., 1.4) will result in fewer hops (and IOs) to convergence, but probably + more distance comparisons compared to a lower alpha value. + - **num_threads**: Number of threads to use when creating this index. `0` indicates we should use all available + logical processors. + - **filter_complexity**: Complexity to use when using filters. Default is 0. + - **num_frozen_points**: Number of points to freeze. Default is 1. + - **initial_search_complexity**: Should be set to the most common `complexity` expected to be used during the + life of this `diskannpy.DynamicMemoryIndex` object. The working scratch memory allocated is based off of + `initial_search_complexity` * `search_threads`. Note that it may be resized if a `search` or `batch_search` + operation requests a space larger than can be accommodated by these values. + - **search_threads**: Should be set to the most common `num_threads` expected to be used during the + life of this `diskannpy.DynamicMemoryIndex` object. The working scratch memory allocated is based off of + `initial_search_complexity` * `search_threads`. Note that it may be resized if a `batch_search` + operation requests a space larger than can be accommodated by these values. + - **concurrent_consolidation**: This flag dictates whether consolidation can be run alongside inserts and + deletes, or whether the index is locked down to changes while consolidation is ongoing. + - **index_prefix**: The prefix of the index files. Defaults to "ann". + - **distance_metric**: A `str`, strictly one of {"l2", "mips", "cosine"}. `l2` and `cosine` are supported for all 3 + vector dtypes, but `mips` is only available for single precision floats. Default is `None`. **This + value is only used if a `{index_prefix}_metadata.bin` file does not exist.** If it does not exist, + you are required to provide it. + - **vector_dtype**: The vector dtype this index has been built with. **This value is only used if a + `{index_prefix}_metadata.bin` file does not exist.** If it does not exist, you are required to provide it. + - **dimensions**: The vector dimensionality of this index. All new vectors inserted must be the same + dimensionality. **This value is only used if a `{index_prefix}_metadata.bin` file does not exist.** If it + does not exist, you are required to provide it. + + ### Returns + A `diskannpy.DynamicMemoryIndex` object, with the index loaded from disk and ready to use for insertions, + deletions, and searches. + + """ + index_prefix_path = _valid_index_prefix(index_directory, index_prefix) + + # do tags exist? + tags_file = index_prefix_path + ".tags" + _assert( + Path(tags_file).exists(), + f"The file {tags_file} does not exist in {index_directory}", + ) + vector_dtype, dap_metric, num_vectors, dimensions = _ensure_index_metadata( + index_prefix_path, vector_dtype, distance_metric, max_vectors, dimensions + ) + + index = cls( + distance_metric=dap_metric, # type: ignore + vector_dtype=vector_dtype, + dimensions=dimensions, + max_vectors=max_vectors, + complexity=complexity, + graph_degree=graph_degree, + saturate_graph=saturate_graph, + max_occlusion_size=max_occlusion_size, + alpha=alpha, + num_threads=num_threads, + filter_complexity=filter_complexity, + num_frozen_points=num_frozen_points, + initial_search_complexity=initial_search_complexity, + search_threads=search_threads, + concurrent_consolidation=concurrent_consolidation, + ) + index._index.load(index_prefix_path) + index._num_vectors = num_vectors # current number of vectors loaded + return index + + def __init__( + self, + distance_metric: DistanceMetric, + vector_dtype: VectorDType, + dimensions: int, + max_vectors: int, + complexity: int, + graph_degree: int, + saturate_graph: bool = defaults.SATURATE_GRAPH, + max_occlusion_size: int = defaults.MAX_OCCLUSION_SIZE, + alpha: float = defaults.ALPHA, + num_threads: int = defaults.NUM_THREADS, + filter_complexity: int = defaults.FILTER_COMPLEXITY, + num_frozen_points: int = defaults.NUM_FROZEN_POINTS_DYNAMIC, + initial_search_complexity: int = 0, + search_threads: int = 0, + concurrent_consolidation: bool = True, + ): + """ + The `diskannpy.DynamicMemoryIndex` represents our python API into a mutable DiskANN memory index. + + This constructor is used to create a new, empty index. If you wish to load a previously saved index from disk, + please use the `diskannpy.DynamicMemoryIndex.from_file` classmethod instead. + + ### Parameters + - **distance_metric**: A `str`, strictly one of {"l2", "mips", "cosine"}. `l2` and `cosine` are supported for all 3 + vector dtypes, but `mips` is only available for single precision floats. + - **vector_dtype**: One of {`np.float32`, `np.int8`, `np.uint8`}. The dtype of the vectors this index will + be storing. + - **dimensions**: The vector dimensionality of this index. All new vectors inserted must be the same + dimensionality. + - **max_vectors**: Capacity of the data store including space for future insertions + - **graph_degree**: Graph degree (a.k.a. `R`) is the maximum degree allowed for a node in the index's graph + structure. This degree will be pruned throughout the course of the index build, but it will never grow beyond + this value. Higher `graph_degree` values require longer index build times, but may result in an index showing + excellent recall and latency characteristics. + - **saturate_graph**: If True, the adjacency list of each node will be saturated with neighbors to have exactly + `graph_degree` neighbors. If False, each node will have between 1 and `graph_degree` neighbors. + - **max_occlusion_size**: The maximum number of points that can be considered by occlude_list function. + - **alpha**: The alpha parameter (>=1) is used to control the nature and number of points that are added to the + graph. A higher alpha value (e.g., 1.4) will result in fewer hops (and IOs) to convergence, but probably + more distance comparisons compared to a lower alpha value. + - **num_threads**: Number of threads to use when creating this index. `0` indicates we should use all available + logical processors. + - **filter_complexity**: Complexity to use when using filters. Default is 0. + - **num_frozen_points**: Number of points to freeze. Default is 1. + - **initial_search_complexity**: Should be set to the most common `complexity` expected to be used during the + life of this `diskannpy.DynamicMemoryIndex` object. The working scratch memory allocated is based off of + `initial_search_complexity` * `search_threads`. Note that it may be resized if a `search` or `batch_search` + operation requests a space larger than can be accommodated by these values. + - **search_threads**: Should be set to the most common `num_threads` expected to be used during the + life of this `diskannpy.DynamicMemoryIndex` object. The working scratch memory allocated is based off of + `initial_search_complexity` * `search_threads`. Note that it may be resized if a `batch_search` + operation requests a space larger than can be accommodated by these values. + - **concurrent_consolidation**: This flag dictates whether consolidation can be run alongside inserts and + deletes, or whether the index is locked down to changes while consolidation is ongoing. + + """ + self._num_vectors = 0 + self._removed_num_vectors = 0 + dap_metric = _valid_metric(distance_metric) + self._dap_metric = dap_metric + _assert_dtype(vector_dtype) + _assert_is_positive_uint32(dimensions, "dimensions") + + self._vector_dtype = vector_dtype + self._dimensions = dimensions + + _assert_is_positive_uint32(max_vectors, "max_vectors") + _assert_is_positive_uint32(complexity, "complexity") + _assert_is_positive_uint32(graph_degree, "graph_degree") + _assert( + alpha >= 1, + "alpha must be >= 1, and realistically should be kept between [1.0, 2.0)", + ) + _assert_is_nonnegative_uint32(max_occlusion_size, "max_occlusion_size") + _assert_is_nonnegative_uint32(num_threads, "num_threads") + _assert_is_nonnegative_uint32(filter_complexity, "filter_complexity") + _assert_is_nonnegative_uint32(num_frozen_points, "num_frozen_points") + _assert_is_nonnegative_uint32( + initial_search_complexity, "initial_search_complexity" + ) + _assert_is_nonnegative_uint32(search_threads, "search_threads") + + self._max_vectors = max_vectors + self._complexity = complexity + self._graph_degree = graph_degree + + if vector_dtype == np.uint8: + _index = _native_dap.DynamicMemoryUInt8Index + elif vector_dtype == np.int8: + _index = _native_dap.DynamicMemoryInt8Index + else: + _index = _native_dap.DynamicMemoryFloatIndex + + self._index = _index( + distance_metric=dap_metric, + dimensions=dimensions, + max_vectors=max_vectors, + complexity=complexity, + graph_degree=graph_degree, + saturate_graph=saturate_graph, + max_occlusion_size=max_occlusion_size, + alpha=alpha, + num_threads=num_threads, + filter_complexity=filter_complexity, + num_frozen_points=num_frozen_points, + initial_search_complexity=initial_search_complexity, + search_threads=search_threads, + concurrent_consolidation=concurrent_consolidation, + ) + self._points_deleted = False + + def search( + self, query: VectorLike, k_neighbors: int, complexity: int + ) -> QueryResponse: + """ + Searches the index by a single query vector. + + ### Parameters + - **query**: 1d numpy array of the same dimensionality and dtype of the index. + - **k_neighbors**: Number of neighbors to be returned. If query vector exists in index, it almost definitely + will be returned as well, so adjust your ``k_neighbors`` as appropriate. Must be > 0. + - **complexity**: Size of distance ordered list of candidate neighbors to use while searching. List size + increases accuracy at the cost of latency. Must be at least k_neighbors in size. + """ + _query = _castable_dtype_or_raise(query, expected=self._vector_dtype) + _assert(len(_query.shape) == 1, "query vector must be 1-d") + _assert( + _query.shape[0] == self._dimensions, + f"query vector must have the same dimensionality as the index; index dimensionality: {self._dimensions}, " + f"query dimensionality: {_query.shape[0]}", + ) + _assert_is_positive_uint32(k_neighbors, "k_neighbors") + _assert_is_nonnegative_uint32(complexity, "complexity") + + if k_neighbors > complexity: + warnings.warn( + f"k_neighbors={k_neighbors} asked for, but list_size={complexity} was smaller. Increasing {complexity} to {k_neighbors}" + ) + complexity = k_neighbors + return self._index.search(query=_query, knn=k_neighbors, complexity=complexity) + + def batch_search( + self, + queries: VectorLikeBatch, + k_neighbors: int, + complexity: int, + num_threads: int, + ) -> QueryResponseBatch: + """ + Searches the index by a batch of query vectors. + + This search is parallelized and far more efficient than searching for each vector individually. + + ### Parameters + - **queries**: 2d numpy array, with column dimensionality matching the index and row dimensionality being the + number of queries intended to search for in parallel. Dtype must match dtype of the index. + - **k_neighbors**: Number of neighbors to be returned. If query vector exists in index, it almost definitely + will be returned as well, so adjust your ``k_neighbors`` as appropriate. Must be > 0. + - **complexity**: Size of distance ordered list of candidate neighbors to use while searching. List size + increases accuracy at the cost of latency. Must be at least k_neighbors in size. + - **num_threads**: Number of threads to use when searching this index. (>= 0), 0 = num_threads in system + """ + _queries = _castable_dtype_or_raise(queries, expected=self._vector_dtype) + _assert_2d(_queries, "queries") + _assert( + _queries.shape[1] == self._dimensions, + f"query vectors must have the same dimensionality as the index; index dimensionality: {self._dimensions}, " + f"query dimensionality: {_queries.shape[1]}", + ) + + _assert_is_positive_uint32(k_neighbors, "k_neighbors") + _assert_is_positive_uint32(complexity, "complexity") + _assert_is_nonnegative_uint32(num_threads, "num_threads") + + if k_neighbors > complexity: + warnings.warn( + f"k_neighbors={k_neighbors} asked for, but list_size={complexity} was smaller. Increasing {complexity} to {k_neighbors}" + ) + complexity = k_neighbors + + num_queries, dim = queries.shape + return self._index.batch_search( + queries=_queries, + num_queries=num_queries, + knn=k_neighbors, + complexity=complexity, + num_threads=num_threads, + ) + + def save(self, save_path: str, index_prefix: str = "ann"): + """ + Saves this index to file. + + ### Parameters + - **save_path**: The path to save these index files to. + - **index_prefix**: The prefix of the index files. Defaults to "ann". + """ + if save_path == "": + raise ValueError("save_path cannot be empty") + if index_prefix == "": + raise ValueError("index_prefix cannot be empty") + + index_prefix = index_prefix.format(complexity=self._complexity, graph_degree=self._graph_degree) + _assert_existing_directory(save_path, "save_path") + save_path = os.path.join(save_path, index_prefix) + if self._points_deleted is True: + warnings.warn( + "DynamicMemoryIndex.save() currently requires DynamicMemoryIndex.consolidate_delete() to be called " + "prior to save when items have been marked for deletion. This is being done automatically now, though" + "it will increase the time it takes to save; on large sets of data it can take a substantial amount of " + "time. In the future, we will implement a faster save with unconsolidated deletes, but for now this is " + "required." + ) + self._index.consolidate_delete() + self._index.save( + save_path=save_path, compact_before_save=True + ) # we do not yet support uncompacted saves + _write_index_metadata( + save_path, + self._vector_dtype, + self._dap_metric, + self._index.num_points(), + self._dimensions, + ) + + def insert(self, vector: VectorLike, vector_id: VectorIdentifier): + """ + Inserts a single vector into the index with the provided vector_id. + + If this insertion will overrun the `max_vectors` count boundaries of this index, `consolidate_delete()` will + be executed automatically. + + ### Parameters + - **vector**: The vector to insert. Note that dtype must match. + - **vector_id**: The vector_id to use for this vector. + """ + _vector = _castable_dtype_or_raise(vector, expected=self._vector_dtype) + _assert(len(vector.shape) == 1, "insert vector must be 1-d") + _assert_is_positive_uint32(vector_id, "vector_id") + if self._num_vectors + 1 > self._max_vectors: + if self._removed_num_vectors > 0: + warnings.warn(f"Inserting this vector would overrun the max_vectors={self._max_vectors} specified at index " + f"construction. We are attempting to consolidate_delete() to make space.") + self.consolidate_delete() + else: + raise RuntimeError(f"Inserting this vector would overrun the max_vectors={self._max_vectors} specified " + f"at index construction. Unable to make space by consolidating deletions. The insert" + f"operation has failed.") + status = self._index.insert(_vector, np.uint32(vector_id)) + if status == 0: + self._num_vectors += 1 + else: + raise RuntimeError( + f"Insert was unable to complete successfully; error code returned from diskann C++ lib: {status}" + ) + + + def batch_insert( + self, + vectors: VectorLikeBatch, + vector_ids: VectorIdentifierBatch, + num_threads: int = 0, + ): + """ + Inserts a batch of vectors into the index with the provided vector_ids. + + If this batch insertion will overrun the `max_vectors` count boundaries of this index, `consolidate_delete()` + will be executed automatically. + + ### Parameters + - **vectors**: The 2d numpy array of vectors to insert. + - **vector_ids**: The 1d array of vector ids to use. This array must have the same number of elements as + the vectors array has rows. The dtype of vector_ids must be `np.uint32` + - **num_threads**: Number of threads to use when inserting into this index. (>= 0), 0 = num_threads in system + """ + _query = _castable_dtype_or_raise(vectors, expected=self._vector_dtype) + _assert(len(vectors.shape) == 2, "vectors must be a 2-d array") + _assert( + vectors.shape[0] == vector_ids.shape[0], + "Number of vectors must be equal to number of ids", + ) + _vectors = vectors.astype(dtype=self._vector_dtype, casting="safe", copy=False) + _vector_ids = vector_ids.astype(dtype=np.uint32, casting="safe", copy=False) + + if self._num_vectors + _vector_ids.shape[0] > self._max_vectors: + if self._max_vectors + self._removed_num_vectors >= _vector_ids.shape[0]: + warnings.warn(f"Inserting these vectors, count={_vector_ids.shape[0]} would overrun the " + f"max_vectors={self._max_vectors} specified at index construction. We are attempting to " + f"consolidate_delete() to make space.") + self.consolidate_delete() + else: + raise RuntimeError(f"Inserting these vectors count={_vector_ids.shape[0]} would overrun the " + f"max_vectors={self._max_vectors} specified at index construction. Unable to make " + f"space by consolidating deletions. The batch insert operation has failed.") + + statuses = self._index.batch_insert( + _vectors, _vector_ids, _vector_ids.shape[0], num_threads + ) + successes = [] + failures = [] + for i in range(0, len(statuses)): + if statuses[i] == 0: + successes.append(i) + else: + failures.append(i) + self._num_vectors += len(successes) + if len(failures) == 0: + return + failed_ids = vector_ids[failures] + raise RuntimeError( + f"During batch insert, the following vector_ids were unable to be inserted into the index: {failed_ids}. " + f"{len(successes)} were successfully inserted" + ) + + + def mark_deleted(self, vector_id: VectorIdentifier): + """ + Mark vector for deletion. This is a soft delete that won't return the vector id in any results, but does not + remove it from the underlying index files or memory structure. To execute a hard delete, call this method and + then call the much more expensive `consolidate_delete` method on this index. + ### Parameters + - **vector_id**: The vector id to delete. Must be a uint32. + """ + _assert_is_positive_uint32(vector_id, "vector_id") + self._points_deleted = True + self._removed_num_vectors += 1 + # we do not decrement self._num_vectors until consolidate_delete + self._index.mark_deleted(np.uint32(vector_id)) + + def consolidate_delete(self): + """ + This method actually restructures the DiskANN index to remove the items that have been marked for deletion. + """ + self._index.consolidate_delete() + self._points_deleted = False + self._num_vectors -= self._removed_num_vectors + self._removed_num_vectors = 0 diff --git a/python/src/_files.py b/python/src/_files.py new file mode 100644 index 000000000..1c9fa2103 --- /dev/null +++ b/python/src/_files.py @@ -0,0 +1,111 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import warnings +from typing import BinaryIO, NamedTuple + +import numpy as np +import numpy.typing as npt + +from . import VectorDType, VectorIdentifierBatch, VectorLikeBatch +from ._common import _assert, _assert_2d, _assert_dtype, _assert_existing_file + + +class Metadata(NamedTuple): + """DiskANN binary vector files contain a small stanza containing some metadata about them.""" + + num_vectors: int + """ The number of vectors in the file. """ + dimensions: int + """ The dimensionality of the vectors in the file. """ + + +def vectors_metadata_from_file(vector_file: str) -> Metadata: + """ + Read the metadata from a DiskANN binary vector file. + ### Parameters + - **vector_file**: The path to the vector file to read the metadata from. + + ### Returns + `diskannpy.Metadata` + """ + _assert_existing_file(vector_file, "vector_file") + points, dims = np.fromfile(file=vector_file, dtype=np.int32, count=2) + return Metadata(points, dims) + + +def _write_bin(data: np.ndarray, file_handler: BinaryIO): + if len(data.shape) == 1: + _ = file_handler.write(np.array([data.shape[0], 1], dtype=np.int32).tobytes()) + else: + _ = file_handler.write(np.array(data.shape, dtype=np.int32).tobytes()) + _ = file_handler.write(data.tobytes()) + + +def vectors_to_file(vector_file: str, vectors: VectorLikeBatch) -> None: + """ + Utility function that writes a DiskANN binary vector formatted file to the location of your choosing. + + ### Parameters + - **vector_file**: The path to the vector file to write the vectors to. + - **vectors**: A 2d array of dtype `numpy.float32`, `numpy.uint8`, or `numpy.int8` + """ + _assert_dtype(vectors.dtype) + _assert_2d(vectors, "vectors") + with open(vector_file, "wb") as fh: + _write_bin(vectors, fh) + + +def vectors_from_file(vector_file: str, dtype: VectorDType) -> npt.NDArray[VectorDType]: + """ + Read vectors from a DiskANN binary vector file. + + ### Parameters + - **vector_file**: The path to the vector file to read the vectors from. + - **dtype**: The data type of the vectors in the file. Ensure you match the data types exactly + + ### Returns + `numpy.typing.NDArray[dtype]` + """ + points, dims = vectors_metadata_from_file(vector_file) + return np.fromfile(file=vector_file, dtype=dtype, offset=8).reshape(points, dims) + + +def tags_to_file(tags_file: str, tags: VectorIdentifierBatch) -> None: + """ + Write tags to a DiskANN binary tag file. + + ### Parameters + - **tags_file**: The path to the tag file to write the tags to. + - **tags**: A 1d array of dtype `numpy.uint32` containing the tags to write. If you have a 2d array of tags with + one column, you can pass it here and it will be reshaped and copied to a new array. It is more efficient for you + to reshape on your own without copying it first, as it should be a constant time operation vs. linear time + + """ + _assert(np.can_cast(tags.dtype, np.uint32), "valid tags must be uint32") + _assert( + len(tags.shape) == 1 or tags.shape[1] == 1, + "tags must be 1d or 2d with 1 column", + ) + if len(tags.shape) == 2: + warnings.warn( + "Tags in 2d with one column will be reshaped and copied to a new array. " + "It is more efficient for you to reshape without copying first." + ) + tags = tags.reshape(tags.shape[0], copy=True) + with open(tags_file, "wb") as fh: + _write_bin(tags.astype(np.uint32), fh) + + +def tags_from_file(tags_file: str) -> VectorIdentifierBatch: + """ + Read tags from a DiskANN binary tag file and return them as a 1d array of dtype `numpy.uint32`. + + ### Parameters + - **tags_file**: The path to the tag file to read the tags from. + """ + _assert_existing_file(tags_file, "tags_file") + points, dims = vectors_metadata_from_file( + tags_file + ) # tag files contain the same metadata stanza + return np.fromfile(file=tags_file, dtype=np.uint32, offset=8).reshape(points) diff --git a/python/src/_static_disk_index.py b/python/src/_static_disk_index.py new file mode 100644 index 000000000..1ca93c0a4 --- /dev/null +++ b/python/src/_static_disk_index.py @@ -0,0 +1,197 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import os +import warnings +from typing import Optional + +import numpy as np + +from . import ( + DistanceMetric, + QueryResponse, + QueryResponseBatch, + VectorDType, + VectorLike, + VectorLikeBatch, +) +from . import _diskannpy as _native_dap +from ._common import ( + _assert, + _assert_2d, + _assert_is_nonnegative_uint32, + _assert_is_positive_uint32, + _castable_dtype_or_raise, + _ensure_index_metadata, + _valid_index_prefix, + _valid_metric, +) + +__ALL__ = ["StaticDiskIndex"] + + +class StaticDiskIndex: + """ + A StaticDiskIndex is a disk-backed index that is not mutable. + """ + + def __init__( + self, + index_directory: str, + num_threads: int, + num_nodes_to_cache: int, + cache_mechanism: int = 1, + distance_metric: Optional[DistanceMetric] = None, + vector_dtype: Optional[VectorDType] = None, + dimensions: Optional[int] = None, + index_prefix: str = "ann", + ): + """ + ### Parameters + - **index_directory**: The directory containing the index files. This directory must contain the following + files: + - `{index_prefix}_sample_data.bin` + - `{index_prefix}_mem.index.data` + - `{index_prefix}_pq_compressed.bin` + - `{index_prefix}_pq_pivots.bin` + - `{index_prefix}_sample_ids.bin` + - `{index_prefix}_disk.index` + + It may also include the following optional files: + - `{index_prefix}_vectors.bin`: Optional. `diskannpy` builder functions may create this file in the + `index_directory` if the index was created from a numpy array + - `{index_prefix}_metadata.bin`: Optional. `diskannpy` builder functions create this file to store metadata + about the index, such as vector dtype, distance metric, number of vectors and vector dimensionality. + If an index is built from the `diskann` cli tools, this file will not exist. + - **num_threads**: Number of threads to use when searching this index. (>= 0), 0 = num_threads in system + - **num_nodes_to_cache**: Number of nodes to cache in memory (> -1) + - **cache_mechanism**: 1 -> use the generated sample_data.bin file for + the index to initialize a set of cached nodes, up to `num_nodes_to_cache`, 2 -> ready the cache for up to + `num_nodes_to_cache`, but do not initialize it with any nodes. Any other value disables node caching. + - **distance_metric**: A `str`, strictly one of {"l2", "mips", "cosine"}. `l2` and `cosine` are supported for all 3 + vector dtypes, but `mips` is only available for single precision floats. Default is `None`. **This + value is only used if a `{index_prefix}_metadata.bin` file does not exist.** If it does not exist, + you are required to provide it. + - **vector_dtype**: The vector dtype this index has been built with. **This value is only used if a + `{index_prefix}_metadata.bin` file does not exist.** If it does not exist, you are required to provide it. + - **dimensions**: The vector dimensionality of this index. All new vectors inserted must be the same + dimensionality. **This value is only used if a `{index_prefix}_metadata.bin` file does not exist.** If it + does not exist, you are required to provide it. + - **index_prefix**: The prefix of the index files. Defaults to "ann". + """ + index_prefix = _valid_index_prefix(index_directory, index_prefix) + vector_dtype, metric, _, _ = _ensure_index_metadata( + index_prefix, + vector_dtype, + distance_metric, + 1, # it doesn't matter because we don't need it in this context anyway + dimensions, + ) + dap_metric = _valid_metric(metric) + + _assert_is_nonnegative_uint32(num_threads, "num_threads") + _assert_is_nonnegative_uint32(num_nodes_to_cache, "num_nodes_to_cache") + + self._vector_dtype = vector_dtype + if vector_dtype == np.uint8: + _index = _native_dap.StaticDiskUInt8Index + elif vector_dtype == np.int8: + _index = _native_dap.StaticDiskInt8Index + else: + _index = _native_dap.StaticDiskFloatIndex + self._index = _index( + distance_metric=dap_metric, + index_path_prefix=os.path.join(index_directory, index_prefix), + num_threads=num_threads, + num_nodes_to_cache=num_nodes_to_cache, + cache_mechanism=cache_mechanism, + ) + + def search( + self, query: VectorLike, k_neighbors: int, complexity: int, beam_width: int = 2 + ) -> QueryResponse: + """ + Searches the index by a single query vector. + + ### Parameters + - **query**: 1d numpy array of the same dimensionality and dtype of the index. + - **k_neighbors**: Number of neighbors to be returned. If query vector exists in index, it almost definitely + will be returned as well, so adjust your ``k_neighbors`` as appropriate. Must be > 0. + - **complexity**: Size of distance ordered list of candidate neighbors to use while searching. List size + increases accuracy at the cost of latency. Must be at least k_neighbors in size. + - **beam_width**: The beamwidth to be used for search. This is the maximum number of IO requests each query + will issue per iteration of search code. Larger beamwidth will result in fewer IO round-trips per query, + but might result in slightly higher total number of IO requests to SSD per query. For the highest query + throughput with a fixed SSD IOps rating, use W=1. For best latency, use W=4,8 or higher complexity search. + Specifying 0 will optimize the beamwidth depending on the number of threads performing search, but will + involve some tuning overhead. + """ + _query = _castable_dtype_or_raise(query, expected=self._vector_dtype) + _assert(len(_query.shape) == 1, "query vector must be 1-d") + _assert_is_positive_uint32(k_neighbors, "k_neighbors") + _assert_is_positive_uint32(complexity, "complexity") + _assert_is_positive_uint32(beam_width, "beam_width") + + if k_neighbors > complexity: + warnings.warn( + f"{k_neighbors=} asked for, but {complexity=} was smaller. Increasing {complexity} to {k_neighbors}" + ) + complexity = k_neighbors + + return self._index.search( + query=_query, + knn=k_neighbors, + complexity=complexity, + beam_width=beam_width, + ) + + def batch_search( + self, + queries: VectorLikeBatch, + k_neighbors: int, + complexity: int, + num_threads: int, + beam_width: int = 2, + ) -> QueryResponseBatch: + """ + Searches the index by a batch of query vectors. + + This search is parallelized and far more efficient than searching for each vector individually. + + ### Parameters + - **queries**: 2d numpy array, with column dimensionality matching the index and row dimensionality being the + number of queries intended to search for in parallel. Dtype must match dtype of the index. + - **k_neighbors**: Number of neighbors to be returned. If query vector exists in index, it almost definitely + will be returned as well, so adjust your ``k_neighbors`` as appropriate. Must be > 0. + - **complexity**: Size of distance ordered list of candidate neighbors to use while searching. List size + increases accuracy at the cost of latency. Must be at least k_neighbors in size. + - **num_threads**: Number of threads to use when searching this index. (>= 0), 0 = num_threads in system + - **beam_width**: The beamwidth to be used for search. This is the maximum number of IO requests each query + will issue per iteration of search code. Larger beamwidth will result in fewer IO round-trips per query, + but might result in slightly higher total number of IO requests to SSD per query. For the highest query + throughput with a fixed SSD IOps rating, use W=1. For best latency, use W=4,8 or higher complexity search. + Specifying 0 will optimize the beamwidth depending on the number of threads performing search, but will + involve some tuning overhead. + """ + _queries = _castable_dtype_or_raise(queries, expected=self._vector_dtype) + _assert_2d(_queries, "queries") + _assert_is_positive_uint32(k_neighbors, "k_neighbors") + _assert_is_positive_uint32(complexity, "complexity") + _assert_is_nonnegative_uint32(num_threads, "num_threads") + _assert_is_positive_uint32(beam_width, "beam_width") + + if k_neighbors > complexity: + warnings.warn( + f"{k_neighbors=} asked for, but {complexity=} was smaller. Increasing {complexity} to {k_neighbors}" + ) + complexity = k_neighbors + + num_queries, dim = _queries.shape + return self._index.batch_search( + queries=_queries, + num_queries=num_queries, + knn=k_neighbors, + complexity=complexity, + beam_width=beam_width, + num_threads=num_threads, + ) diff --git a/python/src/_static_memory_index.py b/python/src/_static_memory_index.py new file mode 100644 index 000000000..8b87cd561 --- /dev/null +++ b/python/src/_static_memory_index.py @@ -0,0 +1,187 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import os +import warnings +from typing import Optional + +import numpy as np + +from . import ( + DistanceMetric, + QueryResponse, + QueryResponseBatch, + VectorDType, + VectorLike, + VectorLikeBatch, +) +from . import _diskannpy as _native_dap +from ._common import ( + _assert, + _assert_is_nonnegative_uint32, + _assert_is_positive_uint32, + _castable_dtype_or_raise, + _ensure_index_metadata, + _valid_index_prefix, + _valid_metric, +) + +__ALL__ = ["StaticMemoryIndex"] + + +class StaticMemoryIndex: + """ + A StaticMemoryIndex is an immutable in-memory DiskANN index. + """ + + def __init__( + self, + index_directory: str, + num_threads: int, + initial_search_complexity: int, + index_prefix: str = "ann", + distance_metric: Optional[DistanceMetric] = None, + vector_dtype: Optional[VectorDType] = None, + dimensions: Optional[int] = None, + ): + """ + ### Parameters + - **index_directory**: The directory containing the index files. This directory must contain the following + files: + - `{index_prefix}.data` + - `{index_prefix}` + + + It may also include the following optional files: + - `{index_prefix}_vectors.bin`: Optional. `diskannpy` builder functions may create this file in the + `index_directory` if the index was created from a numpy array + - `{index_prefix}_metadata.bin`: Optional. `diskannpy` builder functions create this file to store metadata + about the index, such as vector dtype, distance metric, number of vectors and vector dimensionality. + If an index is built from the `diskann` cli tools, this file will not exist. + - **num_threads**: Number of threads to use when searching this index. (>= 0), 0 = num_threads in system + - **initial_search_complexity**: Should be set to the most common `complexity` expected to be used during the + life of this `diskannpy.DynamicMemoryIndex` object. The working scratch memory allocated is based off of + `initial_search_complexity` * `search_threads`. Note that it may be resized if a `search` or `batch_search` + operation requests a space larger than can be accommodated by these values. + - **index_prefix**: The prefix of the index files. Defaults to "ann". + - **distance_metric**: A `str`, strictly one of {"l2", "mips", "cosine"}. `l2` and `cosine` are supported for all 3 + vector dtypes, but `mips` is only available for single precision floats. Default is `None`. **This + value is only used if a `{index_prefix}_metadata.bin` file does not exist.** If it does not exist, + you are required to provide it. + - **vector_dtype**: The vector dtype this index has been built with. **This value is only used if a + `{index_prefix}_metadata.bin` file does not exist.** If it does not exist, you are required to provide it. + - **dimensions**: The vector dimensionality of this index. All new vectors inserted must be the same + dimensionality. **This value is only used if a `{index_prefix}_metadata.bin` file does not exist.** If it + does not exist, you are required to provide it. + """ + index_prefix = _valid_index_prefix(index_directory, index_prefix) + vector_dtype, metric, num_points, dims = _ensure_index_metadata( + index_prefix, + vector_dtype, + distance_metric, + 1, # it doesn't matter because we don't need it in this context anyway + dimensions, + ) + dap_metric = _valid_metric(metric) + + _assert_is_nonnegative_uint32(num_threads, "num_threads") + _assert_is_positive_uint32( + initial_search_complexity, "initial_search_complexity" + ) + + self._vector_dtype = vector_dtype + self._dimensions = dims + + if vector_dtype == np.uint8: + _index = _native_dap.StaticMemoryUInt8Index + elif vector_dtype == np.int8: + _index = _native_dap.StaticMemoryInt8Index + else: + _index = _native_dap.StaticMemoryFloatIndex + + self._index = _index( + distance_metric=dap_metric, + num_points=num_points, + dimensions=dims, + index_path=os.path.join(index_directory, index_prefix), + num_threads=num_threads, + initial_search_complexity=initial_search_complexity, + ) + + def search( + self, query: VectorLike, k_neighbors: int, complexity: int + ) -> QueryResponse: + """ + Searches the index by a single query vector. + + ### Parameters + - **query**: 1d numpy array of the same dimensionality and dtype of the index. + - **k_neighbors**: Number of neighbors to be returned. If query vector exists in index, it almost definitely + will be returned as well, so adjust your ``k_neighbors`` as appropriate. Must be > 0. + - **complexity**: Size of distance ordered list of candidate neighbors to use while searching. List size + increases accuracy at the cost of latency. Must be at least k_neighbors in size. + """ + _query = _castable_dtype_or_raise(query, expected=self._vector_dtype) + _assert(len(_query.shape) == 1, "query vector must be 1-d") + _assert( + _query.shape[0] == self._dimensions, + f"query vector must have the same dimensionality as the index; index dimensionality: {self._dimensions}, " + f"query dimensionality: {_query.shape[0]}", + ) + _assert_is_positive_uint32(k_neighbors, "k_neighbors") + _assert_is_nonnegative_uint32(complexity, "complexity") + + if k_neighbors > complexity: + warnings.warn( + f"k_neighbors={k_neighbors} asked for, but list_size={complexity} was smaller. Increasing {complexity} to {k_neighbors}" + ) + complexity = k_neighbors + return self._index.search(query=_query, knn=k_neighbors, complexity=complexity) + + def batch_search( + self, + queries: VectorLikeBatch, + k_neighbors: int, + complexity: int, + num_threads: int, + ) -> QueryResponseBatch: + """ + Searches the index by a batch of query vectors. + + This search is parallelized and far more efficient than searching for each vector individually. + + ### Parameters + - **queries**: 2d numpy array, with column dimensionality matching the index and row dimensionality being the + number of queries intended to search for in parallel. Dtype must match dtype of the index. + - **k_neighbors**: Number of neighbors to be returned. If query vector exists in index, it almost definitely + will be returned as well, so adjust your ``k_neighbors`` as appropriate. Must be > 0. + - **complexity**: Size of distance ordered list of candidate neighbors to use while searching. List size + increases accuracy at the cost of latency. Must be at least k_neighbors in size. + - **num_threads**: Number of threads to use when searching this index. (>= 0), 0 = num_threads in system + """ + + _queries = _castable_dtype_or_raise(queries, expected=self._vector_dtype) + _assert(len(_queries.shape) == 2, "queries must must be 2-d np array") + _assert( + _queries.shape[1] == self._dimensions, + f"query vectors must have the same dimensionality as the index; index dimensionality: {self._dimensions}, " + f"query dimensionality: {_queries.shape[1]}", + ) + _assert_is_positive_uint32(k_neighbors, "k_neighbors") + _assert_is_positive_uint32(complexity, "complexity") + _assert_is_nonnegative_uint32(num_threads, "num_threads") + + if k_neighbors > complexity: + warnings.warn( + f"k_neighbors={k_neighbors} asked for, but list_size={complexity} was smaller. Increasing {complexity} to {k_neighbors}" + ) + complexity = k_neighbors + + num_queries, dim = _queries.shape + return self._index.batch_search( + queries=_queries, + num_queries=num_queries, + knn=k_neighbors, + complexity=complexity, + num_threads=num_threads, + ) diff --git a/python/src/builder.cpp b/python/src/builder.cpp new file mode 100644 index 000000000..4485d66e6 --- /dev/null +++ b/python/src/builder.cpp @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "builder.h" +#include "common.h" +#include "disk_utils.h" +#include "index.h" +#include "parameters.h" + +namespace diskannpy +{ +template +void build_disk_index(const diskann::Metric metric, const std::string &data_file_path, + const std::string &index_prefix_path, const uint32_t complexity, const uint32_t graph_degree, + const double final_index_ram_limit, const double indexing_ram_budget, const uint32_t num_threads, + const uint32_t pq_disk_bytes) +{ + std::string params = std::to_string(graph_degree) + " " + std::to_string(complexity) + " " + + std::to_string(final_index_ram_limit) + " " + std::to_string(indexing_ram_budget) + " " + + std::to_string(num_threads); + if (pq_disk_bytes > 0) + params = params + " " + std::to_string(pq_disk_bytes); + diskann::build_disk_index
(data_file_path.c_str(), index_prefix_path.c_str(), params.c_str(), metric); +} + +template void build_disk_index(diskann::Metric, const std::string &, const std::string &, uint32_t, uint32_t, + double, double, uint32_t, uint32_t); + +template void build_disk_index(diskann::Metric, const std::string &, const std::string &, uint32_t, uint32_t, + double, double, uint32_t, uint32_t); +template void build_disk_index(diskann::Metric, const std::string &, const std::string &, uint32_t, uint32_t, + double, double, uint32_t, uint32_t); + +template +void build_memory_index(const diskann::Metric metric, const std::string &vector_bin_path, + const std::string &index_output_path, const uint32_t graph_degree, const uint32_t complexity, + const float alpha, const uint32_t num_threads, const bool use_pq_build, + const size_t num_pq_bytes, const bool use_opq, const uint32_t filter_complexity, + const bool use_tags) +{ + diskann::IndexWriteParameters index_build_params = diskann::IndexWriteParametersBuilder(complexity, graph_degree) + .with_filter_list_size(filter_complexity) + .with_alpha(alpha) + .with_saturate_graph(false) + .with_num_threads(num_threads) + .build(); + size_t data_num, data_dim; + diskann::get_bin_metadata(vector_bin_path, data_num, data_dim); + diskann::Index index(metric, data_dim, data_num, use_tags, use_tags, false, use_pq_build, + num_pq_bytes, use_opq); + + if (use_tags) + { + const std::string tags_file = index_output_path + ".tags"; + if (!file_exists(tags_file)) + { + throw std::runtime_error("tags file not found at expected path: " + tags_file); + } + TagT *tags_data; + size_t tag_dims = 1; + diskann::load_bin(tags_file, tags_data, data_num, tag_dims); + std::vector tags(tags_data, tags_data + data_num); + index.build(vector_bin_path.c_str(), data_num, index_build_params, tags); + } + else + { + index.build(vector_bin_path.c_str(), data_num, index_build_params); + } + + index.save(index_output_path.c_str()); +} + +template void build_memory_index(diskann::Metric, const std::string &, const std::string &, uint32_t, uint32_t, + float, uint32_t, bool, size_t, bool, uint32_t, bool); + +template void build_memory_index(diskann::Metric, const std::string &, const std::string &, uint32_t, uint32_t, + float, uint32_t, bool, size_t, bool, uint32_t, bool); + +template void build_memory_index(diskann::Metric, const std::string &, const std::string &, uint32_t, uint32_t, + float, uint32_t, bool, size_t, bool, uint32_t, bool); + +} // namespace diskannpy diff --git a/python/src/defaults.py b/python/src/defaults.py new file mode 100644 index 000000000..4e22983fd --- /dev/null +++ b/python/src/defaults.py @@ -0,0 +1,71 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +""" +# Parameter Defaults +These parameter defaults are re-exported from the C++ extension module, and used to keep the pythonic wrapper in sync with the C++. +""" +from ._diskannpy import defaults as _defaults + +ALPHA = _defaults.ALPHA +""" +Note that, as ALPHA is a `float32` (single precision float) in C++, when converted into Python it becomes a +`float64` (double precision float). The actual value is 1.2f. The alpha parameter (>=1) is used to control the nature +and number of points that are added to the graph. A higher alpha value (e.g., 1.4) will result in fewer hops (and IOs) +to convergence, but probably more distance comparisons compared to a lower alpha value. +""" +NUM_THREADS = _defaults.NUM_THREADS +""" Number of threads to use. `0` will use all available detected logical processors """ +MAX_OCCLUSION_SIZE = _defaults.MAX_OCCLUSION_SIZE +""" +The maximum number of points that can be occluded by a single point. This is used to prevent a single point from +dominating the graph structure. If a point has more than `max_occlusion_size` neighbors closer to it than the current +point, it will not be added to the graph. This is a tradeoff between index build time and search quality. +""" +FILTER_COMPLEXITY = _defaults.FILTER_COMPLEXITY +""" +Complexity (a.k.a. `L`) references the size of the list we store candidate approximate neighbors in while doing a +filtered search. This value must be larger than `k_neighbors`, and larger values tend toward higher recall in the +resultant ANN search at the cost of more time. +""" +NUM_FROZEN_POINTS_STATIC = _defaults.NUM_FROZEN_POINTS_STATIC +""" Number of points frozen by default in a StaticMemoryIndex """ +NUM_FROZEN_POINTS_DYNAMIC = _defaults.NUM_FROZEN_POINTS_DYNAMIC +""" Number of points frozen by default in a DynamicMemoryIndex """ +SATURATE_GRAPH = _defaults.SATURATE_GRAPH +""" Whether to saturate the graph or not. Default is `True` """ +GRAPH_DEGREE = _defaults.GRAPH_DEGREE +""" +Graph degree (a.k.a. `R`) is the maximum degree allowed for a node in the index's graph structure. This degree will be +pruned throughout the course of the index build, but it will never grow beyond this value. Higher R values require +longer index build times, but may result in an index showing excellent recall and latency characteristics. +""" +COMPLEXITY = _defaults.COMPLEXITY +""" +Complexity (a.k.a `L`) references the size of the list we store candidate approximate neighbors in while doing build +or search tasks. It's used during index build as part of the index optimization processes. It's used in index search +classes both to help mitigate poor latencies during cold start, as well as on subsequent queries to conduct the search. +Large values will likely increase latency but also may improve recall, and tuning these values for your particular +index is certainly a reasonable choice. +""" +PQ_DISK_BYTES = _defaults.PQ_DISK_BYTES +""" +Use `0` to store uncompressed data on SSD. This allows the index to asymptote to 100% recall. If your vectors are +too large to store in SSD, this parameter provides the option to compress the vectors using PQ for storing on SSD. +This will trade off recall. You would also want this to be greater than the number of bytes used for the PQ +compressed data stored in-memory. Default is `0`. +""" +USE_PQ_BUILD = _defaults.USE_PQ_BUILD +""" + Whether to use product quantization in the index building process. Product quantization is an approximation +technique that can vastly speed up vector computations and comparisons in a spatial neighborhood, but it is still an +approximation technique. It should be preferred when index creation times take longer than you can afford for your +use case. +""" +NUM_PQ_BYTES = _defaults.NUM_PQ_BYTES +""" +The number of product quantization bytes to use. More bytes requires more resources in both memory and time, but is +like to result in better approximations. +""" +USE_OPQ = _defaults.USE_OPQ +""" Whether to use Optimized Product Quantization or not. """ diff --git a/python/src/diskann_bindings.cpp b/python/src/diskann_bindings.cpp index 613211a0b..8b1378917 100644 --- a/python/src/diskann_bindings.cpp +++ b/python/src/diskann_bindings.cpp @@ -1,549 +1 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. -#include -#include -#include - -#include -#include -#include -#include -#include - -#ifdef _WINDOWS -#include "windows_aligned_file_reader.h" -#else -#include "linux_aligned_file_reader.h" -#endif - -#include "disk_utils.h" -#include "pq_flash_index.h" - -PYBIND11_MAKE_OPAQUE(std::vector); -PYBIND11_MAKE_OPAQUE(std::vector); -PYBIND11_MAKE_OPAQUE(std::vector); -PYBIND11_MAKE_OPAQUE(std::vector); - -namespace py = pybind11; -using namespace diskann; - -template struct DiskANNIndex -{ - PQFlashIndex *pq_flash_index; - std::shared_ptr reader; - - DiskANNIndex(diskann::Metric metric) - { -#ifdef _WINDOWS - reader = std::make_shared(); -#else - reader = std::make_shared(); -#endif - pq_flash_index = new PQFlashIndex(reader, metric); - } - - ~DiskANNIndex() - { - delete pq_flash_index; - } - - auto get_metric() - { - return pq_flash_index->get_metric(); - } - - void cache_bfs_levels(size_t num_nodes_to_cache) - { - std::vector node_list; - pq_flash_index->cache_bfs_levels(num_nodes_to_cache, node_list); - pq_flash_index->load_cache_list(node_list); - } - - void cache_sample_paths(size_t num_nodes_to_cache, const std::string &warmup_query_file, uint32_t num_threads) - { - if (!file_exists(warmup_query_file)) - { - return; - } - - std::vector node_list; - pq_flash_index->generate_cache_list_from_sample_queries(warmup_query_file, 15, 4, num_nodes_to_cache, - num_threads, node_list); - pq_flash_index->load_cache_list(node_list); - } - - int load_index(const std::string &index_path_prefix, const int num_threads, const size_t num_nodes_to_cache, - int cache_mechanism) - { - const std::string index_path = index_path_prefix + std::string("_disk.index"); - int load_success = pq_flash_index->load(num_threads, index_path.c_str()); - if (load_success != 0) - { - return load_success; - } - if (cache_mechanism == 0) - { - // Nothing to do - } - else if (cache_mechanism == 1) - { - std::string sample_file = index_path_prefix + std::string("_sample_data.bin"); - cache_sample_paths(num_nodes_to_cache, sample_file, num_threads); - } - else if (cache_mechanism == 2) - { - cache_bfs_levels(num_nodes_to_cache); - } - return 0; - } - - void search(std::vector &query, const _u64 query_idx, const _u64 dim, const _u64 num_queries, const _u64 knn, - const _u64 l_search, const _u64 beam_width, std::vector &ids, std::vector &dists) - { - QueryStats stats; - if (ids.size() < knn * num_queries) - { - ids.resize(knn * num_queries); - dists.resize(knn * num_queries); - } - std::vector<_u64> _u64_ids(knn); - pq_flash_index->cached_beam_search(query.data() + (query_idx * dim), knn, l_search, _u64_ids.data(), - dists.data() + (query_idx * knn), beam_width, &stats); - for (_u64 i = 0; i < knn; i++) - ids[(query_idx * knn) + i] = _u64_ids[i]; - } - - void batch_search(std::vector &queries, const _u64 dim, const _u64 num_queries, const _u64 knn, - const _u64 l_search, const _u64 beam_width, std::vector &ids, std::vector &dists, - const int num_threads) - { - if (ids.size() < knn * num_queries) - { - ids.resize(knn * num_queries); - dists.resize(knn * num_queries); - } - omp_set_num_threads(num_threads); -#pragma omp parallel for schedule(dynamic, 1) - for (int64_t q = 0; q < num_queries; ++q) - { - std::vector<_u64> u64_ids(knn); - - pq_flash_index->cached_beam_search(queries.data() + q * dim, knn, l_search, u64_ids.data(), - dists.data() + q * knn, beam_width); - for (_u64 i = 0; i < knn; i++) - ids[(q * knn) + i] = u64_ids[i]; - } - } - - auto search_numpy_input(py::array_t &query, const _u64 dim, - const _u64 knn, const _u64 l_search, const _u64 beam_width) - { - py::array_t ids(knn); - py::array_t dists(knn); - - std::vector u32_ids(knn); - std::vector<_u64> u64_ids(knn); - QueryStats stats; - - pq_flash_index->cached_beam_search(query.data(), knn, l_search, u64_ids.data(), dists.mutable_data(), - beam_width, &stats); - - auto r = ids.mutable_unchecked<1>(); - for (_u64 i = 0; i < knn; ++i) - r(i) = (unsigned)u64_ids[i]; - - return std::make_pair(ids, dists); - } - - auto batch_search_numpy_input(py::array_t &queries, const _u64 dim, - const _u64 num_queries, const _u64 knn, const _u64 l_search, const _u64 beam_width, - const int num_threads) - { - py::array_t ids({num_queries, knn}); - py::array_t dists({num_queries, knn}); - - std::vector<_u64> u64_ids(knn * num_queries); - diskann::QueryStats *stats = new diskann::QueryStats[num_queries]; - -#pragma omp parallel for schedule(dynamic, 1) - for (int64_t i = 0; i < num_queries; i++) - { - pq_flash_index->cached_beam_search(queries.data(i), knn, l_search, u64_ids.data() + i * knn, - dists.mutable_data(i), beam_width, stats + i); - } - - auto r = ids.mutable_unchecked(); - for (_u64 i = 0; i < num_queries; ++i) - for (_u64 j = 0; j < knn; ++j) - r(i, j) = (unsigned)u64_ids[i * knn + j]; - - std::unordered_map collective_stats; - collective_stats["mean_latency"] = diskann::get_mean_stats( - stats, num_queries, [](const diskann::QueryStats &stats) { return stats.total_us; }); - collective_stats["latency_999"] = diskann::get_percentile_stats( - stats, num_queries, 0.999, [](const diskann::QueryStats &stats) { return stats.total_us; }); - collective_stats["mean_ssd_ios"] = diskann::get_mean_stats( - stats, num_queries, [](const diskann::QueryStats &stats) { return stats.n_ios; }); - collective_stats["mean_dist_comps"] = diskann::get_mean_stats( - stats, num_queries, [](const diskann::QueryStats &stats) { return stats.n_cmps; }); - delete[] stats; - return std::make_pair(std::make_pair(ids, dists), collective_stats); - } - - auto batch_range_search_numpy_input(py::array_t &queries, - const _u64 dim, const _u64 num_queries, const double range, - const _u64 min_list_size, const _u64 max_list_size, const _u64 beam_width, - const int num_threads) - { - py::array_t offsets(num_queries + 1); - - std::vector> u64_ids(num_queries); - std::vector> dists(num_queries); - - auto offsets_mutable = offsets.mutable_unchecked(); - offsets_mutable(0) = 0; - - diskann::QueryStats *stats = new diskann::QueryStats[num_queries]; - -#pragma omp parallel for schedule(dynamic, 1) - for (int64_t i = 0; i < num_queries; i++) - { - _u32 res_count = pq_flash_index->range_search(queries.data(i), range, min_list_size, max_list_size, - u64_ids[i], dists[i], beam_width, stats + i); - offsets_mutable(i + 1) = res_count; - } - - uint64_t total_res_count = 0; - for (_u64 i = 0; i < num_queries; ++i) - { - total_res_count += offsets_mutable(i + 1); - } - - py::array_t ids(total_res_count); - py::array_t res_dists(total_res_count); - - auto ids_mutable = ids.mutable_unchecked(); - auto res_dists_mutable = res_dists.mutable_unchecked(); - size_t pos = 0; - for (_u64 i = 0; i < num_queries; ++i) - { - for (_u64 j = 0; j < offsets_mutable(i + 1); ++j) - { - ids_mutable(pos) = (unsigned)u64_ids[i][j]; - res_dists_mutable(pos++) = dists[i][j]; - } - offsets_mutable(i + 1) = offsets_mutable(i) + offsets_mutable(i + 1); - } - - std::unordered_map collective_stats; - collective_stats["mean_latency"] = diskann::get_mean_stats( - stats, num_queries, [](const diskann::QueryStats &stats) { return stats.total_us; }); - collective_stats["latency_999"] = diskann::get_percentile_stats( - stats, num_queries, 0.999, [](const diskann::QueryStats &stats) { return stats.total_us; }); - collective_stats["mean_ssd_ios"] = diskann::get_mean_stats( - stats, num_queries, [](const diskann::QueryStats &stats) { return stats.n_ios; }); - collective_stats["mean_dist_comps"] = diskann::get_mean_stats( - stats, num_queries, [](const diskann::QueryStats &stats) { return stats.n_cmps; }); - delete[] stats; - return std::make_pair(std::make_pair(offsets, std::make_pair(ids, res_dists)), collective_stats); - } -}; - -PYBIND11_MODULE(diskannpy, m) -{ - m.doc() = "DiskANN Python Bindings"; -#ifdef VERSION_INFO - m.attr("__version__") = VERSION_INFO; -#else - m.attr("__version__") = "dev"; -#endif - - py::bind_vector>(m, "VectorUnsigned"); - py::bind_vector>(m, "VectorFloat"); - py::bind_vector>(m, "VectorInt8"); - py::bind_vector>(m, "VectorUInt8"); - - py::enum_(m, "Metric") - .value("L2", Metric::L2) - .value("INNER_PRODUCT", Metric::INNER_PRODUCT) - .export_values(); - - py::class_(m, "Parameters") - .def(py::init<>()) - .def( - "set", - [](Parameters &self, const std::string &name, py::object value) { - if (py::isinstance(value)) - { - return self.Set(name, py::cast(value)); - } - else if (py::isinstance(value)) - { - return self.Set(name, py::cast(value)); - } - else if (py::isinstance(value)) - { - return self.Set(name, py::cast(value)); - } - }, - py::arg("name"), py::arg("value")); - - py::class_(m, "Neighbor") - .def(py::init<>()) - .def(py::init()) - .def(py::self < py::self) - .def(py::self == py::self); - - py::class_(m, "AlignedFileReader"); - -#ifdef _WINDOWS - py::class_(m, "WindowsAlignedFileReader").def(py::init<>()); -#else - py::class_(m, "LinuxAlignedFileReader").def(py::init<>()); -#endif - - m.def( - "omp_set_num_threads", [](const size_t num_threads) { omp_set_num_threads(num_threads); }, - py::arg("num_threads") = 1); - - m.def("omp_get_max_threads", []() { return omp_get_max_threads(); }); - - m.def( - "load_aligned_bin_float", - [](const std::string &path, std::vector &data) { - float *data_ptr = nullptr; - size_t num, dims, aligned_dims; - load_aligned_bin(path, data_ptr, num, dims, aligned_dims); - data.assign(data_ptr, data_ptr + num * aligned_dims); - auto l = py::list(3); - l[0] = py::int_(num); - l[1] = py::int_(dims); - l[2] = py::int_(aligned_dims); - aligned_free(data_ptr); - return l; - }, - py::arg("path"), py::arg("data")); - - m.def( - "load_truthset", - [](const std::string &path, std::vector &ids, std::vector &distances) { - unsigned *id_ptr = nullptr; - float *dist_ptr = nullptr; - size_t num, dims; - load_truthset(path, id_ptr, dist_ptr, num, dims); - // TODO: Remove redundant copies. - ids.assign(id_ptr, id_ptr + num * dims); - distances.assign(dist_ptr, dist_ptr + num * dims); - auto l = py::list(2); - l[0] = py::int_(num); - l[1] = py::int_(dims); - delete[] id_ptr; - delete[] dist_ptr; - return l; - }, - py::arg("path"), py::arg("ids"), py::arg("distances")); - - m.def( - "calculate_recall", - [](const unsigned num_queries, std::vector &ground_truth_ids, std::vector &ground_truth_dists, - const unsigned ground_truth_dims, std::vector &results, const unsigned result_dims, - const unsigned recall_at) { - unsigned *gti_ptr = ground_truth_ids.data(); - float *gtd_ptr = ground_truth_dists.data(); - unsigned *r_ptr = results.data(); - - double total_recall = 0; - std::set gt, res; - for (size_t i = 0; i < num_queries; i++) - { - gt.clear(); - res.clear(); - size_t tie_breaker = recall_at; - if (gtd_ptr != nullptr) - { - tie_breaker = recall_at - 1; - float *gt_dist_vec = gtd_ptr + ground_truth_dims * i; - while (tie_breaker < ground_truth_dims && gt_dist_vec[tie_breaker] == gt_dist_vec[recall_at - 1]) - tie_breaker++; - } - - gt.insert(gti_ptr + ground_truth_dims * i, gti_ptr + ground_truth_dims * i + tie_breaker); - res.insert(r_ptr + result_dims * i, r_ptr + result_dims * i + recall_at); - unsigned cur_recall = 0; - for (auto &v : gt) - { - if (res.find(v) != res.end()) - { - cur_recall++; - } - } - total_recall += cur_recall; - } - return py::float_(total_recall / (num_queries) * (100.0 / recall_at)); - }, - py::arg("num_queries"), py::arg("ground_truth_ids"), py::arg("ground_truth_dists"), - py::arg("ground_truth_dims"), py::arg("results"), py::arg("result_dims"), py::arg("recall_at")); - - m.def( - "calculate_recall_numpy_input", - [](const unsigned num_queries, std::vector &ground_truth_ids, std::vector &ground_truth_dists, - const unsigned ground_truth_dims, py::array_t &results, - const unsigned result_dims, const unsigned recall_at) { - unsigned *gti_ptr = ground_truth_ids.data(); - float *gtd_ptr = ground_truth_dists.data(); - unsigned *r_ptr = results.mutable_data(); - - double total_recall = 0; - std::set gt, res; - for (size_t i = 0; i < num_queries; i++) - { - gt.clear(); - res.clear(); - size_t tie_breaker = recall_at; - if (gtd_ptr != nullptr) - { - tie_breaker = recall_at - 1; - float *gt_dist_vec = gtd_ptr + ground_truth_dims * i; - while (tie_breaker < ground_truth_dims && gt_dist_vec[tie_breaker] == gt_dist_vec[recall_at - 1]) - tie_breaker++; - } - - gt.insert(gti_ptr + ground_truth_dims * i, gti_ptr + ground_truth_dims * i + tie_breaker); - res.insert(r_ptr + result_dims * i, r_ptr + result_dims * i + recall_at); - unsigned cur_recall = 0; - for (auto &v : gt) - { - if (res.find(v) != res.end()) - { - cur_recall++; - } - } - total_recall += cur_recall; - } - return py::float_(total_recall / (num_queries) * (100.0 / recall_at)); - }, - py::arg("num_queries"), py::arg("ground_truth_ids"), py::arg("ground_truth_dists"), - py::arg("ground_truth_dims"), py::arg("results"), py::arg("result_dims"), py::arg("recall_at")); - - m.def( - "save_bin_u32", - [](const std::string &file_name, std::vector &data, size_t npts, size_t dims) { - save_bin<_u32>(file_name, data.data(), npts, dims); - }, - py::arg("file_name"), py::arg("data"), py::arg("npts"), py::arg("dims")); - - py::class_>(m, "DiskANNFloatIndex") - .def(py::init([](diskann::Metric metric) { - return std::unique_ptr>(new DiskANNIndex(metric)); - })) - .def("cache_bfs_levels", &DiskANNIndex::cache_bfs_levels, py::arg("num_nodes_to_cache")) - .def("load_index", &DiskANNIndex::load_index, py::arg("index_path_prefix"), py::arg("num_threads"), - py::arg("num_nodes_to_cache"), py::arg("cache_mechanism") = 1) - .def("search", &DiskANNIndex::search, py::arg("query"), py::arg("query_idx"), py::arg("dim"), - py::arg("num_queries"), py::arg("knn"), py::arg("l_search"), py::arg("beam_width"), py::arg("ids"), - py::arg("dists")) - .def("batch_search", &DiskANNIndex::batch_search, py::arg("queries"), py::arg("dim"), - py::arg("num_queries"), py::arg("knn"), py::arg("l_search"), py::arg("beam_width"), py::arg("ids"), - py::arg("dists"), py::arg("num_threads")) - .def("search_numpy_input", &DiskANNIndex::search_numpy_input, py::arg("query"), py::arg("dim"), - py::arg("knn"), py::arg("l_search"), py::arg("beam_width")) - .def("batch_search_numpy_input", &DiskANNIndex::batch_search_numpy_input, py::arg("queries"), - py::arg("dim"), py::arg("num_queries"), py::arg("knn"), py::arg("l_search"), py::arg("beam_width"), - py::arg("num_threads")) - .def("batch_range_search_numpy_input", &DiskANNIndex::batch_range_search_numpy_input, py::arg("queries"), - py::arg("dim"), py::arg("num_queries"), py::arg("range"), py::arg("min_list_size"), - py::arg("max_list_size"), py::arg("beam_width"), py::arg("num_threads")) - .def( - "build", - [](DiskANNIndex &self, const char *data_file_path, const char *index_prefix_path, unsigned R, - unsigned L, double final_index_ram_limit, double indexing_ram_budget, unsigned num_threads, - unsigned pq_disk_bytes) { - std::string params = std::to_string(R) + " " + std::to_string(L) + " " + - std::to_string(final_index_ram_limit) + " " + std::to_string(indexing_ram_budget) + - " " + std::to_string(num_threads); - if (pq_disk_bytes > 0) - { - params = params + " " + std::to_string(pq_disk_bytes); - } - diskann::build_disk_index(data_file_path, index_prefix_path, params.c_str(), self.get_metric()); - }, - py::arg("data_file_path"), py::arg("index_prefix_path"), py::arg("R"), py::arg("L"), - py::arg("final_index_ram_limit"), py::arg("indexing_ram_limit"), py::arg("num_threads"), - py::arg("pq_disk_bytes") = 0); - - py::class_>(m, "DiskANNInt8Index") - .def(py::init([](diskann::Metric metric) { - return std::unique_ptr>(new DiskANNIndex(metric)); - })) - .def("cache_bfs_levels", &DiskANNIndex::cache_bfs_levels, py::arg("num_nodes_to_cache")) - .def("load_index", &DiskANNIndex::load_index, py::arg("index_path_prefix"), py::arg("num_threads"), - py::arg("num_nodes_to_cache"), py::arg("cache_mechanism") = 1) - .def("search", &DiskANNIndex::search, py::arg("query"), py::arg("query_idx"), py::arg("dim"), - py::arg("num_queries"), py::arg("knn"), py::arg("l_search"), py::arg("beam_width"), py::arg("ids"), - py::arg("dists")) - .def("batch_search", &DiskANNIndex::batch_search, py::arg("queries"), py::arg("dim"), - py::arg("num_queries"), py::arg("knn"), py::arg("l_search"), py::arg("beam_width"), py::arg("ids"), - py::arg("dists"), py::arg("num_threads")) - .def("search_numpy_input", &DiskANNIndex::search_numpy_input, py::arg("query"), py::arg("dim"), - py::arg("knn"), py::arg("l_search"), py::arg("beam_width")) - .def("batch_search_numpy_input", &DiskANNIndex::batch_search_numpy_input, py::arg("queries"), - py::arg("dim"), py::arg("num_queries"), py::arg("knn"), py::arg("l_search"), py::arg("beam_width"), - py::arg("num_threads")) - .def("batch_range_search_numpy_input", &DiskANNIndex::batch_range_search_numpy_input, - py::arg("queries"), py::arg("dim"), py::arg("num_queries"), py::arg("range"), py::arg("min_list_size"), - py::arg("max_list_size"), py::arg("beam_width"), py::arg("num_threads")) - .def( - "build", - [](DiskANNIndex &self, const char *data_file_path, const char *index_prefix_path, unsigned R, - unsigned L, double final_index_ram_limit, double indexing_ram_budget, unsigned num_threads, - unsigned pq_disk_bytes) { - std::string params = std::to_string(R) + " " + std::to_string(L) + " " + - std::to_string(final_index_ram_limit) + " " + std::to_string(indexing_ram_budget) + - " " + std::to_string(num_threads); - if (pq_disk_bytes > 0) - params = params + " " + std::to_string(pq_disk_bytes); - diskann::build_disk_index(data_file_path, index_prefix_path, params.c_str(), self.get_metric()); - }, - py::arg("data_file_path"), py::arg("index_prefix_path"), py::arg("R"), py::arg("L"), - py::arg("final_index_ram_limit"), py::arg("indexing_ram_limit"), py::arg("num_threads"), - py::arg("pq_disk_bytes") = 0); - - py::class_>(m, "DiskANNUInt8Index") - .def(py::init([](diskann::Metric metric) { - return std::unique_ptr>(new DiskANNIndex(metric)); - })) - .def("cache_bfs_levels", &DiskANNIndex::cache_bfs_levels, py::arg("num_nodes_to_cache")) - .def("load_index", &DiskANNIndex::load_index, py::arg("index_path_prefix"), py::arg("num_threads"), - py::arg("num_nodes_to_cache"), py::arg("cache_mechanism") = 1) - .def("search", &DiskANNIndex::search, py::arg("query"), py::arg("query_idx"), py::arg("dim"), - py::arg("num_queries"), py::arg("knn"), py::arg("l_search"), py::arg("beam_width"), py::arg("ids"), - py::arg("dists")) - .def("batch_search", &DiskANNIndex::batch_search, py::arg("queries"), py::arg("dim"), - py::arg("num_queries"), py::arg("knn"), py::arg("l_search"), py::arg("beam_width"), py::arg("ids"), - py::arg("dists"), py::arg("num_threads")) - .def("search_numpy_input", &DiskANNIndex::search_numpy_input, py::arg("query"), py::arg("dim"), - py::arg("knn"), py::arg("l_search"), py::arg("beam_width")) - .def("batch_search_numpy_input", &DiskANNIndex::batch_search_numpy_input, py::arg("queries"), - py::arg("dim"), py::arg("num_queries"), py::arg("knn"), py::arg("l_search"), py::arg("beam_width"), - py::arg("num_threads")) - .def("batch_range_search_numpy_input", &DiskANNIndex::batch_range_search_numpy_input, - py::arg("queries"), py::arg("dim"), py::arg("num_queries"), py::arg("range"), py::arg("min_list_size"), - py::arg("max_list_size"), py::arg("beam_width"), py::arg("num_threads")) - .def( - "build", - [](DiskANNIndex &self, const char *data_file_path, const char *index_prefix_path, unsigned R, - unsigned L, double final_index_ram_limit, double indexing_ram_budget, unsigned num_threads, - unsigned pq_disk_bytes) { - std::string params = std::to_string(R) + " " + std::to_string(L) + " " + - std::to_string(final_index_ram_limit) + " " + std::to_string(indexing_ram_budget) + - " " + std::to_string(num_threads); - if (pq_disk_bytes > 0) - params = params + " " + std::to_string(pq_disk_bytes); - diskann::build_disk_index(data_file_path, index_prefix_path, params.c_str(), - self.get_metric()); - }, - py::arg("data_file_path"), py::arg("index_prefix_path"), py::arg("R"), py::arg("L"), - py::arg("final_index_ram_limit"), py::arg("indexing_ram_limit"), py::arg("num_threads"), - py::arg("pq_disk_bytes") = 0); -} diff --git a/python/src/dynamic_memory_index.cpp b/python/src/dynamic_memory_index.cpp new file mode 100644 index 000000000..af276b85f --- /dev/null +++ b/python/src/dynamic_memory_index.cpp @@ -0,0 +1,171 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "parameters.h" +#include "dynamic_memory_index.h" + +#include "pybind11/numpy.h" + +namespace diskannpy +{ + +diskann::IndexWriteParameters dynamic_index_write_parameters(const uint32_t complexity, const uint32_t graph_degree, + const bool saturate_graph, + const uint32_t max_occlusion_size, const float alpha, + const uint32_t num_threads, + const uint32_t filter_complexity, + const uint32_t num_frozen_points) +{ + return diskann::IndexWriteParametersBuilder(complexity, graph_degree) + .with_saturate_graph(saturate_graph) + .with_max_occlusion_size(max_occlusion_size) + .with_alpha(alpha) + .with_num_threads(num_threads) + .with_filter_list_size(filter_complexity) + .with_num_frozen_points(num_frozen_points) + .build(); +} + +template +diskann::Index dynamic_index_builder(const diskann::Metric m, + const diskann::IndexWriteParameters &write_params, + const size_t dimensions, const size_t max_vectors, + const uint32_t initial_search_complexity, + const uint32_t initial_search_threads, + const bool concurrent_consolidation) +{ + const uint32_t _initial_search_threads = + initial_search_threads != 0 ? initial_search_threads : omp_get_num_threads(); + return diskann::Index( + m, dimensions, max_vectors, + true, // dynamic_index + write_params, // used for insert + initial_search_complexity, // used to prepare the scratch space for searching. can / may + // be expanded if the search asks for a larger L. + _initial_search_threads, // also used for the scratch space + true, // enable_tags + concurrent_consolidation, + false, // pq_dist_build + 0, // num_pq_chunks + false); // use_opq = false +} + +template +DynamicMemoryIndex
::DynamicMemoryIndex(const diskann::Metric m, const size_t dimensions, const size_t max_vectors, + const uint32_t complexity, const uint32_t graph_degree, + const bool saturate_graph, const uint32_t max_occlusion_size, + const float alpha, const uint32_t num_threads, + const uint32_t filter_complexity, const uint32_t num_frozen_points, + const uint32_t initial_search_complexity, + const uint32_t initial_search_threads, const bool concurrent_consolidation) + : _initial_search_complexity(initial_search_complexity != 0 ? initial_search_complexity : complexity), + _write_parameters(dynamic_index_write_parameters(complexity, graph_degree, saturate_graph, max_occlusion_size, + alpha, num_threads, filter_complexity, num_frozen_points)), + _index(dynamic_index_builder
(m, _write_parameters, dimensions, max_vectors, _initial_search_complexity, + initial_search_threads, concurrent_consolidation)) +{ +} + +template void DynamicMemoryIndex
::load(const std::string &index_path) +{ + const std::string tags_file = index_path + ".tags"; + if (!file_exists(tags_file)) + { + throw std::runtime_error("tags file not found at expected path: " + tags_file); + } + _index.load(index_path.c_str(), _write_parameters.num_threads, _initial_search_complexity); +} + +template +int DynamicMemoryIndex
::insert(const py::array_t &vector, + const DynamicIdType id) +{ + return _index.insert_point(vector.data(), id); +} + +template +py::array_t DynamicMemoryIndex
::batch_insert( + py::array_t &vectors, + py::array_t &ids, const int32_t num_inserts, + const int num_threads) +{ + if (num_threads == 0) + omp_set_num_threads(omp_get_num_procs()); + else + omp_set_num_threads(num_threads); + py::array_t insert_retvals(num_inserts); + +#pragma omp parallel for schedule(dynamic, 1) default(none) shared(num_inserts, insert_retvals, vectors, ids) + for (int32_t i = 0; i < num_inserts; i++) + { + insert_retvals.mutable_data()[i] = _index.insert_point(vectors.data(i), *(ids.data(i))); + } + + return insert_retvals; +} + +template int DynamicMemoryIndex
::mark_deleted(const DynamicIdType id) +{ + return this->_index.lazy_delete(id); +} + +template void DynamicMemoryIndex
::save(const std::string &save_path, const bool compact_before_save) +{ + if (save_path.empty()) + { + throw std::runtime_error("A save_path must be provided"); + } + _index.save(save_path.c_str(), compact_before_save); +} + +template +NeighborsAndDistances DynamicMemoryIndex
::search( + py::array_t &query, const uint64_t knn, const uint64_t complexity) +{ + py::array_t ids(knn); + py::array_t dists(knn); + std::vector
empty_vector; + _index.search_with_tags(query.data(), knn, complexity, ids.mutable_data(), dists.mutable_data(), empty_vector); + return std::make_pair(ids, dists); +} + +template +NeighborsAndDistances DynamicMemoryIndex
::batch_search( + py::array_t &queries, const uint64_t num_queries, const uint64_t knn, + const uint64_t complexity, const uint32_t num_threads) +{ + py::array_t ids({num_queries, knn}); + py::array_t dists({num_queries, knn}); + std::vector
empty_vector; + + if (num_threads == 0) + omp_set_num_threads(omp_get_num_procs()); + else + omp_set_num_threads(static_cast(num_threads)); + +#pragma omp parallel for schedule(dynamic, 1) default(none) \ + shared(num_queries, queries, knn, complexity, ids, dists, empty_vector) + for (int64_t i = 0; i < (int64_t)num_queries; i++) + { + _index.search_with_tags(queries.data(i), knn, complexity, ids.mutable_data(i), dists.mutable_data(i), + empty_vector); + } + + return std::make_pair(ids, dists); +} + +template void DynamicMemoryIndex
::consolidate_delete() +{ + _index.consolidate_deletes(_write_parameters); +} + +template size_t DynamicMemoryIndex
::num_points() +{ + return _index.get_num_points(); +} + +template class DynamicMemoryIndex; +template class DynamicMemoryIndex; +template class DynamicMemoryIndex; + +}; // namespace diskannpy diff --git a/python/src/module.cpp b/python/src/module.cpp new file mode 100644 index 000000000..7aea9fc03 --- /dev/null +++ b/python/src/module.cpp @@ -0,0 +1,134 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include + +#include +#include + +#include "defaults.h" +#include "distance.h" + +#include "builder.h" +#include "dynamic_memory_index.h" +#include "static_disk_index.h" +#include "static_memory_index.h" + +PYBIND11_MAKE_OPAQUE(std::vector); +PYBIND11_MAKE_OPAQUE(std::vector); +PYBIND11_MAKE_OPAQUE(std::vector); +PYBIND11_MAKE_OPAQUE(std::vector); + +namespace py = pybind11; +using namespace pybind11::literals; + +struct Variant +{ + std::string disk_builder_name; + std::string memory_builder_name; + std::string dynamic_memory_index_name; + std::string static_memory_index_name; + std::string static_disk_index_name; +}; + +const Variant FloatVariant{"build_disk_float_index", "build_memory_float_index", "DynamicMemoryFloatIndex", + "StaticMemoryFloatIndex", "StaticDiskFloatIndex"}; + +const Variant UInt8Variant{"build_disk_uint8_index", "build_memory_uint8_index", "DynamicMemoryUInt8Index", + "StaticMemoryUInt8Index", "StaticDiskUInt8Index"}; + +const Variant Int8Variant{"build_disk_int8_index", "build_memory_int8_index", "DynamicMemoryInt8Index", + "StaticMemoryInt8Index", "StaticDiskInt8Index"}; + +template inline void add_variant(py::module_ &m, const Variant &variant) +{ + m.def(variant.disk_builder_name.c_str(), &diskannpy::build_disk_index, "distance_metric"_a, "data_file_path"_a, + "index_prefix_path"_a, "complexity"_a, "graph_degree"_a, "final_index_ram_limit"_a, "indexing_ram_budget"_a, + "num_threads"_a, "pq_disk_bytes"_a); + + m.def(variant.memory_builder_name.c_str(), &diskannpy::build_memory_index, "distance_metric"_a, + "data_file_path"_a, "index_output_path"_a, "graph_degree"_a, "complexity"_a, "alpha"_a, "num_threads"_a, + "use_pq_build"_a, "num_pq_bytes"_a, "use_opq"_a, "filter_complexity"_a = 0, "use_tags"_a = false); + + py::class_>(m, variant.static_memory_index_name.c_str()) + .def(py::init(), + "distance_metric"_a, "index_path"_a, "num_points"_a, "dimensions"_a, "num_threads"_a, + "initial_search_complexity"_a) + .def("search", &diskannpy::StaticMemoryIndex::search, "query"_a, "knn"_a, "complexity"_a) + .def("batch_search", &diskannpy::StaticMemoryIndex::batch_search, "queries"_a, "num_queries"_a, "knn"_a, + "complexity"_a, "num_threads"_a); + + py::class_>(m, variant.dynamic_memory_index_name.c_str()) + .def(py::init(), + "distance_metric"_a, "dimensions"_a, "max_vectors"_a, "complexity"_a, "graph_degree"_a, + "saturate_graph"_a = diskann::defaults::SATURATE_GRAPH, + "max_occlusion_size"_a = diskann::defaults::MAX_OCCLUSION_SIZE, "alpha"_a = diskann::defaults::ALPHA, + "num_threads"_a = diskann::defaults::NUM_THREADS, + "filter_complexity"_a = diskann::defaults::FILTER_LIST_SIZE, + "num_frozen_points"_a = diskann::defaults::NUM_FROZEN_POINTS_DYNAMIC, "initial_search_complexity"_a = 0, + "search_threads"_a = 0, "concurrent_consolidation"_a = true) + .def("search", &diskannpy::DynamicMemoryIndex::search, "query"_a, "knn"_a, "complexity"_a) + .def("load", &diskannpy::DynamicMemoryIndex::load, "index_path"_a) + .def("batch_search", &diskannpy::DynamicMemoryIndex::batch_search, "queries"_a, "num_queries"_a, "knn"_a, + "complexity"_a, "num_threads"_a) + .def("batch_insert", &diskannpy::DynamicMemoryIndex::batch_insert, "vectors"_a, "ids"_a, "num_inserts"_a, + "num_threads"_a) + .def("save", &diskannpy::DynamicMemoryIndex::save, "save_path"_a = "", "compact_before_save"_a = false) + .def("insert", &diskannpy::DynamicMemoryIndex::insert, "vector"_a, "id"_a) + .def("mark_deleted", &diskannpy::DynamicMemoryIndex::mark_deleted, "id"_a) + .def("consolidate_delete", &diskannpy::DynamicMemoryIndex::consolidate_delete) + .def("num_points", &diskannpy::DynamicMemoryIndex::num_points); + + py::class_>(m, variant.static_disk_index_name.c_str()) + .def(py::init(), + "distance_metric"_a, "index_path_prefix"_a, "num_threads"_a, "num_nodes_to_cache"_a, + "cache_mechanism"_a = 1) + .def("cache_bfs_levels", &diskannpy::StaticDiskIndex::cache_bfs_levels, "num_nodes_to_cache"_a) + .def("search", &diskannpy::StaticDiskIndex::search, "query"_a, "knn"_a, "complexity"_a, "beam_width"_a) + .def("batch_search", &diskannpy::StaticDiskIndex::batch_search, "queries"_a, "num_queries"_a, "knn"_a, + "complexity"_a, "beam_width"_a, "num_threads"_a); +} + +PYBIND11_MODULE(_diskannpy, m) +{ + m.doc() = "DiskANN Python Bindings"; +#ifdef VERSION_INFO + m.attr("__version__") = VERSION_INFO; +#else + m.attr("__version__") = "dev"; +#endif + + // let's re-export our defaults + py::module_ default_values = m.def_submodule( + "defaults", + "A collection of the default values used for common diskann operations. `GRAPH_DEGREE` and `COMPLEXITY` are not" + " set as defaults, but some semi-reasonable default values are selected for your convenience. We urge you to " + "investigate their meaning and adjust them for your use cases."); + + default_values.attr("ALPHA") = diskann::defaults::ALPHA; + default_values.attr("NUM_THREADS") = diskann::defaults::NUM_THREADS; + default_values.attr("MAX_OCCLUSION_SIZE") = diskann::defaults::MAX_OCCLUSION_SIZE; + default_values.attr("FILTER_COMPLEXITY") = diskann::defaults::FILTER_LIST_SIZE; + default_values.attr("NUM_FROZEN_POINTS_STATIC") = diskann::defaults::NUM_FROZEN_POINTS_STATIC; + default_values.attr("NUM_FROZEN_POINTS_DYNAMIC") = diskann::defaults::NUM_FROZEN_POINTS_DYNAMIC; + default_values.attr("SATURATE_GRAPH") = diskann::defaults::SATURATE_GRAPH; + default_values.attr("GRAPH_DEGREE") = diskann::defaults::MAX_DEGREE; + default_values.attr("COMPLEXITY") = diskann::defaults::BUILD_LIST_SIZE; + default_values.attr("PQ_DISK_BYTES") = (uint32_t)0; + default_values.attr("USE_PQ_BUILD") = false; + default_values.attr("NUM_PQ_BYTES") = (uint32_t)0; + default_values.attr("USE_OPQ") = false; + + add_variant(m, FloatVariant); + add_variant(m, UInt8Variant); + add_variant(m, Int8Variant); + + py::enum_(m, "Metric") + .value("L2", diskann::Metric::L2) + .value("INNER_PRODUCT", diskann::Metric::INNER_PRODUCT) + .value("COSINE", diskann::Metric::COSINE) + .export_values(); +} diff --git a/python/src/py.typed b/python/src/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/python/src/static_disk_index.cpp b/python/src/static_disk_index.cpp new file mode 100644 index 000000000..654f8ec30 --- /dev/null +++ b/python/src/static_disk_index.cpp @@ -0,0 +1,108 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "static_disk_index.h" + +#include "pybind11/numpy.h" + +namespace diskannpy +{ + +template +StaticDiskIndex
::StaticDiskIndex(const diskann::Metric metric, const std::string &index_path_prefix, + const uint32_t num_threads, const size_t num_nodes_to_cache, + const uint32_t cache_mechanism) + : _reader(std::make_shared()), _index(_reader, metric) +{ + int load_success = _index.load(num_threads, index_path_prefix.c_str()); + if (load_success != 0) + { + throw std::runtime_error("index load failed."); + } + if (cache_mechanism == 1) + { + std::string sample_file = index_path_prefix + std::string("_sample_data.bin"); + cache_sample_paths(num_nodes_to_cache, sample_file, num_threads); + } + else if (cache_mechanism == 2) + { + cache_bfs_levels(num_nodes_to_cache); + } +} + +template void StaticDiskIndex
::cache_bfs_levels(const size_t num_nodes_to_cache) +{ + std::vector node_list; + _index.cache_bfs_levels(num_nodes_to_cache, node_list); + _index.load_cache_list(node_list); +} + +template +void StaticDiskIndex
::cache_sample_paths(const size_t num_nodes_to_cache, const std::string &warmup_query_file, + const uint32_t num_threads) +{ + if (!file_exists(warmup_query_file)) + { + return; + } + + std::vector node_list; + _index.generate_cache_list_from_sample_queries(warmup_query_file, 15, 4, num_nodes_to_cache, num_threads, + node_list); + _index.load_cache_list(node_list); +} + +template +NeighborsAndDistances StaticDiskIndex
::search( + py::array_t &query, const uint64_t knn, const uint64_t complexity, + const uint64_t beam_width) +{ + py::array_t ids(knn); + py::array_t dists(knn); + + std::vector u32_ids(knn); + std::vector u64_ids(knn); + diskann::QueryStats stats; + + _index.cached_beam_search(query.data(), knn, complexity, u64_ids.data(), dists.mutable_data(), beam_width, false, + &stats); + + auto r = ids.mutable_unchecked<1>(); + for (uint64_t i = 0; i < knn; ++i) + r(i) = (unsigned)u64_ids[i]; + + return std::make_pair(ids, dists); +} + +template +NeighborsAndDistances StaticDiskIndex
::batch_search( + py::array_t &queries, const uint64_t num_queries, const uint64_t knn, + const uint64_t complexity, const uint64_t beam_width, const uint32_t num_threads) +{ + py::array_t ids({num_queries, knn}); + py::array_t dists({num_queries, knn}); + + omp_set_num_threads(num_threads); + + std::vector u64_ids(knn * num_queries); + +#pragma omp parallel for schedule(dynamic, 1) default(none) \ + shared(num_queries, queries, knn, complexity, u64_ids, dists, beam_width) + for (int64_t i = 0; i < (int64_t)num_queries; i++) + { + _index.cached_beam_search(queries.data(i), knn, complexity, u64_ids.data() + i * knn, dists.mutable_data(i), + beam_width); + } + + auto r = ids.mutable_unchecked(); + for (uint64_t i = 0; i < num_queries; ++i) + for (uint64_t j = 0; j < knn; ++j) + r(i, j) = (uint32_t)u64_ids[i * knn + j]; + + return std::make_pair(ids, dists); +} + +template class StaticDiskIndex; +template class StaticDiskIndex; +template class StaticDiskIndex; +} // namespace diskannpy \ No newline at end of file diff --git a/python/src/static_memory_index.cpp b/python/src/static_memory_index.cpp new file mode 100644 index 000000000..3bd927174 --- /dev/null +++ b/python/src/static_memory_index.cpp @@ -0,0 +1,77 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "static_memory_index.h" + +#include "pybind11/numpy.h" + +namespace diskannpy +{ + +template +diskann::Index static_index_builder(const diskann::Metric m, const size_t num_points, + const size_t dimensions, + const uint32_t initial_search_complexity) +{ + if (initial_search_complexity == 0) + { + throw std::runtime_error("initial_search_complexity must be a positive uint32_t"); + } + + return diskann::Index
(m, dimensions, num_points, + false, // not a dynamic_index + false, // no enable_tags/ids + false, // no concurrent_consolidate, + false, // pq_dist_build + 0, // num_pq_chunks + false, // use_opq = false + 0); // num_frozen_points +} + +template +StaticMemoryIndex
::StaticMemoryIndex(const diskann::Metric m, const std::string &index_prefix, + const size_t num_points, const size_t dimensions, const uint32_t num_threads, + const uint32_t initial_search_complexity) + : _index(static_index_builder
(m, num_points, dimensions, initial_search_complexity)) +{ + const uint32_t _num_threads = num_threads != 0 ? num_threads : omp_get_num_threads(); + _index.load(index_prefix.c_str(), _num_threads, initial_search_complexity); +} + +template +NeighborsAndDistances StaticMemoryIndex
::search( + py::array_t &query, const uint64_t knn, const uint64_t complexity) +{ + py::array_t ids(knn); + py::array_t dists(knn); + std::vector
empty_vector; + _index.search(query.data(), knn, complexity, ids.mutable_data(), dists.mutable_data()); + return std::make_pair(ids, dists); +} + +template +NeighborsAndDistances StaticMemoryIndex
::batch_search( + py::array_t &queries, const uint64_t num_queries, const uint64_t knn, + const uint64_t complexity, const uint32_t num_threads) +{ + const uint32_t _num_threads = num_threads != 0 ? num_threads : omp_get_num_threads(); + py::array_t ids({num_queries, knn}); + py::array_t dists({num_queries, knn}); + std::vector
empty_vector; + + omp_set_num_threads(static_cast(_num_threads)); + +#pragma omp parallel for schedule(dynamic, 1) default(none) shared(num_queries, queries, knn, complexity, ids, dists) + for (int64_t i = 0; i < (int64_t)num_queries; i++) + { + _index.search(queries.data(i), knn, complexity, ids.mutable_data(i), dists.mutable_data(i)); + } + + return std::make_pair(ids, dists); +} + +template class StaticMemoryIndex; +template class StaticMemoryIndex; +template class StaticMemoryIndex; + +} // namespace diskannpy \ No newline at end of file diff --git a/python/tests/fixtures/__init__.py b/python/tests/fixtures/__init__.py new file mode 100644 index 000000000..4aeb96087 --- /dev/null +++ b/python/tests/fixtures/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +from .build_memory_index import build_random_vectors_and_memory_index +from .create_test_data import random_vectors, vectors_as_temp_file, write_vectors +from .recall import calculate_recall diff --git a/python/tests/fixtures/build_memory_index.py b/python/tests/fixtures/build_memory_index.py new file mode 100644 index 000000000..3c30bed25 --- /dev/null +++ b/python/tests/fixtures/build_memory_index.py @@ -0,0 +1,51 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import os +from tempfile import mkdtemp + +import diskannpy as dap +import numpy as np + +from .create_test_data import random_vectors + + +def build_random_vectors_and_memory_index( + dtype, metric, with_tags: bool = False, index_prefix: str = "ann", seed: int = 12345 +): + query_vectors: np.ndarray = random_vectors(1000, 10, dtype=dtype, seed=seed) + index_vectors: np.ndarray = random_vectors(10000, 10, dtype=dtype, seed=seed) + ann_dir = mkdtemp() + + if with_tags: + rng = np.random.default_rng(seed) + tags = np.arange(start=1, stop=10001, dtype=np.uint32) + rng.shuffle(tags) + else: + tags = "" + + dap.build_memory_index( + data=index_vectors, + distance_metric=metric, + index_directory=ann_dir, + graph_degree=16, + complexity=32, + alpha=1.2, + num_threads=0, + use_pq_build=False, + num_pq_bytes=8, + use_opq=False, + filter_complexity=32, + tags=tags, + index_prefix=index_prefix, + ) + + return ( + metric, + dtype, + query_vectors, + index_vectors, + ann_dir, + os.path.join(ann_dir, "vectors.bin"), + tags, + ) diff --git a/python/tests/fixtures/create_test_data.py b/python/tests/fixtures/create_test_data.py new file mode 100644 index 000000000..44e413ed6 --- /dev/null +++ b/python/tests/fixtures/create_test_data.py @@ -0,0 +1,40 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +from contextlib import contextmanager +from pathlib import Path +from tempfile import NamedTemporaryFile +from typing import BinaryIO + +import numpy as np + + +def random_vectors(rows: int, dimensions: int, dtype, seed: int = 12345) -> np.ndarray: + rng = np.random.default_rng(seed) + if dtype == np.float32: + vectors = rng.random((rows, dimensions), dtype=dtype) + elif dtype == np.uint8: + vectors = rng.integers( + low=0, high=256, size=(rows, dimensions), dtype=dtype + ) # low is inclusive, high is exclusive + elif dtype == np.int8: + vectors = rng.integers( + low=-128, high=128, size=(rows, dimensions), dtype=dtype + ) # low is inclusive, high is exclusive + else: + raise RuntimeError("Only np.float32, np.int8, and np.uint8 are supported") + return vectors + + +def write_vectors(file_handler: BinaryIO, vectors: np.ndarray): + _ = file_handler.write(np.array(vectors.shape, dtype=np.int32).tobytes()) + _ = file_handler.write(vectors.tobytes()) + + +@contextmanager +def vectors_as_temp_file(vectors: np.ndarray) -> str: + temp = NamedTemporaryFile(mode="wb", delete=False) + write_vectors(temp, vectors) + temp.close() + yield temp.name + Path(temp.name).unlink() diff --git a/python/tests/fixtures/recall.py b/python/tests/fixtures/recall.py new file mode 100644 index 000000000..03f38f37c --- /dev/null +++ b/python/tests/fixtures/recall.py @@ -0,0 +1,24 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import numpy as np + + +def calculate_recall( + result_set_indices: np.ndarray, truth_set_indices: np.ndarray, recall_at: int = 5 +) -> float: + """ + result_set_indices and truth_set_indices correspond by row index. the columns in each row contain the indices of + the nearest neighbors, with result_set_indices being the approximate nearest neighbor results and truth_set_indices + being the brute force nearest neighbor calculation via sklearn's NearestNeighbor class. + :param result_set_indices: + :param truth_set_indices: + :param recall_at: + :return: + """ + found = 0 + for i in range(0, result_set_indices.shape[0]): + result_set_set = set(result_set_indices[i][0:recall_at]) + truth_set_set = set(truth_set_indices[i][0:recall_at]) + found += len(result_set_set.intersection(truth_set_set)) + return found / (result_set_indices.shape[0] * recall_at) diff --git a/python/tests/test_build_disk_index.py b/python/tests/test_build_disk_index.py deleted file mode 100644 index 2c7c304ed..000000000 --- a/python/tests/test_build_disk_index.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT license. - -import time -import argparse -import diskannpy -from diskannpy import Metric, Parameters, DiskANNFloatIndex - - -parser = argparse.ArgumentParser() -parser.add_argument('data_path', type=str, help='Path to the input base set of vectors.') -parser.add_argument('save_path', type=str, help='Path to the built index.') -parser.add_argument('R', type=int, help='Graph degree.') -parser.add_argument('L', type=int, help='Index build complexity.') -parser.add_argument('B', type=float, help='Memory budget in GB for the final index.') -parser.add_argument('M', type=float, help='Memory budget in GB for the index construction.') -parser.add_argument('T', type=int, help='Number of threads for index construction.') - -args = parser.parse_args() - -start = time.time() -index = DiskANNFloatIndex(diskannpy.L2) -index.build(args.data_path, args.save_path, args.R, args.L, args.B, args.M, args.T) -end = time.time() - -print("Indexing Time: " + str(end - start) + " seconds") \ No newline at end of file diff --git a/python/tests/test_builder.py b/python/tests/test_builder.py new file mode 100644 index 000000000..cc484c938 --- /dev/null +++ b/python/tests/test_builder.py @@ -0,0 +1,137 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import unittest + +import diskannpy as dap +import numpy as np + + +class TestBuildDiskIndex(unittest.TestCase): + def test_valid_shape(self): + rng = np.random.default_rng(12345) + rando = rng.random((1000, 100, 5), dtype=np.single) + with self.assertRaises(ValueError): + dap.build_disk_index( + data=rando, + distance_metric="l2", + index_directory="test", + complexity=5, + graph_degree=5, + search_memory_maximum=0.01, + build_memory_maximum=0.01, + num_threads=1, + pq_disk_bytes=0, + ) + + rando = rng.random(1000, dtype=np.single) + with self.assertRaises(ValueError): + dap.build_disk_index( + data=rando, + distance_metric="l2", + index_directory="test", + complexity=5, + graph_degree=5, + search_memory_maximum=0.01, + build_memory_maximum=0.01, + num_threads=1, + pq_disk_bytes=0, + ) + + def test_value_ranges_build(self): + good_ranges = { + "vector_dtype": np.single, + "distance_metric": "l2", + "graph_degree": 5, + "complexity": 5, + "search_memory_maximum": 0.01, + "build_memory_maximum": 0.01, + "num_threads": 1, + "pq_disk_bytes": 0, + } + bad_ranges = { + "vector_dtype": np.float64, + "distance_metric": "soups this time", + "graph_degree": -1, + "complexity": -1, + "search_memory_maximum": 0, + "build_memory_maximum": 0, + "num_threads": -1, + "pq_disk_bytes": -1, + } + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest( + f"testing bad value key: {bad_value_key} with bad value: {bad_ranges[bad_value_key]}" + ): + with self.assertRaises(ValueError): + dap.build_disk_index(data="test", index_directory="test", **kwargs) + + +class TestBuildMemoryIndex(unittest.TestCase): + def test_valid_shape(self): + rng = np.random.default_rng(12345) + rando = rng.random((1000, 100, 5), dtype=np.single) + with self.assertRaises(ValueError): + dap.build_memory_index( + data=rando, + distance_metric="l2", + index_directory="test", + complexity=5, + graph_degree=5, + alpha=1.2, + num_threads=1, + use_pq_build=False, + num_pq_bytes=0, + use_opq=False, + ) + + rando = rng.random(1000, dtype=np.single) + with self.assertRaises(ValueError): + dap.build_memory_index( + data=rando, + distance_metric="l2", + index_directory="test", + complexity=5, + graph_degree=5, + alpha=1.2, + num_threads=1, + use_pq_build=False, + num_pq_bytes=0, + use_opq=False, + ) + + def test_value_ranges_build(self): + good_ranges = { + "vector_dtype": np.single, + "distance_metric": "l2", + "graph_degree": 5, + "complexity": 5, + "alpha": 1.2, + "num_threads": 1, + "num_pq_bytes": 0, + } + bad_ranges = { + "vector_dtype": np.float64, + "distance_metric": "soups this time", + "graph_degree": -1, + "complexity": -1, + "alpha": -1.2, + "num_threads": 1, + "num_pq_bytes": -60, + } + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest( + f"testing bad value key: {bad_value_key} with bad value: {bad_ranges[bad_value_key]}" + ): + with self.assertRaises(ValueError): + dap.build_memory_index( + data="test", + index_directory="test", + use_pq_build=True, + use_opq=False, + **kwargs, + ) diff --git a/python/tests/test_dynamic_memory_index.py b/python/tests/test_dynamic_memory_index.py new file mode 100644 index 000000000..ff9c8981d --- /dev/null +++ b/python/tests/test_dynamic_memory_index.py @@ -0,0 +1,440 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import shutil +import tempfile +import unittest +import warnings + +import diskannpy as dap +import numpy as np +from fixtures import build_random_vectors_and_memory_index +from sklearn.neighbors import NearestNeighbors + + +def _calculate_recall( + result_set_tags: np.ndarray, + original_indices_to_tags: np.ndarray, + truth_set_indices: np.ndarray, + recall_at: int = 5, +) -> float: + found = 0 + for i in range(0, result_set_tags.shape[0]): + result_set_set = set(result_set_tags[i][0:recall_at]) + truth_set_set = set() + for knn_index in truth_set_indices[i][0:recall_at]: + truth_set_set.add( + original_indices_to_tags[knn_index] + ) # mapped into our tag number instead + found += len(result_set_set.intersection(truth_set_set)) + return found / (result_set_tags.shape[0] * recall_at) + + +class TestDynamicMemoryIndex(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + cls._test_matrix = [ + build_random_vectors_and_memory_index(np.float32, "l2", with_tags=True), + build_random_vectors_and_memory_index(np.uint8, "l2", with_tags=True), + build_random_vectors_and_memory_index(np.int8, "l2", with_tags=True), + build_random_vectors_and_memory_index(np.float32, "cosine", with_tags=True), + build_random_vectors_and_memory_index(np.uint8, "cosine", with_tags=True), + build_random_vectors_and_memory_index(np.int8, "cosine", with_tags=True), + ] + cls._example_ann_dir = cls._test_matrix[0][4] + + @classmethod + def tearDownClass(cls) -> None: + for test in cls._test_matrix: + try: + ann_dir = test[4] + shutil.rmtree(ann_dir, ignore_errors=True) + except: + pass + + def test_recall_and_batch(self): + for ( + metric, + dtype, + query_vectors, + index_vectors, + ann_dir, + vector_bin_file, + generated_tags, + ) in self._test_matrix: + with self.subTest(msg=f"Testing dtype {dtype}"): + index = dap.DynamicMemoryIndex.from_file( + index_directory=ann_dir, + max_vectors=11_000, + complexity=64, + graph_degree=32, + num_threads=16, + ) + + k = 5 + diskann_neighbors, diskann_distances = index.batch_search( + query_vectors, + k_neighbors=k, + complexity=5, + num_threads=16, + ) + if metric == "l2" or metric == "cosine": + knn = NearestNeighbors( + n_neighbors=100, algorithm="auto", metric=metric + ) + knn.fit(index_vectors) + knn_distances, knn_indices = knn.kneighbors(query_vectors) + recall = _calculate_recall( + diskann_neighbors, generated_tags, knn_indices, k + ) + self.assertTrue( + recall > 0.70, + f"Recall [{recall}] was not over 0.7", + ) + + def test_single(self): + for ( + metric, + dtype, + query_vectors, + index_vectors, + ann_dir, + vector_bin_file, + generated_tags, + ) in self._test_matrix: + with self.subTest(msg=f"Testing dtype {dtype}"): + index = dap.DynamicMemoryIndex( + distance_metric="l2", + vector_dtype=dtype, + dimensions=10, + max_vectors=11_000, + complexity=64, + graph_degree=32, + num_threads=16, + ) + index.batch_insert(vectors=index_vectors, vector_ids=generated_tags) + + k = 5 + ids, dists = index.search(query_vectors[0], k_neighbors=k, complexity=5) + self.assertEqual(ids.shape[0], k) + self.assertEqual(dists.shape[0], k) + + def test_valid_metric(self): + with self.assertRaises(ValueError): + dap.DynamicMemoryIndex( + distance_metric="sandwich", + vector_dtype=np.single, + dimensions=10, + max_vectors=11_000, + complexity=64, + graph_degree=32, + num_threads=16, + ) + with self.assertRaises(ValueError): + dap.DynamicMemoryIndex( + distance_metric=None, + vector_dtype=np.single, + dimensions=10, + max_vectors=11_000, + complexity=64, + graph_degree=32, + num_threads=16, + ) + dap.DynamicMemoryIndex( + distance_metric="l2", + vector_dtype=np.single, + dimensions=10, + max_vectors=11_000, + complexity=64, + graph_degree=32, + num_threads=16, + ) + dap.DynamicMemoryIndex( + distance_metric="mips", + vector_dtype=np.single, + dimensions=10, + max_vectors=11_000, + complexity=64, + graph_degree=32, + num_threads=16, + ) + dap.DynamicMemoryIndex( + distance_metric="MiPs", + vector_dtype=np.single, + dimensions=10, + max_vectors=11_000, + complexity=64, + graph_degree=32, + num_threads=16, + ) + + def test_valid_vector_dtype(self): + aliases = {np.single: np.float32, np.byte: np.int8, np.ubyte: np.uint8} + for ( + metric, + dtype, + query_vectors, + index_vectors, + ann_dir, + vector_bin_file, + generated_tags, + ) in self._test_matrix: + with self.subTest(): + index = dap.DynamicMemoryIndex( + distance_metric="l2", + vector_dtype=aliases[dtype], + dimensions=10, + max_vectors=11_000, + complexity=64, + graph_degree=32, + num_threads=16, + ) + + invalid = [np.double, np.float64, np.ulonglong] + for invalid_vector_dtype in invalid: + with self.subTest(): + with self.assertRaises(ValueError, msg=invalid_vector_dtype): + dap.DynamicMemoryIndex( + distance_metric="l2", + vector_dtype=invalid_vector_dtype, + dimensions=10, + max_vectors=11_000, + complexity=64, + graph_degree=32, + num_threads=16, + ) + + def test_value_ranges_ctor(self): + ( + metric, + dtype, + query_vectors, + index_vectors, + ann_dir, + vector_bin_file, + generated_tags, + ) = build_random_vectors_and_memory_index( + np.single, "l2", with_tags=True, index_prefix="not_ann" + ) + good_ranges = { + "distance_metric": "l2", + "vector_dtype": np.single, + "dimensions": 10, + "max_vectors": 11_000, + "complexity": 64, + "graph_degree": 32, + "max_occlusion_size": 10, + "alpha": 1.2, + "num_threads": 16, + "filter_complexity": 10, + "num_frozen_points": 10, + "initial_search_complexity": 32, + "search_threads": 0, + } + + bad_ranges = { + "distance_metric": "l200000", + "vector_dtype": np.double, + "dimensions": -1, + "max_vectors": -1, + "complexity": 0, + "graph_degree": 0, + "max_occlusion_size": -1, + "alpha": -1, + "num_threads": -1, + "filter_complexity": -1, + "num_frozen_points": -1, + "initial_search_complexity": -1, + "search_threads": -1, + } + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest(): + with self.assertRaises( + ValueError, + msg=f"expected to fail with parameter {bad_value_key}={bad_ranges[bad_value_key]}", + ): + index = dap.DynamicMemoryIndex(saturate_graph=False, **kwargs) + + def test_value_ranges_search(self): + good_ranges = {"complexity": 5, "k_neighbors": 10} + bad_ranges = {"complexity": -1, "k_neighbors": 0} + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest(msg=f"Test value ranges search with {kwargs=}"): + with self.assertRaises(ValueError): + index = dap.DynamicMemoryIndex.from_file( + index_directory=self._example_ann_dir, + num_threads=16, + initial_search_complexity=32, + max_vectors=10001, + complexity=64, + graph_degree=32, + ) + index.search(query=np.array([], dtype=np.single), **kwargs) + + def test_value_ranges_batch_search(self): + good_ranges = { + "complexity": 5, + "k_neighbors": 10, + "num_threads": 5, + } + bad_ranges = { + "complexity": 0, + "k_neighbors": 0, + "num_threads": -1, + } + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest(msg=f"Testing value ranges batch search with {kwargs=}"): + with self.assertRaises(ValueError): + index = dap.DynamicMemoryIndex.from_file( + index_directory=self._example_ann_dir, + num_threads=16, + initial_search_complexity=32, + max_vectors=10001, + complexity=64, + graph_degree=32, + ) + index.batch_search( + queries=np.array([[]], dtype=np.single), **kwargs + ) + + # Issue #400 + def test_issue400(self): + _, _, _, index_vectors, ann_dir, _, generated_tags = self._test_matrix[0] + + deletion_tag = generated_tags[10] # arbitrary choice + deletion_vector = index_vectors[10] + + index = dap.DynamicMemoryIndex.from_file( + index_directory=ann_dir, + num_threads=16, + initial_search_complexity=32, + max_vectors=10100, + complexity=64, + graph_degree=32, + ) + index.insert(np.array([1.0] * 10, dtype=np.single), 10099) + index.insert(np.array([2.0] * 10, dtype=np.single), 10050) + index.insert(np.array([3.0] * 10, dtype=np.single), 10053) + tags, distances = index.search( + np.array([3.0] * 10, dtype=np.single), k_neighbors=5, complexity=64 + ) + self.assertIn(10053, tags) + tags, distances = index.search(deletion_vector, k_neighbors=5, complexity=64) + self.assertIn( + deletion_tag, tags, "deletion_tag should exist, as we have not deleted yet" + ) + index.mark_deleted(deletion_tag) + tags, distances = index.search(deletion_vector, k_neighbors=5, complexity=64) + self.assertNotIn( + deletion_tag, + tags, + "deletion_tag should not exist, as we have marked it for deletion", + ) + with tempfile.TemporaryDirectory() as tmpdir: + index.save(tmpdir) + + index2 = dap.DynamicMemoryIndex.from_file( + index_directory=tmpdir, + num_threads=16, + initial_search_complexity=32, + max_vectors=10100, + complexity=64, + graph_degree=32, + ) + tags, distances = index2.search( + deletion_vector, k_neighbors=5, complexity=64 + ) + self.assertNotIn( + deletion_tag, + tags, + "deletion_tag should not exist, as we saved and reloaded the index without it", + ) + + def test_inserts_past_max_vectors(self): + def _tiny_index(): + return dap.DynamicMemoryIndex( + distance_metric="l2", + vector_dtype=np.float32, + dimensions=10, + max_vectors=2, + complexity=64, + graph_degree=32, + num_threads=16, + ) + + + rng = np.random.default_rng(12345) + + # insert 3 vectors and look for an exception + index = _tiny_index() + index.insert(rng.random(10, dtype=np.float32), 1) + index.insert(rng.random(10, dtype=np.float32), 2) + with self.assertRaises(RuntimeError): + index.insert(rng.random(10, dtype=np.float32), 3) + + # insert 2 vectors, delete 1, and insert another and expect a warning + index = _tiny_index() + index.insert(rng.random(10, dtype=np.float32), 1) + index.insert(rng.random(10, dtype=np.float32), 2) + index.mark_deleted(2) + with self.assertWarns(UserWarning): + self.assertEqual(index._removed_num_vectors, 1) + self.assertEqual(index._num_vectors, 2) + index.insert(rng.random(10, dtype=np.float32), 3) + self.assertEqual(index._removed_num_vectors, 0) + self.assertEqual(index._num_vectors, 2) + + # insert 3 batch and look for an exception + index = _tiny_index() + with self.assertRaises(RuntimeError): + index.batch_insert( + rng.random((3, 10), dtype=np.float32), + np.array([1,2,3], dtype=np.uint32) + ) + + + # insert 2 batch, remove 1, add 1 and expect a warning, remove 1, insert 2 batch and look for an exception + index = _tiny_index() + index.batch_insert( + rng.random((2, 10), dtype=np.float32), + np.array([1,2], dtype=np.uint32) + ) + index.mark_deleted(1) + with self.assertWarns(UserWarning): + index.insert(rng.random(10, dtype=np.float32), 3) + index.mark_deleted(2) + with self.assertRaises(RuntimeError): + index.batch_insert(rng.random((2,10), dtype=np.float32), np.array([4, 5], dtype=np.uint32)) + + # insert 1, remove it, add 2 batch, and expect a warning + index = _tiny_index() + index.insert(rng.random(10, dtype=np.float32), 1) + index.mark_deleted(1) + with self.assertWarns(UserWarning): + index.batch_insert(rng.random((2, 10), dtype=np.float32), np.array([10, 20], dtype=np.uint32)) + + # insert 2 batch, remove both, add 2 batch, and expect a warning + index = _tiny_index() + index.batch_insert(rng.random((2,10), dtype=np.float32), np.array([10, 20], dtype=np.uint32)) + index.mark_deleted(10) + index.mark_deleted(20) + with self.assertWarns(UserWarning): + index.batch_insert(rng.random((2, 10), dtype=np.float32), np.array([15, 25], dtype=np.uint32)) + + # insert 2 batch, remove both, consolidate_delete, add 2 batch and do not expect warning + index = _tiny_index() + index.batch_insert(rng.random((2,10), dtype=np.float32), np.array([10, 20], dtype=np.uint32)) + index.mark_deleted(10) + index.mark_deleted(20) + index.consolidate_delete() + with warnings.catch_warnings(): + warnings.simplefilter("error") # turns warnings into raised exceptions + index.batch_insert(rng.random((2, 10), dtype=np.float32), np.array([15, 25], dtype=np.uint32)) + + diff --git a/python/tests/test_search_disk_index.py b/python/tests/test_search_disk_index.py deleted file mode 100644 index 520a85a0f..000000000 --- a/python/tests/test_search_disk_index.py +++ /dev/null @@ -1,105 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT license. - -import time -import argparse -import numpy as np -import diskannpy - - -parser = argparse.ArgumentParser() -parser.add_argument('query_path', type=str, help='Path to the input query set of vectors.') -parser.add_argument('ground_truth_path', type=str, help='Path to the input groundtruth set.') -parser.add_argument('index_path_prefix', type=str, help='Path prefix for index files.') -parser.add_argument('output_path_prefix', type=str, help='Prefix for the generated output files.') -parser.add_argument('K', type=int, help='k value for recall@K.') -parser.add_argument('W', type=int, help='Beamwidth for search.') -parser.add_argument('T', type=int, help='Number of threads to use for search.') -parser.add_argument('C', type=int, help='Number of nodes to cache for search.') - - -args = parser.parse_args() - -recall_at = args.K -W = args.W -# Use multi-threaded search only for batch mode. -num_threads = args.T -num_nodes_to_cache = args.C -single_query_mode = False -l_search = [40, 50, 60, 70, 80, 90, 100, 110, 120] - - -query_data = diskannpy.VectorFloat() -ground_truth_ids = diskannpy.VectorUnsigned() -ground_truth_dists = diskannpy.VectorFloat() - -num_queries, query_dims, query_aligned_dims = diskannpy.load_aligned_bin_float(args.query_path, query_data) -num_ground_truth, ground_truth_dims = diskannpy.load_truthset(args.ground_truth_path, ground_truth_ids, ground_truth_dists) - -index = diskannpy.DiskANNFloatIndex(diskannpy.L2) -if index.load_index(args.index_path_prefix, num_threads, num_nodes_to_cache) != 0: - print("Index load failed") -else: - print("Index Loaded") - - if single_query_mode: - print("Ls QPS Mean Latency (mus) 99.9 Latency Recall@10") - print("================================================================") - for i, L in enumerate(l_search): - latency_stats = [] - query_result_ids = diskannpy.VectorUnsigned() - query_result_dists = diskannpy.VectorFloat() - - s = time.time() - - for j in range(num_queries): - qs = time.time() - index.search(query_data, j, query_aligned_dims, num_queries, - recall_at, L, W, query_result_ids, query_result_dists) - qe = time.time() - latency_stats.append(float((qe - qs) * 1000000)) - - e = time.time() - qps = (num_queries / (e - s)) - recall = diskannpy.calculate_recall(num_queries, ground_truth_ids, - ground_truth_dists, ground_truth_dims, - query_result_ids, recall_at, - recall_at) - latency_stats.sort() - mean_latency = sum(latency_stats) / num_queries - print(str(L) + "{:>10}".format("{:.2f}".format(qps)) + - "{:>15}".format("{:.2f}".format(mean_latency)) + - "{:>20}".format("{:.2f}".format(latency_stats[int((0.999 * num_queries))])) - + "{:>15}".format("{:.2f}".format(recall))) - - result_path = args.output_path_prefix + "_" + str(L) + "_idx_uint32.bin" - diskannpy.save_bin_u32(result_path, query_result_ids, num_queries, recall_at) - else: - print("Ls QPS Mean Latency (mus) Recall@10") - print("=============================================") - for i, L in enumerate(l_search): - diskannpy.omp_set_num_threads(num_threads) - - query_result_ids = diskannpy.VectorUnsigned() - query_result_dists = diskannpy.VectorFloat() - - qs = time.time() - index.batch_search(query_data, query_aligned_dims, num_queries, - recall_at, L, W, - query_result_ids, query_result_dists, - num_threads) - qe = time.time() - latency_stats = float((qe - qs) * 1000000) - - qps = (num_queries / (qe - qs)) - recall = diskannpy.calculate_recall(num_queries, ground_truth_ids, - ground_truth_dists, ground_truth_dims, - query_result_ids, recall_at, - recall_at) - mean_latency = latency_stats / num_queries - print(str(L) + "{:>10}".format("{:.2f}".format(qps)) + - "{:>15}".format("{:.2f}".format(mean_latency)) + - "{:>15}".format("{:.2f}".format(recall))) - - result_path = args.output_path_prefix + "_" + str(L) + "_idx_uint32.bin" - diskannpy.save_bin_u32(result_path, query_result_ids, num_queries, recall_at) diff --git a/python/tests/test_search_disk_index_numpy.py b/python/tests/test_search_disk_index_numpy.py deleted file mode 100644 index d1f2e6827..000000000 --- a/python/tests/test_search_disk_index_numpy.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT license. -import time -import argparse -import numpy as np -import diskannpy - - -parser = argparse.ArgumentParser() -parser.add_argument('query_path', type=str, help='Path to the input query set of vectors.') -parser.add_argument('ground_truth_path', type=str, help='Path to the input groundtruth set.') -parser.add_argument('index_path_prefix', type=str, help='Path prefix for index files.') -parser.add_argument('K', type=int, help='k value for recall@K.') -parser.add_argument('W', type=int, help='Beamwidth for search.') -parser.add_argument('T', type=int, help='Number of threads to use for search.') -parser.add_argument('C', type=int, help='Number of nodes to cache for search.') - -args = parser.parse_args() -args = parser.parse_args() - -recall_at = args.K -W = args.W -# Use multi-threaded search only for batch mode. -num_threads = args.T -num_nodes_to_cache = args.C -l_search = [40, 50, 60, 70, 80, 90, 100, 110, 120] - - -query_data = diskannpy.VectorFloat() -ground_truth_ids = diskannpy.VectorUnsigned() -ground_truth_dists = diskannpy.VectorFloat() - -num_queries, query_dims, query_aligned_dims = diskannpy.load_aligned_bin_float(args.query_path, query_data) -num_ground_truth, ground_truth_dims = diskannpy.load_truthset(args.ground_truth_path, ground_truth_ids, ground_truth_dists) - -query_data_numpy = np.zeros((num_queries,query_dims), dtype=np.float32) -for i in range(0, num_queries): - for d in range(0, query_dims): - query_data_numpy[i,d] = query_data[i * query_aligned_dims + d] - -index = diskannpy.DiskANNFloatIndex(diskannpy.L2) -if index.load_index(args.index_path_prefix, num_threads, num_nodes_to_cache) != 0: - print("Index load failed") -else: - print("Index Loaded") - print("Ls QPS Recall@10") - print("========================") - for i, L in enumerate(l_search): - diskannpy.omp_set_num_threads(num_threads) - - qs = time.time() - ids, dists = index.batch_search_numpy_input(query_data_numpy, query_aligned_dims, - num_queries, recall_at, L, W, num_threads) - qe = time.time() - latency_stats = float((qe - qs) * 1000000) - qps = (num_queries / (qe - qs)) - - recall = diskannpy.calculate_recall_numpy_input(num_queries, ground_truth_ids, - ground_truth_dists, ground_truth_dims, - ids, recall_at, recall_at) - mean_latency = latency_stats / num_queries - print(str(L) + "{:>10}".format("{:.2f}".format(qps)) + "{:>15}".format("{:.2f}".format(recall))) diff --git a/python/tests/test_static_disk_index.py b/python/tests/test_static_disk_index.py new file mode 100644 index 000000000..4ba544106 --- /dev/null +++ b/python/tests/test_static_disk_index.py @@ -0,0 +1,146 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import shutil +import unittest +from tempfile import mkdtemp + +import diskannpy as dap +import numpy as np +from fixtures import calculate_recall, random_vectors, vectors_as_temp_file +from sklearn.neighbors import NearestNeighbors + + +def _build_random_vectors_and_index(dtype, metric): + query_vectors = random_vectors(1000, 10, dtype=dtype) + index_vectors = random_vectors(10000, 10, dtype=dtype) + with vectors_as_temp_file(index_vectors) as vector_temp: + ann_dir = mkdtemp() + dap.build_disk_index( + data=vector_temp, + distance_metric=metric, + vector_dtype=dtype, + index_directory=ann_dir, + graph_degree=16, + complexity=32, + search_memory_maximum=0.00003, + build_memory_maximum=1, + num_threads=1, + pq_disk_bytes=0, + ) + return metric, dtype, query_vectors, index_vectors, ann_dir + + +class TestStaticDiskIndex(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + cls._test_matrix = [ + _build_random_vectors_and_index(np.float32, "l2"), + _build_random_vectors_and_index(np.uint8, "l2"), + _build_random_vectors_and_index(np.int8, "l2"), + ] + cls._example_ann_dir = cls._test_matrix[0][4] + + @classmethod + def tearDownClass(cls) -> None: + for test in cls._test_matrix: + try: + _, _, _, _, ann_dir = test + shutil.rmtree(ann_dir, ignore_errors=True) + except: + pass + + def test_recall_and_batch(self): + for metric, dtype, query_vectors, index_vectors, ann_dir in self._test_matrix: + with self.subTest(msg=f"Testing dtype {dtype}"): + index = dap.StaticDiskIndex( + distance_metric="l2", + vector_dtype=dtype, + index_directory=ann_dir, + num_threads=16, + num_nodes_to_cache=10, + ) + + k = 5 + diskann_neighbors, diskann_distances = index.batch_search( + query_vectors, + k_neighbors=k, + complexity=5, + beam_width=2, + num_threads=16, + ) + if metric == "l2": + knn = NearestNeighbors( + n_neighbors=100, algorithm="auto", metric="l2" + ) + knn.fit(index_vectors) + knn_distances, knn_indices = knn.kneighbors(query_vectors) + recall = calculate_recall(diskann_neighbors, knn_indices, k) + self.assertTrue( + recall > 0.70, + f"Recall [{recall}] was not over 0.7", + ) + + def test_single(self): + for metric, dtype, query_vectors, index_vectors, ann_dir in self._test_matrix: + with self.subTest(msg=f"Testing dtype {dtype}"): + index = dap.StaticDiskIndex( + distance_metric="l2", + vector_dtype=dtype, + index_directory=ann_dir, + num_threads=16, + num_nodes_to_cache=10, + ) + + k = 5 + ids, dists = index.search( + query_vectors[0], k_neighbors=k, complexity=5, beam_width=2 + ) + self.assertEqual(ids.shape[0], k) + self.assertEqual(dists.shape[0], k) + + def test_value_ranges_search(self): + good_ranges = {"complexity": 5, "k_neighbors": 10, "beam_width": 2} + bad_ranges = {"complexity": -1, "k_neighbors": 0, "beam_width": 0} + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest(): + with self.assertRaises(ValueError): + index = dap.StaticDiskIndex( + distance_metric="l2", + vector_dtype=np.single, + index_directory=self._example_ann_dir, + num_threads=16, + num_nodes_to_cache=10, + ) + index.search(query=np.array([], dtype=np.single), **kwargs) + + def test_value_ranges_batch_search(self): + good_ranges = { + "complexity": 5, + "k_neighbors": 10, + "beam_width": 2, + "num_threads": 5, + } + bad_ranges = { + "complexity": 0, + "k_neighbors": 0, + "beam_width": -1, + "num_threads": -1, + } + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest(): + with self.assertRaises(ValueError): + index = dap.StaticDiskIndex( + distance_metric="l2", + vector_dtype=np.single, + index_directory=self._example_ann_dir, + num_threads=16, + num_nodes_to_cache=10, + ) + index.batch_search( + queries=np.array([[]], dtype=np.single), **kwargs + ) diff --git a/python/tests/test_static_memory_index.py b/python/tests/test_static_memory_index.py new file mode 100644 index 000000000..cb7f0f01d --- /dev/null +++ b/python/tests/test_static_memory_index.py @@ -0,0 +1,162 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +import shutil +import unittest + +import diskannpy as dap +import numpy as np +from fixtures import build_random_vectors_and_memory_index, calculate_recall +from sklearn.neighbors import NearestNeighbors + + +class TestStaticMemoryIndex(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + cls._test_matrix = [ + build_random_vectors_and_memory_index(np.float32, "l2"), + build_random_vectors_and_memory_index(np.uint8, "l2"), + build_random_vectors_and_memory_index(np.int8, "l2"), + build_random_vectors_and_memory_index(np.float32, "cosine"), + build_random_vectors_and_memory_index(np.uint8, "cosine"), + build_random_vectors_and_memory_index(np.int8, "cosine"), + ] + cls._example_ann_dir = cls._test_matrix[0][4] + + @classmethod + def tearDownClass(cls) -> None: + for test in cls._test_matrix: + try: + ann_dir = test[4] + shutil.rmtree(ann_dir, ignore_errors=True) + except: + pass + + def test_recall_and_batch(self): + for ( + metric, + dtype, + query_vectors, + index_vectors, + ann_dir, + vector_bin_file, + _, + ) in self._test_matrix: + with self.subTest(msg=f"Testing dtype {dtype}"): + index = dap.StaticMemoryIndex( + index_directory=ann_dir, + num_threads=16, + initial_search_complexity=32, + ) + + k = 5 + diskann_neighbors, diskann_distances = index.batch_search( + query_vectors, + k_neighbors=k, + complexity=5, + num_threads=16, + ) + if metric in ["l2", "cosine"]: + knn = NearestNeighbors( + n_neighbors=100, algorithm="auto", metric=metric + ) + knn.fit(index_vectors) + knn_distances, knn_indices = knn.kneighbors(query_vectors) + recall = calculate_recall(diskann_neighbors, knn_indices, k) + self.assertTrue( + recall > 0.70, + f"Recall [{recall}] was not over 0.7", + ) + + def test_single(self): + for ( + metric, + dtype, + query_vectors, + index_vectors, + ann_dir, + vector_bin_file, + _, + ) in self._test_matrix: + with self.subTest(msg=f"Testing dtype {dtype}"): + index = dap.StaticMemoryIndex( + index_directory=ann_dir, + num_threads=16, + initial_search_complexity=32, + ) + + k = 5 + ids, dists = index.search(query_vectors[0], k_neighbors=k, complexity=5) + self.assertEqual(ids.shape[0], k) + self.assertEqual(dists.shape[0], k) + + def test_value_ranges_ctor(self): + ( + metric, + dtype, + query_vectors, + index_vectors, + ann_dir, + vector_bin_file, + _, + ) = build_random_vectors_and_memory_index(np.single, "l2", "not_ann") + good_ranges = { + "index_directory": ann_dir, + "num_threads": 16, + "initial_search_complexity": 32, + "index_prefix": "not_ann", + } + + bad_ranges = { + "index_directory": "sandwiches", + "num_threads": -100, + "initial_search_complexity": 0, + "index_prefix": "", + } + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest(): + with self.assertRaises(ValueError): + index = dap.StaticMemoryIndex(**kwargs) + + def test_value_ranges_search(self): + good_ranges = {"complexity": 5, "k_neighbors": 10} + bad_ranges = {"complexity": -1, "k_neighbors": 0} + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest(): + with self.assertRaises(ValueError): + index = dap.StaticMemoryIndex( + index_directory=self._example_ann_dir, + num_threads=16, + initial_search_complexity=32, + ) + index.search(query=np.array([], dtype=np.single), **kwargs) + + def test_value_ranges_batch_search(self): + good_ranges = { + "complexity": 5, + "k_neighbors": 10, + "num_threads": 5, + } + bad_ranges = { + "complexity": 0, + "k_neighbors": 0, + "num_threads": -1, + } + vector_bin_file = self._test_matrix[0][5] + for bad_value_key in good_ranges.keys(): + kwargs = good_ranges.copy() + kwargs[bad_value_key] = bad_ranges[bad_value_key] + with self.subTest(): + with self.assertRaises(ValueError): + index = dap.StaticMemoryIndex( + index_directory=self._example_ann_dir, + num_threads=16, + initial_search_complexity=32, + ) + index.batch_search( + queries=np.array([[]], dtype=np.single), **kwargs + ) diff --git a/rust/Cargo.lock b/rust/Cargo.lock new file mode 100644 index 000000000..2e58e9322 --- /dev/null +++ b/rust/Cargo.lock @@ -0,0 +1,1814 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" + +[[package]] +name = "anstyle-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys 0.48.0", +] + +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "build_and_insert_delete_memory_index" +version = "0.1.0" +dependencies = [ + "diskann", + "logger", + "vector", +] + +[[package]] +name = "build_and_insert_memory_index" +version = "0.1.0" +dependencies = [ + "diskann", + "logger", + "vector", +] + +[[package]] +name = "build_disk_index" +version = "0.1.0" +dependencies = [ + "diskann", + "logger", + "openblas-src", + "vector", +] + +[[package]] +name = "build_memory_index" +version = "0.1.0" +dependencies = [ + "clap", + "diskann", + "logger", + "vector", +] + +[[package]] +name = "bumpalo" +version = "3.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" + +[[package]] +name = "bytemuck" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cblas" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3de46dff748ed7e891bc46faae117f48d2a7911041c6630aed3c61a3fe12326f" +dependencies = [ + "cblas-sys", + "libc", + "num-complex", +] + +[[package]] +name = "cblas-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6feecd82cce51b0204cf063f0041d69f24ce83f680d87514b004248e7b0fa65" +dependencies = [ + "libc", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" + +[[package]] +name = "ciborium-ll" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +dependencies = [ + "ciborium-io", + "half 1.8.2", +] + +[[package]] +name = "clap" +version = "4.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9394150f5b4273a1763355bd1c2ec54cc5a2593f790587bcd6b2c947cfa9211" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a78fbdd3cc2914ddf37ba444114bc7765bbdcb55ec9cbe6fa054f0137400717" +dependencies = [ + "anstream", + "anstyle", + "bitflags", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "clap_lex" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "convert_f32_to_bf16" +version = "0.1.0" +dependencies = [ + "half 2.2.1", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" +dependencies = [ + "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "dirs" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "diskann" +version = "0.1.0" +dependencies = [ + "approx", + "bincode", + "bit-vec", + "byteorder", + "cblas", + "cc", + "criterion", + "crossbeam", + "half 2.2.1", + "hashbrown 0.13.2", + "logger", + "num-traits", + "once_cell", + "openblas-src", + "platform", + "rand", + "rayon", + "serde", + "thiserror", + "vector", + "winapi", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "filetime" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.48.0", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "half" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +dependencies = [ + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi 0.3.1", + "io-lifetimes", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.146" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "load_and_insert_memory_index" +version = "0.1.0" +dependencies = [ + "diskann", + "logger", + "vector", +] + +[[package]] +name = "log" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" + +[[package]] +name = "logger" +version = "0.1.0" +dependencies = [ + "lazy_static", + "log", + "once_cell", + "prost", + "prost-build", + "prost-types", + "thiserror", + "vcpkg", + "win_etw_macros", + "win_etw_provider", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num-complex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "openblas-build" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eba42c395477605f400a8d79ee0b756cfb82abe3eb5618e35fa70d3a36010a7f" +dependencies = [ + "anyhow", + "flate2", + "native-tls", + "tar", + "thiserror", + "ureq", + "walkdir", +] + +[[package]] +name = "openblas-src" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e5d8af0b707ac2fe1574daa88b4157da73b0de3dc7c39fe3e2c0bb64070501" +dependencies = [ + "dirs", + "openblas-build", + "vcpkg", +] + +[[package]] +name = "openssl" +version = "0.10.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "percent-encoding" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "platform" +version = "0.1.0" +dependencies = [ + "log", + "winapi", +] + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro2" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" + +[[package]] +name = "rustix" +version = "0.37.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64", +] + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "search_memory_index" +version = "0.1.0" +dependencies = [ + "bytemuck", + "diskann", + "num_cpus", + "rayon", + "vector", +] + +[[package]] +name = "security-framework" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.164" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "serde_json" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1_smol" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +dependencies = [ + "autocfg", + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "ureq" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b11c96ac7ee530603dcdf68ed1557050f374ce55a5a07193ebf8cbc9f8927e9" +dependencies = [ + "base64", + "flate2", + "log", + "native-tls", + "once_cell", + "rustls-native-certs", + "url", +] + +[[package]] +name = "url" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "uuid" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa2982af2eec27de306107c027578ff7f423d65f7250e40ce0fea8f45248b81" +dependencies = [ + "sha1_smol", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vector" +version = "0.1.0" +dependencies = [ + "approx", + "base64", + "bincode", + "bytemuck", + "cc", + "half 2.2.1", + "rand", + "serde", + "thiserror", +] + +[[package]] +name = "vector_base64" +version = "0.1.0" +dependencies = [ + "base64", + "bincode", + "half 2.2.1", + "serde", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "w32-error" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7c61a6bd91e168c12fc170985725340f6b458eb6f971d1cf6c34f74ffafb43" +dependencies = [ + "winapi", +] + +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.18", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.18", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + +[[package]] +name = "win_etw_macros" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bc4c591edb4858e3445f7a60c7e0a50915aedadfa044f28f17c98c145ef54d" +dependencies = [ + "proc-macro2", + "quote", + "sha1_smol", + "syn 1.0.109", + "uuid", + "win_etw_metadata", +] + +[[package]] +name = "win_etw_metadata" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e50d0fa665033a19ecefd281b4fb5481eba2972dedbb5ec129c9392a206d652f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "win_etw_provider" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dffcc196e0e180e73a275a91f6914f173227fd627cabac3efdd8d6adec113892" +dependencies = [ + "w32-error", + "widestring", + "win_etw_metadata", + "winapi", + "zerocopy", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + +[[package]] +name = "zerocopy" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f188cc1bcf1fe1064b8c58d150f497e697f49774aa846f2dc949d9a25f236" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6505e6815af7de1746a08f69c69606bb45695a17149517680f3b2149713b19a3" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 000000000..5236f96a0 --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,23 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. + +[workspace] +members = [ + "cmd_drivers/build_memory_index", + "cmd_drivers/build_and_insert_memory_index", + "cmd_drivers/load_and_insert_memory_index", + "cmd_drivers/convert_f32_to_bf16", + "cmd_drivers/search_memory_index", + "cmd_drivers/build_disk_index", + "cmd_drivers/build_and_insert_delete_memory_index", + "vector", + "diskann", + "platform", + "logger", + "vector_base64" +] +resolver = "2" + +[profile.release] +opt-level = 3 +codegen-units=1 diff --git a/rust/cmd_drivers/build_and_insert_delete_memory_index/Cargo.toml b/rust/cmd_drivers/build_and_insert_delete_memory_index/Cargo.toml new file mode 100644 index 000000000..42aa1851a --- /dev/null +++ b/rust/cmd_drivers/build_and_insert_delete_memory_index/Cargo.toml @@ -0,0 +1,14 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "build_and_insert_delete_memory_index" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +diskann = { path = "../../diskann" } +logger = { path = "../../logger" } +vector = { path = "../../vector" } + diff --git a/rust/cmd_drivers/build_and_insert_delete_memory_index/src/main.rs b/rust/cmd_drivers/build_and_insert_delete_memory_index/src/main.rs new file mode 100644 index 000000000..4593a9ed5 --- /dev/null +++ b/rust/cmd_drivers/build_and_insert_delete_memory_index/src/main.rs @@ -0,0 +1,420 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::env; + +use diskann::{ + common::{ANNError, ANNResult}, + index::create_inmem_index, + model::{ + configuration::index_write_parameters::IndexWriteParametersBuilder, + vertex::{DIM_104, DIM_128, DIM_256}, + IndexConfiguration, + }, + utils::round_up, + utils::{file_exists, load_ids_to_delete_from_file, load_metadata_from_file, Timer}, +}; + +use vector::{FullPrecisionDistance, Half, Metric}; + +// The main function to build an in-memory index +#[allow(clippy::too_many_arguments)] +fn build_and_insert_delete_in_memory_index( + metric: Metric, + data_path: &str, + delta_path: &str, + r: u32, + l: u32, + alpha: f32, + save_path: &str, + num_threads: u32, + _use_pq_build: bool, + _num_pq_bytes: usize, + use_opq: bool, + delete_path: &str, +) -> ANNResult<()> +where + T: Default + Copy + Sync + Send + Into, + [T; DIM_104]: FullPrecisionDistance, + [T; DIM_128]: FullPrecisionDistance, + [T; DIM_256]: FullPrecisionDistance, +{ + let index_write_parameters = IndexWriteParametersBuilder::new(l, r) + .with_alpha(alpha) + .with_saturate_graph(false) + .with_num_threads(num_threads) + .build(); + + let (data_num, data_dim) = load_metadata_from_file(data_path)?; + + let config = IndexConfiguration::new( + metric, + data_dim, + round_up(data_dim as u64, 8_u64) as usize, + data_num, + false, + 0, + use_opq, + 0, + 2.0f32, + index_write_parameters, + ); + let mut index = create_inmem_index::(config)?; + + let timer = Timer::new(); + + index.build(data_path, data_num)?; + + let diff = timer.elapsed(); + + println!("Initial indexing time: {}", diff.as_secs_f64()); + + let (delta_data_num, _) = load_metadata_from_file(delta_path)?; + + index.insert(delta_path, delta_data_num)?; + + if !delete_path.is_empty() { + if !file_exists(delete_path) { + return Err(ANNError::log_index_error(format!( + "ERROR: Data file for delete {} does not exist.", + delete_path + ))); + } + + let (num_points_to_delete, vertex_ids_to_delete) = + load_ids_to_delete_from_file(delete_path)?; + index.soft_delete(vertex_ids_to_delete, num_points_to_delete)?; + } + + index.save(save_path)?; + + Ok(()) +} + +fn main() -> ANNResult<()> { + let mut data_type = String::new(); + let mut dist_fn = String::new(); + let mut data_path = String::new(); + let mut insert_path = String::new(); + let mut index_path_prefix = String::new(); + let mut delete_path = String::new(); + + let mut num_threads = 0u32; + let mut r = 64u32; + let mut l = 100u32; + + let mut alpha = 1.2f32; + let mut build_pq_bytes = 0u32; + let mut _use_pq_build = false; + let mut use_opq = false; + + let args: Vec = env::args().collect(); + let mut iter = args.iter().skip(1).peekable(); + + while let Some(arg) = iter.next() { + match arg.as_str() { + "--help" | "-h" => { + print_help(); + return Ok(()); + } + "--data_type" => { + data_type = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "data_type".to_string(), + "Missing data type".to_string(), + ) + })? + .to_owned(); + } + "--dist_fn" => { + dist_fn = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "dist_fn".to_string(), + "Missing distance function".to_string(), + ) + })? + .to_owned(); + } + "--data_path" => { + data_path = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "data_path".to_string(), + "Missing data path".to_string(), + ) + })? + .to_owned(); + } + "--insert_path" => { + insert_path = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "insert_path".to_string(), + "Missing insert path".to_string(), + ) + })? + .to_owned(); + } + "--index_path_prefix" => { + index_path_prefix = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "index_path_prefix".to_string(), + "Missing index path prefix".to_string(), + ) + })? + .to_owned(); + } + "--max_degree" | "-R" => { + r = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "max_degree".to_string(), + "Missing max degree".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "max_degree".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--Lbuild" | "-L" => { + l = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "Lbuild".to_string(), + "Missing build complexity".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "Lbuild".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--alpha" => { + alpha = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "alpha".to_string(), + "Missing alpha".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "alpha".to_string(), + format!("ParseFloatError: {}", err), + ) + })?; + } + "--num_threads" | "-T" => { + num_threads = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "num_threads".to_string(), + "Missing number of threads".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "num_threads".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--build_PQ_bytes" => { + build_pq_bytes = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "build_PQ_bytes".to_string(), + "Missing PQ bytes".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "build_PQ_bytes".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--use_opq" => { + use_opq = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "use_opq".to_string(), + "Missing use_opq flag".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "use_opq".to_string(), + format!("ParseBoolError: {}", err), + ) + })?; + } + "--delete_path" => { + delete_path = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "delete_path".to_string(), + "Missing delete_path".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "delete_set_path".to_string(), + format!("ParseStringError: {}", err), + ) + })?; + } + _ => { + return Err(ANNError::log_index_config_error( + String::from(""), + format!("Unknown argument: {}", arg), + )); + } + } + } + + if data_type.is_empty() + || dist_fn.is_empty() + || data_path.is_empty() + || index_path_prefix.is_empty() + { + return Err(ANNError::log_index_config_error( + String::from(""), + "Missing required arguments".to_string(), + )); + } + + _use_pq_build = build_pq_bytes > 0; + + let metric = dist_fn + .parse::() + .map_err(|err| ANNError::log_index_config_error("dist_fn".to_string(), err.to_string()))?; + + println!( + "Starting index build with R: {} Lbuild: {} alpha: {} #threads: {}", + r, l, alpha, num_threads + ); + + match data_type.as_str() { + "int8" => { + build_and_insert_delete_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + &delete_path, + )?; + } + "uint8" => { + build_and_insert_delete_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + &delete_path, + )?; + } + "float" => { + build_and_insert_delete_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + &delete_path, + )?; + } + "f16" => { + build_and_insert_delete_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + &delete_path, + )?; + } + _ => { + println!("Unsupported type. Use one of int8, uint8 or float."); + return Err(ANNError::log_index_config_error( + "data_type".to_string(), + "Invalid data type".to_string(), + )); + } + } + + Ok(()) +} + +fn print_help() { + println!("Arguments"); + println!("--help, -h Print information on arguments"); + println!("--data_type data type (required)"); + println!("--dist_fn distance function (required)"); + println!( + "--data_path Input data file in bin format for initial build (required)" + ); + println!("--insert_path Input data file in bin format for insert (required)"); + println!("--index_path_prefix Path prefix for saving index file components (required)"); + println!("--max_degree, -R Maximum graph degree (default: 64)"); + println!("--Lbuild, -L Build complexity, higher value results in better graphs (default: 100)"); + println!("--alpha alpha controls density and diameter of graph, set 1 for sparse graph, 1.2 or 1.4 for denser graphs with lower diameter (default: 1.2)"); + println!("--num_threads, -T Number of threads used for building index (defaults to num of CPU logic cores)"); + println!("--build_PQ_bytes Number of PQ bytes to build the index; 0 for full precision build (default: 0)"); + println!("--use_opq Set true for OPQ compression while using PQ distance comparisons for building the index, and false for PQ compression (default: false)"); +} + diff --git a/rust/cmd_drivers/build_and_insert_memory_index/Cargo.toml b/rust/cmd_drivers/build_and_insert_memory_index/Cargo.toml new file mode 100644 index 000000000..d9811fc22 --- /dev/null +++ b/rust/cmd_drivers/build_and_insert_memory_index/Cargo.toml @@ -0,0 +1,14 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "build_and_insert_memory_index" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +diskann = { path = "../../diskann" } +logger = { path = "../../logger" } +vector = { path = "../../vector" } + diff --git a/rust/cmd_drivers/build_and_insert_memory_index/src/main.rs b/rust/cmd_drivers/build_and_insert_memory_index/src/main.rs new file mode 100644 index 000000000..46e4ba4a4 --- /dev/null +++ b/rust/cmd_drivers/build_and_insert_memory_index/src/main.rs @@ -0,0 +1,382 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::env; + +use diskann::{ + common::{ANNResult, ANNError}, + index::create_inmem_index, + utils::round_up, + model::{ + IndexWriteParametersBuilder, + IndexConfiguration, + vertex::{DIM_128, DIM_256, DIM_104} + }, + utils::{load_metadata_from_file, Timer}, +}; + +use vector::{Metric, FullPrecisionDistance, Half}; + +// The main function to build an in-memory index +#[allow(clippy::too_many_arguments)] +fn build_and_insert_in_memory_index ( + metric: Metric, + data_path: &str, + delta_path: &str, + r: u32, + l: u32, + alpha: f32, + save_path: &str, + num_threads: u32, + _use_pq_build: bool, + _num_pq_bytes: usize, + use_opq: bool +) -> ANNResult<()> +where + T: Default + Copy + Sync + Send + Into, + [T; DIM_104]: FullPrecisionDistance, + [T; DIM_128]: FullPrecisionDistance, + [T; DIM_256]: FullPrecisionDistance +{ + let index_write_parameters = IndexWriteParametersBuilder::new(l, r) + .with_alpha(alpha) + .with_saturate_graph(false) + .with_num_threads(num_threads) + .build(); + + let (data_num, data_dim) = load_metadata_from_file(data_path)?; + + let config = IndexConfiguration::new( + metric, + data_dim, + round_up(data_dim as u64, 8_u64) as usize, + data_num, + false, + 0, + use_opq, + 0, + 2.0f32, + index_write_parameters, + ); + let mut index = create_inmem_index::(config)?; + + let timer = Timer::new(); + + index.build(data_path, data_num)?; + + let diff = timer.elapsed(); + + println!("Initial indexing time: {}", diff.as_secs_f64()); + + let (delta_data_num, _) = load_metadata_from_file(delta_path)?; + + index.insert(delta_path, delta_data_num)?; + + index.save(save_path)?; + + Ok(()) +} + +fn main() -> ANNResult<()> { + let mut data_type = String::new(); + let mut dist_fn = String::new(); + let mut data_path = String::new(); + let mut insert_path = String::new(); + let mut index_path_prefix = String::new(); + + let mut num_threads = 0u32; + let mut r = 64u32; + let mut l = 100u32; + + let mut alpha = 1.2f32; + let mut build_pq_bytes = 0u32; + let mut _use_pq_build = false; + let mut use_opq = false; + + let args: Vec = env::args().collect(); + let mut iter = args.iter().skip(1).peekable(); + + while let Some(arg) = iter.next() { + match arg.as_str() { + "--help" | "-h" => { + print_help(); + return Ok(()); + } + "--data_type" => { + data_type = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "data_type".to_string(), + "Missing data type".to_string(), + ) + })? + .to_owned(); + } + "--dist_fn" => { + dist_fn = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "dist_fn".to_string(), + "Missing distance function".to_string(), + ) + })? + .to_owned(); + } + "--data_path" => { + data_path = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "data_path".to_string(), + "Missing data path".to_string(), + ) + })? + .to_owned(); + } + "--insert_path" => { + insert_path = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "insert_path".to_string(), + "Missing insert path".to_string(), + ) + })? + .to_owned(); + } + "--index_path_prefix" => { + index_path_prefix = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "index_path_prefix".to_string(), + "Missing index path prefix".to_string(), + ) + })? + .to_owned(); + } + "--max_degree" | "-R" => { + r = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "max_degree".to_string(), + "Missing max degree".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "max_degree".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--Lbuild" | "-L" => { + l = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "Lbuild".to_string(), + "Missing build complexity".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "Lbuild".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--alpha" => { + alpha = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "alpha".to_string(), + "Missing alpha".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "alpha".to_string(), + format!("ParseFloatError: {}", err), + ) + })?; + } + "--num_threads" | "-T" => { + num_threads = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "num_threads".to_string(), + "Missing number of threads".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "num_threads".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--build_PQ_bytes" => { + build_pq_bytes = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "build_PQ_bytes".to_string(), + "Missing PQ bytes".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "build_PQ_bytes".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--use_opq" => { + use_opq = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "use_opq".to_string(), + "Missing use_opq flag".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "use_opq".to_string(), + format!("ParseBoolError: {}", err), + ) + })?; + } + _ => { + return Err(ANNError::log_index_config_error( + String::from(""), + format!("Unknown argument: {}", arg), + )); + } + } + } + + if data_type.is_empty() + || dist_fn.is_empty() + || data_path.is_empty() + || index_path_prefix.is_empty() + { + return Err(ANNError::log_index_config_error( + String::from(""), + "Missing required arguments".to_string(), + )); + } + + _use_pq_build = build_pq_bytes > 0; + + let metric = dist_fn + .parse::() + .map_err(|err| ANNError::log_index_config_error( + "dist_fn".to_string(), + err.to_string(), + ))?; + + println!( + "Starting index build with R: {} Lbuild: {} alpha: {} #threads: {}", + r, l, alpha, num_threads + ); + + match data_type.as_str() { + "int8" => { + build_and_insert_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + )?; + } + "uint8" => { + build_and_insert_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + )?; + } + "float" => { + build_and_insert_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + )?; + } + "f16" => { + build_and_insert_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + )?; + } + _ => { + println!("Unsupported type. Use one of int8, uint8 or float."); + return Err(ANNError::log_index_config_error("data_type".to_string(), "Invalid data type".to_string())); + } + } + + Ok(()) +} + +fn print_help() { + println!("Arguments"); + println!("--help, -h Print information on arguments"); + println!("--data_type data type (required)"); + println!("--dist_fn distance function (required)"); + println!("--data_path Input data file in bin format for initial build (required)"); + println!("--insert_path Input data file in bin format for insert (required)"); + println!("--index_path_prefix Path prefix for saving index file components (required)"); + println!("--max_degree, -R Maximum graph degree (default: 64)"); + println!("--Lbuild, -L Build complexity, higher value results in better graphs (default: 100)"); + println!("--alpha alpha controls density and diameter of graph, set 1 for sparse graph, 1.2 or 1.4 for denser graphs with lower diameter (default: 1.2)"); + println!("--num_threads, -T Number of threads used for building index (defaults to num of CPU logic cores)"); + println!("--build_PQ_bytes Number of PQ bytes to build the index; 0 for full precision build (default: 0)"); + println!("--use_opq Set true for OPQ compression while using PQ distance comparisons for building the index, and false for PQ compression (default: false)"); +} + diff --git a/rust/cmd_drivers/build_disk_index/Cargo.toml b/rust/cmd_drivers/build_disk_index/Cargo.toml new file mode 100644 index 000000000..afe5e5b33 --- /dev/null +++ b/rust/cmd_drivers/build_disk_index/Cargo.toml @@ -0,0 +1,14 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "build_disk_index" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +diskann = { path = "../../diskann" } +logger = { path = "../../logger" } +vector = { path = "../../vector" } +openblas-src = { version = "0.10.8", features = ["system", "static"] } diff --git a/rust/cmd_drivers/build_disk_index/src/main.rs b/rust/cmd_drivers/build_disk_index/src/main.rs new file mode 100644 index 000000000..e0b6dbe24 --- /dev/null +++ b/rust/cmd_drivers/build_disk_index/src/main.rs @@ -0,0 +1,377 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::env; + +use diskann::{ + common::{ANNError, ANNResult}, + index::ann_disk_index::create_disk_index, + model::{ + default_param_vals::ALPHA, + vertex::{DIM_104, DIM_128, DIM_256}, + DiskIndexBuildParameters, IndexConfiguration, IndexWriteParametersBuilder, + }, + storage::DiskIndexStorage, + utils::round_up, + utils::{load_metadata_from_file, Timer}, +}; + +use vector::{FullPrecisionDistance, Half, Metric}; + +/// The main function to build a disk index +#[allow(clippy::too_many_arguments)] +fn build_disk_index( + metric: Metric, + data_path: &str, + r: u32, + l: u32, + index_path_prefix: &str, + num_threads: u32, + search_ram_limit_gb: f64, + index_build_ram_limit_gb: f64, + num_pq_chunks: usize, + use_opq: bool, +) -> ANNResult<()> +where + T: Default + Copy + Sync + Send + Into, + [T; DIM_104]: FullPrecisionDistance, + [T; DIM_128]: FullPrecisionDistance, + [T; DIM_256]: FullPrecisionDistance, +{ + let disk_index_build_parameters = + DiskIndexBuildParameters::new(search_ram_limit_gb, index_build_ram_limit_gb)?; + + let index_write_parameters = IndexWriteParametersBuilder::new(l, r) + .with_saturate_graph(true) + .with_num_threads(num_threads) + .build(); + + let (data_num, data_dim) = load_metadata_from_file(data_path)?; + + let config = IndexConfiguration::new( + metric, + data_dim, + round_up(data_dim as u64, 8_u64) as usize, + data_num, + num_pq_chunks > 0, + num_pq_chunks, + use_opq, + 0, + 1f32, + index_write_parameters, + ); + let storage = DiskIndexStorage::new(data_path.to_string(), index_path_prefix.to_string())?; + let mut index = create_disk_index::(Some(disk_index_build_parameters), config, storage)?; + + let timer = Timer::new(); + + index.build("")?; + + let diff = timer.elapsed(); + println!("Indexing time: {}", diff.as_secs_f64()); + + Ok(()) +} + +fn main() -> ANNResult<()> { + let mut data_type = String::new(); + let mut dist_fn = String::new(); + let mut data_path = String::new(); + let mut index_path_prefix = String::new(); + + let mut num_threads = 0u32; + let mut r = 64u32; + let mut l = 100u32; + let mut search_ram_limit_gb = 0f64; + let mut index_build_ram_limit_gb = 0f64; + + let mut build_pq_bytes = 0u32; + let mut use_opq = false; + + let args: Vec = env::args().collect(); + let mut iter = args.iter().skip(1).peekable(); + + while let Some(arg) = iter.next() { + match arg.as_str() { + "--help" | "-h" => { + print_help(); + return Ok(()); + } + "--data_type" => { + data_type = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "data_type".to_string(), + "Missing data type".to_string(), + ) + })? + .to_owned(); + } + "--dist_fn" => { + dist_fn = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "dist_fn".to_string(), + "Missing distance function".to_string(), + ) + })? + .to_owned(); + } + "--data_path" => { + data_path = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "data_path".to_string(), + "Missing data path".to_string(), + ) + })? + .to_owned(); + } + "--index_path_prefix" => { + index_path_prefix = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "index_path_prefix".to_string(), + "Missing index path prefix".to_string(), + ) + })? + .to_owned(); + } + "--max_degree" | "-R" => { + r = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "max_degree".to_string(), + "Missing max degree".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "max_degree".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--Lbuild" | "-L" => { + l = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "Lbuild".to_string(), + "Missing build complexity".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "Lbuild".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--num_threads" | "-T" => { + num_threads = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "num_threads".to_string(), + "Missing number of threads".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "num_threads".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--build_PQ_bytes" => { + build_pq_bytes = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "build_PQ_bytes".to_string(), + "Missing PQ bytes".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "build_PQ_bytes".to_string(), + format!("ParseIntError: {}", err), + ) + })?; + } + "--use_opq" => { + use_opq = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "use_opq".to_string(), + "Missing use_opq flag".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "use_opq".to_string(), + format!("ParseBoolError: {}", err), + ) + })?; + } + "--search_DRAM_budget" | "-B" => { + search_ram_limit_gb = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "search_DRAM_budget".to_string(), + "Missing search_DRAM_budget flag".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "search_DRAM_budget".to_string(), + format!("ParseBoolError: {}", err), + ) + })?; + } + "--build_DRAM_budget" | "-M" => { + index_build_ram_limit_gb = iter + .next() + .ok_or_else(|| { + ANNError::log_index_config_error( + "build_DRAM_budget".to_string(), + "Missing build_DRAM_budget flag".to_string(), + ) + })? + .parse() + .map_err(|err| { + ANNError::log_index_config_error( + "build_DRAM_budget".to_string(), + format!("ParseBoolError: {}", err), + ) + })?; + } + _ => { + return Err(ANNError::log_index_config_error( + String::from(""), + format!("Unknown argument: {}", arg), + )); + } + } + } + + if data_type.is_empty() + || dist_fn.is_empty() + || data_path.is_empty() + || index_path_prefix.is_empty() + { + return Err(ANNError::log_index_config_error( + String::from(""), + "Missing required arguments".to_string(), + )); + } + + let metric = dist_fn + .parse::() + .map_err(|err| ANNError::log_index_config_error("dist_fn".to_string(), err.to_string()))?; + + println!( + "Starting index build with R: {} Lbuild: {} alpha: {} #threads: {} search_DRAM_budget: {} build_DRAM_budget: {}", + r, l, ALPHA, num_threads, search_ram_limit_gb, index_build_ram_limit_gb + ); + + let err = match data_type.as_str() { + "int8" => build_disk_index::( + metric, + &data_path, + r, + l, + &index_path_prefix, + num_threads, + search_ram_limit_gb, + index_build_ram_limit_gb, + build_pq_bytes as usize, + use_opq, + ), + "uint8" => build_disk_index::( + metric, + &data_path, + r, + l, + &index_path_prefix, + num_threads, + search_ram_limit_gb, + index_build_ram_limit_gb, + build_pq_bytes as usize, + use_opq, + ), + "float" => build_disk_index::( + metric, + &data_path, + r, + l, + &index_path_prefix, + num_threads, + search_ram_limit_gb, + index_build_ram_limit_gb, + build_pq_bytes as usize, + use_opq, + ), + "f16" => build_disk_index::( + metric, + &data_path, + r, + l, + &index_path_prefix, + num_threads, + search_ram_limit_gb, + index_build_ram_limit_gb, + build_pq_bytes as usize, + use_opq, + ), + _ => { + println!("Unsupported type. Use one of int8, uint8, float or f16."); + return Err(ANNError::log_index_config_error( + "data_type".to_string(), + "Invalid data type".to_string(), + )); + } + }; + + match err { + Ok(_) => { + println!("Index build completed successfully"); + Ok(()) + } + Err(err) => { + eprintln!("Error: {:?}", err); + Err(err) + } + } +} + +fn print_help() { + println!("Arguments"); + println!("--help, -h Print information on arguments"); + println!("--data_type data type (required)"); + println!("--dist_fn distance function (required)"); + println!("--data_path Input data file in bin format (required)"); + println!("--index_path_prefix Path prefix for saving index file components (required)"); + println!("--max_degree, -R Maximum graph degree (default: 64)"); + println!("--Lbuild, -L Build complexity, higher value results in better graphs (default: 100)"); + println!("--search_DRAM_budget Bound on the memory footprint of the index at search time in GB. Once built, the index will use up only the specified RAM limit, the rest will reside on disk"); + println!("--build_DRAM_budget Limit on the memory allowed for building the index in GB"); + println!("--num_threads, -T Number of threads used for building index (defaults to num of CPU logic cores)"); + println!("--build_PQ_bytes Number of PQ bytes to build the index; 0 for full precision build (default: 0)"); + println!("--use_opq Set true for OPQ compression while using PQ distance comparisons for building the index, and false for PQ compression (default: false)"); +} diff --git a/rust/cmd_drivers/build_memory_index/Cargo.toml b/rust/cmd_drivers/build_memory_index/Cargo.toml new file mode 100644 index 000000000..eb4708d84 --- /dev/null +++ b/rust/cmd_drivers/build_memory_index/Cargo.toml @@ -0,0 +1,15 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "build_memory_index" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +clap = { version = "4.3.8", features = ["derive"] } +diskann = { path = "../../diskann" } +logger = { path = "../../logger" } +vector = { path = "../../vector" } + diff --git a/rust/cmd_drivers/build_memory_index/src/args.rs b/rust/cmd_drivers/build_memory_index/src/args.rs new file mode 100644 index 000000000..ede31f2db --- /dev/null +++ b/rust/cmd_drivers/build_memory_index/src/args.rs @@ -0,0 +1,62 @@ +use clap::{Args, Parser}; + +#[derive(Debug, Args)] +enum DataType { + /// Float data type. + Float, + + /// Half data type. + FP16, +} + +#[derive(Debug, Args)] +enum DistanceFunction { + /// Euclidean distance. + L2, + + /// Cosine distance. + Cosine, +} + +#[derive(Debug, Parser)] +struct BuildMemoryIndexArgs { + /// Data type of the vectors. + #[clap(long, default_value = "float")] + pub data_type: DataType, + + /// Distance function to use. + #[clap(long, default_value = "l2")] + pub dist_fn: Metric, + + /// Path to the data file. The file should be in the format specified by the `data_type` argument. + #[clap(long, short, required = true)] + pub data_path: String, + + /// Path to the index file. The index will be saved to this prefixed name. + #[clap(long, short, required = true)] + pub index_path_prefix: String, + + /// Number of max out degree from a vertex. + #[clap(long, default_value = "32")] + pub max_degree: usize, + + /// Number of candidates to consider when building out edges + #[clap(long, short default_value = "50")] + pub l_build: usize, + + /// Alpha to use to build diverse edges + #[clap(long, short default_value = "1.0")] + pub alpha: f32, + + /// Number of threads to use. + #[clap(long, short, default_value = "1")] + pub num_threads: u8, + + /// Number of PQ bytes to use. + #[clap(long, short, default_value = "8")] + pub build_pq_bytes: usize, + + /// Use opq? + #[clap(long, short, default_value = "false")] + pub use_opq: bool, +} diff --git a/rust/cmd_drivers/build_memory_index/src/main.rs b/rust/cmd_drivers/build_memory_index/src/main.rs new file mode 100644 index 000000000..cdccc0061 --- /dev/null +++ b/rust/cmd_drivers/build_memory_index/src/main.rs @@ -0,0 +1,174 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use clap::{Parser, ValueEnum}; +use std::path::PathBuf; + +use diskann::{ + common::ANNResult, + index::create_inmem_index, + model::{ + vertex::{DIM_104, DIM_128, DIM_256}, + IndexConfiguration, IndexWriteParametersBuilder, + }, + utils::round_up, + utils::{load_metadata_from_file, Timer}, +}; + +use vector::{FullPrecisionDistance, Half, Metric}; + +/// The main function to build an in-memory index +#[allow(clippy::too_many_arguments)] +fn build_in_memory_index( + metric: Metric, + data_path: &str, + r: u32, + l: u32, + alpha: f32, + save_path: &str, + num_threads: u32, + _use_pq_build: bool, + _num_pq_bytes: usize, + use_opq: bool, +) -> ANNResult<()> +where + T: Default + Copy + Sync + Send + Into, + [T; DIM_104]: FullPrecisionDistance, + [T; DIM_128]: FullPrecisionDistance, + [T; DIM_256]: FullPrecisionDistance, +{ + let index_write_parameters = IndexWriteParametersBuilder::new(l, r) + .with_alpha(alpha) + .with_saturate_graph(false) + .with_num_threads(num_threads) + .build(); + + let (data_num, data_dim) = load_metadata_from_file(data_path)?; + + let config = IndexConfiguration::new( + metric, + data_dim, + round_up(data_dim as u64, 8_u64) as usize, + data_num, + false, + 0, + use_opq, + 0, + 1f32, + index_write_parameters, + ); + let mut index = create_inmem_index::(config)?; + + let timer = Timer::new(); + + index.build(data_path, data_num)?; + + let diff = timer.elapsed(); + + println!("Indexing time: {}", diff.as_secs_f64()); + index.save(save_path)?; + + Ok(()) +} + +fn main() -> ANNResult<()> { + let args = BuildMemoryIndexArgs::parse(); + + let _use_pq_build = args.build_pq_bytes > 0; + + println!( + "Starting index build with R: {} Lbuild: {} alpha: {} #threads: {}", + args.max_degree, args.l_build, args.alpha, args.num_threads + ); + + let err = match args.data_type { + DataType::Float => build_in_memory_index::( + args.dist_fn, + &args.data_path.to_string_lossy(), + args.max_degree, + args.l_build, + args.alpha, + &args.index_path_prefix, + args.num_threads, + _use_pq_build, + args.build_pq_bytes, + args.use_opq, + ), + DataType::FP16 => build_in_memory_index::( + args.dist_fn, + &args.data_path.to_string_lossy(), + args.max_degree, + args.l_build, + args.alpha, + &args.index_path_prefix, + args.num_threads, + _use_pq_build, + args.build_pq_bytes, + args.use_opq, + ), + }; + + match err { + Ok(_) => { + println!("Index build completed successfully"); + Ok(()) + } + Err(err) => { + eprintln!("Error: {:?}", err); + Err(err) + } + } +} + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)] +enum DataType { + /// Float data type. + Float, + + /// Half data type. + FP16, +} + +#[derive(Debug, Parser)] +struct BuildMemoryIndexArgs { + /// data type (required) + #[arg(long = "data_type", default_value = "float")] + pub data_type: DataType, + + /// Distance function to use. + #[arg(long = "dist_fn", default_value = "l2")] + pub dist_fn: Metric, + + /// Path to the data file. The file should be in the format specified by the `data_type` argument. + #[arg(long = "data_path", short, required = true)] + pub data_path: PathBuf, + + /// Path to the index file. The index will be saved to this prefixed name. + #[arg(long = "index_path_prefix", short, required = true)] + pub index_path_prefix: String, + + /// Number of max out degree from a vertex. + #[arg(long = "max_degree", short = 'R', default_value = "64")] + pub max_degree: u32, + + /// Number of candidates to consider when building out edges + #[arg(long = "l_build", short = 'L', default_value = "100")] + pub l_build: u32, + + /// alpha controls density and diameter of graph, set 1 for sparse graph, 1.2 or 1.4 for denser graphs with lower diameter + #[arg(long, short, default_value = "1.2")] + pub alpha: f32, + + /// Number of threads to use. + #[arg(long = "num_threads", short = 'T', default_value = "1")] + pub num_threads: u32, + + /// Number of PQ bytes to build the index; 0 for full precision build + #[arg(long = "build_pq_bytes", short, default_value = "0")] + pub build_pq_bytes: usize, + + /// Set true for OPQ compression while using PQ distance comparisons for building the index, and false for PQ compression + #[arg(long = "use_opq", short, default_value = "false")] + pub use_opq: bool, +} diff --git a/rust/cmd_drivers/convert_f32_to_bf16/Cargo.toml b/rust/cmd_drivers/convert_f32_to_bf16/Cargo.toml new file mode 100644 index 000000000..1993aab9d --- /dev/null +++ b/rust/cmd_drivers/convert_f32_to_bf16/Cargo.toml @@ -0,0 +1,11 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "convert_f32_to_bf16" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +half = "2.2.1" diff --git a/rust/cmd_drivers/convert_f32_to_bf16/src/main.rs b/rust/cmd_drivers/convert_f32_to_bf16/src/main.rs new file mode 100644 index 000000000..87b4fbaf3 --- /dev/null +++ b/rust/cmd_drivers/convert_f32_to_bf16/src/main.rs @@ -0,0 +1,154 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use half::{bf16, f16}; +use std::env; +use std::fs::{File, OpenOptions}; +use std::io::{self, Read, Write, BufReader, BufWriter}; + +enum F16OrBF16 { + F16(f16), + BF16(bf16), +} + +fn main() -> io::Result<()> { + // Retrieve command-line arguments + let args: Vec = env::args().collect(); + + match args.len() { + 3|4|5|6=> {}, + _ => { + print_usage(); + std::process::exit(1); + } + } + + // Retrieve the input and output file paths from the arguments + let input_file_path = &args[1]; + let output_file_path = &args[2]; + let use_f16 = args.len() >= 4 && args[3] == "f16"; + let save_as_float = args.len() >= 5 && args[4] == "save_as_float"; + let batch_size = if args.len() >= 6 { args[5].parse::().unwrap() } else { 100000 }; + println!("use_f16: {}", use_f16); + println!("save_as_float: {}", save_as_float); + println!("batch_size: {}", batch_size); + + // Open the input file for reading + let mut input_file = BufReader::new(File::open(input_file_path)?); + + // Open the output file for writing + let mut output_file = BufWriter::new(OpenOptions::new().write(true).create(true).open(output_file_path)?); + + // Read the first 8 bytes as metadata + let mut metadata = [0; 8]; + input_file.read_exact(&mut metadata)?; + + // Write the metadata to the output file + output_file.write_all(&metadata)?; + + // Extract the number of points and dimension from the metadata + let num_points = i32::from_le_bytes(metadata[..4].try_into().unwrap()); + let dimension = i32::from_le_bytes(metadata[4..].try_into().unwrap()); + let num_batches = num_points / batch_size; + // Calculate the size of one data point in bytes + let data_point_size = (dimension * 4 * batch_size) as usize; + let mut batches_processed = 0; + let numbers_to_print = 2; + let mut numbers_printed = 0; + let mut num_fb16_wins = 0; + let mut num_f16_wins = 0; + let mut bf16_overflow = 0; + let mut f16_overflow = 0; + + // Process each data point + for _ in 0..num_batches { + // Read one data point from the input file + let mut buffer = vec![0; data_point_size]; + match input_file.read_exact(&mut buffer){ + Ok(()) => { + // Convert the float32 data to bf16 + let half_data: Vec = buffer + .chunks_exact(4) + .map(|chunk| { + let value = f32::from_le_bytes([chunk[0], chunk[1], chunk[2], chunk[3]]); + let converted_bf16 = bf16::from_f32(value); + let converted_f16 = f16::from_f32(value); + let distance_f16 = (converted_f16.to_f32() - value).abs(); + let distance_bf16 = (converted_bf16.to_f32() - value).abs(); + + if distance_f16 < distance_bf16 { + num_f16_wins += 1; + } else { + num_fb16_wins += 1; + } + + if (converted_bf16 == bf16::INFINITY) || (converted_bf16 == bf16::NEG_INFINITY) { + bf16_overflow += 1; + } + + if (converted_f16 == f16::INFINITY) || (converted_f16 == f16::NEG_INFINITY) { + f16_overflow += 1; + } + + if numbers_printed < numbers_to_print { + numbers_printed += 1; + println!("f32 value: {} f16 value: {} | distance {}, bf16 value: {} | distance {},", + value, converted_f16, converted_f16.to_f32() - value, converted_bf16, converted_bf16.to_f32() - value); + } + + if use_f16 { + F16OrBF16::F16(converted_f16) + } else { + F16OrBF16::BF16(converted_bf16) + } + }) + .collect(); + + batches_processed += 1; + + match save_as_float { + true => { + for float_val in half_data { + match float_val { + F16OrBF16::F16(f16_val) => output_file.write_all(&f16_val.to_f32().to_le_bytes())?, + F16OrBF16::BF16(bf16_val) => output_file.write_all(&bf16_val.to_f32().to_le_bytes())?, + } + } + } + false => { + for float_val in half_data { + match float_val { + F16OrBF16::F16(f16_val) => output_file.write_all(&f16_val.to_le_bytes())?, + F16OrBF16::BF16(bf16_val) => output_file.write_all(&bf16_val.to_le_bytes())?, + } + } + } + } + + // Print the number of points processed + println!("Processed {} points out of {}", batches_processed * batch_size, num_points); + } + Err(ref e) if e.kind() == io::ErrorKind::UnexpectedEof => { + println!("Conversion completed! {} of times f16 wins | overflow count {}, {} of times bf16 wins | overflow count{}", + num_f16_wins, f16_overflow, num_fb16_wins, bf16_overflow); + break; + } + Err(err) => { + println!("Error: {}", err); + break; + } + }; + } + + Ok(()) +} + +/// Prints the usage information +fn print_usage() { + println!("Usage: program_name input_file output_file [f16] [save_as_float] [batch_size]]"); + println!("specify f16 to downscale to f16. otherwise, downscale to bf16."); + println!("specify save_as_float to downcast to f16 or bf16, and upcast to float before saving the output data. otherwise, the data will be saved as half type."); + println!("specify the batch_size as a int, the default value is 100000."); +} + diff --git a/rust/cmd_drivers/load_and_insert_memory_index/Cargo.toml b/rust/cmd_drivers/load_and_insert_memory_index/Cargo.toml new file mode 100644 index 000000000..cbb4e1e3c --- /dev/null +++ b/rust/cmd_drivers/load_and_insert_memory_index/Cargo.toml @@ -0,0 +1,14 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "load_and_insert_memory_index" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +diskann = { path = "../../diskann" } +logger = { path = "../../logger" } +vector = { path = "../../vector" } + diff --git a/rust/cmd_drivers/load_and_insert_memory_index/src/main.rs b/rust/cmd_drivers/load_and_insert_memory_index/src/main.rs new file mode 100644 index 000000000..41680460a --- /dev/null +++ b/rust/cmd_drivers/load_and_insert_memory_index/src/main.rs @@ -0,0 +1,313 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::env; + +use diskann::{ + common::{ANNResult, ANNError}, + index::create_inmem_index, + utils::round_up, + model::{ + IndexWriteParametersBuilder, + IndexConfiguration, + vertex::{DIM_128, DIM_256, DIM_104} + }, + utils::{Timer, load_metadata_from_file}, +}; + +use vector::{Metric, FullPrecisionDistance, Half}; + +// The main function to build an in-memory index +#[allow(clippy::too_many_arguments)] +fn load_and_insert_in_memory_index ( + metric: Metric, + data_path: &str, + delta_path: &str, + r: u32, + l: u32, + alpha: f32, + save_path: &str, + num_threads: u32, + _use_pq_build: bool, + _num_pq_bytes: usize, + use_opq: bool +) -> ANNResult<()> +where + T: Default + Copy + Sync + Send + Into, + [T; DIM_104]: FullPrecisionDistance, + [T; DIM_128]: FullPrecisionDistance, + [T; DIM_256]: FullPrecisionDistance +{ + let index_write_parameters = IndexWriteParametersBuilder::new(l, r) + .with_alpha(alpha) + .with_saturate_graph(false) + .with_num_threads(num_threads) + .build(); + + let (data_num, data_dim) = load_metadata_from_file(&format!("{}.data", data_path))?; + + let config = IndexConfiguration::new( + metric, + data_dim, + round_up(data_dim as u64, 8_u64) as usize, + data_num, + false, + 0, + use_opq, + 0, + 2.0f32, + index_write_parameters, + ); + let mut index = create_inmem_index::(config)?; + + let timer = Timer::new(); + + index.load(data_path, data_num)?; + + let diff = timer.elapsed(); + + println!("Initial indexing time: {}", diff.as_secs_f64()); + + let (delta_data_num, _) = load_metadata_from_file(delta_path)?; + + index.insert(delta_path, delta_data_num)?; + + index.save(save_path)?; + + Ok(()) +} + +fn main() -> ANNResult<()> { + let mut data_type = String::new(); + let mut dist_fn = String::new(); + let mut data_path = String::new(); + let mut insert_path = String::new(); + let mut index_path_prefix = String::new(); + + let mut num_threads = 0u32; + let mut r = 64u32; + let mut l = 100u32; + + let mut alpha = 1.2f32; + let mut build_pq_bytes = 0u32; + let mut _use_pq_build = false; + let mut use_opq = false; + + let args: Vec = env::args().collect(); + let mut iter = args.iter().skip(1).peekable(); + + while let Some(arg) = iter.next() { + match arg.as_str() { + "--help" | "-h" => { + print_help(); + return Ok(()); + } + "--data_type" => { + data_type = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "data_type".to_string(), + "Missing data type".to_string()) + )? + .to_owned(); + } + "--dist_fn" => { + dist_fn = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "dist_fn".to_string(), + "Missing distance function".to_string()) + )? + .to_owned(); + } + "--data_path" => { + data_path = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "data_path".to_string(), + "Missing data path".to_string()) + )? + .to_owned(); + } + "--insert_path" => { + insert_path = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "insert_path".to_string(), + "Missing insert path".to_string()) + )? + .to_owned(); + } + "--index_path_prefix" => { + index_path_prefix = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "index_path_prefix".to_string(), + "Missing index path prefix".to_string()))? + .to_owned(); + } + "--max_degree" | "-R" => { + r = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "max_degree".to_string(), + "Missing max degree".to_string()))? + .parse() + .map_err(|err| ANNError::log_index_config_error( + "max_degree".to_string(), + format!("ParseIntError: {}", err)) + )?; + } + "--Lbuild" | "-L" => { + l = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "Lbuild".to_string(), + "Missing build complexity".to_string()))? + .parse() + .map_err(|err| ANNError::log_index_config_error( + "Lbuild".to_string(), + format!("ParseIntError: {}", err)) + )?; + } + "--alpha" => { + alpha = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "alpha".to_string(), + "Missing alpha".to_string()))? + .parse() + .map_err(|err| ANNError::log_index_config_error( + "alpha".to_string(), + format!("ParseFloatError: {}", err)) + )?; + } + "--num_threads" | "-T" => { + num_threads = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "num_threads".to_string(), + "Missing number of threads".to_string()))? + .parse() + .map_err(|err| ANNError::log_index_config_error( + "num_threads".to_string(), + format!("ParseIntError: {}", err)) + )?; + } + "--build_PQ_bytes" => { + build_pq_bytes = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "build_PQ_bytes".to_string(), + "Missing PQ bytes".to_string()))? + .parse() + .map_err(|err| ANNError::log_index_config_error( + "build_PQ_bytes".to_string(), + format!("ParseIntError: {}", err)) + )?; + } + "--use_opq" => { + use_opq = iter.next().ok_or_else(|| ANNError::log_index_config_error( + "use_opq".to_string(), + "Missing use_opq flag".to_string()))? + .parse() + .map_err(|err| ANNError::log_index_config_error( + "use_opq".to_string(), + format!("ParseBoolError: {}", err)) + )?; + } + _ => { + return Err(ANNError::log_index_config_error(String::from(""), format!("Unknown argument: {}", arg))); + } + } + } + + if data_type.is_empty() + || dist_fn.is_empty() + || data_path.is_empty() + || index_path_prefix.is_empty() + { + return Err(ANNError::log_index_config_error(String::from(""), "Missing required arguments".to_string())); + } + + _use_pq_build = build_pq_bytes > 0; + + let metric = dist_fn + .parse::() + .map_err(|err| ANNError::log_index_config_error( + "dist_fn".to_string(), + err.to_string(), + ))?; + + println!( + "Starting index build with R: {} Lbuild: {} alpha: {} #threads: {}", + r, l, alpha, num_threads + ); + + match data_type.as_str() { + "int8" => { + load_and_insert_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + )?; + } + "uint8" => { + load_and_insert_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + )?; + } + "float" => { + load_and_insert_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + )?; + } + "f16" => { + load_and_insert_in_memory_index::( + metric, + &data_path, + &insert_path, + r, + l, + alpha, + &index_path_prefix, + num_threads, + _use_pq_build, + build_pq_bytes as usize, + use_opq, + )? + } + _ => { + println!("Unsupported type. Use one of int8, uint8 or float."); + return Err(ANNError::log_index_config_error("data_type".to_string(), "Invalid data type".to_string())); + } + } + + Ok(()) +} + +fn print_help() { + println!("Arguments"); + println!("--help, -h Print information on arguments"); + println!("--data_type data type (required)"); + println!("--dist_fn distance function (required)"); + println!("--data_path Input data file in bin format for initial build (required)"); + println!("--insert_path Input data file in bin format for insert (required)"); + println!("--index_path_prefix Path prefix for saving index file components (required)"); + println!("--max_degree, -R Maximum graph degree (default: 64)"); + println!("--Lbuild, -L Build complexity, higher value results in better graphs (default: 100)"); + println!("--alpha alpha controls density and diameter of graph, set 1 for sparse graph, 1.2 or 1.4 for denser graphs with lower diameter (default: 1.2)"); + println!("--num_threads, -T Number of threads used for building index (defaults to num of CPU logic cores)"); + println!("--build_PQ_bytes Number of PQ bytes to build the index; 0 for full precision build (default: 0)"); + println!("--use_opq Set true for OPQ compression while using PQ distance comparisons for building the index, and false for PQ compression (default: false)"); +} + diff --git a/rust/cmd_drivers/search_memory_index/Cargo.toml b/rust/cmd_drivers/search_memory_index/Cargo.toml new file mode 100644 index 000000000..cba3709aa --- /dev/null +++ b/rust/cmd_drivers/search_memory_index/Cargo.toml @@ -0,0 +1,16 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "search_memory_index" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +bytemuck = "1.13.1" +diskann = { path = "../../diskann" } +num_cpus = "1.15.0" +rayon = "1.7.0" +vector = { path = "../../vector" } + diff --git a/rust/cmd_drivers/search_memory_index/src/main.rs b/rust/cmd_drivers/search_memory_index/src/main.rs new file mode 100644 index 000000000..ca4d4cd1d --- /dev/null +++ b/rust/cmd_drivers/search_memory_index/src/main.rs @@ -0,0 +1,430 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +mod search_index_utils; +use bytemuck::Pod; +use diskann::{ + common::{ANNError, ANNResult}, + index, + model::{ + configuration::index_write_parameters::{default_param_vals, IndexWriteParametersBuilder}, + vertex::{DIM_104, DIM_128, DIM_256}, + IndexConfiguration, + }, + utils::{load_metadata_from_file, save_bin_u32}, +}; +use std::{env, path::Path, process::exit, time::Instant}; +use vector::{FullPrecisionDistance, Half, Metric}; + +use rayon::prelude::*; + +#[allow(clippy::too_many_arguments)] +fn search_memory_index( + metric: Metric, + index_path: &str, + result_path_prefix: &str, + query_file: &str, + truthset_file: &str, + num_threads: u32, + recall_at: u32, + print_all_recalls: bool, + l_vec: &Vec, + show_qps_per_thread: bool, + fail_if_recall_below: f32, +) -> ANNResult +where + T: Default + Copy + Sized + Pod + Sync + Send + Into, + [T; DIM_104]: FullPrecisionDistance, + [T; DIM_128]: FullPrecisionDistance, + [T; DIM_256]: FullPrecisionDistance, +{ + // Load the query file + let (query, query_num, query_dim, query_aligned_dim) = + search_index_utils::load_aligned_bin::(query_file)?; + let mut gt_dim: usize = 0; + let mut gt_ids: Option> = None; + let mut gt_dists: Option> = None; + + // Check for ground truth + let mut calc_recall_flag = false; + if !truthset_file.is_empty() && Path::new(truthset_file).exists() { + let ret = search_index_utils::load_truthset(truthset_file)?; + gt_ids = Some(ret.0); + gt_dists = ret.1; + let gt_num = ret.2; + gt_dim = ret.3; + + if gt_num != query_num { + println!("Error. Mismatch in number of queries and ground truth data"); + } + + calc_recall_flag = true; + } else { + println!( + "Truthset file {} not found. Not computing recall", + truthset_file + ); + } + + let num_frozen_pts = search_index_utils::get_graph_num_frozen_points(index_path)?; + + // C++ uses the max given L value, so we do the same here. Max degree is never specified in C++ so use the rust default + let index_write_params = IndexWriteParametersBuilder::new( + *l_vec.iter().max().unwrap(), + default_param_vals::MAX_DEGREE, + ) + .with_num_threads(num_threads) + .build(); + + let (index_num_points, _) = load_metadata_from_file(&format!("{}.data", index_path))?; + + let index_config = IndexConfiguration::new( + metric, + query_dim, + query_aligned_dim, + index_num_points, + false, + 0, + false, + num_frozen_pts, + 1f32, + index_write_params, + ); + let mut index = index::create_inmem_index::(index_config)?; + + index.load(index_path, index_num_points)?; + + println!("Using {} threads to search", num_threads); + let qps_title = if show_qps_per_thread { + "QPS/thread" + } else { + "QPS" + }; + let mut table_width = 4 + 12 + 18 + 20 + 15; + let mut table_header_str = format!( + "{:>4}{:>12}{:>18}{:>20}{:>15}", + "Ls", qps_title, "Avg dist cmps", "Mean Latency (mus)", "99.9 Latency" + ); + + let first_recall: u32 = if print_all_recalls { 1 } else { recall_at }; + let mut recalls_to_print: usize = 0; + if calc_recall_flag { + for curr_recall in first_recall..=recall_at { + let recall_str = format!("Recall@{}", curr_recall); + table_header_str.push_str(&format!("{:>12}", recall_str)); + recalls_to_print = (recall_at + 1 - first_recall) as usize; + table_width += recalls_to_print * 12; + } + } + + println!("{}", table_header_str); + println!("{}", "=".repeat(table_width)); + + let mut query_result_ids: Vec> = + vec![vec![0; query_num * recall_at as usize]; l_vec.len()]; + let mut latency_stats: Vec = vec![0.0; query_num]; + let mut cmp_stats: Vec = vec![0; query_num]; + let mut best_recall = 0.0; + + std::env::set_var("RAYON_NUM_THREADS", num_threads.to_string()); + + for test_id in 0..l_vec.len() { + let l_value = l_vec[test_id]; + + if l_value < recall_at { + println!( + "Ignoring search with L:{} since it's smaller than K:{}", + l_value, recall_at + ); + continue; + } + + let zipped = cmp_stats + .par_iter_mut() + .zip(latency_stats.par_iter_mut()) + .zip(query_result_ids[test_id].par_chunks_mut(recall_at as usize)) + .zip(query.par_chunks(query_aligned_dim)); + + let start = Instant::now(); + zipped.for_each(|(((cmp, latency), query_result), query_chunk)| { + let query_start = Instant::now(); + *cmp = index + .search(query_chunk, recall_at as usize, l_value, query_result) + .unwrap(); + + let query_end = Instant::now(); + let diff = query_end.duration_since(query_start); + *latency = diff.as_micros() as f32; + }); + let diff = Instant::now().duration_since(start); + + let mut displayed_qps: f32 = query_num as f32 / diff.as_secs_f32(); + if show_qps_per_thread { + displayed_qps /= num_threads as f32; + } + + let mut recalls: Vec = Vec::new(); + if calc_recall_flag { + recalls.reserve(recalls_to_print); + for curr_recall in first_recall..=recall_at { + recalls.push(search_index_utils::calculate_recall( + query_num, + gt_ids.as_ref().unwrap(), + >_dists, + gt_dim, + &query_result_ids[test_id], + recall_at, + curr_recall, + )? as f32); + } + } + + latency_stats.sort_by(|a, b| a.partial_cmp(b).unwrap()); + let mean_latency = latency_stats.iter().sum::() / query_num as f32; + let avg_cmps = cmp_stats.iter().sum::() as f32 / query_num as f32; + + let mut stat_str = format!( + "{: >4}{: >12.2}{: >18.2}{: >20.2}{: >15.2}", + l_value, + displayed_qps, + avg_cmps, + mean_latency, + latency_stats[(0.999 * query_num as f32).round() as usize] + ); + + for recall in recalls.iter() { + stat_str.push_str(&format!("{: >12.2}", recall)); + best_recall = f32::max(best_recall, *recall); + } + + println!("{}", stat_str); + } + + println!("Done searching. Now saving results"); + for (test_id, l_value) in l_vec.iter().enumerate() { + if *l_value < recall_at { + println!( + "Ignoring all search with L: {} since it's smaller than K: {}", + l_value, recall_at + ); + } + + let cur_result_path = format!("{}_{}_idx_uint32.bin", result_path_prefix, l_value); + save_bin_u32( + &cur_result_path, + query_result_ids[test_id].as_slice(), + query_num, + recall_at as usize, + 0, + )?; + } + + if best_recall >= fail_if_recall_below { + Ok(0) + } else { + Ok(-1) + } +} + +fn main() -> ANNResult<()> { + let return_val: i32; + { + let mut data_type: String = String::new(); + let mut metric: Option = None; + let mut index_path: String = String::new(); + let mut result_path_prefix: String = String::new(); + let mut query_file: String = String::new(); + let mut truthset_file: String = String::new(); + let mut num_cpus: u32 = num_cpus::get() as u32; + let mut recall_at: Option = None; + let mut print_all_recalls: bool = false; + let mut l_vec: Vec = Vec::new(); + let mut show_qps_per_thread: bool = false; + let mut fail_if_recall_below: f32 = 0.0; + + let args: Vec = env::args().collect(); + let mut iter = args.iter().skip(1).peekable(); + while let Some(arg) = iter.next() { + let ann_error = + || ANNError::log_index_config_error(String::from(arg), format!("Missing {}", arg)); + match arg.as_str() { + "--help" | "-h" => { + print_help(); + return Ok(()); + } + "--data_type" => { + data_type = iter.next().ok_or_else(ann_error)?.to_owned(); + } + "--dist_fn" => { + metric = Some(iter.next().ok_or_else(ann_error)?.parse().map_err(|err| { + ANNError::log_index_config_error( + String::from(arg), + format!("ParseError: {}", err), + ) + })?); + } + "--index_path_prefix" => { + index_path = iter.next().ok_or_else(ann_error)?.to_owned(); + } + "--result_path" => { + result_path_prefix = iter.next().ok_or_else(ann_error)?.to_owned(); + } + "--query_file" => { + query_file = iter.next().ok_or_else(ann_error)?.to_owned(); + } + "--gt_file" => { + truthset_file = iter.next().ok_or_else(ann_error)?.to_owned(); + } + "--recall_at" | "-K" => { + recall_at = + Some(iter.next().ok_or_else(ann_error)?.parse().map_err(|err| { + ANNError::log_index_config_error( + String::from(arg), + format!("ParseError: {}", err), + ) + })?); + } + "--print_all_recalls" => { + print_all_recalls = true; + } + "--search_list" | "-L" => { + while iter.peek().is_some() && !iter.peek().unwrap().starts_with('-') { + l_vec.push(iter.next().ok_or_else(ann_error)?.parse().map_err(|err| { + ANNError::log_index_config_error( + String::from(arg), + format!("ParseError: {}", err), + ) + })?); + } + } + "--num_threads" => { + num_cpus = iter.next().ok_or_else(ann_error)?.parse().map_err(|err| { + ANNError::log_index_config_error( + String::from(arg), + format!("ParseError: {}", err), + ) + })?; + } + "--qps_per_thread" => { + show_qps_per_thread = true; + } + "--fail_if_recall_below" => { + fail_if_recall_below = + iter.next().ok_or_else(ann_error)?.parse().map_err(|err| { + ANNError::log_index_config_error( + String::from(arg), + format!("ParseError: {}", err), + ) + })?; + } + _ => { + return Err(ANNError::log_index_error(format!( + "Unknown argument: {}", + arg + ))); + } + } + } + + if metric.is_none() { + return Err(ANNError::log_index_error(String::from("No metric given!"))); + } else if recall_at.is_none() { + return Err(ANNError::log_index_error(String::from( + "No recall_at given!", + ))); + } + + // Seems like float is the only supported data type for FullPrecisionDistance right now, + // but keep the structure in place here for future data types + match data_type.as_str() { + "float" => { + return_val = search_memory_index::( + metric.unwrap(), + &index_path, + &result_path_prefix, + &query_file, + &truthset_file, + num_cpus, + recall_at.unwrap(), + print_all_recalls, + &l_vec, + show_qps_per_thread, + fail_if_recall_below, + )?; + } + "int8" => { + return_val = search_memory_index::( + metric.unwrap(), + &index_path, + &result_path_prefix, + &query_file, + &truthset_file, + num_cpus, + recall_at.unwrap(), + print_all_recalls, + &l_vec, + show_qps_per_thread, + fail_if_recall_below, + )?; + } + "uint8" => { + return_val = search_memory_index::( + metric.unwrap(), + &index_path, + &result_path_prefix, + &query_file, + &truthset_file, + num_cpus, + recall_at.unwrap(), + print_all_recalls, + &l_vec, + show_qps_per_thread, + fail_if_recall_below, + )?; + } + "f16" => { + return_val = search_memory_index::( + metric.unwrap(), + &index_path, + &result_path_prefix, + &query_file, + &truthset_file, + num_cpus, + recall_at.unwrap(), + print_all_recalls, + &l_vec, + show_qps_per_thread, + fail_if_recall_below, + )?; + } + _ => { + return Err(ANNError::log_index_error(format!( + "Unknown data type: {}!", + data_type + ))); + } + } + } + + // Rust only allows returning values with this method, but this will immediately terminate the program without running destructors on the + // stack. To get around this enclose main function logic in a block so that by the time we return here all destructors have been called. + exit(return_val); +} + +fn print_help() { + println!("Arguments"); + println!("--help, -h Print information on arguments"); + println!("--data_type data type (required)"); + println!("--dist_fn distance function (required)"); + println!("--index_path_prefix Path prefix to the index (required)"); + println!("--result_path Path prefix for saving results of the queries (required)"); + println!("--query_file Query file in binary format"); + println!("--gt_file Ground truth file for the queryset"); + println!("--recall_at, -K Number of neighbors to be returned"); + println!("--print_all_recalls Print recalls at all positions, from 1 up to specified recall_at value"); + println!("--search_list List of L values of search"); + println!("----num_threads, -T Number of threads used for building index (defaults to num_cpus::get())"); + println!("--qps_per_thread Print overall QPS divided by the number of threads in the output table"); + println!("--fail_if_recall_below If set to a value >0 and <100%, program returns -1 if best recall found is below this threshold"); +} diff --git a/rust/cmd_drivers/search_memory_index/src/search_index_utils.rs b/rust/cmd_drivers/search_memory_index/src/search_index_utils.rs new file mode 100644 index 000000000..c7b04a47f --- /dev/null +++ b/rust/cmd_drivers/search_memory_index/src/search_index_utils.rs @@ -0,0 +1,186 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use bytemuck::{cast_slice, Pod}; +use diskann::{ + common::{ANNError, ANNResult, AlignedBoxWithSlice}, + model::data_store::DatasetDto, + utils::{copy_aligned_data_from_file, is_aligned, round_up}, +}; +use std::collections::HashSet; +use std::fs::File; +use std::io::Read; +use std::mem::size_of; + +pub(crate) fn calculate_recall( + num_queries: usize, + gold_std: &[u32], + gs_dist: &Option>, + dim_gs: usize, + our_results: &[u32], + dim_or: u32, + recall_at: u32, +) -> ANNResult { + let mut total_recall: f64 = 0.0; + let (mut gt, mut res): (HashSet, HashSet) = (HashSet::new(), HashSet::new()); + + for i in 0..num_queries { + gt.clear(); + res.clear(); + + let gt_slice = &gold_std[dim_gs * i..]; + let res_slice = &our_results[dim_or as usize * i..]; + let mut tie_breaker = recall_at as usize; + + if gs_dist.is_some() { + tie_breaker = (recall_at - 1) as usize; + let gt_dist_vec = &gs_dist.as_ref().unwrap()[dim_gs * i..]; + while tie_breaker < dim_gs + && gt_dist_vec[tie_breaker] == gt_dist_vec[(recall_at - 1) as usize] + { + tie_breaker += 1; + } + } + + (0..tie_breaker).for_each(|idx| { + gt.insert(gt_slice[idx]); + }); + + (0..tie_breaker).for_each(|idx| { + res.insert(res_slice[idx]); + }); + + let mut cur_recall: u32 = 0; + for v in gt.iter() { + if res.contains(v) { + cur_recall += 1; + } + } + + total_recall += cur_recall as f64; + } + + Ok(total_recall / num_queries as f64 * (100.0 / recall_at as f64)) +} + +pub(crate) fn get_graph_num_frozen_points(graph_file: &str) -> ANNResult { + let mut file = File::open(graph_file)?; + let mut usize_buffer = [0; size_of::()]; + let mut u32_buffer = [0; size_of::()]; + + file.read_exact(&mut usize_buffer)?; + file.read_exact(&mut u32_buffer)?; + file.read_exact(&mut u32_buffer)?; + file.read_exact(&mut usize_buffer)?; + let file_frozen_pts = usize::from_le_bytes(usize_buffer); + + Ok(file_frozen_pts) +} + +#[inline] +pub(crate) fn load_truthset( + bin_file: &str, +) -> ANNResult<(Vec, Option>, usize, usize)> { + let mut file = File::open(bin_file)?; + let actual_file_size = file.metadata()?.len() as usize; + + let mut buffer = [0; size_of::()]; + file.read_exact(&mut buffer)?; + let npts = i32::from_le_bytes(buffer) as usize; + + file.read_exact(&mut buffer)?; + let dim = i32::from_le_bytes(buffer) as usize; + + println!("Metadata: #pts = {npts}, #dims = {dim}... "); + + let expected_file_size_with_dists: usize = + 2 * npts * dim * size_of::() + 2 * size_of::(); + let expected_file_size_just_ids: usize = npts * dim * size_of::() + 2 * size_of::(); + + let truthset_type : i32 = match actual_file_size + { + // This is in the C++ code, but nothing is done in this case. Keeping it here for future reference just in case. + // expected_file_size_just_ids => 2, + x if x == expected_file_size_with_dists => 1, + _ => return Err(ANNError::log_index_error(format!("Error. File size mismatch. File should have bin format, with npts followed by ngt + followed by npts*ngt ids and optionally followed by npts*ngt distance values; actual size: {}, expected: {} or {}", + actual_file_size, + expected_file_size_with_dists, + expected_file_size_just_ids))) + }; + + let mut ids: Vec = vec![0; npts * dim]; + let mut buffer = vec![0; npts * dim * size_of::()]; + file.read_exact(&mut buffer)?; + ids.clone_from_slice(cast_slice::(&buffer)); + + if truthset_type == 1 { + let mut dists: Vec = vec![0.0; npts * dim]; + let mut buffer = vec![0; npts * dim * size_of::()]; + file.read_exact(&mut buffer)?; + dists.clone_from_slice(cast_slice::(&buffer)); + + return Ok((ids, Some(dists), npts, dim)); + } + + Ok((ids, None, npts, dim)) +} + +#[inline] +pub(crate) fn load_aligned_bin( + bin_file: &str, +) -> ANNResult<(AlignedBoxWithSlice, usize, usize, usize)> { + let t_size = size_of::(); + let (npts, dim, file_size): (usize, usize, usize); + { + println!("Reading (with alignment) bin file: {bin_file}"); + let mut file = File::open(bin_file)?; + file_size = file.metadata()?.len() as usize; + + let mut buffer = [0; size_of::()]; + file.read_exact(&mut buffer)?; + npts = i32::from_le_bytes(buffer) as usize; + + file.read_exact(&mut buffer)?; + dim = i32::from_le_bytes(buffer) as usize; + } + + let rounded_dim = round_up(dim, 8); + let expected_actual_file_size = npts * dim * size_of::() + 2 * size_of::(); + + if file_size != expected_actual_file_size { + return Err(ANNError::log_index_error(format!( + "ERROR: File size mismatch. Actual size is {} while expected size is {} + npts = {}, #dims = {}, aligned_dim = {}", + file_size, expected_actual_file_size, npts, dim, rounded_dim + ))); + } + + println!("Metadata: #pts = {npts}, #dims = {dim}, aligned_dim = {rounded_dim}..."); + + let alloc_size = npts * rounded_dim; + let alignment = 8 * t_size; + println!( + "allocating aligned memory of {} bytes... ", + alloc_size * t_size + ); + if !is_aligned(alloc_size * t_size, alignment) { + return Err(ANNError::log_index_error(format!( + "Requested memory size is not a multiple of {}. Can not be allocated.", + alignment + ))); + } + + let mut data = AlignedBoxWithSlice::::new(alloc_size, alignment)?; + let dto = DatasetDto { + data: &mut data, + rounded_dim, + }; + + println!("done. Copying data to mem_aligned buffer..."); + + let (_, _) = copy_aligned_data_from_file(bin_file, dto, 0)?; + + Ok((data, npts, dim, rounded_dim)) +} diff --git a/rust/diskann/Cargo.toml b/rust/diskann/Cargo.toml new file mode 100644 index 000000000..a5be54750 --- /dev/null +++ b/rust/diskann/Cargo.toml @@ -0,0 +1,45 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "diskann" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +bincode = "1.3.3" +bit-vec = "0.6.3" +byteorder = "1.4.3" +cblas = "0.4.0" +crossbeam = "0.8.2" +half = "2.2.1" +hashbrown = "0.13.2" +num-traits = "0.2.15" +once_cell = "1.17.1" +openblas-src = { version = "0.10.8", features = ["system"] } +rand = { version = "0.8.5", features = [ "small_rng" ] } +rayon = "1.7.0" +serde = { version = "1.0.130", features = ["derive"] } +thiserror = "1.0.40" +winapi = { version = "0.3.9", features = ["errhandlingapi", "fileapi", "ioapiset", "handleapi", "winnt", "minwindef", "basetsd", "winerror", "winbase"] } + +logger = { path = "../logger" } +platform = { path = "../platform" } +vector = { path = "../vector" } + +[build-dependencies] +cc = "1.0.79" + +[dev-dependencies] +approx = "0.5.1" +criterion = "0.5.1" + + +[[bench]] +name = "distance_bench" +harness = false + +[[bench]] +name = "neighbor_bench" +harness = false diff --git a/rust/diskann/benches/distance_bench.rs b/rust/diskann/benches/distance_bench.rs new file mode 100644 index 000000000..885c95bac --- /dev/null +++ b/rust/diskann/benches/distance_bench.rs @@ -0,0 +1,47 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use rand::{thread_rng, Rng}; +use vector::{FullPrecisionDistance, Metric}; + +// make sure the vector is 256-bit (32 bytes) aligned required by _mm256_load_ps +#[repr(C, align(32))] +struct Vector32ByteAligned { + v: [f32; 256], +} + +fn benchmark_l2_distance_float_rust(c: &mut Criterion) { + let (a, b) = prepare_random_aligned_vectors(); + let mut group = c.benchmark_group("avx-computation"); + group.sample_size(5000); + + group.bench_function("AVX Rust run", |f| { + f.iter(|| { + black_box(<[f32; 256]>::distance_compare( + black_box(&a.v), + black_box(&b.v), + Metric::L2, + )) + }) + }); +} + +// make sure the vector is 256-bit (32 bytes) aligned required by _mm256_load_ps +fn prepare_random_aligned_vectors() -> (Box, Box) { + let a = Box::new(Vector32ByteAligned { + v: [(); 256].map(|_| thread_rng().gen_range(0.0..100.0)), + }); + + let b = Box::new(Vector32ByteAligned { + v: [(); 256].map(|_| thread_rng().gen_range(0.0..100.0)), + }); + + (a, b) +} + +criterion_group!(benches, benchmark_l2_distance_float_rust,); +criterion_main!(benches); + diff --git a/rust/diskann/benches/kmeans_bench.rs b/rust/diskann/benches/kmeans_bench.rs new file mode 100644 index 000000000..c69c16a8c --- /dev/null +++ b/rust/diskann/benches/kmeans_bench.rs @@ -0,0 +1,70 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use criterion::{criterion_group, criterion_main, Criterion}; +use diskann::utils::k_means_clustering; +use rand::Rng; + +const NUM_POINTS: usize = 10000; +const DIM: usize = 100; +const NUM_CENTERS: usize = 256; +const MAX_KMEANS_REPS: usize = 12; + +fn benchmark_kmeans_rust(c: &mut Criterion) { + let mut rng = rand::thread_rng(); + let data: Vec = (0..NUM_POINTS * DIM) + .map(|_| rng.gen_range(-1.0..1.0)) + .collect(); + let centers: Vec = vec![0.0; NUM_CENTERS * DIM]; + + let mut group = c.benchmark_group("kmeans-computation"); + group.sample_size(500); + + group.bench_function("K-Means Rust run", |f| { + f.iter(|| { + // let mut centers_copy = centers.clone(); + let data_copy = data.clone(); + let mut centers_copy = centers.clone(); + k_means_clustering( + &data_copy, + NUM_POINTS, + DIM, + &mut centers_copy, + NUM_CENTERS, + MAX_KMEANS_REPS, + ) + }) + }); +} + +fn benchmark_kmeans_c(c: &mut Criterion) { + let mut rng = rand::thread_rng(); + let data: Vec = (0..NUM_POINTS * DIM) + .map(|_| rng.gen_range(-1.0..1.0)) + .collect(); + let centers: Vec = vec![0.0; NUM_CENTERS * DIM]; + + let mut group = c.benchmark_group("kmeans-computation"); + group.sample_size(500); + + group.bench_function("K-Means C++ Run", |f| { + f.iter(|| { + let data_copy = data.clone(); + let mut centers_copy = centers.clone(); + let _ = k_means_clustering( + data_copy.as_slice(), + NUM_POINTS, + DIM, + centers_copy.as_mut_slice(), + NUM_CENTERS, + MAX_KMEANS_REPS, + ); + }) + }); +} + +criterion_group!(benches, benchmark_kmeans_rust, benchmark_kmeans_c); + +criterion_main!(benches); + diff --git a/rust/diskann/benches/neighbor_bench.rs b/rust/diskann/benches/neighbor_bench.rs new file mode 100644 index 000000000..958acdce2 --- /dev/null +++ b/rust/diskann/benches/neighbor_bench.rs @@ -0,0 +1,49 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::time::Duration; + +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use diskann::model::{Neighbor, NeighborPriorityQueue}; +use rand::distributions::{Distribution, Uniform}; +use rand::rngs::StdRng; +use rand::SeedableRng; + +fn benchmark_priority_queue_insert(c: &mut Criterion) { + let vec = generate_random_floats(); + let mut group = c.benchmark_group("neighborqueue-insert"); + group.measurement_time(Duration::from_secs(3)).sample_size(500); + + let mut queue = NeighborPriorityQueue::with_capacity(64_usize); + group.bench_function("Neighbor Priority Queue Insert", |f| { + f.iter(|| { + queue.clear(); + for n in vec.iter() { + queue.insert(*n); + } + + black_box(&1) + }); + }); +} + +fn generate_random_floats() -> Vec { + let seed: [u8; 32] = [73; 32]; + let mut rng: StdRng = SeedableRng::from_seed(seed); + let range = Uniform::new(0.0, 1.0); + let mut random_floats = Vec::with_capacity(100); + + for i in 0..100 { + let random_float = range.sample(&mut rng) as f32; + let n = Neighbor::new(i, random_float); + random_floats.push(n); + } + + random_floats +} + +criterion_group!(benches, benchmark_priority_queue_insert); +criterion_main!(benches); + diff --git a/rust/diskann/src/algorithm/mod.rs b/rust/diskann/src/algorithm/mod.rs new file mode 100644 index 000000000..87e377c8b --- /dev/null +++ b/rust/diskann/src/algorithm/mod.rs @@ -0,0 +1,7 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +pub mod search; + +pub mod prune; diff --git a/rust/diskann/src/algorithm/prune/mod.rs b/rust/diskann/src/algorithm/prune/mod.rs new file mode 100644 index 000000000..4627eeb10 --- /dev/null +++ b/rust/diskann/src/algorithm/prune/mod.rs @@ -0,0 +1,6 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[allow(clippy::module_inception)] +pub mod prune; diff --git a/rust/diskann/src/algorithm/prune/prune.rs b/rust/diskann/src/algorithm/prune/prune.rs new file mode 100644 index 000000000..40fec4a5d --- /dev/null +++ b/rust/diskann/src/algorithm/prune/prune.rs @@ -0,0 +1,288 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use hashbrown::HashSet; +use vector::{FullPrecisionDistance, Metric}; + +use crate::common::{ANNError, ANNResult}; +use crate::index::InmemIndex; +use crate::model::graph::AdjacencyList; +use crate::model::neighbor::SortedNeighborVector; +use crate::model::scratch::InMemQueryScratch; +use crate::model::Neighbor; + +impl InmemIndex +where + T: Default + Copy + Sync + Send + Into, + [T; N]: FullPrecisionDistance, +{ + /// A method that occludes a list of neighbors based on some criteria + #[allow(clippy::too_many_arguments)] + fn occlude_list( + &self, + location: u32, + pool: &mut SortedNeighborVector, + alpha: f32, + degree: u32, + max_candidate_size: usize, + result: &mut AdjacencyList, + scratch: &mut InMemQueryScratch, + delete_set_ptr: Option<&HashSet>, + ) -> ANNResult<()> { + if pool.is_empty() { + return Ok(()); + } + + if !result.is_empty() { + return Err(ANNError::log_index_error( + "result is not empty.".to_string(), + )); + } + + // Truncate pool at max_candidate_size and initialize scratch spaces + if pool.len() > max_candidate_size { + pool.truncate(max_candidate_size); + } + + let occlude_factor = &mut scratch.occlude_factor; + + // occlude_list can be called with the same scratch more than once by + // search_for_point_and_add_link through inter_insert. + occlude_factor.clear(); + + // Initialize occlude_factor to pool.len() many 0.0 values for correctness + occlude_factor.resize(pool.len(), 0.0); + + let mut cur_alpha = 1.0; + while cur_alpha <= alpha && result.len() < degree as usize { + for (i, neighbor) in pool.iter().enumerate() { + if result.len() >= degree as usize { + break; + } + if occlude_factor[i] > cur_alpha { + continue; + } + // Set the entry to f32::MAX so that is not considered again + occlude_factor[i] = f32::MAX; + + // Add the entry to the result if its not been deleted, and doesn't + // add a self loop + if delete_set_ptr.map_or(true, |delete_set| !delete_set.contains(&neighbor.id)) + && neighbor.id != location + { + result.push(neighbor.id); + } + + // Update occlude factor for points from i+1 to pool.len() + for (j, neighbor2) in pool.iter().enumerate().skip(i + 1) { + if occlude_factor[j] > alpha { + continue; + } + + // todo - self.filtered_index + let djk = self.get_distance(neighbor2.id, neighbor.id)?; + match self.configuration.dist_metric { + Metric::L2 | Metric::Cosine => { + occlude_factor[j] = if djk == 0.0 { + f32::MAX + } else { + occlude_factor[j].max(neighbor2.distance / djk) + }; + } + } + } + } + + cur_alpha *= 1.2; + } + + Ok(()) + } + + /// Prunes the neighbors of a given data point based on some criteria and returns a list of pruned ids. + /// + /// # Arguments + /// + /// * `location` - The id of the data point whose neighbors are to be pruned. + /// * `pool` - A vector of neighbors to be pruned, sorted by distance to the query point. + /// * `pruned_list` - A vector to store the ids of the pruned neighbors. + /// * `scratch` - A mutable reference to a scratch space for in-memory queries. + /// + /// # Panics + /// + /// Panics if `pruned_list` contains more than `range` elements after pruning. + pub fn prune_neighbors( + &self, + location: u32, + pool: &mut Vec, + pruned_list: &mut AdjacencyList, + scratch: &mut InMemQueryScratch, + ) -> ANNResult<()> { + self.robust_prune( + location, + pool, + self.configuration.index_write_parameter.max_degree, + self.configuration.index_write_parameter.max_occlusion_size, + self.configuration.index_write_parameter.alpha, + pruned_list, + scratch, + ) + } + + /// Prunes the neighbors of a given data point based on some criteria and returns a list of pruned ids. + /// + /// # Arguments + /// + /// * `location` - The id of the data point whose neighbors are to be pruned. + /// * `pool` - A vector of neighbors to be pruned, sorted by distance to the query point. + /// * `range` - The maximum number of neighbors to keep after pruning. + /// * `max_candidate_size` - The maximum number of candidates to consider for pruning. + /// * `alpha` - A parameter that controls the occlusion pruning strategy. + /// * `pruned_list` - A vector to store the ids of the pruned neighbors. + /// * `scratch` - A mutable reference to a scratch space for in-memory queries. + /// + /// # Error + /// + /// Return error if `pruned_list` contains more than `range` elements after pruning. + #[allow(clippy::too_many_arguments)] + fn robust_prune( + &self, + location: u32, + pool: &mut Vec, + range: u32, + max_candidate_size: u32, + alpha: f32, + pruned_list: &mut AdjacencyList, + scratch: &mut InMemQueryScratch, + ) -> ANNResult<()> { + if pool.is_empty() { + // if the pool is empty, behave like a noop + pruned_list.clear(); + return Ok(()); + } + + // If using _pq_build, over-write the PQ distances with actual distances + // todo : pq_dist + + // sort the pool based on distance to query and prune it with occlude_list + let mut pool = SortedNeighborVector::new(pool); + pruned_list.clear(); + + self.occlude_list( + location, + &mut pool, + alpha, + range, + max_candidate_size as usize, + pruned_list, + scratch, + Option::None, + )?; + + if pruned_list.len() > range as usize { + return Err(ANNError::log_index_error(format!( + "pruned_list's len {} is over range {}.", + pruned_list.len(), + range + ))); + } + + if self.configuration.index_write_parameter.saturate_graph && alpha > 1.0f32 { + for neighbor in pool.iter() { + if pruned_list.len() >= (range as usize) { + break; + } + if !pruned_list.contains(&neighbor.id) && neighbor.id != location { + pruned_list.push(neighbor.id); + } + } + } + + Ok(()) + } + + /// A method that inserts a point n into the graph of its neighbors and their neighbors, + /// pruning the graph if necessary to keep it within the specified range + /// * `n` - The index of the new point + /// * `pruned_list` is a vector of the neighbors of n that have been pruned by a previous step + /// * `range` is the target number of neighbors for each point + /// * `scratch` is a mutable reference to a scratch space that can be reused for intermediate computations + pub fn inter_insert( + &self, + n: u32, + pruned_list: &Vec, + range: u32, + scratch: &mut InMemQueryScratch, + ) -> ANNResult<()> { + // Borrow the pruned_list as a source pool of neighbors + let src_pool = pruned_list; + + if src_pool.is_empty() { + return Err(ANNError::log_index_error("src_pool is empty.".to_string())); + } + + for &vertex_id in src_pool { + // vertex is the index of a neighbor of n + // Assert that vertex is within the valid range of points + if (vertex_id as usize) + >= self.configuration.max_points + self.configuration.num_frozen_pts + { + return Err(ANNError::log_index_error(format!( + "vertex_id {} is out of valid range of points {}", + vertex_id, + self.configuration.max_points + self.configuration.num_frozen_pts, + ))); + } + + let neighbors = self.add_to_neighbors(vertex_id, n, range)?; + + if let Some(copy_of_neighbors) = neighbors { + // Pruning is needed, create a dummy set and a dummy vector to store the unique neighbors of vertex_id + let mut dummy_pool = self.get_unique_neighbors(©_of_neighbors, vertex_id)?; + + // Create a new vector to store the pruned neighbors of vertex_id + let mut new_out_neighbors = + AdjacencyList::for_range(self.configuration.write_range()); + // Prune the neighbors of vertex_id using a helper method + self.prune_neighbors(vertex_id, &mut dummy_pool, &mut new_out_neighbors, scratch)?; + + self.set_neighbors(vertex_id, new_out_neighbors)?; + } + } + + Ok(()) + } + + /// Adds a node to the list of neighbors for the given node. + /// + /// # Arguments + /// + /// * `vertex_id` - The ID of the node to add the neighbor to. + /// * `node_id` - The ID of the node to add. + /// * `range` - The range of the graph. + /// + /// # Return + /// + /// Returns `None` if the node is already in the list of neighbors, or a `Vec` containing the updated list of neighbors if the list of neighbors is full. + fn add_to_neighbors( + &self, + vertex_id: u32, + node_id: u32, + range: u32, + ) -> ANNResult>> { + // vertex contains a vector of the neighbors of vertex_id + let mut vertex_guard = self.final_graph.write_vertex_and_neighbors(vertex_id)?; + + Ok(vertex_guard.add_to_neighbors(node_id, range)) + } + + fn set_neighbors(&self, vertex_id: u32, new_out_neighbors: AdjacencyList) -> ANNResult<()> { + // vertex contains a vector of the neighbors of vertex_id + let mut vertex_guard = self.final_graph.write_vertex_and_neighbors(vertex_id)?; + + vertex_guard.set_neighbors(new_out_neighbors); + Ok(()) + } +} + diff --git a/rust/diskann/src/algorithm/search/mod.rs b/rust/diskann/src/algorithm/search/mod.rs new file mode 100644 index 000000000..9f007ab69 --- /dev/null +++ b/rust/diskann/src/algorithm/search/mod.rs @@ -0,0 +1,7 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[allow(clippy::module_inception)] +pub mod search; + diff --git a/rust/diskann/src/algorithm/search/search.rs b/rust/diskann/src/algorithm/search/search.rs new file mode 100644 index 000000000..ab6d01696 --- /dev/null +++ b/rust/diskann/src/algorithm/search/search.rs @@ -0,0 +1,359 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Search algorithm for index construction and query + +use crate::common::{ANNError, ANNResult}; +use crate::index::InmemIndex; +use crate::model::{scratch::InMemQueryScratch, Neighbor, Vertex}; +use hashbrown::hash_set::Entry::*; +use vector::FullPrecisionDistance; + +impl InmemIndex +where + T: Default + Copy + Sync + Send + Into, + [T; N]: FullPrecisionDistance, +{ + /// Search for query using given L value, for benchmarking purposes + /// # Arguments + /// * `query` - query vertex + /// * `scratch` - in-memory query scratch + /// * `search_list_size` - search list size to use for the benchmark + pub fn search_with_l_override( + &self, + query: &Vertex, + scratch: &mut InMemQueryScratch, + search_list_size: usize, + ) -> ANNResult { + let init_ids = self.get_init_ids()?; + self.init_graph_for_point(query, init_ids, scratch)?; + // Scratch is created using largest L val from search_memory_index, so we artifically make it smaller here + // This allows us to use the same scratch for all L values without having to rebuild the query scratch + scratch.best_candidates.set_capacity(search_list_size); + let (_, cmp) = self.greedy_search(query, scratch)?; + + Ok(cmp) + } + + /// search for point + /// # Arguments + /// * `query` - query vertex + /// * `scratch` - in-memory query scratch + /// TODO: use_filter, filteredLindex + pub fn search_for_point( + &self, + query: &Vertex, + scratch: &mut InMemQueryScratch, + ) -> ANNResult> { + let init_ids = self.get_init_ids()?; + self.init_graph_for_point(query, init_ids, scratch)?; + let (mut visited_nodes, _) = self.greedy_search(query, scratch)?; + + visited_nodes.retain(|&element| element.id != query.vertex_id()); + Ok(visited_nodes) + } + + /// Returns the locations of start point and frozen points suitable for use with iterate_to_fixed_point. + fn get_init_ids(&self) -> ANNResult> { + let mut init_ids = Vec::with_capacity(1 + self.configuration.num_frozen_pts); + init_ids.push(self.start); + + for frozen in self.configuration.max_points + ..(self.configuration.max_points + self.configuration.num_frozen_pts) + { + let frozen_u32 = frozen.try_into()?; + if frozen_u32 != self.start { + init_ids.push(frozen_u32); + } + } + + Ok(init_ids) + } + + /// Initialize graph for point + /// # Arguments + /// * `query` - query vertex + /// * `init_ids` - initial nodes from which search starts + /// * `scratch` - in-memory query scratch + /// * `search_list_size_override` - override for search list size in index config + fn init_graph_for_point( + &self, + query: &Vertex, + init_ids: Vec, + scratch: &mut InMemQueryScratch, + ) -> ANNResult<()> { + scratch + .best_candidates + .reserve(self.configuration.index_write_parameter.search_list_size as usize); + scratch.query.memcpy(query.vector())?; + + if !scratch.id_scratch.is_empty() { + return Err(ANNError::log_index_error( + "id_scratch is not empty.".to_string(), + )); + } + + let query_vertex = Vertex::::try_from((&scratch.query[..], query.vertex_id())) + .map_err(|err| { + ANNError::log_index_error(format!( + "TryFromSliceError: failed to get Vertex for query, err={}", + err + )) + })?; + + for id in init_ids { + if (id as usize) >= self.configuration.max_points + self.configuration.num_frozen_pts { + return Err(ANNError::log_index_error(format!( + "vertex_id {} is out of valid range of points {}", + id, + self.configuration.max_points + self.configuration.num_frozen_pts + ))); + } + + if let Vacant(entry) = scratch.node_visited_robinset.entry(id) { + entry.insert(); + + let vertex = self.dataset.get_vertex(id)?; + + let distance = vertex.compare(&query_vertex, self.configuration.dist_metric); + let neighbor = Neighbor::new(id, distance); + scratch.best_candidates.insert(neighbor); + } + } + + Ok(()) + } + + /// GreedySearch against query node + /// Returns visited nodes + /// # Arguments + /// * `query` - query vertex + /// * `scratch` - in-memory query scratch + /// TODO: use_filter, filter_label, search_invocation + fn greedy_search( + &self, + query: &Vertex, + scratch: &mut InMemQueryScratch, + ) -> ANNResult<(Vec, u32)> { + let mut visited_nodes = + Vec::with_capacity((3 * scratch.candidate_size + scratch.max_degree) as usize); + + // TODO: uncomment hops? + // let mut hops: u32 = 0; + let mut cmps: u32 = 0; + + let query_vertex = Vertex::::try_from((&scratch.query[..], query.vertex_id())) + .map_err(|err| { + ANNError::log_index_error(format!( + "TryFromSliceError: failed to get Vertex for query, err={}", + err + )) + })?; + + while scratch.best_candidates.has_notvisited_node() { + let closest_node = scratch.best_candidates.closest_notvisited(); + + // Add node to visited nodes to create pool for prune later + // TODO: search_invocation and use_filter + visited_nodes.push(closest_node); + + // Find which of the nodes in des have not been visited before + scratch.id_scratch.clear(); + + let max_vertex_id = self.configuration.max_points + self.configuration.num_frozen_pts; + + for id in self + .final_graph + .read_vertex_and_neighbors(closest_node.id)? + .get_neighbors() + { + let current_vertex_id = *id; + debug_assert!( + (current_vertex_id as usize) < max_vertex_id, + "current_vertex_id {} is out of valid range of points {}", + current_vertex_id, + max_vertex_id + ); + if current_vertex_id as usize >= max_vertex_id { + continue; + } + + // quickly de-dup. Remember, we are in a read lock + // we want to exit out of it quickly + if scratch.node_visited_robinset.insert(current_vertex_id) { + scratch.id_scratch.push(current_vertex_id); + } + } + + let len = scratch.id_scratch.len(); + for (m, &id) in scratch.id_scratch.iter().enumerate() { + if m + 1 < len { + let next_node = unsafe { *scratch.id_scratch.get_unchecked(m + 1) }; + self.dataset.prefetch_vector(next_node); + } + + let vertex = self.dataset.get_vertex(id)?; + let distance = query_vertex.compare(&vertex, self.configuration.dist_metric); + + // Insert pairs into the pool of candidates + scratch.best_candidates.insert(Neighbor::new(id, distance)); + } + + cmps += len as u32; + } + + Ok((visited_nodes, cmps)) + } +} + +#[cfg(test)] +mod search_test { + use vector::Metric; + + use crate::model::configuration::index_write_parameters::IndexWriteParametersBuilder; + use crate::model::graph::AdjacencyList; + use crate::model::IndexConfiguration; + use crate::test_utils::inmem_index_initialization::create_index_with_test_data; + + use super::*; + + #[test] + fn get_init_ids_no_forzen_pts() { + let index_write_parameters = IndexWriteParametersBuilder::new(50, 4) + .with_alpha(1.2) + .build(); + let config = IndexConfiguration::new( + Metric::L2, + 256, + 256, + 256, + false, + 0, + false, + 0, + 1f32, + index_write_parameters, + ); + + let index = InmemIndex::::new(config).unwrap(); + let init_ids = index.get_init_ids().unwrap(); + assert_eq!(init_ids.len(), 1); + assert_eq!(init_ids[0], 256); + } + + #[test] + fn get_init_ids_with_forzen_pts() { + let index_write_parameters = IndexWriteParametersBuilder::new(50, 4) + .with_alpha(1.2) + .build(); + let config = IndexConfiguration::new( + Metric::L2, + 256, + 256, + 256, + false, + 0, + false, + 2, + 1f32, + index_write_parameters, + ); + + let index = InmemIndex::::new(config).unwrap(); + let init_ids = index.get_init_ids().unwrap(); + assert_eq!(init_ids.len(), 2); + assert_eq!(init_ids[0], 256); + assert_eq!(init_ids[1], 257); + } + + #[test] + fn search_for_point_initial_call() { + let index = create_index_with_test_data(); + let query = index.dataset.get_vertex(0).unwrap(); + + let mut scratch = InMemQueryScratch::new( + index.configuration.index_write_parameter.search_list_size, + &index.configuration.index_write_parameter, + false, + ) + .unwrap(); + let visited_nodes = index.search_for_point(&query, &mut scratch).unwrap(); + assert_eq!(visited_nodes.len(), 1); + assert_eq!(scratch.best_candidates.size(), 1); + assert_eq!(scratch.best_candidates[0].id, 72); + assert_eq!(scratch.best_candidates[0].distance, 125678.0_f32); + assert!(scratch.best_candidates[0].visited); + } + + fn set_neighbors(index: &InmemIndex, vertex_id: u32, neighbors: Vec) { + index + .final_graph + .write_vertex_and_neighbors(vertex_id) + .unwrap() + .set_neighbors(AdjacencyList::from(neighbors)); + } + #[test] + fn search_for_point_works_with_edges() { + let index = create_index_with_test_data(); + let query = index.dataset.get_vertex(14).unwrap(); + + set_neighbors(&index, 0, vec![12, 72, 5, 9]); + set_neighbors(&index, 1, vec![2, 12, 10, 4]); + set_neighbors(&index, 2, vec![1, 72, 9]); + set_neighbors(&index, 3, vec![13, 6, 5, 11]); + set_neighbors(&index, 4, vec![1, 3, 7, 9]); + set_neighbors(&index, 5, vec![3, 0, 8, 11, 13]); + set_neighbors(&index, 6, vec![3, 72, 7, 10, 13]); + set_neighbors(&index, 7, vec![72, 4, 6]); + set_neighbors(&index, 8, vec![72, 5, 9, 12]); + set_neighbors(&index, 9, vec![8, 4, 0, 2]); + set_neighbors(&index, 10, vec![72, 1, 9, 6]); + set_neighbors(&index, 11, vec![3, 0, 5]); + set_neighbors(&index, 12, vec![1, 0, 8, 9]); + set_neighbors(&index, 13, vec![3, 72, 5, 6]); + set_neighbors(&index, 72, vec![7, 2, 10, 8, 13]); + + let mut scratch = InMemQueryScratch::new( + index.configuration.index_write_parameter.search_list_size, + &index.configuration.index_write_parameter, + false, + ) + .unwrap(); + let visited_nodes = index.search_for_point(&query, &mut scratch).unwrap(); + assert_eq!(visited_nodes.len(), 15); + assert_eq!(scratch.best_candidates.size(), 15); + assert_eq!(scratch.best_candidates[0].id, 2); + assert_eq!(scratch.best_candidates[0].distance, 120899.0_f32); + assert_eq!(scratch.best_candidates[1].id, 8); + assert_eq!(scratch.best_candidates[1].distance, 145538.0_f32); + assert_eq!(scratch.best_candidates[2].id, 72); + assert_eq!(scratch.best_candidates[2].distance, 146046.0_f32); + assert_eq!(scratch.best_candidates[3].id, 4); + assert_eq!(scratch.best_candidates[3].distance, 148462.0_f32); + assert_eq!(scratch.best_candidates[4].id, 7); + assert_eq!(scratch.best_candidates[4].distance, 148912.0_f32); + assert_eq!(scratch.best_candidates[5].id, 10); + assert_eq!(scratch.best_candidates[5].distance, 154570.0_f32); + assert_eq!(scratch.best_candidates[6].id, 1); + assert_eq!(scratch.best_candidates[6].distance, 159448.0_f32); + assert_eq!(scratch.best_candidates[7].id, 12); + assert_eq!(scratch.best_candidates[7].distance, 170698.0_f32); + assert_eq!(scratch.best_candidates[8].id, 9); + assert_eq!(scratch.best_candidates[8].distance, 177205.0_f32); + assert_eq!(scratch.best_candidates[9].id, 0); + assert_eq!(scratch.best_candidates[9].distance, 259996.0_f32); + assert_eq!(scratch.best_candidates[10].id, 6); + assert_eq!(scratch.best_candidates[10].distance, 371819.0_f32); + assert_eq!(scratch.best_candidates[11].id, 5); + assert_eq!(scratch.best_candidates[11].distance, 385240.0_f32); + assert_eq!(scratch.best_candidates[12].id, 3); + assert_eq!(scratch.best_candidates[12].distance, 413899.0_f32); + assert_eq!(scratch.best_candidates[13].id, 13); + assert_eq!(scratch.best_candidates[13].distance, 416386.0_f32); + assert_eq!(scratch.best_candidates[14].id, 11); + assert_eq!(scratch.best_candidates[14].distance, 449266.0_f32); + } +} diff --git a/rust/diskann/src/common/aligned_allocator.rs b/rust/diskann/src/common/aligned_allocator.rs new file mode 100644 index 000000000..6164a1f40 --- /dev/null +++ b/rust/diskann/src/common/aligned_allocator.rs @@ -0,0 +1,281 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Aligned allocator + +use std::alloc::Layout; +use std::ops::{Deref, DerefMut, Range}; +use std::ptr::copy_nonoverlapping; + +use super::{ANNResult, ANNError}; + +#[derive(Debug)] +/// A box that holds a slice but is aligned to the specified layout. +/// +/// This type is useful for working with types that require a certain alignment, +/// such as SIMD vectors or FFI structs. It allocates memory using the global allocator +/// and frees it when dropped. It also implements Deref and DerefMut to allow access +/// to the underlying slice. +pub struct AlignedBoxWithSlice { + /// The layout of the allocated memory. + layout: Layout, + + /// The slice that points to the allocated memory. + val: Box<[T]>, +} + +impl AlignedBoxWithSlice { + /// Creates a new `AlignedBoxWithSlice` with the given capacity and alignment. + /// The allocated memory are set to 0. + /// + /// # Error + /// + /// Return IndexError if the alignment is not a power of two or if the layout is invalid. + /// + /// This function is unsafe because it allocates uninitialized memory and casts it to + /// a slice of `T`. The caller must ensure that the capacity and alignment are valid + /// for the type `T` and that the memory is initialized before accessing the elements + /// of the slice. + pub fn new(capacity: usize, alignment: usize) -> ANNResult { + let allocsize = capacity.checked_mul(std::mem::size_of::()) + .ok_or_else(|| ANNError::log_index_error("capacity overflow".to_string()))?; + let layout = Layout::from_size_align(allocsize, alignment) + .map_err(ANNError::log_mem_alloc_layout_error)?; + + let val = unsafe { + let mem = std::alloc::alloc_zeroed(layout); + let ptr = mem as *mut T; + let slice = std::slice::from_raw_parts_mut(ptr, capacity); + std::boxed::Box::from_raw(slice) + }; + + Ok(Self { layout, val }) + } + + /// Returns a reference to the slice. + pub fn as_slice(&self) -> &[T] { + &self.val + } + + /// Returns a mutable reference to the slice. + pub fn as_mut_slice(&mut self) -> &mut [T] { + &mut self.val + } + + /// Copies data from the source slice to the destination box. + pub fn memcpy(&mut self, src: &[T]) -> ANNResult<()> { + if src.len() > self.val.len() { + return Err(ANNError::log_index_error(format!("source slice is too large (src:{}, dst:{})", src.len(), self.val.len()))); + } + + // Check that they don't overlap + let src_ptr = src.as_ptr(); + let src_end = unsafe { src_ptr.add(src.len()) }; + let dst_ptr = self.val.as_mut_ptr(); + let dst_end = unsafe { dst_ptr.add(self.val.len()) }; + + if src_ptr < dst_end && src_end > dst_ptr { + return Err(ANNError::log_index_error("Source and destination overlap".to_string())); + } + + unsafe { + copy_nonoverlapping(src.as_ptr(), self.val.as_mut_ptr(), src.len()); + } + + Ok(()) + } + + /// Split the range of memory into nonoverlapping mutable slices. + /// The number of returned slices is (range length / slice_len) and each has a length of slice_len. + pub fn split_into_nonoverlapping_mut_slices(&mut self, range: Range, slice_len: usize) -> ANNResult> { + if range.len() % slice_len != 0 || range.end > self.len() { + return Err(ANNError::log_index_error(format!( + "Cannot split range ({:?}) of AlignedBoxWithSlice (len: {}) into nonoverlapping mutable slices with length {}", + range, + self.len(), + slice_len, + ))); + } + + let mut slices = Vec::with_capacity(range.len() / slice_len); + let mut remaining_slice = &mut self.val[range]; + + while remaining_slice.len() >= slice_len { + let (left, right) = remaining_slice.split_at_mut(slice_len); + slices.push(left); + remaining_slice = right; + } + + Ok(slices) + } +} + + +impl Drop for AlignedBoxWithSlice { + /// Frees the memory allocated for the slice using the global allocator. + fn drop(&mut self) { + let val = std::mem::take(&mut self.val); + let mut val2 = std::mem::ManuallyDrop::new(val); + let ptr = val2.as_mut_ptr(); + + unsafe { + // let nonNull = NonNull::new_unchecked(ptr as *mut u8); + std::alloc::dealloc(ptr as *mut u8, self.layout) + } + } +} + +impl Deref for AlignedBoxWithSlice { + type Target = [T]; + + fn deref(&self) -> &Self::Target { + &self.val + } +} + +impl DerefMut for AlignedBoxWithSlice { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.val + } +} + +#[cfg(test)] +mod tests { + use rand::Rng; + + use crate::utils::is_aligned; + + use super::*; + + #[test] + fn create_alignedvec_works_32() { + (0..100).for_each(|_| { + let size = 1_000_000; + println!("Attempting {}", size); + let data = AlignedBoxWithSlice::::new(size, 32).unwrap(); + assert_eq!(data.len(), size, "Capacity should match"); + + let ptr = data.as_ptr() as usize; + assert_eq!(ptr % 32, 0, "Ptr should be aligned to 32"); + + // assert that the slice is initialized. + (0..size).for_each(|i| { + assert_eq!(data[i], f32::default()); + }); + + drop(data); + }); + } + + #[test] + fn create_alignedvec_works_256() { + let mut rng = rand::thread_rng(); + + (0..100).for_each(|_| { + let n = rng.gen::(); + let size = usize::from(n) + 1; + println!("Attempting {}", size); + let data = AlignedBoxWithSlice::::new(size, 256).unwrap(); + assert_eq!(data.len(), size, "Capacity should match"); + + let ptr = data.as_ptr() as usize; + assert_eq!(ptr % 256, 0, "Ptr should be aligned to 32"); + + // assert that the slice is initialized. + (0..size).for_each(|i| { + assert_eq!(data[i], u8::default()); + }); + + drop(data); + }); + } + + #[test] + fn as_slice_test() { + let size = 1_000_000; + let data = AlignedBoxWithSlice::::new(size, 32).unwrap(); + // assert that the slice is initialized. + (0..size).for_each(|i| { + assert_eq!(data[i], f32::default()); + }); + + let slice = data.as_slice(); + (0..size).for_each(|i| { + assert_eq!(slice[i], f32::default()); + }); + } + + #[test] + fn as_mut_slice_test() { + let size = 1_000_000; + let mut data = AlignedBoxWithSlice::::new(size, 32).unwrap(); + let mut_slice = data.as_mut_slice(); + (0..size).for_each(|i| { + assert_eq!(mut_slice[i], f32::default()); + }); + } + + #[test] + fn memcpy_test() { + let size = 1_000_000; + let mut data = AlignedBoxWithSlice::::new(size, 32).unwrap(); + let mut destination = AlignedBoxWithSlice::::new(size-2, 32).unwrap(); + let mut_destination = destination.as_mut_slice(); + data.memcpy(mut_destination).unwrap(); + (0..size-2).for_each(|i| { + assert_eq!(data[i], mut_destination[i]); + }); + } + + #[test] + #[should_panic(expected = "source slice is too large (src:1000000, dst:999998)")] + fn memcpy_panic_test() { + let size = 1_000_000; + let mut data = AlignedBoxWithSlice::::new(size-2, 32).unwrap(); + let mut destination = AlignedBoxWithSlice::::new(size, 32).unwrap(); + let mut_destination = destination.as_mut_slice(); + data.memcpy(mut_destination).unwrap(); + } + + #[test] + fn is_aligned_test() { + assert!(is_aligned(256,256)); + assert!(!is_aligned(255,256)); + } + + #[test] + fn split_into_nonoverlapping_mut_slices_test() { + let size = 10; + let slice_len = 2; + let mut data = AlignedBoxWithSlice::::new(size, 32).unwrap(); + let slices = data.split_into_nonoverlapping_mut_slices(2..8, slice_len).unwrap(); + assert_eq!(slices.len(), 3); + for (i, slice) in slices.into_iter().enumerate() { + assert_eq!(slice.len(), slice_len); + slice[0] = i as f32 + 1.0; + slice[1] = i as f32 + 1.0; + } + let expected_arr = [0.0f32, 0.0, 1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 0.0, 0.0]; + assert_eq!(data.as_ref(), &expected_arr); + } + + #[test] + fn split_into_nonoverlapping_mut_slices_error_when_indivisible() { + let size = 10; + let slice_len = 2; + let range = 2..7; + let mut data = AlignedBoxWithSlice::::new(size, 32).unwrap(); + let result = data.split_into_nonoverlapping_mut_slices(range.clone(), slice_len); + let expected_err_str = format!( + "IndexError: Cannot split range ({:?}) of AlignedBoxWithSlice (len: {}) into nonoverlapping mutable slices with length {}", + range, + size, + slice_len, + ); + assert!(result.is_err_and(|e| e.to_string() == expected_err_str)); + } +} + diff --git a/rust/diskann/src/common/ann_result.rs b/rust/diskann/src/common/ann_result.rs new file mode 100644 index 000000000..69fcf03f6 --- /dev/null +++ b/rust/diskann/src/common/ann_result.rs @@ -0,0 +1,179 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::alloc::LayoutError; +use std::array::TryFromSliceError; +use std::io; +use std::num::TryFromIntError; + +use logger::error_logger::log_error; +use logger::log_error::LogError; + +/// Result +pub type ANNResult = Result; + +/// DiskANN Error +/// ANNError is `Send` (i.e., safe to send across threads) +#[derive(thiserror::Error, Debug)] +pub enum ANNError { + /// Index construction and search error + #[error("IndexError: {err}")] + IndexError { err: String }, + + /// Index configuration error + #[error("IndexConfigError: {parameter} is invalid, err={err}")] + IndexConfigError { parameter: String, err: String }, + + /// Integer conversion error + #[error("TryFromIntError: {err}")] + TryFromIntError { + #[from] + err: TryFromIntError, + }, + + /// IO error + #[error("IOError: {err}")] + IOError { + #[from] + err: io::Error, + }, + + /// Layout error in memory allocation + #[error("MemoryAllocLayoutError: {err}")] + MemoryAllocLayoutError { + #[from] + err: LayoutError, + }, + + /// PoisonError which can be returned whenever a lock is acquired + /// Both Mutexes and RwLocks are poisoned whenever a thread fails while the lock is held + #[error("LockPoisonError: {err}")] + LockPoisonError { err: String }, + + /// DiskIOAlignmentError which can be returned when calling windows API CreateFileA for the disk index file fails. + #[error("DiskIOAlignmentError: {err}")] + DiskIOAlignmentError { err: String }, + + /// Logging error + #[error("LogError: {err}")] + LogError { + #[from] + err: LogError, + }, + + // PQ construction error + // Error happened when we construct PQ pivot or PQ compressed table + #[error("PQError: {err}")] + PQError { err: String }, + + /// Array conversion error + #[error("Error try creating array from slice: {err}")] + TryFromSliceError { + #[from] + err: TryFromSliceError, + }, +} + +impl ANNError { + /// Create, log and return IndexError + #[inline] + pub fn log_index_error(err: String) -> Self { + let ann_err = ANNError::IndexError { err }; + match log_error(ann_err.to_string()) { + Ok(()) => ann_err, + Err(log_err) => ANNError::LogError { err: log_err }, + } + } + + /// Create, log and return IndexConfigError + #[inline] + pub fn log_index_config_error(parameter: String, err: String) -> Self { + let ann_err = ANNError::IndexConfigError { parameter, err }; + match log_error(ann_err.to_string()) { + Ok(()) => ann_err, + Err(log_err) => ANNError::LogError { err: log_err }, + } + } + + /// Create, log and return TryFromIntError + #[inline] + pub fn log_try_from_int_error(err: TryFromIntError) -> Self { + let ann_err = ANNError::TryFromIntError { err }; + match log_error(ann_err.to_string()) { + Ok(()) => ann_err, + Err(log_err) => ANNError::LogError { err: log_err }, + } + } + + /// Create, log and return IOError + #[inline] + pub fn log_io_error(err: io::Error) -> Self { + let ann_err = ANNError::IOError { err }; + match log_error(ann_err.to_string()) { + Ok(()) => ann_err, + Err(log_err) => ANNError::LogError { err: log_err }, + } + } + + /// Create, log and return DiskIOAlignmentError + /// #[inline] + pub fn log_disk_io_request_alignment_error(err: String) -> Self { + let ann_err: ANNError = ANNError::DiskIOAlignmentError { err }; + match log_error(ann_err.to_string()) { + Ok(()) => ann_err, + Err(log_err) => ANNError::LogError { err: log_err }, + } + } + + /// Create, log and return IOError + #[inline] + pub fn log_mem_alloc_layout_error(err: LayoutError) -> Self { + let ann_err = ANNError::MemoryAllocLayoutError { err }; + match log_error(ann_err.to_string()) { + Ok(()) => ann_err, + Err(log_err) => ANNError::LogError { err: log_err }, + } + } + + /// Create, log and return LockPoisonError + #[inline] + pub fn log_lock_poison_error(err: String) -> Self { + let ann_err = ANNError::LockPoisonError { err }; + match log_error(ann_err.to_string()) { + Ok(()) => ann_err, + Err(log_err) => ANNError::LogError { err: log_err }, + } + } + + /// Create, log and return PQError + #[inline] + pub fn log_pq_error(err: String) -> Self { + let ann_err = ANNError::PQError { err }; + match log_error(ann_err.to_string()) { + Ok(()) => ann_err, + Err(log_err) => ANNError::LogError { err: log_err }, + } + } + + /// Create, log and return TryFromSliceError + #[inline] + pub fn log_try_from_slice_error(err: TryFromSliceError) -> Self { + let ann_err = ANNError::TryFromSliceError { err }; + match log_error(ann_err.to_string()) { + Ok(()) => ann_err, + Err(log_err) => ANNError::LogError { err: log_err }, + } + } +} + +#[cfg(test)] +mod ann_result_test { + use super::*; + + #[test] + fn ann_err_is_send() { + fn assert_send() {} + assert_send::(); + } +} diff --git a/rust/diskann/src/common/mod.rs b/rust/diskann/src/common/mod.rs new file mode 100644 index 000000000..d9da72bbc --- /dev/null +++ b/rust/diskann/src/common/mod.rs @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +mod aligned_allocator; +pub use aligned_allocator::AlignedBoxWithSlice; + +mod ann_result; +pub use ann_result::*; diff --git a/rust/diskann/src/index/disk_index/ann_disk_index.rs b/rust/diskann/src/index/disk_index/ann_disk_index.rs new file mode 100644 index 000000000..a6e053e17 --- /dev/null +++ b/rust/diskann/src/index/disk_index/ann_disk_index.rs @@ -0,0 +1,54 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_docs)] + +//! ANN disk index abstraction + +use vector::FullPrecisionDistance; + +use crate::model::{IndexConfiguration, DiskIndexBuildParameters}; +use crate::storage::DiskIndexStorage; +use crate::model::vertex::{DIM_128, DIM_256, DIM_104}; + +use crate::common::{ANNResult, ANNError}; + +use super::DiskIndex; + +/// ANN disk index abstraction for custom +pub trait ANNDiskIndex : Sync + Send +where T : Default + Copy + Sync + Send + Into + { + /// Build index + fn build(&mut self, codebook_prefix: &str) -> ANNResult<()>; +} + +/// Create Index based on configuration +pub fn create_disk_index<'a, T>( + disk_build_param: Option, + config: IndexConfiguration, + storage: DiskIndexStorage, +) -> ANNResult + 'a>> +where + T: Default + Copy + Sync + Send + Into + 'a, + [T; DIM_104]: FullPrecisionDistance, + [T; DIM_128]: FullPrecisionDistance, + [T; DIM_256]: FullPrecisionDistance, +{ + match config.aligned_dim { + DIM_104 => { + let index = Box::new(DiskIndex::::new(disk_build_param, config, storage)); + Ok(index as Box>) + }, + DIM_128 => { + let index = Box::new(DiskIndex::::new(disk_build_param, config, storage)); + Ok(index as Box>) + }, + DIM_256 => { + let index = Box::new(DiskIndex::::new(disk_build_param, config, storage)); + Ok(index as Box>) + }, + _ => Err(ANNError::log_index_error(format!("Invalid dimension: {}", config.aligned_dim))), + } +} diff --git a/rust/diskann/src/index/disk_index/disk_index.rs b/rust/diskann/src/index/disk_index/disk_index.rs new file mode 100644 index 000000000..16f0d5969 --- /dev/null +++ b/rust/diskann/src/index/disk_index/disk_index.rs @@ -0,0 +1,161 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::mem; + +use logger::logger::indexlog::DiskIndexConstructionCheckpoint; +use vector::FullPrecisionDistance; + +use crate::common::{ANNResult, ANNError}; +use crate::index::{InmemIndex, ANNInmemIndex}; +use crate::instrumentation::DiskIndexBuildLogger; +use crate::model::configuration::DiskIndexBuildParameters; +use crate::model::{IndexConfiguration, MAX_PQ_TRAINING_SET_SIZE, MAX_PQ_CHUNKS, generate_quantized_data, GRAPH_SLACK_FACTOR}; +use crate::storage::DiskIndexStorage; +use crate::utils::set_rayon_num_threads; + +use super::ann_disk_index::ANNDiskIndex; + +pub const OVERHEAD_FACTOR: f64 = 1.1f64; + +pub const MAX_SAMPLE_POINTS_FOR_WARMUP: usize = 100_000; + +pub struct DiskIndex +where + [T; N]: FullPrecisionDistance, +{ + /// Parameters for index construction + /// None for query path + disk_build_param: Option, + + configuration: IndexConfiguration, + + pub storage: DiskIndexStorage, +} + +impl DiskIndex +where + T: Default + Copy + Sync + Send + Into, + [T; N]: FullPrecisionDistance, +{ + pub fn new( + disk_build_param: Option, + configuration: IndexConfiguration, + storage: DiskIndexStorage, + ) -> Self { + Self { + disk_build_param, + configuration, + storage, + } + } + + pub fn disk_build_param(&self) -> &Option { + &self.disk_build_param + } + + pub fn index_configuration(&self) -> &IndexConfiguration { + &self.configuration + } + + fn build_inmem_index(&self, num_points: usize, data_path: &str, inmem_index_path: &str) -> ANNResult<()> { + let estimated_index_ram = self.estimate_ram_usage(num_points); + if estimated_index_ram >= self.fetch_disk_build_param()?.index_build_ram_limit() * 1024_f64 * 1024_f64 * 1024_f64 { + return Err(ANNError::log_index_error(format!( + "Insufficient memory budget for index build, index_build_ram_limit={}GB estimated_index_ram={}GB", + self.fetch_disk_build_param()?.index_build_ram_limit(), + estimated_index_ram / (1024_f64 * 1024_f64 * 1024_f64), + ))); + } + + let mut index = InmemIndex::::new(self.configuration.clone())?; + index.build(data_path, num_points)?; + index.save(inmem_index_path)?; + + Ok(()) + } + + #[inline] + fn estimate_ram_usage(&self, size: usize) -> f64 { + let degree = self.configuration.index_write_parameter.max_degree as usize; + let datasize = mem::size_of::(); + + let dataset_size = (size * N * datasize) as f64; + let graph_size = (size * degree * mem::size_of::()) as f64 * GRAPH_SLACK_FACTOR; + + OVERHEAD_FACTOR * (dataset_size + graph_size) + } + + #[inline] + fn fetch_disk_build_param(&self) -> ANNResult<&DiskIndexBuildParameters> { + self.disk_build_param + .as_ref() + .ok_or_else(|| ANNError::log_index_config_error( + "disk_build_param".to_string(), + "disk_build_param is None".to_string())) + } +} + +impl ANNDiskIndex for DiskIndex +where + T: Default + Copy + Sync + Send + Into, + [T; N]: FullPrecisionDistance, +{ + fn build(&mut self, codebook_prefix: &str) -> ANNResult<()> { + if self.configuration.index_write_parameter.num_threads > 0 { + set_rayon_num_threads(self.configuration.index_write_parameter.num_threads); + } + + println!("Starting index build: R={} L={} Query RAM budget={} Indexing RAM budget={} T={}", + self.configuration.index_write_parameter.max_degree, + self.configuration.index_write_parameter.search_list_size, + self.fetch_disk_build_param()?.search_ram_limit(), + self.fetch_disk_build_param()?.index_build_ram_limit(), + self.configuration.index_write_parameter.num_threads + ); + + let mut logger = DiskIndexBuildLogger::new(DiskIndexConstructionCheckpoint::PqConstruction); + + // PQ memory consumption = PQ pivots + PQ compressed table + // PQ pivots: dim * num_centroids * sizeof::() + // PQ compressed table: num_pts * num_pq_chunks * (dim / num_pq_chunks) * sizeof::() + // * Because num_centroids is 256, centroid id can be represented by u8 + let num_points = self.configuration.max_points; + let dim = self.configuration.dim; + let p_val = MAX_PQ_TRAINING_SET_SIZE / (num_points as f64); + let mut num_pq_chunks = ((self.fetch_disk_build_param()?.search_ram_limit() / (num_points as f64)).floor()) as usize; + num_pq_chunks = if num_pq_chunks == 0 { 1 } else { num_pq_chunks }; + num_pq_chunks = if num_pq_chunks > dim { dim } else { num_pq_chunks }; + num_pq_chunks = if num_pq_chunks > MAX_PQ_CHUNKS { MAX_PQ_CHUNKS } else { num_pq_chunks }; + + println!("Compressing {}-dimensional data into {} bytes per vector.", dim, num_pq_chunks); + + // TODO: Decouple PQ from file access + generate_quantized_data::( + p_val, + num_pq_chunks, + codebook_prefix, + self.storage.get_pq_storage(), + )?; + logger.log_checkpoint(DiskIndexConstructionCheckpoint::InmemIndexBuild)?; + + // TODO: Decouple index from file access + let inmem_index_path = self.storage.index_path_prefix().clone() + "_mem.index"; + self.build_inmem_index(num_points, self.storage.dataset_file(), inmem_index_path.as_str())?; + logger.log_checkpoint(DiskIndexConstructionCheckpoint::DiskLayout)?; + + self.storage.create_disk_layout()?; + logger.log_checkpoint(DiskIndexConstructionCheckpoint::None)?; + + let ten_percent_points = ((num_points as f64) * 0.1_f64).ceil(); + let num_sample_points = if ten_percent_points > (MAX_SAMPLE_POINTS_FOR_WARMUP as f64) { MAX_SAMPLE_POINTS_FOR_WARMUP as f64 } else { ten_percent_points }; + let sample_sampling_rate = num_sample_points / (num_points as f64); + self.storage.gen_query_warmup_data(sample_sampling_rate)?; + + self.storage.index_build_cleanup()?; + + Ok(()) + } +} + diff --git a/rust/diskann/src/index/disk_index/mod.rs b/rust/diskann/src/index/disk_index/mod.rs new file mode 100644 index 000000000..4f07bd78d --- /dev/null +++ b/rust/diskann/src/index/disk_index/mod.rs @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[allow(clippy::module_inception)] +mod disk_index; +pub use disk_index::DiskIndex; + +pub mod ann_disk_index; diff --git a/rust/diskann/src/index/inmem_index/ann_inmem_index.rs b/rust/diskann/src/index/inmem_index/ann_inmem_index.rs new file mode 100644 index 000000000..dc8dfc876 --- /dev/null +++ b/rust/diskann/src/index/inmem_index/ann_inmem_index.rs @@ -0,0 +1,97 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_docs)] + +//! ANN in-memory index abstraction + +use vector::FullPrecisionDistance; + +use crate::model::{vertex::{DIM_128, DIM_256, DIM_104}, IndexConfiguration}; +use crate::common::{ANNResult, ANNError}; + +use super::InmemIndex; + +/// ANN inmem-index abstraction for custom +pub trait ANNInmemIndex : Sync + Send +where T : Default + Copy + Sync + Send + Into + { + /// Build index + fn build(&mut self, filename: &str, num_points_to_load: usize) -> ANNResult<()>; + + /// Save index + fn save(&mut self, filename: &str) -> ANNResult<()>; + + /// Load index + fn load(&mut self, filename: &str, expected_num_points: usize) -> ANNResult<()>; + + /// insert index + fn insert(&mut self, filename: &str, num_points_to_insert: usize) -> ANNResult<()>; + + /// Search the index for K nearest neighbors of query using given L value, for benchmarking purposes + fn search(&self, query : &[T], k_value : usize, l_value : u32, indices : &mut[u32]) -> ANNResult; + + /// Soft deletes the nodes with the ids in the given array. + fn soft_delete(&mut self, vertex_ids_to_delete: Vec, num_points_to_delete: usize) -> ANNResult<()>; +} + +/// Create Index based on configuration +pub fn create_inmem_index<'a, T>(config: IndexConfiguration) -> ANNResult + 'a>> +where + T: Default + Copy + Sync + Send + Into + 'a, + [T; DIM_104]: FullPrecisionDistance, + [T; DIM_128]: FullPrecisionDistance, + [T; DIM_256]: FullPrecisionDistance, +{ + match config.aligned_dim { + DIM_104 => { + let index = Box::new(InmemIndex::::new(config)?); + Ok(index as Box>) + }, + DIM_128 => { + let index = Box::new(InmemIndex::::new(config)?); + Ok(index as Box>) + }, + DIM_256 => { + let index = Box::new(InmemIndex::::new(config)?); + Ok(index as Box>) + }, + _ => Err(ANNError::log_index_error(format!("Invalid dimension: {}", config.aligned_dim))), + } +} + +#[cfg(test)] +mod dataset_test { + use vector::Metric; + + use crate::model::configuration::index_write_parameters::IndexWriteParametersBuilder; + + use super::*; + + #[test] + #[should_panic(expected = "ERROR: Data file fake_file does not exist.")] + fn create_index_test() { + let index_write_parameters = IndexWriteParametersBuilder::new(50, 4) + .with_alpha(1.2) + .with_saturate_graph(false) + .with_num_threads(1) + .build(); + + let config = IndexConfiguration::new( + Metric::L2, + 128, + 256, + 1_000_000, + false, + 0, + false, + 0, + 1f32, + index_write_parameters, + ); + let mut index = create_inmem_index::(config).unwrap(); + index.build("fake_file", 100).unwrap(); + } +} + diff --git a/rust/diskann/src/index/inmem_index/inmem_index.rs b/rust/diskann/src/index/inmem_index/inmem_index.rs new file mode 100644 index 000000000..871d21092 --- /dev/null +++ b/rust/diskann/src/index/inmem_index/inmem_index.rs @@ -0,0 +1,1033 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::cmp; +use std::sync::RwLock; +use std::time::Duration; + +use hashbrown::hash_set::Entry::*; +use hashbrown::HashSet; +use vector::FullPrecisionDistance; + +use crate::common::{ANNError, ANNResult}; +use crate::index::ANNInmemIndex; +use crate::instrumentation::IndexLogger; +use crate::model::graph::AdjacencyList; +use crate::model::{ + ArcConcurrentBoxedQueue, InMemQueryScratch, InMemoryGraph, IndexConfiguration, InmemDataset, + Neighbor, ScratchStoreManager, Vertex, +}; + +use crate::utils::file_util::{file_exists, load_metadata_from_file}; +use crate::utils::rayon_util::execute_with_rayon; +use crate::utils::{set_rayon_num_threads, Timer}; + +/// In-memory Index +pub struct InmemIndex +where + [T; N]: FullPrecisionDistance, +{ + /// Dataset + pub dataset: InmemDataset, + + /// Graph + pub final_graph: InMemoryGraph, + + /// Index configuration + pub configuration: IndexConfiguration, + + /// Start point of the search. When _num_frozen_pts is greater than zero, + /// this is the location of the first frozen point. Otherwise, this is a + /// location of one of the points in index. + pub start: u32, + + /// Max observed out degree + pub max_observed_degree: u32, + + /// Number of active points i.e. existing in the graph + pub num_active_pts: usize, + + /// query scratch queue. + query_scratch_queue: ArcConcurrentBoxedQueue>, + + pub delete_set: RwLock>, +} + +impl InmemIndex +where + T: Default + Copy + Sync + Send + Into, + [T; N]: FullPrecisionDistance, +{ + /// Create Index obj based on configuration + pub fn new(mut config: IndexConfiguration) -> ANNResult { + // Sanity check. While logically it is correct, max_points = 0 causes + // downstream problems. + if config.max_points == 0 { + config.max_points = 1; + } + + let total_internal_points = config.max_points + config.num_frozen_pts; + + if config.use_pq_dist { + // TODO: pq + todo!("PQ is not supported now"); + } + + let start = config.max_points.try_into()?; + + let query_scratch_queue = ArcConcurrentBoxedQueue::>::new(); + let delete_set = RwLock::new(HashSet::::new()); + + Ok(Self { + dataset: InmemDataset::::new(total_internal_points, config.growth_potential)?, + final_graph: InMemoryGraph::new( + total_internal_points, + config.index_write_parameter.max_degree, + ), + configuration: config, + start, + max_observed_degree: 0, + num_active_pts: 0, + query_scratch_queue, + delete_set, + }) + } + + /// Get distance between two vertices. + pub fn get_distance(&self, id1: u32, id2: u32) -> ANNResult { + self.dataset + .get_distance(id1, id2, self.configuration.dist_metric) + } + + fn build_with_data_populated(&mut self) -> ANNResult<()> { + println!( + "Starting index build with {} points...", + self.num_active_pts + ); + + if self.num_active_pts < 1 { + return Err(ANNError::log_index_error( + "Error: Trying to build an index with 0 points.".to_string(), + )); + } + + if self.query_scratch_queue.size()? == 0 { + self.initialize_query_scratch( + 5 + self.configuration.index_write_parameter.num_threads, + self.configuration.index_write_parameter.search_list_size, + )?; + } + + // TODO: generate_frozen_point() + + self.link()?; + + self.print_stats()?; + + Ok(()) + } + + fn link(&mut self) -> ANNResult<()> { + // visit_order is a vector that is initialized to the entire graph + let mut visit_order = + Vec::with_capacity(self.num_active_pts + self.configuration.num_frozen_pts); + for i in 0..self.num_active_pts { + visit_order.push(i as u32); + } + + // If there are any frozen points, add them all. + for frozen in self.configuration.max_points + ..(self.configuration.max_points + self.configuration.num_frozen_pts) + { + visit_order.push(frozen as u32); + } + + // if there are frozen points, the first such one is set to be the _start + if self.configuration.num_frozen_pts > 0 { + self.start = self.configuration.max_points as u32; + } else { + self.start = self.dataset.calculate_medoid_point_id()?; + } + + let timer = Timer::new(); + + let range = visit_order.len(); + let logger = IndexLogger::new(range); + + execute_with_rayon( + 0..range, + self.configuration.index_write_parameter.num_threads, + |idx| { + self.insert_vertex_id(visit_order[idx])?; + logger.vertex_processed()?; + + Ok(()) + }, + )?; + + self.cleanup_graph(&visit_order)?; + + if self.num_active_pts > 0 { + println!("{}", timer.elapsed_seconds_for_step("Link time: ")); + } + + Ok(()) + } + + fn insert_vertex_id(&self, vertex_id: u32) -> ANNResult<()> { + let mut scratch_manager = + ScratchStoreManager::new(self.query_scratch_queue.clone(), Duration::from_millis(10))?; + let scratch = scratch_manager.scratch_space().ok_or_else(|| { + ANNError::log_index_error( + "ScratchStoreManager doesn't have InMemQueryScratch instance available".to_string(), + ) + })?; + + let new_neighbors = self.search_for_point_and_prune(scratch, vertex_id)?; + self.update_vertex_with_neighbors(vertex_id, new_neighbors)?; + self.update_neighbors_of_vertex(vertex_id, scratch)?; + + Ok(()) + } + + fn update_neighbors_of_vertex( + &self, + vertex_id: u32, + scratch: &mut InMemQueryScratch, + ) -> Result<(), ANNError> { + let vertex = self.final_graph.read_vertex_and_neighbors(vertex_id)?; + assert!(vertex.size() <= self.configuration.index_write_parameter.max_degree as usize); + self.inter_insert( + vertex_id, + vertex.get_neighbors(), + self.configuration.index_write_parameter.max_degree, + scratch, + )?; + Ok(()) + } + + fn update_vertex_with_neighbors( + &self, + vertex_id: u32, + new_neighbors: AdjacencyList, + ) -> Result<(), ANNError> { + let vertex = &mut self.final_graph.write_vertex_and_neighbors(vertex_id)?; + vertex.set_neighbors(new_neighbors); + assert!(vertex.size() <= self.configuration.index_write_parameter.max_degree as usize); + Ok(()) + } + + fn search_for_point_and_prune( + &self, + scratch: &mut InMemQueryScratch, + vertex_id: u32, + ) -> ANNResult { + let mut pruned_list = + AdjacencyList::for_range(self.configuration.index_write_parameter.max_degree as usize); + let vertex = self.dataset.get_vertex(vertex_id)?; + let mut visited_nodes = self.search_for_point(&vertex, scratch)?; + + self.prune_neighbors(vertex_id, &mut visited_nodes, &mut pruned_list, scratch)?; + + if pruned_list.is_empty() { + return Err(ANNError::log_index_error( + "pruned_list is empty.".to_string(), + )); + } + + if self.final_graph.size() + != self.configuration.max_points + self.configuration.num_frozen_pts + { + return Err(ANNError::log_index_error(format!( + "final_graph has {} vertices instead of {}", + self.final_graph.size(), + self.configuration.max_points + self.configuration.num_frozen_pts, + ))); + } + + Ok(pruned_list) + } + + fn search( + &self, + query: &Vertex, + k_value: usize, + l_value: u32, + indices: &mut [u32], + ) -> ANNResult { + if k_value > l_value as usize { + return Err(ANNError::log_index_error(format!( + "Set L: {} to a value of at least K: {}", + l_value, k_value + ))); + } + + let mut scratch_manager = + ScratchStoreManager::new(self.query_scratch_queue.clone(), Duration::from_millis(10))?; + + let scratch = scratch_manager.scratch_space().ok_or_else(|| { + ANNError::log_index_error( + "ScratchStoreManager doesn't have InMemQueryScratch instance available".to_string(), + ) + })?; + + if l_value > scratch.candidate_size { + println!("Attempting to expand query scratch_space. Was created with Lsize: {} but search L is: {}", scratch.candidate_size, l_value); + scratch.resize_for_new_candidate_size(l_value); + println!( + "Resize completed. New scratch size is: {}", + scratch.candidate_size + ); + } + + let cmp = self.search_with_l_override(query, scratch, l_value as usize)?; + let mut pos = 0; + + for i in 0..scratch.best_candidates.size() { + if scratch.best_candidates[i].id < self.configuration.max_points as u32 { + // Filter out the deleted points. + if let Ok(delete_set_guard) = self.delete_set.read() { + if !delete_set_guard.contains(&scratch.best_candidates[i].id) { + indices[pos] = scratch.best_candidates[i].id; + pos += 1; + } + } else { + return Err(ANNError::log_lock_poison_error( + "failed to acquire the lock for delete_set.".to_string(), + )); + } + } + + if pos == k_value { + break; + } + } + + if pos < k_value { + eprintln!( + "Found fewer than K elements for query! Found: {} but K: {}", + pos, k_value + ); + } + + Ok(cmp) + } + + fn cleanup_graph(&mut self, visit_order: &Vec) -> ANNResult<()> { + if self.num_active_pts > 0 { + println!("Starting final cleanup.."); + } + + execute_with_rayon( + 0..visit_order.len(), + self.configuration.index_write_parameter.num_threads, + |idx| { + let vertex_id = visit_order[idx]; + let num_nbrs = self.get_neighbor_count(vertex_id)?; + + if num_nbrs <= self.configuration.index_write_parameter.max_degree as usize { + // Neighbor list is already small enough. + return Ok(()); + } + + let mut scratch_manager = ScratchStoreManager::new( + self.query_scratch_queue.clone(), + Duration::from_millis(10), + )?; + let scratch = scratch_manager.scratch_space().ok_or_else(|| { + ANNError::log_index_error( + "ScratchStoreManager doesn't have InMemQueryScratch instance available" + .to_string(), + ) + })?; + + let mut dummy_pool = self.get_neighbors_for_vertex(vertex_id)?; + + let mut new_out_neighbors = AdjacencyList::for_range( + self.configuration.index_write_parameter.max_degree as usize, + ); + self.prune_neighbors(vertex_id, &mut dummy_pool, &mut new_out_neighbors, scratch)?; + + self.final_graph + .write_vertex_and_neighbors(vertex_id)? + .set_neighbors(new_out_neighbors); + + Ok(()) + }, + ) + } + + /// Get the unique neighbors for a vertex. + /// + /// This code feels out of place here. This should have nothing to do with whether this + /// is in memory index? + /// # Errors + /// + /// This function will return an error if we are not able to get the read lock. + fn get_neighbors_for_vertex(&self, vertex_id: u32) -> ANNResult> { + let binding = self.final_graph.read_vertex_and_neighbors(vertex_id)?; + let neighbors = binding.get_neighbors(); + let dummy_pool = self.get_unique_neighbors(neighbors, vertex_id)?; + + Ok(dummy_pool) + } + + /// Returns a vector of unique neighbors for the given vertex, along with their distances. + /// + /// # Arguments + /// + /// * `neighbors` - A vector of neighbor id index for the given vertex. + /// * `vertex_id` - The given vertex id. + /// + /// # Errors + /// + /// Returns an `ANNError` if there is an error retrieving the vertex or one of its neighbors. + pub fn get_unique_neighbors( + &self, + neighbors: &Vec, + vertex_id: u32, + ) -> Result, ANNError> { + let vertex = self.dataset.get_vertex(vertex_id)?; + + let len = neighbors.len(); + if len == 0 { + return Ok(Vec::new()); + } + + self.dataset.prefetch_vector(neighbors[0]); + + let mut dummy_visited: HashSet = HashSet::with_capacity(len); + let mut dummy_pool: Vec = Vec::with_capacity(len); + + // let slice = ['w', 'i', 'n', 'd', 'o', 'w', 's']; + // for window in slice.windows(2) { + // &println!{"[{}, {}]", window[0], window[1]}; + // } + // prints: [w, i] -> [i, n] -> [n, d] -> [d, o] -> [o, w] -> [w, s] + for current in neighbors.windows(2) { + // Prefetch the next item. + self.dataset.prefetch_vector(current[1]); + let current = current[0]; + + self.insert_neighbor_if_unique( + &mut dummy_visited, + current, + vertex_id, + &vertex, + &mut dummy_pool, + )?; + } + + // Insert the last neighbor + #[allow(clippy::unwrap_used)] + self.insert_neighbor_if_unique( + &mut dummy_visited, + *neighbors.last().unwrap(), // we know len != 0, so this is safe. + vertex_id, + &vertex, + &mut dummy_pool, + )?; + + Ok(dummy_pool) + } + + fn insert_neighbor_if_unique( + &self, + dummy_visited: &mut HashSet, + current: u32, + vertex_id: u32, + vertex: &Vertex<'_, T, N>, + dummy_pool: &mut Vec, + ) -> Result<(), ANNError> { + if current != vertex_id { + if let Vacant(entry) = dummy_visited.entry(current) { + let cur_nbr_vertex = self.dataset.get_vertex(current)?; + let dist = vertex.compare(&cur_nbr_vertex, self.configuration.dist_metric); + dummy_pool.push(Neighbor::new(current, dist)); + entry.insert(); + } + } + + Ok(()) + } + + /// Get count of neighbors for a given vertex. + /// + /// # Errors + /// + /// This function will return an error if we can't get a lock. + fn get_neighbor_count(&self, vertex_id: u32) -> ANNResult { + let num_nbrs = self + .final_graph + .read_vertex_and_neighbors(vertex_id)? + .size(); + Ok(num_nbrs) + } + + fn soft_delete_vertex(&self, vertex_id_to_delete: u32) -> ANNResult<()> { + if vertex_id_to_delete as usize > self.num_active_pts { + return Err(ANNError::log_index_error(format!( + "vertex_id_to_delete: {} is greater than the number of active points in the graph: {}", + vertex_id_to_delete, self.num_active_pts + ))); + } + + let mut delete_set_guard = match self.delete_set.write() { + Ok(guard) => guard, + Err(_) => { + return Err(ANNError::log_index_error(format!( + "Failed to acquire delete_set lock, cannot delete vertex {}", + vertex_id_to_delete + ))); + } + }; + + delete_set_guard.insert(vertex_id_to_delete); + Ok(()) + } + + fn initialize_query_scratch( + &mut self, + num_threads: u32, + search_candidate_size: u32, + ) -> ANNResult<()> { + self.query_scratch_queue.reserve(num_threads as usize)?; + for _ in 0..num_threads { + let scratch = Box::new(InMemQueryScratch::::new( + search_candidate_size, + &self.configuration.index_write_parameter, + false, + )?); + + self.query_scratch_queue.push(scratch)?; + } + + Ok(()) + } + + fn print_stats(&mut self) -> ANNResult<()> { + let mut max = 0; + let mut min = usize::MAX; + let mut total = 0; + let mut cnt = 0; + + for i in 0..self.num_active_pts { + let vertex_id = i.try_into()?; + let pool_size = self + .final_graph + .read_vertex_and_neighbors(vertex_id)? + .size(); + max = cmp::max(max, pool_size); + min = cmp::min(min, pool_size); + total += pool_size; + if pool_size < 2 { + cnt += 1; + } + } + + println!( + "Index built with degree: max: {} avg: {} min: {} count(deg<2): {}", + max, + (total as f32) / ((self.num_active_pts + self.configuration.num_frozen_pts) as f32), + min, + cnt + ); + + match self.delete_set.read() { + Ok(guard) => { + println!( + "Number of soft deleted vertices {}, soft deleted percentage: {}", + guard.len(), + (guard.len() as f32) + / ((self.num_active_pts + self.configuration.num_frozen_pts) as f32), + ); + } + Err(_) => { + return Err(ANNError::log_lock_poison_error( + "Failed to acquire delete_set lock, cannot get the number of deleted vertices" + .to_string(), + )); + } + }; + + self.max_observed_degree = cmp::max(max as u32, self.max_observed_degree); + + Ok(()) + } +} + +impl ANNInmemIndex for InmemIndex +where + T: Default + Copy + Sync + Send + Into, + [T; N]: FullPrecisionDistance, +{ + fn build(&mut self, filename: &str, num_points_to_load: usize) -> ANNResult<()> { + // TODO: fresh-diskANN + // std::unique_lock ul(_update_lock); + + if !file_exists(filename) { + return Err(ANNError::log_index_error(format!( + "ERROR: Data file {} does not exist.", + filename + ))); + } + + let (file_num_points, file_dim) = load_metadata_from_file(filename)?; + if file_num_points > self.configuration.max_points { + return Err(ANNError::log_index_error(format!( + "ERROR: Driver requests loading {} points and file has {} points, + but index can support only {} points as specified in configuration.", + num_points_to_load, file_num_points, self.configuration.max_points + ))); + } + + if num_points_to_load > file_num_points { + return Err(ANNError::log_index_error(format!( + "ERROR: Driver requests loading {} points and file has only {} points.", + num_points_to_load, file_num_points + ))); + } + + if file_dim != self.configuration.dim { + return Err(ANNError::log_index_error(format!( + "ERROR: Driver requests loading {} dimension, but file has {} dimension.", + self.configuration.dim, file_dim + ))); + } + + if self.configuration.use_pq_dist { + // TODO: PQ + todo!("PQ is not supported now"); + } + + if self.configuration.index_write_parameter.num_threads > 0 { + set_rayon_num_threads(self.configuration.index_write_parameter.num_threads); + } + + self.dataset.build_from_file(filename, num_points_to_load)?; + + println!("Using only first {} from file.", num_points_to_load); + + // TODO: tag_lock + + self.num_active_pts = num_points_to_load; + self.build_with_data_populated()?; + + Ok(()) + } + + fn insert(&mut self, filename: &str, num_points_to_insert: usize) -> ANNResult<()> { + // fresh-diskANN + if !file_exists(filename) { + return Err(ANNError::log_index_error(format!( + "ERROR: Data file {} does not exist.", + filename + ))); + } + + let (file_num_points, file_dim) = load_metadata_from_file(filename)?; + + if num_points_to_insert > file_num_points { + return Err(ANNError::log_index_error(format!( + "ERROR: Driver requests loading {} points and file has only {} points.", + num_points_to_insert, file_num_points + ))); + } + + if file_dim != self.configuration.dim { + return Err(ANNError::log_index_error(format!( + "ERROR: Driver requests loading {} dimension, but file has {} dimension.", + self.configuration.dim, file_dim + ))); + } + + if self.configuration.use_pq_dist { + // TODO: PQ + todo!("PQ is not supported now"); + } + + if self.query_scratch_queue.size()? == 0 { + self.initialize_query_scratch( + 5 + self.configuration.index_write_parameter.num_threads, + self.configuration.index_write_parameter.search_list_size, + )?; + } + + if self.configuration.index_write_parameter.num_threads > 0 { + // set the thread count of Rayon, otherwise it will use threads as many as logical cores. + std::env::set_var( + "RAYON_NUM_THREADS", + self.configuration + .index_write_parameter + .num_threads + .to_string(), + ); + } + + self.dataset + .append_from_file(filename, num_points_to_insert)?; + self.final_graph.extend( + num_points_to_insert, + self.configuration.index_write_parameter.max_degree, + ); + + // TODO: this should not consider frozen points + let previous_last_pt = self.num_active_pts; + self.num_active_pts += num_points_to_insert; + self.configuration.max_points += num_points_to_insert; + + println!("Inserting {} vectors from file.", num_points_to_insert); + + // TODO: tag_lock + let logger = IndexLogger::new(num_points_to_insert); + let timer = Timer::new(); + execute_with_rayon( + previous_last_pt..self.num_active_pts, + self.configuration.index_write_parameter.num_threads, + |idx| { + self.insert_vertex_id(idx as u32)?; + logger.vertex_processed()?; + + Ok(()) + }, + )?; + + let mut visit_order = + Vec::with_capacity(self.num_active_pts + self.configuration.num_frozen_pts); + for i in 0..self.num_active_pts { + visit_order.push(i as u32); + } + + self.cleanup_graph(&visit_order)?; + println!("{}", timer.elapsed_seconds_for_step("Insert time: ")); + + self.print_stats()?; + + Ok(()) + } + + fn save(&mut self, filename: &str) -> ANNResult<()> { + let data_file = filename.to_string() + ".data"; + let delete_file = filename.to_string() + ".delete"; + + self.save_graph(filename)?; + self.save_data(data_file.as_str())?; + self.save_delete_list(delete_file.as_str())?; + + Ok(()) + } + + fn load(&mut self, filename: &str, expected_num_points: usize) -> ANNResult<()> { + self.num_active_pts = expected_num_points; + self.dataset + .build_from_file(&format!("{}.data", filename), expected_num_points)?; + + self.load_graph(filename, expected_num_points)?; + self.load_delete_list(&format!("{}.delete", filename))?; + + if self.query_scratch_queue.size()? == 0 { + self.initialize_query_scratch( + 5 + self.configuration.index_write_parameter.num_threads, + self.configuration.index_write_parameter.search_list_size, + )?; + } + + Ok(()) + } + + fn search( + &self, + query: &[T], + k_value: usize, + l_value: u32, + indices: &mut [u32], + ) -> ANNResult { + let query_vector = Vertex::new(<&[T; N]>::try_from(query)?, 0); + InmemIndex::search(self, &query_vector, k_value, l_value, indices) + } + + fn soft_delete( + &mut self, + vertex_ids_to_delete: Vec, + num_points_to_delete: usize, + ) -> ANNResult<()> { + println!("Deleting {} vectors from file.", num_points_to_delete); + + let logger = IndexLogger::new(num_points_to_delete); + let timer = Timer::new(); + + execute_with_rayon( + 0..num_points_to_delete, + self.configuration.index_write_parameter.num_threads, + |idx: usize| { + self.soft_delete_vertex(vertex_ids_to_delete[idx])?; + logger.vertex_processed()?; + + Ok(()) + }, + )?; + + println!("{}", timer.elapsed_seconds_for_step("Delete time: ")); + self.print_stats()?; + + Ok(()) + } +} + +#[cfg(test)] +mod index_test { + use vector::Metric; + + use super::*; + use crate::{ + model::{ + configuration::index_write_parameters::IndexWriteParametersBuilder, vertex::DIM_128, + }, + test_utils::get_test_file_path, + utils::file_util::load_ids_to_delete_from_file, + utils::round_up, + }; + + const TEST_DATA_FILE: &str = "tests/data/siftsmall_learn_256pts.fbin"; + const TRUTH_GRAPH: &str = "tests/data/truth_index_siftsmall_learn_256pts_R4_L50_A1.2"; + const TEST_DELETE_FILE: &str = "tests/data/delete_set_50pts.bin"; + const TRUTH_GRAPH_WITH_SATURATED: &str = + "tests/data/disk_index_siftsmall_learn_256pts_R4_L50_A1.2_mem.index"; + const R: u32 = 4; + const L: u32 = 50; + const ALPHA: f32 = 1.2; + + /// Build the index with TEST_DATA_FILE and compare the index graph with truth graph TRUTH_GRAPH + /// Change above constants if you want to test with different dataset + macro_rules! index_end_to_end_test_singlethread { + ($saturate_graph:expr, $truth_graph:expr) => {{ + let (data_num, dim) = + load_metadata_from_file(get_test_file_path(TEST_DATA_FILE).as_str()).unwrap(); + + let index_write_parameters = IndexWriteParametersBuilder::new(L, R) + .with_alpha(ALPHA) + .with_num_threads(1) + .with_saturate_graph($saturate_graph) + .build(); + let config = IndexConfiguration::new( + Metric::L2, + dim, + round_up(dim as u64, 16_u64) as usize, + data_num, + false, + 0, + false, + 0, + 1.0f32, + index_write_parameters, + ); + let mut index: InmemIndex = InmemIndex::new(config.clone()).unwrap(); + + index + .build(get_test_file_path(TEST_DATA_FILE).as_str(), data_num) + .unwrap(); + + let mut truth_index: InmemIndex = InmemIndex::new(config).unwrap(); + truth_index + .load_graph(get_test_file_path($truth_graph).as_str(), data_num) + .unwrap(); + + compare_graphs(&index, &truth_index); + }}; + } + + #[test] + fn index_end_to_end_test_singlethread() { + index_end_to_end_test_singlethread!(false, TRUTH_GRAPH); + } + + #[test] + fn index_end_to_end_test_singlethread_with_saturate_graph() { + index_end_to_end_test_singlethread!(true, TRUTH_GRAPH_WITH_SATURATED); + } + + #[test] + fn index_end_to_end_test_multithread() { + let (data_num, dim) = + load_metadata_from_file(get_test_file_path(TEST_DATA_FILE).as_str()).unwrap(); + + let index_write_parameters = IndexWriteParametersBuilder::new(L, R) + .with_alpha(ALPHA) + .with_num_threads(8) + .build(); + let config = IndexConfiguration::new( + Metric::L2, + dim, + round_up(dim as u64, 16_u64) as usize, + data_num, + false, + 0, + false, + 0, + 1f32, + index_write_parameters, + ); + let mut index: InmemIndex = InmemIndex::new(config).unwrap(); + + index + .build(get_test_file_path(TEST_DATA_FILE).as_str(), data_num) + .unwrap(); + + for i in 0..index.final_graph.size() { + assert_ne!( + index + .final_graph + .read_vertex_and_neighbors(i as u32) + .unwrap() + .size(), + 0 + ); + } + } + + const TEST_DATA_FILE_2: &str = "tests/data/siftsmall_learn_256pts_2.fbin"; + const INSERT_TRUTH_GRAPH: &str = + "tests/data/truth_index_siftsmall_learn_256pts_1+2_R4_L50_A1.2"; + const INSERT_TRUTH_GRAPH_WITH_SATURATED: &str = + "tests/data/truth_index_siftsmall_learn_256pts_1+2_saturated_R4_L50_A1.2"; + + /// Build the index with TEST_DATA_FILE, insert TEST_DATA_FILE_2 and compare the index graph with truth graph TRUTH_GRAPH + /// Change above constants if you want to test with different dataset + macro_rules! index_insert_end_to_end_test_singlethread { + ($saturate_graph:expr, $truth_graph:expr) => {{ + let (data_num, dim) = + load_metadata_from_file(get_test_file_path(TEST_DATA_FILE).as_str()).unwrap(); + + let index_write_parameters = IndexWriteParametersBuilder::new(L, R) + .with_alpha(ALPHA) + .with_num_threads(1) + .with_saturate_graph($saturate_graph) + .build(); + let config = IndexConfiguration::new( + Metric::L2, + dim, + round_up(dim as u64, 16_u64) as usize, + data_num, + false, + 0, + false, + 0, + 2.0f32, + index_write_parameters, + ); + let mut index: InmemIndex = InmemIndex::new(config.clone()).unwrap(); + + index + .build(get_test_file_path(TEST_DATA_FILE).as_str(), data_num) + .unwrap(); + index + .insert(get_test_file_path(TEST_DATA_FILE_2).as_str(), data_num) + .unwrap(); + + let config2 = IndexConfiguration::new( + Metric::L2, + dim, + round_up(dim as u64, 16_u64) as usize, + data_num * 2, + false, + 0, + false, + 0, + 1.0f32, + index_write_parameters, + ); + let mut truth_index: InmemIndex = InmemIndex::new(config2).unwrap(); + truth_index + .load_graph(get_test_file_path($truth_graph).as_str(), data_num) + .unwrap(); + + compare_graphs(&index, &truth_index); + }}; + } + + /// Build the index with TEST_DATA_FILE, and delete the vertices with id defined in TEST_DELETE_SET + macro_rules! index_delete_end_to_end_test_singlethread { + () => {{ + let (data_num, dim) = + load_metadata_from_file(get_test_file_path(TEST_DATA_FILE).as_str()).unwrap(); + + let index_write_parameters = IndexWriteParametersBuilder::new(L, R) + .with_alpha(ALPHA) + .with_num_threads(1) + .build(); + let config = IndexConfiguration::new( + Metric::L2, + dim, + round_up(dim as u64, 16_u64) as usize, + data_num, + false, + 0, + false, + 0, + 2.0f32, + index_write_parameters, + ); + let mut index: InmemIndex = InmemIndex::new(config.clone()).unwrap(); + + index + .build(get_test_file_path(TEST_DATA_FILE).as_str(), data_num) + .unwrap(); + + let (num_points_to_delete, vertex_ids_to_delete) = + load_ids_to_delete_from_file(TEST_DELETE_FILE).unwrap(); + index + .soft_delete(vertex_ids_to_delete, num_points_to_delete) + .unwrap(); + assert!(index.delete_set.read().unwrap().len() == num_points_to_delete); + }}; + } + + #[test] + fn index_insert_end_to_end_test_singlethread() { + index_insert_end_to_end_test_singlethread!(false, INSERT_TRUTH_GRAPH); + } + + #[test] + fn index_delete_end_to_end_test_singlethread() { + index_delete_end_to_end_test_singlethread!(); + } + + #[test] + fn index_insert_end_to_end_test_saturated_singlethread() { + index_insert_end_to_end_test_singlethread!(true, INSERT_TRUTH_GRAPH_WITH_SATURATED); + } + + fn compare_graphs(index: &InmemIndex, truth_index: &InmemIndex) { + assert_eq!(index.start, truth_index.start); + assert_eq!(index.max_observed_degree, truth_index.max_observed_degree); + assert_eq!(index.final_graph.size(), truth_index.final_graph.size()); + + for i in 0..index.final_graph.size() { + assert_eq!( + index + .final_graph + .read_vertex_and_neighbors(i as u32) + .unwrap() + .size(), + truth_index + .final_graph + .read_vertex_and_neighbors(i as u32) + .unwrap() + .size() + ); + assert_eq!( + index + .final_graph + .read_vertex_and_neighbors(i as u32) + .unwrap() + .get_neighbors(), + truth_index + .final_graph + .read_vertex_and_neighbors(i as u32) + .unwrap() + .get_neighbors() + ); + } + } +} diff --git a/rust/diskann/src/index/inmem_index/inmem_index_storage.rs b/rust/diskann/src/index/inmem_index/inmem_index_storage.rs new file mode 100644 index 000000000..fa14d70b2 --- /dev/null +++ b/rust/diskann/src/index/inmem_index/inmem_index_storage.rs @@ -0,0 +1,304 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::fs::File; +use std::io::{BufReader, BufWriter, Seek, SeekFrom, Write}; +use std::path::Path; + +use byteorder::{LittleEndian, ReadBytesExt}; +use vector::FullPrecisionDistance; + +use crate::common::{ANNError, ANNResult}; +use crate::model::graph::AdjacencyList; +use crate::model::InMemoryGraph; +use crate::utils::{file_exists, save_data_in_base_dimensions}; + +use super::InmemIndex; + +impl InmemIndex +where + T: Default + Copy + Sync + Send + Into, + [T; N]: FullPrecisionDistance, +{ + pub fn load_graph(&mut self, filename: &str, expected_num_points: usize) -> ANNResult { + // let file_offset = 0; // will need this for single file format support + + let mut in_file = BufReader::new(File::open(Path::new(filename))?); + // in_file.seek(SeekFrom::Start(file_offset as u64))?; + + let expected_file_size: usize = in_file.read_u64::()? as usize; + self.max_observed_degree = in_file.read_u32::()?; + self.start = in_file.read_u32::()?; + let file_frozen_pts: usize = in_file.read_u64::()? as usize; + + let vamana_metadata_size = 24; + + println!("From graph header, expected_file_size: {}, max_observed_degree: {}, start: {}, file_frozen_pts: {}", + expected_file_size, self.max_observed_degree, self.start, file_frozen_pts); + + if file_frozen_pts != self.configuration.num_frozen_pts { + if file_frozen_pts == 1 { + return Err(ANNError::log_index_config_error( + "num_frozen_pts".to_string(), + "ERROR: When loading index, detected dynamic index, but constructor asks for static index. Exitting.".to_string()) + ); + } else { + return Err(ANNError::log_index_config_error( + "num_frozen_pts".to_string(), + "ERROR: When loading index, detected static index, but constructor asks for dynamic index. Exitting.".to_string()) + ); + } + } + + println!("Loading vamana graph {}...", filename); + + let expected_max_points = expected_num_points - file_frozen_pts; + + // If user provides more points than max_points + // resize the _final_graph to the larger size. + if self.configuration.max_points < expected_max_points { + println!("Number of points in data: {} is greater than max_points: {} Setting max points to: {}", expected_max_points, self.configuration.max_points, expected_max_points); + + self.configuration.max_points = expected_max_points; + self.final_graph = InMemoryGraph::new( + self.configuration.max_points + self.configuration.num_frozen_pts, + self.configuration.index_write_parameter.max_degree, + ); + } + + let mut bytes_read = vamana_metadata_size; + let mut num_edges = 0; + let mut nodes_read = 0; + let mut max_observed_degree = 0; + + while bytes_read != expected_file_size { + let num_nbrs = in_file.read_u32::()?; + max_observed_degree = if num_nbrs > max_observed_degree { + num_nbrs + } else { + max_observed_degree + }; + + if num_nbrs == 0 { + return Err(ANNError::log_index_error(format!( + "ERROR: Point found with no out-neighbors, point# {}", + nodes_read + ))); + } + + num_edges += num_nbrs; + nodes_read += 1; + let mut tmp: Vec = Vec::with_capacity(num_nbrs as usize); + for _ in 0..num_nbrs { + tmp.push(in_file.read_u32::()?); + } + + self.final_graph + .write_vertex_and_neighbors(nodes_read - 1)? + .set_neighbors(AdjacencyList::from(tmp)); + bytes_read += 4 * (num_nbrs as usize + 1); + } + + println!( + "Done. Index has {} nodes and {} out-edges, _start is set to {}", + nodes_read, num_edges, self.start + ); + + self.max_observed_degree = max_observed_degree; + Ok(nodes_read as usize) + } + + /// 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 u32) + pub fn save_graph(&mut self, graph_file: &str) -> ANNResult { + let file: File = File::create(graph_file)?; + let mut out = BufWriter::new(file); + + let file_offset: u64 = 0; + out.seek(SeekFrom::Start(file_offset))?; + let mut index_size: u64 = 24; + let mut max_degree: u32 = 0; + out.write_all(&index_size.to_le_bytes())?; + out.write_all(&self.max_observed_degree.to_le_bytes())?; + out.write_all(&self.start.to_le_bytes())?; + out.write_all(&(self.configuration.num_frozen_pts as u64).to_le_bytes())?; + + // At this point, either nd == max_points or any frozen points have + // been temporarily moved to nd, so nd + num_frozen_points is the valid + // location limit + for i in 0..self.num_active_pts + self.configuration.num_frozen_pts { + let idx = i as u32; + let gk: u32 = self.final_graph.read_vertex_and_neighbors(idx)?.size() as u32; + out.write_all(&gk.to_le_bytes())?; + for neighbor in self + .final_graph + .read_vertex_and_neighbors(idx)? + .get_neighbors() + .iter() + { + out.write_all(&neighbor.to_le_bytes())?; + } + max_degree = + if self.final_graph.read_vertex_and_neighbors(idx)?.size() as u32 > max_degree { + self.final_graph.read_vertex_and_neighbors(idx)?.size() as u32 + } else { + max_degree + }; + index_size += (std::mem::size_of::() * (gk as usize + 1)) as u64; + } + out.seek(SeekFrom::Start(file_offset))?; + out.write_all(&index_size.to_le_bytes())?; + out.write_all(&max_degree.to_le_bytes())?; + out.flush()?; + Ok(index_size) + } + + /// Save the data on a file. + pub fn save_data(&mut self, data_file: &str) -> ANNResult { + // Note: at this point, either _nd == _max_points or any frozen points have + // been temporarily moved to _nd, so _nd + _num_frozen_points is the valid + // location limit. + Ok(save_data_in_base_dimensions( + data_file, + &mut self.dataset.data, + self.num_active_pts + self.configuration.num_frozen_pts, + self.configuration.dim, + self.configuration.aligned_dim, + 0, + )?) + } + + /// Save the delete list to a file only if the delete list length is not zero. + pub fn save_delete_list(&mut self, delete_list_file: &str) -> ANNResult { + let mut delete_file_size = 0; + if let Ok(delete_set) = self.delete_set.read() { + let delete_set_len = delete_set.len() as u32; + + if delete_set_len != 0 { + let file: File = File::create(delete_list_file)?; + let mut writer = BufWriter::new(file); + + // Write the length of the set. + writer.write_all(&delete_set_len.to_le_bytes())?; + delete_file_size += std::mem::size_of::(); + + // Write the elements of the set. + for &item in delete_set.iter() { + writer.write_all(&item.to_be_bytes())?; + delete_file_size += std::mem::size_of::(); + } + + writer.flush()?; + } + } else { + return Err(ANNError::log_lock_poison_error( + "Poisoned lock on delete set. Can't save deleted list.".to_string(), + )); + } + + Ok(delete_file_size) + } + + // load the deleted list from the delete file if it exists. + pub fn load_delete_list(&mut self, delete_list_file: &str) -> ANNResult { + let mut len = 0; + + if file_exists(delete_list_file) { + let file = File::open(delete_list_file)?; + let mut reader = BufReader::new(file); + + len = reader.read_u32::()? as usize; + + if let Ok(mut delete_set) = self.delete_set.write() { + for _ in 0..len { + let item = reader.read_u32::()?; + delete_set.insert(item); + } + } else { + return Err(ANNError::log_lock_poison_error( + "Poisoned lock on delete set. Can't load deleted list.".to_string(), + )); + } + } + + Ok(len) + } +} + +#[cfg(test)] +mod index_test { + use std::fs; + + use vector::Metric; + + use super::*; + use crate::{ + index::ANNInmemIndex, + model::{ + configuration::index_write_parameters::IndexWriteParametersBuilder, vertex::DIM_128, + IndexConfiguration, + }, + utils::{load_metadata_from_file, round_up}, + }; + + const TEST_DATA_FILE: &str = "tests/data/siftsmall_learn_256pts.fbin"; + const R: u32 = 4; + const L: u32 = 50; + const ALPHA: f32 = 1.2; + + #[cfg_attr(not(coverage), test)] + fn save_graph_test() { + let parameters = IndexWriteParametersBuilder::new(50, 4) + .with_alpha(1.2) + .build(); + let config = + IndexConfiguration::new(Metric::L2, 10, 16, 16, false, 0, false, 8, 1f32, parameters); + let mut index = InmemIndex::::new(config).unwrap(); + let final_graph = InMemoryGraph::new(10, 3); + let num_active_pts = 2_usize; + index.final_graph = final_graph; + index.num_active_pts = num_active_pts; + let graph_file = "test_save_graph_data.bin"; + let result = index.save_graph(graph_file); + assert!(result.is_ok()); + + fs::remove_file(graph_file).expect("Failed to delete file"); + } + + #[test] + fn save_data_test() { + let (data_num, dim) = load_metadata_from_file(TEST_DATA_FILE).unwrap(); + + let index_write_parameters = IndexWriteParametersBuilder::new(L, R) + .with_alpha(ALPHA) + .build(); + let config = IndexConfiguration::new( + Metric::L2, + dim, + round_up(dim as u64, 16_u64) as usize, + data_num, + false, + 0, + false, + 0, + 1f32, + index_write_parameters, + ); + let mut index: InmemIndex = InmemIndex::new(config).unwrap(); + + index.build(TEST_DATA_FILE, data_num).unwrap(); + + let data_file = "test.data"; + let result = index.save_data(data_file); + assert_eq!( + result.unwrap(), + 2 * std::mem::size_of::() + + (index.num_active_pts + index.configuration.num_frozen_pts) + * index.configuration.dim + * (std::mem::size_of::()) + ); + fs::remove_file(data_file).expect("Failed to delete file"); + } +} diff --git a/rust/diskann/src/index/inmem_index/mod.rs b/rust/diskann/src/index/inmem_index/mod.rs new file mode 100644 index 000000000..f2a091a09 --- /dev/null +++ b/rust/diskann/src/index/inmem_index/mod.rs @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[allow(clippy::module_inception)] +mod inmem_index; +pub use inmem_index::InmemIndex; + +mod inmem_index_storage; + +pub mod ann_inmem_index; + diff --git a/rust/diskann/src/index/mod.rs b/rust/diskann/src/index/mod.rs new file mode 100644 index 000000000..18c3bd5e9 --- /dev/null +++ b/rust/diskann/src/index/mod.rs @@ -0,0 +1,11 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +mod inmem_index; +pub use inmem_index::ann_inmem_index::*; +pub use inmem_index::InmemIndex; + +mod disk_index; +pub use disk_index::*; + diff --git a/rust/diskann/src/instrumentation/disk_index_build_logger.rs b/rust/diskann/src/instrumentation/disk_index_build_logger.rs new file mode 100644 index 000000000..d34935342 --- /dev/null +++ b/rust/diskann/src/instrumentation/disk_index_build_logger.rs @@ -0,0 +1,57 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use logger::logger::indexlog::DiskIndexConstructionCheckpoint; +use logger::logger::indexlog::DiskIndexConstructionLog; +use logger::logger::indexlog::Log; +use logger::logger::indexlog::LogLevel; +use logger::message_handler::send_log; + +use crate::{utils::Timer, common::ANNResult}; + +pub struct DiskIndexBuildLogger { + timer: Timer, + checkpoint: DiskIndexConstructionCheckpoint, +} + +impl DiskIndexBuildLogger { + pub fn new(checkpoint: DiskIndexConstructionCheckpoint) -> Self { + Self { + timer: Timer::new(), + checkpoint, + } + } + + pub fn log_checkpoint(&mut self, next_checkpoint: DiskIndexConstructionCheckpoint) -> ANNResult<()> { + if self.checkpoint == DiskIndexConstructionCheckpoint::None { + return Ok(()); + } + + let mut log = Log::default(); + let disk_index_construction_log = DiskIndexConstructionLog { + checkpoint: self.checkpoint as i32, + time_spent_in_seconds: self.timer.elapsed().as_secs_f32(), + g_cycles_spent: self.timer.elapsed_gcycles(), + log_level: LogLevel::Info as i32, + }; + log.disk_index_construction_log = Some(disk_index_construction_log); + + send_log(log)?; + self.checkpoint = next_checkpoint; + self.timer.reset(); + Ok(()) + } +} + +#[cfg(test)] +mod dataset_test { + use super::*; + + #[test] + fn test_log() { + let mut logger = DiskIndexBuildLogger::new(DiskIndexConstructionCheckpoint::PqConstruction); + logger.log_checkpoint(DiskIndexConstructionCheckpoint::InmemIndexBuild).unwrap();logger.log_checkpoint(logger::logger::indexlog::DiskIndexConstructionCheckpoint::DiskLayout).unwrap(); + } +} + diff --git a/rust/diskann/src/instrumentation/index_logger.rs b/rust/diskann/src/instrumentation/index_logger.rs new file mode 100644 index 000000000..dfc81ad15 --- /dev/null +++ b/rust/diskann/src/instrumentation/index_logger.rs @@ -0,0 +1,47 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::sync::atomic::{AtomicUsize, Ordering}; + +use logger::logger::indexlog::IndexConstructionLog; +use logger::logger::indexlog::Log; +use logger::logger::indexlog::LogLevel; +use logger::message_handler::send_log; + +use crate::common::ANNResult; +use crate::utils::Timer; + +pub struct IndexLogger { + items_processed: AtomicUsize, + timer: Timer, + range: usize, +} + +impl IndexLogger { + pub fn new(range: usize) -> Self { + Self { + items_processed: AtomicUsize::new(0), + timer: Timer::new(), + range, + } + } + + pub fn vertex_processed(&self) -> ANNResult<()> { + let count = self.items_processed.fetch_add(1, Ordering::Relaxed); + if count % 100_000 == 0 { + let mut log = Log::default(); + let index_construction_log = IndexConstructionLog { + percentage_complete: (100_f32 * count as f32) / (self.range as f32), + time_spent_in_seconds: self.timer.elapsed().as_secs_f32(), + g_cycles_spent: self.timer.elapsed_gcycles(), + log_level: LogLevel::Info as i32, + }; + log.index_construction_log = Some(index_construction_log); + + send_log(log)?; + } + + Ok(()) + } +} diff --git a/rust/diskann/src/instrumentation/mod.rs b/rust/diskann/src/instrumentation/mod.rs new file mode 100644 index 000000000..234e53ce9 --- /dev/null +++ b/rust/diskann/src/instrumentation/mod.rs @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +mod index_logger; +pub use index_logger::IndexLogger; + +mod disk_index_build_logger; +pub use disk_index_build_logger::DiskIndexBuildLogger; diff --git a/rust/diskann/src/lib.rs b/rust/diskann/src/lib.rs new file mode 100644 index 000000000..1f89e33fc --- /dev/null +++ b/rust/diskann/src/lib.rs @@ -0,0 +1,26 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![cfg_attr( + not(test), + warn(clippy::panic, clippy::unwrap_used, clippy::expect_used) +)] +#![cfg_attr(test, allow(clippy::unused_io_amount))] + +pub mod utils; + +pub mod algorithm; + +pub mod model; + +pub mod common; + +pub mod index; + +pub mod storage; + +pub mod instrumentation; + +#[cfg(test)] +pub mod test_utils; diff --git a/rust/diskann/src/model/configuration/disk_index_build_parameter.rs b/rust/diskann/src/model/configuration/disk_index_build_parameter.rs new file mode 100644 index 000000000..539192af0 --- /dev/null +++ b/rust/diskann/src/model/configuration/disk_index_build_parameter.rs @@ -0,0 +1,85 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Parameters for disk index construction. + +use crate::common::{ANNResult, ANNError}; + +/// Cached nodes size in GB +const SPACE_FOR_CACHED_NODES_IN_GB: f64 = 0.25; + +/// Threshold for caching in GB +const THRESHOLD_FOR_CACHING_IN_GB: f64 = 1.0; + +/// Parameters specific for disk index construction. +#[derive(Clone, Copy, PartialEq, Debug)] +pub struct DiskIndexBuildParameters { + /// Bound on the memory footprint of the index at search time in bytes. + /// 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. + search_ram_limit: f64, + + /// Limit on the memory allowed for building the index in bytes. + index_build_ram_limit: f64, +} + +impl DiskIndexBuildParameters { + /// Create DiskIndexBuildParameters instance + pub fn new(search_ram_limit_gb: f64, index_build_ram_limit_gb: f64) -> ANNResult { + let param = Self { + search_ram_limit: Self::get_memory_budget(search_ram_limit_gb), + index_build_ram_limit: index_build_ram_limit_gb * 1024_f64 * 1024_f64 * 1024_f64, + }; + + if param.search_ram_limit <= 0f64 { + return Err(ANNError::log_index_config_error("search_ram_limit".to_string(), "RAM budget should be > 0".to_string())) + } + + if param.index_build_ram_limit <= 0f64 { + return Err(ANNError::log_index_config_error("index_build_ram_limit".to_string(), "RAM budget should be > 0".to_string())) + } + + Ok(param) + } + + /// Get search_ram_limit + pub fn search_ram_limit(&self) -> f64 { + self.search_ram_limit + } + + /// Get index_build_ram_limit + pub fn index_build_ram_limit(&self) -> f64 { + self.index_build_ram_limit + } + + fn get_memory_budget(mut index_ram_limit_gb: f64) -> f64 { + if index_ram_limit_gb - SPACE_FOR_CACHED_NODES_IN_GB > THRESHOLD_FOR_CACHING_IN_GB { + // slack for space used by cached nodes + index_ram_limit_gb -= SPACE_FOR_CACHED_NODES_IN_GB; + } + + index_ram_limit_gb * 1024_f64 * 1024_f64 * 1024_f64 + } +} + +#[cfg(test)] +mod dataset_test { + use super::*; + + #[test] + fn sufficient_ram_for_caching() { + let param = DiskIndexBuildParameters::new(1.26_f64, 1.0_f64).unwrap(); + assert_eq!(param.search_ram_limit, 1.01_f64 * 1024_f64 * 1024_f64 * 1024_f64); + } + + #[test] + fn insufficient_ram_for_caching() { + let param = DiskIndexBuildParameters::new(0.03_f64, 1.0_f64).unwrap(); + assert_eq!(param.search_ram_limit, 0.03_f64 * 1024_f64 * 1024_f64 * 1024_f64); + } +} + diff --git a/rust/diskann/src/model/configuration/index_configuration.rs b/rust/diskann/src/model/configuration/index_configuration.rs new file mode 100644 index 000000000..3e8c472ae --- /dev/null +++ b/rust/diskann/src/model/configuration/index_configuration.rs @@ -0,0 +1,92 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Index configuration. + +use vector::Metric; + +use super::index_write_parameters::IndexWriteParameters; + +/// The index configuration +#[derive(Debug, Clone)] +pub struct IndexConfiguration { + /// Index write parameter + pub index_write_parameter: IndexWriteParameters, + + /// Distance metric + pub dist_metric: Metric, + + /// Dimension of the raw data + pub dim: usize, + + /// Aligned dimension - round up dim to the nearest multiple of 8 + pub aligned_dim: usize, + + /// Total number of points in given data set + pub max_points: usize, + + /// Number of points which are used as initial candidates when iterating to + /// closest point(s). These are not visible externally and won't be returned + /// by search. DiskANN forces at least 1 frozen point for dynamic index. + /// The frozen points have consecutive locations. + pub num_frozen_pts: usize, + + /// Calculate distance by PQ or not + pub use_pq_dist: bool, + + /// Number of PQ chunks + pub num_pq_chunks: usize, + + /// Use optimized product quantization + /// Currently not supported + pub use_opq: bool, + + /// potential for growth. 1.2 means the index can grow by up to 20%. + pub growth_potential: f32, + + // TODO: below settings are not supported in current iteration + // pub concurrent_consolidate: bool, + // pub has_built: bool, + // pub save_as_one_file: bool, + // pub dynamic_index: bool, + // pub enable_tags: bool, + // pub normalize_vecs: bool, +} + +impl IndexConfiguration { + /// Create IndexConfiguration instance + #[allow(clippy::too_many_arguments)] + pub fn new( + dist_metric: Metric, + dim: usize, + aligned_dim: usize, + max_points: usize, + use_pq_dist: bool, + num_pq_chunks: usize, + use_opq: bool, + num_frozen_pts: usize, + growth_potential: f32, + index_write_parameter: IndexWriteParameters + ) -> Self { + Self { + index_write_parameter, + dist_metric, + dim, + aligned_dim, + max_points, + num_frozen_pts, + use_pq_dist, + num_pq_chunks, + use_opq, + growth_potential, + } + } + + /// Get the size of adjacency list that we build out. + pub fn write_range(&self) -> usize { + self.index_write_parameter.max_degree as usize + } +} diff --git a/rust/diskann/src/model/configuration/index_write_parameters.rs b/rust/diskann/src/model/configuration/index_write_parameters.rs new file mode 100644 index 000000000..cb71f4297 --- /dev/null +++ b/rust/diskann/src/model/configuration/index_write_parameters.rs @@ -0,0 +1,245 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Index write parameters. + +/// Default parameter values. +pub mod default_param_vals { + /// Default value of alpha. + pub const ALPHA: f32 = 1.2; + + /// Default value of number of threads. + pub const NUM_THREADS: u32 = 0; + + /// Default value of number of rounds. + pub const NUM_ROUNDS: u32 = 2; + + /// Default value of max occlusion size. + pub const MAX_OCCLUSION_SIZE: u32 = 750; + + /// Default value of filter list size. + pub const FILTER_LIST_SIZE: u32 = 0; + + /// Default value of number of frozen points. + pub const NUM_FROZEN_POINTS: u32 = 0; + + /// Default value of max degree. + pub const MAX_DEGREE: u32 = 64; + + /// Default value of build list size. + pub const BUILD_LIST_SIZE: u32 = 100; + + /// Default value of saturate graph. + pub const SATURATE_GRAPH: bool = false; + + /// Default value of search list size. + pub const SEARCH_LIST_SIZE: u32 = 100; +} + +/// Index write parameters. +#[derive(Clone, Copy, PartialEq, Debug)] +pub struct IndexWriteParameters { + /// Search list size - L. + pub search_list_size: u32, + + /// Max degree - R. + pub max_degree: u32, + + /// Saturate graph. + pub saturate_graph: bool, + + /// Max occlusion size - C. + pub max_occlusion_size: u32, + + /// Alpha. + pub alpha: f32, + + /// Number of rounds. + pub num_rounds: u32, + + /// Number of threads. + pub num_threads: u32, + + /// Number of frozen points. + pub num_frozen_points: u32, +} + +impl Default for IndexWriteParameters { + /// Create IndexWriteParameters with default values + fn default() -> Self { + Self { + search_list_size: default_param_vals::SEARCH_LIST_SIZE, + max_degree: default_param_vals::MAX_DEGREE, + saturate_graph: default_param_vals::SATURATE_GRAPH, + max_occlusion_size: default_param_vals::MAX_OCCLUSION_SIZE, + alpha: default_param_vals::ALPHA, + num_rounds: default_param_vals::NUM_ROUNDS, + num_threads: default_param_vals::NUM_THREADS, + num_frozen_points: default_param_vals::NUM_FROZEN_POINTS + } + } +} + +/// The builder for IndexWriteParameters. +#[derive(Debug)] +pub struct IndexWriteParametersBuilder { + search_list_size: u32, + max_degree: u32, + max_occlusion_size: Option, + saturate_graph: Option, + alpha: Option, + num_rounds: Option, + num_threads: Option, + // filter_list_size: Option, + num_frozen_points: Option, +} + +impl IndexWriteParametersBuilder { + /// Initialize IndexWriteParametersBuilder + pub fn new(search_list_size: u32, max_degree: u32) -> Self { + Self { + search_list_size, + max_degree, + max_occlusion_size: None, + saturate_graph: None, + alpha: None, + num_rounds: None, + num_threads: None, + // filter_list_size: None, + num_frozen_points: None, + } + } + + /// Set max occlusion size. + pub fn with_max_occlusion_size(mut self, max_occlusion_size: u32) -> Self { + self.max_occlusion_size = Some(max_occlusion_size); + self + } + + /// Set saturate graph. + pub fn with_saturate_graph(mut self, saturate_graph: bool) -> Self { + self.saturate_graph = Some(saturate_graph); + self + } + + /// Set alpha. + pub fn with_alpha(mut self, alpha: f32) -> Self { + self.alpha = Some(alpha); + self + } + + /// Set number of rounds. + pub fn with_num_rounds(mut self, num_rounds: u32) -> Self { + self.num_rounds = Some(num_rounds); + self + } + + /// Set number of threads. + pub fn with_num_threads(mut self, num_threads: u32) -> Self { + self.num_threads = Some(num_threads); + self + } + + /* + pub fn with_filter_list_size(mut self, filter_list_size: u32) -> Self { + self.filter_list_size = Some(filter_list_size); + self + } + */ + + /// Set number of frozen points. + pub fn with_num_frozen_points(mut self, num_frozen_points: u32) -> Self { + self.num_frozen_points = Some(num_frozen_points); + self + } + + /// Build IndexWriteParameters from IndexWriteParametersBuilder. + pub fn build(self) -> IndexWriteParameters { + IndexWriteParameters { + search_list_size: self.search_list_size, + max_degree: self.max_degree, + saturate_graph: self.saturate_graph.unwrap_or(default_param_vals::SATURATE_GRAPH), + max_occlusion_size: self.max_occlusion_size.unwrap_or(default_param_vals::MAX_OCCLUSION_SIZE), + alpha: self.alpha.unwrap_or(default_param_vals::ALPHA), + num_rounds: self.num_rounds.unwrap_or(default_param_vals::NUM_ROUNDS), + num_threads: self.num_threads.unwrap_or(default_param_vals::NUM_THREADS), + // filter_list_size: self.filter_list_size.unwrap_or(default_param_vals::FILTER_LIST_SIZE), + num_frozen_points: self.num_frozen_points.unwrap_or(default_param_vals::NUM_FROZEN_POINTS), + } + } +} + +/// Construct IndexWriteParametersBuilder from IndexWriteParameters. +impl From for IndexWriteParametersBuilder { + fn from(param: IndexWriteParameters) -> Self { + Self { + search_list_size: param.search_list_size, + max_degree: param.max_degree, + max_occlusion_size: Some(param.max_occlusion_size), + saturate_graph: Some(param.saturate_graph), + alpha: Some(param.alpha), + num_rounds: Some(param.num_rounds), + num_threads: Some(param.num_threads), + // filter_list_size: Some(param.filter_list_size), + num_frozen_points: Some(param.num_frozen_points), + } + } +} + +#[cfg(test)] +mod parameters_test { + use crate::model::configuration::index_write_parameters::*; + + #[test] + fn test_default_index_params() { + let wp1 = IndexWriteParameters::default(); + assert_eq!(wp1.search_list_size, default_param_vals::SEARCH_LIST_SIZE); + assert_eq!(wp1.max_degree, default_param_vals::MAX_DEGREE); + assert_eq!(wp1.saturate_graph, default_param_vals::SATURATE_GRAPH); + assert_eq!(wp1.max_occlusion_size, default_param_vals::MAX_OCCLUSION_SIZE); + assert_eq!(wp1.alpha, default_param_vals::ALPHA); + assert_eq!(wp1.num_rounds, default_param_vals::NUM_ROUNDS); + assert_eq!(wp1.num_threads, default_param_vals::NUM_THREADS); + assert_eq!(wp1.num_frozen_points, default_param_vals::NUM_FROZEN_POINTS); + } + + #[test] + fn test_index_write_parameters_builder() { + // default value + let wp1 = IndexWriteParametersBuilder::new(10, 20).build(); + assert_eq!(wp1.search_list_size, 10); + assert_eq!(wp1.max_degree, 20); + assert_eq!(wp1.saturate_graph, default_param_vals::SATURATE_GRAPH); + assert_eq!(wp1.max_occlusion_size, default_param_vals::MAX_OCCLUSION_SIZE); + assert_eq!(wp1.alpha, default_param_vals::ALPHA); + assert_eq!(wp1.num_rounds, default_param_vals::NUM_ROUNDS); + assert_eq!(wp1.num_threads, default_param_vals::NUM_THREADS); + assert_eq!(wp1.num_frozen_points, default_param_vals::NUM_FROZEN_POINTS); + + // build with custom values + let wp2 = IndexWriteParametersBuilder::new(10, 20) + .with_max_occlusion_size(30) + .with_saturate_graph(true) + .with_alpha(0.5) + .with_num_rounds(40) + .with_num_threads(50) + .with_num_frozen_points(60) + .build(); + assert_eq!(wp2.search_list_size, 10); + assert_eq!(wp2.max_degree, 20); + assert!(wp2.saturate_graph); + assert_eq!(wp2.max_occlusion_size, 30); + assert_eq!(wp2.alpha, 0.5); + assert_eq!(wp2.num_rounds, 40); + assert_eq!(wp2.num_threads, 50); + assert_eq!(wp2.num_frozen_points, 60); + + // test from + let wp3 = IndexWriteParametersBuilder::from(wp2).build(); + assert_eq!(wp3, wp2); + } +} + diff --git a/rust/diskann/src/model/configuration/mod.rs b/rust/diskann/src/model/configuration/mod.rs new file mode 100644 index 000000000..201f97e98 --- /dev/null +++ b/rust/diskann/src/model/configuration/mod.rs @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +pub mod index_configuration; +pub use index_configuration::IndexConfiguration; + +pub mod index_write_parameters; +pub use index_write_parameters::*; + +pub mod disk_index_build_parameter; +pub use disk_index_build_parameter::DiskIndexBuildParameters; diff --git a/rust/diskann/src/model/data_store/disk_scratch_dataset.rs b/rust/diskann/src/model/data_store/disk_scratch_dataset.rs new file mode 100644 index 000000000..0d9a007ab --- /dev/null +++ b/rust/diskann/src/model/data_store/disk_scratch_dataset.rs @@ -0,0 +1,76 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Disk scratch dataset + +use std::mem::{size_of, size_of_val}; +use std::ptr; + +use crate::common::{AlignedBoxWithSlice, ANNResult}; +use crate::model::MAX_N_CMPS; +use crate::utils::round_up; + +/// DiskScratchDataset alignment +pub const DISK_SCRATCH_DATASET_ALIGN: usize = 256; + +/// Disk scratch dataset storing fp vectors with aligned dim +#[derive(Debug)] +pub struct DiskScratchDataset +{ + /// fp vectors with aligned dim + pub data: AlignedBoxWithSlice, + + /// current index to store the next fp vector + pub cur_index: usize, +} + +impl DiskScratchDataset +{ + /// Create DiskScratchDataset instance + pub fn new() -> ANNResult { + Ok(Self { + // C++ code allocates round_up(MAX_N_CMPS * N, 256) bytes, shouldn't it be round_up(MAX_N_CMPS * N, 256) * size_of:: bytes? + data: AlignedBoxWithSlice::new( + round_up(MAX_N_CMPS * N, DISK_SCRATCH_DATASET_ALIGN), + DISK_SCRATCH_DATASET_ALIGN)?, + cur_index: 0, + }) + } + + /// memcpy from fp vector bytes (its len should be `dim * size_of::()`) to self.data + /// The dest slice is a fp vector with aligned dim + /// * fp_vector_buf's dim might not be aligned dim (N) + /// # Safety + /// Behavior is undefined if any of the following conditions are violated: + /// + /// * `fp_vector_buf`'s len must be `dim * size_of::()` bytes + /// + /// * `fp_vector_buf` must be smaller than or equal to `N * size_of::()` bytes. + /// + /// * `fp_vector_buf` and `self.data` must be nonoverlapping. + pub unsafe fn memcpy_from_fp_vector_buf(&mut self, fp_vector_buf: &[u8]) -> &[T] { + if self.cur_index == MAX_N_CMPS { + self.cur_index = 0; + } + + let aligned_dim_vector = &mut self.data[self.cur_index * N..(self.cur_index + 1) * N]; + + assert!(fp_vector_buf.len() % size_of::() == 0); + assert!(fp_vector_buf.len() <= size_of_val(aligned_dim_vector)); + + // memcpy from fp_vector_buf to aligned_dim_vector + unsafe { + ptr::copy_nonoverlapping( + fp_vector_buf.as_ptr(), + aligned_dim_vector.as_mut_ptr() as *mut u8, + fp_vector_buf.len(), + ); + } + + self.cur_index += 1; + aligned_dim_vector + } +} diff --git a/rust/diskann/src/model/data_store/inmem_dataset.rs b/rust/diskann/src/model/data_store/inmem_dataset.rs new file mode 100644 index 000000000..6d8b649a2 --- /dev/null +++ b/rust/diskann/src/model/data_store/inmem_dataset.rs @@ -0,0 +1,285 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! In-memory Dataset + +use rayon::prelude::*; +use std::mem; +use vector::{FullPrecisionDistance, Metric}; + +use crate::common::{ANNError, ANNResult, AlignedBoxWithSlice}; +use crate::model::Vertex; +use crate::utils::copy_aligned_data_from_file; + +/// Dataset of all in-memory FP points +#[derive(Debug)] +pub struct InmemDataset +where + [T; N]: FullPrecisionDistance, +{ + /// All in-memory points + pub data: AlignedBoxWithSlice, + + /// Number of points we anticipate to have + pub num_points: usize, + + /// Number of active points i.e. existing in the graph + pub num_active_pts: usize, + + /// Capacity of the dataset + pub capacity: usize, +} + +impl<'a, T, const N: usize> InmemDataset +where + T: Default + Copy + Sync + Send + Into, + [T; N]: FullPrecisionDistance, +{ + /// Create the dataset with size num_points and growth factor. + /// growth factor=1 means no growth (provision 100% space of num_points) + /// growth factor=1.2 means provision 120% space of num_points (20% extra space) + pub fn new(num_points: usize, index_growth_factor: f32) -> ANNResult { + let capacity = (((num_points * N) as f32) * index_growth_factor) as usize; + + Ok(Self { + data: AlignedBoxWithSlice::new(capacity, mem::size_of::() * 16)?, + num_points, + num_active_pts: num_points, + capacity, + }) + } + + /// get immutable data slice + pub fn get_data(&self) -> &[T] { + &self.data + } + + /// Build the dataset from file + pub fn build_from_file(&mut self, filename: &str, num_points_to_load: usize) -> ANNResult<()> { + println!( + "Loading {} vectors from file {} into dataset...", + num_points_to_load, filename + ); + self.num_active_pts = num_points_to_load; + + copy_aligned_data_from_file(filename, self.into_dto(), 0)?; + + println!("Dataset loaded."); + Ok(()) + } + + /// Append the dataset from file + pub fn append_from_file( + &mut self, + filename: &str, + num_points_to_append: usize, + ) -> ANNResult<()> { + println!( + "Appending {} vectors from file {} into dataset...", + num_points_to_append, filename + ); + if self.num_points + num_points_to_append > self.capacity { + return Err(ANNError::log_index_error(format!( + "Cannot append {} points to dataset of capacity {}", + num_points_to_append, self.capacity + ))); + } + + let pts_offset = self.num_active_pts; + copy_aligned_data_from_file(filename, self.into_dto(), pts_offset)?; + + self.num_active_pts += num_points_to_append; + self.num_points += num_points_to_append; + + println!("Dataset appended."); + Ok(()) + } + + /// Get vertex by id + pub fn get_vertex(&'a self, id: u32) -> ANNResult> { + let start = id as usize * N; + let end = start + N; + + if end <= self.data.len() { + let val = <&[T; N]>::try_from(&self.data[start..end]).map_err(|err| { + ANNError::log_index_error(format!("Failed to get vertex {}, err={}", id, err)) + })?; + Ok(Vertex::new(val, id)) + } else { + Err(ANNError::log_index_error(format!( + "Invalid vertex id {}.", + id + ))) + } + } + + /// Get full precision distance between two nodes + pub fn get_distance(&self, id1: u32, id2: u32, metric: Metric) -> ANNResult { + let vertex1 = self.get_vertex(id1)?; + let vertex2 = self.get_vertex(id2)?; + + Ok(vertex1.compare(&vertex2, metric)) + } + + /// find out the medoid, the vertex in the dataset that is closest to the centroid + pub fn calculate_medoid_point_id(&self) -> ANNResult { + Ok(self.find_nearest_point_id(self.calculate_centroid_point()?)) + } + + /// calculate centroid, average of all vertices in the dataset + fn calculate_centroid_point(&self) -> ANNResult<[f32; N]> { + // Allocate and initialize the centroid vector + let mut center: [f32; N] = [0.0; N]; + + // Sum the data points' components + for i in 0..self.num_active_pts { + let vertex = self.get_vertex(i as u32)?; + let vertex_slice = vertex.vector(); + for j in 0..N { + center[j] += vertex_slice[j].into(); + } + } + + // Divide by the number of points to calculate the centroid + let capacity = self.num_active_pts as f32; + for item in center.iter_mut().take(N) { + *item /= capacity; + } + + Ok(center) + } + + /// find out the vertex closest to the given point + fn find_nearest_point_id(&self, point: [f32; N]) -> u32 { + // compute all to one distance + let mut distances = vec![0f32; self.num_active_pts]; + let slice = &self.data[..]; + distances.par_iter_mut().enumerate().for_each(|(i, dist)| { + let start = i * N; + for j in 0..N { + let diff: f32 = (point.as_slice()[j] - slice[start + j].into()) + * (point.as_slice()[j] - slice[start + j].into()); + *dist += diff; + } + }); + + let mut min_idx = 0; + let mut min_dist = f32::MAX; + for (i, distance) in distances.iter().enumerate().take(self.num_active_pts) { + if *distance < min_dist { + min_idx = i; + min_dist = *distance; + } + } + min_idx as u32 + } + + /// Prefetch vertex data in the memory hierarchy + /// NOTE: good efficiency when total_vec_size is integral multiple of 64 + #[inline] + pub fn prefetch_vector(&self, id: u32) { + let start = id as usize * N; + let end = start + N; + + if end <= self.data.len() { + let vec = &self.data[start..end]; + vector::prefetch_vector(vec); + } + } + + /// Convert into dto object + pub fn into_dto(&mut self) -> DatasetDto { + DatasetDto { + data: &mut self.data, + rounded_dim: N, + } + } +} + +/// Dataset dto used for other layer, such as storage +/// N is the aligned dimension +#[derive(Debug)] +pub struct DatasetDto<'a, T> { + /// data slice borrow from dataset + pub data: &'a mut [T], + + /// rounded dimension + pub rounded_dim: usize, +} + +#[cfg(test)] +mod dataset_test { + use std::fs; + + use super::*; + use crate::model::vertex::DIM_128; + + #[test] + fn get_vertex_within_range() { + let num_points = 1_000_000; + let id = 999_999; + let dataset = InmemDataset::::new(num_points, 1f32).unwrap(); + + let vertex = dataset.get_vertex(999_999).unwrap(); + + assert_eq!(vertex.vertex_id(), id); + assert_eq!(vertex.vector().len(), DIM_128); + assert_eq!(vertex.vector().as_ptr(), unsafe { + dataset.data.as_ptr().add((id as usize) * DIM_128) + }); + } + + #[test] + fn get_vertex_out_of_range() { + let num_points = 1_000_000; + let invalid_id = 1_000_000; + let dataset = InmemDataset::::new(num_points, 1f32).unwrap(); + + if dataset.get_vertex(invalid_id).is_ok() { + panic!("id ({}) should be out of range", invalid_id) + }; + } + + #[test] + fn load_data_test() { + let file_name = "dataset_test_load_data_test.bin"; + //npoints=2, dim=8, 2 vectors [1.0;8] [2.0;8] + let data: [u8; 72] = [ + 2, 0, 0, 0, 8, 0, 0, 0, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x40, 0x40, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40, + 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, + 0x20, 0x41, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41, 0x00, 0x00, 0x50, 0x41, + 0x00, 0x00, 0x60, 0x41, 0x00, 0x00, 0x70, 0x41, 0x00, 0x00, 0x80, 0x41, + ]; + std::fs::write(file_name, data).expect("Failed to write sample file"); + + let mut dataset = InmemDataset::::new(2, 1f32).unwrap(); + + match copy_aligned_data_from_file( + file_name, + dataset.into_dto(), + 0, + ) { + Ok((npts, dim)) => { + fs::remove_file(file_name).expect("Failed to delete file"); + assert!(npts == 2); + assert!(dim == 8); + assert!(dataset.data.len() == 16); + + let first_vertex = dataset.get_vertex(0).unwrap(); + let second_vertex = dataset.get_vertex(1).unwrap(); + + assert!(*first_vertex.vector() == [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]); + assert!(*second_vertex.vector() == [9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]); + } + Err(e) => { + fs::remove_file(file_name).expect("Failed to delete file"); + panic!("{}", e) + } + } + } +} + diff --git a/rust/diskann/src/model/data_store/mod.rs b/rust/diskann/src/model/data_store/mod.rs new file mode 100644 index 000000000..4e7e68393 --- /dev/null +++ b/rust/diskann/src/model/data_store/mod.rs @@ -0,0 +1,11 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[allow(clippy::module_inception)] +mod inmem_dataset; +pub use inmem_dataset::InmemDataset; +pub use inmem_dataset::DatasetDto; + +mod disk_scratch_dataset; +pub use disk_scratch_dataset::*; diff --git a/rust/diskann/src/model/graph/adjacency_list.rs b/rust/diskann/src/model/graph/adjacency_list.rs new file mode 100644 index 000000000..7ad2d7d5b --- /dev/null +++ b/rust/diskann/src/model/graph/adjacency_list.rs @@ -0,0 +1,64 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Adjacency List + +use std::ops::{Deref, DerefMut}; + +#[derive(Debug, Eq, PartialEq)] +/// Represents the out neighbors of a vertex +pub struct AdjacencyList { + edges: Vec, +} + +/// In-mem index related limits +const GRAPH_SLACK_FACTOR: f32 = 1.3_f32; + +impl AdjacencyList { + /// Create AdjacencyList with capacity slack for a range. + pub fn for_range(range: usize) -> Self { + let capacity = (range as f32 * GRAPH_SLACK_FACTOR).ceil() as usize; + Self { + edges: Vec::with_capacity(capacity), + } + } + + /// Push a node to the list of neighbors for the given node. + pub fn push(&mut self, node_id: u32) { + debug_assert!(self.edges.len() < self.edges.capacity()); + self.edges.push(node_id); + } +} + +impl From> for AdjacencyList { + fn from(edges: Vec) -> Self { + Self { edges } + } +} + +impl Deref for AdjacencyList { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.edges + } +} + +impl DerefMut for AdjacencyList { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.edges + } +} + +impl<'a> IntoIterator for &'a AdjacencyList { + type Item = &'a u32; + type IntoIter = std::slice::Iter<'a, u32>; + + fn into_iter(self) -> Self::IntoIter { + self.edges.iter() + } +} + diff --git a/rust/diskann/src/model/graph/disk_graph.rs b/rust/diskann/src/model/graph/disk_graph.rs new file mode 100644 index 000000000..49190b1cd --- /dev/null +++ b/rust/diskann/src/model/graph/disk_graph.rs @@ -0,0 +1,179 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_docs)] + +//! Disk graph + +use byteorder::{LittleEndian, ByteOrder}; +use vector::FullPrecisionDistance; + +use crate::common::{ANNResult, ANNError}; +use crate::model::data_store::DiskScratchDataset; +use crate::model::Vertex; +use crate::storage::DiskGraphStorage; + +use super::{VertexAndNeighbors, SectorGraph, AdjacencyList}; + +/// Disk graph +pub struct DiskGraph { + /// dim of fp vector in disk sector + dim: usize, + + /// number of nodes per sector + num_nodes_per_sector: u64, + + /// max node length in bytes + max_node_len: u64, + + /// the len of fp vector + fp_vector_len: u64, + + /// list of nodes (vertex_id) to fetch from disk + nodes_to_fetch: Vec, + + /// Sector graph + sector_graph: SectorGraph, +} + +impl<'a> DiskGraph { + /// Create DiskGraph instance + pub fn new( + dim: usize, + num_nodes_per_sector: u64, + max_node_len: u64, + fp_vector_len: u64, + beam_width: usize, + graph_storage: DiskGraphStorage, + ) -> ANNResult { + let graph = Self { + dim, + num_nodes_per_sector, + max_node_len, + fp_vector_len, + nodes_to_fetch: Vec::with_capacity(2 * beam_width), + sector_graph: SectorGraph::new(graph_storage)?, + }; + + Ok(graph) + } + + /// Add vertex_id into the list to fetch from disk + pub fn add_vertex(&mut self, id: u32) { + self.nodes_to_fetch.push(id); + } + + /// Fetch nodes from disk index + pub fn fetch_nodes(&mut self) -> ANNResult<()> { + let sectors_to_fetch: Vec = self.nodes_to_fetch.iter().map(|&id| self.node_sector_index(id)).collect(); + self.sector_graph.read_graph(§ors_to_fetch)?; + + Ok(()) + } + + /// Copy disk fp vector to DiskScratchDataset + /// Return the fp vector with aligned dim from DiskScratchDataset + pub fn copy_fp_vector_to_disk_scratch_dataset( + &self, + node_index: usize, + disk_scratch_dataset: &'a mut DiskScratchDataset + ) -> ANNResult> + where + [T; N]: FullPrecisionDistance, + { + if self.dim > N { + return Err(ANNError::log_index_error(format!( + "copy_sector_fp_to_aligned_dataset: dim {} is greater than aligned dim {}", + self.dim, N))); + } + + let fp_vector_buf = self.node_fp_vector_buf(node_index); + + // Safety condition is met here + let aligned_dim_vector = unsafe { disk_scratch_dataset.memcpy_from_fp_vector_buf(fp_vector_buf) }; + + Vertex::<'a, T, N>::try_from((aligned_dim_vector, self.nodes_to_fetch[node_index])) + .map_err(|err| ANNError::log_index_error(format!("TryFromSliceError: failed to get Vertex for disk index node, err={}", err))) + } + + /// Reset graph + pub fn reset(&mut self) { + self.nodes_to_fetch.clear(); + self.sector_graph.reset(); + } + + fn get_vertex_and_neighbors(&self, node_index: usize) -> VertexAndNeighbors { + let node_disk_buf = self.node_disk_buf(node_index); + let buf = &node_disk_buf[self.fp_vector_len as usize..]; + let num_neighbors = LittleEndian::read_u32(&buf[0..4]) as usize; + let neighbors_buf = &buf[4..4 + num_neighbors * 4]; + + let mut adjacency_list = AdjacencyList::for_range(num_neighbors); + for chunk in neighbors_buf.chunks(4) { + let neighbor_id = LittleEndian::read_u32(chunk); + adjacency_list.push(neighbor_id); + } + + VertexAndNeighbors::new(self.nodes_to_fetch[node_index], adjacency_list) + } + + #[inline] + fn node_sector_index(&self, vertex_id: u32) -> u64 { + vertex_id as u64 / self.num_nodes_per_sector + 1 + } + + #[inline] + fn node_disk_buf(&self, node_index: usize) -> &[u8] { + let vertex_id = self.nodes_to_fetch[node_index]; + + // get sector_buf where this node is located + let sector_buf = self.sector_graph.get_sector_buf(node_index); + let node_offset = (vertex_id as u64 % self.num_nodes_per_sector * self.max_node_len) as usize; + §or_buf[node_offset..node_offset + self.max_node_len as usize] + } + + #[inline] + fn node_fp_vector_buf(&self, node_index: usize) -> &[u8] { + let node_disk_buf = self.node_disk_buf(node_index); + &node_disk_buf[..self.fp_vector_len as usize] + } +} + +/// Iterator for DiskGraph +pub struct DiskGraphIntoIterator<'a> { + graph: &'a DiskGraph, + index: usize, +} + +impl<'a> IntoIterator for &'a DiskGraph +{ + type IntoIter = DiskGraphIntoIterator<'a>; + type Item = ANNResult<(usize, VertexAndNeighbors)>; + + #[inline] + fn into_iter(self) -> Self::IntoIter { + DiskGraphIntoIterator { + graph: self, + index: 0, + } + } +} + +impl<'a> Iterator for DiskGraphIntoIterator<'a> +{ + type Item = ANNResult<(usize, VertexAndNeighbors)>; + + fn next(&mut self) -> Option { + if self.index >= self.graph.nodes_to_fetch.len() { + return None; + } + + let node_index = self.index; + let vertex_and_neighbors = self.graph.get_vertex_and_neighbors(self.index); + + self.index += 1; + Some(Ok((node_index, vertex_and_neighbors))) + } +} + diff --git a/rust/diskann/src/model/graph/inmem_graph.rs b/rust/diskann/src/model/graph/inmem_graph.rs new file mode 100644 index 000000000..3d08db837 --- /dev/null +++ b/rust/diskann/src/model/graph/inmem_graph.rs @@ -0,0 +1,141 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! In-memory graph + +use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; + +use crate::common::ANNError; + +use super::VertexAndNeighbors; + +/// The entire graph of in-memory index +#[derive(Debug)] +pub struct InMemoryGraph { + /// The entire graph + pub final_graph: Vec>, +} + +impl InMemoryGraph { + /// Create InMemoryGraph instance + pub fn new(size: usize, max_degree: u32) -> Self { + let mut graph = Vec::with_capacity(size); + for id in 0..size { + graph.push(RwLock::new(VertexAndNeighbors::for_range( + id as u32, + max_degree as usize, + ))); + } + Self { final_graph: graph } + } + + /// Size of graph + pub fn size(&self) -> usize { + self.final_graph.len() + } + + /// Extend the graph by size vectors + pub fn extend(&mut self, size: usize, max_degree: u32) { + for id in 0..size { + self.final_graph + .push(RwLock::new(VertexAndNeighbors::for_range( + id as u32, + max_degree as usize, + ))); + } + } + + /// Get read guard of vertex_id + pub fn read_vertex_and_neighbors( + &self, + vertex_id: u32, + ) -> Result, ANNError> { + self.final_graph[vertex_id as usize].read().map_err(|err| { + ANNError::log_lock_poison_error(format!( + "PoisonError: Lock poisoned when reading final_graph for vertex_id {}, err={}", + vertex_id, err + )) + }) + } + + /// Get write guard of vertex_id + pub fn write_vertex_and_neighbors( + &self, + vertex_id: u32, + ) -> Result, ANNError> { + self.final_graph[vertex_id as usize].write().map_err(|err| { + ANNError::log_lock_poison_error(format!( + "PoisonError: Lock poisoned when writing final_graph for vertex_id {}, err={}", + vertex_id, err + )) + }) + } +} + +#[cfg(test)] +mod graph_tests { + use crate::model::{graph::AdjacencyList, GRAPH_SLACK_FACTOR}; + + use super::*; + + #[test] + fn test_new() { + let graph = InMemoryGraph::new(10, 10); + let capacity = (GRAPH_SLACK_FACTOR * 10_f64).ceil() as usize; + + assert_eq!(graph.final_graph.len(), 10); + for i in 0..10 { + let neighbor = graph.final_graph[i].read().unwrap(); + assert_eq!(neighbor.vertex_id, i as u32); + assert_eq!(neighbor.get_neighbors().capacity(), capacity); + } + } + + #[test] + fn test_size() { + let graph = InMemoryGraph::new(10, 10); + assert_eq!(graph.size(), 10); + } + + #[test] + fn test_extend() { + let mut graph = InMemoryGraph::new(10, 10); + graph.extend(10, 10); + + assert_eq!(graph.size(), 20); + + let capacity = (GRAPH_SLACK_FACTOR * 10_f64).ceil() as usize; + let mut id: u32 = 0; + + for i in 10..20 { + let neighbor = graph.final_graph[i].read().unwrap(); + assert_eq!(neighbor.vertex_id, id); + assert_eq!(neighbor.get_neighbors().capacity(), capacity); + id += 1; + } + } + + #[test] + fn test_read_vertex_and_neighbors() { + let graph = InMemoryGraph::new(10, 10); + let neighbor = graph.read_vertex_and_neighbors(0); + assert!(neighbor.is_ok()); + assert_eq!(neighbor.unwrap().vertex_id, 0); + } + + #[test] + fn test_write_vertex_and_neighbors() { + let graph = InMemoryGraph::new(10, 10); + { + let neighbor = graph.write_vertex_and_neighbors(0); + assert!(neighbor.is_ok()); + neighbor.unwrap().add_to_neighbors(10, 10); + } + + let neighbor = graph.read_vertex_and_neighbors(0).unwrap(); + assert_eq!(neighbor.get_neighbors(), &AdjacencyList::from(vec![10_u32])); + } +} diff --git a/rust/diskann/src/model/graph/mod.rs b/rust/diskann/src/model/graph/mod.rs new file mode 100644 index 000000000..d1457f1c2 --- /dev/null +++ b/rust/diskann/src/model/graph/mod.rs @@ -0,0 +1,20 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[allow(clippy::module_inception)] +mod inmem_graph; +pub use inmem_graph::InMemoryGraph; + +pub mod vertex_and_neighbors; +pub use vertex_and_neighbors::VertexAndNeighbors; + +mod adjacency_list; +pub use adjacency_list::AdjacencyList; + +mod sector_graph; +pub use sector_graph::*; + +mod disk_graph; +pub use disk_graph::*; + diff --git a/rust/diskann/src/model/graph/sector_graph.rs b/rust/diskann/src/model/graph/sector_graph.rs new file mode 100644 index 000000000..e51e0bf03 --- /dev/null +++ b/rust/diskann/src/model/graph/sector_graph.rs @@ -0,0 +1,87 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_docs)] + +//! Sector graph + +use std::ops::Deref; + +use crate::common::{AlignedBoxWithSlice, ANNResult, ANNError}; +use crate::model::{MAX_N_SECTOR_READS, SECTOR_LEN, AlignedRead}; +use crate::storage::DiskGraphStorage; + +/// Sector graph read from disk index +pub struct SectorGraph { + /// Sector bytes from disk + /// One sector has num_nodes_per_sector nodes + /// Each node's layout: {full precision vector:[T; DIM]}{num_nbrs: u32}{neighbors: [u32; num_nbrs]} + /// The fp vector is not aligned + sectors_data: AlignedBoxWithSlice, + + /// Graph storage to read sectors + graph_storage: DiskGraphStorage, + + /// Current sector index into which the next read reads data + cur_sector_idx: u64, +} + +impl SectorGraph { + /// Create SectorGraph instance + pub fn new(graph_storage: DiskGraphStorage) -> ANNResult { + Ok(Self { + sectors_data: AlignedBoxWithSlice::new(MAX_N_SECTOR_READS * SECTOR_LEN, SECTOR_LEN)?, + graph_storage, + cur_sector_idx: 0, + }) + } + + /// Reset SectorGraph + pub fn reset(&mut self) { + self.cur_sector_idx = 0; + } + + /// Read sectors into sectors_data + /// They are in the same order as sectors_to_fetch + pub fn read_graph(&mut self, sectors_to_fetch: &[u64]) -> ANNResult<()> { + let cur_sector_idx_usize: usize = self.cur_sector_idx.try_into()?; + if sectors_to_fetch.len() > MAX_N_SECTOR_READS - cur_sector_idx_usize { + return Err(ANNError::log_index_error(format!( + "Trying to read too many sectors. number of sectors to read: {}, max number of sectors can read: {}", + sectors_to_fetch.len(), + MAX_N_SECTOR_READS - cur_sector_idx_usize, + ))); + } + + let mut sector_slices = self.sectors_data.split_into_nonoverlapping_mut_slices( + cur_sector_idx_usize * SECTOR_LEN..(cur_sector_idx_usize + sectors_to_fetch.len()) * SECTOR_LEN, + SECTOR_LEN)?; + + let mut read_requests = Vec::with_capacity(sector_slices.len()); + for (local_sector_idx, slice) in sector_slices.iter_mut().enumerate() { + let sector_id = sectors_to_fetch[local_sector_idx]; + read_requests.push(AlignedRead::new(sector_id * SECTOR_LEN as u64, slice)?); + } + + self.graph_storage.read(&mut read_requests)?; + self.cur_sector_idx += sectors_to_fetch.len() as u64; + + Ok(()) + } + + /// Get sector data by local index + #[inline] + pub fn get_sector_buf(&self, local_sector_idx: usize) -> &[u8] { + &self.sectors_data[local_sector_idx * SECTOR_LEN..(local_sector_idx + 1) * SECTOR_LEN] + } +} + +impl Deref for SectorGraph { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + &self.sectors_data + } +} + diff --git a/rust/diskann/src/model/graph/vertex_and_neighbors.rs b/rust/diskann/src/model/graph/vertex_and_neighbors.rs new file mode 100644 index 000000000..a9fa38932 --- /dev/null +++ b/rust/diskann/src/model/graph/vertex_and_neighbors.rs @@ -0,0 +1,159 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Vertex and its Adjacency List + +use crate::model::GRAPH_SLACK_FACTOR; + +use super::AdjacencyList; + +/// The out neighbors of vertex_id +#[derive(Debug)] +pub struct VertexAndNeighbors { + /// The id of the vertex + pub vertex_id: u32, + + /// All out neighbors (id) of vertex_id + neighbors: AdjacencyList, +} + +impl VertexAndNeighbors { + /// Create VertexAndNeighbors with id and capacity + pub fn for_range(id: u32, range: usize) -> Self { + Self { + vertex_id: id, + neighbors: AdjacencyList::for_range(range), + } + } + + /// Create VertexAndNeighbors with id and neighbors + pub fn new(vertex_id: u32, neighbors: AdjacencyList) -> Self { + Self { + vertex_id, + neighbors, + } + } + + /// Get size of neighbors + #[inline(always)] + pub fn size(&self) -> usize { + self.neighbors.len() + } + + /// Update the neighbors vector (post a pruning exercise) + #[inline(always)] + pub fn set_neighbors(&mut self, new_neighbors: AdjacencyList) { + // Replace the graph entry with the pruned neighbors + self.neighbors = new_neighbors; + } + + /// Get the neighbors + #[inline(always)] + pub fn get_neighbors(&self) -> &AdjacencyList { + &self.neighbors + } + + /// Adds a node to the list of neighbors for the given node. + /// + /// # Arguments + /// + /// * `node_id` - The ID of the node to add. + /// * `range` - The range of the graph. + /// + /// # Return + /// + /// Returns `None` if the node is already in the list of neighbors, or a `Vec` containing the updated list of neighbors if the list of neighbors is full. + pub fn add_to_neighbors(&mut self, node_id: u32, range: u32) -> Option> { + // Check if n is already in the graph entry + if self.neighbors.contains(&node_id) { + return None; + } + + let neighbor_len = self.neighbors.len(); + + // If not, check if the graph entry has enough space + if neighbor_len < (GRAPH_SLACK_FACTOR * range as f64) as usize { + // If yes, add n to the graph entry + self.neighbors.push(node_id); + return None; + } + + let mut copy_of_neighbors = Vec::with_capacity(neighbor_len + 1); + unsafe { + let dst = copy_of_neighbors.as_mut_ptr(); + std::ptr::copy_nonoverlapping(self.neighbors.as_ptr(), dst, neighbor_len); + dst.add(neighbor_len).write(node_id); + copy_of_neighbors.set_len(neighbor_len + 1); + } + + Some(copy_of_neighbors) + } +} + +#[cfg(test)] +mod vertex_and_neighbors_tests { + use crate::model::GRAPH_SLACK_FACTOR; + + use super::*; + + #[test] + fn test_set_with_capacity() { + let neighbors = VertexAndNeighbors::for_range(20, 10); + assert_eq!(neighbors.vertex_id, 20); + assert_eq!( + neighbors.neighbors.capacity(), + (10_f32 * GRAPH_SLACK_FACTOR as f32).ceil() as usize + ); + } + + #[test] + fn test_size() { + let mut neighbors = VertexAndNeighbors::for_range(20, 10); + + for i in 0..5 { + neighbors.neighbors.push(i); + } + + assert_eq!(neighbors.size(), 5); + } + + #[test] + fn test_set_neighbors() { + let mut neighbors = VertexAndNeighbors::for_range(20, 10); + let new_vec = AdjacencyList::from(vec![1, 2, 3, 4, 5]); + neighbors.set_neighbors(AdjacencyList::from(new_vec.clone())); + + assert_eq!(neighbors.neighbors, new_vec); + } + + #[test] + fn test_get_neighbors() { + let mut neighbors = VertexAndNeighbors::for_range(20, 10); + neighbors.set_neighbors(AdjacencyList::from(vec![1, 2, 3, 4, 5])); + let neighbor_ref = neighbors.get_neighbors(); + + assert!(std::ptr::eq(&neighbors.neighbors, neighbor_ref)) + } + + #[test] + fn test_add_to_neighbors() { + let mut neighbors = VertexAndNeighbors::for_range(20, 10); + + assert_eq!(neighbors.add_to_neighbors(1, 1), None); + assert_eq!(neighbors.neighbors, AdjacencyList::from(vec![1])); + + assert_eq!(neighbors.add_to_neighbors(1, 1), None); + assert_eq!(neighbors.neighbors, AdjacencyList::from(vec![1])); + + let ret = neighbors.add_to_neighbors(2, 1); + assert!(ret.is_some()); + assert_eq!(ret.unwrap(), vec![1, 2]); + assert_eq!(neighbors.neighbors, AdjacencyList::from(vec![1])); + + assert_eq!(neighbors.add_to_neighbors(2, 2), None); + assert_eq!(neighbors.neighbors, AdjacencyList::from(vec![1, 2])); + } +} diff --git a/rust/diskann/src/model/mod.rs b/rust/diskann/src/model/mod.rs new file mode 100644 index 000000000..a4f15ee52 --- /dev/null +++ b/rust/diskann/src/model/mod.rs @@ -0,0 +1,29 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +pub mod neighbor; +pub use neighbor::Neighbor; +pub use neighbor::NeighborPriorityQueue; + +pub mod data_store; +pub use data_store::InmemDataset; + +pub mod graph; +pub use graph::InMemoryGraph; +pub use graph::VertexAndNeighbors; + +pub mod configuration; +pub use configuration::*; + +pub mod scratch; +pub use scratch::*; + +pub mod vertex; +pub use vertex::Vertex; + +pub mod pq; +pub use pq::*; + +pub mod windows_aligned_file_reader; +pub use windows_aligned_file_reader::*; diff --git a/rust/diskann/src/model/neighbor/mod.rs b/rust/diskann/src/model/neighbor/mod.rs new file mode 100644 index 000000000..cd0dbad2a --- /dev/null +++ b/rust/diskann/src/model/neighbor/mod.rs @@ -0,0 +1,13 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[allow(clippy::module_inception)] +mod neighbor; +pub use neighbor::*; + +mod neighbor_priority_queue; +pub use neighbor_priority_queue::*; + +mod sorted_neighbor_vector; +pub use sorted_neighbor_vector::SortedNeighborVector; diff --git a/rust/diskann/src/model/neighbor/neighbor.rs b/rust/diskann/src/model/neighbor/neighbor.rs new file mode 100644 index 000000000..8c712bcd3 --- /dev/null +++ b/rust/diskann/src/model/neighbor/neighbor.rs @@ -0,0 +1,104 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::cmp::Ordering; + +/// Neighbor node +#[derive(Debug, Clone, Copy)] +pub struct Neighbor { + /// The id of the node + pub id: u32, + + /// The distance from the query node to current node + pub distance: f32, + + /// Whether the current is visited or not + pub visited: bool, +} + +impl Neighbor { + /// Create the neighbor node and it has not been visited + pub fn new (id: u32, distance: f32) -> Self { + Self { + id, + distance, + visited: false + } + } +} + +impl Default for Neighbor { + fn default() -> Self { + Self { id: 0, distance: 0.0_f32, visited: false } + } +} + +impl PartialEq for Neighbor { + #[inline] + fn eq(&self, other: &Self) -> bool { + self.id == other.id + } +} + +impl Eq for Neighbor {} + +impl Ord for Neighbor { + fn cmp(&self, other: &Self) -> Ordering { + let ord = self.distance.partial_cmp(&other.distance).unwrap_or(std::cmp::Ordering::Equal); + + if ord == Ordering::Equal { + return self.id.cmp(&other.id); + } + + ord + } +} + +impl PartialOrd for Neighbor { + #[inline] + fn lt(&self, other: &Self) -> bool { + self.distance < other.distance || (self.distance == other.distance && self.id < other.id) + } + + // Reason for allowing panic = "Does not support comparing Neighbor with partial_cmp" + #[allow(clippy::panic)] + fn partial_cmp(&self, _: &Self) -> Option { + panic!("Neighbor only allows eq and lt") + } +} + +#[cfg(test)] +mod neighbor_test { + use super::*; + + #[test] + fn eq_lt_works() { + let n1 = Neighbor::new(1, 1.1); + let n2 = Neighbor::new(2, 2.0); + let n3 = Neighbor::new(1, 1.1); + + assert!(n1 != n2); + assert!(n1 < n2); + assert!(n1 == n3); + } + + #[test] + #[should_panic] + fn gt_should_panic() { + let n1 = Neighbor::new(1, 1.1); + let n2 = Neighbor::new(2, 2.0); + + assert!(n2 > n1); + } + + #[test] + #[should_panic] + fn le_should_panic() { + let n1 = Neighbor::new(1, 1.1); + let n2 = Neighbor::new(2, 2.0); + + assert!(n1 <= n2); + } +} + diff --git a/rust/diskann/src/model/neighbor/neighbor_priority_queue.rs b/rust/diskann/src/model/neighbor/neighbor_priority_queue.rs new file mode 100644 index 000000000..81b161026 --- /dev/null +++ b/rust/diskann/src/model/neighbor/neighbor_priority_queue.rs @@ -0,0 +1,241 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use crate::model::Neighbor; + +/// Neighbor priority Queue based on the distance to the query node +#[derive(Debug)] +pub struct NeighborPriorityQueue { + /// The size of the priority queue + size: usize, + + /// The capacity of the priority queue + capacity: usize, + + /// The current notvisited neighbor whose distance is smallest among all notvisited neighbor + cur: usize, + + /// The neighbor collection + data: Vec, +} + +impl Default for NeighborPriorityQueue { + fn default() -> Self { + Self::new() + } +} + +impl NeighborPriorityQueue { + /// Create NeighborPriorityQueue without capacity + pub fn new() -> Self { + Self { + size: 0, + capacity: 0, + cur: 0, + data: Vec::new(), + } + } + + /// Create NeighborPriorityQueue with capacity + pub fn with_capacity(capacity: usize) -> Self { + Self { + size: 0, + capacity, + cur: 0, + data: vec![Neighbor::default(); capacity + 1], + } + } + + /// Inserts item with order. + /// The item will be dropped if queue is full / already exist in queue / it has a greater distance than the last item. + /// The set cursor that is used to pop() the next item will be set to the lowest index of an uncheck item. + pub fn insert(&mut self, nbr: Neighbor) { + if self.size == self.capacity && self.get_at(self.size - 1) < &nbr { + return; + } + + let mut lo = 0; + let mut hi = self.size; + while lo < hi { + let mid = (lo + hi) >> 1; + if &nbr < self.get_at(mid) { + hi = mid; + } else if self.get_at(mid).id == nbr.id { + // Make sure the same neighbor isn't inserted into the set + return; + } else { + lo = mid + 1; + } + } + + if lo < self.capacity { + self.data.copy_within(lo..self.size, lo + 1); + } + self.data[lo] = Neighbor::new(nbr.id, nbr.distance); + if self.size < self.capacity { + self.size += 1; + } + if lo < self.cur { + self.cur = lo; + } + } + + /// Get the neighbor at index - SAFETY: index must be less than size + fn get_at(&self, index: usize) -> &Neighbor { + unsafe { self.data.get_unchecked(index) } + } + + /// Get the closest and notvisited neighbor + pub fn closest_notvisited(&mut self) -> Neighbor { + self.data[self.cur].visited = true; + let pre = self.cur; + while self.cur < self.size && self.get_at(self.cur).visited { + self.cur += 1; + } + self.data[pre] + } + + /// Whether there is notvisited node or not + pub fn has_notvisited_node(&self) -> bool { + self.cur < self.size + } + + /// Get the size of the NeighborPriorityQueue + pub fn size(&self) -> usize { + self.size + } + + /// Get the capacity of the NeighborPriorityQueue + pub fn capacity(&self) -> usize { + self.capacity + } + + /// Sets an artificial capacity of the NeighborPriorityQueue. For benchmarking purposes only. + pub fn set_capacity(&mut self, capacity: usize) { + if capacity < self.data.len() { + self.capacity = capacity; + } + } + + /// Reserve capacity + pub fn reserve(&mut self, capacity: usize) { + if capacity > self.capacity { + self.data.resize(capacity + 1, Neighbor::default()); + self.capacity = capacity; + } + } + + /// Set size and cur to 0 + pub fn clear(&mut self) { + self.size = 0; + self.cur = 0; + } +} + +impl std::ops::Index for NeighborPriorityQueue { + type Output = Neighbor; + + fn index(&self, i: usize) -> &Self::Output { + &self.data[i] + } +} + +#[cfg(test)] +mod neighbor_priority_queue_test { + use super::*; + + #[test] + fn test_reserve_capacity() { + let mut queue = NeighborPriorityQueue::with_capacity(10); + assert_eq!(queue.capacity(), 10); + queue.reserve(20); + assert_eq!(queue.capacity(), 20); + } + + #[test] + fn test_insert() { + let mut queue = NeighborPriorityQueue::with_capacity(3); + assert_eq!(queue.size(), 0); + queue.insert(Neighbor::new(1, 1.0)); + queue.insert(Neighbor::new(2, 0.5)); + assert_eq!(queue.size(), 2); + queue.insert(Neighbor::new(2, 0.5)); // should be ignored as the same neighbor + assert_eq!(queue.size(), 2); + queue.insert(Neighbor::new(3, 0.9)); + assert_eq!(queue.size(), 3); + assert_eq!(queue[2].id, 1); + queue.insert(Neighbor::new(4, 2.0)); // should be dropped as queue is full and distance is greater than last item + assert_eq!(queue.size(), 3); + assert_eq!(queue[0].id, 2); // node id in queue should be [2,3,1] + assert_eq!(queue[1].id, 3); + assert_eq!(queue[2].id, 1); + println!("{:?}", queue); + } + + #[test] + fn test_index() { + let mut queue = NeighborPriorityQueue::with_capacity(3); + queue.insert(Neighbor::new(1, 1.0)); + queue.insert(Neighbor::new(2, 0.5)); + queue.insert(Neighbor::new(3, 1.5)); + assert_eq!(queue[0].id, 2); + assert_eq!(queue[0].distance, 0.5); + } + + #[test] + fn test_visit() { + let mut queue = NeighborPriorityQueue::with_capacity(3); + queue.insert(Neighbor::new(1, 1.0)); + queue.insert(Neighbor::new(2, 0.5)); + queue.insert(Neighbor::new(3, 1.5)); // node id in queue should be [2,1,3] + assert!(queue.has_notvisited_node()); + let nbr = queue.closest_notvisited(); + assert_eq!(nbr.id, 2); + assert_eq!(nbr.distance, 0.5); + assert!(nbr.visited); + assert!(queue.has_notvisited_node()); + let nbr = queue.closest_notvisited(); + assert_eq!(nbr.id, 1); + assert_eq!(nbr.distance, 1.0); + assert!(nbr.visited); + assert!(queue.has_notvisited_node()); + let nbr = queue.closest_notvisited(); + assert_eq!(nbr.id, 3); + assert_eq!(nbr.distance, 1.5); + assert!(nbr.visited); + assert!(!queue.has_notvisited_node()); + } + + #[test] + fn test_clear_queue() { + let mut queue = NeighborPriorityQueue::with_capacity(3); + queue.insert(Neighbor::new(1, 1.0)); + queue.insert(Neighbor::new(2, 0.5)); + assert_eq!(queue.size(), 2); + assert!(queue.has_notvisited_node()); + queue.clear(); + assert_eq!(queue.size(), 0); + assert!(!queue.has_notvisited_node()); + } + + #[test] + fn test_reserve() { + let mut queue = NeighborPriorityQueue::new(); + queue.reserve(10); + assert_eq!(queue.data.len(), 11); + assert_eq!(queue.capacity, 10); + } + + #[test] + fn test_set_capacity() { + let mut queue = NeighborPriorityQueue::with_capacity(10); + queue.set_capacity(5); + assert_eq!(queue.capacity, 5); + assert_eq!(queue.data.len(), 11); + + queue.set_capacity(11); + assert_eq!(queue.capacity, 5); + } +} + diff --git a/rust/diskann/src/model/neighbor/sorted_neighbor_vector.rs b/rust/diskann/src/model/neighbor/sorted_neighbor_vector.rs new file mode 100644 index 000000000..4c3eff00f --- /dev/null +++ b/rust/diskann/src/model/neighbor/sorted_neighbor_vector.rs @@ -0,0 +1,37 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Sorted Neighbor Vector + +use std::ops::{Deref, DerefMut}; + +use super::Neighbor; + +/// A newtype on top of vector of neighbors, is sorted by distance +#[derive(Debug)] +pub struct SortedNeighborVector<'a>(&'a mut Vec); + +impl<'a> SortedNeighborVector<'a> { + /// Create a new SortedNeighborVector + pub fn new(vec: &'a mut Vec) -> Self { + vec.sort_unstable(); + Self(vec) + } +} + +impl<'a> Deref for SortedNeighborVector<'a> { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + self.0 + } +} + +impl<'a> DerefMut for SortedNeighborVector<'a> { + fn deref_mut(&mut self) -> &mut Self::Target { + self.0 + } +} diff --git a/rust/diskann/src/model/pq/fixed_chunk_pq_table.rs b/rust/diskann/src/model/pq/fixed_chunk_pq_table.rs new file mode 100644 index 000000000..bfedcae6e --- /dev/null +++ b/rust/diskann/src/model/pq/fixed_chunk_pq_table.rs @@ -0,0 +1,483 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations)] + +use hashbrown::HashMap; +use rayon::prelude::{ + IndexedParallelIterator, IntoParallelRefMutIterator, ParallelIterator, ParallelSliceMut, +}; +use std::arch::x86_64::{_mm_prefetch, _MM_HINT_T0}; + +use crate::{ + common::{ANNError, ANNResult}, + model::NUM_PQ_CENTROIDS, +}; + +/// PQ Pivot table loading and calculate distance +#[derive(Debug)] +pub struct FixedChunkPQTable { + /// pq_tables = float array of size [256 * ndims] + pq_table: Vec, + + /// ndims = true dimension of vectors + dim: usize, + + /// num_pq_chunks = the pq chunk number + num_pq_chunks: usize, + + /// chunk_offsets = the offset of each chunk, start from 0 + chunk_offsets: Vec, + + /// centroid of each dimension + centroids: Vec, + + /// Becasue we're using L2 distance, this is no needed now. + /// Transport of pq_table. transport_pq_table = float array of size [ndims * 256]. + /// e.g. if pa_table is 2 centroids * 3 dims + /// [ 1, 2, 3, + /// 4, 5, 6] + /// then transport_pq_table would be 3 dims * 2 centroids + /// [ 1, 4, + /// 2, 5, + /// 3, 6] + /// transport_pq_table: Vec, + + /// Map dim offset to chunk index e.g., 8 dims in to 2 chunks + /// then would be [(0,0), (1,0), (2,0), (3,0), (4,1), (5,1), (6,1), (7,1)] + dimoffset_chunk_mapping: HashMap, +} + +impl FixedChunkPQTable { + /// Create the FixedChunkPQTable with dim and chunk numbers and pivot file data (pivot table + cenroids + chunk offsets) + pub fn new( + dim: usize, + num_pq_chunks: usize, + pq_table: Vec, + centroids: Vec, + chunk_offsets: Vec, + ) -> Self { + let mut dimoffset_chunk_mapping = HashMap::new(); + for chunk_index in 0..num_pq_chunks { + for dim_offset in chunk_offsets[chunk_index]..chunk_offsets[chunk_index + 1] { + dimoffset_chunk_mapping.insert(dim_offset, chunk_index); + } + } + + Self { + pq_table, + dim, + num_pq_chunks, + chunk_offsets, + centroids, + dimoffset_chunk_mapping, + } + } + + /// Get chunk number + pub fn get_num_chunks(&self) -> usize { + self.num_pq_chunks + } + + /// Shifting the query according to mean or the whole corpus + pub fn preprocess_query(&self, query_vec: &mut [f32]) { + for (query, ¢roid) in query_vec.iter_mut().zip(self.centroids.iter()) { + *query -= centroid; + } + } + + /// Pre-calculated the distance between query and each centroid by l2 distance + /// * `query_vec` - query vector: 1 * dim + /// * `dist_vec` - pre-calculated the distance between query and each centroid: chunk_size * num_centroids + #[allow(clippy::needless_range_loop)] + pub fn populate_chunk_distances(&self, query_vec: &[f32]) -> Vec { + let mut dist_vec = vec![0.0; self.num_pq_chunks * NUM_PQ_CENTROIDS]; + for centroid_index in 0..NUM_PQ_CENTROIDS { + for chunk_index in 0..self.num_pq_chunks { + for dim_offset in + self.chunk_offsets[chunk_index]..self.chunk_offsets[chunk_index + 1] + { + let diff: f32 = self.pq_table[self.dim * centroid_index + dim_offset] + - query_vec[dim_offset]; + dist_vec[chunk_index * NUM_PQ_CENTROIDS + centroid_index] += diff * diff; + } + } + } + dist_vec + } + + /// Pre-calculated the distance between query and each centroid by inner product + /// * `query_vec` - query vector: 1 * dim + /// * `dist_vec` - pre-calculated the distance between query and each centroid: chunk_size * num_centroids + /// + /// Reason to allow clippy::needless_range_loop: + /// The inner loop is operating over a range that is different for each iteration of the outer loop. + /// This isn't a scenario where using iter().enumerate() would be easily applicable, + /// because the inner loop isn't iterating directly over the contents of a slice or array. + /// Thus, using indexing might be the most straightforward way to express this logic. + #[allow(clippy::needless_range_loop)] + pub fn populate_chunk_inner_products(&self, query_vec: &[f32]) -> Vec { + let mut dist_vec = vec![0.0; self.num_pq_chunks * NUM_PQ_CENTROIDS]; + for centroid_index in 0..NUM_PQ_CENTROIDS { + for chunk_index in 0..self.num_pq_chunks { + for dim_offset in + self.chunk_offsets[chunk_index]..self.chunk_offsets[chunk_index + 1] + { + // assumes that we are not shifting the vectors to mean zero, i.e., centroid + // array should be all zeros returning negative to keep the search code + // clean (max inner product vs min distance) + let diff: f32 = self.pq_table[self.dim * centroid_index + dim_offset] + * query_vec[dim_offset]; + dist_vec[chunk_index * NUM_PQ_CENTROIDS + centroid_index] -= diff; + } + } + } + dist_vec + } + + /// Calculate the distance between query and given centroid by l2 distance + /// * `query_vec` - query vector: 1 * dim + /// * `base_vec` - given centroid array: 1 * num_pq_chunks + #[allow(clippy::needless_range_loop)] + pub fn l2_distance(&self, query_vec: &[f32], base_vec: &[u8]) -> f32 { + let mut res_vec: Vec = vec![0.0; self.num_pq_chunks]; + res_vec + .par_iter_mut() + .enumerate() + .for_each(|(chunk_index, chunk_diff)| { + for dim_offset in + self.chunk_offsets[chunk_index]..self.chunk_offsets[chunk_index + 1] + { + let diff = self.pq_table + [self.dim * base_vec[chunk_index] as usize + dim_offset] + - query_vec[dim_offset]; + *chunk_diff += diff * diff; + } + }); + + let res: f32 = res_vec.iter().sum::(); + + res + } + + /// Calculate the distance between query and given centroid by inner product + /// * `query_vec` - query vector: 1 * dim + /// * `base_vec` - given centroid array: 1 * num_pq_chunks + #[allow(clippy::needless_range_loop)] + pub fn inner_product(&self, query_vec: &[f32], base_vec: &[u8]) -> f32 { + let mut res_vec: Vec = vec![0.0; self.num_pq_chunks]; + res_vec + .par_iter_mut() + .enumerate() + .for_each(|(chunk_index, chunk_diff)| { + for dim_offset in + self.chunk_offsets[chunk_index]..self.chunk_offsets[chunk_index + 1] + { + *chunk_diff += self.pq_table + [self.dim * base_vec[chunk_index] as usize + dim_offset] + * query_vec[dim_offset]; + } + }); + + let res: f32 = res_vec.iter().sum::(); + + // returns negative value to simulate distances (max -> min conversion) + -res + } + + /// Revert vector by adding centroid + /// * `base_vec` - given centroid array: 1 * num_pq_chunks + /// * `out_vec` - reverted vector + pub fn inflate_vector(&self, base_vec: &[u8]) -> ANNResult> { + let mut out_vec: Vec = vec![0.0; self.dim]; + for (dim_offset, value) in out_vec.iter_mut().enumerate() { + let chunk_index = + self.dimoffset_chunk_mapping + .get(&dim_offset) + .ok_or(ANNError::log_pq_error( + "ERROR: dim_offset not found in dimoffset_chunk_mapping".to_string(), + ))?; + *value = self.pq_table[self.dim * base_vec[*chunk_index] as usize + dim_offset] + + self.centroids[dim_offset]; + } + + Ok(out_vec) + } +} + +/// Given a batch input nodes, return a batch of PQ distance +/// * `pq_ids` - batch nodes: n_pts * pq_nchunks +/// * `n_pts` - batch number +/// * `pq_nchunks` - pq chunk number number +/// * `pq_dists` - pre-calculated the distance between query and each centroid: chunk_size * num_centroids +/// * `dists_out` - n_pts * 1 +pub fn pq_dist_lookup( + pq_ids: &[u8], + n_pts: usize, + pq_nchunks: usize, + pq_dists: &[f32], +) -> Vec { + let mut dists_out: Vec = vec![0.0; n_pts]; + unsafe { + _mm_prefetch(dists_out.as_ptr() as *const i8, _MM_HINT_T0); + _mm_prefetch(pq_ids.as_ptr() as *const i8, _MM_HINT_T0); + _mm_prefetch(pq_ids.as_ptr().add(64) as *const i8, _MM_HINT_T0); + _mm_prefetch(pq_ids.as_ptr().add(128) as *const i8, _MM_HINT_T0); + } + for chunk in 0..pq_nchunks { + let chunk_dists = &pq_dists[256 * chunk..]; + if chunk < pq_nchunks - 1 { + unsafe { + _mm_prefetch( + chunk_dists.as_ptr().offset(256 * chunk as isize).add(256) as *const i8, + _MM_HINT_T0, + ); + } + } + dists_out + .par_iter_mut() + .enumerate() + .for_each(|(n_iter, dist)| { + let pq_centerid = pq_ids[pq_nchunks * n_iter + chunk]; + *dist += chunk_dists[pq_centerid as usize]; + }); + } + dists_out +} + +pub fn aggregate_coords(ids: &[u32], all_coords: &[u8], ndims: usize) -> Vec { + let mut out: Vec = vec![0u8; ids.len() * ndims]; + let ndim_u32 = ndims as u32; + out.par_chunks_mut(ndims) + .enumerate() + .for_each(|(index, chunk)| { + let id_compressed_pivot = &all_coords + [(ids[index] * ndim_u32) as usize..(ids[index] * ndim_u32 + ndim_u32) as usize]; + let temp_slice = + unsafe { std::slice::from_raw_parts(id_compressed_pivot.as_ptr(), ndims) }; + chunk.copy_from_slice(temp_slice); + }); + + out +} + +#[cfg(test)] +mod fixed_chunk_pq_table_test { + + use super::*; + use crate::common::{ANNError, ANNResult}; + use crate::utils::{convert_types_u32_usize, convert_types_u64_usize, file_exists, load_bin}; + + const DIM: usize = 128; + + #[test] + fn load_pivot_test() { + let pq_pivots_path: &str = "tests/data/siftsmall_learn.bin_pq_pivots.bin"; + let (dim, pq_table, centroids, chunk_offsets) = + load_pq_pivots_bin(pq_pivots_path, &1).unwrap(); + let fixed_chunk_pq_table = + FixedChunkPQTable::new(dim, 1, pq_table, centroids, chunk_offsets); + + assert_eq!(dim, DIM); + assert_eq!(fixed_chunk_pq_table.pq_table.len(), DIM * NUM_PQ_CENTROIDS); + assert_eq!(fixed_chunk_pq_table.centroids.len(), DIM); + + assert_eq!(fixed_chunk_pq_table.chunk_offsets[0], 0); + assert_eq!(fixed_chunk_pq_table.chunk_offsets[1], DIM); + assert_eq!(fixed_chunk_pq_table.chunk_offsets.len(), 2); + } + + #[test] + fn get_num_chunks_test() { + let num_chunks = 7; + let pa_table = vec![0.0; DIM * NUM_PQ_CENTROIDS]; + let centroids = vec![0.0; DIM]; + let chunk_offsets = vec![0, 7, 9, 11, 22, 34, 78, 127]; + let fixed_chunk_pq_table = + FixedChunkPQTable::new(DIM, num_chunks, pa_table, centroids, chunk_offsets); + let chunk: usize = fixed_chunk_pq_table.get_num_chunks(); + assert_eq!(chunk, num_chunks); + } + + #[test] + fn preprocess_query_test() { + let pq_pivots_path: &str = "tests/data/siftsmall_learn.bin_pq_pivots.bin"; + let (dim, pq_table, centroids, chunk_offsets) = + load_pq_pivots_bin(pq_pivots_path, &1).unwrap(); + let fixed_chunk_pq_table = + FixedChunkPQTable::new(dim, 1, pq_table, centroids, chunk_offsets); + + let mut query_vec: Vec = vec![ + 32.39f32, 78.57f32, 50.32f32, 80.46f32, 6.47f32, 69.76f32, 94.2f32, 83.36f32, 5.8f32, + 68.78f32, 42.32f32, 61.77f32, 90.26f32, 60.41f32, 3.86f32, 61.21f32, 16.6f32, 54.46f32, + 7.29f32, 54.24f32, 92.49f32, 30.18f32, 65.36f32, 99.09f32, 3.8f32, 36.4f32, 86.72f32, + 65.18f32, 29.87f32, 62.21f32, 58.32f32, 43.23f32, 94.3f32, 79.61f32, 39.67f32, + 11.18f32, 48.88f32, 38.19f32, 93.95f32, 10.46f32, 36.7f32, 14.75f32, 81.64f32, + 59.18f32, 99.03f32, 74.23f32, 1.26f32, 82.69f32, 35.7f32, 38.39f32, 46.17f32, 64.75f32, + 7.15f32, 36.55f32, 77.32f32, 18.65f32, 32.8f32, 74.84f32, 18.12f32, 20.19f32, 70.06f32, + 48.37f32, 40.18f32, 45.69f32, 88.3f32, 39.15f32, 60.97f32, 71.29f32, 61.79f32, + 47.23f32, 94.71f32, 58.04f32, 52.4f32, 34.66f32, 59.1f32, 47.11f32, 30.2f32, 58.72f32, + 74.35f32, 83.68f32, 66.8f32, 28.57f32, 29.45f32, 52.02f32, 91.95f32, 92.44f32, + 65.25f32, 38.3f32, 35.6f32, 41.67f32, 91.33f32, 76.81f32, 74.88f32, 33.17f32, 48.36f32, + 41.42f32, 23f32, 8.31f32, 81.69f32, 80.08f32, 50.55f32, 54.46f32, 23.79f32, 43.46f32, + 84.5f32, 10.42f32, 29.51f32, 19.73f32, 46.48f32, 35.01f32, 52.3f32, 66.97f32, 4.8f32, + 74.81f32, 2.82f32, 61.82f32, 25.06f32, 17.3f32, 17.29f32, 63.2f32, 64.1f32, 61.68f32, + 37.42f32, 3.39f32, 97.45f32, 5.32f32, 59.02f32, 35.6f32, + ]; + fixed_chunk_pq_table.preprocess_query(&mut query_vec); + assert_eq!(query_vec[0], 32.39f32 - fixed_chunk_pq_table.centroids[0]); + assert_eq!( + query_vec[127], + 35.6f32 - fixed_chunk_pq_table.centroids[127] + ); + } + + #[test] + fn calculate_distances_tests() { + let pq_pivots_path: &str = "tests/data/siftsmall_learn.bin_pq_pivots.bin"; + + let (dim, pq_table, centroids, chunk_offsets) = + load_pq_pivots_bin(pq_pivots_path, &1).unwrap(); + let fixed_chunk_pq_table = + FixedChunkPQTable::new(dim, 1, pq_table, centroids, chunk_offsets); + + let query_vec: Vec = vec![ + 32.39f32, 78.57f32, 50.32f32, 80.46f32, 6.47f32, 69.76f32, 94.2f32, 83.36f32, 5.8f32, + 68.78f32, 42.32f32, 61.77f32, 90.26f32, 60.41f32, 3.86f32, 61.21f32, 16.6f32, 54.46f32, + 7.29f32, 54.24f32, 92.49f32, 30.18f32, 65.36f32, 99.09f32, 3.8f32, 36.4f32, 86.72f32, + 65.18f32, 29.87f32, 62.21f32, 58.32f32, 43.23f32, 94.3f32, 79.61f32, 39.67f32, + 11.18f32, 48.88f32, 38.19f32, 93.95f32, 10.46f32, 36.7f32, 14.75f32, 81.64f32, + 59.18f32, 99.03f32, 74.23f32, 1.26f32, 82.69f32, 35.7f32, 38.39f32, 46.17f32, 64.75f32, + 7.15f32, 36.55f32, 77.32f32, 18.65f32, 32.8f32, 74.84f32, 18.12f32, 20.19f32, 70.06f32, + 48.37f32, 40.18f32, 45.69f32, 88.3f32, 39.15f32, 60.97f32, 71.29f32, 61.79f32, + 47.23f32, 94.71f32, 58.04f32, 52.4f32, 34.66f32, 59.1f32, 47.11f32, 30.2f32, 58.72f32, + 74.35f32, 83.68f32, 66.8f32, 28.57f32, 29.45f32, 52.02f32, 91.95f32, 92.44f32, + 65.25f32, 38.3f32, 35.6f32, 41.67f32, 91.33f32, 76.81f32, 74.88f32, 33.17f32, 48.36f32, + 41.42f32, 23f32, 8.31f32, 81.69f32, 80.08f32, 50.55f32, 54.46f32, 23.79f32, 43.46f32, + 84.5f32, 10.42f32, 29.51f32, 19.73f32, 46.48f32, 35.01f32, 52.3f32, 66.97f32, 4.8f32, + 74.81f32, 2.82f32, 61.82f32, 25.06f32, 17.3f32, 17.29f32, 63.2f32, 64.1f32, 61.68f32, + 37.42f32, 3.39f32, 97.45f32, 5.32f32, 59.02f32, 35.6f32, + ]; + + let dist_vec = fixed_chunk_pq_table.populate_chunk_distances(&query_vec); + assert_eq!(dist_vec.len(), 256); + + // populate_chunk_distances_test + let mut sampled_output = 0.0; + (0..DIM).for_each(|dim_offset| { + let diff = fixed_chunk_pq_table.pq_table[dim_offset] - query_vec[dim_offset]; + sampled_output += diff * diff; + }); + assert_eq!(sampled_output, dist_vec[0]); + + // populate_chunk_inner_products_test + let dist_vec = fixed_chunk_pq_table.populate_chunk_inner_products(&query_vec); + assert_eq!(dist_vec.len(), 256); + + let mut sampled_output = 0.0; + (0..DIM).for_each(|dim_offset| { + sampled_output -= fixed_chunk_pq_table.pq_table[dim_offset] * query_vec[dim_offset]; + }); + assert_eq!(sampled_output, dist_vec[0]); + + // l2_distance_test + let base_vec: Vec = vec![3u8]; + let dist = fixed_chunk_pq_table.l2_distance(&query_vec, &base_vec); + let mut l2_output = 0.0; + (0..DIM).for_each(|dim_offset| { + let diff = fixed_chunk_pq_table.pq_table[3 * DIM + dim_offset] - query_vec[dim_offset]; + l2_output += diff * diff; + }); + assert_eq!(l2_output, dist); + + // inner_product_test + let dist = fixed_chunk_pq_table.inner_product(&query_vec, &base_vec); + let mut l2_output = 0.0; + (0..DIM).for_each(|dim_offset| { + l2_output -= + fixed_chunk_pq_table.pq_table[3 * DIM + dim_offset] * query_vec[dim_offset]; + }); + assert_eq!(l2_output, dist); + + // inflate_vector_test + let inflate_vector = fixed_chunk_pq_table.inflate_vector(&base_vec).unwrap(); + assert_eq!(inflate_vector.len(), DIM); + assert_eq!( + inflate_vector[0], + fixed_chunk_pq_table.pq_table[3 * DIM] + fixed_chunk_pq_table.centroids[0] + ); + assert_eq!( + inflate_vector[1], + fixed_chunk_pq_table.pq_table[3 * DIM + 1] + fixed_chunk_pq_table.centroids[1] + ); + assert_eq!( + inflate_vector[127], + fixed_chunk_pq_table.pq_table[3 * DIM + 127] + fixed_chunk_pq_table.centroids[127] + ); + } + + fn load_pq_pivots_bin( + pq_pivots_path: &str, + num_pq_chunks: &usize, + ) -> ANNResult<(usize, Vec, Vec, Vec)> { + if !file_exists(pq_pivots_path) { + return Err(ANNError::log_pq_error( + "ERROR: PQ k-means pivot file not found.".to_string(), + )); + } + + let (data, offset_num, offset_dim) = load_bin::(pq_pivots_path, 0)?; + let file_offset_data = convert_types_u64_usize(&data, offset_num, offset_dim); + if offset_num != 4 { + let error_message = format!("Error reading pq_pivots file {}. Offsets don't contain correct metadata, # offsets = {}, but expecting 4.", pq_pivots_path, offset_num); + return Err(ANNError::log_pq_error(error_message)); + } + + let (data, pq_center_num, dim) = load_bin::(pq_pivots_path, file_offset_data[0])?; + let pq_table = data.to_vec(); + if pq_center_num != NUM_PQ_CENTROIDS { + let error_message = format!( + "Error reading pq_pivots file {}. file_num_centers = {}, but expecting {} centers.", + pq_pivots_path, pq_center_num, NUM_PQ_CENTROIDS + ); + return Err(ANNError::log_pq_error(error_message)); + } + + let (data, centroid_dim, nc) = load_bin::(pq_pivots_path, file_offset_data[1])?; + let centroids = data.to_vec(); + if centroid_dim != dim || nc != 1 { + let error_message = format!("Error reading pq_pivots file {}. file_dim = {}, file_cols = {} but expecting {} entries in 1 dimension.", pq_pivots_path, centroid_dim, nc, dim); + return Err(ANNError::log_pq_error(error_message)); + } + + let (data, chunk_offset_num, nc) = load_bin::(pq_pivots_path, file_offset_data[2])?; + let chunk_offsets = convert_types_u32_usize(&data, chunk_offset_num, nc); + if chunk_offset_num != num_pq_chunks + 1 || nc != 1 { + let error_message = format!("Error reading pq_pivots file at chunk offsets; file has nr={}, nc={} but expecting nr={} and nc=1.", chunk_offset_num, nc, num_pq_chunks + 1); + return Err(ANNError::log_pq_error(error_message)); + } + + Ok((dim, pq_table, centroids, chunk_offsets)) + } +} + +#[cfg(test)] +mod pq_index_prune_query_test { + + use super::*; + + #[test] + fn pq_dist_lookup_test() { + let pq_ids: Vec = vec![1u8, 3u8, 2u8, 2u8]; + let mut pq_dists: Vec = Vec::with_capacity(256 * 2); + for _ in 0..pq_dists.capacity() { + pq_dists.push(rand::random()); + } + + let dists_out = pq_dist_lookup(&pq_ids, 2, 2, &pq_dists); + assert_eq!(dists_out.len(), 2); + assert_eq!(dists_out[0], pq_dists[0 + 1] + pq_dists[256 + 3]); + assert_eq!(dists_out[1], pq_dists[0 + 2] + pq_dists[256 + 2]); + } +} diff --git a/rust/diskann/src/model/pq/mod.rs b/rust/diskann/src/model/pq/mod.rs new file mode 100644 index 000000000..85daaa7c6 --- /dev/null +++ b/rust/diskann/src/model/pq/mod.rs @@ -0,0 +1,9 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +mod fixed_chunk_pq_table; +pub use fixed_chunk_pq_table::*; + +mod pq_construction; +pub use pq_construction::*; diff --git a/rust/diskann/src/model/pq/pq_construction.rs b/rust/diskann/src/model/pq/pq_construction.rs new file mode 100644 index 000000000..0a7b0784e --- /dev/null +++ b/rust/diskann/src/model/pq/pq_construction.rs @@ -0,0 +1,398 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations)] + +use rayon::prelude::{IndexedParallelIterator, ParallelIterator}; +use rayon::slice::ParallelSliceMut; + +use crate::common::{ANNError, ANNResult}; +use crate::storage::PQStorage; +use crate::utils::{compute_closest_centers, file_exists, k_means_clustering}; + +/// Max size of PQ training set +pub const MAX_PQ_TRAINING_SET_SIZE: f64 = 256_000f64; + +/// Max number of PQ chunks +pub const MAX_PQ_CHUNKS: usize = 512; + +pub const NUM_PQ_CENTROIDS: usize = 256; +/// block size for reading/processing large files and matrices in blocks +const BLOCK_SIZE: usize = 5000000; +const NUM_KMEANS_REPS_PQ: usize = 12; + +/// given training data in train_data of dimensions num_train * dim, generate +/// PQ pivots using k-means algorithm to partition the co-ordinates into +/// 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 +/// PQ pivot table layout: {pivot offsets data: METADATA_SIZE}{pivot vector:[dim; num_centroid]}{centroid vector:[dim; 1]}{chunk offsets:[chunk_num+1; 1]} +fn generate_pq_pivots( + train_data: &mut [f32], + num_train: usize, + dim: usize, + num_centers: usize, + num_pq_chunks: usize, + max_k_means_reps: usize, + pq_storage: &mut PQStorage, +) -> ANNResult<()> { + if num_pq_chunks > dim { + return Err(ANNError::log_pq_error( + "Error: number of chunks more than dimension.".to_string(), + )); + } + + if pq_storage.pivot_data_exist() { + let (file_num_centers, file_dim) = pq_storage.read_pivot_metadata()?; + if file_dim == dim && file_num_centers == num_centers { + // PQ pivot file exists. Not generating again. + return Ok(()); + } + } + + // Calculate centroid and center the training data + // If we use L2 distance, there is an option to + // translate all vectors to make them centered and + // then compute PQ. This needs to be set to false + // when using PQ for MIPS as such translations dont + // preserve inner products. + // Now, we're using L2 as default. + let mut centroid: Vec = vec![0.0; dim]; + for dim_index in 0..dim { + for train_data_index in 0..num_train { + centroid[dim_index] += train_data[train_data_index * dim + dim_index]; + } + centroid[dim_index] /= num_train as f32; + } + for dim_index in 0..dim { + for train_data_index in 0..num_train { + train_data[train_data_index * dim + dim_index] -= centroid[dim_index]; + } + } + + // Calculate each chunk's offset + // If we have 8 dimension and 3 chunk then offsets would be [0,3,6,8] + let mut chunk_offsets: Vec = vec![0; num_pq_chunks + 1]; + let mut chunk_offset: usize = 0; + for chunk_index in 0..num_pq_chunks { + chunk_offset += dim / num_pq_chunks; + if chunk_index < (dim % num_pq_chunks) { + chunk_offset += 1; + } + chunk_offsets[chunk_index + 1] = chunk_offset; + } + + let mut full_pivot_data: Vec = vec![0.0; num_centers * dim]; + for chunk_index in 0..num_pq_chunks { + let chunk_size = chunk_offsets[chunk_index + 1] - chunk_offsets[chunk_index]; + + let mut cur_train_data: Vec = vec![0.0; num_train * chunk_size]; + let mut cur_pivot_data: Vec = vec![0.0; num_centers * chunk_size]; + + cur_train_data + .par_chunks_mut(chunk_size) + .enumerate() + .for_each(|(train_data_index, chunk)| { + for (dim_offset, item) in chunk.iter_mut().enumerate() { + *item = train_data + [train_data_index * dim + chunk_offsets[chunk_index] + dim_offset]; + } + }); + + // Run kmeans to get the centroids of this chunk. + let (_closest_docs, _closest_center, _residual) = k_means_clustering( + &cur_train_data, + num_train, + chunk_size, + &mut cur_pivot_data, + num_centers, + max_k_means_reps, + )?; + + // Copy centroids from this chunk table to full table + for center_index in 0..num_centers { + full_pivot_data[center_index * dim + chunk_offsets[chunk_index] + ..center_index * dim + chunk_offsets[chunk_index + 1]] + .copy_from_slice( + &cur_pivot_data[center_index * chunk_size..(center_index + 1) * chunk_size], + ); + } + } + + pq_storage.write_pivot_data( + &full_pivot_data, + ¢roid, + &chunk_offsets, + num_centers, + dim, + )?; + + Ok(()) +} + +/// streams the base file (data_file), and computes the closest centers in each +/// chunk to generate the compressed data_file and stores it in +/// pq_compressed_vectors_path. +/// If the numbber of centers is < 256, it stores as byte vector, else as +/// 4-byte vector in binary format. +/// Compressed PQ table layout: {num_points: usize}{num_chunks: usize}{compressed pq table: [num_points; num_chunks]} +fn generate_pq_data_from_pivots>( + num_centers: usize, + num_pq_chunks: usize, + pq_storage: &mut PQStorage, +) -> ANNResult<()> { + let (num_points, dim) = pq_storage.read_pq_data_metadata()?; + + let full_pivot_data: Vec; + let centroid: Vec; + let chunk_offsets: Vec; + + if !pq_storage.pivot_data_exist() { + return Err(ANNError::log_pq_error( + "ERROR: PQ k-means pivot file not found.".to_string(), + )); + } else { + (full_pivot_data, centroid, chunk_offsets) = + pq_storage.load_pivot_data(&num_pq_chunks, &num_centers, &dim)?; + } + + pq_storage.write_compressed_pivot_metadata(num_points as i32, num_pq_chunks as i32)?; + + let block_size = if num_points <= BLOCK_SIZE { + num_points + } else { + BLOCK_SIZE + }; + let num_blocks = (num_points / block_size) + (num_points % block_size != 0) as usize; + + for block_index in 0..num_blocks { + let start_index: usize = block_index * block_size; + let end_index: usize = std::cmp::min((block_index + 1) * block_size, num_points); + let cur_block_size: usize = end_index - start_index; + + let mut block_compressed_base: Vec = vec![0; cur_block_size * num_pq_chunks]; + + let block_data: Vec = pq_storage.read_pq_block_data(cur_block_size, dim)?; + + let mut adjusted_block_data: Vec = vec![0.0; cur_block_size * dim]; + + for block_data_index in 0..cur_block_size { + for dim_index in 0..dim { + adjusted_block_data[block_data_index * dim + dim_index] = + block_data[block_data_index * dim + dim_index].into() - centroid[dim_index]; + } + } + + for chunk_index in 0..num_pq_chunks { + let cur_chunk_size = chunk_offsets[chunk_index + 1] - chunk_offsets[chunk_index]; + if cur_chunk_size == 0 { + continue; + } + + let mut cur_pivot_data: Vec = vec![0.0; num_centers * cur_chunk_size]; + let mut cur_data: Vec = vec![0.0; cur_block_size * cur_chunk_size]; + let mut closest_center: Vec = vec![0; cur_block_size]; + + // Divide the data into chunks and process each chunk in parallel. + cur_data + .par_chunks_mut(cur_chunk_size) + .enumerate() + .for_each(|(block_data_index, chunk)| { + for (dim_offset, item) in chunk.iter_mut().enumerate() { + *item = adjusted_block_data + [block_data_index * dim + chunk_offsets[chunk_index] + dim_offset]; + } + }); + + cur_pivot_data + .par_chunks_mut(cur_chunk_size) + .enumerate() + .for_each(|(center_index, chunk)| { + for (din_offset, item) in chunk.iter_mut().enumerate() { + *item = full_pivot_data + [center_index * dim + chunk_offsets[chunk_index] + din_offset]; + } + }); + + // Compute the closet centers + compute_closest_centers( + &cur_data, + cur_block_size, + cur_chunk_size, + &cur_pivot_data, + num_centers, + 1, + &mut closest_center, + None, + None, + )?; + + block_compressed_base + .par_chunks_mut(num_pq_chunks) + .enumerate() + .for_each(|(block_data_index, slice)| { + slice[chunk_index] = closest_center[block_data_index] as usize; + }); + } + + _ = pq_storage.write_compressed_pivot_data( + &block_compressed_base, + num_centers, + cur_block_size, + num_pq_chunks, + ); + } + Ok(()) +} + +/// Save the data on a file. +/// # Arguments +/// * `p_val` - choose how many ratio sample data as trained data to get pivot +/// * `num_pq_chunks` - pq chunk number +/// * `codebook_prefix` - predefined pivots file named +/// * `pq_storage` - pq file access +pub fn generate_quantized_data>( + p_val: f64, + num_pq_chunks: usize, + codebook_prefix: &str, + pq_storage: &mut PQStorage, +) -> ANNResult<()> { + // If predefined pivots already exists, skip training. + if !file_exists(codebook_prefix) { + // Instantiates train data with random sample updates train_data_vector + // Training data with train_size samples loaded. + // Each sampled file has train_dim. + let (mut train_data_vector, train_size, train_dim) = + pq_storage.gen_random_slice::(p_val)?; + + generate_pq_pivots( + &mut train_data_vector, + train_size, + train_dim, + NUM_PQ_CENTROIDS, + num_pq_chunks, + NUM_KMEANS_REPS_PQ, + pq_storage, + )?; + } + generate_pq_data_from_pivots::(NUM_PQ_CENTROIDS, num_pq_chunks, pq_storage)?; + Ok(()) +} + +#[cfg(test)] +mod pq_test { + + use std::fs::File; + use std::io::Write; + + use super::*; + use crate::utils::{convert_types_u32_usize, convert_types_u64_usize, load_bin, METADATA_SIZE}; + + #[test] + fn generate_pq_pivots_test() { + let pivot_file_name = "generate_pq_pivots_test.bin"; + let compressed_file_name = "compressed.bin"; + let pq_training_file_name = "tests/data/siftsmall_learn.bin"; + let mut pq_storage = + PQStorage::new(pivot_file_name, compressed_file_name, pq_training_file_name).unwrap(); + let mut train_data: Vec = vec![ + 1.0f32, 1.0f32, 1.0f32, 1.0f32, 1.0f32, 1.0f32, 1.0f32, 1.0f32, 2.0f32, 2.0f32, 2.0f32, + 2.0f32, 2.0f32, 2.0f32, 2.0f32, 2.0f32, 2.1f32, 2.1f32, 2.1f32, 2.1f32, 2.1f32, 2.1f32, + 2.1f32, 2.1f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, + 100.0f32, 100.0f32, 100.0f32, 100.0f32, 100.0f32, 100.0f32, 100.0f32, 100.0f32, + ]; + generate_pq_pivots(&mut train_data, 5, 8, 2, 2, 5, &mut pq_storage).unwrap(); + + let (data, nr, nc) = load_bin::(pivot_file_name, 0).unwrap(); + let file_offset_data = convert_types_u64_usize(&data, nr, nc); + assert_eq!(file_offset_data[0], METADATA_SIZE); + assert_eq!(nr, 4); + assert_eq!(nc, 1); + + let (data, nr, nc) = load_bin::(pivot_file_name, file_offset_data[0]).unwrap(); + let full_pivot_data = data.to_vec(); + assert_eq!(full_pivot_data.len(), 16); + assert_eq!(nr, 2); + assert_eq!(nc, 8); + + let (data, nr, nc) = load_bin::(pivot_file_name, file_offset_data[1]).unwrap(); + let centroid = data.to_vec(); + assert_eq!( + centroid[0], + (1.0f32 + 2.0f32 + 2.1f32 + 2.2f32 + 100.0f32) / 5.0f32 + ); + assert_eq!(nr, 8); + assert_eq!(nc, 1); + + let (data, nr, nc) = load_bin::(pivot_file_name, file_offset_data[2]).unwrap(); + let chunk_offsets = convert_types_u32_usize(&data, nr, nc); + assert_eq!(chunk_offsets[0], 0); + assert_eq!(chunk_offsets[1], 4); + assert_eq!(chunk_offsets[2], 8); + assert_eq!(nr, 3); + assert_eq!(nc, 1); + std::fs::remove_file(pivot_file_name).unwrap(); + } + + #[test] + fn generate_pq_data_from_pivots_test() { + let data_file = "generate_pq_data_from_pivots_test_data.bin"; + //npoints=5, dim=8, 5 vectors [1.0;8] [2.0;8] [2.1;8] [2.2;8] [100.0;8] + let mut train_data: Vec = vec![ + 1.0f32, 1.0f32, 1.0f32, 1.0f32, 1.0f32, 1.0f32, 1.0f32, 1.0f32, 2.0f32, 2.0f32, 2.0f32, + 2.0f32, 2.0f32, 2.0f32, 2.0f32, 2.0f32, 2.1f32, 2.1f32, 2.1f32, 2.1f32, 2.1f32, 2.1f32, + 2.1f32, 2.1f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, 2.2f32, + 100.0f32, 100.0f32, 100.0f32, 100.0f32, 100.0f32, 100.0f32, 100.0f32, 100.0f32, + ]; + let my_nums_unstructured: &[u8] = unsafe { + std::slice::from_raw_parts(train_data.as_ptr() as *const u8, train_data.len() * 4) + }; + let meta: Vec = vec![5, 8]; + let meta_unstructured: &[u8] = + unsafe { std::slice::from_raw_parts(meta.as_ptr() as *const u8, meta.len() * 4) }; + let mut data_file_writer = File::create(data_file).unwrap(); + data_file_writer + .write_all(meta_unstructured) + .expect("Failed to write sample file"); + data_file_writer + .write_all(my_nums_unstructured) + .expect("Failed to write sample file"); + + let pq_pivots_path = "generate_pq_data_from_pivots_test_pivot.bin"; + let pq_compressed_vectors_path = "generate_pq_data_from_pivots_test.bin"; + let mut pq_storage = + PQStorage::new(pq_pivots_path, pq_compressed_vectors_path, data_file).unwrap(); + generate_pq_pivots(&mut train_data, 5, 8, 2, 2, 5, &mut pq_storage).unwrap(); + generate_pq_data_from_pivots::(2, 2, &mut pq_storage).unwrap(); + let (data, nr, nc) = load_bin::(pq_compressed_vectors_path, 0).unwrap(); + assert_eq!(nr, 5); + assert_eq!(nc, 2); + assert_eq!(data[0], data[2]); + assert_ne!(data[0], data[8]); + + std::fs::remove_file(data_file).unwrap(); + std::fs::remove_file(pq_pivots_path).unwrap(); + std::fs::remove_file(pq_compressed_vectors_path).unwrap(); + } + + #[test] + fn pq_end_to_end_validation_with_codebook_test() { + let data_file = "tests/data/siftsmall_learn.bin"; + let pq_pivots_path = "tests/data/siftsmall_learn.bin_pq_pivots.bin"; + let gound_truth_path = "tests/data/siftsmall_learn.bin_pq_compressed.bin"; + let pq_compressed_vectors_path = "validation.bin"; + let mut pq_storage = + PQStorage::new(pq_pivots_path, pq_compressed_vectors_path, data_file).unwrap(); + generate_quantized_data::(0.5, 1, pq_pivots_path, &mut pq_storage).unwrap(); + + let (data, nr, nc) = load_bin::(pq_compressed_vectors_path, 0).unwrap(); + let (gt_data, gt_nr, gt_nc) = load_bin::(gound_truth_path, 0).unwrap(); + assert_eq!(nr, gt_nr); + assert_eq!(nc, gt_nc); + for i in 0..data.len() { + assert_eq!(data[i], gt_data[i]); + } + std::fs::remove_file(pq_compressed_vectors_path).unwrap(); + } +} diff --git a/rust/diskann/src/model/scratch/concurrent_queue.rs b/rust/diskann/src/model/scratch/concurrent_queue.rs new file mode 100644 index 000000000..8c72bab02 --- /dev/null +++ b/rust/diskann/src/model/scratch/concurrent_queue.rs @@ -0,0 +1,312 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Aligned allocator + +use std::collections::VecDeque; +use std::ops::Deref; +use std::sync::{Arc, Condvar, Mutex, MutexGuard}; +use std::time::Duration; + +use crate::common::{ANNError, ANNResult}; + +#[derive(Debug)] +/// Query scratch data structures +pub struct ConcurrentQueue { + q: Mutex>, + c: Mutex, + push_cv: Condvar, +} + +impl Default for ConcurrentQueue { + fn default() -> Self { + Self::new() + } +} + +impl ConcurrentQueue { + /// Create a concurrent queue + pub fn new() -> Self { + Self { + q: Mutex::new(VecDeque::new()), + c: Mutex::new(false), + push_cv: Condvar::new(), + } + } + + /// Block the current thread until it is able to acquire the mutex + pub fn reserve(&self, size: usize) -> ANNResult<()> { + let mut guard = lock(&self.q)?; + guard.reserve(size); + Ok(()) + } + + /// queue stats + pub fn size(&self) -> ANNResult { + let guard = lock(&self.q)?; + + Ok(guard.len()) + } + + /// empty the queue + pub fn is_empty(&self) -> ANNResult { + Ok(self.size()? == 0) + } + + /// push back + pub fn push(&self, new_val: T) -> ANNResult<()> { + let mut guard = lock(&self.q)?; + self.push_internal(&mut guard, new_val); + self.push_cv.notify_all(); + Ok(()) + } + + /// push back + fn push_internal(&self, guard: &mut MutexGuard>, new_val: T) { + guard.push_back(new_val); + } + + /// insert into queue + pub fn insert(&self, iter: I) -> ANNResult<()> + where + I: IntoIterator, + { + let mut guard = lock(&self.q)?; + for item in iter { + self.push_internal(&mut guard, item); + } + + self.push_cv.notify_all(); + Ok(()) + } + + /// pop front + pub fn pop(&self) -> ANNResult> { + let mut guard = lock(&self.q)?; + Ok(guard.pop_front()) + } + + /// Empty - is this necessary? + pub fn empty_queue(&self) -> ANNResult<()> { + let mut guard = lock(&self.q)?; + while !guard.is_empty() { + let _ = guard.pop_front(); + } + Ok(()) + } + + /// register for push notifications + pub fn wait_for_push_notify(&self, wait_time: Duration) -> ANNResult<()> { + let guard_lock = lock(&self.c)?; + let _ = self + .push_cv + .wait_timeout(guard_lock, wait_time) + .map_err(|err| { + ANNError::log_lock_poison_error(format!( + "ConcurrentQueue Lock is poisoned, err={}", + err + )) + })?; + Ok(()) + } +} + +fn lock(mutex: &Mutex) -> ANNResult> { + let guard = mutex.lock().map_err(|err| { + ANNError::log_lock_poison_error(format!("ConcurrentQueue lock is poisoned, err={}", err)) + })?; + Ok(guard) +} + +/// A thread-safe queue that holds instances of `T`. +/// Each instance is stored in a `Box` to keep the size of the queue node constant. +#[derive(Debug)] +pub struct ArcConcurrentBoxedQueue { + internal_queue: Arc>>, +} + +impl ArcConcurrentBoxedQueue { + /// Create a new `ArcConcurrentBoxedQueue`. + pub fn new() -> Self { + Self { + internal_queue: Arc::new(ConcurrentQueue::new()), + } + } +} + +impl Default for ArcConcurrentBoxedQueue { + fn default() -> Self { + Self::new() + } +} + +impl Clone for ArcConcurrentBoxedQueue { + /// Create a new `ArcConcurrentBoxedQueue` that shares the same internal queue + /// with the existing one. This allows multiple `ArcConcurrentBoxedQueue` to + /// operate on the same underlying queue. + fn clone(&self) -> Self { + Self { + internal_queue: Arc::clone(&self.internal_queue), + } + } +} + +/// Deref to the ConcurrentQueue. +impl Deref for ArcConcurrentBoxedQueue { + type Target = ConcurrentQueue>; + + fn deref(&self) -> &Self::Target { + &self.internal_queue + } +} + +#[cfg(test)] +mod tests { + use crate::model::ConcurrentQueue; + use std::sync::Arc; + use std::thread; + use std::time::Duration; + + #[test] + fn test_push_pop() { + let queue = ConcurrentQueue::::new(); + + queue.push(1).unwrap(); + queue.push(2).unwrap(); + queue.push(3).unwrap(); + + assert_eq!(queue.pop().unwrap(), Some(1)); + assert_eq!(queue.pop().unwrap(), Some(2)); + assert_eq!(queue.pop().unwrap(), Some(3)); + assert_eq!(queue.pop().unwrap(), None); + } + + #[test] + fn test_size_empty() { + let queue = ConcurrentQueue::new(); + + assert_eq!(queue.size().unwrap(), 0); + assert!(queue.is_empty().unwrap()); + + queue.push(1).unwrap(); + queue.push(2).unwrap(); + + assert_eq!(queue.size().unwrap(), 2); + assert!(!queue.is_empty().unwrap()); + + queue.pop().unwrap(); + queue.pop().unwrap(); + + assert_eq!(queue.size().unwrap(), 0); + assert!(queue.is_empty().unwrap()); + } + + #[test] + fn test_insert() { + let queue = ConcurrentQueue::new(); + + let data = vec![1, 2, 3]; + queue.insert(data.into_iter()).unwrap(); + + assert_eq!(queue.pop().unwrap(), Some(1)); + assert_eq!(queue.pop().unwrap(), Some(2)); + assert_eq!(queue.pop().unwrap(), Some(3)); + assert_eq!(queue.pop().unwrap(), None); + } + + #[test] + fn test_notifications() { + let queue = Arc::new(ConcurrentQueue::new()); + let queue_clone = Arc::clone(&queue); + + let producer = thread::spawn(move || { + for i in 0..3 { + thread::sleep(Duration::from_millis(50)); + queue_clone.push(i).unwrap(); + } + }); + + let consumer = thread::spawn(move || { + let mut values = vec![]; + + for _ in 0..3 { + let mut val = -1; + while val == -1 { + queue + .wait_for_push_notify(Duration::from_millis(10)) + .unwrap(); + val = queue.pop().unwrap().unwrap_or(-1); + } + + values.push(val); + } + + values + }); + + producer.join().unwrap(); + let consumer_results = consumer.join().unwrap(); + + assert_eq!(consumer_results, vec![0, 1, 2]); + } + + #[test] + fn test_multithreaded_push_pop() { + let queue = Arc::new(ConcurrentQueue::new()); + let queue_clone = Arc::clone(&queue); + + let producer = thread::spawn(move || { + for i in 0..10 { + queue_clone.push(i).unwrap(); + thread::sleep(Duration::from_millis(50)); + } + }); + + let consumer = thread::spawn(move || { + let mut values = vec![]; + + for _ in 0..10 { + let mut val = -1; + while val == -1 { + val = queue.pop().unwrap().unwrap_or(-1); + thread::sleep(Duration::from_millis(10)); + } + + values.push(val); + } + + values + }); + + producer.join().unwrap(); + let consumer_results = consumer.join().unwrap(); + + assert_eq!(consumer_results, (0..10).collect::>()); + } + + /// This is a single value test. It avoids the unlimited wait until the collectin got empty on the previous test. + /// It will make sure the signal mutex is matching the waiting mutex. + #[test] + fn test_wait_for_push_notify() { + let queue = Arc::new(ConcurrentQueue::::new()); + let queue_clone = Arc::clone(&queue); + + let producer = thread::spawn(move || { + thread::sleep(Duration::from_millis(100)); + queue_clone.push(1).unwrap(); + }); + + let consumer = thread::spawn(move || { + queue + .wait_for_push_notify(Duration::from_millis(200)) + .unwrap(); + assert_eq!(queue.pop().unwrap(), Some(1)); + }); + + producer.join().unwrap(); + consumer.join().unwrap(); + } +} diff --git a/rust/diskann/src/model/scratch/inmem_query_scratch.rs b/rust/diskann/src/model/scratch/inmem_query_scratch.rs new file mode 100644 index 000000000..f0fa432c2 --- /dev/null +++ b/rust/diskann/src/model/scratch/inmem_query_scratch.rs @@ -0,0 +1,186 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Scratch space for in-memory index based search + +use std::cmp::max; +use std::mem; + +use hashbrown::HashSet; + +use crate::common::{ANNError, ANNResult, AlignedBoxWithSlice}; +use crate::model::configuration::index_write_parameters::IndexWriteParameters; +use crate::model::{Neighbor, NeighborPriorityQueue, PQScratch}; + +use super::Scratch; + +/// In-mem index related limits +pub const GRAPH_SLACK_FACTOR: f64 = 1.3_f64; + +/// Max number of points for using bitset +pub const MAX_POINTS_FOR_USING_BITSET: usize = 100000; + +/// TODO: SSD Index related limits +pub const MAX_GRAPH_DEGREE: usize = 512; + +/// TODO: SSD Index related limits +pub const MAX_N_CMPS: usize = 16384; + +/// TODO: SSD Index related limits +pub const SECTOR_LEN: usize = 4096; + +/// TODO: SSD Index related limits +pub const MAX_N_SECTOR_READS: usize = 128; + +/// The alignment required for memory access. This will be multiplied with size of T to get the actual alignment +pub const QUERY_ALIGNMENT_OF_T_SIZE: usize = 16; + +/// Scratch space for in-memory index based search +#[derive(Debug)] +pub struct InMemQueryScratch { + /// Size of the candidate queue + pub candidate_size: u32, + + /// Max degree for each vertex + pub max_degree: u32, + + /// Max occlusion size + pub max_occlusion_size: u32, + + /// Query node + pub query: AlignedBoxWithSlice, + + /// Best candidates, whose size is candidate_queue_size + pub best_candidates: NeighborPriorityQueue, + + /// Occlude factor + pub occlude_factor: Vec, + + /// Visited neighbor id + pub id_scratch: Vec, + + /// The distance between visited neighbor and query node + pub dist_scratch: Vec, + + /// The PQ Scratch, keey it private since this class use the Box to own the memory. Use the function pq_scratch to get its reference + pub pq_scratch: Option>, + + /// Buffers used in process delete, capacity increases as needed + pub expanded_nodes_set: HashSet, + + /// Expanded neighbors + pub expanded_neighbors_vector: Vec, + + /// Occlude list + pub occlude_list_output: Vec, + + /// RobinSet for larger dataset + pub node_visited_robinset: HashSet, +} + +impl InMemQueryScratch { + /// Create InMemQueryScratch instance + pub fn new( + search_candidate_size: u32, + index_write_parameter: &IndexWriteParameters, + init_pq_scratch: bool, + ) -> ANNResult { + let indexing_candidate_size = index_write_parameter.search_list_size; + let max_degree = index_write_parameter.max_degree; + let max_occlusion_size = index_write_parameter.max_occlusion_size; + + if search_candidate_size == 0 || indexing_candidate_size == 0 || max_degree == 0 || N == 0 { + return Err(ANNError::log_index_error(format!( + "In InMemQueryScratch, one of search_candidate_size = {}, indexing_candidate_size = {}, dim = {} or max_degree = {} is zero.", + search_candidate_size, indexing_candidate_size, N, max_degree))); + } + + let query = AlignedBoxWithSlice::new(N, mem::size_of::() * QUERY_ALIGNMENT_OF_T_SIZE)?; + let pq_scratch = if init_pq_scratch { + Some(Box::new(PQScratch::new(MAX_GRAPH_DEGREE, N)?)) + } else { + None + }; + + let occlude_factor = Vec::with_capacity(max_occlusion_size as usize); + + let capacity = (1.5 * GRAPH_SLACK_FACTOR * (max_degree as f64)).ceil() as usize; + let id_scratch = Vec::with_capacity(capacity); + let dist_scratch = Vec::with_capacity(capacity); + + let expanded_nodes_set = HashSet::::new(); + let expanded_neighbors_vector = Vec::::new(); + let occlude_list_output = Vec::::new(); + + let candidate_size = max(search_candidate_size, indexing_candidate_size); + let node_visited_robinset = HashSet::::with_capacity(20 * candidate_size as usize); + let scratch = Self { + candidate_size, + max_degree, + max_occlusion_size, + query, + best_candidates: NeighborPriorityQueue::with_capacity(candidate_size as usize), + occlude_factor, + id_scratch, + dist_scratch, + pq_scratch, + expanded_nodes_set, + expanded_neighbors_vector, + occlude_list_output, + node_visited_robinset, + }; + + Ok(scratch) + } + + /// Resize the scratch with new candidate size + pub fn resize_for_new_candidate_size(&mut self, new_candidate_size: u32) { + if new_candidate_size > self.candidate_size { + let delta = new_candidate_size - self.candidate_size; + self.candidate_size = new_candidate_size; + self.best_candidates.reserve(delta as usize); + self.node_visited_robinset.reserve((20 * delta) as usize); + } + } +} + +impl Scratch for InMemQueryScratch { + fn clear(&mut self) { + self.best_candidates.clear(); + self.occlude_factor.clear(); + + self.node_visited_robinset.clear(); + + self.id_scratch.clear(); + self.dist_scratch.clear(); + + self.expanded_nodes_set.clear(); + self.expanded_neighbors_vector.clear(); + self.occlude_list_output.clear(); + } +} + +#[cfg(test)] +mod inmemory_query_scratch_test { + use crate::model::configuration::index_write_parameters::IndexWriteParametersBuilder; + + use super::*; + + #[test] + fn node_visited_robinset_test() { + let index_write_parameter = IndexWriteParametersBuilder::new(10, 10) + .with_max_occlusion_size(5) + .build(); + + let mut scratch = + InMemQueryScratch::::new(100, &index_write_parameter, false).unwrap(); + + assert_eq!(scratch.node_visited_robinset.len(), 0); + + scratch.clear(); + assert_eq!(scratch.node_visited_robinset.len(), 0); + } +} diff --git a/rust/diskann/src/model/scratch/mod.rs b/rust/diskann/src/model/scratch/mod.rs new file mode 100644 index 000000000..cf9ee2900 --- /dev/null +++ b/rust/diskann/src/model/scratch/mod.rs @@ -0,0 +1,28 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +pub mod scratch_traits; +pub use scratch_traits::*; + +pub mod concurrent_queue; +pub use concurrent_queue::*; + +pub mod pq_scratch; +pub use pq_scratch::*; + + +pub mod inmem_query_scratch; +pub use inmem_query_scratch::*; + +pub mod scratch_store_manager; +pub use scratch_store_manager::*; + +pub mod ssd_query_scratch; +pub use ssd_query_scratch::*; + +pub mod ssd_thread_data; +pub use ssd_thread_data::*; + +pub mod ssd_io_context; +pub use ssd_io_context::*; diff --git a/rust/diskann/src/model/scratch/pq_scratch.rs b/rust/diskann/src/model/scratch/pq_scratch.rs new file mode 100644 index 000000000..bf9d6c547 --- /dev/null +++ b/rust/diskann/src/model/scratch/pq_scratch.rs @@ -0,0 +1,105 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Aligned allocator + +use std::mem::size_of; + +use crate::common::{ANNResult, AlignedBoxWithSlice}; + +const MAX_PQ_CHUNKS: usize = 512; + +#[derive(Debug)] +/// PQ scratch +pub struct PQScratch { + /// Aligned pq table dist scratch, must be at least [256 * NCHUNKS] + pub aligned_pqtable_dist_scratch: AlignedBoxWithSlice, + /// Aligned dist scratch, must be at least diskann MAX_DEGREE + pub aligned_dist_scratch: AlignedBoxWithSlice, + /// Aligned pq coord scratch, must be at least [N_CHUNKS * MAX_DEGREE] + pub aligned_pq_coord_scratch: AlignedBoxWithSlice, + /// Rotated query + pub rotated_query: AlignedBoxWithSlice, + /// Aligned query float + pub aligned_query_float: AlignedBoxWithSlice, +} + +impl PQScratch { + const ALIGNED_ALLOC_256: usize = 256; + + /// Create a new pq scratch + pub fn new(graph_degree: usize, aligned_dim: usize) -> ANNResult { + let aligned_pq_coord_scratch = + AlignedBoxWithSlice::new(graph_degree * MAX_PQ_CHUNKS, PQScratch::ALIGNED_ALLOC_256)?; + let aligned_pqtable_dist_scratch = + AlignedBoxWithSlice::new(256 * MAX_PQ_CHUNKS, PQScratch::ALIGNED_ALLOC_256)?; + let aligned_dist_scratch = + AlignedBoxWithSlice::new(graph_degree, PQScratch::ALIGNED_ALLOC_256)?; + let aligned_query_float = AlignedBoxWithSlice::new(aligned_dim, 8 * size_of::())?; + let rotated_query = AlignedBoxWithSlice::new(aligned_dim, 8 * size_of::())?; + + Ok(Self { + aligned_pqtable_dist_scratch, + aligned_dist_scratch, + aligned_pq_coord_scratch, + rotated_query, + aligned_query_float, + }) + } + + /// Set rotated_query and aligned_query_float values + pub fn set(&mut self, dim: usize, query: &[T], norm: f32) + where + T: Into + Copy, + { + for (d, item) in query.iter().enumerate().take(dim) { + let query_val: f32 = (*item).into(); + if (norm - 1.0).abs() > f32::EPSILON { + self.rotated_query[d] = query_val / norm; + self.aligned_query_float[d] = query_val / norm; + } else { + self.rotated_query[d] = query_val; + self.aligned_query_float[d] = query_val; + } + } + } +} + +#[cfg(test)] +mod tests { + use crate::model::PQScratch; + + #[test] + fn test_pq_scratch() { + let graph_degree = 512; + let aligned_dim = 8; + + let mut pq_scratch: PQScratch = PQScratch::new(graph_degree, aligned_dim).unwrap(); + + // Check alignment + assert_eq!( + (pq_scratch.aligned_pqtable_dist_scratch.as_ptr() as usize) % 256, + 0 + ); + assert_eq!((pq_scratch.aligned_dist_scratch.as_ptr() as usize) % 256, 0); + assert_eq!( + (pq_scratch.aligned_pq_coord_scratch.as_ptr() as usize) % 256, + 0 + ); + assert_eq!((pq_scratch.rotated_query.as_ptr() as usize) % 32, 0); + assert_eq!((pq_scratch.aligned_query_float.as_ptr() as usize) % 32, 0); + + // Test set() method + let query = vec![1u8, 2, 3, 4, 5, 6, 7, 8]; + let norm = 2.0f32; + pq_scratch.set::(query.len(), &query, norm); + + (0..query.len()).for_each(|i| { + assert_eq!(pq_scratch.rotated_query[i], query[i] as f32 / norm); + assert_eq!(pq_scratch.aligned_query_float[i], query[i] as f32 / norm); + }); + } +} diff --git a/rust/diskann/src/model/scratch/scratch_store_manager.rs b/rust/diskann/src/model/scratch/scratch_store_manager.rs new file mode 100644 index 000000000..4e2397f49 --- /dev/null +++ b/rust/diskann/src/model/scratch/scratch_store_manager.rs @@ -0,0 +1,84 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use crate::common::ANNResult; + +use super::ArcConcurrentBoxedQueue; +use super::{scratch_traits::Scratch}; +use std::time::Duration; + +pub struct ScratchStoreManager { + scratch: Option>, + scratch_pool: ArcConcurrentBoxedQueue, +} + +impl ScratchStoreManager { + pub fn new(scratch_pool: ArcConcurrentBoxedQueue, wait_time: Duration) -> ANNResult { + let mut scratch = scratch_pool.pop()?; + while scratch.is_none() { + scratch_pool.wait_for_push_notify(wait_time)?; + scratch = scratch_pool.pop()?; + } + + Ok(ScratchStoreManager { + scratch, + scratch_pool, + }) + } + + pub fn scratch_space(&mut self) -> Option<&mut T> { + self.scratch.as_deref_mut() + } +} + +impl Drop for ScratchStoreManager { + fn drop(&mut self) { + if let Some(mut scratch) = self.scratch.take() { + scratch.clear(); + let _ = self.scratch_pool.push(scratch); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[derive(Debug)] + struct MyScratch { + data: Vec, + } + + impl Scratch for MyScratch { + fn clear(&mut self) { + self.data.clear(); + } + } + + #[test] + fn test_scratch_store_manager() { + let wait_time = Duration::from_millis(100); + + let scratch_pool = ArcConcurrentBoxedQueue::new(); + for i in 1..3 { + scratch_pool.push(Box::new(MyScratch { + data: vec![i, 2 * i, 3 * i], + })).unwrap(); + } + + let mut manager = ScratchStoreManager::new(scratch_pool.clone(), wait_time).unwrap(); + let scratch_space = manager.scratch_space().unwrap(); + + assert_eq!(scratch_space.data, vec![1, 2, 3]); + + // At this point, the ScratchStoreManager will go out of scope, + // causing the Drop implementation to be called, which should + // call the clear method on MyScratch. + drop(manager); + + let current_scratch = scratch_pool.pop().unwrap().unwrap(); + assert_eq!(current_scratch.data, vec![2, 4, 6]); + } +} + diff --git a/rust/diskann/src/model/scratch/scratch_traits.rs b/rust/diskann/src/model/scratch/scratch_traits.rs new file mode 100644 index 000000000..71e4b932d --- /dev/null +++ b/rust/diskann/src/model/scratch/scratch_traits.rs @@ -0,0 +1,8 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +pub trait Scratch { + fn clear(&mut self); +} + diff --git a/rust/diskann/src/model/scratch/ssd_io_context.rs b/rust/diskann/src/model/scratch/ssd_io_context.rs new file mode 100644 index 000000000..d4dff0cec --- /dev/null +++ b/rust/diskann/src/model/scratch/ssd_io_context.rs @@ -0,0 +1,38 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![allow(dead_code)] // Todo: Remove this when the disk index query code is complete. +use crate::common::ANNError; + +use platform::{FileHandle, IOCompletionPort}; + +// The IOContext struct for disk I/O. One for each thread. +pub struct IOContext { + pub status: Status, + pub file_handle: FileHandle, + pub io_completion_port: IOCompletionPort, +} + +impl Default for IOContext { + fn default() -> Self { + IOContext { + status: Status::ReadWait, + file_handle: FileHandle::default(), + io_completion_port: IOCompletionPort::default(), + } + } +} + +impl IOContext { + pub fn new() -> Self { + Self::default() + } +} + +pub enum Status { + ReadWait, + ReadSuccess, + ReadFailed(ANNError), + ProcessComplete, +} diff --git a/rust/diskann/src/model/scratch/ssd_query_scratch.rs b/rust/diskann/src/model/scratch/ssd_query_scratch.rs new file mode 100644 index 000000000..b36669303 --- /dev/null +++ b/rust/diskann/src/model/scratch/ssd_query_scratch.rs @@ -0,0 +1,132 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![allow(dead_code)] // Todo: Remove this when the disk index query code is complete. +use std::mem; +use std::vec::Vec; + +use hashbrown::HashSet; + +use crate::{ + common::{ANNResult, AlignedBoxWithSlice}, + model::{Neighbor, NeighborPriorityQueue}, + model::data_store::DiskScratchDataset, +}; + +use super::{PQScratch, Scratch, MAX_GRAPH_DEGREE, QUERY_ALIGNMENT_OF_T_SIZE}; + +// Scratch space for disk index based search. +pub struct SSDQueryScratch +{ + // Disk scratch dataset storing fp vectors with aligned dim (N) + pub scratch_dataset: DiskScratchDataset, + + // The query scratch. + pub query: AlignedBoxWithSlice, + + /// The PQ Scratch. + pub pq_scratch: Option>, + + // The visited set. + pub id_scratch: HashSet, + + /// Best candidates, whose size is candidate_queue_size + pub best_candidates: NeighborPriorityQueue, + + // Full return set. + pub full_return_set: Vec, +} + +// +impl SSDQueryScratch +{ + pub fn new( + visited_reserve: usize, + candidate_queue_size: usize, + init_pq_scratch: bool, + ) -> ANNResult { + let scratch_dataset = DiskScratchDataset::::new()?; + + let query = AlignedBoxWithSlice::::new(N, mem::size_of::() * QUERY_ALIGNMENT_OF_T_SIZE)?; + + let id_scratch = HashSet::::with_capacity(visited_reserve); + let full_return_set = Vec::::with_capacity(visited_reserve); + let best_candidates = NeighborPriorityQueue::with_capacity(candidate_queue_size); + + let pq_scratch = if init_pq_scratch { + Some(Box::new(PQScratch::new(MAX_GRAPH_DEGREE, N)?)) + } else { + None + }; + + Ok(Self { + scratch_dataset, + query, + pq_scratch, + id_scratch, + best_candidates, + full_return_set, + }) + } + + pub fn pq_scratch(&mut self) -> &Option> { + &self.pq_scratch + } +} + +impl Scratch for SSDQueryScratch +{ + fn clear(&mut self) { + self.id_scratch.clear(); + self.best_candidates.clear(); + self.full_return_set.clear(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_new() { + // Arrange + let visited_reserve = 100; + let candidate_queue_size = 10; + let init_pq_scratch = true; + + // Act + let result = + SSDQueryScratch::::new(visited_reserve, candidate_queue_size, init_pq_scratch); + + // Assert + assert!(result.is_ok()); + + let scratch = result.unwrap(); + + // Assert the properties of the scratch instance + assert!(scratch.pq_scratch.is_some()); + assert!(scratch.id_scratch.is_empty()); + assert!(scratch.best_candidates.size() == 0); + assert!(scratch.full_return_set.is_empty()); + } + + #[test] + fn test_clear() { + // Arrange + let mut scratch = SSDQueryScratch::::new(100, 10, true).unwrap(); + + // Add some data to scratch fields + scratch.id_scratch.insert(1); + scratch.best_candidates.insert(Neighbor::new(2, 0.5)); + scratch.full_return_set.push(Neighbor::new(3, 0.8)); + + // Act + scratch.clear(); + + // Assert + assert!(scratch.id_scratch.is_empty()); + assert!(scratch.best_candidates.size() == 0); + assert!(scratch.full_return_set.is_empty()); + } +} diff --git a/rust/diskann/src/model/scratch/ssd_thread_data.rs b/rust/diskann/src/model/scratch/ssd_thread_data.rs new file mode 100644 index 000000000..e37495901 --- /dev/null +++ b/rust/diskann/src/model/scratch/ssd_thread_data.rs @@ -0,0 +1,92 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![allow(dead_code)] // Todo: Remove this when the disk index query code is complete. +use std::sync::Arc; + +use super::{scratch_traits::Scratch, IOContext, SSDQueryScratch}; +use crate::common::ANNResult; + +// The thread data struct for SSD I/O. One for each thread, contains the ScratchSpace and the IOContext. +pub struct SSDThreadData { + pub scratch: SSDQueryScratch, + pub io_context: Option>, +} + +impl SSDThreadData { + pub fn new( + aligned_dim: usize, + visited_reserve: usize, + init_pq_scratch: bool, + ) -> ANNResult { + let scratch = SSDQueryScratch::new(aligned_dim, visited_reserve, init_pq_scratch)?; + Ok(SSDThreadData { + scratch, + io_context: None, + }) + } + + pub fn clear(&mut self) { + self.scratch.clear(); + } +} + +#[cfg(test)] +mod tests { + use crate::model::Neighbor; + + use super::*; + + #[test] + fn test_new() { + // Arrange + let aligned_dim = 10; + let visited_reserve = 100; + let init_pq_scratch = true; + + // Act + let result = SSDThreadData::::new(aligned_dim, visited_reserve, init_pq_scratch); + + // Assert + assert!(result.is_ok()); + + let thread_data = result.unwrap(); + + // Assert the properties of the thread data instance + assert!(thread_data.io_context.is_none()); + + let scratch = &thread_data.scratch; + // Assert the properties of the scratch instance + assert!(scratch.pq_scratch.is_some()); + assert!(scratch.id_scratch.is_empty()); + assert!(scratch.best_candidates.size() == 0); + assert!(scratch.full_return_set.is_empty()); + } + + #[test] + fn test_clear() { + // Arrange + let mut thread_data = SSDThreadData::::new(10, 100, true).unwrap(); + + // Add some data to scratch fields + thread_data.scratch.id_scratch.insert(1); + thread_data + .scratch + .best_candidates + .insert(Neighbor::new(2, 0.5)); + thread_data + .scratch + .full_return_set + .push(Neighbor::new(3, 0.8)); + + // Act + thread_data.clear(); + + // Assert + assert!(thread_data.scratch.id_scratch.is_empty()); + assert!(thread_data.scratch.best_candidates.size() == 0); + assert!(thread_data.scratch.full_return_set.is_empty()); + } +} + diff --git a/rust/diskann/src/model/vertex/dimension.rs b/rust/diskann/src/model/vertex/dimension.rs new file mode 100644 index 000000000..32670a8db --- /dev/null +++ b/rust/diskann/src/model/vertex/dimension.rs @@ -0,0 +1,22 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Vertex dimension + +/// 32 vertex dimension +pub const DIM_32: usize = 32; + +/// 64 vertex dimension +pub const DIM_64: usize = 64; + +/// 104 vertex dimension +pub const DIM_104: usize = 104; + +/// 128 vertex dimension +pub const DIM_128: usize = 128; + +/// 256 vertex dimension +pub const DIM_256: usize = 256; diff --git a/rust/diskann/src/model/vertex/mod.rs b/rust/diskann/src/model/vertex/mod.rs new file mode 100644 index 000000000..224d476dc --- /dev/null +++ b/rust/diskann/src/model/vertex/mod.rs @@ -0,0 +1,10 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[allow(clippy::module_inception)] +mod vertex; +pub use vertex::Vertex; + +mod dimension; +pub use dimension::*; diff --git a/rust/diskann/src/model/vertex/vertex.rs b/rust/diskann/src/model/vertex/vertex.rs new file mode 100644 index 000000000..55369748e --- /dev/null +++ b/rust/diskann/src/model/vertex/vertex.rs @@ -0,0 +1,68 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Vertex + +use std::array::TryFromSliceError; + +use vector::{FullPrecisionDistance, Metric}; + +/// Vertex with data type T and dimension N +#[derive(Debug)] +pub struct Vertex<'a, T, const N: usize> +where + [T; N]: FullPrecisionDistance, +{ + /// Vertex value + val: &'a [T; N], + + /// Vertex Id + id: u32, +} + +impl<'a, T, const N: usize> Vertex<'a, T, N> +where + [T; N]: FullPrecisionDistance, +{ + /// Create the vertex with data + pub fn new(val: &'a [T; N], id: u32) -> Self { + Self { + val, + id, + } + } + + /// Compare the vertex with another. + #[inline(always)] + pub fn compare(&self, other: &Vertex<'a, T, N>, metric: Metric) -> f32 { + <[T; N]>::distance_compare(self.val, other.val, metric) + } + + /// Get the vector associated with the vertex. + #[inline] + pub fn vector(&self) -> &[T; N] { + self.val + } + + /// Get the vertex id. + #[inline] + pub fn vertex_id(&self) -> u32 { + self.id + } +} + +impl<'a, T, const N: usize> TryFrom<(&'a [T], u32)> for Vertex<'a, T, N> +where + [T; N]: FullPrecisionDistance, +{ + type Error = TryFromSliceError; + + fn try_from((mem_slice, id): (&'a [T], u32)) -> Result { + let array: &[T; N] = mem_slice.try_into()?; + Ok(Vertex::new(array, id)) + } +} + diff --git a/rust/diskann/src/model/windows_aligned_file_reader/mod.rs b/rust/diskann/src/model/windows_aligned_file_reader/mod.rs new file mode 100644 index 000000000..0e63df0a6 --- /dev/null +++ b/rust/diskann/src/model/windows_aligned_file_reader/mod.rs @@ -0,0 +1,7 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[allow(clippy::module_inception)] +mod windows_aligned_file_reader; +pub use windows_aligned_file_reader::*; diff --git a/rust/diskann/src/model/windows_aligned_file_reader/windows_aligned_file_reader.rs b/rust/diskann/src/model/windows_aligned_file_reader/windows_aligned_file_reader.rs new file mode 100644 index 000000000..1cc3dc032 --- /dev/null +++ b/rust/diskann/src/model/windows_aligned_file_reader/windows_aligned_file_reader.rs @@ -0,0 +1,414 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::sync::Arc; +use std::time::Duration; +use std::{ptr, thread}; + +use crossbeam::sync::ShardedLock; +use hashbrown::HashMap; +use once_cell::sync::Lazy; + +use platform::file_handle::{AccessMode, ShareMode}; +use platform::{ + file_handle::FileHandle, + file_io::{get_queued_completion_status, read_file_to_slice}, + io_completion_port::IOCompletionPort, +}; + +use winapi::{ + shared::{basetsd::ULONG_PTR, minwindef::DWORD}, + um::minwinbase::OVERLAPPED, +}; + +use crate::common::{ANNError, ANNResult}; +use crate::model::IOContext; + +pub const MAX_IO_CONCURRENCY: usize = 128; // To do: explore the optimal value for this. The current value is taken from C++ code. +pub const FILE_ATTRIBUTE_READONLY: DWORD = 0x00000001; +pub const IO_COMPLETION_TIMEOUT: DWORD = u32::MAX; // Infinite timeout. +pub const DISK_IO_ALIGNMENT: usize = 512; +pub const ASYNC_IO_COMPLETION_CHECK_INTERVAL: Duration = Duration::from_micros(5); + +/// Aligned read struct for disk IO, it takes the ownership of the AlignedBoxedSlice and returns the AlignedBoxWithSlice data immutably. +pub struct AlignedRead<'a, T> { + /// where to read from + /// offset needs to be aligned with DISK_IO_ALIGNMENT + offset: u64, + + /// where to read into + /// aligned_buf and its len need to be aligned with DISK_IO_ALIGNMENT + aligned_buf: &'a mut [T], +} + +impl<'a, T> AlignedRead<'a, T> { + pub fn new(offset: u64, aligned_buf: &'a mut [T]) -> ANNResult { + Self::assert_is_aligned(offset as usize)?; + Self::assert_is_aligned(std::mem::size_of_val(aligned_buf))?; + + Ok(Self { + offset, + aligned_buf, + }) + } + + fn assert_is_aligned(val: usize) -> ANNResult<()> { + match val % DISK_IO_ALIGNMENT { + 0 => Ok(()), + _ => Err(ANNError::log_disk_io_request_alignment_error(format!( + "The offset or length of AlignedRead request is not {} bytes aligned", + DISK_IO_ALIGNMENT + ))), + } + } + + pub fn aligned_buf(&self) -> &[T] { + self.aligned_buf + } +} + +pub struct WindowsAlignedFileReader { + file_name: String, + + // ctx_map is the mapping from thread id to io context. It is hashmap behind a sharded lock to allow concurrent access from multiple threads. + // ShardedLock: shardedlock provides an implementation of a reader-writer lock that offers concurrent read access to the shared data while allowing exclusive write access. + // It achieves better scalability by dividing the shared data into multiple shards, and each with its own internal lock. + // Multiple threads can read from different shards simultaneously, reducing contention. + // https://docs.rs/crossbeam/0.8.2/crossbeam/sync/struct.ShardedLock.html + // Comparing to RwLock, ShardedLock provides higher concurrency for read operations and is suitable for read heavy workloads. + // The value of the hashmap is an Arc to allow immutable access to IOContext with automatic reference counting. + ctx_map: Lazy>>>, +} + +impl WindowsAlignedFileReader { + pub fn new(fname: &str) -> ANNResult { + let reader: WindowsAlignedFileReader = WindowsAlignedFileReader { + file_name: fname.to_string(), + ctx_map: Lazy::new(|| ShardedLock::new(HashMap::new())), + }; + + reader.register_thread()?; + Ok(reader) + } + + // Register the io context for a thread if it hasn't been registered. + pub fn register_thread(&self) -> ANNResult<()> { + let mut ctx_map = self.ctx_map.write().map_err(|_| { + ANNError::log_lock_poison_error("unable to acquire read lock on ctx_map".to_string()) + })?; + + let id = thread::current().id(); + if ctx_map.contains_key(&id) { + println!( + "Warning:: Duplicate registration for thread_id : {:?}. Directly call get_ctx to get the thread context data.", + id); + + return Ok(()); + } + + let mut ctx = IOContext::new(); + + match unsafe { FileHandle::new(&self.file_name, AccessMode::Read, ShareMode::Read) } { + Ok(file_handle) => ctx.file_handle = file_handle, + Err(err) => { + return Err(ANNError::log_io_error(err)); + } + } + + // Create a io completion port for the file handle, later it will be used to get the completion status. + match IOCompletionPort::new(&ctx.file_handle, None, 0, 0) { + Ok(io_completion_port) => ctx.io_completion_port = io_completion_port, + Err(err) => { + return Err(ANNError::log_io_error(err)); + } + } + + ctx_map.insert(id, Arc::new(ctx)); + + Ok(()) + } + + // Get the reference counted io context for the current thread. + pub fn get_ctx(&self) -> ANNResult> { + let ctx_map = self.ctx_map.read().map_err(|_| { + ANNError::log_lock_poison_error("unable to acquire read lock on ctx_map".to_string()) + })?; + + let id = thread::current().id(); + match ctx_map.get(&id) { + Some(ctx) => Ok(Arc::clone(ctx)), + None => Err(ANNError::log_index_error(format!( + "unable to find IOContext for thread_id {:?}", + id + ))), + } + } + + // Read the data from the file by sending concurrent io requests in batches. + pub fn read(&self, read_requests: &mut [AlignedRead], ctx: &IOContext) -> ANNResult<()> { + let n_requests = read_requests.len(); + let n_batches = (n_requests + MAX_IO_CONCURRENCY - 1) / MAX_IO_CONCURRENCY; + + let mut overlapped_in_out = + vec![unsafe { std::mem::zeroed::() }; MAX_IO_CONCURRENCY]; + + for batch_idx in 0..n_batches { + let batch_start = MAX_IO_CONCURRENCY * batch_idx; + let batch_size = std::cmp::min(n_requests - batch_start, MAX_IO_CONCURRENCY); + + for j in 0..batch_size { + let req = &mut read_requests[batch_start + j]; + let os = &mut overlapped_in_out[j]; + + match unsafe { + read_file_to_slice(&ctx.file_handle, req.aligned_buf, os, req.offset) + } { + Ok(_) => {} + Err(error) => { + return Err(ANNError::IOError { err: (error) }); + } + } + } + + let mut n_read: DWORD = 0; + let mut n_complete: u64 = 0; + let mut completion_key: ULONG_PTR = 0; + let mut lp_os: *mut OVERLAPPED = ptr::null_mut(); + while n_complete < batch_size as u64 { + match unsafe { + get_queued_completion_status( + &ctx.io_completion_port, + &mut n_read, + &mut completion_key, + &mut lp_os, + IO_COMPLETION_TIMEOUT, + ) + } { + // An IO request completed. + Ok(true) => n_complete += 1, + // No IO request completed, continue to wait. + Ok(false) => { + thread::sleep(ASYNC_IO_COMPLETION_CHECK_INTERVAL); + } + // An error ocurred. + Err(error) => return Err(ANNError::IOError { err: (error) }), + } + } + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use std::{fs::File, io::BufReader}; + + use bincode::deserialize_from; + use serde::{Deserialize, Serialize}; + + use crate::{common::AlignedBoxWithSlice, model::SECTOR_LEN}; + + use super::*; + pub const TEST_INDEX_PATH: &str = + "./tests/data/disk_index_siftsmall_learn_256pts_R4_L50_A1.2_alligned_reader_test.index"; + pub const TRUTH_NODE_DATA_PATH: &str = + "./tests/data/disk_index_node_data_aligned_reader_truth.bin"; + + #[derive(Debug, Serialize, Deserialize)] + struct NodeData { + num_neighbors: u32, + coordinates: Vec, + neighbors: Vec, + } + + impl PartialEq for NodeData { + fn eq(&self, other: &Self) -> bool { + self.num_neighbors == other.num_neighbors + && self.coordinates == other.coordinates + && self.neighbors == other.neighbors + } + } + + #[test] + fn test_new_aligned_file_reader() { + // Replace "test_file_path" with actual file path + let result = WindowsAlignedFileReader::new(TEST_INDEX_PATH); + assert!(result.is_ok()); + + let reader = result.unwrap(); + assert_eq!(reader.file_name, TEST_INDEX_PATH); + } + + #[test] + fn test_read() { + let reader = WindowsAlignedFileReader::new(TEST_INDEX_PATH).unwrap(); + let ctx = reader.get_ctx().unwrap(); + + let read_length = 512; // adjust according to your logic + let num_read = 10; + let mut aligned_mem = AlignedBoxWithSlice::::new(read_length * num_read, 512).unwrap(); + + // create and add AlignedReads to the vector + let mut mem_slices = aligned_mem + .split_into_nonoverlapping_mut_slices(0..aligned_mem.len(), read_length) + .unwrap(); + + let mut aligned_reads: Vec> = mem_slices + .iter_mut() + .enumerate() + .map(|(i, slice)| { + let offset = (i * read_length) as u64; + AlignedRead::new(offset, slice).unwrap() + }) + .collect(); + + let result = reader.read(&mut aligned_reads, &ctx); + assert!(result.is_ok()); + } + + #[test] + fn test_read_disk_index_by_sector() { + let reader = WindowsAlignedFileReader::new(TEST_INDEX_PATH).unwrap(); + let ctx = reader.get_ctx().unwrap(); + + let read_length = SECTOR_LEN; // adjust according to your logic + let num_sector = 10; + let mut aligned_mem = + AlignedBoxWithSlice::::new(read_length * num_sector, 512).unwrap(); + + // Each slice will be used as the buffer for a read request of a sector. + let mut mem_slices = aligned_mem + .split_into_nonoverlapping_mut_slices(0..aligned_mem.len(), read_length) + .unwrap(); + + let mut aligned_reads: Vec> = mem_slices + .iter_mut() + .enumerate() + .map(|(sector_id, slice)| { + let offset = (sector_id * read_length) as u64; + AlignedRead::new(offset, slice).unwrap() + }) + .collect(); + + let result = reader.read(&mut aligned_reads, &ctx); + assert!(result.is_ok()); + + aligned_reads.iter().for_each(|read| { + assert_eq!(read.aligned_buf.len(), SECTOR_LEN); + }); + + let disk_layout_meta = reconstruct_disk_meta(aligned_reads[0].aligned_buf); + assert!(disk_layout_meta.len() > 9); + + let dims = disk_layout_meta[1]; + let num_pts = disk_layout_meta[0]; + let max_node_len = disk_layout_meta[3]; + let max_num_nodes_per_sector = disk_layout_meta[4]; + + assert!(max_node_len * max_num_nodes_per_sector < SECTOR_LEN as u64); + + let num_nbrs_start = (dims as usize) * std::mem::size_of::(); + let nbrs_buf_start = num_nbrs_start + std::mem::size_of::(); + + let mut node_data_array = Vec::with_capacity(max_num_nodes_per_sector as usize * 9); + + // Only validate the first 9 sectors with graph nodes. + (1..9).for_each(|sector_id| { + let sector_data = &mem_slices[sector_id]; + for node_data in sector_data.chunks_exact(max_node_len as usize) { + // Extract coordinates data from the start of the node_data + let coordinates_end = (dims as usize) * std::mem::size_of::(); + let coordinates = node_data[0..coordinates_end] + .chunks_exact(std::mem::size_of::()) + .map(|chunk| f32::from_le_bytes(chunk.try_into().unwrap())) + .collect(); + + // Extract number of neighbors from the node_data + let neighbors_num = u32::from_le_bytes( + node_data[num_nbrs_start..nbrs_buf_start] + .try_into() + .unwrap(), + ); + + let nbors_buf_end = + nbrs_buf_start + (neighbors_num as usize) * std::mem::size_of::(); + + // Extract neighbors from the node data. + let mut neighbors = Vec::new(); + for nbors_data in node_data[nbrs_buf_start..nbors_buf_end] + .chunks_exact(std::mem::size_of::()) + { + let nbors_id = u32::from_le_bytes(nbors_data.try_into().unwrap()); + assert!(nbors_id < num_pts as u32); + neighbors.push(nbors_id); + } + + // Create NodeData struct and push it to the node_data_array + node_data_array.push(NodeData { + num_neighbors: neighbors_num, + coordinates, + neighbors, + }); + } + }); + + // Compare that each node read from the disk index are expected. + let node_data_truth_file = File::open(TRUTH_NODE_DATA_PATH).unwrap(); + let reader = BufReader::new(node_data_truth_file); + + let node_data_vec: Vec = deserialize_from(reader).unwrap(); + for (node_from_node_data_file, node_from_disk_index) in + node_data_vec.iter().zip(node_data_array.iter()) + { + // Verify that the NodeData from the file is equal to the NodeData in node_data_array + assert_eq!(node_from_node_data_file, node_from_disk_index); + } + } + + #[test] + fn test_read_fail_invalid_file() { + let reader = WindowsAlignedFileReader::new("/invalid_path"); + assert!(reader.is_err()); + } + + #[test] + fn test_read_no_requests() { + let reader = WindowsAlignedFileReader::new(TEST_INDEX_PATH).unwrap(); + let ctx = reader.get_ctx().unwrap(); + + let mut read_requests = Vec::>::new(); + let result = reader.read(&mut read_requests, &ctx); + assert!(result.is_ok()); + } + + #[test] + fn test_get_ctx() { + let reader = WindowsAlignedFileReader::new(TEST_INDEX_PATH).unwrap(); + let result = reader.get_ctx(); + assert!(result.is_ok()); + } + + #[test] + fn test_register_thread() { + let reader = WindowsAlignedFileReader::new(TEST_INDEX_PATH).unwrap(); + let result = reader.register_thread(); + assert!(result.is_ok()); + } + + fn reconstruct_disk_meta(buffer: &[u8]) -> Vec { + let size_of_u64 = std::mem::size_of::(); + + let num_values = buffer.len() / size_of_u64; + let mut disk_layout_meta = Vec::with_capacity(num_values); + let meta_data = &buffer[8..]; + + for chunk in meta_data.chunks_exact(size_of_u64) { + let value = u64::from_le_bytes(chunk.try_into().unwrap()); + disk_layout_meta.push(value); + } + + disk_layout_meta + } +} diff --git a/rust/diskann/src/storage/disk_graph_storage.rs b/rust/diskann/src/storage/disk_graph_storage.rs new file mode 100644 index 000000000..448175212 --- /dev/null +++ b/rust/diskann/src/storage/disk_graph_storage.rs @@ -0,0 +1,37 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_docs)] + +//! Disk graph storage + +use std::sync::Arc; + +use crate::{model::{WindowsAlignedFileReader, IOContext, AlignedRead}, common::ANNResult}; + +/// Graph storage for disk index +/// One thread has one storage instance +pub struct DiskGraphStorage { + /// Disk graph reader + disk_graph_reader: Arc, + + /// IOContext of current thread + ctx: Arc, +} + +impl DiskGraphStorage { + /// Create a new DiskGraphStorage instance + pub fn new(disk_graph_reader: Arc) -> ANNResult { + let ctx = disk_graph_reader.get_ctx()?; + Ok(Self { + disk_graph_reader, + ctx, + }) + } + + /// Read disk graph data + pub fn read(&self, read_requests: &mut [AlignedRead]) -> ANNResult<()> { + self.disk_graph_reader.read(read_requests, &self.ctx) + } +} diff --git a/rust/diskann/src/storage/disk_index_storage.rs b/rust/diskann/src/storage/disk_index_storage.rs new file mode 100644 index 000000000..0c558084d --- /dev/null +++ b/rust/diskann/src/storage/disk_index_storage.rs @@ -0,0 +1,363 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use byteorder::{ByteOrder, LittleEndian, ReadBytesExt}; +use std::fs::File; +use std::io::Read; +use std::marker::PhantomData; +use std::{fs, mem}; + +use crate::common::{ANNError, ANNResult}; +use crate::model::NUM_PQ_CENTROIDS; +use crate::storage::PQStorage; +use crate::utils::{convert_types_u32_usize, convert_types_u64_usize, load_bin, save_bin_u64}; +use crate::utils::{ + file_exists, gen_sample_data, get_file_size, round_up, CachedReader, CachedWriter, +}; + +const SECTOR_LEN: usize = 4096; + +/// Todo: Remove the allow(dead_code) when the disk search code is complete +#[allow(dead_code)] +pub struct PQPivotData { + dim: usize, + pq_table: Vec, + centroids: Vec, + chunk_offsets: Vec, +} + +pub struct DiskIndexStorage { + /// Dataset file + dataset_file: String, + + /// Index file path prefix + index_path_prefix: String, + + // TODO: Only a placeholder for T, will be removed later + _marker: PhantomData, + + pq_storage: PQStorage, +} + +impl DiskIndexStorage { + /// Create DiskIndexStorage instance + pub fn new(dataset_file: String, index_path_prefix: String) -> ANNResult { + let pq_storage: PQStorage = PQStorage::new( + &(index_path_prefix.clone() + ".bin_pq_pivots.bin"), + &(index_path_prefix.clone() + ".bin_pq_compressed.bin"), + &dataset_file, + )?; + + Ok(DiskIndexStorage { + dataset_file, + index_path_prefix, + _marker: PhantomData, + pq_storage, + }) + } + + pub fn get_pq_storage(&mut self) -> &mut PQStorage { + &mut self.pq_storage + } + + pub fn dataset_file(&self) -> &String { + &self.dataset_file + } + + pub fn index_path_prefix(&self) -> &String { + &self.index_path_prefix + } + + /// Create disk layout + /// Sector #1: disk_layout_meta + /// Sector #n: num_nodes_per_sector nodes + /// Each node's layout: {full precision vector:[T; DIM]}{num_nbrs: u32}{neighbors: [u32; num_nbrs]} + /// # Arguments + /// * `dataset_file` - dataset file containing full precision vectors + /// * `mem_index_file` - in-memory index graph file + /// * `disk_layout_file` - output disk layout file + pub fn create_disk_layout(&self) -> ANNResult<()> { + let mem_index_file = self.mem_index_file(); + let disk_layout_file = self.disk_index_file(); + + // amount to read or write in one shot + let read_blk_size = 64 * 1024 * 1024; + let write_blk_size = read_blk_size; + let mut dataset_reader = CachedReader::new(self.dataset_file.as_str(), read_blk_size)?; + + let num_pts = dataset_reader.read_u32()? as u64; + let dims = dataset_reader.read_u32()? as u64; + + // Create cached reader + writer + let actual_file_size = get_file_size(mem_index_file.as_str())?; + println!("Vamana index file size={}", actual_file_size); + + let mut vamana_reader = File::open(mem_index_file)?; + let mut diskann_writer = CachedWriter::new(disk_layout_file.as_str(), write_blk_size)?; + + let index_file_size = vamana_reader.read_u64::()?; + if index_file_size != actual_file_size { + println!( + "Vamana Index file size does not match expected size per meta-data. file size from file: {}, actual file size: {}", + index_file_size, actual_file_size + ); + } + + let max_degree = vamana_reader.read_u32::()?; + let medoid = vamana_reader.read_u32::()?; + let vamana_frozen_num = vamana_reader.read_u64::()?; + + let mut vamana_frozen_loc = 0; + if vamana_frozen_num == 1 { + vamana_frozen_loc = medoid; + } + + let max_node_len = ((max_degree as u64 + 1) * (mem::size_of::() as u64)) + + (dims * (mem::size_of::() as u64)); + let num_nodes_per_sector = (SECTOR_LEN as u64) / max_node_len; + + println!("medoid: {}B", medoid); + println!("max_node_len: {}B", max_node_len); + println!("num_nodes_per_sector: {}B", num_nodes_per_sector); + + // SECTOR_LEN buffer for each sector + let mut sector_buf = vec![0u8; SECTOR_LEN]; + let mut node_buf = vec![0u8; max_node_len as usize]; + + let num_nbrs_start = (dims as usize) * mem::size_of::(); + let nbrs_buf_start = num_nbrs_start + mem::size_of::(); + + // number of sectors (1 for meta data) + let num_sectors = round_up(num_pts, num_nodes_per_sector) / num_nodes_per_sector; + let disk_index_file_size = (num_sectors + 1) * (SECTOR_LEN as u64); + + let disk_layout_meta = vec![ + num_pts, + dims, + medoid as u64, + max_node_len, + num_nodes_per_sector, + vamana_frozen_num, + vamana_frozen_loc as u64, + // append_reorder_data + // We are not supporting this. Temporarily write it into the layout so that + // we can leverage C++ query driver to test the disk index + false as u64, + disk_index_file_size, + ]; + + diskann_writer.write(§or_buf)?; + + let mut cur_node_coords = vec![0u8; (dims as usize) * mem::size_of::()]; + let mut cur_node_id = 0u64; + + for sector in 0..num_sectors { + if sector % 100_000 == 0 { + println!("Sector #{} written", sector); + } + sector_buf.fill(0); + + for sector_node_id in 0..num_nodes_per_sector { + if cur_node_id >= num_pts { + break; + } + + node_buf.fill(0); + + // read cur node's num_nbrs + let num_nbrs = vamana_reader.read_u32::()?; + + // sanity checks on num_nbrs + debug_assert!(num_nbrs > 0); + debug_assert!(num_nbrs <= max_degree); + + // write coords of node first + dataset_reader.read(&mut cur_node_coords)?; + node_buf[..cur_node_coords.len()].copy_from_slice(&cur_node_coords); + + // write num_nbrs + LittleEndian::write_u32( + &mut node_buf[num_nbrs_start..(num_nbrs_start + mem::size_of::())], + num_nbrs, + ); + + // write neighbors + let nbrs_buf = &mut node_buf[nbrs_buf_start + ..(nbrs_buf_start + (num_nbrs as usize) * mem::size_of::())]; + vamana_reader.read_exact(nbrs_buf)?; + + // get offset into sector_buf + let sector_node_buf_start = (sector_node_id * max_node_len) as usize; + let sector_node_buf = &mut sector_buf + [sector_node_buf_start..(sector_node_buf_start + max_node_len as usize)]; + sector_node_buf.copy_from_slice(&node_buf[..(max_node_len as usize)]); + + cur_node_id += 1; + } + + // flush sector to disk + diskann_writer.write(§or_buf)?; + } + + diskann_writer.flush()?; + save_bin_u64( + disk_layout_file.as_str(), + &disk_layout_meta, + disk_layout_meta.len(), + 1, + 0, + )?; + + Ok(()) + } + + pub fn index_build_cleanup(&self) -> ANNResult<()> { + fs::remove_file(self.mem_index_file())?; + Ok(()) + } + + pub fn gen_query_warmup_data(&self, sampling_rate: f64) -> ANNResult<()> { + gen_sample_data::( + &self.dataset_file, + &self.warmup_query_prefix(), + sampling_rate, + )?; + Ok(()) + } + + /// Load pre-trained pivot table + pub fn load_pq_pivots_bin( + &self, + num_pq_chunks: &usize, + ) -> ANNResult { + let pq_pivots_path = &self.pq_pivot_file(); + if !file_exists(pq_pivots_path) { + return Err(ANNError::log_pq_error( + "ERROR: PQ k-means pivot file not found.".to_string(), + )); + } + + let (data, offset_num, offset_dim) = load_bin::(pq_pivots_path, 0)?; + let file_offset_data = convert_types_u64_usize(&data, offset_num, offset_dim); + if offset_num != 4 { + let error_message = format!("Error reading pq_pivots file {}. Offsets don't contain correct metadata, # offsets = {}, but expecting 4.", pq_pivots_path, offset_num); + return Err(ANNError::log_pq_error(error_message)); + } + + let (data, pivot_num, dim) = load_bin::(pq_pivots_path, file_offset_data[0])?; + let pq_table = data.to_vec(); + if pivot_num != NUM_PQ_CENTROIDS { + let error_message = format!( + "Error reading pq_pivots file {}. file_num_centers = {}, but expecting {} centers.", + pq_pivots_path, pivot_num, NUM_PQ_CENTROIDS + ); + return Err(ANNError::log_pq_error(error_message)); + } + + let (data, centroid_dim, nc) = load_bin::(pq_pivots_path, file_offset_data[1])?; + let centroids = data.to_vec(); + if centroid_dim != dim || nc != 1 { + let error_message = format!("Error reading pq_pivots file {}. file_dim = {}, file_cols = {} but expecting {} entries in 1 dimension.", pq_pivots_path, centroid_dim, nc, dim); + return Err(ANNError::log_pq_error(error_message)); + } + + let (data, chunk_offset_num, nc) = load_bin::(pq_pivots_path, file_offset_data[2])?; + let chunk_offsets = convert_types_u32_usize(&data, chunk_offset_num, nc); + if chunk_offset_num != num_pq_chunks + 1 || nc != 1 { + let error_message = format!("Error reading pq_pivots file at chunk offsets; file has nr={}, nc={} but expecting nr={} and nc=1.", chunk_offset_num, nc, num_pq_chunks + 1); + return Err(ANNError::log_pq_error(error_message)); + } + + Ok(PQPivotData { + dim, + pq_table, + centroids, + chunk_offsets + }) + } + + fn mem_index_file(&self) -> String { + self.index_path_prefix.clone() + "_mem.index" + } + + fn disk_index_file(&self) -> String { + self.index_path_prefix.clone() + "_disk.index" + } + + fn warmup_query_prefix(&self) -> String { + self.index_path_prefix.clone() + "_sample" + } + + pub fn pq_pivot_file(&self) -> String { + self.index_path_prefix.clone() + ".bin_pq_pivots.bin" + } + + pub fn compressed_pq_pivot_file(&self) -> String { + self.index_path_prefix.clone() + ".bin_pq_compressed.bin" + } +} + +#[cfg(test)] +mod disk_index_storage_test { + use std::fs; + + use crate::test_utils::get_test_file_path; + + use super::*; + + const TEST_DATA_FILE: &str = "tests/data/siftsmall_learn_256pts.fbin"; + const DISK_INDEX_PATH_PREFIX: &str = "tests/data/disk_index_siftsmall_learn_256pts_R4_L50_A1.2"; + const TRUTH_DISK_LAYOUT: &str = + "tests/data/truth_disk_index_siftsmall_learn_256pts_R4_L50_A1.2_disk.index"; + + #[test] + fn create_disk_layout_test() { + let storage = DiskIndexStorage::::new( + get_test_file_path(TEST_DATA_FILE), + get_test_file_path(DISK_INDEX_PATH_PREFIX), + ).unwrap(); + storage.create_disk_layout().unwrap(); + + let disk_layout_file = storage.disk_index_file(); + let rust_disk_layout = fs::read(disk_layout_file.as_str()).unwrap(); + let truth_disk_layout = fs::read(get_test_file_path(TRUTH_DISK_LAYOUT).as_str()).unwrap(); + + assert!(rust_disk_layout == truth_disk_layout); + + fs::remove_file(disk_layout_file.as_str()).expect("Failed to delete file"); + } + + #[test] + fn load_pivot_test() { + let dim: usize = 128; + let num_pq_chunk: usize = 1; + let pivot_file_prefix: &str = "tests/data/siftsmall_learn"; + let storage = DiskIndexStorage::::new( + get_test_file_path(TEST_DATA_FILE), + pivot_file_prefix.to_string(), + ).unwrap(); + + let pq_pivot_data = + storage.load_pq_pivots_bin(&num_pq_chunk).unwrap(); + + assert_eq!(pq_pivot_data.pq_table.len(), NUM_PQ_CENTROIDS * dim); + assert_eq!(pq_pivot_data.centroids.len(), dim); + + assert_eq!(pq_pivot_data.chunk_offsets[0], 0); + assert_eq!(pq_pivot_data.chunk_offsets[1], dim); + assert_eq!(pq_pivot_data.chunk_offsets.len(), num_pq_chunk + 1); + } + + #[test] + #[should_panic(expected = "ERROR: PQ k-means pivot file not found.")] + fn load_pivot_file_not_exist_test() { + let num_pq_chunk: usize = 1; + let pivot_file_prefix: &str = "tests/data/siftsmall_learn_file_not_exist"; + let storage = DiskIndexStorage::::new( + get_test_file_path(TEST_DATA_FILE), + pivot_file_prefix.to_string(), + ).unwrap(); + let _ = storage.load_pq_pivots_bin(&num_pq_chunk).unwrap(); + } +} diff --git a/rust/diskann/src/storage/mod.rs b/rust/diskann/src/storage/mod.rs new file mode 100644 index 000000000..03c5b8e82 --- /dev/null +++ b/rust/diskann/src/storage/mod.rs @@ -0,0 +1,12 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +mod disk_index_storage; +pub use disk_index_storage::*; + +mod disk_graph_storage; +pub use disk_graph_storage::*; + +mod pq_storage; +pub use pq_storage::*; diff --git a/rust/diskann/src/storage/pq_storage.rs b/rust/diskann/src/storage/pq_storage.rs new file mode 100644 index 000000000..b1d3fa05a --- /dev/null +++ b/rust/diskann/src/storage/pq_storage.rs @@ -0,0 +1,367 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use byteorder::{LittleEndian, ReadBytesExt}; +use rand::distributions::{Distribution, Uniform}; +use std::fs::File; +use std::io::{Read, Seek, SeekFrom, Write}; +use std::mem; + +use crate::common::{ANNError, ANNResult}; +use crate::utils::CachedReader; +use crate::utils::{ + convert_types_u32_usize, convert_types_u64_usize, convert_types_usize_u32, + convert_types_usize_u64, convert_types_usize_u8, save_bin_f32, save_bin_u32, save_bin_u64, +}; +use crate::utils::{file_exists, load_bin, open_file_to_write, METADATA_SIZE}; + +#[derive(Debug)] +pub struct PQStorage { + /// Pivot table path + pivot_file: String, + + /// Compressed pivot path + compressed_pivot_file: String, + + /// Data used to construct PQ table and PQ compressed table + pq_data_file: String, + + /// PQ data reader + pq_data_file_reader: File, +} + +impl PQStorage { + pub fn new( + pivot_file: &str, + compressed_pivot_file: &str, + pq_data_file: &str, + ) -> std::io::Result { + let pq_data_file_reader = File::open(pq_data_file)?; + Ok(Self { + pivot_file: pivot_file.to_string(), + compressed_pivot_file: compressed_pivot_file.to_string(), + pq_data_file: pq_data_file.to_string(), + pq_data_file_reader, + }) + } + + pub fn write_compressed_pivot_metadata(&self, npts: i32, pq_chunk: i32) -> std::io::Result<()> { + let mut writer = open_file_to_write(&self.compressed_pivot_file)?; + writer.write_all(&npts.to_le_bytes())?; + writer.write_all(&pq_chunk.to_le_bytes())?; + Ok(()) + } + + pub fn write_compressed_pivot_data( + &self, + compressed_base: &[usize], + num_centers: usize, + block_size: usize, + num_pq_chunks: usize, + ) -> std::io::Result<()> { + let mut writer = open_file_to_write(&self.compressed_pivot_file)?; + writer.seek(SeekFrom::Start((std::mem::size_of::() * 2) as u64))?; + if num_centers > 256 { + writer.write_all(unsafe { + std::slice::from_raw_parts( + compressed_base.as_ptr() as *const u8, + block_size * num_pq_chunks * std::mem::size_of::(), + ) + })?; + } else { + let compressed_base_u8 = + convert_types_usize_u8(compressed_base, block_size, num_pq_chunks); + writer.write_all(&compressed_base_u8)?; + } + Ok(()) + } + + pub fn write_pivot_data( + &self, + full_pivot_data: &[f32], + centroid: &[f32], + chunk_offsets: &[usize], + num_centers: usize, + dim: usize, + ) -> std::io::Result<()> { + let mut cumul_bytes: Vec = vec![0; 4]; + cumul_bytes[0] = METADATA_SIZE; + cumul_bytes[1] = cumul_bytes[0] + + save_bin_f32( + &self.pivot_file, + full_pivot_data, + num_centers, + dim, + cumul_bytes[0], + )?; + cumul_bytes[2] = + cumul_bytes[1] + save_bin_f32(&self.pivot_file, centroid, dim, 1, cumul_bytes[1])?; + + // Because the writer only can write u32, u64 but not usize, so we need to convert the type first. + let chunk_offsets_u64 = convert_types_usize_u32(chunk_offsets, chunk_offsets.len(), 1); + cumul_bytes[3] = cumul_bytes[2] + + save_bin_u32( + &self.pivot_file, + &chunk_offsets_u64, + chunk_offsets.len(), + 1, + cumul_bytes[2], + )?; + + let cumul_bytes_u64 = convert_types_usize_u64(&cumul_bytes, 4, 1); + save_bin_u64(&self.pivot_file, &cumul_bytes_u64, cumul_bytes.len(), 1, 0)?; + + Ok(()) + } + + pub fn pivot_data_exist(&self) -> bool { + file_exists(&self.pivot_file) + } + + pub fn read_pivot_metadata(&self) -> std::io::Result<(usize, usize)> { + let (_, file_num_centers, file_dim) = load_bin::(&self.pivot_file, METADATA_SIZE)?; + Ok((file_num_centers, file_dim)) + } + + pub fn load_pivot_data( + &self, + num_pq_chunks: &usize, + num_centers: &usize, + dim: &usize, + ) -> ANNResult<(Vec, Vec, Vec)> { + // Load file offset data. File saved as offset data(4*1) -> pivot data(centroid num*dim) -> centroid of dim data(dim*1) -> chunk offset data(chunksize+1*1) + // Because we only can write u64 rather than usize, so the file stored as u64 type. Need to convert to usize when use. + let (data, offset_num, nc) = load_bin::(&self.pivot_file, 0)?; + let file_offset_data = convert_types_u64_usize(&data, offset_num, nc); + if offset_num != 4 { + let error_message = format!("Error reading pq_pivots file {}. Offsets don't contain correct metadata, # offsets = {}, but expecting 4.", &self.pivot_file, offset_num); + return Err(ANNError::log_pq_error(error_message)); + } + + let (data, pivot_num, pivot_dim) = load_bin::(&self.pivot_file, file_offset_data[0])?; + let full_pivot_data = data; + if pivot_num != *num_centers || pivot_dim != *dim { + let error_message = format!("Error reading pq_pivots file {}. file_num_centers = {}, file_dim = {} but expecting {} centers in {} dimensions.", &self.pivot_file, pivot_num, pivot_dim, num_centers, dim); + return Err(ANNError::log_pq_error(error_message)); + } + + let (data, centroid_dim, nc) = load_bin::(&self.pivot_file, file_offset_data[1])?; + let centroid = data; + if centroid_dim != *dim || nc != 1 { + let error_message = format!("Error reading pq_pivots file {}. file_dim = {}, file_cols = {} but expecting {} entries in 1 dimension.", &self.pivot_file, centroid_dim, nc, dim); + return Err(ANNError::log_pq_error(error_message)); + } + + let (data, chunk_offset_number, nc) = + load_bin::(&self.pivot_file, file_offset_data[2])?; + let chunk_offsets = convert_types_u32_usize(&data, chunk_offset_number, nc); + if chunk_offset_number != *num_pq_chunks + 1 || nc != 1 { + let error_message = format!("Error reading pq_pivots file at chunk offsets; file has nr={}, nc={} but expecting nr={} and nc=1.", chunk_offset_number, nc, num_pq_chunks + 1); + return Err(ANNError::log_pq_error(error_message)); + } + Ok((full_pivot_data, centroid, chunk_offsets)) + } + + pub fn read_pq_data_metadata(&mut self) -> std::io::Result<(usize, usize)> { + let npts_i32 = self.pq_data_file_reader.read_i32::()?; + let dim_i32 = self.pq_data_file_reader.read_i32::()?; + let num_points = npts_i32 as usize; + let dim = dim_i32 as usize; + Ok((num_points, dim)) + } + + pub fn read_pq_block_data( + &mut self, + cur_block_size: usize, + dim: usize, + ) -> std::io::Result> { + let mut buf = vec![0u8; cur_block_size * dim * std::mem::size_of::()]; + self.pq_data_file_reader.read_exact(&mut buf)?; + + let ptr = buf.as_ptr() as *const T; + let block_data = unsafe { std::slice::from_raw_parts(ptr, cur_block_size * dim) }; + Ok(block_data.to_vec()) + } + + /// streams data from the file, and samples each vector with probability p_val + /// and returns a matrix of size slice_size* ndims as floating point type. + /// the slice_size and ndims are set inside the function. + /// # Arguments + /// * `file_name` - filename where the data is + /// * `p_val` - possibility to sample data + /// * `sampled_vectors` - sampled vector chose by p_val possibility + /// * `slice_size` - how many sampled data return + /// * `dim` - each sample data dimension + pub fn gen_random_slice>( + &self, + mut p_val: f64, + ) -> ANNResult<(Vec, usize, usize)> { + let read_blk_size = 64 * 1024 * 1024; + let mut reader = CachedReader::new(&self.pq_data_file, read_blk_size)?; + + let npts = reader.read_u32()? as usize; + let dim = reader.read_u32()? as usize; + let mut sampled_vectors: Vec = Vec::new(); + let mut slice_size = 0; + p_val = if p_val < 1f64 { p_val } else { 1f64 }; + + let mut generator = rand::thread_rng(); + let distribution = Uniform::from(0.0..1.0); + + for _ in 0..npts { + let mut cur_vector_bytes = vec![0u8; dim * mem::size_of::()]; + reader.read(&mut cur_vector_bytes)?; + let random_value = distribution.sample(&mut generator); + if random_value < p_val { + let ptr = cur_vector_bytes.as_ptr() as *const T; + let cur_vector_t = unsafe { std::slice::from_raw_parts(ptr, dim) }; + sampled_vectors.extend(cur_vector_t.iter().map(|&t| t.into())); + slice_size += 1; + } + } + + Ok((sampled_vectors, slice_size, dim)) + } +} + +#[cfg(test)] +mod pq_storage_tests { + use rand::Rng; + + use super::*; + use crate::utils::gen_random_slice; + + const DATA_FILE: &str = "tests/data/siftsmall_learn.bin"; + const PQ_PIVOT_PATH: &str = "tests/data/siftsmall_learn.bin_pq_pivots.bin"; + const PQ_COMPRESSED_PATH: &str = "tests/data/empty_pq_compressed.bin"; + + #[test] + fn new_test() { + let result = PQStorage::new(PQ_PIVOT_PATH, PQ_COMPRESSED_PATH, DATA_FILE); + assert!(result.is_ok()); + } + + #[test] + fn write_compressed_pivot_metadata_test() { + let compress_pivot_path = "write_compressed_pivot_metadata_test.bin"; + let result = PQStorage::new(PQ_PIVOT_PATH, compress_pivot_path, DATA_FILE).unwrap(); + + _ = result.write_compressed_pivot_metadata(100, 20); + let mut result_reader = File::open(compress_pivot_path).unwrap(); + let npts_i32 = result_reader.read_i32::().unwrap(); + let dim_i32 = result_reader.read_i32::().unwrap(); + + assert_eq!(npts_i32, 100); + assert_eq!(dim_i32, 20); + + std::fs::remove_file(compress_pivot_path).unwrap(); + } + + #[test] + fn write_compressed_pivot_data_test() { + let compress_pivot_path = "write_compressed_pivot_data_test.bin"; + let result = PQStorage::new(PQ_PIVOT_PATH, compress_pivot_path, DATA_FILE).unwrap(); + + let mut rng = rand::thread_rng(); + + let num_centers = 256; + let block_size = 4; + let num_pq_chunks = 2; + let compressed_base: Vec = (0..block_size * num_pq_chunks) + .map(|_| rng.gen_range(0..num_centers)) + .collect(); + _ = result.write_compressed_pivot_data( + &compressed_base, + num_centers, + block_size, + num_pq_chunks, + ); + + let mut result_reader = File::open(compress_pivot_path).unwrap(); + _ = result_reader.read_i32::().unwrap(); + _ = result_reader.read_i32::().unwrap(); + let mut buf = vec![0u8; block_size * num_pq_chunks * std::mem::size_of::()]; + result_reader.read_exact(&mut buf).unwrap(); + + let ptr = buf.as_ptr() as *const u8; + let block_data = unsafe { std::slice::from_raw_parts(ptr, block_size * num_pq_chunks) }; + + for index in 0..block_data.len() { + assert_eq!(compressed_base[index], block_data[index] as usize); + } + std::fs::remove_file(compress_pivot_path).unwrap(); + } + + #[test] + fn pivot_data_exist_test() { + let result = PQStorage::new(PQ_PIVOT_PATH, PQ_COMPRESSED_PATH, DATA_FILE).unwrap(); + assert!(result.pivot_data_exist()); + + let pivot_path = "not_exist_pivot_path.bin"; + let result = PQStorage::new(pivot_path, PQ_COMPRESSED_PATH, DATA_FILE).unwrap(); + assert!(!result.pivot_data_exist()); + } + + #[test] + fn read_pivot_metadata_test() { + let result = PQStorage::new(PQ_PIVOT_PATH, PQ_COMPRESSED_PATH, DATA_FILE).unwrap(); + let (npt, dim) = result.read_pivot_metadata().unwrap(); + + assert_eq!(npt, 256); + assert_eq!(dim, 128); + } + + #[test] + fn load_pivot_data_test() { + let result = PQStorage::new(PQ_PIVOT_PATH, PQ_COMPRESSED_PATH, DATA_FILE).unwrap(); + let (pq_pivot_data, centroids, chunk_offsets) = + result.load_pivot_data(&1, &256, &128).unwrap(); + + assert_eq!(pq_pivot_data.len(), 256 * 128); + assert_eq!(centroids.len(), 128); + assert_eq!(chunk_offsets.len(), 2); + } + + #[test] + fn read_pq_data_metadata_test() { + let mut result = PQStorage::new(PQ_PIVOT_PATH, PQ_COMPRESSED_PATH, DATA_FILE).unwrap(); + let (npt, dim) = result.read_pq_data_metadata().unwrap(); + + assert_eq!(npt, 25000); + assert_eq!(dim, 128); + } + + #[test] + fn gen_random_slice_test() { + let file_name = "gen_random_slice_test.bin"; + //npoints=2, dim=8 + let data: [u8; 72] = [ + 2, 0, 0, 0, 8, 0, 0, 0, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x40, 0x40, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40, + 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, + 0x20, 0x41, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41, 0x00, 0x00, 0x50, 0x41, + 0x00, 0x00, 0x60, 0x41, 0x00, 0x00, 0x70, 0x41, 0x00, 0x00, 0x80, 0x41, + ]; + std::fs::write(file_name, data).expect("Failed to write sample file"); + + let (sampled_vectors, slice_size, ndims) = + gen_random_slice::(file_name, 1f64).unwrap(); + let mut start = 8; + (0..sampled_vectors.len()).for_each(|i| { + assert_eq!(sampled_vectors[i].to_le_bytes(), data[start..start + 4]); + start += 4; + }); + assert_eq!(sampled_vectors.len(), 16); + assert_eq!(slice_size, 2); + assert_eq!(ndims, 8); + + let (sampled_vectors, slice_size, ndims) = + gen_random_slice::(file_name, 0f64).unwrap(); + assert_eq!(sampled_vectors.len(), 0); + assert_eq!(slice_size, 0); + assert_eq!(ndims, 8); + + std::fs::remove_file(file_name).expect("Failed to delete file"); + } +} diff --git a/rust/diskann/src/test_utils/inmem_index_initialization.rs b/rust/diskann/src/test_utils/inmem_index_initialization.rs new file mode 100644 index 000000000..db3b58179 --- /dev/null +++ b/rust/diskann/src/test_utils/inmem_index_initialization.rs @@ -0,0 +1,74 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use vector::Metric; + +use crate::index::InmemIndex; +use crate::model::configuration::index_write_parameters::IndexWriteParametersBuilder; +use crate::model::{IndexConfiguration}; +use crate::model::vertex::DIM_128; +use crate::utils::{file_exists, load_metadata_from_file}; + +use super::get_test_file_path; + +// f32, 128 DIM and 256 points source data +const TEST_DATA_FILE: &str = "tests/data/siftsmall_learn_256pts.fbin"; +const NUM_POINTS_TO_LOAD: usize = 256; + +pub fn create_index_with_test_data() -> InmemIndex { + let index_write_parameters = IndexWriteParametersBuilder::new(50, 4).with_alpha(1.2).build(); + let config = IndexConfiguration::new( + Metric::L2, + 128, + 128, + 256, + false, + 0, + false, + 0, + 1.0f32, + index_write_parameters); + let mut index: InmemIndex = InmemIndex::new(config).unwrap(); + + build_test_index(&mut index, get_test_file_path(TEST_DATA_FILE).as_str(), NUM_POINTS_TO_LOAD); + + index.start = index.dataset.calculate_medoid_point_id().unwrap(); + + index +} + +fn build_test_index(index: &mut InmemIndex, filename: &str, num_points_to_load: usize) { + if !file_exists(filename) { + panic!("ERROR: Data file {} does not exist.", filename); + } + + let (file_num_points, file_dim) = load_metadata_from_file(filename).unwrap(); + if file_num_points > index.configuration.max_points { + panic!( + "ERROR: Driver requests loading {} points and file has {} points, + but index can support only {} points as specified in configuration.", + num_points_to_load, file_num_points, index.configuration.max_points + ); + } + + if num_points_to_load > file_num_points { + panic!( + "ERROR: Driver requests loading {} points and file has only {} points.", + num_points_to_load, file_num_points + ); + } + + if file_dim != index.configuration.dim { + panic!( + "ERROR: Driver requests loading {} dimension, but file has {} dimension.", + index.configuration.dim, file_dim + ); + } + + index.dataset.build_from_file(filename, num_points_to_load).unwrap(); + + println!("Using only first {} from file.", num_points_to_load); + + index.num_active_pts = num_points_to_load; +} diff --git a/rust/diskann/src/test_utils/mod.rs b/rust/diskann/src/test_utils/mod.rs new file mode 100644 index 000000000..fc8de5f30 --- /dev/null +++ b/rust/diskann/src/test_utils/mod.rs @@ -0,0 +1,11 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +pub mod inmem_index_initialization; + +/// test files should be placed under tests folder +pub fn get_test_file_path(relative_path: &str) -> String { + format!("{}/{}", env!("CARGO_MANIFEST_DIR"), relative_path) +} + diff --git a/rust/diskann/src/utils/bit_vec_extension.rs b/rust/diskann/src/utils/bit_vec_extension.rs new file mode 100644 index 000000000..9571a726e --- /dev/null +++ b/rust/diskann/src/utils/bit_vec_extension.rs @@ -0,0 +1,45 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::cmp::Ordering; + +use bit_vec::BitVec; + +pub trait BitVecExtension { + fn resize(&mut self, new_len: usize, value: bool); +} + +impl BitVecExtension for BitVec { + fn resize(&mut self, new_len: usize, value: bool) { + let old_len = self.len(); + match new_len.cmp(&old_len) { + Ordering::Less => self.truncate(new_len), + Ordering::Greater => self.grow(new_len - old_len, value), + Ordering::Equal => {} + } + } +} + +#[cfg(test)] +mod bit_vec_extension_test { + use super::*; + + #[test] + fn resize_test() { + let mut bitset = BitVec::new(); + + bitset.resize(10, false); + assert_eq!(bitset.len(), 10); + assert!(bitset.none()); + + bitset.resize(11, true); + assert_eq!(bitset.len(), 11); + assert!(bitset[10]); + + bitset.resize(5, false); + assert_eq!(bitset.len(), 5); + assert!(bitset.none()); + } +} + diff --git a/rust/diskann/src/utils/cached_reader.rs b/rust/diskann/src/utils/cached_reader.rs new file mode 100644 index 000000000..1a21f1a77 --- /dev/null +++ b/rust/diskann/src/utils/cached_reader.rs @@ -0,0 +1,160 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::fs::File; +use std::io::{Seek, Read}; + +use crate::common::{ANNResult, ANNError}; + +/// Sequential cached reads +pub struct CachedReader { + /// File reader + reader: File, + + /// # bytes to cache in one shot read + cache_size: u64, + + /// Underlying buf for cache + cache_buf: Vec, + + /// Offset into cache_buf for cur_pos + cur_off: u64, + + /// File size + fsize: u64, +} + +impl CachedReader { + pub fn new(filename: &str, cache_size: u64) -> std::io::Result { + let mut reader = File::open(filename)?; + let metadata = reader.metadata()?; + let fsize = metadata.len(); + + let cache_size = cache_size.min(fsize); + let mut cache_buf = vec![0; cache_size as usize]; + reader.read_exact(&mut cache_buf)?; + println!("Opened: {}, size: {}, cache_size: {}", filename, fsize, cache_size); + + Ok(Self { + reader, + cache_size, + cache_buf, + cur_off: 0, + fsize, + }) + } + + pub fn get_file_size(&self) -> u64 { + self.fsize + } + + pub fn read(&mut self, read_buf: &mut [u8]) -> ANNResult<()> { + let n_bytes = read_buf.len() as u64; + if n_bytes <= (self.cache_size - self.cur_off) { + // case 1: cache contains all data + read_buf.copy_from_slice(&self.cache_buf[(self.cur_off as usize)..(self.cur_off as usize + n_bytes as usize)]); + self.cur_off += n_bytes; + } else { + // case 2: cache contains some data + let cached_bytes = self.cache_size - self.cur_off; + if n_bytes - cached_bytes > self.fsize - self.reader.stream_position()? { + return Err(ANNError::log_index_error(format!( + "Reading beyond end of file, n_bytes: {} cached_bytes: {} fsize: {} current pos: {}", + n_bytes, cached_bytes, self.fsize, self.reader.stream_position()?)) + ); + } + + read_buf[..cached_bytes as usize].copy_from_slice(&self.cache_buf[self.cur_off as usize..]); + // go to disk and fetch more data + self.reader.read_exact(&mut read_buf[cached_bytes as usize..])?; + // reset cur off + self.cur_off = self.cache_size; + + let size_left = self.fsize - self.reader.stream_position()?; + if size_left >= self.cache_size { + self.reader.read_exact(&mut self.cache_buf)?; + self.cur_off = 0; + } + // note that if size_left < cache_size, then cur_off = cache_size, + // so subsequent reads will all be directly from file + } + Ok(()) + } + + pub fn read_u32(&mut self) -> ANNResult { + let mut bytes = [0u8; 4]; + self.read(&mut bytes)?; + Ok(u32::from_le_bytes(bytes)) + } +} + +#[cfg(test)] +mod cached_reader_test { + use std::fs; + + use super::*; + + #[test] + fn cached_reader_works() { + let file_name = "cached_reader_works_test.bin"; + //npoints=2, dim=8, 2 vectors [1.0;8] [2.0;8] + let data: [u8; 72] = [2, 0, 1, 2, 8, 0, 1, 3, + 0x00, 0x01, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41, + 0x00, 0x00, 0x50, 0x41, 0x00, 0x00, 0x60, 0x41, 0x00, 0x00, 0x70, 0x41, 0x00, 0x11, 0x80, 0x41]; + std::fs::write(file_name, data).expect("Failed to write sample file"); + + let mut reader = CachedReader::new(file_name, 8).unwrap(); + assert_eq!(reader.get_file_size(), 72); + assert_eq!(reader.cache_size, 8); + + let mut all_from_cache_buf = vec![0; 4]; + reader.read(all_from_cache_buf.as_mut_slice()).unwrap(); + assert_eq!(all_from_cache_buf, [2, 0, 1, 2]); + assert_eq!(reader.cur_off, 4); + + let mut partial_from_cache_buf = vec![0; 6]; + reader.read(partial_from_cache_buf.as_mut_slice()).unwrap(); + assert_eq!(partial_from_cache_buf, [8, 0, 1, 3, 0x00, 0x01]); + assert_eq!(reader.cur_off, 0); + + let mut over_cache_size_buf = vec![0; 60]; + reader.read(over_cache_size_buf.as_mut_slice()).unwrap(); + assert_eq!( + over_cache_size_buf, + [0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41, + 0x00, 0x00, 0x50, 0x41, 0x00, 0x00, 0x60, 0x41, 0x00, 0x00, 0x70, 0x41, 0x00, 0x11] + ); + + let mut remaining_less_than_cache_size_buf = vec![0; 2]; + reader.read(remaining_less_than_cache_size_buf.as_mut_slice()).unwrap(); + assert_eq!(remaining_less_than_cache_size_buf, [0x80, 0x41]); + assert_eq!(reader.cur_off, reader.cache_size); + + fs::remove_file(file_name).expect("Failed to delete file"); + } + + #[test] + #[should_panic(expected = "n_bytes: 73 cached_bytes: 8 fsize: 72 current pos: 8")] + fn failed_for_reading_beyond_end_of_file() { + let file_name = "failed_for_reading_beyond_end_of_file_test.bin"; + //npoints=2, dim=8, 2 vectors [1.0;8] [2.0;8] + let data: [u8; 72] = [2, 0, 1, 2, 8, 0, 1, 3, + 0x00, 0x01, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41, + 0x00, 0x00, 0x50, 0x41, 0x00, 0x00, 0x60, 0x41, 0x00, 0x00, 0x70, 0x41, 0x00, 0x11, 0x80, 0x41]; + std::fs::write(file_name, data).expect("Failed to write sample file"); + + let mut reader = CachedReader::new(file_name, 8).unwrap(); + fs::remove_file(file_name).expect("Failed to delete file"); + + let mut over_size_buf = vec![0; 73]; + reader.read(over_size_buf.as_mut_slice()).unwrap(); + } +} + diff --git a/rust/diskann/src/utils/cached_writer.rs b/rust/diskann/src/utils/cached_writer.rs new file mode 100644 index 000000000..d3929bef2 --- /dev/null +++ b/rust/diskann/src/utils/cached_writer.rs @@ -0,0 +1,142 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::io::{Write, Seek, SeekFrom}; +use std::fs::{OpenOptions, File}; +use std::path::Path; + +pub struct CachedWriter { + /// File writer + writer: File, + + /// # bytes to cache for one shot write + cache_size: u64, + + /// Underlying buf for cache + cache_buf: Vec, + + /// Offset into cache_buf for cur_pos + cur_off: u64, + + /// File size + fsize: u64, +} + +impl CachedWriter { + pub fn new(filename: &str, cache_size: u64) -> std::io::Result { + let writer = OpenOptions::new() + .write(true) + .create(true) + .open(Path::new(filename))?; + + if cache_size == 0 { + return Err(std::io::Error::new(std::io::ErrorKind::Other, "Cache size must be greater than 0")); + } + + println!("Opened: {}, cache_size: {}", filename, cache_size); + Ok(Self { + writer, + cache_size, + cache_buf: vec![0; cache_size as usize], + cur_off: 0, + fsize: 0, + }) + } + + pub fn flush(&mut self) -> std::io::Result<()> { + // dump any remaining data in memory + if self.cur_off > 0 { + self.flush_cache()?; + } + + self.writer.flush()?; + println!("Finished writing {}B", self.fsize); + Ok(()) + } + + pub fn get_file_size(&self) -> u64 { + self.fsize + } + + /// Writes n_bytes from write_buf to the underlying cache + pub fn write(&mut self, write_buf: &[u8]) -> std::io::Result<()> { + let n_bytes = write_buf.len() as u64; + if n_bytes <= (self.cache_size - self.cur_off) { + // case 1: cache can take all data + self.cache_buf[(self.cur_off as usize)..((self.cur_off + n_bytes) as usize)].copy_from_slice(&write_buf[..n_bytes as usize]); + self.cur_off += n_bytes; + } else { + // case 2: cache cant take all data + // go to disk and write existing cache data + self.writer.write_all(&self.cache_buf[..self.cur_off as usize])?; + self.fsize += self.cur_off; + // write the new data to disk + self.writer.write_all(write_buf)?; + self.fsize += n_bytes; + // clear cache data and reset cur_off + self.cache_buf.fill(0); + self.cur_off = 0; + } + Ok(()) + } + + pub fn reset(&mut self) -> std::io::Result<()> { + self.flush_cache()?; + self.writer.seek(SeekFrom::Start(0))?; + Ok(()) + } + + fn flush_cache(&mut self) -> std::io::Result<()> { + self.writer.write_all(&self.cache_buf[..self.cur_off as usize])?; + self.fsize += self.cur_off; + self.cache_buf.fill(0); + self.cur_off = 0; + Ok(()) + } +} + +impl Drop for CachedWriter { + fn drop(&mut self) { + let _ = self.flush(); + } +} + +#[cfg(test)] +mod cached_writer_test { + use std::fs; + + use super::*; + + #[test] + fn cached_writer_works() { + let file_name = "cached_writer_works_test.bin"; + //npoints=2, dim=8, 2 vectors [1.0;8] [2.0;8] + let data: [u8; 72] = [2, 0, 1, 2, 8, 0, 1, 3, + 0x00, 0x01, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41, + 0x00, 0x00, 0x50, 0x41, 0x00, 0x00, 0x60, 0x41, 0x00, 0x00, 0x70, 0x41, 0x00, 0x11, 0x80, 0x41]; + + let mut writer = CachedWriter::new(file_name, 8).unwrap(); + assert_eq!(writer.get_file_size(), 0); + assert_eq!(writer.cache_size, 8); + assert_eq!(writer.get_file_size(), 0); + + let cache_all_buf = &data[0..4]; + writer.write(cache_all_buf).unwrap(); + assert_eq!(&writer.cache_buf[..4], cache_all_buf); + assert_eq!(&writer.cache_buf[4..], vec![0; 4]); + assert_eq!(writer.cur_off, 4); + assert_eq!(writer.get_file_size(), 0); + + let write_all_buf = &data[4..10]; + writer.write(write_all_buf).unwrap(); + assert_eq!(writer.cache_buf, vec![0; 8]); + assert_eq!(writer.cur_off, 0); + assert_eq!(writer.get_file_size(), 10); + + fs::remove_file(file_name).expect("Failed to delete file"); + } +} + diff --git a/rust/diskann/src/utils/file_util.rs b/rust/diskann/src/utils/file_util.rs new file mode 100644 index 000000000..f187d0128 --- /dev/null +++ b/rust/diskann/src/utils/file_util.rs @@ -0,0 +1,377 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! File operations + +use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt}; +use std::{mem, io}; +use std::fs::{self, File, OpenOptions}; +use std::io::{Read, BufReader, Write, Seek, SeekFrom}; +use std::path::Path; + +use crate::model::data_store::DatasetDto; + +/// Read metadata of data file. +pub fn load_metadata_from_file(file_name: &str) -> std::io::Result<(usize, usize)> { + let file = File::open(file_name)?; + let mut reader = BufReader::new(file); + + let npoints = reader.read_i32::()? as usize; + let ndims = reader.read_i32::()? as usize; + + Ok((npoints, ndims)) +} + +/// Read the deleted vertex ids from file. +pub fn load_ids_to_delete_from_file(file_name: &str) -> std::io::Result<(usize, Vec)> { + // The first 4 bytes are the number of vector ids. + // The rest of the file are the vector ids in the format of usize. + // The vector ids are sorted in ascending order. + let mut file = File::open(file_name)?; + let num_ids = file.read_u32::()? as usize; + + let mut ids = Vec::with_capacity(num_ids); + for _ in 0..num_ids { + let id = file.read_u32::()?; + ids.push(id); + } + + Ok((num_ids, ids)) +} + +/// Copy data from file +/// # Arguments +/// * `bin_file` - filename where the data is +/// * `data` - destination dataset dto to which the data is copied +/// * `pts_offset` - offset of points. data will be loaded after this point in dataset +/// * `npts` - number of points read from bin_file +/// * `dim` - point dimension read from bin_file +/// * `rounded_dim` - rounded dimension (padding zero if it's > dim) +/// # Return +/// * `npts` - number of points read from bin_file +/// * `dim` - point dimension read from bin_file +pub fn copy_aligned_data_from_file( + bin_file: &str, + dataset_dto: DatasetDto, + pts_offset: usize, +) -> std::io::Result<(usize, usize)> { + let mut reader = File::open(bin_file)?; + + let npts = reader.read_i32::()? as usize; + let dim = reader.read_i32::()? as usize; + let rounded_dim = dataset_dto.rounded_dim; + let offset = pts_offset * rounded_dim; + + for i in 0..npts { + let data_slice = &mut dataset_dto.data[offset + i * rounded_dim..offset + i * rounded_dim + dim]; + let mut buf = vec![0u8; dim * mem::size_of::()]; + reader.read_exact(&mut buf)?; + + let ptr = buf.as_ptr() as *const T; + let temp_slice = unsafe { std::slice::from_raw_parts(ptr, dim) }; + data_slice.copy_from_slice(temp_slice); + + (i * rounded_dim + dim..i * rounded_dim + rounded_dim).for_each(|j| { + dataset_dto.data[j] = T::default(); + }); + } + + Ok((npts, dim)) +} + +/// Open a file to write +/// # Arguments +/// * `writer` - mutable File reference +/// * `file_name` - file name +#[inline] +pub fn open_file_to_write(file_name: &str) -> std::io::Result { + OpenOptions::new() + .write(true) + .create(true) + .open(Path::new(file_name)) +} + +/// Delete a file +/// # Arguments +/// * `file_name` - file name +pub fn delete_file(file_name: &str) -> std::io::Result<()> { + if file_exists(file_name) { + fs::remove_file(file_name)?; + } + + Ok(()) +} + +/// Check whether file exists or not +pub fn file_exists(filename: &str) -> bool { + std::path::Path::new(filename).exists() +} + +/// Save data to file +/// # Arguments +/// * `filename` - filename where the data is +/// * `data` - information data +/// * `npts` - number of points +/// * `ndims` - point dimension +/// * `aligned_dim` - aligned dimension +/// * `offset` - data offset in file +pub fn save_data_in_base_dimensions( + filename: &str, + data: &mut [T], + npts: usize, + ndims: usize, + aligned_dim: usize, + offset: usize, +) -> std::io::Result { + let mut writer = open_file_to_write(filename)?; + let npts_i32 = npts as i32; + let ndims_i32 = ndims as i32; + let bytes_written = 2 * std::mem::size_of::() + npts * ndims * (std::mem::size_of::()); + + writer.seek(std::io::SeekFrom::Start(offset as u64))?; + writer.write_all(&npts_i32.to_le_bytes())?; + writer.write_all(&ndims_i32.to_le_bytes())?; + let data_ptr = data.as_ptr() as *const u8; + for i in 0..npts { + let middle_offset = i * aligned_dim * std::mem::size_of::(); + let middle_slice = unsafe { std::slice::from_raw_parts(data_ptr.add(middle_offset), ndims * std::mem::size_of::()) }; + writer.write_all(middle_slice)?; + } + writer.flush()?; + Ok(bytes_written) +} + +/// Read data file +/// # Arguments +/// * `bin_file` - filename where the data is +/// * `file_offset` - data offset in file +/// * `data` - information data +/// * `npts` - number of points +/// * `ndims` - point dimension +pub fn load_bin( + bin_file: &str, + file_offset: usize) -> std::io::Result<(Vec, usize, usize)> +{ + let mut reader = File::open(bin_file)?; + reader.seek(std::io::SeekFrom::Start(file_offset as u64))?; + let npts = reader.read_i32::()? as usize; + let dim = reader.read_i32::()? as usize; + + let size = npts * dim * std::mem::size_of::(); + let mut buf = vec![0u8; size]; + reader.read_exact(&mut buf)?; + + let ptr = buf.as_ptr() as *const T; + let data = unsafe { std::slice::from_raw_parts(ptr, npts * dim)}; + + Ok((data.to_vec(), npts, dim)) +} + +/// Get file size +pub fn get_file_size(filename: &str) -> io::Result { + let reader = File::open(filename)?; + let metadata = reader.metadata()?; + Ok(metadata.len()) +} + +macro_rules! save_bin { + ($name:ident, $t:ty, $write_func:ident) => { + /// Write data into file + pub fn $name(filename: &str, data: &[$t], num_pts: usize, dims: usize, offset: usize) -> std::io::Result { + let mut writer = open_file_to_write(filename)?; + + println!("Writing bin: {}", filename); + writer.seek(SeekFrom::Start(offset as u64))?; + let num_pts_i32 = num_pts as i32; + let dims_i32 = dims as i32; + let bytes_written = num_pts * dims * mem::size_of::<$t>() + 2 * mem::size_of::(); + + writer.write_i32::(num_pts_i32)?; + writer.write_i32::(dims_i32)?; + println!("bin: #pts = {}, #dims = {}, size = {}B", num_pts, dims, bytes_written); + + for item in data.iter() { + writer.$write_func::(*item)?; + } + + writer.flush()?; + + println!("Finished writing bin."); + Ok(bytes_written) + } + }; +} + +save_bin!(save_bin_f32, f32, write_f32); +save_bin!(save_bin_u64, u64, write_u64); +save_bin!(save_bin_u32, u32, write_u32); + +#[cfg(test)] +mod file_util_test { + use crate::model::data_store::InmemDataset; + use std::fs; + use super::*; + + pub const DIM_8: usize = 8; + + #[test] + fn load_metadata_test() { + let file_name = "test_load_metadata_test.bin"; + let data = [200, 0, 0, 0, 128, 0, 0, 0]; // 200 and 128 in little endian bytes + std::fs::write(file_name, data).expect("Failed to write sample file"); + match load_metadata_from_file(file_name) { + Ok((npoints, ndims)) => { + assert!(npoints == 200); + assert!(ndims == 128); + }, + Err(_e) => {}, + } + fs::remove_file(file_name).expect("Failed to delete file"); + } + + #[test] + fn load_data_test() { + let file_name = "test_load_data_test.bin"; + //npoints=2, dim=8, 2 vectors [1.0;8] [2.0;8] + let data: [u8; 72] = [2, 0, 0, 0, 8, 0, 0, 0, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41, + 0x00, 0x00, 0x50, 0x41, 0x00, 0x00, 0x60, 0x41, 0x00, 0x00, 0x70, 0x41, 0x00, 0x00, 0x80, 0x41]; + std::fs::write(file_name, data).expect("Failed to write sample file"); + + let mut dataset = InmemDataset::::new(2, 1f32).unwrap(); + + match copy_aligned_data_from_file(file_name, dataset.into_dto(), 0) { + Ok((num_points, dim)) => { + fs::remove_file(file_name).expect("Failed to delete file"); + assert!(num_points == 2); + assert!(dim == 8); + assert!(dataset.data.len() == 16); + + let first_vertex = dataset.get_vertex(0).unwrap(); + let second_vertex = dataset.get_vertex(1).unwrap(); + + assert!(*first_vertex.vector() == [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]); + assert!(*second_vertex.vector() == [9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0]); + }, + Err(e) => { + fs::remove_file(file_name).expect("Failed to delete file"); + panic!("{}", e) + }, + } + } + + #[test] + fn open_file_to_write_test() { + let file_name = "test_open_file_to_write_test.bin"; + let mut writer = File::create(file_name).unwrap(); + let data = [200, 0, 0, 0, 128, 0, 0, 0]; + writer.write(&data).expect("Failed to write sample file"); + + let _ = open_file_to_write(file_name); + + fs::remove_file(file_name).expect("Failed to delete file"); + } + + #[test] + fn delete_file_test() { + let file_name = "test_delete_file_test.bin"; + let mut file = File::create(file_name).unwrap(); + writeln!(file, "test delete file").unwrap(); + + let result = delete_file(file_name); + + assert!(result.is_ok()); + assert!(fs::metadata(file_name).is_err()); + } + + #[test] + fn save_data_in_base_dimensions_test() { + //npoints=2, dim=8 + let mut data: [u8; 72] = [2, 0, 0, 0, 8, 0, 0, 0, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41, + 0x00, 0x00, 0x50, 0x41, 0x00, 0x00, 0x60, 0x41, 0x00, 0x00, 0x70, 0x41, 0x00, 0x00, 0x80, 0x41]; + let num_points = 2; + let dim = DIM_8; + let data_file = "save_data_in_base_dimensions_test.data"; + match save_data_in_base_dimensions(data_file, &mut data, num_points, dim, DIM_8, 0) { + Ok(num) => { + assert!(file_exists(data_file)); + assert_eq!(num, 2 * std::mem::size_of::() + num_points * dim * std::mem::size_of::()); + fs::remove_file(data_file).expect("Failed to delete file"); + }, + Err(e) => { + fs::remove_file(data_file).expect("Failed to delete file"); + panic!("{}", e) + } + } + } + + #[test] + fn save_bin_test() { + let filename = "save_bin_test"; + let data = vec![0u64, 1u64, 2u64]; + let num_pts = data.len(); + let dims = 1; + let bytes_written = save_bin_u64(filename, &data, num_pts, dims, 0).unwrap(); + assert_eq!(bytes_written, 32); + + let mut file = File::open(filename).unwrap(); + let mut buffer = vec![]; + + let npts_read = file.read_i32::().unwrap() as usize; + let dims_read = file.read_i32::().unwrap() as usize; + + file.read_to_end(&mut buffer).unwrap(); + let data_read: Vec = buffer + .chunks_exact(8) + .map(|b| u64::from_le_bytes([b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]])) + .collect(); + + std::fs::remove_file(filename).unwrap(); + + assert_eq!(num_pts, npts_read); + assert_eq!(dims, dims_read); + assert_eq!(data, data_read); + } + + #[test] + fn load_bin_test() { + let file_name = "load_bin_test"; + let data = vec![0u64, 1u64, 2u64]; + let num_pts = data.len(); + let dims = 1; + let bytes_written = save_bin_u64(file_name, &data, num_pts, dims, 0).unwrap(); + assert_eq!(bytes_written, 32); + + let (load_data, load_num_pts, load_dims) = load_bin::(file_name, 0).unwrap(); + assert_eq!(load_num_pts, num_pts); + assert_eq!(load_dims, dims); + assert_eq!(load_data, data); + std::fs::remove_file(file_name).unwrap(); + } + + #[test] + fn load_bin_offset_test() { + let offset:usize = 32; + let file_name = "load_bin_offset_test"; + let data = vec![0u64, 1u64, 2u64]; + let num_pts = data.len(); + let dims = 1; + let bytes_written = save_bin_u64(file_name, &data, num_pts, dims, offset).unwrap(); + assert_eq!(bytes_written, 32); + + let (load_data, load_num_pts, load_dims) = load_bin::(file_name, offset).unwrap(); + assert_eq!(load_num_pts, num_pts); + assert_eq!(load_dims, dims); + assert_eq!(load_data, data); + std::fs::remove_file(file_name).unwrap(); + } +} + diff --git a/rust/diskann/src/utils/hashset_u32.rs b/rust/diskann/src/utils/hashset_u32.rs new file mode 100644 index 000000000..15db687d6 --- /dev/null +++ b/rust/diskann/src/utils/hashset_u32.rs @@ -0,0 +1,46 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use hashbrown::HashSet; +use std::{hash::BuildHasherDefault, ops::{Deref, DerefMut}}; +use fxhash::FxHasher; + +lazy_static::lazy_static! { + /// Singleton hasher. + static ref HASHER: BuildHasherDefault = { + BuildHasherDefault::::default() + }; +} + +pub struct HashSetForU32 { + hashset: HashSet::>, +} + +impl HashSetForU32 { + pub fn with_capacity(capacity: usize) -> HashSetForU32 { + let hashset = HashSet::>::with_capacity_and_hasher(capacity, HASHER.clone()); + HashSetForU32 { + hashset + } + } +} + +impl Deref for HashSetForU32 { + type Target = HashSet::>; + + fn deref(&self) -> &Self::Target { + &self.hashset + } +} + +impl DerefMut for HashSetForU32 { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.hashset + } +} + diff --git a/rust/diskann/src/utils/kmeans.rs b/rust/diskann/src/utils/kmeans.rs new file mode 100644 index 000000000..d1edffad7 --- /dev/null +++ b/rust/diskann/src/utils/kmeans.rs @@ -0,0 +1,430 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Aligned allocator + +use rand::{distributions::Uniform, prelude::Distribution, thread_rng}; +use rayon::prelude::*; +use std::cmp::min; + +use crate::common::ANNResult; +use crate::utils::math_util::{calc_distance, compute_closest_centers, compute_vecs_l2sq}; + +/// Run Lloyds one iteration +/// Given data in row-major num_points * dim, and centers in row-major +/// num_centers * dim and squared lengths of ata points, output the closest +/// center to each data point, update centers, and also return inverted index. +/// If closest_centers == NULL, will allocate memory and return. +/// Similarly, if closest_docs == NULL, will allocate memory and return. +#[allow(clippy::too_many_arguments)] +fn lloyds_iter( + data: &[f32], + num_points: usize, + dim: usize, + centers: &mut [f32], + num_centers: usize, + docs_l2sq: &[f32], + mut closest_docs: &mut Vec>, + closest_center: &mut [u32], +) -> ANNResult { + let compute_residual = true; + + closest_docs.iter_mut().for_each(|doc| doc.clear()); + + compute_closest_centers( + data, + num_points, + dim, + centers, + num_centers, + 1, + closest_center, + Some(&mut closest_docs), + Some(docs_l2sq), + )?; + + centers.fill(0.0); + + centers + .par_chunks_mut(dim) + .enumerate() + .for_each(|(c, center)| { + let mut cluster_sum = vec![0.0; dim]; + for &doc_index in &closest_docs[c] { + let current = &data[doc_index * dim..(doc_index + 1) * dim]; + for (j, current_val) in current.iter().enumerate() { + cluster_sum[j] += *current_val as f64; + } + } + if !closest_docs[c].is_empty() { + for (i, sum_val) in cluster_sum.iter().enumerate() { + center[i] = (*sum_val / closest_docs[c].len() as f64) as f32; + } + } + }); + + let mut residual = 0.0; + if compute_residual { + let buf_pad: usize = 32; + let chunk_size: usize = 2 * 8192; + let nchunks = + num_points / chunk_size + (if num_points % chunk_size == 0 { 0 } else { 1 } as usize); + + let mut residuals: Vec = vec![0.0; nchunks * buf_pad]; + + residuals + .par_iter_mut() + .enumerate() + .for_each(|(chunk, res)| { + for d in (chunk * chunk_size)..min(num_points, (chunk + 1) * chunk_size) { + *res += calc_distance( + &data[d * dim..(d + 1) * dim], + ¢ers[closest_center[d] as usize * dim..], + dim, + ); + } + }); + + for chunk in 0..nchunks { + residual += residuals[chunk * buf_pad]; + } + } + + Ok(residual) +} + +/// Run Lloyds until max_reps or stopping criterion +/// If you pass NULL for closest_docs and closest_center, it will NOT return +/// the results, else it will assume appropriate allocation as closest_docs = +/// new vec [num_centers], and closest_center = new size_t[num_points] +/// Final centers are output in centers as row-major num_centers * dim. +fn run_lloyds( + data: &[f32], + num_points: usize, + dim: usize, + centers: &mut [f32], + num_centers: usize, + max_reps: usize, +) -> ANNResult<(Vec>, Vec, f32)> { + let mut residual = f32::MAX; + + let mut closest_docs = vec![Vec::new(); num_centers]; + let mut closest_center = vec![0; num_points]; + + let mut docs_l2sq = vec![0.0; num_points]; + compute_vecs_l2sq(&mut docs_l2sq, data, num_points, dim); + + let mut old_residual; + + for i in 0..max_reps { + old_residual = residual; + + residual = lloyds_iter( + data, + num_points, + dim, + centers, + num_centers, + &docs_l2sq, + &mut closest_docs, + &mut closest_center, + )?; + + if (i != 0 && (old_residual - residual) / residual < 0.00001) || (residual < f32::EPSILON) { + println!( + "Residuals unchanged: {} becomes {}. Early termination.", + old_residual, residual + ); + break; + } + } + + Ok((closest_docs, closest_center, residual)) +} + +/// Assume memory allocated for pivot_data as new float[num_centers * dim] +/// and select randomly num_centers points as pivots +fn selecting_pivots( + data: &[f32], + num_points: usize, + dim: usize, + pivot_data: &mut [f32], + num_centers: usize, +) { + let mut picked = Vec::new(); + let mut rng = thread_rng(); + let distribution = Uniform::from(0..num_points); + + for j in 0..num_centers { + let mut tmp_pivot = distribution.sample(&mut rng); + while picked.contains(&tmp_pivot) { + tmp_pivot = distribution.sample(&mut rng); + } + picked.push(tmp_pivot); + let data_offset = tmp_pivot * dim; + let pivot_offset = j * dim; + pivot_data[pivot_offset..pivot_offset + dim] + .copy_from_slice(&data[data_offset..data_offset + dim]); + } +} + +/// Select pivots in k-means++ algorithm +/// Points that are farther away from the already chosen centroids +/// have a higher probability of being selected as the next centroid. +/// The k-means++ algorithm helps avoid poor initial centroid +/// placement that can result in suboptimal clustering. +fn k_meanspp_selecting_pivots( + data: &[f32], + num_points: usize, + dim: usize, + pivot_data: &mut [f32], + num_centers: usize, +) { + if num_points > (1 << 23) { + println!("ERROR: n_pts {} currently not supported for k-means++, maximum is 8388608. Falling back to random pivot selection.", num_points); + selecting_pivots(data, num_points, dim, pivot_data, num_centers); + return; + } + + let mut picked: Vec = Vec::new(); + let mut rng = thread_rng(); + let real_distribution = Uniform::from(0.0..1.0); + let int_distribution = Uniform::from(0..num_points); + + let init_id = int_distribution.sample(&mut rng); + let mut num_picked = 1; + + picked.push(init_id); + let init_data_offset = init_id * dim; + pivot_data[0..dim].copy_from_slice(&data[init_data_offset..init_data_offset + dim]); + + let mut dist = vec![0.0; num_points]; + + dist.par_iter_mut().enumerate().for_each(|(i, dist_i)| { + *dist_i = calc_distance( + &data[i * dim..(i + 1) * dim], + &data[init_id * dim..(init_id + 1) * dim], + dim, + ); + }); + + let mut dart_val: f64; + let mut tmp_pivot = 0; + let mut sum_flag = false; + + while num_picked < num_centers { + dart_val = real_distribution.sample(&mut rng); + + let mut sum: f64 = 0.0; + for item in dist.iter().take(num_points) { + sum += *item as f64; + } + if sum == 0.0 { + sum_flag = true; + } + + dart_val *= sum; + + let mut prefix_sum: f64 = 0.0; + for (i, pivot) in dist.iter().enumerate().take(num_points) { + tmp_pivot = i; + if dart_val >= prefix_sum && dart_val < (prefix_sum + *pivot as f64) { + break; + } + + prefix_sum += *pivot as f64; + } + + if picked.contains(&tmp_pivot) && !sum_flag { + continue; + } + + picked.push(tmp_pivot); + let pivot_offset = num_picked * dim; + let data_offset = tmp_pivot * dim; + pivot_data[pivot_offset..pivot_offset + dim] + .copy_from_slice(&data[data_offset..data_offset + dim]); + + dist.par_iter_mut().enumerate().for_each(|(i, dist_i)| { + *dist_i = (*dist_i).min(calc_distance( + &data[i * dim..(i + 1) * dim], + &data[tmp_pivot * dim..(tmp_pivot + 1) * dim], + dim, + )); + }); + + num_picked += 1; + } +} + +/// k-means algorithm interface +pub fn k_means_clustering( + data: &[f32], + num_points: usize, + dim: usize, + centers: &mut [f32], + num_centers: usize, + max_reps: usize, +) -> ANNResult<(Vec>, Vec, f32)> { + k_meanspp_selecting_pivots(data, num_points, dim, centers, num_centers); + let (closest_docs, closest_center, residual) = + run_lloyds(data, num_points, dim, centers, num_centers, max_reps)?; + Ok((closest_docs, closest_center, residual)) +} + +#[cfg(test)] +mod kmeans_test { + use super::*; + use approx::assert_relative_eq; + use rand::Rng; + + #[test] + fn lloyds_iter_test() { + let dim = 2; + let num_points = 10; + let num_centers = 3; + + let data: Vec = (1..=num_points * dim).map(|x| x as f32).collect(); + let mut centers = [1.0, 2.0, 7.0, 8.0, 19.0, 20.0]; + + let mut closest_docs: Vec> = vec![vec![]; num_centers]; + let mut closest_center: Vec = vec![0; num_points]; + let docs_l2sq: Vec = data + .chunks(dim) + .map(|chunk| chunk.iter().map(|val| val.powi(2)).sum()) + .collect(); + + let residual = lloyds_iter( + &data, + num_points, + dim, + &mut centers, + num_centers, + &docs_l2sq, + &mut closest_docs, + &mut closest_center, + ) + .unwrap(); + + let expected_centers: [f32; 6] = [2.0, 3.0, 9.0, 10.0, 17.0, 18.0]; + let expected_closest_docs: Vec> = + vec![vec![0, 1], vec![2, 3, 4, 5, 6], vec![7, 8, 9]]; + let expected_closest_center: [u32; 10] = [0, 0, 1, 1, 1, 1, 1, 2, 2, 2]; + let expected_residual: f32 = 100.0; + + // sort data for assert + centers.sort_by(|a, b| a.partial_cmp(b).unwrap()); + for inner_vec in &mut closest_docs { + inner_vec.sort(); + } + closest_center.sort_by(|a, b| a.partial_cmp(b).unwrap()); + + assert_eq!(centers, expected_centers); + assert_eq!(closest_docs, expected_closest_docs); + assert_eq!(closest_center, expected_closest_center); + assert_relative_eq!(residual, expected_residual, epsilon = 1.0e-6_f32); + } + + #[test] + fn run_lloyds_test() { + let dim = 2; + let num_points = 10; + let num_centers = 3; + let max_reps = 5; + + let data: Vec = (1..=num_points * dim).map(|x| x as f32).collect(); + let mut centers = [1.0, 2.0, 7.0, 8.0, 19.0, 20.0]; + + let (mut closest_docs, mut closest_center, residual) = + run_lloyds(&data, num_points, dim, &mut centers, num_centers, max_reps).unwrap(); + + let expected_centers: [f32; 6] = [3.0, 4.0, 10.0, 11.0, 17.0, 18.0]; + let expected_closest_docs: Vec> = + vec![vec![0, 1, 2], vec![3, 4, 5, 6], vec![7, 8, 9]]; + let expected_closest_center: [u32; 10] = [0, 0, 0, 1, 1, 1, 1, 2, 2, 2]; + let expected_residual: f32 = 72.0; + + // sort data for assert + centers.sort_by(|a, b| a.partial_cmp(b).unwrap()); + for inner_vec in &mut closest_docs { + inner_vec.sort(); + } + closest_center.sort_by(|a, b| a.partial_cmp(b).unwrap()); + + assert_eq!(centers, expected_centers); + assert_eq!(closest_docs, expected_closest_docs); + assert_eq!(closest_center, expected_closest_center); + assert_relative_eq!(residual, expected_residual, epsilon = 1.0e-6_f32); + } + + #[test] + fn selecting_pivots_test() { + let dim = 2; + let num_points = 10; + let num_centers = 3; + + // Generate some random data points + let mut rng = rand::thread_rng(); + let data: Vec = (0..num_points * dim).map(|_| rng.gen()).collect(); + + let mut pivot_data = vec![0.0; num_centers * dim]; + + selecting_pivots(&data, num_points, dim, &mut pivot_data, num_centers); + + // Verify that each pivot point corresponds to a point in the data + for i in 0..num_centers { + let pivot_offset = i * dim; + let pivot = &pivot_data[pivot_offset..(pivot_offset + dim)]; + + // Make sure the pivot is found in the data + let mut found = false; + for j in 0..num_points { + let data_offset = j * dim; + let point = &data[data_offset..(data_offset + dim)]; + + if pivot == point { + found = true; + break; + } + } + assert!(found, "Pivot not found in data"); + } + } + + #[test] + fn k_meanspp_selecting_pivots_test() { + let dim = 2; + let num_points = 10; + let num_centers = 3; + + // Generate some random data points + let mut rng = rand::thread_rng(); + let data: Vec = (0..num_points * dim).map(|_| rng.gen()).collect(); + + let mut pivot_data = vec![0.0; num_centers * dim]; + + k_meanspp_selecting_pivots(&data, num_points, dim, &mut pivot_data, num_centers); + + // Verify that each pivot point corresponds to a point in the data + for i in 0..num_centers { + let pivot_offset = i * dim; + let pivot = &pivot_data[pivot_offset..pivot_offset + dim]; + + // Make sure the pivot is found in the data + let mut found = false; + for j in 0..num_points { + let data_offset = j * dim; + let point = &data[data_offset..data_offset + dim]; + + if pivot == point { + found = true; + break; + } + } + assert!(found, "Pivot not found in data"); + } + } +} diff --git a/rust/diskann/src/utils/math_util.rs b/rust/diskann/src/utils/math_util.rs new file mode 100644 index 000000000..ef30c76ff --- /dev/null +++ b/rust/diskann/src/utils/math_util.rs @@ -0,0 +1,481 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Aligned allocator + +extern crate cblas; +extern crate openblas_src; + +use cblas::{sgemm, snrm2, Layout, Transpose}; +use rayon::prelude::*; +use std::{ + cmp::{min, Ordering}, + collections::BinaryHeap, + sync::{Arc, Mutex}, +}; + +use crate::common::{ANNError, ANNResult}; + +struct PivotContainer { + piv_id: usize, + piv_dist: f32, +} + +impl PartialOrd for PivotContainer { + fn partial_cmp(&self, other: &Self) -> Option { + other.piv_dist.partial_cmp(&self.piv_dist) + } +} + +impl Ord for PivotContainer { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + // Treat NaN as less than all other values. + // piv_dist should never be NaN. + self.partial_cmp(other).unwrap_or(Ordering::Less) + } +} + +impl PartialEq for PivotContainer { + fn eq(&self, other: &Self) -> bool { + self.piv_dist == other.piv_dist + } +} + +impl Eq for PivotContainer {} + +/// Calculate the Euclidean distance between two vectors +pub fn calc_distance(vec_1: &[f32], vec_2: &[f32], dim: usize) -> f32 { + let mut dist = 0.0; + for j in 0..dim { + let diff = vec_1[j] - vec_2[j]; + dist += diff * diff; + } + dist +} + +/// Compute L2-squared norms of data stored in row-major num_points * dim, +/// need to be pre-allocated +pub fn compute_vecs_l2sq(vecs_l2sq: &mut [f32], data: &[f32], num_points: usize, dim: usize) { + assert_eq!(vecs_l2sq.len(), num_points); + + vecs_l2sq + .par_iter_mut() + .enumerate() + .for_each(|(n_iter, vec_l2sq)| { + let slice = &data[n_iter * dim..(n_iter + 1) * dim]; + let norm = unsafe { snrm2(dim as i32, slice, 1) }; + *vec_l2sq = norm * norm; + }); +} + +/// Calculate k closest centers to data of num_points * dim (row-major) +/// Centers is num_centers * dim (row-major) +/// data_l2sq has pre-computed squared norms of data +/// centers_l2sq has pre-computed squared norms of centers +/// Pre-allocated center_index will contain id of nearest center +/// Pre-allocated dist_matrix should be num_points * num_centers and contain squared distances +/// Default value of k is 1 +/// Ideally used only by compute_closest_centers +#[allow(clippy::too_many_arguments)] +pub fn compute_closest_centers_in_block( + data: &[f32], + num_points: usize, + dim: usize, + centers: &[f32], + num_centers: usize, + docs_l2sq: &[f32], + centers_l2sq: &[f32], + center_index: &mut [u32], + dist_matrix: &mut [f32], + k: usize, +) -> ANNResult<()> { + if k > num_centers { + return Err(ANNError::log_index_error(format!( + "ERROR: k ({}) > num_centers({})", + k, num_centers + ))); + } + + let ones_a: Vec = vec![1.0; num_centers]; + let ones_b: Vec = vec![1.0; num_points]; + + unsafe { + sgemm( + Layout::RowMajor, + Transpose::None, + Transpose::Ordinary, + num_points as i32, + num_centers as i32, + 1, + 1.0, + docs_l2sq, + 1, + &ones_a, + 1, + 0.0, + dist_matrix, + num_centers as i32, + ); + } + + unsafe { + sgemm( + Layout::RowMajor, + Transpose::None, + Transpose::Ordinary, + num_points as i32, + num_centers as i32, + 1, + 1.0, + &ones_b, + 1, + centers_l2sq, + 1, + 1.0, + dist_matrix, + num_centers as i32, + ); + } + + unsafe { + sgemm( + Layout::RowMajor, + Transpose::None, + Transpose::Ordinary, + num_points as i32, + num_centers as i32, + dim as i32, + -2.0, + data, + dim as i32, + centers, + dim as i32, + 1.0, + dist_matrix, + num_centers as i32, + ); + } + + if k == 1 { + center_index + .par_iter_mut() + .enumerate() + .for_each(|(i, center_idx)| { + let mut min = f32::MAX; + let current = &dist_matrix[i * num_centers..(i + 1) * num_centers]; + let mut min_idx = 0; + for (j, &distance) in current.iter().enumerate() { + if distance < min { + min = distance; + min_idx = j; + } + } + *center_idx = min_idx as u32; + }); + } else { + center_index + .par_chunks_mut(k) + .enumerate() + .for_each(|(i, center_chunk)| { + let current = &dist_matrix[i * num_centers..(i + 1) * num_centers]; + let mut top_k_queue = BinaryHeap::new(); + for (j, &distance) in current.iter().enumerate() { + let this_piv = PivotContainer { + piv_id: j, + piv_dist: distance, + }; + if top_k_queue.len() < k { + top_k_queue.push(this_piv); + } else { + // Safe unwrap, top_k_queue is not empty + #[allow(clippy::unwrap_used)] + let mut top = top_k_queue.peek_mut().unwrap(); + if this_piv.piv_dist < top.piv_dist { + *top = this_piv; + } + } + } + for (_j, center_idx) in center_chunk.iter_mut().enumerate() { + if let Some(this_piv) = top_k_queue.pop() { + *center_idx = this_piv.piv_id as u32; + } else { + break; + } + } + }); + } + + Ok(()) +} + +/// Given data in num_points * new_dim row major +/// Pivots stored in full_pivot_data as num_centers * new_dim row major +/// Calculate the k closest pivot for each point and store it in vector +/// closest_centers_ivf (row major, num_points*k) (which needs to be allocated +/// outside) Additionally, if inverted index is not null (and pre-allocated), +/// it will return inverted index for each center, assuming each of the inverted +/// indices is an empty vector. Additionally, if pts_norms_squared is not null, +/// then it will assume that point norms are pre-computed and use those values +#[allow(clippy::too_many_arguments)] +pub fn compute_closest_centers( + data: &[f32], + num_points: usize, + dim: usize, + pivot_data: &[f32], + num_centers: usize, + k: usize, + closest_centers_ivf: &mut [u32], + mut inverted_index: Option<&mut Vec>>, + pts_norms_squared: Option<&[f32]>, +) -> ANNResult<()> { + if k > num_centers { + return Err(ANNError::log_index_error(format!( + "ERROR: k ({}) > num_centers({})", + k, num_centers + ))); + } + + let _is_norm_given_for_pts = pts_norms_squared.is_some(); + + let mut pivs_norms_squared = vec![0.0; num_centers]; + + let mut pts_norms_squared = if let Some(pts_norms) = pts_norms_squared { + pts_norms.to_vec() + } else { + let mut norms_squared = vec![0.0; num_points]; + compute_vecs_l2sq(&mut norms_squared, data, num_points, dim); + norms_squared + }; + + compute_vecs_l2sq(&mut pivs_norms_squared, pivot_data, num_centers, dim); + + let par_block_size = num_points; + let n_blocks = if num_points % par_block_size == 0 { + num_points / par_block_size + } else { + num_points / par_block_size + 1 + }; + + let mut closest_centers = vec![0u32; par_block_size * k]; + let mut distance_matrix = vec![0.0; num_centers * par_block_size]; + + for cur_blk in 0..n_blocks { + let data_cur_blk = &data[cur_blk * par_block_size * dim..]; + let num_pts_blk = min(par_block_size, num_points - cur_blk * par_block_size); + let pts_norms_blk = &mut pts_norms_squared[cur_blk * par_block_size..]; + + compute_closest_centers_in_block( + data_cur_blk, + num_pts_blk, + dim, + pivot_data, + num_centers, + pts_norms_blk, + &pivs_norms_squared, + &mut closest_centers, + &mut distance_matrix, + k, + )?; + + closest_centers_ivf.clone_from_slice(&closest_centers); + + if let Some(inverted_index_inner) = inverted_index.as_mut() { + let inverted_index_arc = Arc::new(Mutex::new(inverted_index_inner)); + + (0..num_points) + .into_par_iter() + .try_for_each(|j| -> ANNResult<()> { + let this_center_id = closest_centers[j] as usize; + let mut guard = inverted_index_arc.lock().map_err(|err| { + ANNError::log_index_error(format!( + "PoisonError: Lock poisoned when acquiring inverted_index_arc, err={}", + err + )) + })?; + guard[this_center_id].push(j); + + Ok(()) + })?; + } + } + + Ok(()) +} + +/// If to_subtract is true, will subtract nearest center from each row. +/// Else will add. +/// Output will be in data_load itself. +/// Nearest centers need to be provided in closest_centers. +pub fn process_residuals( + data_load: &mut [f32], + num_points: usize, + dim: usize, + cur_pivot_data: &[f32], + num_centers: usize, + closest_centers: &[u32], + to_subtract: bool, +) { + println!( + "Processing residuals of {} points in {} dimensions using {} centers", + num_points, dim, num_centers + ); + + data_load + .par_chunks_mut(dim) + .enumerate() + .for_each(|(n_iter, chunk)| { + let cur_pivot_index = closest_centers[n_iter] as usize * dim; + for d_iter in 0..dim { + if to_subtract { + chunk[d_iter] -= cur_pivot_data[cur_pivot_index + d_iter]; + } else { + chunk[d_iter] += cur_pivot_data[cur_pivot_index + d_iter]; + } + } + }); +} + +#[cfg(test)] +mod math_util_test { + use super::*; + use approx::assert_abs_diff_eq; + + #[test] + fn calc_distance_test() { + let vec1 = vec![1.0, 2.0, 3.0]; + let vec2 = vec![4.0, 5.0, 6.0]; + let dim = vec1.len(); + + let dist = calc_distance(&vec1, &vec2, dim); + + let expected = 27.0; + + assert_eq!(dist, expected); + } + + #[test] + fn compute_vecs_l2sq_test() { + let data = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]; + let num_points = 2; + let dim = 3; + let mut vecs_l2sq = vec![0.0; num_points]; + + compute_vecs_l2sq(&mut vecs_l2sq, &data, num_points, dim); + + let expected = vec![14.0, 77.0]; + + assert_eq!(vecs_l2sq.len(), num_points); + assert_abs_diff_eq!(vecs_l2sq[0], expected[0], epsilon = 1e-6); + assert_abs_diff_eq!(vecs_l2sq[1], expected[1], epsilon = 1e-6); + } + + #[test] + fn compute_closest_centers_in_block_test() { + let num_points = 10; + let dim = 5; + let num_centers = 3; + let data = vec![ + 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, + 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, + 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, + 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, + ]; + let centers = vec![ + 1.0, 2.0, 3.0, 4.0, 5.0, 21.0, 22.0, 23.0, 24.0, 25.0, 31.0, 32.0, 33.0, 34.0, 35.0, + ]; + let mut docs_l2sq = vec![0.0; num_points]; + compute_vecs_l2sq(&mut docs_l2sq, &data, num_points, dim); + let mut centers_l2sq = vec![0.0; num_centers]; + compute_vecs_l2sq(&mut centers_l2sq, ¢ers, num_centers, dim); + let mut center_index = vec![0; num_points]; + let mut dist_matrix = vec![0.0; num_points * num_centers]; + let k = 1; + + compute_closest_centers_in_block( + &data, + num_points, + dim, + ¢ers, + num_centers, + &docs_l2sq, + ¢ers_l2sq, + &mut center_index, + &mut dist_matrix, + k, + ) + .unwrap(); + + assert_eq!(center_index.len(), num_points); + let expected_center_index = vec![0, 0, 0, 1, 1, 1, 2, 2, 2, 2]; + assert_abs_diff_eq!(*center_index, expected_center_index); + + assert_eq!(dist_matrix.len(), num_points * num_centers); + let expected_dist_matrix = vec![ + 0.0, 2000.0, 4500.0, 125.0, 1125.0, 3125.0, 500.0, 500.0, 2000.0, 1125.0, 125.0, + 1125.0, 2000.0, 0.0, 500.0, 3125.0, 125.0, 125.0, 4500.0, 500.0, 0.0, 6125.0, 1125.0, + 125.0, 8000.0, 2000.0, 500.0, 10125.0, 3125.0, 1125.0, + ]; + assert_abs_diff_eq!(*dist_matrix, expected_dist_matrix, epsilon = 1e-2); + } + + #[test] + fn test_compute_closest_centers() { + let num_points = 4; + let dim = 3; + let num_centers = 2; + let mut data = vec![ + 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, + ]; + let pivot_data = vec![1.0, 2.0, 3.0, 10.0, 11.0, 12.0]; + let k = 1; + + let mut closest_centers_ivf = vec![0u32; num_points * k]; + let mut inverted_index: Vec> = vec![vec![], vec![]]; + + compute_closest_centers( + &data, + num_points, + dim, + &pivot_data, + num_centers, + k, + &mut closest_centers_ivf, + Some(&mut inverted_index), + None, + ) + .unwrap(); + + assert_eq!(closest_centers_ivf, vec![0, 0, 1, 1]); + + for vec in inverted_index.iter_mut() { + vec.sort_unstable(); + } + assert_eq!(inverted_index, vec![vec![0, 1], vec![2, 3]]); + } + + #[test] + fn process_residuals_test() { + let mut data_load = vec![1.0, 2.0, 3.0, 4.0]; + let num_points = 2; + let dim = 2; + let cur_pivot_data = vec![0.5, 1.5, 2.5, 3.5]; + let num_centers = 2; + let closest_centers = vec![0, 1]; + let to_subtract = true; + + process_residuals( + &mut data_load, + num_points, + dim, + &cur_pivot_data, + num_centers, + &closest_centers, + to_subtract, + ); + + assert_eq!(data_load, vec![0.5, 0.5, 0.5, 0.5]); + } +} diff --git a/rust/diskann/src/utils/mod.rs b/rust/diskann/src/utils/mod.rs new file mode 100644 index 000000000..df174f8f0 --- /dev/null +++ b/rust/diskann/src/utils/mod.rs @@ -0,0 +1,34 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +pub mod file_util; +pub use file_util::*; + +#[allow(clippy::module_inception)] +pub mod utils; +pub use utils::*; + +pub mod bit_vec_extension; +pub use bit_vec_extension::*; + +pub mod rayon_util; +pub use rayon_util::*; + +pub mod timer; +pub use timer::*; + +pub mod cached_reader; +pub use cached_reader::*; + +pub mod cached_writer; +pub use cached_writer::*; + +pub mod partition; +pub use partition::*; + +pub mod math_util; +pub use math_util::*; + +pub mod kmeans; +pub use kmeans::*; diff --git a/rust/diskann/src/utils/partition.rs b/rust/diskann/src/utils/partition.rs new file mode 100644 index 000000000..dbe686226 --- /dev/null +++ b/rust/diskann/src/utils/partition.rs @@ -0,0 +1,151 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::mem; +use std::{fs::File, path::Path}; +use std::io::{Write, Seek, SeekFrom}; +use rand::distributions::{Distribution, Uniform}; + +use crate::common::ANNResult; + +use super::CachedReader; + +/// streams data from the file, and samples each vector with probability p_val +/// and returns a matrix of size slice_size* ndims as floating point type. +/// the slice_size and ndims are set inside the function. +/// # Arguments +/// * `file_name` - filename where the data is +/// * `p_val` - possibility to sample data +/// * `sampled_vectors` - sampled vector chose by p_val possibility +/// * `slice_size` - how many sampled data return +/// * `dim` - each sample data dimension +pub fn gen_random_slice>(data_file: &str, mut p_val: f64) -> ANNResult<(Vec, usize, usize)> { + let read_blk_size = 64 * 1024 * 1024; + let mut reader = CachedReader::new(data_file, read_blk_size)?; + + let npts = reader.read_u32()? as usize; + let dim = reader.read_u32()? as usize; + let mut sampled_vectors: Vec = Vec::new(); + let mut slice_size = 0; + p_val = if p_val < 1f64 { p_val } else { 1f64 }; + + let mut generator = rand::thread_rng(); + let distribution = Uniform::from(0.0..1.0); + + for _ in 0..npts { + let mut cur_vector_bytes = vec![0u8; dim * mem::size_of::()]; + reader.read(&mut cur_vector_bytes)?; + let random_value = distribution.sample(&mut generator); + if random_value < p_val { + let ptr = cur_vector_bytes.as_ptr() as *const T; + let cur_vector_t = unsafe { std::slice::from_raw_parts(ptr, dim) }; + sampled_vectors.extend(cur_vector_t.iter().map(|&t| t.into())); + slice_size += 1; + } + } + + Ok((sampled_vectors, slice_size, dim)) +} + +/// Generate random sample data and write into output_file +pub fn gen_sample_data(data_file: &str, output_file: &str, sampling_rate: f64) -> ANNResult<()> { + let read_blk_size = 64 * 1024 * 1024; + let mut reader = CachedReader::new(data_file, read_blk_size)?; + + let sample_data_path = format!("{}_data.bin", output_file); + let sample_ids_path = format!("{}_ids.bin", output_file); + let mut sample_data_writer = File::create(Path::new(&sample_data_path))?; + let mut sample_id_writer = File::create(Path::new(&sample_ids_path))?; + + let mut num_sampled_pts = 0u32; + let one_const = 1u32; + let mut generator = rand::thread_rng(); + let distribution = Uniform::from(0.0..1.0); + + let npts_u32 = reader.read_u32()?; + let dim_u32 = reader.read_u32()?; + let dim = dim_u32 as usize; + sample_data_writer.write_all(&num_sampled_pts.to_le_bytes())?; + sample_data_writer.write_all(&dim_u32.to_le_bytes())?; + sample_id_writer.write_all(&num_sampled_pts.to_le_bytes())?; + sample_id_writer.write_all(&one_const.to_le_bytes())?; + + for id in 0..npts_u32 { + let mut cur_row_bytes = vec![0u8; dim * mem::size_of::()]; + reader.read(&mut cur_row_bytes)?; + let random_value = distribution.sample(&mut generator); + if random_value < sampling_rate { + sample_data_writer.write_all(&cur_row_bytes)?; + sample_id_writer.write_all(&id.to_le_bytes())?; + num_sampled_pts += 1; + } + } + + sample_data_writer.seek(SeekFrom::Start(0))?; + sample_data_writer.write_all(&num_sampled_pts.to_le_bytes())?; + sample_id_writer.seek(SeekFrom::Start(0))?; + sample_id_writer.write_all(&num_sampled_pts.to_le_bytes())?; + println!("Wrote {} points to sample file: {}", num_sampled_pts, sample_data_path); + + Ok(()) +} + +#[cfg(test)] +mod partition_test { + use std::{fs, io::Read}; + use byteorder::{ReadBytesExt, LittleEndian}; + + use crate::utils::file_exists; + + use super::*; + + #[test] + fn gen_sample_data_test() { + let file_name = "gen_sample_data_test.bin"; + //npoints=2, dim=8 + let data: [u8; 72] = [2, 0, 0, 0, 8, 0, 0, 0, + 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x80, 0x40, + 0x00, 0x00, 0xa0, 0x40, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x10, 0x41, 0x00, 0x00, 0x20, 0x41, 0x00, 0x00, 0x30, 0x41, 0x00, 0x00, 0x40, 0x41, + 0x00, 0x00, 0x50, 0x41, 0x00, 0x00, 0x60, 0x41, 0x00, 0x00, 0x70, 0x41, 0x00, 0x00, 0x80, 0x41]; + std::fs::write(file_name, data).expect("Failed to write sample file"); + + let sample_file_prefix = file_name.to_string() + "_sample"; + gen_sample_data::(file_name, sample_file_prefix.as_str(), 1f64).unwrap(); + + let sample_data_path = format!("{}_data.bin", sample_file_prefix); + let sample_ids_path = format!("{}_ids.bin", sample_file_prefix); + assert!(file_exists(sample_data_path.as_str())); + assert!(file_exists(sample_ids_path.as_str())); + + let mut data_file_reader = File::open(sample_data_path.as_str()).unwrap(); + let mut ids_file_reader = File::open(sample_ids_path.as_str()).unwrap(); + + let mut num_sampled_pts = data_file_reader.read_u32::().unwrap(); + assert_eq!(num_sampled_pts, 2); + num_sampled_pts = ids_file_reader.read_u32::().unwrap(); + assert_eq!(num_sampled_pts, 2); + + let dim = data_file_reader.read_u32::().unwrap() as usize; + assert_eq!(dim, 8); + assert_eq!(ids_file_reader.read_u32::().unwrap(), 1); + + let mut start = 8; + for i in 0..num_sampled_pts { + let mut data_bytes = vec![0u8; dim * 4]; + data_file_reader.read_exact(&mut data_bytes).unwrap(); + assert_eq!(data_bytes, data[start..start + dim * 4]); + + let id = ids_file_reader.read_u32::().unwrap(); + assert_eq!(id, i); + + start += dim * 4; + } + + fs::remove_file(file_name).expect("Failed to delete file"); + fs::remove_file(sample_data_path.as_str()).expect("Failed to delete file"); + fs::remove_file(sample_ids_path.as_str()).expect("Failed to delete file"); + } +} + diff --git a/rust/diskann/src/utils/rayon_util.rs b/rust/diskann/src/utils/rayon_util.rs new file mode 100644 index 000000000..f8174ee59 --- /dev/null +++ b/rust/diskann/src/utils/rayon_util.rs @@ -0,0 +1,33 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::ops::Range; +use rayon::prelude::{IntoParallelIterator, ParallelIterator}; + +use crate::common::ANNResult; + +/// based on thread_num, execute the task in parallel using Rayon or serial +#[inline] +pub fn execute_with_rayon(range: Range, num_threads: u32, f: F) -> ANNResult<()> +where F: Fn(usize) -> ANNResult<()> + Sync + Send + Copy +{ + if num_threads == 1 { + for i in range { + f(i)?; + } + Ok(()) + } else { + range.into_par_iter().try_for_each(f) + } +} + +/// set the thread count of Rayon, otherwise it will use threads as many as logical cores. +#[inline] +pub fn set_rayon_num_threads(num_threads: u32) { + std::env::set_var( + "RAYON_NUM_THREADS", + num_threads.to_string(), + ); +} + diff --git a/rust/diskann/src/utils/timer.rs b/rust/diskann/src/utils/timer.rs new file mode 100644 index 000000000..2f4b38ba7 --- /dev/null +++ b/rust/diskann/src/utils/timer.rs @@ -0,0 +1,101 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use platform::*; +use std::time::{Duration, Instant}; + +#[derive(Clone)] +pub struct Timer { + check_point: Instant, + pid: Option, + cycles: Option, +} + +impl Default for Timer { + fn default() -> Self { + Self::new() + } +} + +impl Timer { + pub fn new() -> Timer { + let pid = get_process_handle(); + let cycles = get_process_cycle_time(pid); + Timer { + check_point: Instant::now(), + pid, + cycles, + } + } + + pub fn reset(&mut self) { + self.check_point = Instant::now(); + self.cycles = get_process_cycle_time(self.pid); + } + + pub fn elapsed(&self) -> Duration { + Instant::now().duration_since(self.check_point) + } + + pub fn elapsed_seconds(&self) -> f64 { + self.elapsed().as_secs_f64() + } + + pub fn elapsed_gcycles(&self) -> f32 { + let cur_cycles = get_process_cycle_time(self.pid); + if let (Some(cur_cycles), Some(cycles)) = (cur_cycles, self.cycles) { + let spent_cycles = + ((cur_cycles - cycles) as f64 * 1.0f64) / (1024 * 1024 * 1024) as f64; + return spent_cycles as f32; + } + + 0.0 + } + + pub fn elapsed_seconds_for_step(&self, step: &str) -> String { + format!( + "Time for {}: {:.3} seconds, {:.3}B cycles", + step, + self.elapsed_seconds(), + self.elapsed_gcycles() + ) + } +} + +#[cfg(test)] +mod timer_tests { + use super::*; + use std::{thread, time}; + + #[test] + fn test_new() { + let timer = Timer::new(); + assert!(timer.check_point.elapsed().as_secs() < 1); + if cfg!(windows) { + assert!(timer.pid.is_some()); + assert!(timer.cycles.is_some()); + } + else { + assert!(timer.pid.is_none()); + assert!(timer.cycles.is_none()); + } + } + + #[test] + fn test_reset() { + let mut timer = Timer::new(); + thread::sleep(time::Duration::from_millis(100)); + timer.reset(); + assert!(timer.check_point.elapsed().as_millis() < 10); + } + + #[test] + fn test_elapsed() { + let timer = Timer::new(); + thread::sleep(time::Duration::from_millis(100)); + assert!(timer.elapsed().as_millis() > 100); + assert!(timer.elapsed_seconds() > 0.1); + } +} + diff --git a/rust/diskann/src/utils/utils.rs b/rust/diskann/src/utils/utils.rs new file mode 100644 index 000000000..2e80676af --- /dev/null +++ b/rust/diskann/src/utils/utils.rs @@ -0,0 +1,154 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::sync::Mutex; +use num_traits::Num; + +/// Non recursive mutex +pub type NonRecursiveMutex = Mutex<()>; + +/// Round up X to the nearest multiple of Y +#[inline] +pub fn round_up(x: T, y: T) -> T +where T : Num + Copy +{ + div_round_up(x, y) * y +} + +/// Rounded-up division +#[inline] +pub fn div_round_up(x: T, y: T) -> T +where T : Num + Copy +{ + (x / y) + if x % y != T::zero() {T::one()} else {T::zero()} +} + +/// Round down X to the nearest multiple of Y +#[inline] +pub fn round_down(x: T, y: T) -> T +where T : Num + Copy +{ + (x / y) * y +} + +/// Is aligned +#[inline] +pub fn is_aligned(x: T, y: T) -> bool +where T : Num + Copy +{ + x % y == T::zero() +} + +#[inline] +pub fn is_512_aligned(x: u64) -> bool { + is_aligned(x, 512) +} + +#[inline] +pub fn is_4096_aligned(x: u64) -> bool { + is_aligned(x, 4096) +} + +/// all metadata of individual sub-component files is written in first 4KB for unified files +pub const METADATA_SIZE: usize = 4096; + +pub const BUFFER_SIZE_FOR_CACHED_IO: usize = 1024 * 1048576; + +pub const PBSTR: &str = "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||"; + +pub const PBWIDTH: usize = 60; + +macro_rules! convert_types { + ($name:ident, $intput_type:ty, $output_type:ty) => { + /// Write data into file + pub fn $name(srcmat: &[$intput_type], npts: usize, dim: usize) -> Vec<$output_type> { + let mut destmat: Vec<$output_type> = Vec::new(); + for i in 0..npts { + for j in 0..dim { + destmat.push(srcmat[i * dim + j] as $output_type); + } + } + destmat + } + }; +} +convert_types!(convert_types_usize_u8, usize, u8); +convert_types!(convert_types_usize_u32, usize, u32); +convert_types!(convert_types_usize_u64, usize, u64); +convert_types!(convert_types_u64_usize, u64, usize); +convert_types!(convert_types_u32_usize, u32, usize); + +#[cfg(test)] +mod file_util_test { + use super::*; + use std::any::type_name; + + #[test] + fn round_up_test() { + assert_eq!(round_up(252, 8), 256); + assert_eq!(round_up(256, 8), 256); + } + + #[test] + fn div_round_up_test() { + assert_eq!(div_round_up(252, 8), 32); + assert_eq!(div_round_up(256, 8), 32); + } + + #[test] + fn round_down_test() { + assert_eq!(round_down(252, 8), 248); + assert_eq!(round_down(256, 8), 256); + } + + #[test] + fn is_aligned_test() { + assert!(!is_aligned(252, 8)); + assert!(is_aligned(256, 8)); + } + + #[test] + fn is_512_aligned_test() { + assert!(!is_512_aligned(520)); + assert!(is_512_aligned(512)); + } + + #[test] + fn is_4096_aligned_test() { + assert!(!is_4096_aligned(4090)); + assert!(is_4096_aligned(4096)); + } + + #[test] + fn convert_types_test() { + let data = vec![0u64, 1u64, 2u64]; + let output = convert_types_u64_usize(&data, 3, 1); + assert_eq!(output.len(), 3); + assert_eq!(type_of(output[0]), "usize"); + assert_eq!(output[0], 0usize); + + let data = vec![0usize, 1usize, 2usize]; + let output = convert_types_usize_u8(&data, 3, 1); + assert_eq!(output.len(), 3); + assert_eq!(type_of(output[0]), "u8"); + assert_eq!(output[0], 0u8); + + let data = vec![0usize, 1usize, 2usize]; + let output = convert_types_usize_u64(&data, 3, 1); + assert_eq!(output.len(), 3); + assert_eq!(type_of(output[0]), "u64"); + assert_eq!(output[0], 0u64); + + let data = vec![0u32, 1u32, 2u32]; + let output = convert_types_u32_usize(&data, 3, 1); + assert_eq!(output.len(), 3); + assert_eq!(type_of(output[0]), "usize"); + assert_eq!(output[0],0usize); + } + + fn type_of(_: T) -> &'static str { + type_name::() + } +} + diff --git a/rust/diskann/tests/data/delete_set_50pts.bin b/rust/diskann/tests/data/delete_set_50pts.bin new file mode 100644 index 0000000000000000000000000000000000000000..8d520e7c757e74cec8ea0815733ecf30d5ef78fd GIT binary patch literal 1024 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�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 r=kFTjcQ}7`^T7gF^@Mr}dt-$~PEAamSP#!Jb literal 0 HcmV?d00001 diff --git a/rust/diskann/tests/data/disk_index_siftsmall_learn_256pts_R4_L50_A1.2_disk.index b/rust/diskann/tests/data/disk_index_siftsmall_learn_256pts_R4_L50_A1.2_disk.index new file mode 100644 index 0000000000000000000000000000000000000000..88a86b7da60b9eb6cdb2cd0b14dc65f784f8ae5e GIT binary patch literal 155648 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 z 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 z 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

2irxNpyYi+24^ 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 jesjcdBzRt^jjqn**N7wCOr<_>!!NzS>y z0dsiIc7=TvEU|my_B;Uz`xyN>F?$5Qob&bC$fv}bZEQo#niXjMJM1QN^4|czLtHPw zTWoVO^#x>Xe_q(fGy4e)^AqcUvt5Tv*#3QAE`a(e{x0!?Eu338*9_R}2Izm4fv&RDc7MP!@RXY5L@xGinK*4X~-0sJ@{C@cs#D%!`@e|kq&p=OpyD$6b z_tebMKN1%$F6Vb`w4UgK-=pPL*zPO0cpCTeGn}7GKYz;$>$z9sAAx<~8t+Nq!R-<| zG6#DN0)B(Gw!@xbd)8-Y&uj^XyFnkoo9FtkK_cHh342|FQ~x*Gb1~kqfY10F^aElY zdWp8T-x>CGzC?~mnvhdNT`3TsC`B3|K;zp9r`jT)MTJU zjPJnpUK0Bbcz-w5aIPKX_=cR{ey+X1wx>DzYy686)Me0e7v$Xdy39*&UsOWx$H~M<^%Bz_b*~g@F6M0{~y*r{ZMU;cjP%0Y|kyw z!#=RLlN#TO>-#}10;cHU%NB@ z>~If9_7m`P^b9<%@yqBX{vgCR_-{ag^Rwgox&l_f??r z#2(f%XCl6N@9QS;yoVk&?%C<*pe?bN;1l5I*fj(GT=4%&tOF}-*UKOUKzlFp-gSn% zO5O}~*q(#m&#tFL@CSAej={Xz8*)6SHU98s$Wx0`IM?_4yoa~W{$URI6Si}=84CVS zz%>`ZbKbWGC^^QTqux!1bHBb1a|^Mxc>>${%=;7sev=N{*w668+2A*EozLK%!s%u1ye;+q~1os;K7+9yM zGrZV>+r;+JU5x7tN%aro3AoNadA_Hq3_W8!SI_YTILlOA$9m^>VhTb7=FEQ+geLA1<2IqecoTb1gVE!R~U@y_`_YCy-u003Z z_Hvy$_!7>#UxSWVlZ^c%oH1+N_bKS$6?^!*#1~+gm)P(I#_$kdzk85{8?LB%fo`sx!mLP)}^>g$F zBsuDR>&KP5hV34lvDDtyZOunq>pHO=enve(JG1>ShIuRe0LDcJXH5P+`En=L0O!s%zQliB<6okSJV>I-`F>*j?zlwW#$F$g z0w2W9>Ed0&FjwVVb1Fyp#=VOa?`CT`1+Gb8`(}Ey`~8r}?*s4EGf?J}+z#8G_9)ml z?u@>9O=j?Zw+QcJj!x)v!S>vYyUuO&0&QK6F{?vs5BnOa;k(zG4g|TYnr~eqH^33L zIo^l8dpP|icGMj6#Txio>%lH|B0d%O@8`hTON{fJV*dip?;GE2%Uv!(-E?2F?0c?Q12b{5t9@f*r(v4ZZ?BTtmWkKJUqO7NCPG zUN69p*t{+XDcZ|_0zd#vpt#TYloy$tJO z_wdf^Ijw;EIm15!GY~c2VLO+x4RAi=9dXxizxKXVb(U%0#-Bs&*2;{>4Wd_{{kL@POgeMOE`NKa0UAYC^3G1jJZ~>{;)r4ci_a-caQcn*BR_N zoC*E|eB*xCc~-L)Lwkooj(hcuc&5A92~J*EWA6@I-ul~j>b+wdzlJZDu+PA^*lor_ zjc^8Y>~#PVTnDVr;03WYy6vkFTjBR$MeHt+GcLab_K~-@=!ho)-=p`?`p0PF1vtYD ze>fj{Ir|y@BeXLlV1MJT;h7wvd-^DIY|m{C{G8bL&mi!vvA1=;Ut{*pz#6|}e+I_v zvjx7xBeXf*mHsZa(xI(?3}?Pl0v_lGu;viRE5_*Gc3~#aaFN;T-QtkP5dX_D}E}qzgHj9M5hJPQm#s@Wz@H z>;vK*+VzgCxznO(e!rc;HL=#U)pyM!?mL~H>yQiA6Yt3DK>_C2>l(apz7F2{A&$M) zCiXeV`1W7G_1FQdZ)*iP#xKe#Ie)J)bFFJNL#{P-Zf7_KiJWsGc0j#zoq(a%IOsrB z?W~^N#j}4z?JH2M1-sZiHBD~dzW^PaXZaG_eKjfaK=Jok-;JDeWb|;}Xyv z!~GH4y)W?nKDi3aAL69Qdv4|&fnj#)3TS6^N{(@B{SH0EH`bA3FXuf&-$nPeHYv5v z+IwIR|9kWidOpErxM#rM*|zZZH)kIxt|jl;x{h-!(S3}3Mt9%@PTO_W_H27k_&pf* zNnGFAJAoZ&_u)Djzkmc>dj{uh&bb2~fCA?Xo@tm{#rzWEoIemd02yB~mZ|Y9JgeKF z#K@PsE)!fZD%n^l-zypy&A3yaL1g zwXQ?Y?E|0D#>5t!fHr6Alk5p*+|g9^0PIny}m3@Gd;31aI7!_Mou? zSTpP!y90-J#^3+!@mFl$>c$#G&Ysq+LBaNnXWCJ}2ha%|)Ec~DZQsTbutyWm^K0sT zXZGtr2KMT}8TS7r_C1)^S+8&Y0kPY_JDlTxNJ@;q7oA>++xJhPi9NUExW^r^053sU z7j*_~-nf%li<{S0Hm`+kJJxMz9m ze9!m5ze&&%-hC$Q>Hf`a{k@;Bfcu@wAK+erXTaQaAwJ~7`L2Dt&SQ>uwn5v^nRAT1 zZ_~5etGwSEzKcZM9?lTvBF?%?-W+tm_3d?0%)4Fd%sT-a{A6ytpM47FS$kLe*u%Uv z#hEi)t~G)E2yTY%;avYR_%|VDJOO7B56Ju2TxzZNjy9mvhj;(lJvGCBvw_pk;1ag$ zns59iwr}tZKkzd+#kNn6ov^*XIl9Rb|0hu3Tw6QEI9s3-{*R#L*~{&F}7SwIQ z5AfE13%&rZ7sNd~b9RCCo@)nh{5iHW&9Ili-htkL6}J6+uX3510_2_mKiez#LEsg8 z82=+!7_0Gi-p+CWoJHF+OaZDyjBC4Z&(rfA1m0Kz&ep-Z&aeiwe1JJIzsF9|&emoy zHpBOf3&{AL8Z5z(N8Mvkh$Y~Rd%(IL`1`HBGqC{Iux|pzJma3{9J|C=vzD(C*f-3N zMvOB&m814G+CE*2*R&4qr<$W}Zn}^&%n$Fm4{_8*v9ITLQ3CE~d3z(SG4#{+bAs== zMU1}vhy9v-K|Cwt)_q7mROebt(8X9W$3C$SVxJrr`q6(|<3rNq4|84LSwAGscX2lF zS;WN{J^G5(o$U6Q{kpbm{vBKgu9f5cec9*78uL!fS%KGZ z2f+9ot=Ml(%>B!MhR!jB-uq)oj=cF9TR-qUJ8O>6#@vsetsXsmCa@1d;NL|*1b+VJ z_=LcMRtpWlx_hrf$ngN&WXvF{Q16nq3+%lYixk<(#& z_pgB8$>#2WzUJiG=Q^CddVJ5|2Daz6MgIbH@By67^}hl)!7bq3xQ_Yu7YpFN0(gc) zObzcD%&?s|*S^kluksywMO;~<1An0(W53Jz&YR_c=i^)*@SHa28T!6C)bzmExA?B9 zxW4x=^u-@?@LzyaVk;n*L>2vG_}`Et?t%{PT(CX60-h1`jNTJ?-^mso?3>&3H0PDTR3NHQeu27 zuD1j$V*Wj2h3&c7-}Rki7hI}w{h+phV>s_50oU|*XzPr3V2(X}4$ZAR*@L*|W%5&u zx#oL68LgBU&wi+{{=bMfKZtigoxqzr;~uY|<(%2sT&Jr(nM3^w&OB#YfT%eIZGNg~ zwXM$e?K>6c5jTk$|0hs#jC@fG>M~e?j-2m7hCdhV!H2ic8e9~4?@;Y|PsRQG9qidZ z>ba0muphv`0&`-X$qQ_CJImI`ckP|qKM86TXFdfRu&D8$(b|V_?tP2SF|N19J^@D{ z0qbVqF?k)jkk^9*ay?%kT>EPm!X`USk}HR<7uJq5Qx z#y4jUF5~;Qop%L_F>rwG_r(8zM_`Tr-{|Y0Ng>a@7h;~n->|)hfVWqVc24zY@W*gR zAOq($XAabRUE!_mIm+vHltH5{qE8u#b!y27p+_$rIAn;xH z0r5k$Yh<`4#&_X{+De+g1+I01*8c*#iTP*18e=~Y^KB0^x@VB!_u%e=-+>eW?MxkZ z4?e|r&cNQqZZe14!M_X&G0*uJu8B2oE9W_QPq#o{dv(-^1AIRZ$KWgAJkGoTr=TZC z?K%Du%&>*)c~+Tt0!P@c(_^o(-H(0EbylJO5_|#znAefNK_B27e+^R2cfY^baE&*h7=vrlV}AtiIqeZU0S~adNe}HFJc5tP zJJ(bEwioBWWu5m+&%a=cz@LXkF*XM~z`k41laqn#Ex}Yg@85$xV6HP; zpUF?41IArrMoj$zOvOF#0`JARJ&r&}t#Gb2yuYg@`~fO>&+0nZ#kRjlBF6n^bisd3 zPKUOCz)fWa=jY}&Fg_LU&^z@$PA7fM@!fh4_U&R?HQIA{>(tH{JHTG~fq^UD} z4+^~N7wje-{;)2DbrJ7sTaNkH$y*V3rXD{{VEi$0bKI*l1(=HSZHc*`BW%yLqpq)T zPUq`DshnDAd&n_AN zwNHWlwSCvEzq4h0*SK8cpQGo%K0SRCa7}aVaRqd6*%;h0cmsEc9{R~QiSbz>9=$ z?H06ilh4M0Z^Zt_KP0|~AHeiphP)U#&vrBEZOq(X!|wv;O5{$Z;G6Ruv3=n8T!OnO zJ)A#p)*qN{0q5L)4^G8BzJfFMU*P(Mc+k`HXm|Dracg>b&o*4k9Qf(FEBpYin~A%x zcGllwZ$KtyFXQgdUT47l$-O7|0Zxf;YL2~=fd7aZ-*myYr}H>-#y7|P`MFTEyBMM0 zW50wuB<~mK9=s>SbHxi|sW;2|y zcZYUO;ha%p3Hb@meXr38_?_UK%57}>_A%C}Gk&h?TGz>eW9)gYOI2Juh&ksmb>8h% ztP|Eb+jpSgp9}Wz7SJ1Vejx7J?c6)~1m3`Z2K0xRe3d@N|Ht_^#{Dc@5aWIxehsbw z&wlM1@X8!6$9M+vEjFAZzGv`~9M3PvOZe98fsKE-|lhMX94oac{lk89rl;ot9Fe-3{H5_uV%Vf+0YX#EA+ z+)fU7_tv;(sqq5m9yV~+IfL;zTtW}$OYRKY8GCH!TVqefd0or-%}EWI3v#_@1N>j%dsl00>kqM4=wwcPAG^ljy;u9l z_ry2m*If7PcbaPyVi^Q@4(I%z0oS{Nw%#=sz?k?22;k3`Vf|Fsw-1~--jBMYF2nbr z0L2==Pvtuh_`aPL@XZxC1)1c{t(#D_zWas>dWw-g5QA0;HcIGam5;KKOYakoOl7wvjH8P zy%*Yb-a>u`a{I)NE8Oc>*w!zB@g5ul&&)OaENjm}&_g7UfqPW6*Vf$`QSh7e*em#5 z@ICOJ3tXzO#@`b^2L-HZ&yKj~W?X$8y^nUrAZFe(IDPkdi1tmZJK{%Z_mZ)#wa+WC zHD1rfn0+q6-viEI593M~)R~V?=p`uCKEb|0?hKveCbA3nkeK)LZxZ7=|03o(f&ZT1 z+uQh6u(1DBVyu&QwtaB1hihBE0g3#nboj=Eds0u=a3<$(Iscf%+qn(>=;Qtej+%^b zzYaK4)`s_dgz+96V((B_%tu_udrzS^)@WO65C4AX=V_42hZ>yEOvc#Xtb2z_W=3oUD z#546u7xlk6!p%UB?_Mu~z;@n@wx@nUYxmgB+oAn=@)&q$)?NpH16%wIyrUld8tv~G zp1-rK(SE*XXyXg)`|`lLsB5^-9XR{B*N?GJ(F@R#^9Vn*>-ou@!TnYqXr~%?#$&LA za}8szuXF*hJwy2`zsC(xJSt&?*t&*ConY?5cJ;Jc2!{2o23xzn@y0j>jc;JIujJ$ia< zD({;9Ja(^5>|?!LCbxhdwEp%hz!~<@--0HEJb%W#0lowKhz#$34l7>E)&7sMUxGEh zdIfw_zpq>eAJjLQ;XfcY19R-2SfC5=teh|4loI0`{0QzLu(xP?F~@x#fV=Pqz|Tp0 z!>;9A&R~t}72=t`33MRC-Gnp8JH3T%ze21B3;Yd!RNtRV1zTCbZ}C^?6k|X8^w@!R zZFAi3RAz9_lgTUCey1d~BB!rb%0;cw`*}=mp2Sb_y{ANu65$_Xf7h|EIg46Th~*kri}{`L91?Oyo_E~AE6$`H z6@HJs0?sdI@2>VHeUunydP{7V*ycif4gY6wY%RF~nz(;^ial%*wcgk(_)ozRwtcT* zmr1>Sta$+MS$W=h5_fKUyZ$bC1Ki_Op1_&&32?1r;xl018NTxzR5(M>e;=)#v6Dbn z_#czs#o!L_HshD-7vet~M;`*;sOP0Pr|ah!+~Li6&#s{uA8h;*<2-&}IioQpg8J%r z*q+I-9=76I`p%hS?B`5M#29m~ggrywAa~dg{awRzxe2!e?C})s`Ly*1P3;QK&$(;; z2~5SA<;9X7L4K1p{&n~bcmd9ggC>2v`!~gmeM+pLo3uOft{1>HJf9|AjQMSS_xK@s zOWijh#lJ`G;XX5ZOTF*WK4J}=Ie{f`ZO_~q?N7)}pu;xDnoO(*evkeDJpZU%L7U?l ze`E{{J>V9=T>Gv-2A-Y$1Kao(n7@y9&d1;{z;|&B=WK~JlrF~K8SQEAJ@7fOS5M4b z`&hpN9s+-#aE&1D443ik>#XK|4LbaexO2{cd;#8(HHnz#Imhn7$MEi9gZ(Mm?^|cO zf;L}$3A_LW-#R5?tao<%SZi*950Gm-h&hAr(Ai(2dtwPY&>bj1&fezQ=Of^oZf`w^ zzra7QPotbtlZd&_7sRiFCI@hTo%pR+iyQkG$cu>jJx<*N_}4Yo^6hsQZWr7HLB992 z220=_S>xXs%r)*B_kp%Z0&zWO_jhgg?U~Q9uYx0N@9!A+2JG<|Y_ZqC8U6sw*?@g) zbA;Ru+PPAUzeD&l%`w)*9OtxWz;Ez}{niBU<{v;l5jV$m)rx0o z{1&iR7h^2UuX%Tg`3}$U7nN)K@ohW<}@tfjURwha2o_O zBVb=YBhFRmr~g}!u-lyGd#+dEjX$k%vWE9H z!}mVtz_)us?odmQ9@tyX_10Cp{+iq;V1vB`nOxuZFTg&22WB9FLTrond*QfpZRQp) z@a7L|Q`W><@8=%qu$6YUYVXH=**}HRcVgUo`4{oeK#NC=GrNz=@Scx$2R~ikJilkW zH_yjer{c`^7WPnIlsw5XzQ8{M&fUj&ZVCMrzFL_RKLPIP47i6?)oZjd`*{ABfLsFh z_jl@~*{r`;0rOIKA664-p+s?Od*H|EX;8{eJZ>d{^e?c$e{8{HNfEc;kck2H(4N z{XOg%a4#)K{U>~7hHiNg19kp~@BL+syY_qMLslmLpvJW?%CCv}9^ZiJ=h3_pxlW5?wSwRSG9<{}K59F7NE#dBPWuu;si9XZQnlfnQ-?!FC?+)0ujB z^L#J+_~s}l=d=bQfooZ-8#Q;?}m;A430HC#KRFW~e8-q;4; z{?2Pot{P?#bB%je5l~>biy=DN3v%YQ&YTVQkW0?ao%i!=*>L9H68iyI`QiFZK%wSbs%`!gV#EFj>Wf`^ zU4lPFKR~b1<~+rg_h;w<@U!q=X!C-e`U&4Nb#C9T+yZpO#Yb??Pxw>d z3<-XV7WV4#cZhjU9kw+G@P1~!H@N_FIN=<}!1GV=ioG&$jT^x8>SG8Ee`r62e+#aG zufb!G;M-Z-!#lV35ixrO_8{hgUcea};`mc(ym~>Ny%lSh_($@<_v{?@cOQG$GqAyS zZv_}D)Foh_&?d+Eo}q{N(e_nJj6Vati?_i2wpgk)=Ge>iUxNjFz}eTmUqLr9Zw+?{ zPJw4qqD4pB_xCgSHE@j%xTbx@7Ho(;2PCx_a1LhS6=q322eGu1no`UapM8hIf*gA&ekbgLIWX?IBy!JyXH{a%E%@@szb;yE|?#9Z`N$lf!_o7Jp>)u6##cZw)ZM1ip_zTU#pMX~W+K z?!!Fa#SCqK_v2^z7O+-P+shm!$9S&Zzx7HN$yDZZZp`CVZC0x0_S_WjJUXW%||`<}LL3zndZ@m>S_M{=Hn1MGmm zD9aij_!w(_AKuyT)%Ii7j#vOiJtt;wu^`9K-v)gy###$JLMb|PQMeGkkL8P2(lCH&8bxz{E3IZsIG;aq1Bv}a|FJ^U`(g0A|; zT+8p7;aph5+RyP5a34+;4 zx*3|nZvunir(SO1B@Xp*5GdIv3a9wN8eK_Ztfdag*gtm5x7IW|d{xaBN zKSVzT$JjmC1@1e*2DpBq?;!ZYd7|y<{r4?Kf_c8r>)<6g1%583($$`R{+D;#tuE|mD?cRKk?#1_I|Bk#2hR-ydGoICa_mPOXCwmn0u{{Ix zjD1K7{Qp<~{o+G$*F6P2c}+a;Ie1S34|Kruy9ZofncC(IKp8)vx9h(rfhUj!eQtrN znBQu0jQgF@#~S@#lK%rJ*v@$ybl6G`{xG)*F?*G01e$nP`#Jj#XyVN0>&N&#@`iYa zZA|UExeFB6_rAKo0qS16%8GUDr*1OGzIJEK^L)}I<{HPu{tj}C@a~6t@;W%}f*u4N z;9Q7(P5vctv+8crzbDt(eZvX(zE02^bBN8=)%MK2pA0XI5A(tq^ZnX;=ugbq*Tnu8 z_^!?GfOBNDy-$H>uHS(*zI(j^3chtKpxDpz-N#=5W9BYF3V?qELK}PuZ`{w8VtvF| zyHjI+o?X+}0OHp8bLOW>%zDK&KZo}-{s6SIa>j`9d#Ioj=!ko+)@1wu$F5}z9NroC z>3jG7_lWhtGrf-Q{LZF0n|po;=j;W$kFlp~--heZ8F+Tyli#IFe8rgd7Hq&L#QqyN z+ad5XbRU>^0*4Do<|`k1ibT@ zXK&ASj{gFk(3zYj=01jh2KIn^@Z2`QSSHt6WA?fZT-%=do}aRUQ*w;!xUb)XsT6X| zGd8RFExyM8EqsUe>~f5IX>TVJbIpKP=H%SNpMx&Odpm;jte(SNsj+>0;~6~&+PMna z9?sDdHz%+~58A#Ge9POVZb3{L;xXR+f5Lm#f!~Sx=3$5T?z?w?8Qo$_e0v>(PvH;1 zHBf2~*YeDpI74U5^F~{5t^50!ye+zikD8-aenIR@a7NrYHfW{w@w_tdcSC0g<1wD? z-Rd90?O-cijQ=h0D}3t`zGA-|Xn5B-tug0L)qVy4Ki~=I;CexgvuR(3Z(=|97{Gh~ z7G&%P)jlvr?NqEefp`7KH9uX*SrGS}UxROe@!>2mhqEE>I?hyp@frG98;KY{A3srR zuZ!Zk#x8*mNgrc;`+@i#{hZA`EK?hhy6NY0X(mS*7x(2 z!Kc7n@6G*Mo6W6$(uQ-LUje_rU9X9sY0t`c;rGElh#Fs@SHSwK@ZPDlJw2VvnEiUR zx#pdK1a}Btfgm^FgmKT-8qZ4qb=3*G0~r{91U$2Ife+xEx4;V9J81VmXt<}uJ_B3e zofOu0rd^P*muUNc2{zbE^w5h~0Q-AS&as1*>p&08x94@w$mC6(1fN&&(LU z`?t>fxDPseA?5|~mvDRNOX%N&C3ce|>&q zM@^Gc_*ZZl&Ut3|?d;9DM{Et8&7U!!gCMub0)IozG1?hE0#W1k$=D0xp1(7A-=1@4 zj=&yj(B~54d0Xqb>{4ToskpDd!G8sgFT@gcKf@dM+}!sH1iW%+PhgKZ{0!t6<2`x} z@4Bwpff;BL#82_L0>Z#BV5l}J(mop?HmE@>+G(3 z8yFY*?x)EddjnSBzIl_lJvw;*?feyRuB)KQaA(9*#a&`K#+razf^X%F!xwO-4L3*k z_#LobE$p$?ukT@oZLcuzf_PVcmU`m$P|SCK{%mf0%|QUz^C7%{ANU%W`<{>^=UuNs zhrd8)^dRW#)UDu}-@^smW#A0<{=XHzi{T7CM-b+MpKAO|wEjgYaPG-I&p?mgnhE@H@f%lu4~Iee3-lqDc>D-;56Q0w`S!YFO9r0)MwQZr+g^=wF5R9XQh* zyvBcAIdc;B1K?f?wSI4GfZtsizpMSso7Eie*xpS7|IgsK_R}uZxu+hzf&UGh=WOf> zcm()6TR7rN*Z{oWt|*^X2`t`|YSV=KFaL?>ZSSKxYgr zi1onUef8Ja8QZ(Ob!Y6SZ(n;^qus>w@&93*;l110g}D8eGI;m@izzhEB&--B<@JO3-#!VU2l&m+(s{9Eu06nv%adGtpA zklHqrYr1xdmNA}PUvrFkclHT#g!9Nd%RUJF#wUFDcMbTx=DSJMOl6OJXUOm!X#HD` z+!=BIT_FSg0ul(2!J9kWH`oEwyF8zh`Y(z3ZtjBXU=G(&D+=~-&b|YDA)kT!`THH- z2}szURe~P`-2*xI__aCsZH5lsnYZWyze4wD`=~?v&e;DIT4}X|9pjv?FU;-44g z^gFCMH_)DGP^)<6pH$BGKPOgVTz?n)dpQ5S&e@dV9I$=kzX$GZhR();bL{BHSYy8) z+ch7<{}=GS)?fjwI{+Oyp3$*3aGfvl?LXbmeYkne`x{z+DusO4x4$!9F&^W7eMf8j z9=`x3V(hQ}{Lc7$>vX*yKB!Z#h<^d5arg8YaDSho{kd;En$RSle>c^5PP3O}R{+qVJra5PJgV*b!q~t+=Nn_#cU{&=;kP z@pI}LzK`J?;1baGoQz!o3+w`KpUybYPx|%z0{iBjdj7=RlY6w*JoDGuXzdPU(1QT( z|9|hWPoUkwrHUDT4-Uao;@^Y5)|lh01#XKD{0uxF*Xw}m2XXs*p6>~KWV?6nOI<1NSRG2bZxkI+N=fOLMWsReWn+gC1Ym!M*`r0`JJ)$Doh#On2ct z`yNg^(2DWr_#cA|Dp26N{iJL&%y6sW3HieG0qX_Ih^Z1 zB)&0Tq3zlERxg38paZ_MwnueOUQeI9@V+(A!*z@WS{UD=GkU14TJ8uGeAjJ#6Ta*D z&a6?o7~?&91@GtSU!Y(w!5moMp${teg7|%q@e6fR2{?H%)LHAyZ7E z@7mu0=hu#!GwcD*bN781yA1}OCVTLK?>X7u&!%GB*r%2A?0a*AVAXz4+V4Ms@3a_0 zG5ZgKuSAUb_WH*ie6YbT<`El2 zjlTtc=8u81bn=L`U&Fb+oU>%KHAM~Fv;F|}h zru+LP{wrWV`4zd&;a)@s_ZDa?eT?V*2(AFn#?OXpIJax~8P)E|6&Wn?ci}VeUaTqb zyXXZ-*mvQ5hdurZ=o=sQO^V_i^ zXIrnp31b28*-gdS{Oqg!d-%^_W*M5v`?wZ_1 z%da|!&$0cPZ_i`w>*!PTS7<+z&XhnVcZs&2=Vnh~eGoGzseySz9j@_L+>*!Mt-*)x-C%^uJ;7U%+cAeY2cV$An#cs7CG0r$G9F!l@-_-vfMH}U7d*4;`1=1wP_56PEXa69?oXvaqD_ompg@0CK&UB5K z@q!&O&f$C+e<~fZ47|Ht;@0X1@LaFM?SLcf4o)QOUK^c=xz_{iY)qbW>d~&Xs=4w} zV`(BC+|PH$JJxPFbLzIh&xrrV;Tp!840lM}+4g~Fo1#U>83I4ZnGrig8@JBh?rjFN zJzKwjhMuhjd=GvB@A|$Cbw`gT8QXI^sxjZ{U0~ltO!UC_bpw8dF8Ho#o!T`!wEIYv z3-km03_OFNCIi>s!X+TrR~}}lH~ty10^ejoz5Xs*+Zqv|14$?`u4SHgc?6uXiTU;y z^E>sfTM%vCUHAnkMu(_bhx1Gh^{C8rVC;)}Wv8?=r^t|0Vtw zd`MjXcf?%#{5~g%C2&9{&+oFquki((y`4G85lK{WX5(+b*C6nlct5w`x)|T?3v7S4 z8{Q*a0>geW%`Max;?B`T-u|wWV??`mwciiM6S0f(*#~0IcLEP^;;0Pzwgi7AT~!|!ne16YT7zrp8FCT z?4#;iH{_F3z&?IgW9C{n2(cOV67<-vrQf0b{4Bu0@$3IKJTZeA8c_9ycpMIA+-@N9LJ@g9v3<`PfbxvNw9t7LJBP468wDr}V=?mho zz!T775#zd9P0lGXaRazk6Z6;jE1>rN%=-lN)E01PK7JGZOZZ)k`}1D>9QvlGV(*?@ z_w4shLAUwL>*C#91v>%b_Aa2!{0Msu&V@eSm7m)=wx5kcZ3YMU`yf@{wL{>GYj?(+ zjNOCp@jY|TG2wS0V|x~UFFM06_8fgt?7IY)i7m9zN9YvqX9m9g{JC@wOvU+!8p!9w zel!l}Ik;{Cu9IS%&2#X+JNzt1UZ8Kot;`cume}@OfqzzCk^(|?g5{%&pcS~Uc(uQ2gCauz2gnIPTcOuJ^fuo z3>FRvKEML4Sp*SWkG~545m=Hp%kX_&^EH}#EXcpZPc6gwT{Xx1 z{Jf(SfZX?@CvJD;`87Fz_xc>T_nCDd!)slPcj=vZp1*)=Ai@6~{}g0m`#O_7%y-1< zOS~r6g9MBp+^rh1cmFN9cdj{`oOK8Izrowj(iUay#i=z z&U#w+FjsG8uPb#;5AQoWoRhjtzCk|&YWD7cyjEiT-1=_y#QF{lI=)%EmzFz&_xcdH z<`Ot0dsd*hl6ZW23}_u*ap z+46VpE%_<*M`d)WsaQhx;z@i5mCYf){Y# zf*rAYS*JGqjskDbpgsfFUV*y@?E4!K@XhT12H4YHC!kb4@UHP)aF37izOSA)qjkVL z-IB}gKo9o`+#L|a?fF=D39P9}c%O@!YyDpJGw8Zf*9_|@y#?p@)H!wE;_Z{E84Mqw zfF-=|kk8V)XzP<2x%+OwoVpEI5Kk>rr(Hq&&xsx}zCRsaGxv80XEhdWFV_|Nc5s^7 z5W{;u^`SR@YOZ(gp#Ck|3FwLCy))-;);Q~S@IJq;>h}H!cz&(T6~TSOtKR^Pw`Pz0 z4e&f2br}R`)@GJdOQKn@=I(g58GH7?nl;}1!ic}1&gU}+g_>qda`*Tgq!`ybUxUwE z-7{Uo2Q^dc$vwjk-TsN(8uvK|PtX?l4CmdJ0XEhGYB2xZXa-&awoa@eSyRcVGpqS%Z!`KR13(49$1gUf%)F74Qjs zNo=3z;FP*t>zBj@xaJDztjFBH#JK-(zi`%WsBz}$tYm}rG4`?7%01|DVdO92)jk0q z+6LX9orj={pQ=CUQzg&(H){96KQq_-fM$*F_L}++O(YWyx$!)Nla{0*Uj;wfVR%EV{-ea82M}TagDha;UD8X_tD;h?LaGvC47UVRO})f;pI=bp9zI8FhIMEed=KaIw*R5M;hJ?dp24e&uR&Dax+~;e z-FroRYod45IiK&r3OJ*CWO(EDei?^6uvbDC{th-*BkqBBpQoHChxq#x(}^~ zv-crz-C%IW9sWA}58z8+k6g7@=R4xueg=IfXP~W(T3hh@@E7y5Sj}2F=eN(Yu0m1#)Gy$gxzByLpMyVvS76oj827MeN9=4ORo=UqQ}0}I*6qM$xZB{6cpv{1 zB;rhs`}=;Lkq5cxKry~Mo?+OZ{KANP;QSeHU-5|CJ=>k@&E4ZKprNqppsm-xL^}sX9W<@2m-`sq z_hUsov(6sCchkOG;LJ%>D=~hj+gsSj=R3!@J@ocg_j_6I9@+x$ngrJ11)8~g`5v!; zYx}Tz>{-z4=}c|kE7ar|&n?#h-x2%FK%fbqN1G#)CvXHO)P~-AcLa-9DE9v>M>RnyxI|1>Crkhft48R&)|*i*W;Uo zvHhk-eh8dbWYEm|j(mA{{Jlf%3Gv1nw7%-+<@N zz5(`6Va2$IzvsHwDeKxAHSa*)XSe}N^-vjYhStT%_4tp-<$_pfeT@H>^Y8FaL7~Tm zq4})NfIsU#107tmAhxHvdoMtSYqlo$z4PCSJikaWsvSN9pT*ySzgO(gOVzC!&I;GV zo#B5?&0`R?Mtufv?z36|^F%JEZts`CbA;N&PRP|i25aJNt;sCh`tgD|%ve zHG7!*46dRjK^_9`lw8eO^RieI565NhnTBzFHF!6V=~7uI0vb7JRm&JyFZcfA%de$W1) zu5nh^WO!@+e)V%ufc-CnFM)dodJnAE_wd%d0M00v!PZ(hdpn=+ox1Cs)8~DH@2O3| z-UXlW2WWoQPl+|x9Fx1xOHk^%67T2rXNaGn4cZLcHwHnCGfZtx?wJno8QuOj$&IxR z{uOy!7cuVr1kT=xya%4ick2p#!UxFk_S+J>$H0*<$u-v-Z@>chj@|(!26^}+h`k%< z_j~OV;JOaJ2hMi}61+8;*dE@Odnan_EuX*;!v*mg%&GM*_iMhv7j)MO@6ONbQ()c4 z;1IaqlG?V%b8_c$M<0$s3ox0W6pCO-k!ez?q!Yp`MoIr z7jPA%81EzFtvQ1W@Bn1jz!xwh_HNAE`Q(q`J&$mI_wInt{0ZCwpTGw6z`l=xcX17@ z;0k?uU~FBfepWSg`^~9O!~qg{+iM1YO1`f39lG%rxR3X$_x{e|vg@%v#vaaY%@PEh z`)nLM-4?{~mGv=U>TYwWcHw?VcZIKTXFz#7~KD|jtp?0F1#1$5-j=vwdA zJw3Z#^ytVmw#C{{gtydDS~KXH0NK4+5-=G2;#R0$pEX z>}lUMxp#9D?G{)P%N>G5-6J?>@h%FSu*V!&=Xajp)9Tx*71lLm_Y!Dg1&%;pW1p3G zxg+nWOSRs+u=c;v#GUGWc1!q7-3-4a{|pr1^IX8mm#TO89(cyUt6#c1{=B`8H{QY} z;C<|o?^oUXSWh(P@D8tmOfTyjmT+%@GrNC>-UH)=zls*b3((G{wynAG18Qynf1Z2Z zzV?`-{gV6%I3@Nw=pATQs9TUb_ZnSvaD(A9@Xj~r%c`jtV)xa0{6US)<kIUU;GbEJ@trDod-PxjQhlZg zK9ReZ`$zS@bJk??Z;21ptgYrVQ$MbC3-fKHeJRAXZmPc+clL zHTN2fIH^x9#&f@AjnJ&`g23A9{jL*-aC*<#sbSW;U#ro(HizoO;675rN{qd{M}PnK zy;!)0Ug8G%x8M@+&TfIG5B$V1=z|F~r8Sv^oTr<~O|26#z zP(K3;(0T`PLi1Y01^ zp8BSF=Vz6l6Z^TEgG`O)T?`iEJ9|dn)>dWMKhT}ay?Wxo@YX(q^WCwp-;2&V^uW8P zXI+9qeZsf?LEHg3P2PFtU=0d*MZXlPquI;Pwfp@8T(ABN-t{xQHQwJb-kH7zJK_}M zyLg2>6KfgXH6_NM6-Q|5J^8?+89R%6`FRO&M!si^caD=9n|IXD@y6c2dcr68E&c># zVBI0!dGAp32IxC-t=)(9?rop%z>Zwa{=(0sns6?)3nTv+zQ?bD^((LdeY`)LoVhi| ziMRvSU%flV=078T4l=QI_I74x6dn8=pNzpD(X<@n9jhO}&*0B%-4fr!2hfaXaCze8 zoBitU_+4mS2R8PZ*gm;4XS{dgyI{@qUWPcv=jvWXkgxF1sP{~Xd@#KA!rtw!gE*sY zsEtWYg7&HMNh355YrF(3-Vb{hild$H2Xt9gtrI-vNJb z@H{C-SmzqwpLtzlzYbjt&jNm_MvdoF4>U3Cjg*N$N4J;f>L$9HYt=mOhqjNazdKHW zYchHQGvGS)9(Wf2UH=%atNa$fhRf)hd$=xw1b#s*hWml@d+RaS108v;aEAe>J^}9U9In3s+8q_@)H>kv^q&6){GM{3gzmha zTlBQ~8Cp*1#JJXK%Bi zj^6>)?BMTF=l(O|W`X7zu~`&*3`I6U(ir3v%}hxSQl^iM)VBY@L3Ac3wG{ zfwR{Oc<;e?;A6bK+&fs~T4O)E{yenC-Y4MHcw&8w&w38;GyfI!-oXrHv;dj7;H|NT zpSg2j>^{csp&rz^wgUyIi50Q>26WUkJ15tixhM8#yz7SZkJ9)jT0uM%ijjhwE%Lhzp>_-Ur{sM)ks~`n09r4=hs|sFD+vHH#GOLpV|t|`_uxzhvr%} z(G$s(F@H<9c`1$i4@L5myVCm4)IXbWa>c)w6&HOz7 z64-YM{JwYqQj93X&Ld7gSnC?=eAm>!2e&|*eemc<)E$C3n)~%|&HNecOf%3m9v{H| z_SLKB$|ua;O*8J%UQ#RPenEbQcebr-shQ*bPFzp&4e>DFgtz}-@&3Qfw;Al)gT%T! ztdURV)qEb#;CE#~TYvy1Y5{x#LEeLX;wPXZo>_|*T8{B^=6v?@^WnVK6*To`9kJh^ z0d4{ByWPLqum&!HRa?)U_}-paOU(iwcw^1K@7Ze!@3Z$=*>ljzr@t3kW3O+)9+;Cy zjPH_~>#o7S2A*dP^w-HXYq#Wca_i0A-YV|%;Cb2!U6@ZIRqy;o<< z#G3c;l-yp{M2u@(pNQo%{2^G%VL8V8dJK00=Q-3|6Tm$?YL4*Ui~IM~uJH-JoyGVJ z&UxI&`euRFfdc2u8?XX$&FrJ@-ff07(XDl+IqQ7at<7*f=z#0>1-!mH-f2h8F&Jh| zqqm1h!1@!scN_RQ$bw$Y?6-qkfC7531szxdKj;4q5@_pY@O~cdRZYF8&o}slHdu`N zzp6DK<9`cof!3#14)^Y7q_D<4-QRn-1DxMGo!eJn5#vnmTi|-2Zl2B2eOK(2iJkpZ zpuT`>*2lQ+61<;dbKik|V80b8aIVStRAJ4RcgOc^M%-*m9Mt$;KL@F5&U65}%DJYa zPKy{dpHU%h)=@JD-c{fqqyG$~7}w|%yzk*Pcz^G4?hIcldi)ArZ3gV)-fLiNZ)5j% zKJP(psb*YjI{G{yKO@(2jC=ZQT^wtc$VEy_euQcnO-dJ3VKuJv-_j$7P~b9t2M)mum^;e` zSmzzO=S?uLvCl)x0erqye~q`7>wjY8{tUbiJexgJt?@a01f1LF>bxb!`JJKNw|&*j zdt&!Z)CIT3is!4d~JA z=X;?K@(dEOz4hK(tM9C#)_ka=B!z#Bb_D-hbnovIuqFQze_=5`tH3+Q_u%8H-U`v( z+a4Elz}+JEo}YsidV(9Ct0A$^Rec2tdJkvry5W3q-gAN%e5j9+mgsG3wU$(Uh_8ZFuMN^WwfM&{+e*{`em3-5uXOpP^hc zYYx$dx!T$$;_dki-QR`#sB=&BA*9B>?(I82$G3YuAYaxzSf7dQ)8qe$R^;kuOa3Wb z2fhQxAj3_~d-c3ccfWo6*SZaH0ls7UjPB>$JyzsCgEf8&PC?JQ89w3Fo!8!5;GOP( zcRaTSv(~$O2&@y=L8^L=vHz0X_vtFo+xra6iQC=u)ONr#`wrM^0~WOxU5DS>&9g*sKb=Rzb{l5Tn;;H4R|29zTJXeEt z!*lW3PR!4w=hdu@7{ZG`&gpdn-DmbGcm@vP+MNxaHO{g|+u*y29#!k{#%*1~Ui1GJdd%dLIJ(?X8 z+e7Vh{JO4nO#$-Xz%6N%?T033O@n#I3_fRP?#O3%-~T(G=U4ODI_n1fEAbq(xo2?x zTY!7oYYEQ44ix%{9$Z6T!L@a5hAZ$l!DTRT)CNev`mf=C0EJvXw+C?tiZPu0arHgC zGpyA>A#Z&aj}7My|vJiB|n1-}7(<-=Kk+97aVGtcB+ z58&-{13$yJdl>4-*Wd(r|IWAr5#u>s)7B+oKev9Dxn>Er#NMyxSb&~&%`&m~dmX$4 z>T=>SxqY>Lc;8)T47|VV%!!*B&%k~7zX9(cCc1S#OM6=9J}G41oBf{ydqs?UUn1A~ z82kFJZP5$))DCJ-*Dk5?Gx!R4S1HEIPszQ%Am6|r0cRO>IL}qgt98V?T4Nv2HPlwU zkFlRU)x4wj-1N>W@BMoJ!)JgsntB)GJ91omFDL5*?Gx4vIl;yeD_w99@hB&ZshQ9!ENC4NCB$Z zqr}+X{XB2NXSi#`{ypTxH52oU;tAS!AYwdAyW>pmnVfxz7Xf^39k8$3D{w%b>w5Qo z1PYwb?=o<$du3|o_`oml$rv0`v%;&F3irw2OSCy&b2fX~)4hfJIZKLBwH6yvLk8$hY`bm#A}Yd2NH{x(q&rKf$ko-nm?7pTT0{;U1%@-vOy=-j7^Y z`9u4l3Hx?H{Xc+bcYoJpbkE~^ymJk3hFj#u32gP$Xv*x$pBcSd& zy_$R7gTD#vy{zlx)vevYAIamjVLtST@mZ=r0OrlC>B#N(XEd=P?%}l7-~6kpKgGM> zpbb_0f!@P;x86k|pOJe$@6vmC1n(IV+CF)!`3BB?55dQvM>qGZo__(nE8kslPV60A z220?X3u}7do)6*dFMpr-1u!1&gPIJSNAFqOOPs*1KnHLB1iS^8fc*wT+atdXj^V7y zz<%qB4c?i>0dQt@?I$zD`@LhLCwP0g-oLAT2GlcrfH|=+7l*_v;C<}y=AL&rGkOO$ zHoX7Wey&Zkz;Jg0qv*k^PJB;ubKx#!ye*KNTX1iaq9bF^mHiO=AC2c4y-PCGD$ zTY@fFkADldsJZtm_Y(ws>_Ko$yby98Q#y|4DK=B zepBnveK(K5F|gOv3i?-Y-l^}hH5sm1JHLDZhae`pb>4l3_r1Cge9yd(LfxR%_ix~8 zop<&i!_+}lvweR3PN9R83l~>z?SNHR>0^fk4 ze{J%h=GHlzGkO;H?&zbrx4mz`d#BDIcaPk8AA&+Y1Kvdz!9w7>VPBtDA@3@msr7z4 z_#V!+_Oze%ewM!k3D~2VbEwPhf!kmUcN1S?{61}aCGr5~cR)M0v)aS;9eNVgtnvB# zyT3IbgEhJQ0bcDfT;P|$d79-I@8NUwr@;4S1p@vD@`u2?^M0N8VjlF@Rd=nQn*ujj z^%?K`>bafaLZ@gBH-lS%VLyDLev5yH_7QOZOCZBpo6)WH{><&^e16xjfcLcz*Hfq2 z+aAtcV!S)+Ji{$~z-iWXL5@%Gt`Xi{GxZJm8F+{0OsVN;pVc+zaD{w}Ut34)e(v#- z+`ktZZ>mO@;oPlegSLnEcB)x-`0MxsyqtNU z=UUfd=U9SO)%~2(tN$wsIV~yYSSApLnS3p8fXdPJ8wLS;WltrCyPF#TdGz-?a-n9kn z6Hnh^^$e`>z5N0dbFhMQk3Bf`@A2OlqiO0si?<+RyoU|kDVPJ-1dz+<&MvpA>xb^jBvCcX^3kJtG2 z*;tZyhKf{);T3vPf+o~z#D zGn{LE2NIgShG$G_oTwQLZ|~>Sd3V=9hC73EhPGxb9y#aksqu3Z_QE2@xn1A(@*Yos zT#r7h{n{Nog|}CcM-QNNF@FEQK%0LsgKOQhp#2>r;=$tm`kpw$zd`podA?7Hzp@^) zhj*%00s?;kuEUuZ;+Hi}>eYPKo@E2v+xlj~n&B+L-NDbvd*Wtaz_oeTXvT;53nQMv zIg9-tfE*X3jvq8R-@MhH5=V@^o$DC=*T6fq&fi0Z^RQq>z6JK`fW2R#+hdrGK0$1qNMH{=;0v(l z=j7-3l{)bnbZDCUoPhO9BjdB(7|iYu%y;~{Jgl<{fF7mJnKk!wR;jI;Rrgmc+%YC{e6-huC>=ey`%3#Y%YAENur`ar~cj{joa6_DVv zyr@>tI}rL9@5pnQU(~@{)8@6V2Tk{P)u%vnFVEO4$H>VSVqqWQJvi?S?FhdQyyFGv zsq?uye<8j{?70$f-Lmo>nrEAi@2ls;_Vk$-y!JVIV%-}stgT`nr=-uLEv@G0ow zv>fB_OdHntIa2>4$i(gZ?r*+;_x%mxIo^Fzt=$oe1lAzacWSq&v-exDL|@@&*0uMR zdVBkwXr1>w1NKU2_T7OK;Jf19y*#){-U0gsxpOXwU7Nx0$?bVYY)zrYT-eXtIoe&h zR?U0zyV*5~nr0hvpJkg}JwTzx*t2HhIkE5DhTM70x7FMK2<(9++|)YO`Y!kmc_*t6 zbo&%)hMDmXs9D3=CzD%m-)23W=Qx0O|8wHNH!JABfOGwsAif8z?a@+2*2BF-bB~VP z8IH;Qon{SJ;KYVF;pOINPl0QEXT8@YxDFO@L0$XI-GuXd+!?)tg61Cc+K;ZoJNFuG z2e$<7e{WKoS(AWwe+qA}-u2jUXY}(K$=k;s&D6UXzh8V8ol$N>jeHLR9KjpU= z?A4>&%b)v))(dQjj~b86*#8lA@;C6-Tv&{s<2C$a;P>liAi)RdfW3RXXL3IKbj@xv zUr^_ny{8^dbRdBM$LOoO<2}E?`#yR`=ZIQI^#grWAwB@k;9c5(4t#$%;3r1CXS@l9{vYVB zbN!;~nYd?71_^Xv0hd6j`Ifj7j$3pZQn8 z6X5rAd*0RrdYgZT_C0VGYdq^?V!e6eoTX>oGc?!Es-ECJA@9tIJ1{o}de4>c=M!#A z?A)I11iT>b@LI(9ZX~>B?t1rgriavi1_mC<`RwD&b3t5OQ%${xTcf#$T7aoJzk6uy zyi4;Kzq@zD9kJ_z*gN|f*bw_He13tJKnHTg%e&*>aptv`z10%vfX~JE%h?X8v0s9B zzrY)B(fa9n;{U2#LHDz0pJ9IT4A#`xw}3wY>%H%(W$OGc5DO5%JG=y(r9;=`&pw!jB9)+dJ=e*|#>)&;%SU(z7x)p;O15HOwO+EXTLoYb7#-? z1orIk_EdWfbDw&gGtd-hF=y`VzQSGyfj` z28bB%-uMuF0rt@k@SdZfdq(%!s~Gy&5BN;lK8af4nNGo49bBizo^AFmaZK_a-QLfD zb4=}wI_LNuymRF02$u*`ZY+zKQVHj(+l9)tn(~d7yJSAVhQix z8?E_Qa38dOp3nR9?w-p7`vmKp%Qfz^t-Yxj?&XmDGkCuf7HZTtlk=HB1RZ<g!VC5Q>$)2wUxc#_knp|xeo9C2|nX9 zxoZYb>iD#1@#-1sF&%!)MTa70_1=rB*aYpQ3 zL5;P(KRzq-TtOwosJXYu)C%K3OJG6nJg#?-R_nW*(R=U_+K&7f7)M=qNbXGX39eZ? z`>)aL=X=&TYyO@5UDf;yI78Fj_w%axF1g2QqL&!=mkZ$eGu+hd>d0oa0Q&9d-m2lsPVijumrBp;B#vIerj`{602wG5AZ)j_t|cUea^@Dzu{kkPr#bI zqgE`4?Wg_-?8xN;E!P@ny9VxnC&1q;oXdGit+@r~?7zp`tA`&9Ux1wOj<15Lb*#Gw z=ey(i3YdeAbp<5i*J#ddF5k>}hSpWhIozi`UuW`ueE$;g-T1{sw@;6L2`*|6@2k)^ zKmzu5t-kdgJlZ~-=W#aYu=f>ETq6fuSEvo({@%Co9DWA^oPi9i@6nnS;``K}3$&>@ zgZdU;{RF%Mz5{JO>y3jt_wgRA^`5+&W}d@7dY`ZJ^sI5lf_IIYmSb?kA06=;O??ig z_8and;3inOHb&L>1h~eZ56;_q7iu2D`L3&B{pW&THF4bP%1eq_dU#6-z(oa`2;#@7hnStn1N5#=u?2Y=Q+cBN53TY z&aU9+pb&f4E8zXygFC zwS2`X-nkxuKF0fMeXI{S@6|mUZ{1hqo-Y%79?y9Pm}_zyumTHk2`#`iYwDb1C4a_v zFQ1|LdGYf$XU$+}uJ?`(!47yo?*9Tb&2`^^b9BwRS&dKd-=g{4ea1P4l8Zmq=x^bl z1Lr#fxvsUyUe3G^e+t~oJ4=%q_mvmUI<<)L|DB-s<$JLBKzIKy;S+Tt)N7paZ|;uo zgLQsZUjgr;Ln~le>%Et!U_-91*6fHplh5$pt-ad(@*PN`nw)3+5e(0s{ERj3-QnFw zt@U;0p8N##)QaIA@E!2^e+0bWfA;*n+hH$iFLYwhbUNA3@ApDJ7`pqqPZ0b0Zu82| zCv_eA9{LI_;TJ%k>;ay^JA=6oxDmwSPu)&J^Rl&x!5RlXu{NyqSGZK)}1c zdEcwjIP^@cCfYN%Uf$l$eedr0KKI0au6*abhXr1X7;DuEv9sPJwr=P}zh>6h*Jt^Z zc#Gcv*Co8~KsLtYKBLC}ZCm%dUSs#|&;n@Y&Su?nYG%Yf7td;qGidv8&D`?{z0KTe zoZ$%g9{dk@0qmV(+|xb2hw~lk;k0(fJvi6xs4qc1-q~7j=hEcfQg;b7ZB*)?=_Kea1MlBwnc=VDt&v~h zza_r{f_y`Mo!EXps}uYSyz8dsGhe{TyXK=>6ZG&|{0bCebKjp+@+ENY^P0=gz!qpe z*IU&1JFD0SPrz?Mit*gmIiK@(Z~@G{W9JFrKKAO+hBJ`6zh{+q-xuVsz%l5^wG!j^ zm+zDHmw@L_AkY%fe+i%A3b2>!S3nz{FR}V->g}2BP{6`YCvf zW;`|5Pt83qQ)j*N7T`Q3#yeOO_r&I&*>`URdiV@C!+TcOKf*h&`(6iUaBIB%ntiyx ze5U3Y_jy>jh?`R)xg+IYxSd4Xh z@IAcy`*SYAYh8>#*S2U^;r%;_pOty-;j_%t*wg;Y>J!}XZqXxE{vPXI0?$;?&#NDL z)ILwpeXeWZ?>fUBq1~?Q+J2e!9h{#X>+h(84=vmS9D!rte22h!?SBYz<%hK~?)eeC zdJozx`_yR>%{l zd`XS>aT#Q|0`3v}`-5xDlfaBmslN&T0yvxd_wWhtnHNAl;M~Xf0kyu1{(Y!eTdj+6 zM)z^{AfMVHYwf!P_O@Ri;~Mh=;2NL9ob~Qwp1=z3zsQ|u4{v;4>(!m#=j5~Y>`iC& zu+N;@ld5Iv1FYek$#-^xzkv_Dci{Rne6wBUzJ~YgzXNib=Wwm}?mm63wMWE=1>6#J z=J*0Gp?lU-um<)u&cHJiYCE90_6#KW1%3zifwLNKDxZS&z?yI1eCO3YV+Y^h-mY=4 zsQjE*-Sdb-{FIs*{02;|>HmTLJ@6bo_43W^7vLEEbI_?*9Kf&D$!BQJF4#wSpS{p^@Wh1?uYn-RYw zegnP(u3dmG26^~nN&X|+bD;P8@h28zpJ(tZ@Dg-zQ_JKl`t-GzeWs=^C$?Y#rgpPx z&g#r5Mzx*U^Lzp9A3%O;1H0*(1;NGIW0=-(D18F#y`^qQadi(g9HTSdX z`kvTl@I7#^L8nBE7~f-gF{gfN8T}AW&F59f<(j$PeP(r?x#pY;>w(WcfZr)kK(jtZ z-97yd+ykyj@CmQ(I(2i+zU>Yo#(UqOxvnD@u9I`WE&dev{`h_uv>CbeD`4*P{SG_? z9eD=&1bW~dTW{{(fwzZn?tg#{Xr_LI=DxG47kpTQ)~q9b4d)zl`~kQEw&XpU_dU#r zPvjl2pZBzZ^IkjP{&GRQ0CSM3)vLF2)8%6RHN5Y^Fng^}ta05LxxDDWWzgw9nr60rU$b-w`r3amMhCst4BJ;=Zroc|sO zH7sJR@9@LCc<*bP@2FjZ74Qu9UV_uwgEm9|XKJHml)sMVXghDW>4=* z-MO7{L*C&NoMw%4{{S8VYmD8iS&8xYVEf+(exFB7hKGG)x^mqAztK)WGy6Nk5|kSI zyxha{UZYk$VnpMuci#bMgWw<=X3NKxGux1xkm4M@k`))>;64l)Ef6brtZtCxqm^EPk8UbHR3YZ0{76Y znGqkt34bnSwHWtU5<6c3uIVZgUMzt81J?Zpbii5cJAgjs?(M&q9@Th*Z`M)c9!s!C zO(xgcY`5X;pV8HJ`r1FpwK@QYi93zlYE$qx)kHAepcV8gDt%J zqUtmJA=m-qYt;Dp{!idu9X*^gRlkH&6FqUjuZTP1X0GeuGuWV6>$C638xnEAsrkNn zr*c{s@Anw?As=Q?#OyC`?=|rjWY;%~_uqBa`Wcv0dtvDA_YTfJ#v3rT1^Mf$AAF!$ z=R4>+VXeNt3Kl&z`q9eT>#e?_-s!-kUszy2Dc$U z20v%*Io>n=#Hb12-u_&2-ez;+C7kQmpaTJ%(Y;*Lfj!V{D~~zfWq7~a{9cI)b9srjDS=NUd#tz)e}Gp#q)BE~zJQR7(-z$0|y z!O(q{2{^|bdC`aS&fxm2k?Qzu(iTh~ESm&AL#0>p+_T&tFe3z(}-EykKN_*2l4yMBIm+-FH_{({_i2E6yD zAXDpI$T|0?U_)F$5852o^wfG5dnDIQ;NAK;^OxG`yKuxSP_4Nw}(A5bvxou zs_s2ow}wl=x&R$@`gdpt_?vj2z408ZfUz~kzeTf;-)Z);PXQTxRJDJ{AA#Yn)Yzi{ z*Zl{uUm|a|Primf$9oU%)6BEX$=%0(8*m8DKm=9z8>|sQY>!98mw{{S^&2(N5sMkH zuV$Rk+&5zEpWuvB&DDlFczb5}1%3yd-8=S7ckmm$dQ^0H>so*F0+w)F@a*o`Ywo%_ zlinJAhu(vuiJq{G9s?-YeXV^$UhrCho2kb* z=NY+Yv!CaEMeNV}AoiK4E%0rh`{apSE5RS+_E&e_4A%kI>&^ZAdLKQomwR0p+Ao36 zeTR28@4MB^h)=-*yn9%e;$rpCe-7s!3lL}pbgltvOJE`q zle@F0dt3JoWb&yM>d)XlLmT!`C-#o7fkRNJ$%4Lq-`LCh?%>wMLr-FPA-8G!z$fB8 zINx=3&$|y-&;rb>PUZ0Itl0-0+K2W8{#)=V@Ls0onj7F4{wm(@0IehU=bd-$yV1wk zyWovqp!sb4J?TSJ58&OoUh^J?JC5p`$JNyjD&GGHoZ;3rmhS&NS-_bKT=U)NiOx;h6x{s>%m#P=Ij=CQ2IRbwZEdlS< zy{_ZkzpFKm1gq(N|hWmkTKB)5!{0ufO!Oh5hCWRiJ!MWrYdbnoR zoPjkpUxFpL=tEH#<9)xW+T8UZ;5BPAc>(*Nk8$<`;-L?@=T~>1kcV62=Rg}~s&R^O z{W)u{0CU$jvuBC%z1o960<*T3q9fu1IBNp@1>mpQ?-FWF!@#yQ>J@8Tuv zu3KAeI4?8I;e7Y4yA4W=1%cm^-vgQWYka{6aILer#_!z@PV-K@gC6)<`2;M0Gh1^^ zoQT)pKCyQj@ZR^w|o$0N0KKIHoo_i0jSqJC)zd`q${~+F4Tl)pN@9F|>2hNF~ zfJ>l5(<1z1oaX_&>kD}XKKt*%(w^i!SQ96FhhL$2r=GR9hWHJ*16-4UTA}_N{}SFA zz0(fPIjxHtdsgqP!@JIBIX6cSYpS=`5xl*Qh@08ZGswRJtBGb!j`6?gyhTfb{Fs`8 zPuAl7{_F4=?8CLYL>=yJ2Iu{q;Qx-_xUO1>k$3+?c+ZgGT8|)hALr^Te~;P&a-lxV zMqG$b(F$?1Gh#W<>|Ocq4Xw8|p2eCj#{LKB3-V^h0ooe%uRu_*b@Bdpsw?pBHJhxr zx1681+ra%jPi9>LbK)iFiCt%{Gc`Wo7v$D>qf0dIxi0om>L?hj4y23ULP4$gSVOd9R1ogXJXu7(G!ddOi69eO+r| zE}p;Nr8j`R4!|Mt2CtPEe=p5=XVskLfEu+Gv3s52J$nz=;eFQ4hIQm^eWFI)b7X2i z!fShYV`q4SKLS0mX3t-dzXqPeGy6=8+rAML0{2nJH5Hu_B&hOsm zlYN}+6L{Y#pTSqa^J@{~vvRM1TLI7IoS);pub&w8-cOJ2eOlkFM|+3%E!e@E`~A4K zhIo#5?vH@aE8y(ascQjKjFAqGE>-O%B-*xUW7tj5V zK7h8Q#^=}t32?@je$Qu)x9tGSrT7Zj5R)o8{j5LaEn$$96)nc&3*+q z*AwdJz@9k}f%+Nndp-kWd$;ve4e<>AbNGLNo^?~(p(Xewerx=p1zKIZ#h+LM*Ub0S zzT$E9_G%U}z7L+;n(Ls=SJ2!);12PZswSU70v$L-yM33u`acuTi3bbHh`k@5cbmm$ z(=4cQPv2$VC-+)|4&G<|5@h0YID5Hv1`6EN?6FU+d;CPBt^+I9?4f-NGO;$SA-3;5 z_zr&t^us;ieP?ovJ&uWc;)Hii0asWjAMn<#$X{2^ciDHbxCXQ5oV>4C*&_yN_`|)f zs^NVHyNPDObvSF>`#y01=XMU~J|_MX@H4O^PptR8I^gFw$ld=b@VnpudZv>)iWuuq9s9JdxX51a)ip z74WP+8)vc42`K2p9C)?wfM>PFvjyILGWrej*T5M+0c{rbKtI4cYj00bD&}x)2KW5+ z-EqDAVALhz74Vt*GuU3P*M|Mc55W_(;f`7j+!=7*1=xUgZr6QEooDiMRmhj>K~rFz zYqr48)I;FkIfj~ge^d_dt38Cz**RRh!OQv1J_kOF6_~*n`g^`_$gOd2`Ru+G=6h&s zymx870|7c}%u}uHiTyXwrWJT=oW;4_;|)llt7`&pZ|`OfT&te+SbOd%#(OCEOX${S zVomN4ZYJR8c)4aloZ)@|_rWdTne5S_t?&gOc;f{a_N@)%pHsgDK38jgV)6cebHj7| zjhf+JCPgpcyaTlpaM6RcJJxg{gB_X{G2Tm$zX9j@d@tp@if3>OkmT{|_HmEPz~>d< z!s7j$etw!2_+_pAMdR^LKt}6852p4M?F=~E!E_IbI=C6|vwFM6uJum$sdep#Yx=0a zyP~Z@p)SLTQhmaEhrUn#-OkVG70|&aYv`{Z&JO=I7|u_9zzf$pQ^FVW41C_^-obOU z--GXf&oaB*aU zHv2ledl%wnOX7X-sA{ea@;<1*?~y0)G4Re7a0RWy5AO`z8L@qKz*S&(f1;{2AEFk^7Fw2XOrys1LQZeo6lL?)aVOdA!>L zkkLDk1bl!3{s+xF^c|Uzs|Og~9a3w(FS)kPJ?_CB;&0&>_#S;&PwX@EzjtkjSD^j3 zuWS#@-gEd8gqA)={T*!SkTz3*hr`eS*{M=X0}9 z{|jDiYVv-zu2#M$e@5*7OX3gB_sBiG?+@DjAU>fjT|;4=Joz_rdd7<}_9IA?La-+`^Bqh^ct z1TOG9;C%9)CGcl(_VszW-g|V;gf@_jZ@H%i0O?qOUk^6g!o?NNh5qCdV#k>_5^2zbNY>P2J2P^O? z_zP%#)y5yg`FoMy6&sLZs{(dMj&&!*%2q6}z0U-+yX_eH8{ksb%0;k-9djS3eI7<#RPz&$pqVj25h}riMaNQZ` zYo0xpAQ5Zg@9Foz8val6#*q)O&#}GVKF04u_d11h&Y?!lHGhzJ_uq8hkel({cc72S zwcZZ=51?Rg$A4e>nKj8bXRTeuI=A7B`~J4~U`iL`XTv_mT)!>O{bxAem1pWKCEjJ| zyTUcLvZ!k+uU+58>iG5DE~=lss?XTvw9bTR&{p4yY%f$tvIwZHN9MtW@b+Y>L< zHZGpRc{kR!zvs9uOMH8_*f2{=ASN$7pBZqLCX20jhiy(DqqgSUeEb0Rxe2$uUOU5o z0&kD2G0#N)4`4&y&xD#&xHrUHuN;^Ia-cy6oaqRd>-_RVAM|^B(5{`-cp+wP zkM7YAiJ#TD+!A{Z0y_b7GupbP`T_U1z46UWu+5VT^FW7vO57Z=srlz<sGVa4XZ|B#4QpMPhwq*EcH~@}STjTW`FRG;u$@)0R+AlK z`W>;1?ax1F*p@r^{%-01JRkRcDcG+465jhZ*S^Zo2RmY1>wF2n#am8+^Yi80yX5%Y z=2`oDpZl}7u#fu?nVJR2Er9vg!Dql3E`^*q@ilPnDR9pTEU`P{fo-1&NcaU9x7HId z^o9%I`c!TE8MD88wawz+b`(_i<3ynbTu`4EHrS$Nmv5oWVXlYn^2Vj=?FI5)-e0YkVVx zJm)yVo&arSh5dv)=d!Q03;TE^0m3^w@s)+S@%%L6S%NHoVU{F#kHf`#TZXXK3#wfVDEU5_n6j!#D04?;v9v z3!q-<1J`ee+kXd4@e6VNr{Fob2Fz<`w!!`Yu17D?{*HQB*9B{}=U{CdxaS4B$xw$p z^;g8~W&IAWiFK{>8*~V4XH#3#{1p5j=z;w@a1J~lYu{(xZBU5oyLJH-YuMK}(_{tr zIsOD~{VDc7m|`nO=vVkX`UQHZ6$At_>!hG#i zbB6`|W8E*{d+;?_T#1`!J@*_jp2-CJTYXUAnjEtBIb7@M9d-tT=DRcg77|!QR1^*KcACYdZTaV(lzjyy*$? z>^f1!wKII{TJy+QjKQJ?3%Gw07lXhBa9sy(z^{O3GQ~faC!T=X_2w11Ey*$d{2cbV zH|9D|z?<8HR?ptP6SaMfbzoBK`u>a^ftTPEK8Pn#rNAlf@dI)m0QCw##}FE{HLT^n z3cNi$+XUqQ0n}?bCB`>pJ^2MN-*ww^nGgShoB~p8XN=jA!@ zjC%ZSIe<&V&ee#0GU&il_@6+DAvEq6zQ-3&h#414c=a7%e_<_a%YOr2fnc37`P6j)0 z$J#NT!KH?u1MjR5Yy15b{%62DnY(W5jy-4lyd@s!p9wXrld5)q_V+#;XZ%E8>~S7w zYc9c5z&!>0@555%s4ec(E03v$|w+I{si+I_#-8~0+54y=HA_L~DgQ{Mv5 zX$Cz1Hgk}7M9yuvjNPG)o15@^;CvZ9%z`bqM*E%*fc=b_V=RDkS;yab?4_UJ&6D@7 z{|KyIccN;zT5;18s7P=@e=(W=*_z#U5r1&?DGr^bHgdk_FWkN80>;&?PreX zkwCn6bZ&Y*An1e^iS_c6EytnFQi664+2;}LM3`3cy=b4c(PXzN?se%AO3*y9em zpch~U3N;niFY$x;b#M%vx6K#CJUi>{0{1q@ca5-K%Qep&&t?i*JO_=4&1&uht=Rhn z`x&`cWeRW4&wzXNOx&Zo;BSEQ9-*B<{~Y+)G2SG{__oZm*B#>Dfe%0sOK`bCA3PxF>(Uz5xN3YM#1)d+?rf1|4t?_ts>AKL<159la#SGYi%((Z|3UX7KhA1;2^w z8n5oQV&+WYHXz`qpo_7#b_UMvxvj9xX|siS_|Ej2_%-k;xB;4&>)E9k`+iHz{dV|r zS&-9oBG=E1bvt72^8hTsq+*J8&v(fy=(g6oc?LFc_Ba9^HIx$Lxt_p%58O+JQ|v#1 z^RBFC≦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 z zy+9Z8gm36RSQ!UH543mW8vA$$TkJ%B+n;-1SKb^sMSh8Itb=z?8GGq^B}RYH*ze$+ z?_9_$;5IQ~9cM1&<_i5w#Lat+{tOHpy%lZG-@OSxmqAQ%zB%jMkDPOLF@6S(Sv$ZC z&d<;xc9U=L{oYs^1J;Qczq_pCnjb&`nRpLo=Hjo>)>aqLgHxbHjPLr8yc=LcJcA`L ze+IU|+Ao2ewt5c)>%~oCp1quJs)O4>+xHrJg|?RG>P*i-tG~j22&`$HIr<&?3*cOL zzyf6YDE4>@?gBaM3~wWt1>beftSr!eU#k^i7jLzs+z`F?e zHQIgow(O;ShCKu3dj{6EUPr#Qe9H+O1HZqwK)(Rz&*U}vC%(O{@gDpK+ulvA@tD{r zz&|oUN2*3^a2#%njptIbNqYwe+ABJeiBv8+2DJB zzL{C&tUb&cRoDE$H-B0446m@wx32f{e!|Inx4r|{4R#nE#U4-Kc0h?19p}G9Y+GyX zsqq(T@ⅇ-qyGRcM6v?XTkL$F*fp>-sf}95PwaxK& ze0$vjQ!%zzxx460{vfPb;(NB9nf8pBwX_qEvu8p3mP(9EFaGKKw9k;w*-gc>{H*ea z)N+4)e8`X=&WD^OT%fOlCeGyE)$Lxi_rV4%z(?fogPWj_aZYpOdTJ;1I%&W3^xe+5x%pzW?EBT|0B4eAGrbkjNb$Ax8ToNSAczP6Z;hy{!J7= zfdKAN?YnY5?Iw#F&+*}NvPZ1PUy*CCHGbebkNN?z4EDhW==uc+b{yrZsv7I@Yb>Rv_0p#xuUTQDZA?*PH^+ z#CI<;ej&%23+x{I2yMQ($H0Ag_QTID>>y{0cC8X{zXN`r`WW+{U}tPaeHGuj2f*+0 z_h44n4@vxC%{EtyHGMkadTi_UF|y7+e1?e4fqgb0fjRIU&OmQID8vR}XJFj3U4u_{ z$Gb^YtZj~G&;jS$2i6PX15ZxlPsp)<6ZSm@%Li=MU5qL z*4Q1|8U6o(G1Q=^5;4|U!finYt)Bc;{5$vm2b}q*a{Rxqkq>H|=S>Q1h=0S3Gjg1D zfj_rjjBlu*^*du1B}ik9ccGkK$Z;m?yEezz|M)`Aun^93@ZSI~fet^3CNa+6+;dIb z+yII-E{dEv84UYJ|CHR>9e>~G;oWbbo4EFnn0r}+6}hMACg!?k2JXZ8p1uTA@hs#Q z#Kp6!6Kj=oo}4b~*<)vHC1R|5eRt%B`>yd7d1v4@oM-I}+KDy#TVT!{_@;N@w!k@E zr<54aPd`TtmDA8|){<{sG*Z z^*m>5zQsQRJ0QqSpnxy&?c-eDMMtcimvi_|?DGk5?c93In#fDo&Oe-cT_@KOckK+k zhIj2RLEuj%vt~ui{-1&le=70`T!MQ9-jmxKn}|JfjC*yS0){@sme^BqwmEgKgEP2$ z=u>o0uIKa)-?*FO`#3=XiDKrU5u=vj@; z(ZZY->sWW*k7dUFeA(CU$}KwATIQ|viEn`OSZe{yFXVN=H}DPId$j$G4L#6-ALtXb z^ZtvxY5(4QV%EEc-k{~PHNb+HYsB5EchCXXB(vtEa`(}`sUi;oWI>L5`)GGOyFzS+ z{|0{rqWWuMhu|$S--GqM%Qlm9yaVnvSfebltslfaqYd`C#Q48wcD|@*K zGzo0??E9U=3uEm(xA=G9j?kHSF{kDxW9==~g7VJ1k51$-)K$#wVw`1#tx20>6oI;b;HEc#P}hH+7xwZ-#AM zdzhmvvCVNm-q}xyYkmjU`n0tzH{t{5chN=OzV6NYwpS9YQF4rLdO@sUyD#_O-pm@? zH3fXPJAVJlHwo70J7W+3dyueQFPFefu4(ME3iIUuvisrt+g`?+blCRw?Y{$_Z=1~= zd$&7s@8*ibX&yBKEQs0bKwy^|xAq!8TmzacvHe_q0nBZE0^2$EiCZgIuAtpho545S z%b{n)=inOl0^C;P+iwMW@&c%>q4vHm?T%~Po~^L~p0j;Uv3(ov=O$V{z-#P}fpcD| zyz_c4L2aS*G2X`wINxu8MC_uxB<|0+$Dqw}o)hEu@Kt79&6RTHn_1n{>)#H z8~DQbvij$9)VTH6;1TO~fOlYS6W0#+!r$Sq!+W0Hgg4L6(kEa+yq6=_`|nw+828PU zU>5XSxIGZq_PUS#4w$nKh8oqj_EX^B5A8hzg*pjXwLppWvviyT|sP{{ZGSr*Ynwd)b0D@XlX=#F`FR_k{Qo zM2&fd$3U*1#I&vd4RN`9K(SYeaqdJcgZA$Z<{P^L5_U)40zJ%!?Yp%13?zJc&)L7r zJOphYu;+3@-2TpaQ6k3A({JH#0L2>45nzYdp79vt<{S_&`oOdQ6|p(+{C^G#@gE8P zmb@R}-lIE^fPDha{0uzzbHO*yHBUej-&`>dtiV;cTi_K~5`1c3vdX&6LIr; zu!1x0Ti$|>yhJ>MskD9GCda)lYTl3&R%WiPIp#gX_8!ha z7a#Uu-bZk2^d5MQ?b%!3HJ)!z+_#X?nY9P#IlkI^+kj*ICHh>*OP~X%#LqeW4B9My z&)9!9U7N-;{X22tJ5jG%4(k(G;5(n(e}N5t5YM2mx+I)#-J7#`rZ0BK zT7j0kfwt!w*u&q!J_h>AaQ-oVK3);G&NZ~>9>fdS68ju~AN(3vH;7NA!(YSw61We0 zIo}{~9rkr%{yocgdj}NaO2l}^=2+Wx+QyT>9_HO0Yn<1Gn#1+x0Bd>%O@f$j;2+@F zIKJYZ7x=e`pQ3#iS3rpm=W$Ybdne-N2YQ9pHn&5&SKp7EXy-X2ejnIdB;aSVuX!E1 z0QH}D#~j~?^SnWO&wkcg|9jd>e7M&a#GJ=i>#KhZzJ_}WIygnX&Ei~{oMFvK4?pAO z{{lRVp{})+7|(XFb>Rze#t!aWusw?haEIXHJL%#6NZk5!?4JCk8qA4#SFgbazreLU z9hpNs0ed#-f;{|v@Dgr;Hl~yq=lnNuaUB@5W{>tWdjM_#d1o5ly*aK0Ng(dy75pjM zd$8XO_}*Q!#=eQ}V@Mx*EQz(=&)^R5Z=*NpsCfx({A=Uj8!+s(@ngB+F6?W~Kzqj4 zd;n6-bzh#TvzXg@XZ&`KpAq+7T-y;3*2;;3{R`s08T(w6zUJGzBX`KbJ_bL^hg(p? z&;J(AbD4oQgZuUG9nN0JO<%6m-OUFa!21G5QH# zv5$H79_}j$g6qWg!J@{A4q{Fh<9>bn{*0OKW$3{g&qm(Qz(ujAac8^_GWDk7IScce zXlHV70qc5>cR|asZy)1##c*ci{}cW>=!h5m0NSVMN5rk+yEv}#fD_htwy7MEgL9EFgVt)m$@owD5jNCzD{Omek0uSK+27FJ`b2V4LBmWO@?xl(Q zxCsiJa|ZTQ+^aKN+y2hd#G2OXWBgh44sMRW0z-e|1=}~ihVyI_D8vKw6$ixr8~z56 zSL9Bx=RmuII|SN__2>AWe~QuHVB4#Sy*&^07Pvp_yH@y4{tUkZz5{!}Ir zPRW(qf)(}*yun_en>deoImY@uw)-ylq6hXr6vV#<2Otq2W*7 z0wl-yyR7%xVJk7o@$CKscMBM|c02!;pJMD?(0_s7x*oK*5yYG1YOD9nLpziI+Y#Tr z;@P;~&r?SGJNs{d_1uTKckxTGd;(Ste?QoVOTgKkIR&U<%yaTHYaQzuGry0TgztIC z`!hBf2cbrc9}!nyK~H7L+ULZ2bQfc<9_{BhqgTX_f%mfk$sAyv4*v+8f*Jk_^l(iA z+xMWh&s+E{I-9R%UkNUQ9u#e2o^RP5*CoUm>}4O%*mFG>>|^i`;(NgQeVntyS((4C zdB^0q-=Q~Y3*vs~2ijP$HUo76_O-rmH$cMnEDnHnPtIlH8!*g8%=r_(vphg+A7W?l z1GXrvOTgN5{2sdlo})coy9Ta3McXgnl_%za1+jf#z0ZxsKo8$N)?C6pL|+B2F~3Lu z3Ao1j#SZogE#6|^0?r}lc^7mS_(;TfUe?Xnb2w{t=q4NNyTq=5>%cjtl8L$I9>{R( z2_G?@%@MH`@U!9B*~i@5_<^3v{}9{OoP}I`V6DA|x1QozxTkji=Ds%v3^DvOY|mRU zc7kpFQ(zs>%XNyp{oQK^mp~umImx;1Z*ZBIvcUhO=0=Qf$+g9`$VQDnN1M9@52~L6 z4tTbU8VmSuu#F3QI{O=9-l4O3-cxy1B0t3v}a{WZ+#EgFmo`atf&)l3-v^66}cqYDi{SNftWOtnD4m!iNJ-Ds_ z_t2xA+up$%b2`_Wk3JXd9@yg;$RC2V3(y_#+&XdwLEB&0tH(d*NVrSfzOMJqzSJhK zke9)ZKBDiPg@AXTA`>@fQ*CE?f!`4iVBFsRU1Vzx`%1*u*dG&ir-_dWuebB^u5AeGf&;JItpP8vF$g%DQoyk)o zs*UzOtXhE054GKnYUNzW{6VksM=x_uwqz3HJNS>whB$&V^W1euFM>H-R(F@z>xL zzVjKghV#vUZ}ly3&*ol~j+kfV`&Dub>PLSRVtx*TT;3?5-vzL5lQ!cs_%q^L z@CN&*>ZBOYOg)vr{|9S)Umf;E-oEyiS9|6^65=n2+4lr|4I+M&F*tkV72?<6_d&vL zGR%v=A!h~r&NXik;u)B4f8Sxjo}L5ja1R5|dUKU_4(gtD%0sky?rV^!8f9L=|98#F zat)ZyR9N>8?S9WC#_wbI)y^>!Yogu3wfbvn_&K-&tQYV~3I4!$ZwJ7)I|tjE<6PH4 zCNC39*ydW-H|-nnoQ*B3PUZq@bZGq^Y<93TzzY7!3sPeUYcf|YpiA5*%PrF=AiGO<%Iq1F$Wp$*EKG8Oe|_Vq3yQ> zEAS<}b-L>NX6D$QPo_=}-dEfHN9K_e#QlE#2Dop1`5kQMQ+|Q|7UUS*VXbc}tXKCk z$M-(mXGfkh&A=;S*3l2*ay?k!JKqW1BVfGAb$n+^VCyo#725h8ytQ8w^B(1%gJdn>Ol$ap zZR{4l`G>Z94I2A$y#(1Es>=V`t*3kc#F=nHwz*0r;`?i78G_#Ewgg?w$}))vM( zw0)g#IM?(+T(?Ku9v=bUOR%O%;Crv1gZm)E4QEZlRIkXhUv3~zv2QX)pSe2lE7thm z!@mI?G55Cwfo;CLXR$>$d4Yc$SZe`#auYCrfIe|+x$Zl13$ds$XGVNoIs5+sSg$9? znz`zq5x3Whm}1=gb{7fzGAP7be`|O6zANw5{DCJHpxGVvgIzv{;G+0meoy>Mx%j}^ z!+zEjp6!y{nB-`m5R+d6-$zgEm{l!oX2-~?|vc~oD1;`D84&b@SFW~%c zI6ymFlX+d|9hg5A`}xL10+(4oU90~wux?N8W6ZdF^T^L=YQ_!l^r z828zs{Wq~6z$>sMKZq%=&(+T{+QSUkgTU>urpKRQ`&oJhI{ZES9=QGsV*Z@-ZU#+E z-n;d)_AT(vjIDrudupt)jfFA%sC7GZBIcf7?~cE_B=mJ~LhLcxb=uBk{l5cyxxd1C z=Q3Y?3hZy*Rb#dPocN-`diJ;r3hO%{U+}e!We~)y^9HPd_KcYETyva3UM>+6ZQdie zj`%we#8>#PcaC+{XXy99n!O-Teh!>p?H-QN?#s97StRn56}I&~lLPF>Xz!+vfgZlM z{(x_dExd26gVVQ1W*YlV5@kF4SN_-0z6@E$%vC-CXlr=e_FNU)=+1nU}Bw*vnj{i$Q(( z1AlLK{JH0z=rw+}mC76wIkN?0Lu-|0v{n&$mFvR*d;xJTv!pAKk_2kMS>2`NQPv=7X zI=-`{82|0aTM>qxIM5h;hD*Zs)80JJ$RX6mS;| z{aLG&0IbbbAHu%?iZ$kPHRfKN$DU1`-~Rh>*40kY*wG&9!OMM$Zv1ezgA(__CQ$9Xzp zpJ69~$R857uJ#_ZhoE@x9j#`T_bMz&COa91~jt>ot+T54;cUfS*bi z<9_9Y`%N`g&|S5!!`aV0-9ldi_VRaS`(8!6w-t6~O-2`BP4_>{g;x3)e<%79ZV>zv zIDdA!4{N#3H3_Z*evV!M-`$*e-vBq2z+b@akoO)vJqz;+ygjV%9-LhQoX2-)pCjNMPNl>D9{yWkt%N_F$C?M=5PSqbe22xP0=D@X?fS6B z1uIO^ltvZ7QGf?dA96a7NhHc8>|J17E=zQ_NZ6 zTem0X+^@h?`WWA4LAP_8^493!tm#_s!_Ta7B@_2E;(oo?KVkn!{?zKS&X1n7%H8<6`oVlL;G4apP&X~YZ!&GvdsUudflV}p-+yi-w*v|>WsZFSyx&9kwY5TKTxZ-Foi}2HzdID{bHUa(=P{gjdOWGq!5tBIZ$0*X zY-ebD=!pFuf8!e98}|30DZeD1$qVprxTnA~_kJ^20dtOk{mn}P`zpDv31E-GMo(o9 zXPqtDGqRqNW9(D#d*Hk7i1~J{vjhbsVohe`Jt6in_ysWUxYi5u+^exHxS#1A*~2q; zeIYmDcWCV%xL-y8^6of~zmFvRsW_KC?tulkD4y?oV7)bHXKh{|)F-w8fqjX*_Pz_g zywFa-_0AAAU#`Rc7qJAarCy=iUOi*^o|tbz&VI_W+2|7E-<7u5=E%Jye}+zQgP?s= z?&U7py1xaVf>iV7XnXs%f_%^TPr%Q!`2{p_ufCza>JvD7rx^GBHU8yEzUu<+gdESo zdVXe_*tgB~ns|_#Di*ByB{A3h4z&BQzHixC-h*O3qV{e(Vu9TxV|z9M=UxlGdr0U2 z*0YB*K1CPw2DE!GAt-;7o}5CKI-wrC(`RG1t1{BjEWZfyiyK`xv!3z9siN z2ywXpo?!+gs_AlVi z&|jhd1X7H3<*j*2tlgJ2R={)U$P2Xm9w5S6Utj^I z@)-Xn@SM%FpYz)zVw`ihQ)2JI0@zc%BG;H$gC1BbvCg$i{4KDqXXF~=O-}LuL41au zgH6@$bxGWH-iKU@5k2}7V!sA|0Xx8TNnVNZ>^rn|AHmPTzB$Nnb}{Nq%%3$qzI!mo z^YSjPpaZP1m!KnOfqqf>Yv@~G0hBK4oud_NT!%YDrxOM!&;UPf`0_w!9|RSA-vhkI zHL=cEl{vm=Wo{q!{IQ**;IGi0o3m_yXY)!QWcc40zXZ?L*&TY;y{;3?exFGJ`HE-b_fG>daxDVI%G2VfF zoVA0SgG5}pf_(^9a0x8b!GD13ufjFam-kNA#0$ER*STgQf&VSM-!!vfsFx0b#4K_ZsO?SS_x_Yv^zJAYTX4%^Sa z=X@6ov%zH$z&+X9`b)HDAexwWK>P)~^__7827#No2H4+obTH9 zovO79yyx&1JOS4BOuRemn$zm4UlLz{9Fpv3}3`V{)$59P{)Oam8BJ@O-ym z1?C`P+*iR~vu1{NM$b0GHCYn3rZv{!08GVs?CqKYzQ8trL!L3$OeOF=$5ZrmwENxy z^%2+yDL$-l{zv3p0uO=vnDVaMA#R@N@$H{$-if-(0(%a(1rg&pSZ|4M?O*|*c!uuqtu@D&YqG-s7!320w+|F^&GUC& zdw&ToS9@s=TmiXi=P+;BTjl+JHa5o>a#!#>)~v9FId?%K<_uBcI(vIw<|#9@@i!pA zrp5;{#?Qqq;x~Y69;2^=fJ^ub?1DDdp)>JL4spLrVttIC)$ho0zZXURkhr{kF3Jft z?i069fT?sbe(u~;k9|>GzpcD`QkvFwT@I~L z20KRkv%2m8y`A(;@aCNnGw$C}y_;6oH{_n9)>%0hXuRB4Aj8|g?Mc4ns4v6GC)Q47 ziT|>4uFWyBZM|#$1@_>2xBzl(j^X!2_%*!0QzZBw34R8CUNZawJ(YlSKTqL~(KpeF z*Z@?)-na(z*cok&$GboNj&Y{n6LWom7m55Pf$e8e-Z|d^*PILdk~IPT33mdflHvXR zXAZ2W{w$58%vm#$b&(Li-xA_MPF+sZ1;h z#2nvu7xkRn8}^*omK80;z?i+68t=X`xKbpq_lq{u-{wpNeO-BxbIA+-Q>kbl@-0 zpWt_uFT|RxiM@dPU*OLrxfL<%D%Scraeq$i0Bf0FDnDk8=VmSQZ^8ctSf}mZdKo0p zf&1|9(SF`NPh++TNpe zMEgvWIf${puvUE?JxGkILmT%D0=usm*)e90Z(;`8`88hc`M95#Ae?U^U5xL?`TU%E zhMt{Ju1NcQ?Zxl^(F8=T$^Id(9U2BHgI2q6?O+- z%)t(@1m;?M4HW0C1Oy+`E}U-Eb{x+y>%d|YmRkp;>(Ng!FAA8Ue5aV zeS|$d59_=q9^_ivdpW@u`@nhB1uU?S(5=sF{GN3MxIeK0KPT?px+c|_ecBr(dM-0~ z&m_nAyQcNuk-ISFy%G=X4()rjuKf#0#4>P3KN|)6fZS);YqWj_?ys*k+)I;yJI0@r zuieh&4Zbq?@NJe9<2nB~e1|;<+MWfi{0wemj~LfGyR)gy>43cOJpHaK*i8cd0Wo{7 zz$tb=;f>pWZj4;fSM9tfaGuc&-u1rcb(;2>0|SID2g;d>7;2 zPmKE}tu+@ElkemkxJ-?yINOgJH*}x(Q?r< zeDBPC4rfcRKVm0yKvomGPOM;W$ahT>{jPE?Hr4i90_XScw`l7q>Hya0(F?S*ya28% zUwr~#{72vE#CAB-nV5f@9jO>+~JhO8wukHRPw@9Z6Kl7(CvS~!LB@8T1<;xBTM7h=Gepj)>YOuHhSa`H^+SC8NNLu z#(G%}@$6k&Kmcnu(SOPsxjx3bmCx9&^Y?rA*03NJaOVC8?k<>$Ylro$xd-RELt;nZ z68;A5nP;FxjQ$GWb?(78e+9_d!x;;<{xS9vbl6Ye8lUj(bqZ%K#k*7%X!G1>AL9)3 z%DKk+@_z!ZwRb_w8I$`r2-YekMmv+^`N;R?6Q9?0=5_c=AAI)6c?1%C;3rXKm>bT| zoBQ98(_|0-K3IX7wLu58?IrJLILEjm&~k%d`#sy^55P~N3Gou+p55mG=xZmgStIUDd1Imc-C;-rOS{>J#_mbG}fpuM< zV$8{C@8|$L1h;@S-NOPM@JS#!#?SO?IOF!{(BhO_&(Qkr!!x!{u6fUiJF{@!_i|ua zwXvSuKzDTwndf5OHP&|K*K^BpP7m|kfd4aaZht1brit@BCUzIt*SA^FCC2YQ@4B5? z5L48`_#wP+&3!2Ax>h~`d;5E$=;74U`y^}F+r3HNw$@N5YBbTe=Sm&~cvS0kHLpiM zC1xMb@)v0LI0&5auYqqO6VJp_MJD!ZU|pr{Tf2*K?E=pFepd&v1k~ns=sCP^+dgaS zdnZ*&jOThv+`nhEvq;1h^F8lD;=^}l^S@wC5I+}e-{q1uE8sgw#HQlC`+0c+ykmR! z!0_M1nAYXn4v@`HChjS+W zG4MQ`Wh(m9H>G`p*jwQJ5AP>FtnhrkG7g;Q2)IwBkMZs^zI7hJS;IN?XXx+nQ}sLY zGYEX)c`V>}fahr5ZFEo09NY6a2JZDGaE3F`#QJhq!3taM6#WEkefRPu_8J}3RJ!0! z@QrogcFj%1d*B|tf9p6`tC`>uG5t2{ves}Pa@XO02Gp7SRpmn-KY)40^+kt0*RSyf z`ft1A_pLLWRLH6X?k~1|4x{Q`~dJ_-6e6YcpnI9cX!S-eV%> zSsdC=AP2;qdxPKdjprDD2HAfL7x>1^31ZKITu*FX>n&>D+s5G=n}I@}qJ0(q-$32R zcs9PVCet~N$@km>t@xh&8RR=K=FgqsO~gPC@6^3|7T%q8m%urulJVu&#$!CMm*gc; z#W^10e+yjiJ#NgOh`pWX9q57Ims9ajMwm-E!n%Ji!W>53I*A@0uz#|=CzJJGC2u^xx_uAe**jID?=W+p4a;Sr{nEGbz`;T&P@td!1qu{Ypg@6w3KS@Cun|HugBXf~IWz||Y>W_%F+(w! zp&88ZVvK1HW+(scRr?T@N%Y0QB; zL4OP;#$$~4=l~sfdT0Fn&W!`tvxj{%Fh{;eXQ1y|r+3D;Y~CK|;R{G06IXJKeas2q zJMG{U*I1DEH@H)DiE(ZB?X1?gj%yDRW6lA-zw3Mh?9n6>cP~$X=X_Z{fwSj_V7Klf z58m&sBj8y$ujl^?^zri=XFLN_;2r`vt2K|nJ{Z=3D>atT#_oY8VP9aaZ|4vc{6WZb zo=#sN&gK5qCB}E;`ufh`{)f*w_H}IMUtv3oSYjK03EaaP^z`Y#G4=$QH+0u3~Y(HW{Y>^ zdHy}{bMPF@^x@~|oA{njhhM-U+^)FZcf>yh=IIA{gP^DQ_V+Bzn}SXa*Y;$t=V)Ab zZ#}gcc*dS}hn>jrEoE%i$>2KvN5FR`Z_gfWf6v%{_AYSN8*l5_!##GjE~7hq<0~M) z#b1Cc_~&TfopmCE4kYplP}K4X6yRsd*_w1Q_P+`j=AqBbg;zG%#%5?|jTqzJi@d$9 z%kU5Ie*zu05;1;m7sL}SBZ=lM%wj%VO{DSn>ec}{>i*6W8kXz#8Gl!Tm_41_HHLk(gs9)m#Ae`Y@Ez#jn{24DcLArw?B$%heS8<&zTu|LAu%X4@H0&WUAdL2~T zKE|EXSP-*5Ra?$Aj)8AB1UXr7XWohH{3kdeb^{&6#5HW^I)l&Xt02Mm!1a80YhtdE zLBM|pXRf|`*cCqm#yuceRsmWI_FvqdUBk73g>*SM}c=AFM;!I z$W_c;V0#9xzeU?;1~RZd0pG5i_8b&ozGvbb*8d8Z3%VFmhBJ}h z0{ML~!EWMgb2!%#_Lfto*mAz9Pr;u+0ue@$7=I={g?j}u@T{C?4pzW(+*W^vwx?p; zeYM`+$xUE?*B2$moE6+d;4F*U!ra8_@r8C>V@L>iFoE;C$NdiiH>`tx0q1v* z=YK@r5=4z}u>S`C0C|I5Sb6B4QoVnJw{mEa0dkkFT0K5gx z;9d@^UcmWzHpdzK4)*NMvGvu#dIfv{|D?tOeM&6DEA31(+zVp%b3NB8G0rCE8}_VL zwKj-NvHt*Pf8XF5zXSKMX9D{=+F8BxIXJ93Q?D%Wm%#Ixf{%c6OyCsfyNdrgcm`b4 z{q;exVuSC#?9;(zFvl)v(aV_w)W#N|lLyYE-^9G1?uOm*7cj1GXuWIo>;hKu zpreO-o?zQ^12VV;cZ^QpE9_U`6#E5wi8jB9`QAgn%W>WZaOWW4oui#WALDH9(YTlq zx8A-%yvYi`<#=Y-!DU&(nR7sH0B*yzR*Zn>QFF?S1Cf|U4Fe82qJ?xuU#&@4TfP&xpV-2#d@jxqWzQLj9 z%sBAvbTQ6Yu$S`0{W;@XF@7P~Tey3`dCc?u73wGWSFnBSN+08Qw6pI4=O}Q>A^uA+ zhf5*zPMotRX74re9Pi*BPe2E(4Prum1)kR$V^^`Ay|3{pb^*q26WgGZF~l|7`E)Vv z!@9<4yHDp1kauDUG4Eq|XEx7yf}AEpAAIYNfw9&*VPA)P3f>34r4P|!i@gN5v4?$= z8~7^$=g+|pfP1|xg#<)T+jKe_e{)j{d@3%t=|LB=!_hBbFEGA892il z-nv8VB46)R-N79Yci--J4RXy{U|X}4BX^26uMk({obL$kJz$^9;%xpmX|C_@B=-23 z;Jc2W-M@ew^=Bn|VlG@;-?|R&6wdFLLQa5Pnbn%7#Al$#&*V6(qF%#!&Yq3&Vor_U zg!gV%a9xbGTkHdKz!@>;yu6nn*IqrkLw`liGq42KceR)IbO`7CH^6Ifu@*7ETg*@7 zE6!z)_rV@;{UBaqj2U+}&)?W-t?h`L^ViDXMF;SEw1ZEAT=#oR4%@k`-$%FeAZv&@ z(*(Gdb-QA|YkvZ!po@1=`}tXPUsr&61um208iDT22fihLH}28$4Kw^6|1q&W;Mp(X z?0pEdjoZ%|J!9vbllP?Nw*AcE+q&ioIrrpT&f1~Z)lc*lJ@}58@C>KKXTZ8d%s$R9 zHwVXpJo^pjOOCRFceWDa&#VLDYkcd(XZRCz0Ov4wrA@x?+4a}>iu;iFT;%=zKH)bh z*dN0g6V9{*GZ4fwxD9V#XZPG%ED_W84X?}xN5CF)pt$}N+dbI-IdI-ShVb|Y{--+sq=G3U$J2{`jdz&V?A@V@1O_FP@h z{k!%t+O>k1HR=WWC9w}cV7GY_;y#^AByvTIZ))swV()=_An(){a$V0^7NB6yK$A6g z2bN$8g8U}h#`mdnZQsEIFo8?NloDgVkKxU6hV4$DVNP;9;}h$E?_~m-MCJ9J!8zyX z661Y)eoMH(x8A)Z;J&V*ozZ>^^alI`+nIMI$N28#%v*s$V*J@P-^q7o(Gv^shSKLB8ugMZ5PNUQDqwTG0<+{P52B^V7Agcb!CR5d43_zW~SBrSUbaGTsxrEL-?3 zyz6!`uGw-<;g-a$6$yX1U)M(5qv9Jk{t@usV&;`^Gur2m@b`h=84*L-@P~EoN3m|L z9pgH;h#B9)wO$>u34TGF+jy#mI)7GK<9>Q_CfKfDurtsW+EZemfJ1!6Ijn24!agIO zD(6}qwr^2xt`2}ijIf{UJ7W*$TT`qRLtc&fv;Q?nVa7Yj!7T88x46f^SFB&+e+%zf zZ?IkGXM+D1VxNQefS)~kpZ#$}+f?89j*#-{kiSd8Bp*7%l(wcvh*?HOlm#aw@WAEM`A z0d}Q}ai6}SZ@^GX&eS|$eI}>LzsT{k@8^D(Z}C3Hz54FW9p)ma7N5a6O9vL%h5P`@ z0`4iCd-S}_xrW_jiEmH$n6YzIUC-`dN|+vF}Mz#$@*gu z#KZ#L?~jDtgU8sOWx*aqO@41$!0ZlS_d+^5nt||C(P2`1d%g=g>7D3bJ zIouX)56{atn#l?C;AdbC%qeigY=k=Ofa}3AaKCRs4?l<+{nrAHzYqT@_z`r(S5>#1j+}FN<9`S04Jhyl*hg`n_u=R0 zF6!^p*v?_j41H34YkiO3fG>ct9!uTl2m5Q*alY!TEN~NdoC(Jg+_C#@y3;*e&0mv7Tv1-V|NX z&f~fhas&MU906-wI|FMxkB)rbj^Cx;z2|&@-`fYB(29F;t*^iwSQ9a>QP4ebKF`;< z>)Y=N2x3$CZ?PAk!#+V@2Z>n1e~kSRcnTKy9lUc`m$BW8z4wW)&@*5>5mSttCwgG7 z{{Ry(2;2-i1LyM$?UCS>F2+4wgU{IZb1nHK6u3SHYp8upyy#c_H~#y;S`qR}jCbRi zySF{`=fHl7@8t};1PU1NszOx zv3>Lc6gXo&I)fhj0R9GWh9>9muJ76%dFq62IR$$IHwV8X?-U$?g?T&TSvZ^L@(RSI z_+vTXeRMI-H}rtBrh_-WMsI=Z_;cn8aP6L&8QQqtJD#C$&-)u@C2o#;nSzYnc=eP# z->pA0e*oI9X`e!F!ggJ2jSGKgIf2`ig5SlM=V#r#6`X4{c!$236`pw(lC(ES!@gQ;%;~XHjTho8 z?C;ho;~>m^xAM!w6kP6;CsmUCur|pnHUGBz&X7C8PHd9j6d6s z@E2eS-Xnek6k;>{HF$`xcFm{Q=Jdo1utx3)*kJoPIY0-ogznLv;VGEmPtgVKS%f)4 ziLuUi9>n#B9PBNyw$=C^n*@0a{0_ZDd*|+_)ladl)xS#2-y=J0dkJlkfcxt}M56*<;5IVSc9M2zd$zXRr6%s}!`L#=bnK#(tdQ?7jkmY|1g zV$C_+b@H9<7&I|vuCqM`e+Qm(zzw1%-_N}>`}^7(AeW7S0In^Uh}{74N+09r?IB!G z+&8)~55CE3Vy+v&`*SV*uI6O&-Jf;K8he4Z&UM{GF&AXu8Fbb5EX>`adpJKQPeH~` zaDM(=%Qs_g2R}p0Ig9!}@O!Kf%fMdpzL#My_`5R253mB>k#`l;IcJBqR}Y-U@9G0! zjd5Y^wDPXwnf*-YQQ%I2=jz#z^Zk9X^3{57!8F?nCq+)R#n6Zk1G z&);z}xDNcB7veoo59^_w*EJJ%fGzfmJGDQyGYtLee$Dr@b_K@*A zS>LtfSvl9q(-Sa13_5C7ka@zlpqOcM4p$ zokzlUCfBup0yE&7J0xb`T`4j4ux1X-&%pCga*X}7J8aim0nesKi-12wFMzWcp8?PA zN8n6TVE-ksc8f05c~-vy9rhH?de2t>fhGPiare^Wx0w0_?kcf_4r05~;UB}>H)Gq!d$z`ydy?CgExy0+o`YM!zL&)r zjVsPN!S2v|=m%h0Yx)@1HKzwb%(_{PYx}!kAupNBes1a$ckaj7o?8&>fqk_P(O(c7 z1lxK43HE_&1vyHN@jP8etch)a>nLBr-3Gq_&h6gKnSrPH&q0nczek_L&uiSbnBdIY zz^#BYTe~afyKmQVy+hE%y=CCO-1Dcz&Vj!Dyq`cf$uY+4>D%0u1GpgGq{m)X&izhy z`k1r8FZKY=;q2{P)UI(3?5XV?YY&3Hg5P9D{5Ad(eIYTvGkbN|XT(~6b29$F@iTFQ zJ_O!fkk@iDzW0)d+1Fg(gE`977-Ie&w(*3%sE2nhzc0Q4{+#`p#8?yXeg<7%Y4!K< z{eGX)!&yJaejju(=9oX^;zylt0helA{RRG?fp>Ki%*jhN-l3hT0B65EUl8At?>YMp zZ-8BK?MzO9CUV}T-zC0>74Tgz(L+9QKOZN+GdI`sk=p?Cn)HDMtSj2&oe|I4K>Y_e zYn#llo!370{s~)r42)%JI#7VV`re%}$IpjrgqqkOG3MCQ_jL;#*oT=Ed#BJE#d~sJ z6R;v?d=KOx4XEGX`(0sdLtYOj3Yg=|3-{_CR$vBI#o!^vw~SFjU!fbR_E z`Y!$p$Pa?<;CrKdN2Aoto6Z;y>@e4I?v0s2gP~gr$z$;zU ze|zGsW$Z&@`{Wt-Onk3$x6syg@C5`&Rrl~u?u@hk3Z3EGd8&O+?nAr)=I@H}pvHMS z?8l&qd-d;AuKhC!JUHL!4KTSBzY6E~ns3Lv&V0mqBF6XicVgDIS&h%gJpu07GhU;w zqkjhqb>{kRR=|04<*YR(w(#~A=KKx4L>F?!0^84o@o$0OodsUGm?g$H=I6lL9$zuf zy1PJ$7}WT^L*6O)n3!+WeJiKf?(+ygV%+1*81S6zH?6tmH*pr@DeC#53vgcd&?LjT zZoqHRYi+nD_u)JI4*plz_dsB~runX)i6_v`5N}xPrZMJ7U9{3flh>x)H;sbk!WwZ|<6XCJxiU=H8cTq*|Hhj%abavonz&!-UpInYp_Z-f(g>N*$H95rh`|=HF_pi?8R6HWq zSy!ct@$Wo6T#xNN>`H-K!@UIl{Bgelw=1p@)can&gMaMg=>Hx+*P3B2xM42p+^hNS zNBIuh`)cAnxUMsM9_FTK(RX@6{0m}1%zFD3Y`^ooGtb7DvcUcdZj1K&=^1F^`P~41 zZe6p)ySjw$`mPo58SIL6DaOB}+PA|lAV6xs{Es{D_B@;iT+`;--*v0;cw>s}%DpTK=9a^K*u(7Syj#{2h9 zz6S}+$SLqjV84NLy$Ff1*CGA^kQbg^XS|B@TGxRSY#|px0&s?mE?^69y=O3~IWx2~ z8S`hR>v^u3d}A&CExhaRfeCyNPw0f!cHIr|9NNB1joHJWOT#SA1C*wXKPGPd5!jj= zL(029@SXddnDG_1Io1w#?K!;vT4la>=;x`!zK|H-i)&4Zc_!Kk-kDtE7AW|Q8)n7t z$ul0tlo-#%{W**0HwgS$&Gns`w<~^6*=GgrgI)2n>1W@#J$I##@$+(>*eS7sukE~j zwauU72l1&hfJ|&x>@AkWlDH%r>x_dO1jUZH-+kb@dFIa2BnKA0YqvYTM$W%>^T-+2 zAg5q2YJ9F=xdi9g&G238*T6H?4zzoAjwY_Px8uv_7~joL@LvG^4kTcHyVn){oX`EL zoncoB`A6_4HSQfHa^!cVgS+U9{gOO;xvya@l6`MC;XSi8Nb#DRrg58*rbHX9i~lMV5|5I+Pteij;fJAV&9?DbOI_k0@! zIlF7NF4kN(Uh59C-^)Jm?btKz#EeIb zXIIcuVxCWjoq)4>FW-Zx+zFiX885)^$VWhl82_%csquvGJDY+pz+Dhi z-9r=edGnINz9e88P-R*nWQfTm^9dKLGnCa=fd@z%}L1(4N7j_RZuthqc-PmiT^; zPe5-B6nN`Tv5hxzUi%q)0gi~hK~KT(cB%Ua+qg5hR>tU&aXluNy z7r-3%W-J+}k7wfNy^!m7$P~yefOn@qRfEUag}h;HT0FydP4hjs0Cz!$U&!;EoZbGv z1?GMUI-$2paDXQMaX{m<43BIKGU-|PQ^w7K7-|E^d!r~U=}7QJv? zQROAPcV$kKh-QuF{T*@Zd{f;{Y{=3F?$7(Vd~TVTckS$feL4P=*q30_)+eWl`KPt- z6n$h4oIUiVQDaQ>HUDSxkeiA5IZ43ta-Al=aqreOQZyEg ze-+;IvA3UR*N>eX=d+*p{|uNn2UFl43+Ss}p~Zb-8}J%fe;w^yYwUT&FhA>@;F}xh zgs(2>zQ$Z{Qe)~*@#S8Chrss}VCX~qHuh7n!FIoXmV#b0^da!OAfpqUGYIp<61aW` z=HR^Ap34GT*zXM3e*u3Ltg+3v?m52SBNOa!4dDKZKIriqKgHi8*1@@tGtgtZhW-+5 zpRUIL31_biXKWB+Yi;;@V1sQ>_mhcP@6W;ske>nbgP79C_`kE+TX;rIJR4_LTiZ^6kCjZb5ace@WJ#5_A|PeB25;F%X{n#g+wQ(#Ss zF>(#xHJ*c&JW^tW^SjTl!51Lc_>ffpu$S}wjkw>Fnc61a!G@T3Z?ASIYNd_8t2>obSI$M_lOYivfWzzs2M&(|8^9L{V!nFG9|r^I|GuIp^__Hi%PTp_kZ zFTfTI_i8=oX0Ef^-}mO;%`v|trg&Dbh*>W$O4NFK1ojNhxNE7K^w{np0qtR524g&* zPvL*6m=d=(6Puu&-x}}J--XooK}S4^9qD5{gA?-i$O(LV{0@5#Zh~hZ!L=EVvD?}U zVy^c&y4%SyH}LJ@yZbZnJc9l|6MWx_GY0UC)Q>z`ah;J^WCQ-9%sh19FZ*A@)=a*W>`sckKCe@Yk@< zugV-GHnYxDaduHBCkDZ9Srt_|V zvrM=KVlgFdP@RfFhzmS2NDMy^9=5c;4a=ll-6fa{AHm;fcmc-H2KHAryn99%!} zoy+*H$a{`MZSD7KeAn!VC1AZdx4|LyCusj3^9(4ilR|6U-!Mb1H&)`^EH7$}x$^G+ zV>tUZ(LceL3t*mo#1!Ap%NBhAE`*!_?$P_18{3K7qX&C6Zf)RapbUFZ!<*-xACUVJ ztgt({AqPE!v%f#@60pX(f|zSsr(f^~4!ywlEl$Drz#bQCvagPu0=DFNwkN>6J&@s3 zML}EFqm6$F)S0?eW7_6qd}sfV_y&C)?fJC)r8QN|cV_qW4LCLyW1m3#-mUu&&}5jO zJbAGJ_V8>cK)V2AZ-BFSuj)m$6TLI&@jKv5YcTN4G)Ro+^*4Gr|ActJwLMyM5B?#r ze^1OF8!!jPv#9-ElUK-5BF6O-dP0sdXASIKaStotXZ&(Z-}u{_v%oL(Q~DTVo&CTb zIqqSF?R^}9_7;u5hwmPypr^J2&SZZ-m;2x;=-`L_pw0an?j`syVBQvP5aJvA!QBKC zpp+PYw%PYLpu^u4dp?7I4$N_;CcX{Ny9ax~+#K~Bu{*f;fq6ZA5=a;Ib2)hYf&clP z@qML~b$()$nW6)vGKp{T72kyAX_dDQd2N(6^`S&Z&L@ulYN*Ckr zx7N$8(GTy8pU0@ZoXI<~zk7831qkvF(f;f;cevBaXJQFBpRs?E^A$Oa9=vhi z+81C8*F{Sh`?}73V&*wdB0hslz%{hJue-#YGZQbM1IDd$ZF>h?6Zi3&m~ro=#d>l& zknJUJ9asWmb2#UH01EyT-us!OXEn##D{!gCCTQ=Wy+ZhRiZSaHXL~`+d1kbtR^YiDm;w1g&@)h|H_ux0dVKdB=q4H4Gc(8cX;06siL-jf{{Wuv_vnjtYLa*3 z*)GuLcQLMW6>g0`1}C9!>A z?F-->iI{Ih&fiB?aM#hELl3lPz?_a;``yR(?*xAW@_rTzb%l5b)Qh^_tgex&7|U=s z?~G?L#}>})jP^Ij^$)=#u!TPduF>|B$np1tJrLNJMed0F9_>E06PQ$-qQyS-Pl0{g z+Mc`Tn5cE#hu8&MxrO}^@NAve*(dlZj3U+d9Vqtf;5NV+>}79j+g=Lx30MN(?vKDb zeghV8eb7iC_AuV?3AS}ja$w;*ca!@y{}`@|vEMKkb_e%s;-be-z*wNYW7lzwVr)m; zzp;M@SHNZQY@2lP?)Pi!Jg|61TD{9W0?y-&=&d54$d_OM?U z<7dNsZTB`M-}#)|`CYpwb|KgSR^&LFKfm4s9o#R;2|0I(mrL<2oS&&u*UH2LJcaXn zz_|DvD}vlsZ`?W9q>!>{4ZHP*zstKfim2S3!H&GDTX&%}0RjlXHJ z`k63p?S@#JWw}!qF`n@rbsvHmFn>YL1YE}ta&~0~KLr`S&1c-YC*;2ZJ+Y`rXnoi9 z^Z6M3Oo+MuEpSLq;Gd&C8_(ObNpSYhXy;nO&C$-e0tq;ipV9Atxr((1z<3v9?7#2} zb_Uiy!k?k#0(}g6pk09Xc?9O zJ6OP+Q*d5$jSu%6V~z9o6|VI&At!3gbDLj|lbp#pf%jYv(Se`P?)xFQ3*HAaxNJ;` z@%z#E8h#)B1}s1#rZ{87_`dewdvF7EZ~i_`58RGehR$TIatfrdHUMd*fVn81Ahkve-PrI;`?r=aPr2_&>bpmtYH4pui8J#$SLJ)Y(6bxnWC@3 zxxPIYAj2C|N{svSbMCy)fNR}EPtZN_0_^)c@E2guCdS;CoU@vjv0d|?wsCy#*7faO z;I81ipD8$mGq*!W#T@+>PTpGAwZ_kq`5iraknmme2yP12RiC4+e+Zs~g8vllTTj$^ zcCNPo&i4(x^IZsb20gjveM?+zfAe1Ae+Jy=8NRXMEtB5^XZ22;O*l`24`8nQbKMQ_ zZaR3m49pYmsR!yA@Q$3{Gw6wTK;9ZTwKKWrLdWA92I^>^$4$A5qGAvMnJ zd$O1Hg_;CTu>T5gPKWQFGP(zydBFMQoN0Dv%t=TGXWlRmyld>Cx8w!9l7ltj*1$8j z{uP+ovz}jIJ4XT?`2&ykEe&f{Jx34U5!7$63pwU5vF+jcX#XDV-w`KZ3flaMTziO& zZO#i&u-m?u_to#C5q1F+(80N1YxK=AS6dn0A2B~4 zGdTC_yeW*n>zUw;9icx5C5G_uhjXupxrS(G+A_{|V*A8zfxgz8yU-WpodV|@;%IYk zgJM3I!fkfqOKi`^8qe)2XzTan&uZKpXL|z9u@f=HTyu_rwZ>e-xIIhL*q-YGm>ZSv z(e}=F#=E!1pUp~}BgJ?=?)@$3@jDQ}98st{A*L?y&eQ?l(-xi3Jz75NBVCMdZG*oh z{t;MX{~n#pBc4D2_jMiKyhq>|Ea7@$Szs5i0Iqcx1o#m=(1s84dT@yCn$O|w_a(5m zYfONg@b2t62zAE%UU^*O_Gl8sJ%=7$Kq6-R1-bWtwN1Jhe}=w-?`nKXJlC2VaL#l9 z*0s)=x8Nz14?K|<` z<4@2%by1P3wy!zAB>zpFSP;*Ge!Jpl()jDDyV#A6wsV@}&%@rhKht#9sj-eE?f{l1+Hb!CdR%2uJHnV0%kk? zo$0r5o>4;|t$O^~J!*e{9yfBf#_U8wyYapv~+Joo>sF~5T{H9feB?HxJy8aQ7Q&-fv} zXXv^;`Ges96`aCl(7_usKhUl(oU^TOoxXR{qYHWFW-!6G*K1;)uQmD~Vms3k?Dp!Z zvH!n_yXIx-h@TO2Z=G@c%i!9DMxXou<{yBJ-Nb&1J$?k9 zZHh5J&^^d-=U@s7kXxcV;EeCz89zJ5J8ajHccwwe?*#r3BmPU`+7F0%UnwqS;5%ck zyz5`ZKR~;dy_>kFIliBfKZ7my1f0|y;{)tP{3&<=?76Br_L@~+ZOqTWA$kH9V2a

kOWwYkUce4f}%|=8W;~7x00t>|wvR<4>^Xz|YQ>x-Zbq zsMuoy=j=1!y&M70Nr@QOcm6e;+L=5j=bwU(oPf8#F?)(0K7$VQ@*rU=_V>Hrxs7{& z&bTxO*!vWe>fa*v4Oro4@&oLOwQX(rBl7m)?6(Fb-enK9#6Aayz}z3vdtf-zni|w} zHTII2Gfwg4t#LN}kKs4fpQBwfg8&n7qEF2Y@?7T;Si>zqaShtlQnEww&`BH*dR>WBeZ6SKv$@Bzj&5b_agO;rgCF z1n+~(F_>XbKN0iotn68(&Gs?8`~C>bh)0a)r8Z{+w*VdJ;g;Iy1g6-_JLB7x5BVzA zJ|O1WzQICV+nOeQjOXDVjCp5bWezdnXTaV!;hS8=c3$7_+T12F&fs3{cLbbUaUQvc z!2aH0pd*Ix(98HOkmNuHy*8q@N1*rajGs|?#XW6-@e{epmBL5E-eAi8&rol+ zdB-y_2mam5`V9KY>D%`KvG0KVAoS?Kvhr`yf#1$GV}Dj-*15k0aIHivfIU5@Eu3d- zd^js&t~n>Rs=RZWC*RiS$@87s-?PrdI=B{3_`Xr&_rVl@SIqwq-tR5@`+L+Ox~E46 znq=$)V*4Pll_1Z4e}?-S{0F!KlrHLB6Yt<21J7cCuap>Tdwkb(kLTbOIcMkuf*kj{ zuJAj}Tw`s2FX7x<7Vz2|bExgX9NY7~4*XnRoB^?$_)kC~$Gj78S~=f{oH6fh2FyQ2 zZ-BYpooDhC1b$CX*IxnaSD=H-V2Qni-v`H)zl!Z#6MTC*i+S&(Z-X9t1$ukb&yQ=l z=3l`xkcj8HMxbZ-zG3I^Oq@%!ygj(bU;#Hl_m^s|&v3ia&RVXw*CiR^K^?I@{%$hd z1^#96%oeP97ihmkPj>oQ@A@L-<8p`bb6wy&5H)@=A2qH&we}a}+dFl>`n`8V-U`@H z7`NB!n&-Q@EaqLQ@%Mfq{vF&|jc0OqWm)I*4hylUFi+e2*pf3xXW%*Pia7~xQ~TT? zXW&|rac~dbbJ#;)oK4N~T0|tC8#8BxcBU!X?~)@h1qDCQ=jcJu_A(}~{XP0Qu?b8h!(Zl>PajQ<@l?mac>h`TTO zB?x@?bqjk@^NbhxExH5l*EJHH`C@{_vIeH3aKwcSo;JfB+;P2p{ zgEqhV27Um4MmmFb)E<3|_vIcE_L7+EyJ!6joL>aC{G52f9t7>o8{ljmzVl^t64*EI zjQK0<17pD4o_L4$?y|YSyK}}Re8C@b@rQk~mkGT4IYtK<)`It5xA=(~C1RXuUUTg0 zTF&o!-b2Ek0(I-}JNXH;`yo1rcVmwQn1U1|-~P1bntYW$#y8VbC%z|E;N%N_La)%b z;O~Q6xmVb~27#|WM;mh=ZFbiwwbugPvv6+hCP6%bDV%$8&jVKzGO?R*#$JMgzbj|d zxhH2h0Dl5AxMH3_oZoXX?;a@FO>&HT=+zbNO`2ovx74hFbH`4t`7hw@>wJ6FPCGe? zoE~(*@6Hoqo{^k$nyc?w`C01V1N6YP)o<^N-@Oy`6fWSJXg`4e27CgX!M;6wfDD%S zht>gO9oz!#`xKsuzn?w_K};zzzRUOF{suk+udD4nCgRS14xG!`&GU1;feYg8t*V{- zF|jX!dvzXvR`uv?F6h81zVn)IzmLEH_6j(=obd0XbNmG`H>lmBzk=UA<6>{t7f*;y zYutI=hjZk*wtW)(5n8y;L(ma-?F{@~{1x!b?N#8qx`y+}XZ!-}XMCt-{lHG}d*lop zb_bkeZ48MR_w0LiZRbm%z`FD{VgK?x|a$uaP%J zXZ&Z__R{uDON|eG;N(Am_s%>=*Rz*rl88Nm^M1DYZ_%FV1oXr<=rb^dH@|~(t%BBf ztu65W7HF{q8Qg_?4m#{q>w2{L?(-ZhzzTl`f>;4lY&q+k%^vT8b8|pn^8)SN`}rRB z&s=ljFY#Xk`+o#F^49R`1=`Pny^a4Glxllk6Hv%g)Z!I69kAz;c);z-3@!uDZJ3ih z-$zeg2CkLB6s(E4uK5=dBliN{HHQ3)AO>;Yp=%dx{R_dqN37q8xrYpIUJsn#8TH$I zEBwGW*IM&j*SB;N%&{|E0-?s&UZCCEwEE^`><#c|7}BGvvVecLIMNHyLtb{Qb*0UJ&z*E5=;I zp10wgZ;G9O`$_?J#C&JJMa;L^;_~*G!uROmdnIKp_za-W>5)U|o|O(0@xXH4|?5ktu^tM5YId79)Hzw6}Rg85F&oFML9%WEqc+uloc zjQes9KNHTj51hqVlMY+nH&C#XAZG#s*uSfOJJX&VbIq}@+PquX8GhJ1>pDw;OTab$ zrM)AC_&vBeh^kAB=bMQwz$ftDuXmk@**nl3u)pWOK_7z0*e%`@mvc?;{3-C~#LooZ zGwf=fxjl7Le6@R$I|81e`%Ca5z>4@2xFuRYS7;aDnfe{#oC&n^!yDeOy)$_|m|`!h zpYY#c8+YHXvjLuiv#x=;?}G%cgJZa!y4^K0oOPMF_r4noa*Zi-v@^aU&o%T{=;1y& z?jsk!xaXv*R~j zy?{6F8iPdDs41~e;in*DuYuoN9XS*1E%s-|I0xq&-f4~5a}5%{cjo#2UqY;aj#x(j zOsJWI(_g4_J@@JwuK7#yC9yvObA2aYfblDFN>+p)c?AHfrlsB1DM zX9;?^K>OZy*YeEH;61Y-r+_PPuGa&5S}$gxBR&Y)&(9przJa{~=IbZo!n?Z(65Iy( zU2UJJ@gw}AU1c~E;%neuJg0~j9ku7~I)4FE>_prg*Y#|TiGtt3FUp;QJ z0($_q(g$~QXZ#(_yfp|ok+AJOsd4w}8i|;-j)>kq9 zxW>)thz&YgM%C~i5dW&?7UBWs@GFq9?e&Pb@54Pfmv^G?8?|>|`91s|xR#$6`3wTc zy$1Hux3AL0c-O`g_8@5M++&CK_oHXv7<&p9K(WUJTRzA5eq6&nd2b0AFT?_U4jvGD z39M;iTr}AbGyY!9%h+vR^YoWs3J!s9%XJdyiJKGHL45)3?RAy+-n~oD?+f5u3vdKp z;Cn^|yR8}2*?R_@YYSX|4c;f$brLxRxbHc>KQDaS{{iN3+WWvYrXZ7RpI30-0^{~` zol{_sAV-mZjNhX@6LamMv^y9axLo7zNojjjm09UjeI{Z*803b6(cGM6Oui zPvJiUGi?0~KS8@*fPVr%D+#^;--5sM%exQ1H|6Z_-8hTu7jnB=@H3bJ*U(OC@)Plgz_SSa751a*%RR*o za-Dq%T=Nh#F-PtcIIsOmwCGs32e&5XdAtBC>tCua%fpohB&=Q?eDxm}T;SVNxcYNy!EsDJk(?rhi5P zH{erX{IYc9XKMW(w7+LOtMI&Lz&Dh@uqSj+jbh#3iGOQewF`O<%#9fD(ce|fI|25& zkQhHZ_u!pRSrXrXr});q040Xd@IJr9_pROqb8rYc*CXd+Y-^l1z_6A!u_<~*%sca} zoG-&?Z1?FoDJ91ELwvtSR>YeaYcqKto{jIZN#K70ws4u;89LCzTC6w6KL*ay!`~+N z8Zd7H4!{O@PuhtbdEtJSXnE@wUe+*}?IpPYweJ%vwKK5N# z-g?hN-*umX&q0$+ya$~cUd+fxvfiXWb&bh4Xm~)8j+j|K-C;KF9^KSuX zceap6wB57ugnb6&td;Y3%3pzvT#S5&-2?l*1?IVqHH944-{Kzw*Et0VF4cOq_2xUT zv)acs3b7^`?i|h>-?Z_LctJa(Jr-)X0E6IvNUr-(_)c6wK&%-f% z52xK>7i=X5>G%`ickW}5z!AQD0s4i!XK3HbBX9@`=!v_g^@W@TdJo=p#4FIjWn#)7 z@IL^?+*1?xA8|#_?~LC9 z&%{`htv2Xm{8`}LnKKAn!S2vAIke*5oH=4#-#Is6AI@`l3FK0Z2l`{U{{eI08Xa5{ z_u@VugA|Q@r#+)Z?I-IjQ@9@Ocij)b-maT!UJh*F`*4;6V&>chEBs-8bdcj2x@UiH zRQGVMk%3}eiNPFtT7Ls>js6&I+%w*lj@TLa5xxt0fhJ3MYkVhj>~r9Z&LM(a>%H?C z`VBgvJ9zV3uKhOno}Dqp`V`|nw!}Us7U+SmadRKQKLdWBPC#!Ce48O*2Ux(bf#;~- z`ll*#C&a$JQ~x)h7TDF~yd?e;aId>!eFh0Q>s!!7-ZT6juCzM18TQ3~@a-$y%Vn96 zYY+Fj0ZZ(lrUOnedEE8>2y6zmPWZ$a_rR|>6Bx)^hY8Hl;|(5oe&jrk^wxu*UF zsQ2?|%(wl23Hio4V=>;%Zcf0-+pi~gLEc4gxF*-&zXlf)<9C*|uIm~Hb&tC_#_tjn z_DyKNgMwV&!5n0Agnc}#z!p#NUjuW^^YiZaj&~5m6}4EyeM-!89`=D=0cXm@3tBuT zXNsPHQ*Z>_oA34o$oPu0TK^^77Wh4Q4|E{a9P?(_3-BBGe*)i44kJj6>&SUWes{ZG z2QOSp{uOZVOZ*;~6TtJa=UvcYFRJg~Mc3Gw9?qC57Vr;&wLvTa>t4WZ&?hzT0PReB zKt02^W&!N$nzw;xa)!SI#yk31Ydiz*aRaO`u7@_h1qt7No~`xTb6~$u;LMSmf^4l4 zW1q*wy_-kqDM;8&a!?2N0=xt#yY(amzP%@)kgJwkfnHFfJ-kKYey-jFbGQO-Vw~)hzLy-}mt~NWi}Cv5@af&XBO1cn;3#IeIsh{m@0#-8fGId7-h=Xg=z4z;xvp&AfBzl|6ey@bfdU5= zbf7>%1qu`>SO^6Q6jY!LWstQOEHL{8O*RTMl{9@#b7SYV1|P+ zrZHwH1~W9nFdU3A&0vP+VlK^adHg<~bM|f@>&{#7?X}i-{n=~(sp{6u-1lPacN1=n zZ)^?Bl}p6kr@nhD_;a*#^w=5v3cIaoj}?fTqjqm{2^<1v^X|R_!#l^%z&-yS&hHM- zyT=duC-4OS9Dmq9+8%R|iS47^pXVZ+!8P6Y0zCu1kDgp>cEELgcPq5t3F<`LSVkA% zj7yN=I((%MegOO4CAL8qe0vFJN%%dmPJ0mS+-!&r+q3rUt^oa6%?WI4x8MOW=O{Ja z*O>EbC$zI9>?PWoIe2yFmw)q+aUl`od-rc5;W_;k%nYwQo;z6S1f=ml?FJHcC9 z@HfP7VV|Ox=E4O~`XElsKE4(AR^aS82Q%O~`}eJR_Uee+r`f}LaMsEPwz2!aK|-P&{HvYMcns!PV6W2_u!%jw%?b| z*~fU!uG!*GiMeJ1Yxu#QE`a?ZvHhB7pH@4h1$}GGGxrQU#|x=FJr~bwF^!Sb*Z4|4 z#*K#Go`LVg{hEIv*rmcXohR_WCEtD> zwvuD~{#2XS5cmaLxijXs^Jr(15bZw_ANF3?U!l#lb^vydZLV+5wF|mQCgvM(561j{ zPjF4FlNWD^Ip0(Q|2n*PaE9%BD>2Ey?)8afV%NaC;u`0~hjso<+%=5-AK?1t|3YH? zzV}|ehwh!61AOnXCr`27J)37g<9^pi4B;W}yM6*PvFZ6P@jLQ-zqi3dQ1Cr-`|RN- zw0;x$Gk9axe~x}1M2s`_aPnKA?Kzo$6`bR1JMY{$HA=*|hQAw}&)OrjHBEw?4ZN{K zumgp-??B#jSfFR1C-)fMwJw8#ub3le?14PFQ@IIu2%Ni%pU==7`_70duH#$Ynj2%^ z={>qP*D)T%r;>^JyWyX}eKfINtl-4D>K1o>IoJLTwcfGo3=;eV87$#GCH7})0-mjB(!ni&GrNX31oj=)V3|zq^&0a##XBpt zr?r9IfgScK@Q$sww=>ztc#r*@m}^+q`X|KrJ$V0qGwyr85Ml*5gEOy*_4wutdDsC? z@H@29&d2W(=W-6u<_!2YU1x@!M2z+J-NIXA?z{6X;GPn5{~fmT_S7ml#<~^!g}`}U zJGecxeLn+p&=XVIoW|vRXTHb4F5p+#sru$R{_YzyohL--X@La850N1_{auUAl_<3+0k>rtx@w``X#{F!bSr4ytF|O0Wxi9BF z0vTReVLR`Px`=`L`3HUvmc+~{*a>8yef`e(CY{%}y{S3vemip9^N+-K=p?F`qm&rm zQ6?tmKKq)tKnK3PS2ccy9(q{||1aQ~{SUYaGW~=SG4|@=eSiN6g8Bj>R&<6R?}a68SxN zpB(G`ocU&&*u&Y}!+m)7YHm;?Qq}giuYQAjp34De@H4lr2y`Y_ZcfbaswK8!%(a}y zx-IbilpqGId4vBRI0AnIS3x1>dR@(Ntq$17o@d|)Jiz}5*hiV6Z{g<{dzj;!bPeGw ze*lkwGj70eM)%<2R$dSG1MHSHfY<{iAizYUzh z`3t%3X;<+a&e~y5)O8@hn)onl8vpZ@Le8SrX0*K(wP$RP*Pz6B9xd)#Piy=y=*~Db zE&g7OC3GSdU@F7Rauq#VI70m6Wf3$&Zw-^BF43SyK)&{ zX?-5UJO8xDF?p^bj%tq-KcCwc?hUaH9q>Ky+}ez^|5;)@7kheV-o0X70@jEp#6ALY z^O}P<_#NC8V!s7vu7lsib8|1d$`@jv;x}<$z5{do-2V}*;hH$p3*h(kXW%CAd%NZ2 z7=Q0%YI@+^?|}jzK>iDS_vb#G{S3b&mcRlC&3(WBSk8TNG$G1hw) zFY!;%0XonVdjV%J@97KRnPm6?{*CIr8b6k2ePK-BH~b#ZPxue9AAt^kiEpjzICFt> z-GpxYu-4wfb&WMC*d6fRjQoz4;1Z0tgHGA`^ug1yU2O{F6fN`V|)1Wvs%;DSfJPN8Gd@V%^v0=$NUU>@)qPL z>?WQ`;CG;aHU0)TpJ(wckW-fE1u#$iUt$O50oU@~Tn8O?B5n`!jYYM+-vF7oa~dny z=81n0yJ?)5zH6AH$hlqza*XHoBk>-8;Nd)vryyaQ=S-JCU?;Ex=FdPTXNlf`$K-qn zz5$*|J44rZ9?yRT-vRq53$$@{34nfyZ_h!n&Htwym|^$iy(=4d`}{Y^@5DcYJ0h&oXbu4X??&upX>ZP@f^G}bG)}E@+)d{zyLo#&nEE# z=jX;c=Nbe~zDb8|T)4)&V%#(HKHK-`0^gbEz<87YAZG)5xU1-nc*3@KK{x5J+ub^s zarZG5*YtDSgO2UHH3dX3j*+ac+ONmiRf4u`{vued*hp zw_0L5>_e~u9lkMj0s(%wgAKHMkb!5Ew3*%7D|g1v%ExHmy*19)_STcz<9`l+0QS|! z?S=gS6zl|?Bhc1n^ou*p1oq)yqVEH95?EuqmV46|ewWFK=fF4SEI}_(u>D*0F6i(* zUvq~&(LxEhCTnbGwuk-qu+5jhhQ0?PhyiCdb`_|<1MW@!LhKXcnRVE{3*YTj&fq_? zj=bRz|J)$atSVjAAxreK~PjVg7Z7PixJNJ3?zJUOh3;t zV;8W&7y90dJ?(uHtnjtH-$c9v-m&k(yD{dz?b#FaJmtKHjDL*H#>zf)jd7qx!K`uT_beR~^l z2_*8Az%DWFXHLETVeOO9elPaKh4HBr{1vd@3_X22gH6o~V*dp?>_O0H?;7SfQ=&F1dbH=f1-+>J(Cf~4ryZPi88kV@b{=7^`dxWbh3iM{7= z2XKByqt>Y9XTZ5#`vjfft?~2l5|ru>yf!!>&o|RyH!0Xp;LeC`?4!hZm#*RYd$&zo z<39ctz9Y|?BYgL#=MrZgN#An9w18r`=oq<*LtqbA{ zW9SXq_!`)Eg;v@cU62EJ4AjHFiKuDfx(V3t8{+PF4SZ+s*L<~k3v?6j+q3tq)t;+s zeuNHky^}e}F}~|d@CE-2E&uPt+MD2%xO4bfJ(%XwtBHMtJySGxJTuSV*dIZj#GLOb z+!Acbwu-hZIRd-V<;1M?FI;tOrKkHFW!oCm2? z5goj5<`pP%N{nyASzT`pyrX+y1!q6`&%hJl44Ik$1w4l{{%f!yrg#oQ*@L&Hi}4Jv z;M>=D59i(!`XRi1{JrQsDCR_9;I|pf_r4Pt)*$X|_ra{zEzmu@@gq5GWsZG3@z>Rl z7;{hYJ5f{Ia6QJX130lYYelb@xP1le0yR8XAQn*6X2pZx!2&o0WZOCfO(!z z-)hNm@2-2MCg$66@Ak8QF&BFd&VlFs1@PTvVgal>5yZX2-Wt#uhcmtcgKs{t{v%*t z;d-9I3Jfz6OQ0iH&fXc{{dpdzK*=%IUnV9F;m!4o)@b*zMfc?8nj8AW#SDB5I=ETQ zr|r<^F1&k9@Xl}!oUy0R5`CZzjCt1P6=Kd{p3>HLo__)FKgGza1MI^+2gdDVjp&Tg z$Jo5~R%dv{8Lag?!n2vy74yIj{DIgT;9heKrNepqrsX|1*Ev8x1Z!;1cm`b0^;c-m z^(uBp4|(@_3I7z`=JiaRYYTS3HQm=acDOcBKZ1J>}Z?IiA@DtE?ue-`$ z%ttIL|A4v$_6+<&$T@=ZZ!3Fyj`p;N^Lih`xOeMX&Xuq`wCmbePCcwmeGl|KFKdk( z>)_P|?fbh8-U4&%r@jWv338Mb{2AQefPb$Y?*tagSJr@4y=SI+(-nfI8rN z5ZHeAy4JGtNg*aDe2?~?O2&5$e-HUPAd|1iuYl($=f1b#1~~=ay~uUg2_3+5agC4z z9hk!(z^%X>WPByZnCCt(!SAExn)LX0;SbTBJaA2=kCgsD{GnQ+QQ}hxf;%8_-C)Tyz3+#Ww?a;kFK#%RLUA67!=luXqk(c`j z&U*8mIl(K(*tdu|=LXwZ=Ae%uJggnnca|g2B**ys$i5wR+v{a|*=Ggp>H5R_$G%C- z+00J@dk?N?Bkna~Tz@vn%W&TJOJICB6LhCd-W>kFf!|y0yb|IJui);2{{*Xd;_m4& z+!^{CwD%hHY;pqcJ1-P!En-2YSY z6nzi)J>XgU?sLtT{{!$pdoh0vX2d(#+tl` z-(p=|BWk>$UlRWtxDD)cA;gaHo!kA14OoG8_f02q&*8mOb(-W9Y-bmVxb+?RGqko` z#+U0s6aD#}F;>w2emf)oVoejt@h!CdxpszYIoj^w8MWqo0s2WiAsgb(;68l=L!6u@ z?-Bbeu!sFSW9W=tz}*7&{!id6bI>HwC(AM;WGbcgSZ&ft1WkcqWD2KEeY3--aVKKbtfKR546A>Tg#ASR{~#N@sO ze*(^v;F@IY8*r!8E6(8AZmKWmy-v?mPBGUrd`Y}V`#$zS4tSt;Ui%sM-hTj|kNw=E zaE~3iiaovW0z97;@H-;M5FXyvy5@K24Kd$MJ3D*X+w*V_?mf^=a6vEyp&$9$Z^*e00zZKR?Ast?cVLO#quYFa?RSnA-l;QZa+DeNnLcp; zC*X1I;VkyLSRdOSo0{_@dG4tLL2S4mbi%if@ps=(F%DeU9BZ3cpNV}%T>xVpeiP$M zIQ#m$e_L}BIc@D7@uCmj5;xcX49q*qa7iHA?&C829(V#WeuBS?eS{s@9ca3T+b3qf zmAO^g+^!{3jDbKG(0KI$b#jV!0`J2=2fm>KhJNgIfxQLJ=X%bh_MKb@&R=3gMjyf* zfh!d~@qka}ftTw}aegx(?#}*`bWsdE8w)bCvdD?#O7|SuF z4Kujc=iv9?W8mjxMoy4Z1h#XzmsD#zw4b*Rzy{m3*T#IO!1Y810dG!EFV~lMukLvP zAMhENkVgV0-4yoMYU>8v8ML1zrRFIr%}{ zeHFBKejV7yH~0Yi1f7U=z`3*oH1W>+JL4TJulzI*q(*dFpqk3N8NZu{vE65|Zo z?&m59xOS%Y^y~`UR5Jb^y!T=JJD{K8tyR>nrT&zddBeWO@I_8@x5SS`t!cb6A(+*8iSaCc2j_Wb{1veS5ZDQ{I`6)T^%VV_RF-g_QzGu~ zjZc7kutyiu%rVb1cAY<=-Iwc5#q)|7_vGKs_CE#%u0!|eWQ{=l%$G1qj@JvriC3AncYpjmeb61=evxCdhixb8P#N6vH~9eIcF?Jh!}oF1Kk z`#GJ|%&^TbXfga=Mq6*K_u(5|p*wI1+kP8hZBNdyK3YEm&)aiy-^$UgE`m- z#{IX#3!uHKzWeKA%$GO!I=TQqS99R!^Dg=^aE462NWlF2@Sc&qJ7eBA+Bvu24ZLgH zvxisAk#h~T^O&DvjGbY>g>z3!;Ah`im56a&=NbfUzOxo$#*gq%fc`6Z*GOP(9ykX3 z_$R>6yZbQKldrVAOl$`dv0q4xXSN}>Bo_D$=4Jdd_;cd!BY=6s*$@xn-uDb{0erK= ze&7{roKvypOZ>Kf{X=5*E})BXz1G_r<6jZ;-v}G*KclYzbKGkI9nkNox0l~(&ZGaL z+V)cJ;+vnqL+sBghF&q&74)3A@9`D51TviB9=jOxTuTIgo7sEzJdS{|JaB5bwYY`wHAQU9g6HrX z;Qj(W0kwDd2HXPX%|V8DKX2jeX{^If@FKtl-@h+E1lApajBWp42>eYrbDiDw%uO+7 zUBeHMKnHh7?0xJNTI^x((8FBqvw{BvzDEZ&-m%&o*RWTQFW251?C|fO$HZDMxdk-` zaIQJSE?|xwXhrUS@E-x|hMX8e!;cPoP3$g6*adW8V?Eqcknxp1M!U^qjlEAnPrmP_ z#mv`U!kN<`-=yVwrpBAduc`CQe*_U@q(^t~?jd3O{qhwEY-{|y-v{1-BG+&R=NiuQ z@8kxth%sVKBCpjfu#NqiocScLgF7eI&Q<#*anEJwF}Az-`62uXIfc4+rNFzNB8ac? zr{dh+#U8N74w#e4HQ%%UoLG;2gstx$1_{oLm}|7TJf|z5NhZhj6X?kEO?7YqT;~A% z2)7TGpvRxeFb}--<_*6e$=R3(N{pYgj9%iq{$&u@3n1@1+^@EL2Pg06&(FAhUB`Ys zd;!|?8Y?wszZq~3)`*v&?LF1n^GS}M<1HBWMm+326>`nDx9{s~a-Ffnc#h6!f9vjI z`=-smf<6Jp=e5?^wAa9X8_1UPSxFFdyuzU$rx_F2NE z8t?HB@Le;2Jv(B?g)!HE0t)^x1EE1;{0@Cf>=iK2J!beO&T8MNadVZ35!%kv0nd10 zoY-_7`+f{E{8R#eAKv&8aIXn&f$q`b2)m#IxQ4!G{~UY-~Y67tVV(ZeQnph@H`i9Qz9UtbjAGh`UAt zEiNzCz`NanGwh)UeNM1F&pEmW{;e?w_B5{p3(%AM6#f|K2mTtJK*s(N-m`F4-%o;T z@;<(C?^XR0OvRcET+6s<^PAVj*mpzx5wTmKhikC5^`8-QzNzfN8TUMU>IxVH{QzzQ ztZ~f)^l$K&_CP-c+ett3{!zJoY|m@}+I6f?5cAA?I^ zKFwi0*KO}BQ{%ekeE=5N0oQ|>b?6TGPF&CXNbm(t{~WukIk{?Q`p6jAV4u|-Du?~L zcKdv3yUs0ghc{Srl8v8T;2CT?&e%DIG20=SxK@aOrHFyTBkP8_ZINZ>Dejn&suw21?Fcs_mpD%{F&FJhqqrr-$dItVdoe#3fet- z9>(Ux0&a#*Xl;4nyUO^A+O-S%gjnlq&c3yXG2c)-ql|CfL!iAPZ;tJ~MYS*E_r$~@ z+->|dkk?;=sa%8q9yqr%{~g=!3(w2k;T|X$bdCS2<}dKqAOY9+Y`YkJ`5kcnOW;0m z{bMi#igPdFmuTxF#^3Ev;Jjq?CGYOVb;c%PWsSO=^(-?#0$_V@_f ze8s-T%roY!TcFM{qzrmT%yYgB66k8o414%Dx$Arh4r*^>t|R{z90Kj3H~es(G2V?c z`JM0xIR6GLD_pO~o>xE6)*AP-@&Nn+IGbl_ZlZ4i3Hubd_H*F+S3t|L&zATC&Na<# zVyutxT&%eYW|O#iLHrQT&xe0|?0{>&EA}-m;+^gpWcD?8h8gMz&pydhqM1hA3X=|<6XH1XV2T9qpl;bphbWW?~L&i_=In+ z_gJv?T{~+d8|=F+hF|d4_9NN6+;Fy@}2xI4jgas`Wo>U;D{X0w1=CDz5IUgT#X-sp%+PNJm~`@K8k*-rO;8Ey;q$#-AFT(#CZd%r7vjKAkUB-VNbTmjGE zJmV*zo$ZW%<|R0L{)8^%&fx+*oITn+&(F7eANaPDb?-$d_xQP0(T*B#(kfs=zpTm(M=-8H|P9wa7?V7fjKjL zdH<&Hz4YXlTGLfKS%Yovn>%UP13!lux3%8_y(Z=yh1{v^;GFBA>h7KRhFZ_UoPBT` zxK>y5+PuylaGr(d_Z-L-^UzDsV?TqpSH@SaV4J^>FE4%vn&cSw=eow88iP~%sOO1Z zQ-6b!qv@+^H{ZS6#kJ?wcE-tSL)oB-dV@64Dv zbI{j(>jr`IOuwtJ?kjBbgPacZ;0)jMFmD5#HQ;(;t*@J+~mmuKUIW%qG!KTjl*>m`gbwzKVy3@_V&y@7h^lLx$=kDD`2ko=l+g>`wMbK221=o*dz8ma6i^A zYF}RZlcP}McWYo@`zzVpg=X#BN^{{Wku4|9?fql%i zro}J8`;MN2Jf5+dU?PqWAH5mu;#(ytY zC1O0o>u?W%IZKe>2f=oKo~8E@*g;Iak8jNk+u5yqjGu|ix%L4tw*$Vv9q7R6ZUBAHwNRr(jGvtXXMV=Nf^Dy7An--1+P7%0kAP=n%sRFF7eMWvr{Y{+0e=@g z1Z!%oYtjW4$nfsXS>5NrITu*q--JH|?m1h7-f4qV@M~hOe}bKe7jTB{`L5CS_AUe7 ze%5*iJ^rvC>|Y4}5=6yw>Mw(ie9zo{&56x`GyV_$XTZ6R!5TC%?)o+uuBEJTr6OJzIPG_RcE~$<5gIY7#MiADQzd_z9F6 z&*)jTPtfMrv!iB%Z|^OTSK4`~o$&zP-%p=|dF^Aad+qSu_Y&C4+1;D*E8rIr<7aSF z`M~eNF*P^gJeP#uq{DWvbNB*WJKz*K*L#L`ZP(2)-u-nr`GVg8_aOp1k+&kY2CiFx z^Cx3fhIQc9;Lqg!0QzWAG`5_5+{;&BD%KnK98!#D?|h1L?6AKj=DN;$7sxlUul0|r zeuZAtdULMf&%p|=&39@%jH0kJ@rXJDwlgU+wD)NL55Q|M%oam<_~G0;;JerZ?VRk} z1J7287-#YCpL6&v2<&0~dggLVINyRZWS}niuDb#qeKH8pgLZBS@m!YVxaT$cK6-~P z$Q9MCV}m~SMaA`AK0V7 zCxJw*^X%;rG5-Fzg?}4#_|CK;wzd|Wfgg!|1>E-xEP(3^XD-w=>9A+;C-9!5J&wQz z80#mtoc;;~u_oFDc!qxj{vF!kPvwvr*Z%|rb`$f2`*6-T#1D+aDLDo;#D+V;x0h$v z8$-{*mb!bu8J9I??Hb$Mgl+#nk@FU4|1W{NN$dtF-ve`=fPhm1Za&Gi-kfhhil6(h$#H$Z1J)pj_23eAg8vWn3veBnmx!IA z{Z3kb;9D>bcjx!&-3W4!zKsnEx*I zJH_|{?OQoTC-e-gfalVaFHW!n&bWQ#+WRfo=DJ7wCT!0o!`r_@pW_Srn&WrQBOq65 zUXS+u8MoJKFb6L{khcaW_5fQ@$QRb!uegCua2Z(RT;8!gpMwKX;4*PJvBdB36Ue~X zoy**(z;m@v6Z4&81{T0|T-O=onrQpCji0%Pp!JFvGyLqn23e5XRo*jO;`^=}7slXP zY>Qpw$Z-~JW9__?J~*7l@SU}Qec+p$inZ1S=!mt?m^nS1bNahL33ZI~-Np9r3eP|; zfLgSfeCxt}t-%8P6W@I+!`h=c%;@LKcmkgNyxN|D(xY>X`+G&~OJLtY-~%KugR_r_ zN!;~5t-P_V{oFrd%^du`#(h64e4#AWp*7C1B7O`a2I}HRhrb|qpV(Kxp2K;-Yuhiw zzXV}kg>#)^D;u;uBE~!J(9Y{;^a;2Ju7F{7Vn;PUq37@gUErJCg7d%Qx`v(+8|Go( zzR!;<_YL|dFeh%_4((@k1tO>i&Z}Od{jA6jT>bC-h+gDsyNoF>Gf>D=E_iIu z(fEeA{4{2+YfU-Vx26wxwDVr3_6%(-f!1e@eU;c_;CI8a#)drV18m{$5?i2~6!-+x zzLB#@%-){Qrow#};{vf}kD5!sxqLg`K?q{jc4+$)^kd=)t;qS_%(vfu%{_)&W9Jz6 z?s^@zzMu63=5RA`hV6I6!W`iDyPWk)>~QTxV1wY7N}`z}Z}9Dr@`= zI0H|KyH=XyM2wt$kHF42Tod2@@VP?!@3A#V(W2w5TlyKBgP8PgSqr%P#GV81+jE?X zvpbi6?|G*0ihFuS>_afz$2$oh!T0e?vglK{0`|}E#5?!`|2Y`$^Oxnr`}m2NzZdQE zt{lO6R@cEjaMQf_8B1$GhPzBGYuA0>z_+(`?pND0YEr22oDaY^U=L)tsRaHK{w0{% zyVb+{-n_FO+ch6yJLiU+IdDDE5f7m4-4tx4i*aW681R8^vkwXU_yhcx!1vLS@A`pO z+`Dxp26s4zTln5zN6ebx4cGV@&b8z^IM3?@Bz*T~KlvsF`zzubcxzf+f^Xuvy50%8 zhj(3}y+eOSOr7z?8Mf=b1>R3KHhHIkzYo6v)-6Gk4sH)j#kik|$KY%544lK|7|&(s zkADmnz`NX{=V;ftsm50#>hD~*LpWouc?me^;JvBvC-`_9JKE$!766CqpBjCQALmAF9#y<8JYcK;He3OFh{$7FG zz;oQtE5j#rj~4dxoF5SHj3J(n^X7m#O9r zrZvf2>iZbq@B8rHPsTT1&9&O1l<#O&es=4ZgqkGYr8 z&a%L^*An#PCNRT3CT@=a2OtCALP48j-41{FdlLN$tc@Wh>i+S2;2UtQXXvTO4d+gd zpSM)&&GCFPa1YnO%Gf0CeY^kH;1Juj132qFICJN~IX#yn;C;HM9oT>?_z!^Z<2pzI zs^l2=yH8$+{jO}`1HQc(ZO_!69d-{+$#Lx&y5KvT`zpZwI=B6gz@PDZaE!e|-vWgi z_vg9)4p=`G<4rQQdvSjYVDB{uc;Oz`;0$h#-l2PRPi%$lnFV$hHFh8F5coH;=!rFP zmcTzpdv;5-ecaCmbRfVB>wx_ezL>k^GLk)GF``6@e zwuqS--7WK=;6d5=+@gBKZ9F=E$`kG z?F5(by-)YDIXW;0#$E!o^X^xE$RU4;?>QJ#uh4!@%`3!RvsdHW!+%q{ z59<_T@_s(P0@fwCCMR<snMCze3!1bPDHe$7uH=--9*&3?$IuZ`8!?(_@_hGE7@vZgP=9s$xu05+5&NYpqeFh)&aYk!`+6%#+!%YMd$wL9SFysht< zbi{=FwnvZsKD;@?`wO@NE@AiRC3#P<574gB!TC?aYrb3;)S3fa*PIjJ`Ccct1NzQvp0>ZQ&2v_{jvfhJ&{v3sJ~D$l z0$Z>K)+pxhW82G`Lv)XJ&5X9LaZBv^o$>de^&ev^5o3*gTzduY_ulIoH^*Av#@3wp z_kZ`d-p(21ID@(NyhZH`;Jev?fcpV`2^e>tL~a1zhk3?(e8oNJ-vf$u5#yd+=al#w z&hHib8MCKn_*?KTSmAf@bF{YoR^Si>NW_#J#E&8cb={5IO`hhVK?!!<#{~>g*x}rVf(Jk zHQvD&(8PXQZ~_XLk*B!dh4sLh{XUoLV>}2MhdoXtiHrThd(aK9~*E;|S z9K*YhKE}KAeB4impMh`beef1&ugJZOcD+Kp7uW~DHJs-zcn$(T5zjTx_v%`nhv#>O zeG{FCD}4-Vcq8W7*F4{gu>c?9dj?HhQ(oD}er!C(GYIU@!F|xd+0*^{w!9R_T+2Sr<~o~-cHic?k8eQ1 zo&mW+t#$fM+(QSiXd7Qu&VJ@zg4?3MMmJgGXK)If|cj(KoBdXDz@;J`x%T!woBmw{*JOik>$#rHkA_S`%;@A5L}s1IPB zc^j|;@<||`$H#ZZ&zyVot+^M)ULEm=_*Z~;c3SNr9^=^*a%SKVIHxrou>kMk-vi#W zwz*2g_;ye5{k+@vuV96*?U_4UPu>yw8QcrtecLBj-nrcWeee|A0M0$kPL6k0z;)2! z4}$hgeh=rG*1DE8%CJ7%6X2P-w-jT%M|7LAa0HVe_wE1h`Ugp4gFM-zIGq{Ft z?IYm11$C*yyz-_vBp~OOgsbTzN-2) zx+kv#=j6E`>pi#6z#Jre_v86BalWm7jBDDn;5%c;;agX*-H&nWhdsc}u;m_r_rY-1 zlqlw$5q}HsI(>|LU1HDSl?B@MjzEsd+rjRDdG=TX_jn50`2}&;v!6MCLr=et5@L?= zOne5MeIGQjSL-J?BliH9<9@D#n;^xQ=Xo9h`#F>6>Y27aJ$bH|1o7XYuV};f!2B(I z6MH*XCbmGYz%U=$^xOD~HV* z_xM8283Nn)ljZT}U?$+4t%?4}z#aiy%lU&kop(Fp`N1}}(x z04~nH)@1qwxQf5E2625k_v@RpkFf%0eF5&nwLLS>LEiQ4V}2r6WU$8fZ^ci6et=g8b`MLsD`1Y6EqTPr2XV@uzp0~h#3-*9L3b7^&{0>;-y<8$^El17_ z+t1Gum^TB?l7RCJ59C?)sf| z3jRxYb5_9osbpfVAH=M6o`h~<%(J-%I(YLVT6ENMhrnF%u5@sB!59A~9x>K@MC?n@ z;ZJ1^HwT5ad+-pu$#8d^jcfY8-T(0Wy(OUCll2+>@8-)f{{7)wyI=Dr+!=l7-m8L310scxMvXo2Nu}QzcB|m z*JE@B&inxQU7X=F`E8%hJF9&^Jv*b)$2i9Ve+`!M0)B&jMD7fofoJL77r^t4${(Qp{(lALa_q}K z1+;$W^7JgiSna>4wt5B>>)qq`ppVgajeZipP3$MIf;$2k?1PT{KtHQ-?`e%+;Ms)jxE)cDE9_X7PX+O@8NCVh&ZFOhMa^^H zp3N{DS~2dtTks`ykAa_6`v&}-s1;C=vKfPLT^g_zp6q}_uK+kWo1iLuq4@o!?! z&Dg>mc;zXay*~i%OWU(uV=G;Z@3+7i69p~<`)tg^eg$t#KWZ(Jq0deDd%*eJqvu|z zQRJ<&<_!3|;5G0(ON{k>wRdQ9pMeB|_#kM{)^+S-{sLt9Rki2(?A`OS#~v`|d2eeh zk?$G(797D@#tWRexyIMn z-;y(Z-{$mSLCiUV_(olM=Y0?E1=wNFKq5BGht_r<|04e1;Ljk;QDV%y0%w2wnkVMq zJ}Bg@;LpK6zTc6ax18&B#0%Q@v{`vIIa33y)C zS|=jLc?+?-z~2p?js4!08JufeBd4RzdUXJ`d-vYWQ?_W=y$z-r#Sv6N~g>PTaVqqTn>W}dK_qO@=vgQ)V z#1n9h4Y&;FdDzc7V+rk=JMa+ReV<{w*JJbw|M%b+%z!i4ZwA)Dx90hIH<^A*xD3MH zRh;)GII1zf=j`9aUhl)5fPK)vQ(t0?IrmlI9#hQ;VhK2_obW6=xF+qL6}T0#_wJ0d zwzzr$@3}e07r?w<2>xUE=fFMplep*b1TM!|=RKGwuguX)VB9m6Y`hm|TLSYEeox*jZ1<%M=MMiE-otd;!FjHJ|LZp~$8`?D zG3Y>!afXC8?!Q|Ddl0laGvM0BTwDDZY~bAM8Xdr%LCqsL&u#eqgT4<6ypn?-}0{A{}aMC=K^d$|lg z20eU+Pe9%^o&ndM!Z&B^6m9>orb%#j#1i_5n0v_RLEz*Atl{>F`MXoG`9FSwr9{bjv@o(M#LLb9*a4U31-++_< z8#sfTig9BvLBSSNaSr#>WFOy|`xwvr57Y_oyo2AEPpkvZr+$x^YkUf3U{`Yz62x8m zG4NcxLt&o1ekD&%lYny%H{o5=z6lI7#`s2h;&QIn!DSFY+xK9N`_T7Y99BEyd(Ymb zGuq<{$nfn>wP(ay-2ABoanI~6d|PK}FL=fI|4huB6JVbeejf(MnL4!Vi3RaBC~)e% zJ0nN-AZKt7;p{oQ!4{~xi?Qx2;y(cMmEpY5CB}R5^F9aOfzsly;m+k^Jf{V|bNBdj zv^_tsocFynR|$G!&wzRMFjoYzA&&N*GckMK!}ea9bj01;5_sRYfN^^!Vy@?Wmq5XH zX4kUDb-bH3eh@2QgZ+EBH^8{>%o!8dg4_6^Pj2hg<7fP?a<2ISc?tWt~c-I*Az&uUbY@gP+^JMay^w_>}@6cG_izJj_ zKX=Btdh7tcA9WMgIHuM0lc536u*cJpP41G6)~{`?n`@+80V7z4t@vxJv?jin)V9LxV?IC zAu-N<7w#Si`~>W`0f)d|)}Ep-)+MbcZw}|&#$98J?HOBRt~tJ^n;?M$xWA+S1bp9t z?|FE}J-LeKY3wEV9kBmr=o~}%;)k=jp9QezFC@m##6G;U_2eq{?qmF2^$EOhOSp#T z>fCFv!gkh7ZV%K=I&2}|_Vm@Au{X>h5o6Ad9Kx&fat5*y=z#%Nh(blcp^2l^o-F{P|A3(}5j-c;Bb+{{ns<3b{=> z>~rEz;r|o(7CcjV*Ez=4{~Ugco}-;35pS}O-w8N#f}9z;&G|LHYkv&P&E!p`;CsjB z{1Gh3naWGJ_rYJl3$UET3$<_HrZsZD0e`;<`}#c-@JiD;#(z^>A$CSj_hxT{PJ|^xN1^lnk4}tH*oJ`yrIp2%tYkr1PBF1<^FX8O% zI@&$hfw$xjca3dcS8*NQb^QC-&tnho+q_xrHlw^}?RU3v=Lxthu%E$oXy2tZ=h%<1 zegBs$m&~o_bRW(>zC~x9%BIGCKqq2-jOz?J_#eWb0Qa{x4xFJQuV}NzCE^9R_g>x} zb?u=KG1qs_Yv``l8=K*8@lSwf^BKN-a4p~592{XMP-1*@#+>0Lu>^M^*cbALcomTn6sLdwmS-W!(-e&8u*K-krT) zfCs?Oy!%b`Q2OBQ;2!`#o9}^+x&SMXh_~;hOT?T(-kkTb?VrdI)?CMT-5%ffzpwfOl7@%RucMH{sl4Cx_m{PuQMmM!R)T(E zbDk%_wR&@F%=iY|e$J)VPt**ehU?YH^u2X4z75ZJ+RwZNJ=XB|faled+ksMbChqS7 z&sAO&;B243xz{6*;aoG&il6r%h8p z=W0@7oZC4)AK!{=TteHofHes6T*KMU!H)R%;4w(Vej)fLwqkaFE z5Oa<>anIfR2{=WafuDn6zi8k1ePFLGm;v*e*voTpeR=bG^fz$M@UA%XN5Iebe}RW! zDvR2$#P|lxxeS)_z?e9tFi7tq5GZw#&Pn|ngM2mV{n?__(L)0301Z^3oIoG*a027FKa z7(EBhXl=mt*a>?9?A601V9$)+!ns%b-2}cfYdT_b;#1(htZ{DzxIbeV6mpxGWBl&_ zPuKf{$eCUH+WVf{AD;pR6(~@kpaKO76jY!)92Rw%zu@Hm~g$bn&W*w2L*qIUZb}l#n{XF?B#ma?a)13MhpFduSAS9 z`o7+Q6Sx)Vh-c7j=ldso0`~s{DDXT;DSY;t5z|uJ^eDOK=b0b(}xfxP2GEd}sLx&cACt=QDiQ zG$-tf?67CR+~Ew!{X4nNkirZE&bsf3t$?{JumG;_=fEDv;4-}ZON{&<@Lk^=V;N{~ zh-b9iMqQvC5Zi}$J!iA-Yv8=6 zz}d||sJ3y}mrKAmP~baYKPAU_ANI=Nkh~yf|8pR(>|-xLBFDYRy~7@2Cd8QIJ=xI3f? zFF~;eycca?zY}=h=Cr%buB z6LLKh@ppLl`4+74+ZmX@!ru`0eqMm5;2BsDpMg2Zd%VpvL-0vB_KetZNGoY-|?%i6~dk1>CU|sA_K$DJ`XJOoT>sqbP zkOS{od`o-}+z0ke#G4F0u}sVv{mjp6j-N?mgO3h!w7u6Ay2nrGjFxM6cmV$|;ClOkd@087>J|P`^*dr2yQuwKAq)Ih0F`m^7a@c z#?P;u*ulH*+`Nf+50~L*=mLCu$LKD`dvf*-@Sa+)HotA0+qmCNe*X-6o%BDWR(^pF zdQPRse+V}N+Ch%z71&KOws)H0{5{)u5X72TH~ z?5_PM@GUs0Ip!%He#E%1-@}`GFv)TKC4Ns%LVHI`Fw8|Lh?9_?rAHCU7X9PN2z;!SSh+s~PXUU0sF4gPx}7Wf6-qkDZY!*-^H znwl@cQ!t$=k!SB6cmwBJ7v+&Pf}BjgeeK!AesZ2kF$cep7of={xPO42m~YD-<}K0U zcI8*t3HwULJ#-@0QP+b2=C5lEcDU1z%mW>~GVGC@KE}InZBg*m^IETOuIsiO^%=hF z_u?7zeAYux$; z_Ea)CzR7*!-tEPCR>bD;{{+6lLjNX#ZU3JTmp{PXfR4Cgzo*1qbKc_kQ~3_x&-)DC z`itV4KL!3=wU6t#zZ7Gp^KHSeh<^;eYCJLb^a5W#$hTg*ueAwn?=OHoJ*Oa6fal;m zhj6dJ3_AhW*Ou?eyMn*N@33EEyS{ci$G7-@0M6-Kv(|eJayn2z59IX&blBJKj%%G@ z8*8#pyx<3M=Q=|tkcr*Icb2JmH^$AGqwQDXLx%Q(nCq1boO^JcW8faX1+Ev=$a%gQ zTYrmviN8aKA+^6E4K#DxhB7>ylXgz>wic5Dwy`S*0c3*G1or? z`@mjZ5C_&5^aAajJO!QHRNx*Ge*yeGqr{XP*LQ{$dCoKy=ka^oGs`iaL7C*ar=EBM z1(@%QJG3(;><#z?nCra$&fTG1%eyhxHGU1A0q1Da=CN;v`}_iL-gRPA$>e@U>=pPu zxXj*;(ZhMixb_|VHFIT=jl3EUrnYgy;J*`a&#R%qiLwqj4$Z~bR* z#T;tpXy0$+#)`4t8sEKqipGrkCb1<5a2Y7}T!SrGff7S__-BFtlsxzB`n`Y;VBPQF zoKqxX=4Z6<^XKPoD)Mu4$iD%nKExN7@Lk9A&OnJ6&$88hOwIxDF6CUqeg!*$W9()1 z*KqQI-)20O1B$td`R2LL663p`RW9M%U%m(SnxPNS_I!se_cu9ml@g=9A;-_lnJ}OD z0v%|j#Gr=$-;whW^u)rrsNy>Rg!>cl{jBKG>Fmzz`EBJZ{5;&=kUrn$Z+n-ndGS4Vs`iMwvZ_<8et!1FKo_KitiN6dMQZ_vX2L0l;@elB{n zvws4X;B3;vwcJMrYp?+37tnzjzMr{!;G&p&1g^nl;CEW4W_TlL`)+`F_W2LKZ`Nq} z0py(GFTn$9kI|*pC&V0m&)`d-KNbBe#O>?fS+1XAn!&onE`vjQoA=0^DkbV!q1VLa zcjPr`>wOB>5%0+Bfm$xmzFq6Q|EZX>q2{l|J-fgbo{6#{=DYCz?A1m6zCbJ1K7sSj zTziGK-n=A`9OL;shT8)zF1I4r+RwlYdn&G1h<^j@n=kMs#y4^m?q|UDhaBS05(l>4${#3lXFF?S#4{LYmzUJ*?d-v~v^SZvV zT=|6U-Mg+ie+H%UK~4dFzI-R{!!v20w}c$SZHXoFLwmWlg4>>gIYv)%(Y!J66*UTtk)CxQQK{3a#Fx7ZP1ftPUVsW?|p z{13pqOih#a7CnP|@Gro>z#M<5BUjye%Ihca82eM;XUxy*39$g4|2}v?Yz?e!+zi`$ zJ40)mKb1M0>w5+nZVl#O0i3l*zlD1Seh+*LU5q(u^X!{|Guf*rt}mx}p7sxX-+PH6 zJoG;xX3g~TEx#t-nFsd@ENd@k3gVu_eQ;FcWDarfc23MW?VHH$K?d3n?~b1@f8Krp zobelUdn07MmmK4sJm0B2C;v4teh%DMklSW+2H*NGfc-OEs=WKUMBMsoz_@qTRo)&2 zy9f4N!X^8I8Mggg*ZXzU_6MsR)=lP-$9S9l63xJg3#62V5$`kxc zm9wwCX7bFdbl6AW7ID`s@nJ3bqZ+@57QX>OP7~KX0W0tT*eBKgCC0ZE_=Dg(n+R-i zj%}Vb_II`>1>5s?<~8gAlAdX&lXSkp5+c$V_$O< z=-}j?&3Et-_ye%soEZrCJ!1Cgu{Y=p+8N3#r^KF+=g(fbCc_+&hX3u;_@`i5>+Rzl z1uTGj{2KW4`5BNm_bs;T&VX|sfJD#h=+D3zao4ezw&xh|9XP@N9sXnBKD@gi=4a$G zaBZ;!nS9UIbKKQ( zHOIRz(b!Sj{~2-jX>B**w{Y?+Fb6wuR_!I)yYVanJ5#5Yp8@;$PW}lm-1iRHtH5Q! z`^@-$w)cUbDQB@ykw>qqJx9NW`wQqQcN^Q>L5MA}d-Mu@6|Svqti4a)fWMo33!KmX zsq!7#?|;4Tf2i}l zJNq1DVod^H&hzkh9M?$pxght5o97(fYg?ly_Z0Lo{tjfnVQu^ZR`_%BeM4$zuqMHE zV1w;j2<(LI8osk1lNZG0J&z%uB=6zh=12W+pKv|)8g1{4{a&!=#O{!v(JK(drt%e> z^Zb}>$#)O$&z7Xi_zytD$aUy;9<9eAbu-ZF{JnV#61hqrA2|IJa?RNT3+#(hV(hns zbJh;OiEsKLa6M(Xrx^8)*b$sLq9@+Oybb)2k8U}hmG{yG8WeDinD_YwxB)`0igoAY zTVp)b)wY+s`*Zdt9eIDKT*B7hhrdoNYTP40;Xx4>S3HTXOJ?HbGUdN0^> z_$_coe<#|Y6R?l{%^&Vb4U9hrzR4cnpV1vUz#wRQ+QYjzMlUORxT#o^;a24R60ESN zV*Zl2XZi?q@IlOZI<$K_n$%=s1CKs{lRp8wNnM&q5dRyzcnNZ?PiWUD=tFXzz!mTn zFxNe0xB{AV*yg#e`@MxO#Qs{fc^SV4N*Cka?6)PqiR&)#jsF>VCWTz%;*Z4S?CZP9 zaDKmD2HuVOz<$IB(XJBl;f$TJ2Zh+s8|`^ybO&6+bH5Lq$5;Uwtnt4m{#)=dxDGs% zPQK2WkUio*CeHl|ZjR3JAtSJbbG?J#pcB4g+<6{?Ik4Wj67iXRSoakD5piSFIfx9> z$2j}fO_`a>( zuQ0Dk#Q_#+!8Hwfpe9qsQ;f1?IU=-|k!=ZXa8&V9Tp##(=+DodWmS#2nwn zGhqLBz@AN(*uNuof<6W2FYw)qdvdm6ZQ{xkV)hX$um-n*d(8I0c8+!JWz7tG1rqTy z^v}`S33~%}*uJ4HC^6pg4Pq}qkN*R~|0!|T`2;Me>4?1-Vu#=zO8MoUG?<_fm!%q#Z-t>hSU_Tk!D zx!)E3N9dct+73UFtC;8Bza{QI`xwF>{=s(+&(k$8k>g%kUI*`7ioJ4-THZHz2PEtQ z7Ua!<_W$NP=LpW;`&FmfC*Z#(b_@79TM-x5XSfZz7uaD81h%3!wz)groin$y7!&vx z&h@`XFRevSbF@A4Pivm{GCk8^4d2xv_zE1+<1#vkud$zFdq(<6AkCh`x4k#+?cE=K zwn~h9GWR;1`S!ag^4ExG@;jhJjI%iZ3SNJZs?GB)T?K8=?!mXA46zt>pcC-Bsi)Ue zGI7t=&-F*}XK3H1=VXn2di1RNOLD#hFTs{rXATHZz?-|{4DRU?wrASrQx71|{+{sx zuvYQ!hJ>%Q+&y9)@GdfNjsQ8vbMe0XUh{XYL`+1*oY)yqyPkW`a4WRu-D3-9I0c^* zvv(8sXMI~kJ4Iv1a~opBH{c#{zs~6Vt|$Kr?5f?)wa}*r9WWN;_?e!HbK28>FVF=X zW1DY(=W{mSfa}P;MSl;hk?(-Hia(#dlR2>zW4v)4{wHv*aUEDc6>Db1PtdLjvKMi$4QE2vhUptvYpPQ9;{SCI?{Zo-I#(& zYs!0Px4|Ly8pxl5Ouh4(lfWEw#N=JWn9}w%J+LXR^->C>wN%!5rSgf0A!35!==rS?99P0)B|2UC({YTMu;GM__w5 zg_eu{f=>6xj9ff%L<)a z|5OFve)8w$R$lGBAA#F&m%$2{a}(X6rxN75mVLzb0{@oS>&jh6r^>q@*O?Queg-;v zxu$ROz&P+e_t4JM!8ZwPk$~sye@{3@EA}%s@c2vYZ{T-mKYL4HP7`M-fk(_eJO)i> zwZ>W3U<0hRM(MFV_fLWLN-hR!_@~2u1LvN+JL{)npCvKx;w9K#;1hmNj{u7HnmoTl zPvHFg_#M|1AB31^W!*=_{r%w{ux|&vi$4MR4D4|RHo$#&J`3y=<30|xo5Yw`h&k^* zaQ!{dq>yt1-<(g-?!6<{#5=XdyLyCv26}kUL46%xehKe+4SON3?`+N!=7Sx!zn^sa z)X(tUS0Z)-z5zYlR5HHny2d%V1%E0%zT7Ra4}VZ|+I*gwHTrwx1a_)^hxSaon-^e1 zZUA#df?wd<_h0btr>{Kh`#r3P&4Kj=Bw$Q`M$Hyo=ylm1*oysU*!C5dfHl5Lxd=2c z$FqMz+&n*@fnVU3XxECG`z2hjU1#6IT_cv!57A3-6WGst`a8Bgci3}a-`DsV{0jU6 z*duCB_x}%Y8+61w;!|m}c~6JH_uzdfB}Ut`+!Ei(fr9V6ZO_i;e`9g3H=v{L2SV(O z9B~hOfo>8pe*YwNlOFyQWMbxe4hgO8oO}9kuJ3G~N%O6{ir?n@4tq%~$S=UN@^3=< zgm2FW_<=qB!`iMBIrf$wl--9+S{67##> zd+?k~OcF3%cR}2HE?~IpnxbvKYy1T6{an@&?5ie9-f`E1To*$&p~g_1#vdd@f6Ilr_#mvneB-0!@FN&1tgG(za{nv zIPVbivtPy7eYj76XK0TUjU8w6%zXzZz`Ojx4En?qdX4s7o`M;^;`;io)5W+y&wDsG zc<<%}e+}%doyijgct5wnlDNLwp7wh|{ExtSdh^k*@m!V&4JhaV~qGq3zpIUqBBsegfX(*TC2u-~Phd z1#tbFVAu;Y*vnX{{7X4%n^<#|*am$E?YX;F)ExWB&A=8cfa@x9U5xu5YN$N~Pl5S8 zTo&XNwCC^t9nt~(vhv0ib5e}Iqq!IRwY7bRa-s)EaLrD4$NdL!d!7T=SQB?Yg?JPD zy&~pkCIipXUL83Blr6q%_n?3qbq|)rgt^Xi04|aH z2zVwRgEL|YbmR}fzDfKOU~kV-y$7Z;BhR-jCwBIUab3BJkK1^=t6#*+1L|&&qdq2>97;FYs|6b17GQ5%(b8A(t|=w8TK7$Vke-(R&vnm z?)aH&>#pGEph-{84&Q!flczY~p8S1-9_MpAOx_ zw|RU6uKOwQjk(q^N6ks-17b69AO2s!o*i*}&am$R`#Fm}0#4X#4Q>$IfHg3d;jH@z zEb$BaA7Fv4oM8+1W#2A_@bFKN<9^wf~zc<4V#=wsyMkEz|F6EUT&J0~s{HRmC^i*cq~*na>!_%-N> zPh}2gZ*c;zo}s7WOvX1g@8TYu!?P&x3-reN81Lznn4h&K18{k`YLjNxDJ#n1mSnAh4&Z4c~w z1a86w+S!bIXYON%J_oL`0oGgN+~%#Z|4yFpoYdw|TAH!0ZeT`t4<-RXWa*at^I z-Wtzh5Nv0@j(-aT{#3jl`(1@|mMQQ5`1*;0>)SHTeNjsY}e~!oXh+TFwZk}{Q}oSyAZcd&b)T!0e6URTv+e# z3ieNM@@nILXY7LooS1`79_<-BuXS6n1_76WXKwGOX!rXNSffOYwesFWPuw*+;uppK zzM+i1fiCD7XnSe-3%Db&gX@E+m`D(pb4KrZ3(RY|@^T$9W$2H;0Sn;WYMbv&bC9b} z=<~bd9<3Kkd2|ujp4A%YYn$)PGwhC-{&i5W1GtuJ$ZPk+redCV^EvQ*)rnY>jO};# zC&1p$JUuh-!}vGAyV5SyH0iXdIRRh51->!oN$4fo`#47*f)>wk0j%}zzpvQhUliB; zHwd7e<6_2m#)oiC+(Xc-1J{Tb^mJb>uLS1}|I!@nFVV;3EfF|tv$>-fDU zTFi_+eQ*o-w&XK4_8UMi&;AJQKF@%2MD3f<#=U3f>ab^^i9I@UyhD2*fKS279w5Ud zaD$kfIo{n0Y~YP=(e6#(yA(lQlbnKW|L5S`T(q$!f!!N})1I!~?xW@EJHwKE ze_we7I%+aVAb|X{yCc3vyQZ@zIO~<3*r&vtWe)s1e?csTY@H83qSg-4G43AMU??4Fy+dcT(sJ7GX`jIP{+h^pexA4g&8cALfE9@RoVfcm?>hQh;9et0 z072Znc^)U&pQGiQ%!oa}e*~O$38vz#N5-O}<{XfJfPD#VP6E#IJMau7@}18d#oqr# z{0*4b*vO3kI>(>j+=IQQVqJ+35&OEIo;>H4_l$(=WOBoNaIQ~&hkgg|jLv)?MCHgF za_o1DxNmzOJBb+kYul$u5br=DcbIR=V|xy+{SkVHw%?FX$zH8-9p9{Ly8lc+^%mcA zIKvixw@hbEtoErOk-zWILK_8+O*Zdj&3f;%}nXyO47Av@nKd<~x z@ZINdj_}U12KFuZu6GswA+V3<`*Yw79sC-7MBKcBpMh`Pz9*m%w|5X&ry_JUXk|1Y$#hkAkT-~(;!Yhu0^xqT3DO$xmK&DynIf(~v?Y!AB! z-j^}OxkVpizWqG&jq4Co-r#>>4BP|}wGN%|uLIXy)*5+zA(!zxbF22OAA_j*GxSS* zduw|(d-B#GYTx7UL5Hnxo^vbO*Wj*$gx&ZOqrIHuTGJ69`jhW0Q^|1lI3)fKY_Y8m zL;6DN#v3ux?Qi$2x?~^V@dpW7!V*6Hq z1^x=mb*AAi$#?C7&f0LEjeY_>(D!Xz0iJc#nD^^`{A|4d=43egivtk&ifb&u2FUr@ z%rQ{!|FPb^$}P}ybh?m}@jKvo_`B?ZIa7)8?cRjD4c4{CaQARa{1Dg;mdo2~XZ{8G zr1mQ1A@n=4CS?2* za2?J&@;scu{F%Abilkp}CMSUX=EMqmu+h%s-FN7{s(WmE340~i z0M@nm4Y|5BLm%MPVYI%{!Q99zDmE85p z8;=;*@XUS#oU;&1pab6fmfAhEv-HN%3B5qu&%SN8j<~Uan}H1G!1xON3eNkpm+?Ye zJHQ$6&MrzO$NAd1nrq##Ka%bHJ^T?mh_^kOqu+rH^bjM zH#P3n_iDYdB?$At3fp>Ty#@;QMR8_(e+s_>DL!Om;%C6V_Q(^i!}i^s!yN;EXL0_i zxX)q##9zQW&s0i`p8?nK_ni)GuzRou8Q%IpEBbSC-T?Qb3}+eR=l>b8pl&)xhAZG4 zZU%Qz0?wa{@=JK@T|W^Q_V-OBVj2G`_IF?p%s?V$-2wJb!3w+7+#YU$?Yh3pC0Ju$ zl*`0jzbC(m>t=Gj6FGZK#XiOdVE14+i<+eEo0mU=n*-m8b@pxjhME}PYC`LKex9>? z{57}=lppku@n@g?3w8qX)0`V{p2-k5hraLc27in1{``4mP9f%eE3g2bm*4Ns{sO%Q z9Xa;M=s-K8-z%P>@314TM2zQYpB`JkiEEi>y+1eKferRWc|_d(xqowHia zVw|@_9}zR|UUw6|^)X-G9;-0pRGLh9pcBpx+X(!IAulL@2Vx* zdTRzjJKF=eeRSX_?CZe#j@W-l410>P?k0H);^w>; zeAnD(~eCH1A9t8F&_!GR}VSfepK!O_tUBGaj z#QlD^W_l*>$DeBtK_b_Eb=dZDe?hE?x!+aJckO&x9$4470_Qq~xbt=(5p#~_XE@)< zK5&owaMrAW>)Kn}zRuf|UyPIM+V0zYdnVAqTjS@(^OiI2dzq{C$#I?I>L0+_ubqdV zrDl^o{C#_^#yp>%x}Tx{2F|fPceP@j>-e|WAAtMqV$u)W`Ml>`)9*X0+19 zc$WpvSX)=^xt$W%b{+TTXHC7X_Dg){n1e!nBJO;m$6ug*w@VQC&aZC|#k>H?z;=#1cSr5M zhdkm+kMG*PVc(74iLR4kobw63wHaUD`|RaF0Ozv5c88t;_m}VsIH-J&y?1w9Z*C60 zc?;}B+&;tEpbK0Q*yq5zaE2|mHS!sp;Cmix@D^`DBImYwh%xyb<9DxX`ngf}))6;H zUpR;7))TjPLVFH!OOWxEh|#vz&zJj^3v>ZPEqM#<_D=4R=g+wnFvnVDj-6t>|KGs* z8F8&EKr!!A?AKsrU5tH)IunSs&v>-H=V$zxqd-=f3EGm0>4Rz?b~ua?L?mYI|Z&`Tx{_lpu-$wgMSPj z6LZa)#!}M-w71w*kKUH^9%Hy=S#1lhXq~8}91~ z`Wl!@z~3Tf?+#lT?jixrZc+U8hF>v5auJ+daebX(LKm9 z^440@ReV+XuJYca_8xIRj|b#g51?=SoS5h7xw_{9=NhhW{vgB>=z%foz5&jeoy?Vq4=N;1XC8@6jCyAn!eDyQcFFGvm+kpWwT<4qtdb9q2*87h(ZCx8bvc z?HwOiKK+Pv{=q ztbv_sev2>fj(>Ca=ptVwf^~_txpuYQJvei~bzlQLqhn&O?|1zkSYSK1@c@Z_&Kc+q zc%Pod7C5gxe<0*!@RqzC_&J!$jQktK9)TAi$eqd({vq)LaB`uy^EiK*#Qkih_|UL+cR^1M0|H^;CcU;xZYH*k@pUC@geFN7W^J~CZ1zgdFOY1&o|W=)_ai? z&iMn0(ffj48QVGjhP?&XL8-i1f!)=0JPT)N;u#G0TG!E^ihX}e%{fTeL$4UuOz4HZ zz&`L@UcBqpuP4`im}gy!NDBz5`Dd%}Dja`^GRawD3y*t*mnA(2I z5uEeP$a8*s7a%W;w|&bgu2qPK`PhB@&-XVZ^3S8YWB(`UMBYVd_v${hFN$lld+|)*!jtgm8^2pr<_YdQT3vZyuA zyC8R%;X;n?Ex7MNj{iv-|0M`9;WPG}zM1&&`M6Lj_hWJEocj>C?o_%M|E}8+KLGA| zI&;8(Ond|E@wr-w5x((f!1M5olrBEZZEOekkeq)2f5*=7?*-eL<%DafXT%ii-Iw+D zkyCGgocHt&^fCH=p3cE1#4`E{`UY5WpE}K*koX<(b?E1^?K3>?Y2fV?1Nm{|xRcV7!Sly#X6|_v5UtrtR0v zeqSx&qpqK@Gq9(6*dy8;_iFqF2z%Iz_!hX{^U4qJ7tS2(X272zpMo#Js>Tk`&M2SB zy$L7ucVGh^ccA%}Z zBYq7OV#*4=0NzW0zW~o9VxR|o3U6LVO#K`_p%u^Q0DB9Tz&&^1Og_v&VqD+%cpa?a zdSXqi3y{H8c+Y7Ex|V}J#-FZPh}q```Dc}L7R5UE>$$hRx~D{Z5VY&KhV%IT?bXEn z4D*mT$9BKd-qw5uyyrK-HLNkmJ=p6TV$R@qO}oP-aqr6aWUVsVpq`a$DEG1 zSYiK!SjG-;8{59#y|bknH*W^oJ=@Pd31o7NKLx(?x4_&WuAF0kT;uADKL>q`Z?2#N zKULqo&T1afq5qCp0q&`Q4fb$m)W{`bFTiiWPr;(`)^l#2iSEIXG&N0N{4)M3Z^EPkT3k{k+Blc&w|3$sI zGZ3JOXJl_-?h(1A@0_rzfjWy z*EUz*eAi#0o3uF-y!$ZEGqtYAw)fn8Y-NVMA5qp(XQ*vArD?u zevX~M3bZ~!?^^?@Zj6~De;%D4O@{24jUVeaQZJ;RSl?(iP){XUh?^zT735A9p>zZ>?Ty`4hb zcj0+jBNDLzD8)1M-U|2#xTZ7O*LjCI!p!mf+><%-+U5w?x4yl9`3Lx(R|o!t{S(mk z@e+GWd=6Y=1&*uE=xgxSHyy-;xk(@!w0s7OYWq2Q0^Iitu&%l0@38lYS>st*b5SD3 zzH@VdcVqu&;A`NF**MsMM9lNM47T`(;2iq~DD-M~;W{h0?}*F422uHG&Q*Ex?C+Y+ zsojygMBl>?w6odAzYz*tRDMnTOJZ^Z@ZSqL+gkS={sg-aYwN4;5O;rxcz_ ztMGfk+zx*Z1|jbz@h>WGp8Hrdo+SJFMx4QZYc+LEd{5r_63Dl?+WOvwYwzF|prf`! zdnPON6?8#2as5w;Jq4NECPP1b_x}WLjSl=$;hF0;6Z;6=k-I_r zHax$CZ_K=(;cH)%o|xbB<~UE=t9eJpD|)#5*uJNrMp)w-fdnnkRrTjObBenzHN5Bn&w%@O7p7&jdDJR(G`rhXt zVh9gsl8M{bp01aG`~rQ8xHbA2$R&LD+@Xg$<5jG`M*Oef9$1@?Y}G*Cbv6|#KKz_I zs4;aW9>8<*9dy-qmSeCZXAO)OpqT4t#dZ520NOb}BX&;y52W_kNAJTg!L+8tIOn#m z6ZkzS_|Ev*-SKl|p6ke;5TDh2*L(;R&m+fRzW=AgH}*HU9k>nLQz0f6*ur%N!CqrO z0nXrBJ8%e;Ioe*{%@#bzUZP8kXV#y*VbQ?w*Yg{a<o{fFwQ;jG5sW|r$xJ$#?D zJF9j(AJ6p_{u%KMeuJImYki>2w`alj_klUEZV+PLncqL2uQU2q3vtCf^PSt7jXQs! zo4Bs)7vSDsf)2Zh-wEzN5!->KT#T&!{hM<*b3*#s_H3fvNA=Lx$aj`O@WXtxGRJ-a z|Gqvhyk-1kKI`~-zXJAv_tqq0+@E{e0OxrCzeS5wdDp#4{1dRic5Sui+0L-T_iTe2 z#hM*({XWJyGyL#fM_k@o`3`=D?VI?PoO|G7aE9N*1t{PY-!<&vJ)MBhK>{ndEXYe} z_Z(m!crQo5_2%fFoHh0aEWjZ#dk!`D1>T&?HSS&C0EckP3g@>*blCQqfuK(4KY-hz z6aEt2RnFLFa8dm;eEWDu=DE*fumXNZ_->2^`5idGF2LNUaL%;>Gtk4Ip`FjXjIVgk z8Gi>-jQ%TXozc(CJJ1tPa)LZ(DA?!L@O`*N+b5w{cgHo%@4y!S$UG&O4c~KL8UqD9 z#Gj$<5#-p@we9QAA=g`g1ZS@eDA?ASdw_PY@;xwj1+G?JdyvZ6*R%V-K)cO1UEiL5 zSIpq;=bUqJjabk}e1d%)cvijx^OCu6OY}`*Pk`&&$9mW3;Losc!zFC%7TESG_~vKe z{MH-*&)_rsBap~Z3b7Ex{Qmp`xNZ~I$}yga=l&A(_$zX>+B&&?kcbU}p5fci zH9fO6xeE|-XxIHEac6u6J_46O%Ts$cN+080dnRHII#7sPW1j_R`!jw7?>S`j4&1_bq3H7e|r!5Vx*j=2HXq^q_w6>?njCRk!Oao_gdfva$?y~57aTIcM} z5%_ZUI05e88uy-Su05@>e+N9{Ct!_jjxx*=7{ttLm|;81$K;=aIgnd}LcaPQF@N8Z z*Uv!PUiKX%_!o5GH*h=PIcMWl%$*av45#j+{+@*I9xs8Y@eJ2vyN>VU6R^P#;tA~I z%XQ$4crmWT_%1VX>jM7=LhcUC;a-9b$oMHfWMyn;4LH}h5AFaz`%&|(@s9jG{t=L0 zgGB5I902EcEv21Pj`3{{!TL`jc1*47bmrrGhqGGS;d}pAfNOddu0IFEoaO=d>wEWn zm-sz(0T$KXpud6htUKb?B(#0JEAQC71To))oc-O4>-$Dl;1+Nl=LxtSaJ__o13Uv; ze1CR-1@?ezWcsNW!0*e4z?iuO3^|owp*vvS_rSBaE|H(m#unf?xDAqV;Jm)SBjCK3 zfO{!$_AJ1?I-~d0?j_ZFwfs5wIXRz!JD?B`&;jSYNo%bqHvA4;1-`#G;E4DEaMl~(5PJjE-v1UYzQA@3b31wuv*7pm3vh`2Td>3q_$79m zg-M2*cf{=B+Ug)zi5Tr0#O_rt6KnM|^2`_K*skqt`)G5_b*>F4*w^4P=2XZ4KYub1;W1z;i6rD&};70WvVIZ`^qUsEx_Zu|4C!P9TFj zcgO$T%Uo@1n`pl#=I7)QaF0{TQNQ=7^_~;jn02n@Te=V2vu7fr@;mH5!1;Op3wT;} zhF69;0;6)~nzx`%k?-wCtc&puPbw#WjP1F)=C9DMGXw6!^R$;SXYQ%rp!I!ohu}I$ z#FdEgb7RdtQ1Fe}dzc5?eCs?zdlq8D9&l&)9k>a11P*}b)p$~dwMvZNFV6S|6l$h& zgzuZnxQCsAvuAwIa}R$I zd}q0&k52fmt?e3Of!z~dtE+vZa`HQ3LoLdgw)oy(M~(UB`~oEW8GZq-*(75-;{!0q z_FR11)|#8CGxi+bUd}3KuIm)|sE`->N*Ckb1aF9a1m1y2p&v_ohxt~O=1NL(Eb2#hIfZPDo20tqAI}*ReFXWi-I!z)z z%(_o}2i%u?I>olewF__^-=^>3G6?)0{%6?s%-Bn`KgXOo;RlfW20w$og6JSKIAPq+ z&>LXCIk6SkfDV+Z{|xs>uma9#P8Z{xxoUImH`Ea8fq8S_TeWACXXJTTdmxB+0dioOWlvr*H6|0(&ccjJ@v>`vjPih$*h!#n?O0#?|(-ejl{E@;nwm9e2k! z;EY+n*2(qQ)_Na<;LCT!*2L^>P6tl0oyWcjKWbdPHgS2A0IvmG6lwf&V?+pMY~Ge7OM1Ier(c1LwNt`kp&t zitE3`_b&FpLttKxfgbu;lWQOIeB<)g-o%!_2YO=8Q-F7}0sfwAj`azg06&96&&pj! z8$Sjs;LOgkK)YYhHQO8Xz<7Y`#O;&7))-s@_V|X_ufQYl8cd}p$2#xB-iII&Q|#+q z&uhOOI>*?%M_(n^pJ&eKIh~=W;+a_QJZJJCVfQii$Y_0MlCy_vSySLdHi!68jm^-> zIK9pFb8PKrV1q9@d9c8KKzt7TE*WM-`<zvE97(O<*aM?ZkN1B!dJ z)_Htqz6ooZEU`VWEjR5t(fX;@4>oSWzf=2o zeh0w4&C$-}zO8kw4Z0&g0Y8r`Fe9cvl^(yXmB`7$yee|$C=uhkcAu_kzXkBS;WH4{ z0kydWxLbE0fd2Uase7T;4e@N+09fk=LGz^?4d2=LHz% zq_6kue6G0LzAYb{s@;A}W*>X~h^V{D&+RvY(-vWEN_5x(` zTvz`0z_oVxN1(F@>lqVILEB&3zqP)9Yy2D*Y62|r<*pOc_PfS+yZ}9X0$t5hyS{JJ zbv(;VELGUo_*>vUv+*jf;d!iqXZNvuy_<*+d(c+og!6dr*7m@?C3NFEZ0Gi#+_N(r zpq+m>gQ45F*Aio{`3c^dAg0*wb7DKWDhur4tk9nGf5MBOfD+Vzp%=OX0eo9u0N=wc z;P+-GuDFJ?JF{E>XB^^C_HMc6yN@lHgV%8KS3rreMs3V@*aPolMs5&K!1?7nAeTVf zbHF{re+7DS^?d_Vv0ko#CEO|gML8n=B{&3rzqP%zyh7|F@D{l5skkqHKR82+64awN zAXW6lv}Zs&s_)sDzd*0=j`w7p_2zXoH_-m95cbIUbF^nMXiTM#v8JHSQJeqhZc6`8 z{onFJuD;8J-NDO=<7)RcCn4tdlbmnwj%#G%E8^BTv$8|`X57mOb_N0Z7{3Rczf}7k zwrBbZJO<_#xHik2SdVW^oq_cyU_ow^HMY6N_RzkKbFcvkbkQ}CHQ+TO;^$v{6-tN2;}8o1{abuSZp0q1(ocoVq(G5iAb1!G&$tj%doK@&_4rYFd(N*9WvD!Wv?JWB9 zyQA*0GqFL}a}NCfhWGpjA*XNugDK1~G-falLJZ9^ zn8FOESqAek3`4URQ!K_bFU#_NKF@QnRBG?RU!6bSbI(2Z+*{Qxt#=px9Qe6xXY>rO zfop@c?(3fV)?dN-nb{R*eM&6AQ_yO)9DV2Z45S$IJbwVs@;4B~m6`Dv&tA~>Dlc5~ z4LXSL%H_(NV}Ji7G5&X{60d#PsFO>%jusIx8>(e&2V*n;7>l*TB3acH~py{|fx~Cigk2{Lm-%Ay@+aKfr$v z6#Y4IYySqAvxn}{jSuW4F?0N^9^+5Zo_URJZTrbFe#UPQH`ncEtvCazo5`G^<$X2PobA1M`fCF+P#`*Qw-lcsB z_eyY{Z;S03bL_JRrE+8q_n(N(foF2>1m7fM&sl4K_u!@%dE$G-GWs)g0q&n!m%w9u zf5v)F{~fRc)+&|v{dyLAcnF+N(T5MgNDd+g-}I*2DxCC8X! z9bullakbLL_`8Aj@K)(#?>00T&dQpu_8|Wy@eB@tGf6S7JH+=5{tPm)U2*oqS>R^a z*4dR4V()u{({4ErSmXEA8L=Dad%&4Aeu3SCDfkY~KAM;lG0ycm@qN(YH_>+f-v1rA zU2&~@%H6uandg50Mf{Om82MP1@L$6@$BSZZd!EUom1jG75o2HWWPf*eICBg9?})j- zd*}z)75y!1&DjIq>(PdV?}zt`ED zw)J}WC3+58+&<-p`KM8?;QM<(A-^Lx1J_?7c7(Qu`xsk+!0yTQ?fLWUlvu$x_5|Ph zH-LRv*K@UbI~(T^D&F6G$2TYN55O%r`~OH{oZ0^&E&|_sC}^dy&U)5;4b1V4_A%x@ z#TFBC5;5=Bxwm<(T#w(w8Eah2cXrmaekRu(eeWi*CV)M7h8}xD`~!4lj3 z-S0imnhi1cGq!|Nrufc%jqiOozQkDX1~Km~gPEGO${hO`uKC`(`*$(WL!UEz^Rh9} za?L3C#(Ho>&V$?I-5YE2l30gtf9BYO{U)#m&aBmRpYQO4`~(j0{cis?m|z>*l@9+0 zxc>$ne8%4ueQTe>nbYpUoVMqXPoBK{CG1_!_%A>qZV!QO;-2!t^Sxh3j(M4QkM7|P zu&wV5ykFzapvf`z3^;=~@cN2(+QncF=d(ss{|Ve5L0^5d?4jWMcV7F79Zr71`tK|E z8Tz8g`@5@m>3Of91D&I0qP2&8h$r}|e0@^|PT2nfu1O|ld`Y|jf2Ixdt_iJgbKKYO z$m_s5Q}hgNJi!lwc9v&g1@9bu=hoauyH5|YJn(<_>MilWKCf|e?h-phZ-IRc65~ui zhkFig0y*~!xF*AyscY>o$m!tQ9MtA_G4^hbXf@}6^`@eCBTb*I3eSNDK>XW}z-k8ZO$!~YNX4j6a; zdCfIP|CJni5OOB?4?u@)y>=FRE}$o_tzM%4M(z}y@H0?cqwT%?2z~|=aynwJDQIgP z65j*9FU57%^RwyR_U{b(fCNJ?Xlu!P=jP9`JK}0(*dN;&-T}K3G4|`awzl!E^M2i5 z&b#o;i8b#9JA?ah?|{9?pP(P%JBy6(x&v)$4noZDS9@L&xBfm@V|Q@7(pBExci+JK zoEU%icnoi@d#|zGb5}BX_HYZ%{gSvKzE98Ld4|t@Tu8v*gIfXjNf&tQws$_O`?q`A zhcosBZJuW>t_LkA6MF#n0@&*_w7o>lbKjo$0wiJ`2<)r|!@2OaMVq(hk}CqfuiOUP z`d7eP;GHdNJ=Yp@U9R=sVb9^41o0chdUOGv-E|Eeu^IUfiN66uf2j&w2X~Wrs@wtE ze5J&A-}cmDXW%)sn;elF#8U7d(9Wyh0cR-Iz|YltK8^L9r|-c!&SjxyU4RVq18l%2 zLd?ds^CFXt0{d|!pd7qedJkPNIM+L@n+f#{gR?c!+ z{Y=cY_V4;0ze77yW6pODe8Xq>#`dtUff=@M#JP(_h4-bMtp%Km+IeZqTc-ePrixPY ze}wm41aa>~|0>AVAoc*;z7+d#Hr85!huG%pyI;h(HW9POuhD-79dY|NzC|z4{(bZf zu-=rIus`ed;05r!?|WwX5nq2b}vYK*yR1G5hfB-i32& z{U-ClF>t>AUfRy<9^T0uE>oui_SfcR-`2FgvP4_A2hMGc@A?_q{e3^@z`ni$N8o$V z$C$H+?L5`qxAV20_txIS62IWDY8_|l8hOuVzV{T=JRnCu>tj#R2`vhI2abtZ%bND* zd3xg3+hE)05^Zh<=GvPv;d!iUeQS6(_HP|?J8%QvT;IJp#^<1?-aTRq>{9Eyukj4_ z;q--K&K+Xb4D1AU`5_N31836aM&^6TG4Ai|ozHXhMG10T|D_x`3BQ16_|CS+PR8Vv z;6LEe?GeYs7r@vhVm-FKOn}@8aAwZr-_ZXF?t@Hz0s&mV1%D*o<8QD(#qKJf&wFHH6ypAVZ2U*ytY_4DFYumU{xWb6dvz|;n)fsDVXow6QSUe#yn8SQ}2`GXU_GW=N9%JcncnbyTJ1}Yis?8_Dl)e z^#@=ATqma=)Gk2VTIcBdXluFu7CgfK7Mx&r_EOg@i21$sJ8%d53Ao<887TPfBditZ zDcXL#KYRNX&^|Mtx;@C)-iNmN*1JxQwsnp`z?tLEB>O$U?uZ4tRKCaetY3jijh&(= z)i-9XIVj{R#;og`w7(ai$B%#n9ms-MU$wcHfHM=V-oIdXb!{Qn9#6oO_z{T8dFQjr z+1~;z!4@Ro+9}%gp7lqt4<`8H5On1D8I=xk@qZ#xafefQ*%M7@j$Qe-P69_q1R|@W;pxso?n1Fz&%{= z8u?F&IS0>Y?FpD;e*x}+o}3Iia0&keK4A}nHs3sJpSd2LiO;d!!=C+JU;*r-!1<1H z)k|WpfqCW^;`W}<9mwGN?Qtg0(bhc#=I%0Ph|% z(7p#+ioQSFu7L%4|0KlScLR5feh7Bu2)_>^@aFv;?A8f5=kK~>wEJ}E_X7VVG0!(? zabm+P>Fq9Y>s|t>#<7O^1^#{Fo=@pxtYfdv%y;g+9)Weu*`jY&E}?xN&Tb~p`T?kB zKZeVohs&U-y=U@!U~h@ou9#>18{nNzYwb4s3H~Fv>);&Qw^CR$2wL9yOW^*)y`bv(`{|Rnx3}3OfbL)Yh0eKPlU5vds^9AsH z*1rtz?;&4-)?YTaekSa5uX6S>V~u+@?JM+`Hv*nhWHHp8qW98#GV4)^p=(a zd;(j^*ga^q1KXK95ACbi3v`Mx$Iqer{sHYAS8)1sbVp8y_FV2^4LR>gdkOAftIaRg zME{1Eb2M(AGtnOI0Bx@Oy4HJp1=f`}$36Tkxz1V>xCCb48U8sqF~)vM#5gx&b2xi& zW(%}u`V1s;nrw-mf)02eqEx;^+l%Ypf~TN~y-ndhC+0q$p^*Pxu~D$rhV5~Q|1anhbO96K88W#u^a>=`A@+8N{{{K>djpsgBE~fx`T+kB&iy@;dPB@U z3Vf^kC*mi-@2Ul`b`O7y&gcc&{X6Ui_xjh{W6yF~9_$fQuR+4T2d;yC;QrpfGs)CS z6+PNF;dy*7fp5J__!G1=_6#K8{`T198UA;`nf5WxFVGnTd45m(eOSOyL(aQL z7kKv)D_~u1_c;d{%vkpcXm7)Hhr~Pd72?*I0_7BK?vG#%JcBhB^5B%1{TrL2w^gsv zC5Qucs@k}BcohV(4g~fqV4n}s*7nY)puoGgcmQsK15he&?h+*OCd7Xayq6(Hyd&<} z+I-Bn)?Ki|{tNoB+EjV}xx7Z~-+;M(-ZtbmvELrwdv!itj7&kF;V+2W=MX0rl}~7U zxd%5zi!GP{bM+IPH52#}+x;6qCw2@LAOktku~zYn+TQOkz%5YlcO~O{-mnJt6rDsB z&%M%*@!cKc`|m3Dumo$6@q74!{Th2_4BuLE9d>|oe9us-zrc4sKNDM_&FR1dJE4WM z_D-$?YneOLt>10FKkvoa%ZZM4?JZC7Zy2lloMI>V-W<^4uD6!?MXuI&_SW={Jl6rp zz#cpDwrJxC`!YG6(VFcoOtE`7`3~q8^n=^u+2;74VfVy7N6$f%j@Tal7hp-AcP*TS zdoBd_u9)|dm_PT-yC|M3YK;}V`|pZ13vqRmHFk~><~yfUdFSC?>O{^*g6};1+0>ZR`u4ci@6}U~;Osfjex^HYf5y5;7Q|18nUnC3(7uJ2;Mf>^lbQaGoZ?&4&$#P` z8aw0|`@e?0McdO6`g63k z7TB(FmfpAbbE9(d6XJ>5&fXkj+LuAWFL3s-kN*{DdmX~9z$tKFCC9jaPTma2n>Uw- za}HBrf6m5t@Ec$}6YGI{b>s&24D7*qPJ6Q6q~kC$>;h)M?>Lb{ zcH}d0-+9|(f-i=d$JnbgA7c0kZn!^8rH^q=&TRvJA~zFjGAH(DVjJK)IlzB}F64+Q zerThe$1~tNwXYrw_0Wnvc_-fkb63R8OARsp`<{K=f!_zNcVA=X+0Pq&p!RbXtV>`5 z=iR!-y|*B+JNYWcJ&$XLcr*sB4L|G!KLyrW5i{%!6|M1H{|;nn8B@qYem5}zXu68lTFnLUKC)i@eVylx7;Om zuD<&_Uvu5pb>_)myItRdF%V!zyaTSg3vavtwPFpif|Gv-R@Ni7D-&zLouLZ|Fb4_b zYDbKFCh|J$9=N|q*vhb9j6DR}^^KSFeqHyG;J+d6&w)eGS+9y~oQM5?1$yk^-fI7T zF3w%&8i74kSBYT%x-Jv<_m_|-J_x$QUl4x|tTowLZ;pFA7wDp&GQa|{|)x#>RanSuzS{Mi-Nr-Zwox5vj}-GCw3j*HQt-O53{V? z2H!I+;U0oJz#fi30y8iH2cQR2U@h02g90+}{I2~2a1L{@1RG#auK5M97yTsQgzG(D zfFD5@_4}W=drye@R=u|w$nfvb8?c5KiC9-L#lHmS%-#1Tm=o*a1K8&u!2@8g0XpJY z)Oi+Scj3+ToLAA-DCBrg_N<@46hy@#+F1!}Z-MWpM_XI*ew>4RALGx^f<39eIYC@x zV$aAu1O;FD4BOtU*T=Z7)i&o#I6njaUTN>U(!(!_IiGjn7I-gkM{sL!0_-`7Dmlh8 zpRvYs6@2f*GdJpdd+};+Ii(rNo8)9-|m?d%Ri7EKE%IQylIYExN0ynGi4!_54 zqTk`mdvD&$dWW~pRbrlL2@XKdnq9G;YkfDKw}UUBi8GSR#=!1tWAt!F z$tn+tIUnEJbD*>w&+8c%=m|PU<v1ToKe7vArP z9-QJQ;QA@rzUN?gA5h-^YhXY3K!8LYCCA8pN6ha4XYPy>apeTt9-Nys1Gq;Qqb;|> zZ|7G#1J8F0&Rp-~0q|_yPVTS)f2@dG=KwqbbI_#3c#p#@S^E&~l{|L9?dH11{oTVE z*q1t!XCHT2m(i}1yM})qsDG|#=djj{oIAwb^UvTCNUT*N#<^Sf2(+1J;z}1Ie|&rV zd)5MdLZ164xVf5``~Fb%P4p9BEyeu+97Anv;&J_CN= z_h47#&*1$2+Jeu3wcbl$fqmlsoHA!}fzR+0;-|#>U5=%GhFoLK1^N@vkw44>UMVr& zi+MAkjth0XpC`b(dH{CC+G}DNz1>;o9zzW76m*rFVi)XSUvrk&?H&>__rDI_3$YFi z9J%&b@P{*?o!J~DY-=fU5g4Ec-s!Y*&eC^MDnHaARnd0;zXJIlbf8ISvo_cD-ks;k z#&<-212+Ta_xQez4lUfrUOPG9dAI0kjU{pd6fh^|`GotqCR+n28~hM4zBThF!1v&H z$gmdsnl@T#`!9&C!8`CPa0~RHiy>|J!*%}xyrX;Q=fFODa;!7ME{O-iPza@JhtE$A*~qb_dAYd%zX+m-y~2 ztf_Y2C3Yc4$=JUoCbz=wV!T89-{Mcf8*J~?b;jMpp6x%Ae}L^d>|qbAv44-Yw_R}$ zXYgwf6$*zRx4zrQVrW$ZP2 z2?ASD8$Wf8abOMC8ozsc{G3nZ%tcRk?Ei-M>}u;Ka++9UkNE!qYY=eetiTpze8oGy z1Ah$s?(w^M*xw#%A46^8?jsbr8EYdx#2>?1|GmJO|r})|U zcVJE9eT@GO;k(TEsm9zZ!I`%(4sQ=Lkcscgd!P7EKSu@1P4JwsnXe+As@F$i)C$iUbi zfO-nroD<^S0X)NVv^}_o^_2y>#Lk*(_vriNyZ!<2-k*ZL@(FD%_gtf&p|zvdwTC&j zfBz}udj7Y-vovXadd?-Vmjlp|@0wJ7^Uan2lp5ZNy&d8kpQ49cVo4xD%=hfOU13}Q zFW9c#75gza#kj9|!aP5__8)LcjuC5kIkCb%M+e-l7``ffNP!WJ#rIyQ|uo2U1qN5w2pHR_zXIr^fC6bxIO+p^cdatAI?oL z!+t~dhd(^ujNAl#ANG)`rMUkFtbl#}ksRmK>ZTa`4!A8ifV%@ON+!>`&b`M@)z8Gl z1jv60Z>?7U0NcNRF3?Bduh{n6_>MZ>6=FS5Tq|dvIj9d5*NR7Q%DPly6+SOa2^S`mwkIybIt3iVc*{Or@(y*ar1?I z62$$!e+@Ez0JU}Yh#jLB=m#K(D}9Xb#C5K>rwMwF9_9s~u|1DD{(djK!?t%%PLSg} z{|cB_fZvhs-NToPyTqOY^R1tVzrc5np4q)KoO8I2eS&T^J$Fxj2JYc|9P(?dsHy3i z72Gx8If8fsYUg>6xV45ihwp4M@a)1h)?I)l_Ak*#p!I9c8oVX;6cp?!kPr6I-zRPz z*PnwGkn6yZ3vZ2r?>gh=Z^0wD89K=U^SwKN*7);i3Va6v*QCRCwkN>6aQ%*W*4M^? z>)rbS+F7~R9=3ZQf&?;fjq~b(HHG#Re2x7SSf`7z&JzCscsI^iE(E+XBlZ%wZy)1c zXYdK%`Ff^IT(KwDZ@>|7?;k)4+0lQ2Kdgs$pDqS!SnIlH=7Tx*3>0~^XL9B}zUvEc zCXaz}k>H#~A!c9u-~_+PZ}6`I-%&P?{3dIBXXpDnMt2}UHU})Qn*_c!oXxQBdjbP4 zgF^l*_&sort@ca-XOBrBImXXv`<-+`d<*)@4>`WI9Y57IJvCp0U9sNET;kRg?%NUn z5__0EI^i30KWFkiFxPcQ#15=c#WQ{;hYaV1JH&rmb0Y?7sCkE&buC3IeFyLPobT2c@J(+(50~)gU<2GEh@GJS z25+sXG2;{Lgr1@I;Kc%%w=4F0nfMaze)iEMVw{7sC~&?P=W34r1}uqL_Xs<$z!Vr)tZ{-b=Vx|;-y~xE`SOtXOVGo4e)m$ksP}~* z#MkITY$}iTyghn>{~F#smU0)w{4Xj$%Vlr!9^de$=Jb`beqg)yIXN@5oIQLbaGuXxbIvdDOMK_;845W`RB?|J;{S{Pp3_@$ zyrUj;(K5#UoZTgG1^gZO8ExWcx5U`neQax4w~4mvUV>xbUGB=H?!QI9g0r@i|@=mw>jqTia*y6 zfp>17vkU7zcMx9y`2+mIei^(MY~QE7`n_Q88ejARJ_Bprf%6>BQ1~;~oC0rs|NcG4 zZ+&*I14qQZhwHJMOo>g2IlFCL(MVAc+|J z&gc_-*AH=&lJQ@F30xN+dLGF7hiCl-2$0D6NbtQ^XW-rJ@}A4PIVXMv-I4nU-J_Ky z@%#8C26vd(+!|FP#=G1j$Ge{aV@;gzl>8rv|Np%AJLuu_L{1iPu5o{PXYXhBI`F(} z;5;(90eWE1ioWM*=dxFS-@XKf9^t*u|4rQ^V$OC2+~)zl`D6m^>?M<+e3$5kmLTl`&q-c z)WrM+Io5N}C2(yLNW_QF!XbIyv0|MjE7tr>+&7l6BgW5Z%L!r+;WBaM9=7`^TeNrU zo5|SL+LbxJ+*|Ms(6|2$n1VJF->&cMjMy63&l0Ve)5WN@AH(%#74BK8#jJMbEG_!nhMYz}(XB;eiO0wdK^DX`X z^w@2dvqZ8NPS2j^$-GjI(Q_!&3@Pw^AT^(FLuTbB^DGGcYI5KAOlohbi#{{sAHyJKnFcj+`}kik;vyFecXn`$}K|0^dEX zD+(BD5PxVcYj@=U{uS{9VBSz`Ct(S1UC$~17Ob${BgJS>u?zMZJ%cyj_hB#Acb)N$ zoQvXoeuQ&v0YlxI6u}wbGFq9zALEGeF-#)#Aj(jCzeB%YqeAjv}`Wdc(6}EdlAbtbbi~BpH zDRISlSbtvgUe=s#<;|I49{}HA4(gKQ+3abJww8Q>TcZC;+Yk~qgxF%CSYhvB{{>h}F{gn4tnmf$EQk%WseDIlZk+S@Z?oo`HwZb_R^;*A<_#Lpu@W$9%ai0EOb4Gk>E+{cj zAO67qgq(LZue->TDd!%A^`D}xmB?#zc|gp4+%Mq58lVU6y-(b^WY_Hq{v7TmFmD2$ zV5b<9^o?(UGx`mjdRMv_KPNrhAxQFI=nYf7z<1Uw(35Y>+EZ|u*lX|z*uSy&g1txV zJMbfTR`mh#R^Qw|wRqLf(Iv*5Il1S+9^5O81J8UPd;v0CAr?TfzUOpq?z_Q00x3q{ zn0(+HbG`cnkn^+BM6Sc%qF2Da2e8hV_j$M*hwt%!MSKRFNs!xQ1LqtP=%Pi@#O=Ef zixx-Eh`H|)XwShhFvtAqZEWbMd@SwE?dI+on{}( zvaY*MEJyupdVcId;Cr}lfp_IPzcbvY-M=x{`!?smJ`=Hj5@JVi?wMnpgLn9b*mE$) zzJ~UE_UQaCfu~>r+(&tV?H=ZrARlDlo-6PQZh^MHj<}fOFM;nb;h$jN!B%JdCV{QL z2j?FCPVL)B!~%4{p6yZn2>uvY+t?bs!=IxIx$djZK;7eSz&S9sE3WswxqgAYE56aM z!Ox%sYdKq!9{+E|y(jCsx3v=SArEc64mjT)|IcW94eT?t`@R?aEZif;yS4tGKu_Ge zcaL51o_+wn0YBHr@P)MreFS>!E&2xBa4*=0;0gX`K(3w1+B2YbU-1d(sL^7+*4_t4 z#I^nWSyL%7&e^x(_muTIVhPxv_A6qpJ7-Og@4oK!6)|fqu-$hFF5}xFtz|)g>ly=f$g5w>+nypAA=?b#NGcsG3)*kUC>Rs824{;-XqsNJ&Q8I-hw{H zxp-D3YjO^V+xPF##_TuLaF>WB zZ0G()n^=dhn774u&erH-{9Wj^HgSFD*MSwWGjt;M5c}`oCUB2T?7iTxiSL6I_5{QZ zZ$Ep$y7v18@QguD2dujRGkAN=uC4Z6;uGM$ewLhdfp?D{%+>fOXlrh&F6cx&17qqb z+Ie>9cj)`Tb?(1J2RU5>{tMz6cqh&+!8N%;+;#qrlHdo4@%*0Wv%(vANDW_eofq&Sf|7PNbrOB2{IbBXUvGC08Q8b<+hTyqonxtsxGVGihlb^*@GJZCTkt^QT)mmumMiQECGjNN|b zdX8_+BQ~rx4cpJ4HO%`380yp+27CgAwLiisQ*7Ud_g!MN^_v_K_jeu7JO@2+_9@0a zJcsoP{sMgfd>8I*57$9ETSt!bbpGCt;yIq-yCz}?ee}l}@ptg%xTfsn>=APh-;+Ju zL9ft>oB}#*&oV^^{sZhUfuEZm-!la|f!3ojd-B{}jZd%@bKKMKGW#{R&3??N=ZC)s zhM7s%xg$J#dZhBx47hd)(CL+&zA)o!~zuEky&r=qwsB)E z=Lp}tQ}BYgc>&JA0Z72NFt2Na`W;wQ&N{w9Yq&PSxo)4BInU5Pf)02m6LXM=vCb7a z>`&0QXZP2@8adL? zlXW~#Teroxrx|(*JfnAFFP^8z4|E2HLZ4a%WT5XIITQC$@8R3K`PaZhkbr#08hdx2 zLhK$e{|G<81{kwW2KMFJa2@Eu@aE73&UHV)JJTL}4g$`at~~{d3i&DV4t|2xx3+!; z`d{ED<5eQYGZbR(^Et@G5||K+8n=%vP&-dQ+n(_T+I8kx!<@_bFMz$t{Shp&?al8M z>o)le-#rhBWwa>l-Q*4a3EUj`-EX}P+x@0s2Hw`Vzq?wmuzq+eX!m_bOwK*zqVmI> ziQR-V$69jA!13PP$GzS2Q*wNB6YLT-7rn(lAie<3CJ}RepgZ8c{mvTuE|qgn^LucB zJ-a==duOLuXMwH10@?-KCr{s6u2H9O#VGng+}WOEo7=~Sb9LAqG4C_56L5|1<`(eh zw(E!fpcDMU+`2}-fP}vWJ^TdSq+pwK1k@e;M}qGeY^p%v$HhTrmsx&Z-tAZI<# zw7T8R?GQ!*^J%9 z_&s7Xa145K-RlTFMf+x#pnaB~VOz)FBRr>jJ;1&Mf?D?40dtHwgC_R41nTQ>8+6AS zd+opp$oTSa;oY}j@5&uw-v6(F`(G6A$DS9!x3Vh{c!G7mgLBTi{lR>Y82g`-JFKgW z{n+0GEGswMGv^HaDK(wn0$Y)5>%Ggrz^&y%_G9rowMmKb9X~QwYsn3D;oLuiA_sb6 z*8hTh=h)$26zB2}@DLoiEX1C<~|^1f38i$SJ-X71%D6!7*2HfJ^C@R zCiZX(-}hDEW?%t~pP~Is-7w!+jJ@^f1nlQ$;Mx1ixt}!@XCdz!nE-1zN53z2#ThTb zGhn`F93)2N=gPS2o`8V2zXE@b{byqT2JQj(jJnR%p8FJdHxsnIde*#?V-4&3hI|JJ z&icYNu9p}4@>S%ga0NUdeu9>_UWzfv9Bq5vgS!MgUsrjv?D<>b&Srt#!wu^s5%>4^ zG0$(E9_;cd#(GoY8}OXGOsvUW{6xIO*zXnmci@oN9QbqVYvA|s1V52iKo5@bjd_1- zp!R39Z)Qn6lhZ`|De+TapRLF5@OQ=jd^?#O=k5L%#eFjP8I<^#wYF=vz;~bF-AnDP zdXV5QgAKNQ?#dnFo~gw6zOC_3Ld-q>2--Pzb9_Vc&M?I;Gv-_KSMULx;S3b=0!*7uPvN?{~8oxyVBv`B`$v**h`auOZaMg{v6)Dhj>duzb5|w@b4Ng(5s#G zEycR>9lEF1u6V93Yo5Se1}Q$U&hZOkp3B+I)xaFrO|TylcfM~x;JeQ-f6~nHZW5fI zfkW^J6xKKKPJaMX@`l-=`^pd*ZHZXKM*xzq&d9!mYoCKctOxGxzCpgC-r`$BeQGYT_d?7Xp3hmi|4Wc! z%&_05_-E(?wDtSSnc>`ABYbNU_}Jmid0qJp+;`aXn$wYI-)msZ+MX}B^=NZi{p)bA zz(;Qc-uL}GV4VQDtxw}wy^C|=?%@nO_#R|@ZRZ$h=iqr0_!Qf{5-4yXh!1ne_It`% zF3rcE%9#VKYp?cG@RKq2(C&$E>KgkoCO5%8g!>uThkIM2gD*A5bGQBdPB8a5xCd6X zW&U17i137(Rf5un9 zJ(ggGozPSC9As*)(KBMsd<*=HEYLliVs44S9RAQh1?o)Pyj!>HjK~Ol;}iG}ZSD{7 z_Mk-gM+K_G_A_%tp16y>JLlfq9od6-?tWIhSI;^0Qr~!{Mu1nu{Ve?m&hS%=m|<@~ z2i*5B;1GMLfwu2bb6bp+qr~`g?G0<3eF7b^DSn^}@aN4_;QMx8@z-j1@UF?|9$0@3 z_Yiod75+sj)>F}p{)-%s{Xzs4acf|gwuNdc? zSaS`8>xea(S_|xfo_Oo0@tL^48+$)@(HHr`8f)JG1*F=S@g5xE`@5?-3w7nO2Kfgu z(G!1+cAwon8gGx`wAhmT0)n{O8X4QX0xsXK-vz|ypeL3=Zywwea9Y<4 zaX4%EIkkr=_C;widvJ|C*t2h?y@??968{n?wRsv(F(S~eQ(EsW zZ?}gWW33grZ>Z((9`>DpXY})7ot`{%T-!AsZB1uyKZ<#NC;GmQfHi_xsc1cT_r^1r zvR0e`_rD1i*m84pSJwu*2NPn(4}kj?V#8Un-Oql!lY5|v_3eL7>?PQ*oa;K)xBIk* z9={mFwtm7^%(d^e@fh zJ3xnhotV8Jff=^--T>FyN0Ur`0c!X1JbUE%nfw75^UNLm3hnxY?fzc^^R-WF4(uRZ zj5GZTPTv09cM1;h?P-hsL>sMt0+t}aidaxXah);i2y2w6GemnYp3R&qU{cpQvn}?o zh;7jNGxR?GQ{bM?=}y%vIQvXBx1+YXYUf}L_qXRnY=XZACm;j;DV%S>9y2*J^d^no&ICVL)5M&De;v;My9|Ft{{!^IF3P!e$+-*P)%xD6XlFezr^--+d}n?S*h>of zLd)69zY?FJ1K)G_w%jAI6S0p3|2OdF7GUq%3CziNK0WpV?H)_;&24z}6sScZXNC3- z+y5}ejcBI8=#AE4hbz+(2BEdf5-I?&~9?(Z7K z{z||D^*Oobv>6tB=RZfgzkVj~5;1-Ay=!AlytB8!IUc}IKvdrS{2X2Z#tZQ&x}nFn zu6YCSjakPvo-gAU5Ndqi<_x_COL-7#YINi{8*{w>r(jdLROKkI4E z%9fZv3%kGp0nD|ooM-53oQxsQ_bq=9dd3`adPU0s2Y65 zy9Yt+TVVf*cz`Aoc;|2e?t)$J4*nicdyZYs8Tt2RKTA#A-+3LQSKznU3$%TIf;~n1 zrY~s&^HYp<>_Pt;dXDahtGA#hmITrVe-N|QPsB31Nf%=cXJ#G0cY|0H?Fq3fz~56Q zJ8Ki%IlgE594vs}V+(Txyi%~e8}l+)$~B4c4LKX*D>-6K=J{|4BXzUOdO-jDkmv+o{#gidJf9{boF z>;UF!Cu7)(@dvlLU*PxZ7a)i=DcHuo2i}48dbDr2z%}WyH*kJ8o}jOzpMog}`~pAh ziEWMVh<^s0R|jX#3|npn=HMp2JuQIyWnvRx>=`)6HdlD=4RBT&6zt3BHM&q=oMFGM zoO}D$4v4iGnlsl2hroTr1iOhja`q(mS76VXcwafseic|JfgnCZTiZSLg`)PH8@Pg< zfH_&aNsRm_#9x5je(Zlr%-YW6zkrg1KZw1;e-5VD9WmDq@4)-7e!#nK4=6c4

bz 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 Jel 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 z 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

e+7E5B5z;X-`)dG+q*uM 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

#qAG&&$i^)?|_(R(11gr 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 z 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∋EsVf%D87?19~WR-gv< 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 z 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


)?_w&%cx!=V*JX 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⋙S}SR_zr;lTi^tH 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%0DmUEATj+j3g@1|C;T_CYkiOJom#YeCM# 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 &N5?=DNRw@%eXfu95Q{uBovtp2r8c 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 j9~_yKqxRgyNb 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

W@3 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 dOCD13t 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

7CK&IkB^5&sb^!RZJ1pNN|?1NXqT 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∾2a;I?PJe17|8Mbx4^i#3VgQ* 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

#OF0mw8VVYGh&IH9=Lu5rqARomppm#IcO3w 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 fK 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 z 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 B*Quq2(in@bE{6{XN{DLBbYoFL=Xw_*`7abL=nh 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


n={yF2||>-*KnTM z0kKR>{R-cEYVqB>+WHChRpLK@A3?ST>|s9y3+x#%Zx?KVeSDYp4f@F0vub}<+G|Rz zh5r?{_Zj#zkbrk?&0FH;EjCQuK$af~!s`*s+wsZam2y(0F=QFvLTM?K41Y8Gg6b5boS*gqTzO{M= zN5q$4EY{lV8{l55^y^3U-s?on-_?Ewt`no24&OT0>(8Q`hcmghoEVFFeIMe!$z5Rn z3CN?~wI+yNAt%8*?-UrbkMA+V-2heW?K_#9N8HcpF9gm!-!ss;hYBE0Cz~z|Zi{Kri?wrKT%2EwKa^_)GG9H~u|q4cw=5-NA0m z2UFlb^GoO`bqQU?_v{)i@XTG`8LOlizITlO0L<@*RSE2O#N@a1@blW=aZNx!CN{pq zQ;J&O(re(E-9qIwB$9!LXD&t*0gWH%USDs_RU}{?%SLy=IJ|=`);E$gVz6&_yO=UsDD-# z)cyo_4kT>X^`1QMTg0?oCsW&k1OhCHAKe_@ggJ6g@wet<>#MCjBz75Y0bYX@e!z`o zM$9);<8%BIeCJY}b00J@oRRNaz9nXD0DbqM-I7h=rtm>d2Ks&`wrD@&u4%6G zw(>}?@%`M&3EyIhVdf6~0{I)_Q3AzF9Zvs5KC2(DR_qYO{nRW}3eZXbv z?BnOhngq<%o`8m&1=_v32YJ`>d(XVC@VVs5ZLx(hd$;67L5E%vKLQ=F&ogiZZ188G ziuIZNDf$53clQ98)4$W2NX~QOp3?*_@T>S8<{8?zz2a_mT?NApQBkdk;^6 zeOvemxD6=&i- zPkcd*Iie}pl52nO%Kw|D)@uI^EU>Hi`*(vM;D3;3?u1x>1~m!Y#&8yo;O3z3K}_*G zG>v*1>tdM4eb{r3w&x6;;Wp^csPp^ZnECegd&2X!MkM0Bpq+67{5xlzQ_grJMiMdX zKcm-h`eQjykADHrM3HYnl^4W!T%VbHi4S@2(7wH(7oa1@e6=%83#u*GgZMw`{~FA( zYkX)n)XV!Gls3pAZ#l}n17}}lifxW!&OQ8vxiS1KHeT28ZP{BirQR9Vpd-H#*az_T zx9$n{A-28ENg&KaHpJ{@O!2eend)163)_AjzVE88y&$HT6EVD@zr#NS8Q)ly{&PeA z4DK>$qB6rw_6%b7YSG%&e{geH*Y)0Do7=%xnGnzTUlVuz&%r*imRJBqJtejUU%+1i ziJ0pt&OC=xjCC>aGh)U&c+VuTk3lQQF>j5X(Dr{pj_dy(7#mBA|CD$~o}Z7vui~E0 zgFXh=%7Fwn`0{@5EU$-UVPOg#TdGDH|#BfH5*qoR%1~DbDo!|GL zV>r`(M(ir)dcVHY01fbc2XVz2T__?et~UhdOaOKgG;a{dI&Q9L7K39bqL12XnGV%FV8``NK~ zgYW)4gB6&8B`|Kyks$BifOY2XfhaxYz5&+DCGZA6!#i)_JELnm*DK(;WcXgt3;4ef zv)41wf;lnQzg*%8Jp~;x^IYo?7=p!udA%_FI7$*x!R+1J^WufIdMtU<<7IikNvz z@CIFT6H{X4|0)9s&;`P3*+W~WO76tO!-m|g}1ouE2C0!oiXZSD2<)fCT>mY&0FH^Za1*pW z-CM?Ytt;5BF$aw?;9Yqh=RtsmSTE=fTq5TB?#=bSM(?6qxBv}U;#=$aJOl2{H73}v zfO91BTJ#_BGum0aH*@Vf0e1?g@0!9Md-x6Y2^f108n7Y04;G+S$iZ-BD}x{Gl&G5igjc_(0toklqi@QrnF zKck<6vG~2PgmZoK_RsL{(ca$cE~sabSfdC0KZv`pIq)r5Q^kGT*Rxv#&-zpX4&Hsw z%NiT>0(cJAw&YaV#ZO=f*MX%zYk9s2tcqXrt8R(!fn$)tj9fog4R#aMiZZj>8JzhY z2)MH{ftR}llrPYp-xOG%qRfqUw!7v5f2KYKD_~xR_kAYxRrKG1_u;Hc8}Ik;-e1AZ zL0?nq?eiHi&&u_k!!>8VF zw+uOY=Z476BtZ!c7?GbQ| zP)hszRw=#2iD*z+;G_v4x^^`gH&3Ibag^W9zo_d&*Q z3NGTi&K7jU0$AT`?0>>fLG9U$WKPYGa9g1EZpV33{2k(71N*qImYyr(3orqJZ=WML zKQqVJ9k5oht_iJQiv8r59BnZ z|D9OxeKqJV-rs?CraQSNC*Zk;s|KE8_lhBJ~!&C6+|#?a#EacsBm-upafw+QEOo9Q%WHh&iwKE_YU3 zXAS52k82J!r!uxrgTpy_f0MHIi0aJ+asQp_2JIQnKC<>(;$H*b{Sr7|Vm)W-_m4j< zb(wezl!)P8eShY;mi^5+6>RxB#~S;rnE%bqVa~SnNW@w&!4LEtURmM0pRi9Dc`xQY zBkwbC73h!UkeIcJ+PW`uS}-T}dwAbm&r#^i=K9(C4N#W&_HdpP?1(-*{DJN7-amt{ zf#=x}tCF#gN_lXR0`C8@c#oiv-5h!8BR$t%vPt>;jm81+eF5 zAjr?ab3YFhdpYCEHRAmYZ-~#00nep@3-BFr?`K=${h7;;#C+=xfqh-S&Tra*abll< ze}D#mEa!+>^A>F2#ur3AkNi zuJ4_<_#cQqaeKBP;fo9w)H(k*#I^133}55#g3mw*<3(}|@8j3R{d;193t}6z_jwCU z%?E0EZO{B6I6WI`eue)t*qVbMpciyYte(YbywIu@{Dj&IAd^4G_Z`|x?jCX9f@kBJ z^Z!rS`-8}pU3=S`7rmel6jY!hCf(jHUP*8ya1qwDo zh{gz0m|{6lkI*-(zr~+}0E@~cefrGM?Vb~UhkuSbW2f;n z)^^12gQ>Kf6Y8A%f_&|LHt)+1)SGie{^xK9=(A#fzh~co??4}%CAx{cGrR5v?Ya8i z+g#>(_E(5SjQd^Ui!})1p3^n3#dr3eJat0*)?NW;aK4_H>#I)%dk!~~2fu|+#F{+7 z_x(AOZ_#s5JHvJC+m$o_7Iup9{+-LUhW!$=KG6F9+`11I^vH6RFZk}sp6XQLddeEz zfjRLN7-o*Kx4iulxB}-o8SLP@wkYJv|D*DrcNhb5+Tz}g@%Ol6c-OE;lMcRsB{4rk z_Gog5o#E~h{|Wg0S@5S~%>^Lu=W8m?_>|Zuze^m>1wNzP#)EeKAKDdw>PDZ^8T?-yXZzO$xTL^B~|eeo?cp4(;D+ z-etQFdGjBFc|{_om^18+_%SiR6P93&-NlIM`L;DYn}8QBUwd|A{5g{*V%+t6YTRqq zCN`D(#GGT;6SjMIo)iE-tC6`qzy|p9#B(Y!?xRDSyMS{}XEDcp7h*FIAd#n*A3lf1 zszhLb_B~Xve@EUkU{A#v>?^#N65~ugI)Q7%wR^Zd>^DH|{(^W1Jm*Wmx8z;*#0p5* z&N-ZuKC;DktsS5&(fTRg%@o+qa#VANy%Mu_1(v{fVciwbTMN1h^Szgqz&?j|mL~ST zZ7fFKKE46Zq!2s6F8bJ);oPfh_xSd{K_pL0XLP5|0_7x zlm8cX0B33Qe4!6_2!=O}RwAf@`!iS)>+ny|?l-WlUtoJyem}X#j`&opbIl&@4B9hv zlU3z@gO(G{sSN$Go#83C1MKk{ZI2w|+4;BM7T-7OIZWjuzCAtjVO{J@-5}@#{1Z6W z+yLM5E=bs}HN35QZ^qo?OL+UWyYsFx{$unlYw0^h2j^av=)3R>bRoz7_whUPtC-_{ zy2 zOfPQ`MxR4xW5QfS{g}Alr?gNz_-MmKV!GGp@%(Me;&?t zKO{5at{XAV_lVpzzB2{zjsF{z8e5{<8fwqyF8m2P=+Of|>j|BKeHNhTldtx?GuQ#k z8)^K$AfABzocAj5to`qGKSghd2fQ`TrG1mQ_5nDDy^r=yc3=>40^75h!xj95zJ@>a z!M}xVZ&5&xuU2-^uHW`+EE8J;KUZ>n5Cq1yAQAV?%DETUn}ZqX$g`J!8_FwvjC)CF zaUE`WZ{%lu&vLqc5DQ|~KOpx*@(bef9l0Np3-GUNt^0AdOs;dDfF;oGsy1gqzUy5A z$N0k8R=_*-4LJ9G;2!MR)6=tm3H+Q-CBqf4CGK5c0W(mDwRiHC9`}gt1N;951hGU; zfC4(;9ItMS->n_myLB$LzWuc~ps(>Q`ioj)u6?`OS6#pzc+Wz9UiqH*W8!}U_G=<< zOzx!GA7T4>I>7hLT~F>9cpd?6ff;_Guh_+Iv)qL1i8ayo=h7d*0_>AJeH+^LeGZ%@ zgDYSVYCEv72D~8t5ZEJ#7mx(Lcmj7F%(3k&y2=~-58N*3v3ugi!d&bC8#r_N>bve5 z-#4V>7(cVtX>ZZK+w;KlaISUbdU(&}FK`{UHGYOZ2A=@m#a_)#RX!!=`fq^e-BWiC z`zcVm80)%P=X&lpp%r=0=Mu2qH)Ow6HwHUmnRZer|?Yh|NI&`wupJ z0N3|t@*(j9;5qli7wB`uPteYliJhPifZ}{hxHTv-`U%^-h84c=WChH1-2~qxu>CHz zuj^!BY!LJe|5oJ+zIi?9u$3I+te%52ehw~!OuWh0_})v378$kkoBISfL!R)?a*de0 zeK*bqe;(U>=XebYard;uZtuvP04w6ozXLub3*vqrdiqXfOZA z;(H5trR`a5j_cZUHOX&z?pf|WXfgM=1HP!-LFEQM#<%DC*7XM?ZmsowUI)kc`=F2UecY{a-_vKn`UO}6 zML&q!JAwdkuRj>muW}9FbAAO}Q!apdj&C3LA~x7l>Bw1B{uB5WaL!EpJ;68D`V{OY zerG$w`b_VF|C+cp_PqsCw5oBoXT-MTIrkpWzXP1%zkR&BlMY)cG5-7=9RBeh_Q`jz+D%UI59kr`eq7$z65g}ffS1_Mf%Do! zxOZnw#5?p7EPykcm*~*}ZMB^G@{Kfn@3r+av9q!y_XqNNwBOVIp1%h6a_u=~?%^%A{Aa*A@KL3t0&+}V=6-aPRj_^D16*+Tsz!l)n#B*Rv%)2<013lah+P*J= zF*)aQjRKOIyj&4*KNC35^G9Hh4@pN{-nD}KsdV^q!hOx`LCkYk)XtUReRuj15ZDE* zz{hYW=-xPJIcn?v4DA1w9JTW_>Bx63I$|ZXaAmNxBE3uZeH`X_dp^ildE`k&Jy6T@>_F4cKq(Y1J@CAo*rDr?_=zH9owGH zn}GI-wi4ranWpOucU5bRO~tkS&lBCBb!Wx?@(1Yn0Po&B$AX@|2m35)jdLx?ab`ak zu4SEl|AOy1IKTS{)|jKWpu_ge%=0XKC&qi@RdS4P$aC}#T*sK=n`sg;=6y-*Ej^Ba zecRjx-nooBuRoJAIumza3vBa6hwY5UtxGj$MeMiK4Kc#)%mUuN$F;_~&REOEHYb5K zIo`A11w)MRAThpyr^HuaLtY`)fdC2gVCEXtH};;uy#@O>#`%-E%rfL-?|}Po{{`Gj z-}t&u&u16T?_fV0-e+cw9+{*Lbtt00?&2>NKxsJ&Ah57_CFg6EU;^)xDl!)W{6ANHGp?8RX1-=K)XZ=|z#2&&~>mGe?zXtZ%1()PN0!w`7T!RwhUhMf6IP)>M z3fJTW-@OI7&eLSA&HHVVgPaM!z;;iGxaakM$bIkrpbDID9{H&lcOK<7e2#IpK-*`S zi+B^`u3yl?v)I=9wtlA%*TfoSc4J)Mx+b2RaV4Ye@d$ka4&=bxeiPZ?yASUm$;CVJ zF)_J+psnjBoVlM6@6efefCcvOPS8uZp4ff#+iItYIGeDKYxqureC3qG_Fnytd|ojm zw0~m!y{2~t;9gp-y{=KyWDfTNe_3;!)4nVG9pHQEDwnDK0agGx>dvAezTLN{&crO{fgfr(B(DuF)anS?s z!_P)%?2P=Gc#bo{>iYBJ2jH4b`WXAWC)YG5CcN)wLF{+HdAAKe;1?f(c*s- z@BZxFv|PV;d7m~nl(ZOH$fs673TZKuLIBcF50^|U6;IX@DnK5p0DS&LHGC>{D?o@hp|KW0z8}N z;4%pOHIP3++ta!Lmp~@o0s9q!?K=MLHrzEO#_r>r)4{pUr`S{J$g%fJVBS5Dj8*9Z zgV-w|e?X7kSQWodjAt+ht}_EU#(6!ji(o~}TD4pO>ZtbO#`rz*8M+Wl0&!1`bDgW8 zi-8*cIfrlDb$f6d+w&RDfV}orI_xccs<8#Oa|XWe(9etO1a<*?AOn5*pWu9(4}kly zzx#cQw%1K;dt3vqqitOi=P<5x@$QV~#GaGuy$$abu7D$RYrgh3@GpRKxPFk+#JY}{ zTmi?GU!!xi1N|7z8T|R?Ij+F6^6i`wv0Y#?{>B*G9@;+6CU5=~eE;7aXLQEz!8vTtbP4u>y!V*ktQ%1C7VtBW!KuJ0LoaGS zv-W=xf417+GaKfJ_Y(u(xbSDcep~-Ke&^cOV1G!K#62%1Vo>k><33mNaIWEArs7(1 z?oYnMR*XBl=ce>AsGt4Q>IdTgC&&J0#rmMGXMNx9R372GzjpqwvF9I{Kd4_5e+uts zBd~qPzSky&9OV;YKLYnPd|!^?(|o&xAKGfa1)rfcvqBBJaA!ee+4b#_$GzYn-_UJp{*ptUZSFKR=y;9qj2ITAg!G z#he*2&(gjhQR^G_jqam!yx+%Kzau>V6L|OP9n692yWg|2BDMqH&U-pn%k5(P`R`kB zetUP;0qchva+cVh@fLj(eSn^UCLa@9;|ICUe;eQ5M=tz=Nod-GtiU2K|9B5 z^3DPGoQa#e1ReGo{R7+~NP<`ZXLS9S;Fuggd-?@ixq|Iod*-g|IiwipnPIy|fI>{$ zGu1XnehEBtbDV7fihLFKb(dHNJS%hkY^G=#W8Fn!L2Q>kSx`5C*b3ix51y0v6nqA} z2RY9piJE(pxaT#TDKY2l&^<6md*E>OGcd2b!-tUyaw~uEKO!&M_6|GxkezhV`c;_8iW*e*^fwzC*iClN{sk z>jf>M!tWK&*qSy|hEw#N$v&?AEw=9~#rXZXOU!khO)=lM?-?Yp!0*8^=wkGZiGr`F zdtm++{0CeBD{_)?f!rY`r*=(kwQINaOT7CGAHgr-y@Q+BuDJoO;hSz^pH5#6+|rLR z-x=hGJ(IG=4^ZIka|kl%iDhEW;W_$QRNK!Q`9p95>~{ssv4a}(Hee69w`3gHcZuFX zUj-ex1@waW3V3%5@CY2^%XugEvXAQ=p=Xuv;O)5p_Bc=zD_|Y z##`W;pHzGy4<|a{IXi>#YhZ!j18d#y9>`!`agH2kbPanSf)z3Mdl^0SN6Xp!1QgJ- z*4M*aEn=e8A7pD{xyLd{D>>xW9o7aK=omfI+Hu&J%DQ^yJvPNswdAb=~t5 zbBHyuZUKhRF7W_OhCRXgU6)!;Bhj~rxwj1bzVj{o4kY|RV%+ydVmE<5PhNsyKDYwD z!=Fkf)&b=Oob#p7dncZQ=O(vx{TT1e_yQOgyK;OU3VdMeAFJWM1m@4s?R)Fp3e|%1 z%)H-W<{Cc0e@grlkYfD1a38y12Y8PC1?aF9weP?gJR4`U=Mwn)$ysqNb3ccBJ>k7O z&#%e6+L_!Hw!QqjJ)&id`VfAHctPJoJ3|v|JP$d=vk2^nacz0m(Z7K9{5tFe?%*r# z!`TX0f}3Df`=uDq?h>)Pz;n3*hCRaB!!^8*gukH9dFR&SuZi1Rzr$Dm8vplT-y9{z zcbJHI&i1I8sF?xJQ(n9Q3u2Mc`?KaF;D6Sa;kwE{#BXz`?}4d!M#j~y?;a9%A81h2O=3JJ&&EB< z3uk&s>Xx9)uev=a8OhX)QxG%^hInKL6&w%R>=Y;J%58zzO{Umw}zc-?% zV!nI(I~evwu6?KS6`X5#F|HG6ZSQ55xM%Vin93S%3*HbnC&=%>f>@8vpouYOj2q*5 z%&_I#dCrLcxpLE*4SDAN0nYiR@)7V+TZ~AIlKnmVn0QH4eXuC z9Rz)m*ss7j;GPSyCfbF3*K!Td()EWukfi=6G3T1ff*kAoe)t`5#)N+r9cbUO>lWZW zIp>;~pU(t5n~#Be=wqxY=oS7Bar3_iJNT~OqfZ5UNo->-*kTuI73VeX&qCL=R-Izx zdbBa&S=B} zG=C4wf%6w~!~);`9d<|FFb5%JN!;@_e}#Rg+H&@JfZrR7vA=P}`~&#gaPHmv>+wA! z-`WObkizWAxd#pi;M$MK_ns7cHpwyGiErEW3%>7T-<}iM;;(9sc{9+(*gvC{664)E z&kT5u=B=>J5zd={u~%^Ra;*iBFTmJ$;Dp$aPl+=N&t3i*&<-#IO2l}^JNO0Lb=0}S zHT`ayn-6xe{hhOkee8XNJ_es-znSn6G~ z@=k?(=eq?Cz)diHL!N=P{!Z!Vqu{r*Ijo%TSBV%uhw2Wvp69IYYwTO>EC&Wn5Boaz zBeZ*U%_Ps8@cld{Hb=YPLC|a9yY{=(+$Po(eCKp-&wVN@eAnAUp8)#=`K@kI{hnB0 zyKaZApzc2>+}UVy^8QcRy#ve%Aj2csDcr4+`m~d_ z(7xrTH7ON?s_1pnyU(=*Q4?()iiTR>V9f*FVHQ zD+^*YKx{g=Rb3S5X< zL-uesYdPTCI*~(MH{&0p`xrkv&d~Pxles`Y;I#`nfetvo=Ns7N#`wKiD(AT*fmq*@ zcNM<_tGb3~;hoGtj(4+b&&YAT;WKIzq|K6|&e$~EQ*z~-98m8YXtL6d@%!%%_C?@l z$h}V`$gz+6>EN8TiEHS~FTqs2i$5Aeck%8Wxp#3$-1qcwQkThlfUoYslAMHYV$c7> z-!uzy>^lSPF3hpcIsDmm2-envP$T9l8~iQ&+`P(}`zL(+x1LL45o6ySZ0|;1+w*j- zjBb7HoylJiTf@2k4fa`ao?W=ZT5CW1J|i~6o`Wmc39T=r07P=hwtyYT0u>mAhkOpg8n-#xn5&N^U?XD`1b?i?F16~7N=wWg!S{W*tsTJSS4 z$FsN3k6@Ra1!(iHh~24tkDkhsJnzKwdH}2uL0`3fJ%cS+1NS%w@`IrF@&69ov$;Jn zXGrK$;oPst>Ci)eY|l|%$;8|DjxpEqeFgT=3*K21u}n-T_WGRIG28}t7JUrV@Q-}b z2kycDO>_65lo;LQB3pjiF{p9@~f~dJk!CwLUJ|o9m z-;%MZbTO_ohr0=W2NE%*oXIujEZ*r;F#PYdn-e4C?C&~q&R^ifMPlBU@hj-P+S|RZ zK~IkFK>k#S*>fuT2jmO)oIs9u8TR@QeS8-^@ho3^m}mdLz_s`he1JjV?K`i&y?!9q z^J~%*^L;GP9r=6M?x)FrW4rzeegn)?oFT{9zs)zBa2=dyV*ho;QeI5t>)QXAcnJtm z#Wn0LtW`%ecGMmIbK-JufMQ()XM^wh`qwHqB-ETa+{Sf*lF`NniE)2PUc1h+X#ALU z`mgW78Kx5WhvZwUo=O*!@0Loqb`V#r5h=!)ar4asfwTHRn1T2D4xYP#9jL? zur9^eBhXjzU3WoVTi^M1YCK~X@;cz#wU6_Digunkn4X_@A@_isj85?8-3CqU?|L2Z zyINk@cMJMpZv30zE8v=I;`Z*~-eQ~Yo7=&**Bm4`@dIH|PwvLZ5&h+x>Oe2|GXs9uS)o+Xv3(y7KPtJe)CkbK6XX z_%YZLx2NZK742G?JokAFJjb=b4s@w}>tl`kYtm7hDm)k0xB`~c^~RALV=uXz!1Z0n zpG)S=fb)7+8{n*e1Lk+s7NE}LIFmD^8aHPT1bz=Z*8~=z!~Z3mIj-Xx0qkSU_iTO- z3b~5=d`0|w;Qi$oW2>4cZ%qMmhiK1Ty90M_j58Wf_}B4W%QXif7T6Dnb!gXe&zX3W z-O4-j3@8iqLG@k#ZH>!C)OxfzSLx^Zxz5jooSSgY(|ViJ5#JJXe;NC%IMY9=Gf(NT z?}8M1@5CP7qyP6Z-@~cIXxV>7&K$U>Al`#La(_L|Cp{DYn3(;(0)8f~SL|<}smK*# z{+=MO-9&Ci?DxR$7X66v-gn6Jvp5IV>C1O$KMVV6P{{X9=)XY!OyK8mp39{V@b-2e zzWoo$BjV<`?uW#g56MVx2wCN{+Foe8L`b z&>bkO=N)@7W>UQy8 z$^(CIzY7w1XC;Wqxwbue{Hbh+dA7#Y{%=#+ukF=&XCUCyB+|uG!W%x4>St! zQNMq&3tSf1!hLSRTk<^{_c;~6mu6tt_mm(u2j{4L0*3h}e8kB6`~QI;cX}tL>ifAc z=KI!Cd*7>bxOR}gi+_{2Jr1kxh__h_ zb^`8y0}?q)bWd!^sd0PQD~NaC2>TDj3R<)^ybJ5*#Duo^1#xG145qRo=VM}T&86=p z?0xJGyeDw-1<3!ByxBB|xcm1k&1pJgdnWhb4yXAEf!h-E{5;D!=!p6G`3OuU@UMZ( z;NQUSfT{E`#;x-%+|Q}NT_<)PblA?l1nrD^Vm-b;hg{-2j&YtXF?r9}y-vk>uMpcsXW)8^s@tCa3BM+GRx)wd3%D*u?fgoKk=w<$ zZvytPzxfBiH@=6Sg91FK7216T^-Jul#GLOAFn>m@iTz#^yJZ|?{3*Y|e?UB;cR(NG zd-WZe=UT$r3)Zu)($=@mHI6_55s(7=8Trn;zutE4F)789$6zrdfizRvLJn3nUXLcWWKJpiVdsu-B*v_8mmNv{HgSC z?&DK1%H8G8*v1Z$%UI-xtXYq*~LIqXApMh|C!oy={5zXAn3A;-_^ z+?*51WPOzmJK!^VAHCL(k@PJc5p$Mf zYk;=*Qff{@JL3k<&%zQE(945)jW@e}Hri*#e9z+-aNlUZ2S5y7wCW& zL!YXB3qOMPt`kz=HsrhRur}J7o_GST_dPY%y~QrZ5p(=q?pxqJ?SUQ8xQOxZWX~c| z*Tg=#u3?Y!_9pE08HMhjLzsGRa2C5(_B}YK;>>GpkYoIe?7%xm54_Jdhxx`<;2}A$ zz%Rg5BE~b@C&xG8*;(I2epqX|FJnrKXZ{ar{C)h89?oH0vCnJbzXP6e51b=~?8twD zUt;|EXrHgZqZ%8M_$TOTFZW^23Jfz+H>W4gi^M#uufZPv2FROlFJsCaZH+xX0?HD92ITq}ZSylwjDJk7^LW;BH_^rvXYPnC z@Yg{5jvSB+{1q4kEkB$^4K-z6A0xMD`He&uxJ2CZ@m~H{;qRRP$G@Nc7jYjc#(u8Z zX0d+&B@@^0z*)(}hW_MyNRElizgJ6*b*^>P>hR5L=lEVPIPYXw=f-=?;QSxz{2Ar< zP$73Ju3_CR>tbZQWA85T=h$jv_UX_~GVvy@kDvKLg1VYpuw(qfvF|tc;Xjk8Q-|Q3c9Z2?qvv-r5#D4&Xa)NbIGtD4@n`%@60RUtb9XkMcwd5CZvAUzV`OseQfr$90_N z2<(7>OX#k- z?p?bhuZeH<1#pjkcI2&T;(SlRLLRt&4p`t?=DW5ccNO1RyBN>)3I0kRUkvL{d}Hp* znjU;YzW1QmufrbBGzfqK+=o4Hl6!>Ca>$S$V?Wn<4V-x@p7DL~5UeMhwJ88`*UZ?~ z_UJHP%cuY>p#%}*Xo?dez|gUZF-81Jo~*OX1#s= zp6t<0cCeokI|mN23pG=@L)-UQAR=mpw6X?wobiD9qgcVL6>`r5{)62v?|Ys~QsTF%g;o|$=f;oDwX zPV1H7{n_ule*pHI%Bvci6F&s23ExrcjJL?yL+9#G>%FJXfOq0qy(hsP5dS;yo>T47 zasvJ_@nI(H1ctql=NuXQ1n=8*wgT_jXLAwHzrcM5%yWOI0yo3=vnIC-yi@H3v54{9 zm*#K?|~ls7`-E~6A0ja zN9B!o)cILz68Pq1bOH8z0;VFjA!iF-oZ-yt;jMGF%OK-VrNejDM{w%167bHt1mMd@8~Sba_iIg%W1cgv!5kcem*hSN32u<4am;tk9_?HinAZW{j5Z{e-+~h3o6r}75PRBe0zYDZ4ut`#LMezX$4$+^O`n zZul8q?O|``0nenZcY+koo<{jY#;$3A_GYs&&lnQnKLDA-S$7DZW6ZOsdpu9v zGnV)Behyp%QG5A)H|(RH=L>w-v9_mI0&4vaNrCg8U1OMUl4Q+-c!KvWd4AJA&hTq^ z=T2z-CJ|$;KerwLWm?;O-`8947qC~dsT=yrquff||>)ScI?^bJn*OzZO zp5ek;@DI4DZZyIE!n~Ku7I$IA^^I68<02=fQBk_|_Ek2K|V*>)W%Pe};4Z{mLz{Pr%w7 zI6s4aSF|;HVy$;z{~pesyX5Pe?|e!Z<1Dl4&(W@(h&MUHci(;&w2;!OT+?0NUt&Ku;2X5WPS7`z6*0oJv1u$Oj_ zukO%y$?;Ckfi?X+pVn)OeF!q}u9KQP-=p7q<^~x0Lo3gT_mzK&J}c%vtMLPB{a$qa zIdJ_sNHJD<7Oryz6yp>56|pvl_0t)g$-2%O@E#ZA8w&JS=6%qWr^)f8xYtz#xvf>c75;DS$gaq zPBE{GcW>n*_%$&l$2gaB40*)cTj}AFc>>#9d;59mus`c}`1d+mYmVHfn|sxw;KJO2h~7qEo8R{aI` zG3aWp{0jdZyl2qfPY`$RL1Sv0vq67~{v$ZRw)a%bckYJu89u{%-upn?c{=nS`eS0Q zb1E_3t>^1~UIm%h@IKIokI`x&~wnlGqcCn zU^a=%n`f-8pQ2TbI`DhoXXab#hne3``FV`|8M*B)_o;oa4*rDL2KYI=4?HjPR^U`( z{5|N1Sch%DoeA&Uht;>g{erv<{5;xIS)+|v+o83WHMd9mJr`(Wtp;llxj%q8+#&G0 zYS>SVXKl=yN5sv20Xn#|`}O|h{{?#ZsTdc31;Y#z(ml)F1T*XoeFe1s=HJ7Ai#Bdv z0?t^1d~~4Yd_ONi0OKoQPv4`TgD0S``5iT-A`|xwW&AC?I>4auT}vs!KiX;#zfjoGyaf=U9^$8ariHQ_E~Yiu5%r}i}zX2&DqN|t_?i*d*CfF&(BE^??J9QA?M)! z8<^)F3tSRN#Gr=1Wqu3)J;*gCV@(nPrV{LhxV&dv@B<{^yl;T-MR9)%*7b8^jX!g& zYxgKGPRKF71S@P~M|EE9CfXhG%jBtdL4cOC!M4vW5HX(ltnxknF}C|WKqq`*tymDh z3tT^l`#tJB^P1Zeb6>8hZTt{8XU4a;p9A027W*Q)Cmx`QHD3`o?>2BYrOlun#JrCS z!263ZiV*)LzBAe1c#kgCw$8rJXut2!#yawvTqoxG_Az%KekwV}ncu*5*h6n@&wC9v z8iMAZG%I&)gSIiBT3V$VTO?jHUQSb`oTQ6&ckdA|RZ zJpK$lJxhCeUIEvEOW5Wr=9zC?$uWKo?U}IkJJ2M^^-Wl#bn4I=CF8qaXYOPCxzgcp zYreVG$_?j^?YTY!Pr+0&Ic*=-EP?C2Ai17?RBmNe2)pwmG_?XxQkcf*6yq{s8*v@ne_JMo4 z1XqX;f^VNWvDe`Dz}bfVn-KMUh`CRHFS6cv6Zd`{EZ|qbH8SvgON{&Sjy5%Z9{U9Q zBXkcx#|~hQb2w)q?t0E`Keg+~%eDD3ws-h9umb16A-QX?1P5RRj6ViL9{v&bb1=g$ z^l*(m{C!}}uh8ahzz%*#PG2#{_dQ<)=Jfct&{x0-ws+xt_LdjsJBLt=b-@a8SosYyteyrKS~5V z7zABF63DS@fj;!!7th7@hy3@c!FvlQe_)R@VoioqoYA}wiFuyiz<(ge_z%FpE#k~N zTl_uZS3uiCI|ujg+f+_k{}|6HUQU!6bB(r+x+Crx_;!2p z2d--U0E3`cV4QJ5trA_*yg*Au$QsUI52h@d;%;w8zsfKdb?PNr-gAFXV*EQxPIUNF8GPdYp6QHVpxt93FN2MJ zwOPZr9N0}<>nbqT18382vc`W3I%1yP3+yIA%yVCY4CmPlF~S9Ifq!BgzBiW{{rT0z zSrc$B&t2a9Ccfn#z=l`>2XYl_w4WtwoH55(Wv?0BMPl|eE;{U6#1`l#KjB-yC1$*j zck>T9aPrw2HNB@|{-~0qTYws_pIV&6DuCX!q19G$SIqFn zy{MUEcjyAv#^JS%_4uCSr@%btPsHtMZUOFN*dI9u^2inJ-`5&_^X>B$cnaDXSbvOf zk1j~8a4qLOs=PVQHCI{#(!y??J+zf$QY>uGRWY zdTeV;uqNDhAOX+F&tr#P1NT(O*`g1Dea%tJeMnZsdwTp4{7hmzga3l_cajc&5VZD^ zSWms5o%XJV^MLbwPHXUc@F7`Hf0bP4a}O!r&$6Fq;+^~e+*eF5%%ex z$vKaotrKS@#-8@^O$7c~Da6_u_sBUb-nYEpA-)sOB}IK7=pdGf73>d*``jVt&)_bI zGkF>RpTy_jGq7*}CP8mvOJW(@J1uBop71-yHEyCkA9H%^h&6HTZ-MvetWz=9_zVP` zXXU)sXEvG1v`K`>64@H+jZsuifb7AsbYvl<fqM^`8Z`@^64W^%FHqw0Cojc)@Qn%%TspGx~(QsJ^+z+RPoc{pa9- zydGbXpW(~7mUi2h=TLxW=GjGzIUTymiuf&HALG_$bd&#q6G2R!;S=^SGd0G1m+tW; zdV#iwKmU(wZXsVJ{H&gc^?w2pw|~n*sCYz`sc9| zw*9tX5C23BP6d909|C(HEtDMN&vegFalb#%!#qWQuw&fwfgH&AQ}NuL>o36bSl52$ zbTQ7C(8>bNd7B(!AL+*!Sz^1lz!#nIs(W;S^K;VfCWy_5^`OH}a2ss-RCAqa3(P%) z{|)#%7|zL>Cgk{?-l1=!PtY0IZv}ebcTt~&IR*nx4d3%-N*yUKUsIXj1WLp|D` zZ^HNJ`fVT9Zzuin@wN_{=Rn)?BE}Q z9xi}$I+HbPY{eSy^$yT}gZ>fBu_MMAw%FF0mx-Atw?wajdp2%tbz{7@g6&*~!1GG@ z#{LNZ06YRp7voya8a3Co3h^e+{fd~qJQMRWyz6%8EqVq5yPfj_-+BKH9)cx)f^TA; z^T~UU+Bq6q_egvLJo7Z+%z94j9LU5A=s*GioX5U@1?KgxEvn3`on!p(nwe{!duZa@ z-{3FM{!G3KJR@@!;9vNy=Wr%5u3gaHr9E3eV+nNB_25gmYz*n*-Dkj>A3%^ZN1J;I z{c*J~qy1d0!5(mqIq2yzoTm*DXTA=WaH5z4JTK4Ednxg5-YuN_`vyFzoNqiT659SV zw7oo!jT}8PXkz{fE(ye%5`#H>c7G!N8F0N^<0Cuz*Wk=~2B!NlXGM*DJqv#xIK!G) zi4lA9z_)%}Z6XXgezxuFXZ8rr_xvgL9NoiP>p2@gkM`XJar<4t_AQ)Xo9E}+v$Ee? z`~m_jL6eoS80Ye=&2`?kC$%wQf7i>CdV9Iv<4I2IZLN3%=i0ML-5h%Z4neTK@GN}W z3-lT+v5k3-`#|6KWNjv21okfIz|uJD1@VNv1={xWtWMBtkmSJ%yVFL_!MjI!dmNx2 z;HMb#9%6f*`ii{@{vq1C=wh6~`8N3Wn4ynA$W<7dlk*BZ1J0?KZ;leg+L=d;-=_mH z`Nwt4d0F*>n%2WLg?B%E_hY-x8hl>!cZ?y{h$e4|?~=2Rwx{AcE0AK6k6plqoFCu< zboh!|xQ1sqw-3H@3*Ub3QE4-e9{GS`wFoR zzr*&tGj;&wJpPKfVx4Q5V=wD7+PR%y>|wjlwtmF;owXs}gN#4ad5+kA7W~;|&mP}i z8Qo-s@0(8abp6ZKju_9nn&f7qUFQI-$(f2ZOCaw$&K2alw*{C3Yo5X#R@=QhuQ~s*2K^!No!ECZ;q8&C z{}vtbuF^f&udn=+OXO|fj^Hx(aDJ4UKkeVT$v=maFOz;V{Em8OUt_mE)@A(D^{pXq zD$Z_>^N9j)zVB=h{3iC@68{l?-groBUJ~;iT?bR~=gS{~_kILE0#jMj$Mw9Y9qbkO zE4J%IkXhl{!@ltCImA`?erLJ9_a4ALO|0>~UIpHr=Qou;#_!fbO~DS}9X7H4GBw_# z{2beUf$bR;>{}q?oBKc;y@d0e_CbL=D<2b=??1pTChJ?5$?-hA=M1b{;~OirzC#C) zdkW0;y!{;a#1HKW_JFm1cE16hSAq}FfepUCe>CE|%5dQ&bMrS6VLA)u>;`w-9E#&Jn!Z_oOfcM z9OFH@zGr6741#zQ_v7cs?{?!I7(P$Ln^@-^WVkhX--0sXhx@I`LmbZac7XHR+n)hV zBF4|@pNQQBuJ;fO0;lh1Ms1G-3US3guJ4(xh)0ayCGMlcHh&AON%+pbB=-ey&O+?B z*sp;7-Islq=7TS4%(%So?HIcUL9KZi%xlcG?vvwpSAiGy>CvvIUfmeykjvmXzCF6? z_vi%d>AKDwU=R2?^o-=EBG-efa$+JErui}M-@l*EfkSGv-IEeAqDMQEXSGpRc;2ox z{R>x?&BNs4ca@g&K%pj^KN>4 zu}e(-irA;%u;vVBLEJU9y}va&h?#Q--|v+k-&vMGUGO*P0JG{F_syOM^BT+KIh*@4 z-p(o$GruzrxVP8v?%#ZSy4GKbc`tM974V+c=m6>k*aIEw%;CI;ufUdABIcd>-P~jA z+plON5##$dc1XTD18ePR?VrInK-{c;!{-?1a<*IG4G3aQytiw_?CT622(Z?!dB#@2Hy}3^V?R;Z=hB$D2f$f7bg4OG=J_2vwHtO1AQ z{S(YU!XG$HWrgqgM2!Dg#u2tL&*6e`bb{-_Rs0`;>y{c%#4|AF9lOu2aS4H&6Mqi! zB<}h6R;~~q<|6eCwtZaNJ)V^lV(z!)MZC+fx14J)Dh8IEz#pIu+8GsW=hy+xr=A1r z&F|oQ;5n>-{ofLIj!W44=ru6b0r%nl@1y-s0)HL=UUeoJ6Y>+?tAUjS=nHJ;Jui21#~mIFb*LD1&97x(0T?6(CyT+37M67zd+ z4wArE%w6I?2DiZict=f2jPu$*gWm!9Al_t6kMD_j)&*PMvpWw`w5(Bk2Xk`%0e1jg z`>c5O_V@(+aE5PZbwUsKy8%;~;s1r2Tfn_^F=g2UzCFdqz&?psdpm*u7F>gK4)Z*F z<3V0R`(B)Hg}nuPU;zre_EWfXz}(iihcm}D?P;wdFS;1ti(EcaXUuo*?^v!o%sf<& z|G4I%HQ);T5`9)S#C&%zf%a5fU+y#D@1*lHy#8(C&f)x?`&4p_dslmQsq#JkIr5EN zMPCHYSilVY9p9f@&f^}8?Eu&7fN#z>o3JyzoHNi1eDiwXEWT~yiu%Egk$2`Tocb|v zec`&+-9yWL2LgW$+<#kVjlBo_TwVayss~}6!`gd}c7`3eee?n7;LUZ`f^C1lOMH_b zfrP&T#;wWVd*aS^D%j5LoNs`f_vGw72<*4$4(xzy_($lc=o#95q!@KZ&xwgW5cqQD zxewpEJu_H=08Q-k3jPxy*M3JS)K6s%*MTeKx%VY@oXIi&5}dQ10Pp{-tcbafE&BQy z-np!^_pn~PU+o?J6Zq~tCufOCPKRy%9C)^#X;i*PTc4?WiZ)L~WWn+Z>3IFGCF)+v3A zcdb?;#`D-#-adJL%#LxyzIRX%q_rvr-JYA zc!wacKO}vO|2?PQk)v4O#b6Hqtf_kqx0=*P<$cSpned(8nLU?~$Nw*E@e8oTAI{e^ z2EMyOp0gj-yo|OkhJ*N)%mYt<19-x3PiA^Qo55OF}1+Hyg6W8^=J>yfZ^48oT z?kwW}SvK0UkS{O-&5TjlHcZi6oRkh359FJZUW37CK}MGR*= zq1HQm-f_luM#${rxY>VgMHUv349yXFJBSw{t|cujNJtt zxjn(1*|U1@Gi2|3UixJGd+5eYuvN0QzMI&s`4#Bz4O@T=)}>zGAGyV5?APES@b`a< z{Rm8fe$J%0R4CmQFZjqztL0(&IE%N8c?s%hr6l1PAKjKToN#4s< zbmy3WN63e8^L)Rx_X52qxcB3`s%LJ3azN^0_?){xdo>_ov-cFa1?FXJJ;C)g@D4n~ z=RKSM3T|wNy^?mx{vFr==UicLqIdQ8n2@zS#pk>kUB7%xd-}kHxc4B%*gN!|;a?Pg z7|*;ysd-^9oZc@!v=W{E+M;@!(#W1EI~`W{%^6r0}p|pd238S!ruUE z{Sw&E-CHZLJA-lFSA)Jr-a$711ZZ2q_pr_3?&A(f$Q`~J@@wFHVLZ5pY>fHFZ{hB^ zCB9OFtUkdv$7gNlO4ual{0aE(wdwn!*!Gak3-o>X6nN%mz&*6+J(1Vn9X3DbOYE&S zkc!XTWAGZkXS@x}aUSo~KIS=#_yNq&gM4RNgKOB-mHmCU0ltd|!1)?{Q{)A*{W{>j zt-AsfKtoOvkoA|^@hf*R>}QQ$N&9~j9r>RUK6gB(7MqZE@%aX)&I4J~nbzpa$HlIG8T%#BMIU~e+Tmtf96DZiCw>c6P))4@sF`PM~>kh0$!;>c0YUI0%(a}0lB%>^ZV-?VE+aL zInE>+{tlaSZ-8;`-@27r z{MWFV{|%7z=NNDon`fE=ZN_=$wZ@FP?#{b+{uO)!c8x*54xhlMV2-?m*WAV)>hQql ze9|7aE_$)&z9Vb5*d8GpXFVwg_fz6KWMhrdo`C0l29)jFz$>Y{8|U-Rx5~uU`SdM; z)aN4i`S26)1F=s_e4i5^?6-jo4KBTN)atWPWo{|?^ZYw%gGgC}e+fN}o{k~T=a&e9vA?3#T0e+#S?*n5Hp zHhmAkL?7s|ui+Q5`L}^{d*%chd{@w0aEdyQ`7D{G=Vk7qqa_iTZGirm1L@D}v7)9_uf zOUzT?ya~9=P%h-Yg!Qet0sS7F4^p$kUi9h3Ra^$@?axVss; zeb!)wZq7l`+ZfKWD*9vm--8Xe%6oA`L(?Sx53xIbMAp9c!pkg z;#<}?0~273{mh9NK2sg?`TE9o`0ei*&1uvjcYPPV3l!uD@|YIboX>aYd>wj<4-r#r zZ-G6g;6IU_Z%qAt#qe*P=lVe<_xcb$<3B;RhxskKd1LCZ{ZIbyTWs(L@_91HInM~) zc+b$+LQlwJ(w~dX`FF{0ViaG3&G)RvxA>*AnuFT^8^gPvxVLU|t69O8+6YO4>URB{r4# z-jDr+oYr_`<8tBZeuw#f#xwsGeFHlDzDsAy$Zg5Hh_CjqGj53SyR{?cBT~n=kMBJQ z13tX&N6_YU^! zz*xWA&Zy-3J7|gQd^5N;#1`3oox-PJOkE8Bv*drr?`Nh(?_=Nz>|y%>pXYb(0G>zQ z;&&&n!4zBt)~K=0lCZ7euiz8)bChHF9q>dykeu1v2FTq1}V2jN&de6o?*8{d2=uU7qMsH{aP!CZ-Kr&;2E9*=jjPwfDAVHe~JA<^$}n#rW8@`1cNf}017_MmkmIbrw*c-e0euNyfEGBD=b3_e$!)N^w;gQO?g{>W6sPPP zYKcw2x*6SlZov`Iw}5Liz5%mhzlUr;{egTFOpvEw3BEyhXFXBp0lJ@K>pq8D?=q;g zgY4fu8UGu&b?bXiT|?A78sfE$zWxhMB-zbWv&EkMSXKmc<(pgy}b_#5P&;MR4Q z8N3Hqfaj5#82)>UXK?-o_}!PVOA*8GxCZXbQ+%I;AWq$V7^5tC{wE;E@ZPsY@16W` zK50hYW8~K$BabP^P(y!J75}<;Hog7TLLaKYE~RUnm#9_x=nde3f?4wL6Eor|?|- z&aCZspv6{q;%8AZ&iy6=)3jFXb5O+e2I`vG#reQi(HGitxv9=k|AgdB8jD_ULnv?XS<7y;ox|Bm1{Z zKQ}R+xr0kNhWMp5q!_-pdYKS%z#|b%oZ}c(Q^F97!xVv}=7QlHu@1o|F zB;Sd4N$y?u=fUph&t6^V9sEo5H((EZ1*{j*yZe04@*H~ycjwk`^aHtX&)KfQTl5ZW z(XFFCgL@ZOK%h%=Y=1{@;1hXZ1pVA_bM?FDm!L%tV+wf(8JoC`Z12y3v*s9Ve%_sT z0unZ3Lk{lXv%YgDbl*(C&j{JM68;VNlYV0%XLP16h8*AGBVc{ucg+si2hYG19AKXU z=eDmq)0U~>e0R}X=1b}?&?9=af0y5&cjzs!o-s2yy8j);nL1?q+CT6$ z=+15JIl8-eimcx`0{;@;!9C9mtk5(1MdUHruhN7V{dF&%ZR|JyZ`i&E*MR5xs2=(Z z%z<>tP(yT0$x*XYKWmq8_a z`QJxgf-7K8-^kx0zrx;&ehvdr7p^x@DpNo@n^XCeQ)g2 z!u%Na{hAp6wyk8`ZS=0d``a1$ja#7mdF|t<)kMvvEbL+l?m<77|Qoyf){yqj%|K0NdTSv|m7&E4) z=JKrz0R>)_5 zW6-m;!3|{ZNLlhsZ45|ocj3-w#b0CG^+p>p4e$&N2+(ThznA$LHm>dwYhT+P__;9W zukil=7H`18f%(c%&#CikVy4)IF;d3%A0T6k7X7Yoo+5^RuZ=|>lQmuf-(|+v0Oy}l#~nDw4`7L&@%fpxhw>Fc9lczW13=r z2&@?~#MTIR{T{UVyo(7K(;hzepuLOXb659kT#L;e>9E|N!5z?`%O5BcpFm)<)=khN zzl6J+1LQ3@1wTV~W@nHh${XS=J)!Hu!J?wJBUBi@}q#qM6! zr6%wr?_lfT9eRfEqAyE~aS6EvSwFCrv6YPVT;{nqefDnT0>3#8K6hZeGj8D44$zfY zbw5L`zCv^4Z?L(y8E68BDCGYBgkR|MUCPIII>T0DoMAzZb!*IRY*AvK!FPbYoV!JK zZ%wH=#nvI;!1l1_r{-w0##NA!J0PE$Q{L62$SrpB&2x9PuYapL zr)So0Tml{FdtkFhgMJG4jM^{VA{Or5R+^$48(UvwAxOw4 zpu?X)Mz%*UqX#hdCvXwCS97k*3+3`tkMS*d0V>tKo(@pCNa_UBZ6^ewK_oPoD8# zfxWzgF+IlC&x~<~@Biid% zoxvsKMw#6>dq+&&llSutNZ8D`zjK`ta=kxi-;8|*#qe)G^L%5@)?up@$maQbVT;eR zwAi#aa_si4`U2gv_VXb+%PVXx+&Rq8((`yud8+Z_#;KE$}lJyUft)-mcm&h^i1-J$R+nAi+&&*X&Yh_}LliRN;`V9FG zw}$VSP9NByyFdH6TX)xDS9h+zps&GwFb9Dx@Jp+b=Zt>-eSgO181k(l8uXjm!4u#d zsl@m>JW+@Cke#QCUhVg8y%ya%_D<-|JAqf9(U};=g+~ffqYVY`Xl&({sO!HX5`cF%xjPY zoF7V+`aC^*@&r!rMpMK|* ztoH@Fcirp3PjQZFUwM^l$XHkI_f(yQ_c1ZtZU4?jetX{pEq>?n9oP9rVZC^Y{}ulJ zJ79E1>wCv9@g?enK4d=^9kTi!Xz-m8@>BfRfK<=n@84W(W4m(1@OQE?=G7c|#+U62 z_f7o@`1}6`@NKu)15`4{I$web{_6V{y`R4Z7Oua+*MX^hMx@VLqMwD@lJ*s`XTEcJ z$LQjll55TZx_SRV*xY{tEwcMQi$nJucR-~E+st@)V0Q-PF*WGU>%QjtA@|ypKHk~* zte#~D{}z47r`Qs53$*p;Am%Ri89a*J zyF3E#u)DVgd+pOAs|VP-HT+vfJrkecE$9iKx#q3#_1_ivmdLeMqfCsmYLlAa2gpGC ze}aBa%us-oj5x?ZGnqH10OO7R=-^?Bz0YLYADVlJTG6^LMsyJdJ$DG%>uR z!0uf0;y3<2sPh?H=_+>p0ooYi+_AA8dcv;U=b{@cdY^H|6tbs#Y3&=sozIYs_j9&i zP~+u(@AdWYHROm5at0Ui`F6(i8+7l*xmqw$E@Xde-2_cwL>HbhNG(;cM zcd$k_-aIK{_^aVeoUgI{8nnpfkEy}-5?_b?CwLn9@1XmAbAWBG47ab;#Sm}K zKCt&vKlTIybif>Ag!^trHHhqKh277qG43kIkbez*h2Em~c6v|I1KnQ6yO)IC0{5oP znT^XOw!^2c&)?Ni>@D`5;N~XKfeFxeq7Lt=aQAo#H0Zt|=cr_lKVma4#n8vSSy%l= zkpo$Bmuq|rknyd-fw6`3uh0YdUC~7K4BYSkzktVJPE3d2oC^Cs!uKsOt~K8n>{C$b zBEFvk_wAjVKg0h5`QO3B*r?G%p9b3=KI`rRbKb%2=`5Le;qQ|Tx_kRKP-nCM3IuqH z{Q#KPl|27`dTo{@;R447<+o09)c(pj}Az zbysZ+@9zO}Lat=a7MuH+ff)JR{d0VefirX?pZVtOgBE)R##H!r{jRaLcR9tk0hzcC zJi>O0?q@^4+*tcb&hiZTA<#Di4L0pv4Es>8-B=vNMG*Ng8mydy{I z{l&f_&UZ9NPbEKM*ma=4!Tt_-cBzf>xkfimU3_zE&=X{RefO|^2kwB0`PeEg(7(p+ zXUjgG`4y;S4RiK@{6Fydb}RWtGKd&{|0Lu~_?N)<>dfvs@MqBApM&3H6Us}_6aEc0 z`>cVn30nZkzJ3S$2DIC23Ib%{+~$7`w&-&(1H0(v9wIyM3LK)_U;9OHgw4CT4LWM? zp+84{28>VG%=h!L1JpC{KIHDncfJCiU()vt@?Bt$DR8C~dWUn~!`1?4F}6S3;O^t> z^$XxGjdfn<@f`NdK`;o=VDpZZGgza)L2u!n%~}b23#{RpKgV_ow_af1!mV3rihc|_ zd^5Ob*(+JSFZd4;V~5H~@0zxv(*b6V_MxbyUc?zyhve+BM?DG2Nd z)SmjU0&59p=t0aBx!P~wv(K0^`c3RJ;F&yYDlyjg{wBaV0^}I7tKq! z3;#D@&A0H!U?16YTUT_*2iRL`i3Pg0{#>+KA=jB-mwbIeYz9e=-oSsjHNdmfd?I@C zp1v!7e}5iPx6&H<2wN9Jo-?+fDf(@E*8UzuvA4x{0oz^RXXSUmyUD~z&R`#Z-%jD~ z<#X^3JOnkyee9}(C*TpdqK-Ys(9_%w-Ltjugk8FX9>Dp`w^k+lUn{=jk~4#g6<7o3 z_zD=?1DmrtgSZFmI|1I~4tf){!-xA?;xo>-)4(O`+(-BAc!%t%hS&szR_LZ5?%oC(|+t&`E0aOFyYZH|9~&7Jxgblx$| zuzQXUe2H&%&R=7_w<$h*o+t0kKE~{y^Y38)EBFgI79+oBc6ZiX0pmm^{k30He3wT4 z8fQ*x-Kdrid{y!;!vnuHD>dl;?O<%eoVH!X91^!`gck^Nq*b2hKJ#cy4|2lUr`&r{EA zj~RYvZT+gg*e}+57nh^`oDc$a8N}j-Gw=qs7+XZ{Yo$ z@P8m|e#XcCz?MXzqtc`5XTJE**B+lDYw5H8;(VQwFfILO|HOZY-I%+#NDw2kehd6w z+W@~SJo86{|04E>;1KM9F$I3l_yW7TI3w(m{s;Je0)9ruq|bjFI@{k0VqAmZK8HAG zG)7*jzU>yjJ$?=X`8@p*`=_Xl4}CLo5>gD`Nq(MwcWbxW3fr8*JwNRA64lwuUc@U)_HT8*>j>-?yMY;}b{7 zEii8bcJNO@MmBE(AD=%#>T`Vh?dzVbZR`rzOJCi|8hML-A9x;rM_NCefm-G+ur0v> zvNg1I_@&xE$B+|n=k|B;2A)Kv82+1u{ZFua9_LviPk}SI|0}>A4e@gOij3ZZJ>)qs z-a6`spasS_)3sZ}+}4|cjIYs;ZwsGb`wZC2IUa&sa;>M_lwK?JBhaBA!1eoiw7+%5 zV{~hE$nH@8@4-v33ljF0`~}=QyaYZ68+7{{dmFUG1kkp|XFuPC@9hM+C;Y}I&=miF zA}^86@!jk9jFoaQZ?QiqzHO~X&}(cz2foSc;5o2&z275rYufJ^Obh04_vrhuzd0Sf z`dnmpq|aC`h6;V2l^8BO3sw9 z$&Fcq6?)%4hTR(5Ap3jXm>uAK2R7+f$TvU}!&{n>@4Vsw*_`_z@FxKo^9Gx~HU^)u z9kTs@Dn9@FRD&&p4ova6!(;5m+e4fF20ke^?Frigy@gB0XzPHnem0!@aGXO(KRdQV zd{4kpsnORacZog&U6C_fx$l|&k?iHprtmRE47Gh92cX5Ttx`sQgx&M5^a0KG?F zeTAG`-97#Rn0q{$!LaYJnWt|L-*}G=`fsow!1dY3?}e6{o?YF%3m{{=EXQ_M1Gxh) zus;HRz7}AOZ40cq1P`(O4kXZ0X9s=^reKDDUf>)XU=QOGaDG3R8My&xy>WNwf5qpl zV`{Pe65IzjK_z!HN8bbHIfFCSnm;RcXU;Ly_x)S~f!+XTvyMGG^mXBV4fGqtTKfT5 z;ZwFpG8gz>zQ^XC^_`&C{tbS2sNFh#-^e@c(uCM2=>2@WrHH|2+#KH)n0pmS*1d*& z2<)3DTbZ2aAB{zAS0)O7CtAw-!nXeQxKrR zC$~?BtZxSDorJb>&b~kL6#oG*w$CXs3Elv6lrP+3c94jZv^!q|?+LrRZi{aHw$#)g z*qtMYaennaRvGA9g9WgMe&5Bfh}XUXmy!PqG{rxI*I4uPoxqo10-U$MJ8G#LpRpOM zp0Ni=z^BhrU37lt4T?{!J z?7nwDE0t>R!1h~U?fsGefE<5EwD3D{_xTbY)U2fJ*;fS(y726hInQqm^SKN4Bp_qH z!RH)p3_E#*{t8&L!4@U9k4K;4yAE1pVcaqLYmh)5#bfDv`8oa)cn|LPqa6|N`K{Xq z?*eW;W#?<)hr~GdZt;1JdcMH_7JI@r1vBI&T$;f3d0)yY0J1ZCXWxLYfal5jAZvV& z{vCJ$E&*q5W7v;*p9A|j!yV;HL2vXOZOC(CoPA9Cw0U07xka{KL;M*bFN(jxZ=5q% zIz{f|iL=KQ{I|hB5dOeF(Z_#ddJP}Xy#V=n=iCkDU~Mg4_3B zsC^CoDe`>!|AOCpn4;$(vfu``7FoNy_PfD&XU^Cw$mpqy;rso7cyk)yckxF=Oaof* zXM9ieBUkcVp3y!ckk2TFzlEyLz4UjC{fwyR{Vec_srfN@mHYjvgEe{!LcNgk1l#jl z!|z_t;=Kfry7=(#j*NVhIBN#7B)5;4nS;N-OU|XQ0}1;@?B0vMRBS8kcd^|EzXZGB z2%EL^HNelBch!P#K_b^0E&MWi;CCMDKL!hADaY`;_ypa0)_)1yp*hyDM~Ceycm@1! zP#4Z&tZ!mz9Pn=4O#}RF8|QpMFKazQU&Hso3uM2;TjYd41oA^{#`5) z*cR^RM!lyP{q2hE{T~3&e@56l;9Yt@VJ(5p^Gt!Z8ECOpTAEpe@9>0;}f*Nr{BHY1b*f{Po=BqwYGL+{{$Au z)o!fkY{0kp9)pA&F~pdYjYm(SP+*(m(;qPyJGix87JCaH_p!%k#pfJ}c>NjPf+c?Q zJ(u@6M|PGz#yF6OTVQkV83cL@8c?aj?pz1(o?TH_a?l&!qoR8jCpSTAfVQ$v2xGS5YzkM=3m5?fM@-PVwl|=`b-#1;`TKqBH)es&`v}km2J00v z-@LEz`EF8F&%pgY@^6qSao(XYrUSm|{=F7`LY(i;I@WdW8rSzkUx7rt)W-1p@jme_ zcJ=B*>hI3k`km-2G$r2q^K&cDQ9T1U-Z}Lh0QC%=f34BvC0P5nKx`3XG(xo_9AI_C=5x5MuD=WSq)@XdS&pTiS=<1e94K;@oM zpYz(!J(_3E1UQc|%H}-)SHKDS6dVI{Gd12}_iVoh_6>Z_5%>~lf)qo2>p9OBw4ed{Dh0Cpu;y#>ZUcAZUZggL zedu?ufv&uRJf=1AH?e&KuIh`C7uh%F+jt7j?gzVPHhxj&dXDUz)^kTk=+{73>%qT7 ze>k?Kfr5Bvu#Y*3Sobc;=lH$feS9-`j-f}uE9rNZL*N;I4I1Q1)-l&RHO5@^Rgp9L z7GFjm_wKM8JHbA~?;SaBF17?2Z|}J=1?mm4?kGS4nH=A!d%O+a0Baq9W03IgVY>tR ze%Lx}l{{kt_EGj6r(gpfku!xmOFuvIAF&Ddu`05?oiSplWv=y%%fLCEr@{XiS$iN) zu=RwzEcP`v?G3gBTHs8z?+NlnVzoD5gRIXTnrp8MK$@c;BG2Gm4CnIi{@()6W375N zdwQlIPMbTda)<2=KK}+w$dzjDme|knc{cO3SF(2-!*{%&$0d5Dj6I1$wVpZ8h`j{H zwfe9a-u1Wm+-bE1_9Ud>y!bt9Pv}{cdz_PZ4WH-tciUd6)4{hO1NZ59?cqG;`aX`a zS=;X@bS&G>}+ zXJ7@MfWX!hyd`dd&HN5D$XmGmGk)v1W8YW58*I*a5!)QT0Om;(_!4Zu*Z8l38F&q} z`+eKOo9M&)T{u^r)%*me*nDSmWb50jBPW9fBxQDOo^!pug&l5Re|N9p?$nqQxG~21 zUHTI^KyIxA8S?^LV9NpENshgj(ao{OviOKNBkSvb2>hN@z6WO5t>O8#^|gwu-r}DE z^NgKR+`|*_9vD;a*#3U68KbW$xe3b1d&T|$?#yFaSqGbE47jl^InJ4ot@jutY(2rB zqo3eEEy(bP*e-wxxCr|Bu)7a;=Q%pKeI|t;!1XUdM_ujK5L;~^VIPxc_N>n23@y-B zsf%GQ`}_I-5wzGU*~?jydBC1h6NBsyJh#0UaN{dE*BV&U8GI}KIb-OtBG#BC$lxpR z1@N5T!?*B`Snqs;Y_HqEbIjnrMPs#3;OFTQc6*DXk$;N30FR1q7d|U~dChr?-MjG( zHOwL9;0O8~IJ2?Vxeh8t4Dt27*?R@5?yN1iOO89~?c`Ky@ckCMzsH=@+8JJ{i(v;D z?pyg3nfo1(?024==g;^*2lj~gIKr9q{~B!0}lCt+7`0SOzEA$R7*=vJ-AAFLC`w8CzV7~jdpSzH{81x-%30n*H zkgXf|e8V$ik^6JOt>wE{pTfO^2D?xfsp!UC#(x)hHhF(9B_@b-Zwqh}pZoSKd+6@T zSo?Iu`3~g?-xcJCML&UWu(`ieU@c=>V(qQ}DcA>xV2!WC7vLhg@zyp@EP;8>WgV%3 z>vN_lvN`TXzJlA|`EP?6audVc?$v+4d7cSa%h8>+*6fJ2P6MC9>l}09o`AsC6Mk#o z$L8Gry=HA^Z?UhyK4^#w&=cJJ44=z^Gu{BkH`>^5C1d>TTmKMw3z8`0eLlb!fdScb zTr0Y^R{MzjT$~WI1iQ%g*4Cj*ZQ%{JuRun(=MM6iuBwA3hF#ga(jT#305fdv>-#vU$@+WZb&$A@tj+~9YB4h3C4f+x|gZGpJ zSs;In&Hhtl&+1OP;&0#w*nS4K*u8UWWf1r>P+tS{rTT{C?!(W<*k+9YT?}WwiGNaZ z_05$*;7`D_xt9g-`^(*EA5&Jx9`FV@i!;5(mW!Q;-k0%95yM`$_&Z_~`Yy8j2~cMa zY~DkI%~)s5#EvP@kMWsnoV|?|`YJWZepY`E-WKlJ5_ZY6*SvlYG0ahCS&}mYzB}hg zCAT9^`wG29*7rI3q5eWm48k+)_ORA;-Opq@d z0|MDR-|>0sVt9i;>O&q=t>gb}!rcDMqnL~wz_ULD%C*0}&HD_#rgy^E0C^7?_J6-M z#O)*RBcH$!*8Cm z)|m|s>}~Ps*LQ;$ZIaygW33HH=*G>E8{`%~xiy?K(C6sJyBl?58}vhvz!bZmF>R85 z<64kF2kc+{So@e7XZ~&d#C?j~$ua)lf%rs>dA_}`f%16@Y!hni;SVq-edhMFAsg4h zE4gR=9q3B z{N^k`kRz!(t3JPjCHvHU=NRr-zuzk>;uG*Y`=fVk9E2xi0^yg-xT&aPk}81`|iPOk6rYhVqo?B z&aCgW`f)33{}f%TvGKuctrk7N5`R~6wNH_Kr+t0ozAkZo_a31;U#|XA(mUvgIZy7; z&y~OH#$+Gk?IAL9Pw)eBo?&}leBMD|&-Mjt;2f8*KLEYG%ss(ACTBNasx@ZD#PB)s z?~+q=;j9_Evq@9!__gl=&mSO#-r;+FqK>ZxOJKk2+D7F2*@7>ye+!H~1U~C7{1E?Dv54)Eds?o}BN;Vy}Pir1)@74JoF8;IK z4d&q|_DYwLMH|B#TT-|7?_;pnJ66xcHi9^7XZ#0f{~Q11Q2>F@9-5MURZpU1y}uGky6an}0@`wL*L zO8TT6L;n_Ei@bt+7I{xqCf{9V^v7`byF_ltS;Ot2&AJ(zJK6#MTguPHO?blI0Ba~4 zYcGHI^ft`r=?T6K@QhpY&QZkhy=D(_NKA{Zp3nO@B3IvixO-66-V@w&1UZvxD=ygz zo1cCCQssj-^l1Y-aSPz@kJ`J&$QxqZL7n4MF$?@->SM^8QukBw316i^o)I@WSEKsn z7x3BN*iVsfRCpF^c{iQ0@CNR8mTz^7egg0Rp3x6EpXWDMpV%N*I-4Jxclr|4^U0eS zdYQK-rb7>qMX6(s{^!8i>?N5mE@1aF{SbH#_w9R_f*b>HkXz)Q;C?>zuYhmD-=lJ8 z{{s0K-p@(G9=iRP*raODfgM}*)p@LIoda^d1itf**hp$9n$s84~q_1u&GM*lyf_;B`5h4i0!-q+b) zIK!C!H~qc=OZqIpRpc6L+)mLWhTr!Md`!lgo1%Pv;bWTP`~T?Qm6)-wm#MGc_u*OH z)x=mRg4)=n97CKtIZwtlz&d^&&Xe|^u*>6IepmAD;LpfXM3ITD{k1DQVFl)axZS?_{=;QL;qJJSM8 z3X;6UtdI}DvT$n~8!^1&3{Rqvaekhyu>pt3Q+OqP{{=F(HMos@3VsPX^a*I*= ze-6AKdmB3kmE1)`e5HTaPmRFVf&TLePoM?f$wM$BrbCxovn~1tJ^_`!!KeQL@Enif z&p@TiMb0tI@in@4B}EK9l%HVV2cAKDCFi&P9q{MEt53e5mi~a}7@)1v7TGuEcYK4q z2F3=lQWrzdDYguZaR$%hdtIV?*FjtY&f}RopxwJ~;2XGP?JfpxP3QJI(zrRO^`ByM zmJV1mlQToUhuzx3@6W(~jNQ7{P`-@)1#s8e+?%-*umFji4EM~x2fpVH+Z6s9%<-*2 zi_P!Y1h>9#!@kzmuRR0n=rdM-gU^{Oy~O4W0gP$LIrAew!{%HqavJ3t_XJ-^K2IogimyXZ;Czjy<%24k&wfN5rncD`ahBvfn%4 zj<12P_(KldyYn<)gWO?T!aav)+yl<#cgGyG_?^wZe*k+xdxPD7_f3#HzSJB0_!PKn-=8~KAn(B4 zjWz7iP;>kl@-s5UpTHW~I?s@|@RryH1n5SxZ_oL(Thm^r@CMylzJWP4LoNXL%cmaMpq;@xDDuMF;*L>pAmUi>;ZoUTH^~ji{~}(CFo+9)jZ$eXT|31&Nu^}(^;HN za)vv|3(&@BN9B8Dh5bLlmbgoBXQ=Zf;+NRHBXI#ZOU4%X>{okt=u`9t>;rw)X|T7& zS9hr`fqZLt*S(HOiWurV#pn6XlQn(k{yW$mH^f(Jkuz{NKLN?P{S4g(?&0ig__`QA zr?0W^=o8M3J%Byd=-zQ}gRj6bctNcG1LT%i>u!-3pfMl6`_QKBPQ3fB#0K2E+Qnv_ z2k?E+V6U`5_d7$seFI;eU#|T*e&h5dAQ#5BaIr>i;1hTP=89*x23&{hujqTAdq#Kd z?*{YEQy0Ve{fsF~eXc@qe(c`G9(V)XjsC#bfqU2*cwm2p?B}RMmOlmGgFc5C^Je(m zk-k5II%nm^euw=Lu;v$V-<;>Zg8UYE9_`i+>PqJCpj%TY&&jy~?`xNsCWd;4*p2gi z8CxQD3Y^b7b&d{btNBFrb6hC7pTVz!H8I!V4}kB=ITNtI^JZ`zEI`CiGr{el-#4XQ zo7|pK6T|nB_A#~S=IZwh?#G$il4qpGvazJyzMOml4hP3^g+qWHTQdfLPKYv692MO)zS3E7+mJ%cU&0M6&E zD^RJ%O|W&ueodV5mFn4(Ip74i>oYs%V|43`Nq-l^?`7-d>WAB_(nEYZAcz&l9)U9& z#kTlA!)J`=t)$-Jt5j!`Un}u-zOm05hxlip(g8NVyL_t`w2yqoIJ^B?(1aG=-MN?) z!+turce5SMYP@6}@An;u=uKxooY5Zsy|DR2u5-NxP4NZX^VPF?$G)o;?mIqDp7C$k zy|;+r-+K#emDb4j@p;d_(~F=bPO^t@z}n_SfqECiJ-bu;hq@rA!t?wdUkm1P{LZq% zE=7E(?Yr13=&(!H@$ZbA!0!g@MGSZK1l!NR-QqJ=>N#;sU@vzY(YyK|+8%%@es^ch z8Srdta0A~2p2%r|@eAM{m)aq@vBzKwyrT>bk$Z|^Kjt3kLto%C$M_|%|7Co0c!OWP zqD7v84!eD$_^e|eYaD?IXt7mlkoAe*66bz4CC(V@`}@hecGtfEC)lj--i%#?jymr9 z1%7RwtHIWS4K{u10W#?1*u0Yy;0{}K`^@1Bp#M602luYuf}aE9Ch#e|q0S1v0DE8` zyE(=j1AX<}Gvw#^ws7+0Wvs1*KUk?bN!I}Xkw`A zE?3}Bz}bv*Z+>sD;nsBimiR~5vNAXX&U+2pJ#dOVrcC@5?DjWa-P}qo`Uc&8_Hf4Y zWc(H!gZdd5$4s!_B+ot(%nx5+>wvWbsLzYs5Yq$Q&sGBJ89l+r)S=(TZ=D3}Kb}F^ z{oWyFrJwjyB&fbh5YZpx*fSmK=y26xT}5q`WB_W zerx^;d{=zqc^_ia{}k*L**Ow5BzGs76UZIDHimx2DN8eC>+FI`#tLWgJ57HR)jRku zVY?0Hg1C%d9>6{B18dmJ8T4mlV-m7-ncQ!{@4>0|Pmp{67yg~&{pL6qU~S-8Gw9Cw zt=*Qo8J~B%F1nuy>xzrm>ux*Ztoa1n6uttlkspG6@I5fTDRF^+0i5#&n1W@o?I1VK zRM28i*wn4*|Nd6L8}|bw_vU>&S43|*`*Dn~&g@)%XO3fL*u0NDxbr)kIT<)(L%m#T z$}bZ$!ERj7v8|D>VXxnZQQ{Lc#diVU5_rdt;dO5PU3_>a)-m3Dbtfx$gFgeQ=4I?# z{J#VVx%!RSqPKw!pE1rmCT%lfQVeHk;Fav{XXg=c2kpq0m9cej&+{HQV?qxwL3W1$ ztm9|QUSfl8y^c8Z-hc)AZMbJ`u=j+#i>*V~)}I&dyw>eNMz0je)>+*ec9D^%#*}xl zME)9|Gkgi0PuZMIZos`0KbOXSTVeuVr54%w6FkAQypTT6b^R9e!i{UNRhpsO?**`z zm?4iT7rT3~zkDA!t24FWjF1<={rw1hZ|7->e+Td*B#!*d=>RiMQ@;?9YHb!+J6NF6-d#%)cL& z*zGNRcb?09ccjg{2K-QbiQE8kdpV0auYuKR6-MYq#jNB7G|EAiY2l6iR4oK+syMVk9$mVFXw(#@t7N74bkt;PZ?AmvE)(e|? zGjOrQ>+`eaZae%5$j3c9e5atnK83Hr5+snZt>7&P;0zo19JtR0{s8VB>9^l!#qRs> z?*Kl<*Pn-a=FY$)>~mnA`W8%p6fyMn&V6TV?DyfT;y0!vro(m&TI^5Z8JqM1+1>c> zfFFTz^OEZ<+WI>qwuzyB#%>>XXD@qOHvxUZyO;vWb6dxp2~gez5ja6$^L+O8cgrPU z+!8F1t=AA|y*+em3*W+Rb?_P-mbgspOLY5qpYHc-P~YID_&mEcgZM1U``yQW6*x}= zT40>>s4qa^x8E9=o8U8$kOQ>H{(Jr*m==4BU8=Ls@NMwv&w&F3(3U}mY@G&fjP-^2 z>DDldd-IHyJcIu|>jbQ@dv2I+Gu!nc+9;_>AOEKKp5%L_|#NS}6^aTA5u)cHj z^B`K=e0%=@thqPxM-20H*qzzhck#P#=a`^d(|2WW^-N9!pA~%v-?QSkm;Sft&M`;V z|6aXN7sFY-E8%SNO8Pr&zKJOLuaPtM{ygPP*uTN{8NL=-ztqKW&(174lmEW1)W-0; ze}mmU`FH=;eCk$Op*xrF-d+1P_H^>yUwoxOeD`<2xZleD#CeV-7*n9XB>pY1hjC+?;{P*t z_vq)^-{l=K!uju^C*%Onk&S%>I((Pm4fZv%XS28WUSQh+iFobq#rt=6 z=1;*9Xz(ZE?6U^$_yN4rE+IRIzjusz3T7Zj@9odw+dC%DKGv7U`${qF`Yv(yO(mwr zxnFB!`*a86 z`IUVup40nse-kjK1-iN3)$hQ0{|x`BdH4=MAP2qG_kgt*z~29duCoV`E4$YA4jMiM z3W^T}3KX0`fdT~;C{UnaArvT3P=Nvk3Mx>bKtTlx6eu_dA(}y$Vi2Y=!(}rF(U`#$ z7hxJRn1c{QV+K>0VQ9=?4#O}sW*8b{F2b10_dMt9EgiMzTlm%bdDmKd?VqY{&Di&9 zFF>6k6Z1~&e*<{m>Vc<+y{z%hjn_Nq;d;0Z-JlP^7F;67d8`XK?IU7OK!W2#99!+ilV$Z5b4ymNMN2`u%AJJ$)edzngor>^OY z!`Vy{+8F=)N}jp19g=5_@g(q#i$~xd$ixE-z2WWc41R{qPjHGk?&S(`=Y9uPU=5tt zz126G$u%d?=Jl92*n1!D4!&>Fm}{K?_u;%7cx8t6OfM3P z80|OM<_2)CgwAkPoau;|IW2shaf5HK6ytmG&I3Q=+sFL1d=cx6{R(^nl-euBxPN(( zCUrv|y#4)Men%depUPPo2VHOmaQPJPT2JBk!9!rZu{uM8e~q~3*wdrN={gGh8MsC1 z>)yosycpkhLyq@w02d|K1{wZ5@t?shFawF$Am|ynPl(Cy0Y4vupzq?p1s(P-uuls9 zQ_!N9#Mi{c>_Jrf3A)e7KI0CZ*^X+Gzat`|^ z@K0dw3bX+Y=GYB*RCw>yJ{e9dv7OnxUy*YUoM0>REwFD0>;!yI-jDu>i*l3 z_kfsk7Hy8Rxc>0FB!0v|4}IO!Yv9{5-`N!J+I89(-=yb~u$6PzZzld29cOnQ*Nmvq z5Bh51-oO1qb>zD4LwI{<{3vS&_8i;!tE{lEkau7X=QtJ5+CE#fe2S4B@~}50Zr^F` zg1Fp}4>!{WU5Wb^8sIr>(U;IYI?%4uQzP!;?}9b47C6s7e$8=zk3n5~0dMb)TE)-z zA@~Ql5A45!e=jliy-3`BnrDs@l&(YdTV4gYqYT){w^A?8**Zd0K zwd~!KpRfb0fpdsGY~u;O12b&T>sz=r(3fx26LIh6*e}I|DCQi_{!4i0e=jl4;(h%N zc+RT{-@+Sn-45IN{u@7|y)R=)UvOId z&U4!mb0+-;eG~r#?OLwW6JHQ(fc+CX6I0Z#=lagIfY9wcn!>tqnv_I!u!_x&!o4~97Ta`*6m2du4PTy*5jsjcF^>~HTL+`!iNjLd7W z7w8n@dCFOH1+DFV8vG4df?d#pr^KHCrHhfbpWplLWd<^FXa6(kjG>L&_b$lr*4RJc zTjxCX@8Oh)ab0WH-~cYrQ_1A`-mUk{0$=eww1-*X{MorhXHd_pYU^F&b8sXNrt-FM z#{F!c=3CZDaMpI%4LPnC*sgIAJHu)B#5{{LpdqGsZb$mSGYPPei;?pTm-58ydk-Wy z#Xh${#Ndt^drhwAwF7qyoO^>`_xuif33_rLlpOoK1lGBJz-3T-__OjYaE1hb3_N%D zZJuj7`wE;R=LzVrcR>%|paX6H&*AQYOThhSVhPS!y$^fY$Nttkx4q;Wu)uZ=d!0ci zuxB1U%-;albM`ITe0}>k@1KZY2KF+?SSstAw*v19LJoOG-tWN@zXg6iX6P=)zW4F{ zjO!&q-VHXIuonfLr3bmmXg+en8xHUC(trf7iGJdiV~s1snK>#O<*Go^OY?E|Fso z;rgD1Z@~UH(0+$CAn=3S1l;popmr}A*wcOdf!G$^f*#mQ=(p7FqW6LGxNIj)-;mCuq+|dybvW z6^OpGZ^6u1(GjvAL@q#%vA;9coR;`){3Y76-k|@DKSwLpUYYQosrO}Ei5O>X(Qk-f z1KJ7Hx1$#Jt*GnuIk=jR&`3%Cw$g|^PVRqFcsCx!Q1 z`xw_ezz)!YH`EUKaKpRDm%oIrpXq=T4e=fv7QG;6UF%oltD(=bI zGw}q@VqXO4J@&pM+E$EM%Z)E;~PuBIi6l0-*3hjLmb_M7Wn<> z+n7pS!}=9HlbDEi;XQTnVV1zwccxu%lbi~CCn27V6B3Hc%&@ms`wqu#|u&<7-N z9&O>-eg>X`bHG_z^lw05-$tAN2a0r%Q4(zGD0DmXP{RXw>UBK_K2f_DVh8kj?jlOG$Ut#&-1R>L4fP8UlbnR@KCN|zE99-v)(Uga z68jW%r|RUyKKZ|gUkU6~@~l_P`5w-**pr`#=jV(!fPHFBO=*am^A1FmDE33*?)`tk zi=y2_l|IIMXwmN3JduFs5X3XsVtapb=YTP>Cf=j(67x*1fjXO7E|tD=Szn0{{b$6z zLt`yiV!tNlS{-%(*AF;*sf|5?H_tN(;QV3ERAQ|C4>4zGC0DH>n8=X*pf zPvSFT30{4M_!1qUC$>Txw_gY3UXkNDdj>(yJN$3Kg4iI$>N$1To`HR;WNdqxBkVsF zKM&Khw#PGKu46Cj*VbdZrhEJm)N^QwEx`j~_U@<`N{;caFT%Ch!yd4w;%CY4tzi%3 z1h7w!9%3ZlgLfYH;cSD%*uO(NgS@y@d6I(o-|&yo9eM84&rHIu@+JNPxK=xfS6~1{?yv2kbuwncM(9u-5zl zUt^o|Td=~<@CkJC=o$I~oZmBRpcd9FfiorYfkpE_Hu>tozUBJTURj26y&h@apCs6`9*h@ZV)e*O}!>wiKlfczja?zh2rwr>h& ze!v-TOU?pY-+j8TyI^<1_vF17>;t$tSb?YH-UC%y_y*q@?Yji6@T|}`h#PaQWSsmC z?cBXKa4+^B_J+L!67d$C!#)Pq_xd(zHsj4$X+qf!`^53eg-#a*R_Y| zUd0*rOO3TNxfti`OTK;GV^7@moY%ML8%@P`A04*$>3Xj75cplQ1m5W9)J zKr0cff!(2%Ew*dFL-#SRyNBrxV;lv`yMf8+W_}wP9i=Cy1{pi88`s`etT^F zFUSe;6L|O5VE6HHlIy$x=E)834SNkb{3~#Zw(H5CC-zy1%h~@D81CP|L>AP@{~g>1 zd-zHOz_$N6@EZ7rJL38sIKsESC1yN;`}`d4EvRCD&vLr{un+P*dwbW}YfVSKbs|6} zSMiL*t-|%_CBAbHd&GCnh#`IWjK~jjayCjE@We9O+$+==n~MGkTwTZ9sW`tgKcMz0 zIKXxtCE~+g*Tn4O&k$!!a8t3*4Y)P<7f7W?&5;+W@GG=^a@35G5B!Gs1}uR48+s9U z559?(*b>YtM@k3py4OHg;+fd6Cj64PJp=4u`}?Q)<_C>%BO`uok^@jGvVaG0!gW6L8%QUBA;CIHiwqz838qB7qfr zPb|>BX=As+y42Y(W8Wcm5A0(b>q{TsMZ#8wJ;%s>POfWsUqMW+Vn)nf0iJ*@eosyS z#XWlWEpV;{n1dW+&Ia2W{RHf5ZN=gB@oe-@OHb^8TJJXj_v6{C6Wp)|Or?wQOfJIj zfGS^NPxo!yI`fxszGHs}Zt<(szV1UfzkBnn1Dpf@A@F{W*z-Hk#+dN}`itD|!4&FWi20;&dC+^#GCeLQz;gq$#;MMXez$s~C{F&?fpP6$?n$p8QU3}P! zX`ann>ij#Xd)Ngl(2}P_jOTCP4*Mc`?r#njKwn#Uo(qsc1BQ9g=8K!yewXe5&)m=9 zUx0mF*L*(*EA(Np)k==>ZPw4@JK{m^Ghkf<_Cb#?HpM?c2ek=!pXOMjeFV(4HsGD3 z(J;|t?U;9jlyJ(%Ms;2bS*ANKM0zW)aH zYs*>*-#J&nyXisQk2wi+z?p7*6_mR+5T;l<;d%*b? z6V4oKPl)+5($BvBR9rVoo%0=@s^7|&8qeSu-!og6ns?Y=f{fph*PC0gBIfy9|L}uzMq}K`?fdu&g6Q=)tR0PVl!Y(3zop1VGg`G342XEu&-d-$9(-%@~!#2 za9d)=8_<*EEWV>(1HT`vS0cu@d6t;-clfoR^HtfvJtRl{GdiL&qyCAQ>(AhqAWwMv z%!xUJy*<10!1I%9$-Ro7<&g+%{NDq=rw>6(EP(m0(SjSqe<QtlNMk@EzQ*akOWbshz`l*76H% z*LI)oXAp8c8`saojN5YtdbkeA9pYDU?gzx40>A(5?Oj)K9nZW&?*TdYyDt6~-Nu;R zqi?|70nTaPC%`${lC#7P(BU`e8T>P_02#k0zCsUzok0tnqXo~&)A!6ebP}h;`R;+o z;Iyp9Th(ATqyV3zU*&DNg5`x*JEz%w)6liLvU zER7uja}K~Guqv^hyefh1Ud-DA`bvwv3tTJ3I8$Id+ZL?g^aHL13ETPY^9}I(bcn<4 zV0%^x_!hqh!=9Kq;J?PV&iVytiMd9HR?LkUXOZ{)^yno}cOZcV%)t!YASYAP1NDm7 z17gpC+*CSv&uc;aHqf@8HEP#CEkBUAh0Er|2R5+nFW+J7?~|i%?}XpsZ?O-o1+H@q z-+uA|j9Ie;r$yekAupbSkA&L4659dx^}GEl$kd5|AADk;gFB!tYuB?rOU%B`QKh5S zUf#X=8JxpDLN~>3@trAv=eP^zK>Jf-p22dCR^9PT{u9*sMbeTR2J?t39Wz$b9>EAs4>h%K-$5%aS-oF6eoehc@O zxHX;jli;_}vcR(>Yj=P@Zl`Fq7_ zIe>pke1~<0vx*NHZHaqs-h(+k`C*R0)_4ET?|C&~3wH3evmiG>3l{h@kbt~!cJKcg zaGk#9!}+=M&H~%@uVH8SLC_oG?%%uctmWM6aDLcd61UFT%vBFLaJ$&UENK+qSv`jZ z+!}P`RdI%focrK0IL6N)VVf^pcZ(Lv5`DSkx^@bq{FcC275m>NCf)+qc?zb| z(a-nq-FtuL1hF1`jjdkkNBO=g#TkD=+&yo>5=^CoKS#airQM)g^f$!R86<1eV1w;D zcKxoz0^hUE=pg1=gJAD#mw3iMElarJGmD;;JaarF*I9uMq%b;)=jHl6ac%pqvFF8a z&_}>pdk^eAx4`?G<6Gl8u6-WNutf_x&{H2^58JhsUGxUz7;~>uH*n|^;=5?q$-rLL zYX6J4dz)i_gI=Ipdg!;n`MfLlYE1$e{w=;|7TE4x-GQkz7&bfeFp*wijR=bw6!T-AO`o<$h zt(~zKDr9h@dyfAPFR>eQ|v} zD`Vz5!$(5gxt+`Ne0YkN^Ih(vm3j{izMpsZT}5t(*gIlvjI(5Pm2+@CoV7~CIO7^W zTLX+uWkqa7o%eVjJ>;>@RP47`a+cVhOBd6O@n@ltOx#}XX@fp3p0{_>0r%FDU*#ui zQdDoW5)oaLu?5r z@4lvD%s1uP{TlcgoQk~gZp_)j=NRAm4BNR}Qw(nh?jynP;e2QI&R{C`{tHN;t~KTT zo%)!XIdJw%Ac73wS)35>?1|sNEwNi{{f~tBF}%6;9H+c}hOfH8oug+kX*&U%QC?cJaTl4&J`zD-rl5{yVgLwoe1(6hFt-?V+7LiBmEo<~g3T z*Dvs{Z;#jT8*FE&;(UH?{|#Krbr#qWB?E1}zR1A0oPe`hKNWNT3AX_`rp#y?bI;~n z1gGUJu}qI6umnMV0`*>e$6o>0an_IaLY{qvzt>y=o%Ka(ZXe@62QlvYRM}jw}Q*(bk+MkdA4U8pVUuRgFkF+tKiE(>5 z>ov6ZmEfxAd-e^8Nxbr|x1shkczblGa;%w`cw6j*pGuxJzKs?*%L??`*T>%ho}kZw z-u!~0A2|oa8+1o}hPL)5vDYOomqn?Il4tKLK+fM0rn1CuK?Ce>?o>Kz?i0HM{QnK% z8dKTe8@~h?#|b*{j|<%E3Iusof*jAb2ma1{jK2b| zxd9!yGvXWI&&f40XP%?o%csC|Phb!9AcMN@D|5kuSPNcYdtV)Wd$5l!?CV~f^%=02 zeKR=;wBP}8*Xgh`2yM_1@9`UKwf&rL1Kh7YSJ*=>`Uot6XL=8`*a3z+(x->#*O#99 z*8dI8vuLn|@c;?9mS=Gl^!P295wq_aEQ!1K1-4v^_8lzcz~|U?f7T`NgqX8#fOSJ{ z(HZR-IZsEwGw3_OGt;+j3#@%f+_(P_^x!$T1mshxHNFAz%w?_vvQ6G zIJ4*cJy?TXVl$xlrfv~)ZRd5rzX7hXA*YS;J$7h&8FQT;nD5Ug@AwiJ_JclwOXRm; zh41fC{yQK)tIvRIRvFeHe+hgK&bSBOON{;9!*u=?`7K;RzcnA7!3?`s>z7*V8vHrv zi5XA8Ij+Fz2e7C6KLhIh*{6fcV2gbMp1}Ki!VS<9U!pg}FQetB`&;4rwmoy_a*hnP zYWt$6V$A(JvvVZ;skHds&6nT{;99QP5pO{PbNmI^fEVO=zYoD27E^o|}CVacesCMjy<9{p7ui0KN-zx)N*9*166zkV_x) z9|5J#a!hWOHpaf@oCiy|wY>e{`rThM?+ zt~E-;xTdiaV$Sc`UIgZgg}K0e-31HacYA$5u*3aWvj(ocLffbAH50ps@4CTSEw=rh z0`pu)S)zCFXZkVb%GVtCbSOvc5d0a~<01&+_HTeQe?`pi#6+L1acp_Tb$oyJGB<)C zctLC*zXdn3ja@}MuYGTzy;C`R&VlP6ffe=)WZ+soI#F+(pT{0MfUyJoC2{BZ2lgFc zZ6}Xd(*e)Xdmn841<1g2m;=xHF}&+}cfy`4FvB*_H<6?C#8IcU zI0sUU=b5qHqx;$e>N&87>)(d6?-O7jj$;9W`n;6e~k9-eg@`M@x1-)^rhwob`^6MliV85G2WH@9GsBTf|(jFz`E3}(B>uJ zx}EXDVGW;U`8LM2ywAW^jQb9AjOW*)6PQyU#O3Wdd~ZT22l&SA)5pjKdJyzO;-7&X zU|mP771#@EcZpvEuHjjFKJ`u5qa!yH@6qn1MNikaW}liXz?>(TDJE&d7I=lBQa0O#KWzO$yl&xr5R_vS3l{ww??I@u4jU{!c~c&G09 zN3`cOD_m!8v3u-4!I>kRyPi{q8~T(UzR?WUU|5&9IrVHB{NKSn0q(bx1NKemj|4w} z`;vFR*0;nI{ab}|Zn=nYHb0Xu3+EYC$?z-UevjP-?m599l-im%Xmag&m7MvcN6j(z z-*C>B$+gc^ZV>k~-WiXQgKj|&F2WtbX&&HdDdmH z1sizRozBt)dBoQ6=IRfk#&3ahPHW_Ij4|*2C;6IV9H}$<#yoHD!?Rj|z}^SW+o*y4 z&DkO5XU2KmQx_lpUN^^I5w~XO&;C3k*YD7Y+yL?$ed2!uuG zpf_Mxhj=P5ry>4|9I>6`)bn?(L+}7Tqwk~L!wFE^dj*^^p));ua7iE7Q~qmgKWp!> zd-w#}g71loJvjR{z+N*j2OHo%AA-Mt7r;FGnw#l!hL~^Z6JSg}0qf5a>(TDx0=93; z_2k@xwreE%guuQ>%$|OSuknp-!AzT+E5tkC-M9D+anIlwy#R{q`Cc!Y!`o1DjD5c+ z)?;_%Xb(JoTWX%jWBYyP=W~hO!K>}NOHA%Qa1T?lS3}Ib9s=K>`|up<9BSwE%%2kP z(3$={aNlph9>~NKFkfW&U3`1`{q(;eh*ka=?k2G#wClO9^LcKWJjL0rngiBAE``h} z^7a*SYS*mdTF$%={sBBIXHJciq%>kMn`{~~6;KE|2kT5M}q*v{k`wAdZ- zVGjJ$5^%l)`yJSWde@ra9~R$!u5}E0@}I%^CO#6lD)-?wpp7vSXxGohAEV=1+OFkY zRB?X`;4CS|^AEIpIY(ZH_D-D1c!O5hn3X!$Sz^1t6_^9> zJ)z}0UdTnp1l@@^PPIeTVTJ}pe1L8AK2z*e0zR|@4Xls z?giVu_wde>(cYQxp8pKq3*0UILu!AGeg!-$&*vsE-}UW3?2r5w-goA?x}Ozjhz$a7 zJkUuX&TNk!eN=3FDRn;UFOy^52HSh~404RUXV?uf@5Gt~egYl5=i%P$5%^2B{4Yt2 zKVRL~X>kqr{uXZNKTU}7Y)|0k!2Ygh{v&+to}B%{b@<-J61*4q41$L< zGur(pVpUpf&u0ys;e|H2_EGonE$}S_+B0#MC!od8po-^bFZ(1gy$f@E2Y)NP^W`u) zif3e8SBZ5ozAx9w#4Z>E zzUd6tf(|%?=YNB^Z&=?xNfdFtcVHhxvCXM_-ot)It#dZOydK!M=GaR63-W#fCvf&W z%|C?mcVRyh8U7M_h3-HOnt*Mw1G@+Jua7@hT5QFbzv~$9u&1-iA5-rPVu@YFS%h<2 z>skB#av+GwtZj3v}4#>o+blBe$dkLJy8SLMHfO8G+Lti+* zao3+?XSiFS$G(Sloff;w^TO|;?eiG8mjn*UTY-J-F2;RWn}OQ?3-C+gTl*F0srx1Q zC!DZHieJbeR&#ta9|>F{=9~D29={}iCGLA3YU5M}zP;UR#vbm2UfQ19AlMJ!H^AHm zK8P*R?mc0*z{BIlcU z3jPP|fI)~S;QH>}UKilHAPzEE5R+@MhuP8Z1>4*n$gBNMb&a8~aqkt~0nb_Pp*;Re zv}+DIgwz?ogL7uj<_qu|9NDT5CSv?MlD*u&Gu*;jp< zppT*D@W(#!88P=|f7emmv-k6wn03CPxga(@Z}XoM|2O!yXxFGYu6uy*IjpfSqMfVq z=347oeGE$vZ*+_AT#td;eBrz+@RV4R!%o!MvjO(%@B{R~GxB`ww?unxO6|8GW{vTA z;m+cFmcEldhV&1A;QLNI??>PVFw9Ugj_5J$jXdM#u8aZqSS8>ya7}q_>w4@v)VSwF zY!I}0J=(i>Hti~&;h#V@28Q)Du^Z}M!kqx^so2vq^k?Q}(8V}o5Vyw??fE)F7cZG4&R!Do`E2*M?a^={DC93#jbC_b6Z!AQs?$e zu7X7FX=#bsa|hm@J^nP$pY`$$a6Nl_9xd9l`yb$UnEEd0sqgH8tjI~=OXBjL&jx=B zjzEAEW3LNv_kri-8gtOXS+_8+i17~OfQOUs<-rV?`;wSz9)RJDpnLMoIZMo%LvRjE z#hILAh5j}A4)_{Ge8_T*RDAd2d)*St#7@+}di&f1Q#l~+{kyJr9n{qM%**)B*r9jG zN#GqgB&L`fQTBpf5O3h^8^Cq{j=u#Bw)?U67XDih)YyLpJO_K*bBVtxHW`DszV+s~ z&nhi3@7pyqaLu|0_21yEaeu-+RNfxi&V5kwHs*xP2kB$%VV|pD=u_y+_{QCLNA28t zBmxk727H&!=8V4m43~hp)eda$XaPF;DlzuGMEpEhl2^qV&(q!wXu%_Lf|@1v4eS}Z z%9-LDyM}!mWO4^VciOI}a$E2OducqzUL9IniTJSYz3bz7dIkYn(18ZHmV0r}#*V-O9OFBW{_qaymp~7m z6Q6;HU=Dnf&KV`gdXb86ug9Rn-zV-`?!kGEu)hWwJHv~FZH;|9a0@s?o#PGu55W44 z{26*v>JxszB_KC1z1)W~^nkPf794;FAY!1$b+F%&@BYjaiC7CfvmSknUJ<_uT;G|e zGZJ|(Ejixn(!3bM89mH`yGz{p^*iFe?;F6ieo3yt?E&wgCI7VKNnH=WL*7344tO4l zan}oc_j(o1n37}sJFzplw-$dYp1bS!=mmO(o{DGM5%Y|`!S?(bY*F`|u=l`EaH5M3 zT*fwbA5=ZK6YM*o6=L4)g;5265;6191PYo6)Yb3od{J?4Q61@SNpEhi_kh)?WhF9+w=?q-7n? zKcSVOe~h0$&qU67r*c4@y?wiN&+c&s6ty$BcAd|2J1l&l=b(%6e9T!D&idhO@jdV7 zaIWXfJ^58U#~w7m83L{aso*{_e^2-VSg+W(!Ty0*Tl$^FuJ_kRSz8U?fv2TDh`kr= z|0V7}mv?sUy7!uMNbL9EYvA8CGBvI*uHt)kC-isiI?J$c8rUm{Ct!~azW1;|xAgHo zT+@3^_}cDMTd~g?t^q4>4Q@F57`Z@uUrR6t=GI!Qp}r%>vvpSMy+8AZJ;3!~fxicS z2X_n-G5HxW*B*peT}xg>;mz&wpIs-0*6+|6-uL7F?}8P6OFW4pe3C*E#{l zS3uGBo|nL%HLpRBy#Q^DpRXmcgxwJ9(c&(#`{0O}z5J{tYrKENdS_gtg|)^!`>((i z(8kznW*qoFR>XUd)$-^BhQ9c7a_svGya4jny%%y4*b;jS=iNG22NwAIXwS1no0G{E z_7R?~@4$J3_)F|#Y~$9umb3Q2Is9i~*FYjysdM_Sw!pWVN=?Lgr}j4H{Pt^!-^P9p zTw_VB1NI&EhCT=W27HT|`~Yfy_E_gkE&f#I#6FVv@YWwtorSiv_iH-z)4Y<`};OJg=`nkYC014~hAv zT>DGV$qVEPejDTGDq(lnQ81^b$99dd5AZHO180GIkaG=f=h`K%Z@#iXuZeXr_Uh3I z1Zcst>*M>&6=!<|mc&FK`zy8LaSoxT$1(Kj%jv zfga!U=+M@;KL zdawFBU~3HR8Bb+Fd;?w)_pGe_7QICOl0>BRfBD~!I3)q(eJ@Dt=ra?{Q@5k8l1NbeKc#pi6@GF5D6E zUEsa?zoV}?J$wtQoWR?!it}}W2Rw`E?B*=5k1_A=F;LIR>&SN&YYvEM+bht%=Nlz2 z%$rD#@xAQ8TkD%k#LVlkeQ#4)5%bO52akYjXL5U>cF*ozKM7i+HJI>XsbdE)kWR`=xFU1HZY?01itb2VTFJfnop)EYNmF5&l}gE!uS-(zpJIXijx z=?vccO>hF&5f9K7en!lC*Y!IluoZil^A)j+AQQKbGgcYaq5oy#a>IVrMf$)f{2k&g z81AU>eh%sxKEd`g=ZwiZq>XVdxdeK+I^V!E<9Ec*1JC>KU;(NOxvamjCwL1~v#unJ_MIABD8u-@gXHd_jBj(S!7Ci$k+;eiDpl4tWe#HM3P}iTw_UdEYhk4F&1P-yS zZQo{`8g z#(Xc<%2|_$-@sqtH^8-@;hST>4nLD4?Bn@3ue13^tQjQ6{_f`(IKvuP69QiDpVaJv zgzpR+V81HP*T={mVt)f?%@MY1e}QekmK?eM^Ss{`PaeD%R~2cc#O_%XKl{ zPeKdxgflI`dmeg_7~iOCG~n&^68{Bt4$ki%=L+gtLGLQ|=!}6Lc$b&JR5I}@JzR5& z_y0acikk7U?&vS?y#zV$*VYE^&$HMA8*rQ6#+G0QJCl>J6S@WV`WJC?XQ0M1+-Y&G z^W+Zm*<&IH#67pmAWDDfVZIoDrdZd*1%8!`{hXS=0)Ovp;LUlzuaX$#^K_OU-nDf#1PdZ*BwXj6IxZ`U%Ly12{tv_nuc^19pjd=N)m^ zw~sl?!Y8yn-GezvV5jTs4>Z6&%2{mp@euSe&SSq8yY@5Rb&k+-Q!(BWI|Ju;PE2^$ zaE3J)en!DN_po2)3)ZmS&yn$|nB)8NEbM&<{tb);bv+o)1mAjpF8>5}K)?xSHAn4? zJ+V3ZA~`E`1Kj%>ZQjruU2E-YY=gGuTd<3r>5~NZV`842eeQyuc*v>YJ7S)J_7!Yv zs$^_`hP(a}Jp&OVTxVF1*b#Q1^?P{F=788EeAnG#`zGXDu)=pg_BE$RchoiL4Y0TQ zFTev}?_1!Qc$FZ3OKhK*bK1*&Slh$BhI75C*xT3|d=0kv9l1Sl?LBKj3;g?}GuY33 z{gyl>$9M+%?)8uy*M3Nj{XKK%k)Miw1GfY(!NMHs6Y&7rGh)Us!@DozOSE%6Cw5$7 zb94*0K|7=G;5G>CM7;K~mvLvZ{%-a6ncb7JBeFmFpN3g2Kmo3m?+9_|qBIeJd^Q0iP6zs}ni+qY(&^$DDzZc{k# zG~g2O%&iTu16FV?sN%Xu#QmJy1kU9?XP~Fv83OwREP-p;PrLH!8zttMyG|k&!aDpf zf#>lA)cKmi88gqdTC_7JYNsMMCw__CeV}cuo8-0F-qpYvC+FAr_O4=$Vy{4+YY3eBW2mF&IoBswv8LMkSFeBg zdDN5Z{@q)ZKF04l{h_uJ=r+c8KdbrpQ?ZxlGps))ik)Np?7Y5CFW-8>iW+-%@ZPOb z`&d(D`hI%iuCrV6&1s35Z~U|C<9*F1e1h{W`~}YbJ-$8H*h|pjn=ia;`|M#SF%fI* zBmaav?=j-TxmokP)ccuFa4qQ7)XE#TZUN+~O!ufQtotYVzF*}sdI>VMDaIatPy4pr z*OzGfXE^;sa1OsMb|M}?eM~ID`I%NLyJ**#!PWKceSmMjr`XOTJgY7~?7hc!9sjw? z*We4V#y>6Q`I)pw1EykZ20C)81a=F~5tnz?9rdKQ=OfpV7r^g_B^b__bKH{q1Ya4> z7W)(6yzZ-uff_y|yVWOVJit(cb{+SfN=$x`{ z;JMuZS3sWRTGQkEe&qZ)bb>vV7Jf$j0eA>D@{=6*phS#){!Wf}H5K2^U1Q)JIHbOh zaUc3;K!@+1?JbwU3i}nDXX^PG7sL9*+4>jK~A20y(%qv z?&XBoF*?8;tbm;2JA5zLzNIe4{#gwIB;dIZvGS&@_1&D|dvS~133H3g^x^*v-hvIj zv-+M=j7j!XBF4|t3%DK7;#ZMdl4qa8l3zKs>-z@Q;PhS2$(KK|F2*^hd)_VmE>mk> z;0Jl9`>aZzi)9VxHg6DO&Sky(bDw^0dU*5h7rXjvV(uq_AK-#K>%YZ5y>5bY?SH_D z4*#_55%=FqJ_keJNrL^3sdw%^#_ybu)*$AavCf&Rbi_Zwe*|3jzkus_cMEcr9OIdL zc4xsQun!)BfJm$s7WAzanH*0^;~j^_2_-#-ibBxbNnjS&G6SizV77-c8Z$yv34KlC%ip+a_#H8 zKS3)s?pzOvKLzf&%E06M{ot936eH`M4Sr2VyASWqwY|G2xefLoi2W1%8JM>Phai)q z{ksx3cUCz2ct_4rMSEea!2Fx!y+iL5J;xSRdTjUT{$2yu^}M~y4!etSO?%mUtA_g- z9AVollcTtP#`kSGo8KXRkM%Lo!yoboU|sUuw|$d2z+7X(wLA|cVti{G{EKkT8rU;1 z2ll;3>?*hmTJke!h`$&7ui>0aeub{<+s7WiCFUAEyuS0_0?zDyJ)ahCDjmMOZ()sg z4tprm`_b=X+}9qwz3k~{rX^m*nRkdi2fNq{kmbR0VjCA7ao2H%793DF1HCoI;3_)& zf5W{6YS&NZ6_MAM6VHI>G~|_>x~DyIKQDQ%o2U!$n3y>;VoPuve~oUyMQr=_*d4i5 zGXA5&wb%g?uuqS+<}2WNxX*~OzuyUdXWRwWWa6GlLieD-_AH!5F?Ng{=vL5QaW8A~ z{s``X97Fj1ADS<~;z0Xm&VhvO+vtGr_!2k^+;0n)1Y*w(Io}Z%7r-!|GZxtA zP2u;@N{(@kKr3DF-3a$J@az=pQ;h33#Fxb9AOqji0s1`Jb*}+GI}2jg2Qc5?5l_(j z;2rQhz63kKS?yy@%R1)W!#_p~d*1=>yTiYV_8ivO_D{gL>zh;8wO>cS%5Csld~@D{ z7TCjlKYQkRMq6O~5L_f~Yz1Z@QQrgi;QPtwGidko8*qRxnxb2@IZxrVdur$C1#sVQ zKnE7!8VLA$Umf;cVqypU6F5sMIXyZ9=XwOUMc4hWv8|CyU<1r|)+O+LnG?j69Q=X* zoVe%R;fJw_xc<;@64NyAbGQ@mq~x^3q9CF7>Ae6Ayyvh2&UcI+gq)1+UG&)2sNK(o z*b=z@9Q{l33Qj%=B}O#lUm@oA(+pd5aBH-%#@ZlO&%J7MzlS>l&TamXN3L9pPQciM z>yw|&B?ddp;~Mr+`WW{(IQ$_ehR+y&3%{Uum5XrRRY%M-TwZ~tQf%L*{1fs{i!;oKdyl@w(_)=}2UwN$oik$0YO&?M0DhPG86D0MKFldKGqioa zg`byt`2qM1@eT0v?cJH5L7jVrtqi@f>$&;6tUYslIKxhx9MA1*xFMIAv)sntpm%|1 zbq;@!81LvZe*LUCQzrfr{Tj5`N?lv+jDGLUL15<~K_J?G{|$S=_Kkb52`sT&Vl8?q z9sU*go1pG_QFF+54dcBwIL5w5Zkiq3J%AI&8(_{H)O~i?C!nXMiu`xfn6m?%p_}l|c?qnEyN@-nx8i z3EZE7HIWovkIO2Qz(Otut(~m3r@i@0!M6 zz^9P?APq6ktBvuTJ+F+tB4$t5-vyy2mf@-dwt2o8^ZcA8V($gpbvNKV+^1lMJo2hV?DinYHJ*Xe z#rO^{6y6-)#gL0O&%Q^XzIXK!%7WA6fO_af(+I$L578STD}&q@qtxMyb?_Ges)@qEnpbMCz@u-$_)N86(p zaK8rHDP*x@T-RCbu`dU#8SV@IKZKZbyrpIa9)qE-ByQj~#C(@aY~Nv^t6anX0W`!s zXKmN4;>`9>G2Us1R;KUgEH!@tw}79Q%9&@qJ*QYr`nQGOA?I$%Go}oEu)iaI1=M|Y zF@7HHvjhv!66-+#-;r-xUs=OjZ{H5>Ebdi_7{8Cq3GfE)0;tl%U&Qwe4y?iV%wB_C zd}pY=tjX}^J%^Xu0N1wv4EVNgfCaYu>&S0`+Vwkd3<6&{0Vpq*5v!WF}Hpq&T79DW34ky?{gn6!zsoW_$TBo-=28xDFg*Hz2UBbA9_Lb#C(y zh$zAc}Zq_rd>w6Y6HA_dv(^CR<{@g-hft(V6&Ed{6!?+XFq^ z9du_OY-jWwUKzvpJYHZ=?=6VC_6E4l_wZZvFG)|X=ln15?*EhHn(`vZKP|?d!2Jfa z*i*5_pR@IBr(7T78~g&^S?6HbAMpm;*)w*46YRf|=X-h#0>3A&488H!#5Z8rD}J53 zjUnx$KZ2Mu`>qo9R2~uY4tsi>mKpKk9MCz&Ictu09x>1ApjS^goDy4m$l);;bj&HN1JATOTBei8!ykn7KCoM-t;3 z^Ic@@B#Kz$T&KmnPvNZDvnRfD+rI<;zAy(>a*UtXE!;!m-tBab4qomMxaJbA1okh< zKD^&+5&y|LgFU|f|J2HfOszA-sUC7WKr!dNV0#wl;T`~IXo&?-D?>lx-@yy_aRgF~ z@cxZo2A-4eQ9t0VHUA3!9PK`)(&8V&wZNX48ev^q^x(rCT>mh`yGbAWdd7Zsz65^( z?!|s%bW`u^`r?&2ewy0_aLCq5mIU?++qZ zcI|B+?$>hCf<>c1fr1JYC{R#=0tE^xP@q7;MhMZE!4yWA zW)NmG2+<6}6h@e47|dZ9hQdzF_-3I%=bL!?ADsMjp(8ap!l9 zC&1bF@twT^<~$}AV1jM$Jz$Ntz586!&n1Sn^>^US&%_k_%|I33zIY8zi7!El5B08d z0(?u_$6$%=-l_!oRgU0YZ($y=Zi22kYi##bCgV@h z`=i_`w*D>R_Bq4OK{4n+G8a8Z%ZnZAGtgo`qKD^sF4%t|c8V6hv-_Y*5KH*?z#4l2nyBosPxm`9j?B;x$vr@uzX3P# z_t7ix9Qz%J7|!E6>;vGL`nmA#GMw-|I*N&? zRWkk!;{NWlcLrZEoPdboe5}jZ%98j7xF7op-Lj>*{0-^H*W&*Il$ zPJ9BMW6#WiSK1iX3Su3$pIz@palI;Xj|#UU?s|Km#XbPOH_thf=Q_@rfPJ69{Q%b3 zOW>Z(_p{jHUqY{d`N|ai6#p4GGX^eT`-XE2Yu?7T=bwS=dk(H!Wsco~PfFhJ(NXyN zzB0aR90U8$@U2r)3}^A0xcL*b>+}L=Z`b$EGrmyF^{!tKpQ5`M&Si;h+&!G47w80M zeuEZ?nCp1{bF}kiIiw5L1nPa_o}Kgd_3%~J#GLDEuq^@ip18bgjcX%5yg|?Q3osV> zGwSU>2i7KHV{x7-bsKp&KeNv2Tk!2Hv4fd*T6M)o=Zu5E8? zt1Ph1c}m>%-G58n65XMlRX#w2FU+a45$V_6E4;n)7Jr8Cz029h{$n{Mwh!#vfE;6X zh);KiGhN7!bI5hZ3H%i8TJCXzuHu<3K_Ye=J<}fD+v6Ie*EMYO$Kv@P0{c7XGwgBy zx~AMIaQ#LU@xF|C2bK3cs{8`Z@8yoz8Tub!EDPcpBru2T=Zg;+fo=brpe3h8kLNQc ze~5PP+Wmc%7E$<&UIX_r7JEey0aH2Z&C#xL^=0CF;0|!F4Y9F=aqtCb;Kz4hp1)_^ z+r0E{!ssCOuD*3ka@NEy0&DE+zu{chxl#;$oYOP&ycg(|Ht#iW>KEjNinNkyz zA1txuSHRCwJr~$PVo(e6$SvZYi@F83LBw#*4f#LdzXIl5 z09D*af}erYl4owFR*~;wIM-{$*We-Wew`=71+cF=0q?>d0ql7R-TT-rd;_M|f;I46 zyM7R#pwB=H-VwL%1UtbA#oAOjb8-ydOMzB4@INz-Zh-my`XM{yCt{w*5xSmL6OaW5 zrN%dvOHA!-3(#SE*3R!4xrVu(kzy=jI3x4LF`RRC#N|W=3C!WY-YuV1Y`+6K;#Kb9 z&xkib?OV3SbyjH4umkVaG4wRI(MD(RLJoKzf#1S);0nGyJq!2kTIN~PSZ^M_cYa9B zeBW{+u5>Y+VV$SJm-EeA_Yh3%RiusKyf(z#vpMdg7q|s+V+UX+kH3drqFeX|eF82L zy8(U+!uXa<$?-d^&Ya_?2{U+S{4;1rTwvcK=9xYR=D1D}7w%;T-#P8!o4A0lobLnM zT?@!3lT>egmeUGY`zM_sCm;+t`ml!p@~nUB_O&DaDwx8M{R67#(Q) ztc}NThJ7uzao4{F)ce5wR6dilz;~{%fOA{`9q|U#JkLU@eVqLfNKta&mh^c*%ym{E z7cS5pFm8X})`r{(=mqWtF+b<7<6Q(?OFY0D`x9afwzcRa;UFB1Pd@Gbg=4}dfDLXKx8 z{{s8~X5h5&0pDs9>)#o^Gd;$C39R!?8&fhm0s~C2-S<7P!tRKf|1FU7e1e$qCBA2W z1H1w5C5SCbe2RY+^lz~lq@~XN>=XAaN3=qgL>me^-t2c!{aPT+6A5uE2T-jDno?lSQ`bcB&2G355| z6RsCxp5=SsoJYWU-1`Z3zcx8a7ek)sI0ruh@6S0Ng9P7DqiyX1Oo8Xxp#vCi!M;BE zqQQ30?n$_QLN{{A1lyV$#5>@3?Mz;Y;qBC!1J3_mIjuY?u2tWH`wD8R*!uvOe+K5j z*jRE5>w8Y_+x!JsgBDKyHF5WuiG7WpfJFRUu={(0cb)$2)Yy5_VA$8+>8=;#{D%J3}qkkgQ{*kzIn&)0;<`7p7vF-akn1QiG44=VSy#TAS#uU8<_e<;o`Vw%hO#TdQ z%yl=|))~vd_tvNjX85ivGPTM+F=uGWnF8yZ81^S`?vmIa$nh@CO(m!D`mXPH^HX52 z{&RxP^b+399$a7_qwRA*OyB$|P}FlEFBaHcK%f)a*f${X*B}$?fO8(23!HOSxFz;w zu)&|8C+LLU0rpfp7yEWG%rhnKd)yE^Mc*m>3i~1UOR&WD+})?M?14x4Gju~A=P}>j z=IQs4163ZtIdc<3vvc0s(^(t*4e;)!!0#D9Zw++;oXz}SgBIWWe2<;c4Zg5Wzr$|P&TU?mDZV{s z#3n%7IjXq6>sYggeh$WBey#D|wNre^u&*<>#C!+tvjbK1FAxuS_xucdJ>rkC&ww-8 z-!~p3-u3*OBUA5MzU|3~58`|HEqZPoZOjG{D|xm_sq86ptE@)rvz0@%Yd+%xtOY2)MfnuuqxroNv0EqeSGd=5M}dASB%#kKnLgb(88d{3-J zZ%ZO}1ZTenyNW$$Wp4Y8C1UtI8yD_xEEkB)z-#a)p!m6q=*^%0Aa(-Rq7$%}S~1q{ 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

e|+;wxe|Z;d^7*bC6aeEavF783;P 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�SLv@{IfVIa!FU;r}bZa;0#n%rW>J=4UPCdLB) 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�xB)H$`Ifo~ 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

tZ^-!p zNcww_KntAN9$$bjfipDv>DR;c{So-N;`8Qvbxhu!p99Z!27eFCm4SP84A!8hR<7+c zP@aRpmcW=kAz#1u^{41riTRPAyd}OD-~>2_>yTPx>z-ntf;O}cWXu9v#1QAR;Cjyq zdosV0KG(28K1+MV+4r}|>gHL0WxhG^Hh2!;li~~X>O;y@=T?~!_m*1c6vJLx$2hs? zvIHHn6v*|wj1hhwwb-Q;{HQ?evCoSS^&&<2&UMjxuJ!nRmi_!)!#ng;Iejx>dtUr^ z;dyVWkAQ@~1yl02@qY%kzyv+8C(r?@kKuQ6p9g2odyf1acm*2#=3Pa0juyRxKSbAm z7noP~g^Xb@U<>T}eID1yVO$sh#Q#cyc06tsx zYqdcMu54V2p{8}M@4VU@bl*+$64xP{a}z$(Pu>!)tu68yvir0)21pS@{RR2~KI_{{ zNb1(yR*ymVxzMk#lD!gspMCdy3Y=|BE&c!<_A~t6%`w$_?vsA+Q?-rbd^SG^u5$sp zc;_|m6kC91WH-V+_Wkw-Q*1}z0JPZ06zCsfKLnLJa$Ls^Z1#7~AkKO{Tz?1G zCTUC9yq7(EJexT!wqvls?>uAD{{Z{p$X@S|aZ~KBE5(qd?-}}-=Gc5^Y=Q5=KY(*r z@{ars91&-qDe?k7CTq;F=lSBD$F*B;AKqctKLgI4(6zZf_x%l+gRengmr@K^Vrzl5 zjJIxsuTqb$&l#-kdz-GR&DTed(d3De1S@%}I-=Xi|^WI*t;|gq_1J_{OQ~8LFsMkgLjKY6_ zf4}soVfyVm1k?ycaRs0E z;{^DAa1Y$?1+w48TjT^fFb9vYxi^0T=A2?{=q2T~qA!7W@-g@Z+yQM6AV$>1(EkB` zYkddoRmt~@?*n~rz)D{X2>3m0&f|Vw2aP_ckKsMDjcqZir@aLY=zzTfOo40raHss9 zt&j8b*?x;HK!cpH2dLB|pJ2Do8T?0t-yCyW_yX>Jc}MIQ*rv$80-n43>Ru&$GtlC{ zg8mKAm(W}6_mMrL6)@gAZ|x4hb=^1f&2=_mY`&9lXSU7@?AG>KGru9f2Muz7DY${} z3-Bp0R(rkE3Ar!vwN{VKbFs&J@FhHqsf10tXKuY+{I#AT9r`ou9{|^oeKE}YsN^{B z6yH(t8)MEfH~UM_%hTGP2d0oQ;z zoweb9k8nQw)tS{FgWY0piLGnh#^xUNaQ{x(Axky4kKz2CMZa;*J0{QFyI`HW@I=m- zKE~$E-jO+Q%?-Ni@x5VP&tig}V&GF`>-z3A&z>DV^Zl$!=smh?Z-IAgA0CA__$utZ z0!R8mBIX$064L?u2fVKN3||L&Y+vt?3-n9Ixc4uC_39mSo(X7Um~DJsQ|w85c^5Cp zbzVuk{r8BGj4{`GlI!*z+r}`DJ*Mb6hS&wV``P1PBF}&}b!%Do+u~2f){Myg^j?^A z3;rEgBUf_HKHl9qKdVmhCv4}0ZcGD0j&6)LXE0}Cj`9W_W7qH5CE$7kv|t9jPnGol zpicZ_xc*wx`YYfX0(8ht44I#z-vCwDnqrvAoMU|U%!FN^&z5~Yk{7bqf;eZ?mr_5AJ8M0F0b`yjP3{LQC> zKO#=OlKCgZS;MtBr*UIiV|xzV=PyB?ZxryYw&H&aA5)6qcS!g4Dn5Jop3?4oH<2g6 zwK<1zW16E|-)GO+b1!Bd(@X4&;`9EG=UbBhH*9<0H8@4rCK;#QXL^P$#lTzSGcX4} z-%HTp({KMRuwUY>p}hx>vCn|>^!OWWu4@H$fqCw;a-A^|bBu1U4q5&!aen@;kvhk4CM!h@x$j}?kT)r)mHXoV2uw!i@c<+=hPura^AWg*RqYj+34@NM_?~-omCEeez%>17Jmzm`Vw)vI35BmK6BAwrv zLCv43`psDrWB&$OGPcIAv3p;v=Ufxe1wo)w2Fg>oGsxXD?VhVS7l_zXZ13UoY@|2v zBW!(S_56o3*mni2_dDY9eJ>IE?b(tyfq#tOJElFbEs&i>N>RRFp@VPuoJ#sV|A=7@c?w#d%Xl$igIulEO$E4%i8&$~Z8o&v!u-cz7pf(rBl1qv!qpg_T*QJ`Rg z3KS?%P=SI86jY#K0tFi(24MzMn87qgn2i{Q#)zRX!Zc1!S zgK3Pp2xH9qe9qasb#$iZE$+A1+UvX4+H3zgr>Z55uXFYDz}*F>5_&(9cJ4WnPZVm!0 z7<(qqioZo0Z=Ejsl>YaA?~L=y{T@W&jB{-rWBb;B1>XG(^iyyF z;k_&JbH*pY+_R)3#=SiNnV4YQ0RJ6ltBqLS@d93ZDzh{E*6C|agUdLAp+q|!#X%)s@&WomO9Se;_v_es@C}!*Y($Uwd;27 zEg09TG3TiH2Ast;G0fxp*L6B?!q)+N_I`VJe7`i-M`t+aY|#z)5}$o}$IY?MuGAr- zzo+tbUlTdzSLw&_elM9y#PGS1;k@fp@&5e-e+z=x4~#)q`HJx|a9z%6to=>JzBl^g z9h0%^vvrTW@#l?EYvQlt@4yCR;@z(ftwaoW`7*vltZ@Fy_d%l{OXJ9C!9{Fi?YZ6^ zbq{!-t3QI9V9dK84L;B83h38_OX;G_Z;W6(mO1fN9%DQIPl?=LL5lYy!ZCjNBakNi z44*xA!2ZUvvZsmc@crF7tX*+Gn$Q}=_o2LX1KT<0#*C!jL;QXx`xQ8v@J$S7+28R| zo~CDK{f-!=jZz=ofR;FD>H?YR${|R=|B*g9c6na9_;R9!u@<0i5D9^AdE?4}bJyQR-OhiE~V3h0il~ zzaN4o-UWQl_yn$=QNY#Sjr%ve_u|y|F15eQp7&jNF_oGV#Q09iF^w3;E&ki^=?vca z&svkU-@wUxf1G11^7@+?_N~Qku`}=;;#t)GjOp{y`rHrCQor?AjDIBfp258WEpd&g zg3rAAy&@6ooc(+;aPkRT@%+4_b94jbgyI@*V4p8zeG$W+bZ{Gx;Iyl_wy*H5fHfbY ze+?3Oiu_~7bze^yKW7~1CI+_(_!-)oK5uV9;IoGd4ziZg`Wt}@{dw0K@7@+@Sd~GkATv~5Z@2V4|@wB*ATY> z_U?Ms^;rtW`;7Iy1@`zMKKptI){Ko!)ak5+IF=XQrRpEp;iu;&pJUiR_cu|?zC6dk zUq$;5@WyZ8?5D%$JSW&M@!ti%1Q~w-Yn)^J3YeGhjm7b0{0rjdAQ)G1jjq+0-j8m9 z^BVu#z2VOm<*mI04gLUaiCbbDZ{MHFpCQJ|XLK*<897SCFvkge(#Lo#uHAX--aB6v zeK`hBU&5Y`_})j1;{RTG%{9lKT}z9-M$6CkMm<6+&as2HwmI(QSge`hl!#$J8?=&Q z*hg*a``qbk3$*Rw#@@gO_E@?Yp2e@>`}LQ#)EMu*b+?ne%HJz|qK>@>`W!ydVkcn# zzQ>Nyhrs=tfu?ZQ4|scj3x2>hMj6+4Z2q6&BOEaY;}?um;KO#FY%XKp!_L{sfd<=s z=>NP5Tc4ar1snYGeSgisxh`{!f4s+>K)V-o2Nd&e!a3)*9 zzyK%2%QwVjePfB?p8hwSYc+l><|TZt{~R%X$8H%b53%Lt&N^q;wSvp>uEq!W#**Z? zAHq1}tMoqN)lCfV{=YERR^AZXuPgfDkA8eYY>es!aqeSZkLb*JEQ#@a6ffr-XNh%v z&zf^8__p{mdImPYeQjch2=oDC&!fZMqW2lsevDe;OF+pn#09zmHBRkkthLj`KgaiV z;hq;gEA@g{@2bzAK4V*8A65MP?(YJz9sU;Wp6OeoYY+O(v(B>ckBDjTyJz*8`2t_U z_XOW%ZF+a_%<;YJ=daIRLyYnk|1TKtqwP=8em063yzhRtG3?_jVlwtvPRLF8oX>eS zV5N^f)cWp$Dv8(t4Y232bol1__J(~luI`6%x9}f>-vZ}tO8t(w0N(w(z#56M@0b=l zusifs#u?k1Lc5CnTT`EB_z$3O4HCY#V8&Rk^6D!f;O$2&fVrO0ZQ%a8?<-K}Hs*Bw zxvmG`P01mm7x%+6({GQ?Kb9@yejaoH`^i!626l@b zz|TLwTigf6clfHfSFZ0F`ZZW$SJ5`Fi2-xQ^*q%_jGZ&!`+ZRt=*w^?po%dW|C7Dp ztXtIR6}d6TBz*SKtsFg9cbTVp#JZh<}UE-Wq&L-ybn;4E4VzW)A;f zMfXAF$5VaaCHM?DS0c|ERa$(Xz%9^z7xawm!+Gt0;~0q;ekbv}yZ*YSZQ=E`#5jlR zoaqPp9y6BDj2Fe<_W;)b;}7r~lh6rY3#?To7~7k@8W$tZm=!+btuOC+oJ#efyBO-9 zau^qg_5Su}z&I0gLTufqVEi|D&vK66wN;MrK3-o#TnnscKiUmQaJ_8|atW^gv&&j1 zhWY!whhO6VIWd7>>0;nF#$&f&Ean+&PZ{mAa0K@8H;h|wlX2f8F4y3CuK~qq&A*8$-R7KI(Lg?_pQj5ih66 z+o!d($M8ISC)isR`6h<7>km1`zJrvS@0#!9>tfiCE#oEQ&%q44!Qa;^Ir4{a{yQYs zJC%U{w(x!~OvPIE@*m`{&){F+>!QqwZVD2*qqg&AV!WesFqRX>Yf$^E_o&9ybzC6- zD`5XADm&-{d_N`U;QIOF?1)d`e+N8^X40D(JAE;%Pu}sgN6(`6Y0g*{#5?~_@#o2X z`TvtYhihY05!;$o-s5myA$}jMjEMpETj#$G_aVq|o`rw5;rqApWHbRMTJR0rcwh8+ z25-sju%pgHn6iNL4&4Iw*#>i=t)H;(;(rQU_db3OkkKw$3uRsgNGKas2&oi{24BnF%`ubv$ zcNznK0w-!e>V&@+w6$9h*h(A2pUs`%v)9wuo*jNX(Z5&X(D%Vva!8zW{{p074#w_5 zi|zO({wTJ4amd(OAAud?6=(#KW61SxtqU%oUxONBT$MJ4dMo(Twc}Il;|KiqRwc)9 zFFUxGg>#)9{wl^ihVwg_=jK?PC7E3JXetrIzWV#oH)rr0^8AebGgw%I^P0-6)OODj z^~N#o$u-dX;gk;;+qb?;=(`}Wl|Gm8x4^Y4Jy+&VG3-k{j}!bEU!Bw1^O9$-duIJb z@&6B6d=3uaTvH!UjbrSDzFlIBlgs$@3&p%8+~2@=Afk8oKU&7!XspwHIfp-?t+_$> z5=Egiz7DQIyOtGNSj+q6{x_mX#IPpc6_0@Xs2H1~H{bhVP4{a53_kEbz@NccB4^+B zHkF9sed7I7+|Lxlo@KQ2Zt?vd{tcL8xA?7fk+FOESG2eW+*kX_CAUL+e&+fddY|0S zOK592Uq_5uf0cx9&G-#C1bz;fYg_|27Hc`bp9AVdOubLW%^Bas|E%y&7(3Sz)LwIx zzxybKJGke>d+z4fdK>Hoz8hd?K6#2d0q6If@&wczdBq;&tv3UTF%iR^^4;Fx-vVQ_ zm%#NWVif1J#(mHR4pGEf?!hZy%%V_=N?^q!Qlb034V z)@XkRK>i4f#eVc(2j?c7an33K5abwV4t5Lw6z&_a52pRC;5+i_{GSoC#y1CnU!2Ex z56HEQ-IE!}pastV2>eK5h;!~0aZ|CE4O}M|!(1KOdLQV=zJQ*Oa$9`A(+BQ?KLVej zaZH0`;u`$!*}nN@4y<16{{Zd()U+#tFlJGc_*6~`m@Ktev99KL*$%^ z@d5f0aoWN=uTL?@`!$vo<2DA5wY*PLaqbN`fr}W>?-6zb?0X9m$c$%b{i62i9wx@# zVSDneV|^cE?*r>4#_}PDJisSgZ8`YRZ!Ov__eLG!*74yrv`ry)Tt1& z1@2`V@BVwI%IoXkI<)q|-tfM!bDeh#pWza)mh;Nb(U)sHTot()oM*iTbHUi$74|hC zuWtvGTloG7)N6gAcO>}ztXr0N=cw{8{O-?KXdFkv@kY`kaF;BWD{Hx0VVr;N{m4&QlngI*Ks+%0xS-^c$oxCc7MD=-$% z(0N1?V`f;7em~po!TC4r-NbOl-!R@XHa75$<-V~+?9sJb`weJg z=zDD~#Jl$?exLcvz;mCYzW^Js&$x@x9M~N`pD*u&du>dEzlt?-83+0`G5y}-cU^ZF zyDsBghrRV{D+Llc`W^%MpMkL?c;9>1z>XUJ9iw|xWmakjaSeC~pDNGTyW$#KeBOn( z=*=vU|!7|RC#J$y^F_Bre$bd?CmJ~U zD15^A23wza1hR2OoX36lK5WtMf%})RyBPX^!MIAo_q^~K`!HORxbS zmSp_$);>$zYu7mz_w+58gFN9<4FB%&HuKt#V*SM=ZeYrtg+G|^=GvRzX6peTQ4(ZyAdO?B^qV z2f(}|#&c_8UjTFP7;Nzg_eB2;JOQ4!JtS(`hwzS^p!H|`OSEgWw>x0QcnvVRS|f57(|Xg4wJX`r=d`25UsPS3by?A!@`1#La^tnHrK`zQE}7q`Lb{L~A0 z^S%HpZ1?>D-GT?$4Z2FgK96sQuJz`OQw$Neu)U|Ag}ia|f=tW{eD>lT_Er0^--J)y z&qr(q=C){KXW$K3femo&zK>3@%}c}`F!r5t30wzT{4M?l)N{Ou-=1A#ou7z)-v7;K zQ6JwshR>%Q!@wTo?eD$366+ZUv2vBSRtJ>o8%D#=6lm&Iv3{!cW4PCqci(#+|5$3> z*YN96En{*FK4UuU9|`fRQO^I%{NB?bHUZB+qZPIDyLV%;w)_7Szk52B7T;Ys*EJP$ zkMVmSlrPZ6SD9f)45Jh5e;GI8Wvt=Z`2QQCL)%LeLtaK3@4a-Mu|yDq&pTypWr^&9fCJo~?`Xk2Xi0QuCZ{5#?ZLf(u(Sa-ETn6KQE-;=0V?B>Besqt1!1te^ z!{7Ib?Y(Ik+s{5&f`;)5?mkG^Ex3W5(E;qop6y|QZLeL?34U96xhm%Qe4Ybq{4db< zumk2Q*7+2F4hF#9eHJpX)=hLLHxg?_413YR+nX_g-WJ>NCH9B#v*J5ZGyViPZz5-n z_I&JT4zf1hwwGB&@#7XtebUyHtr zHmAiumSB7cFPE^#XZ!%)H^9B}Y{zoK*!%2VHun;+pT}S>2U_Z>8?Y+AP0=0tBC!kf zQ}i3)+`-s=GuJ!ecl$5E94I-4d5?&(r_b;w;oXFrO5pRZJOX1eUR=ZfPmrlqMSqUr z4rjREf_@z}py+*ap1@hdz8iA-J}}iS~uVcVB)-zH4)QhP z{@>1Fw{Y(DJrH1xZwb_?@KoqOcjUb**2v^}_ZqY~G@kJR+Ih@(o(uR|_-tH}6y)B=e4REdYdn))oh41uX_j{st4qzW2fK}m%>SLTg@Y!=Cs>E=9=g0}{B+3~X z=lMPWOY9b|7qoND@jKrZ+wZonxq%ZI1hCc`-nH9P!q*hP+PdDwv&5bnLCinU3v`tk z_6B%Q>_J}4M={Rb#;~s$Z4d7876f*Owr0SM#k`-x`+R43#oB?LV~Ag2yO;Lie#>i* z<%F^RKNZfp754FQ$@9+urefarz&TR@bcf!ecc9S+>_g6dSb!O5ft>Ysg7IVYTt7Wj zndAEn@EM#+N31uGhG0=$WCv5$~d9S1Q(N)&i|Ao&U7uX4OQQ7x(#_u~Qp~vTQ5#KHFAvjCC zALoHNE9aP;ZBTEH-@eqIpS^VW6OeBN;@Ftidkny|mNAOYpL71CP{XxP^XvD796!$V z`TJiyN3K&nt$zaFmfWiH$8)>~teN3^Q3L1o^GI$%Y~`)B0s2M4Zi)BKS=ZPl_$T9fuAMc{k{Isk zn)s=>KknBhV7=`m#{2OABx;!NzBkxap5QwG@;f!XP31m0JCKR_k&yEbIMJQK2R^@} z`)+j)&JufYzh(suIf}jLI|LbcPF?iW>5s(t@6!(4I;3olJWg&Z^#XF$9OFEZ*QKJ z^YqX3C}4))@3UWk8^E={-}d-m0*s&kJj>iROj+87;6tlaGu$^ z#-m-IcV!7ulpdJFoOy|}R)%W}e-TbT!FTxF;}+ZcK7ZeXv0Pz%1k4eh+X{Gx?ZxM{ zLtDe%FO-;$+EcOL44i8Qj0uo|dDdS6#lD@Vi=no6{*D~uz@N|!+Oe^L7FYL%wa#k{ zA*T{pz&_RHjV0lG3in&kV*g0+`TO@AzQI0AuE`-0!@sw>&bY-Mi(~mG^yoe&*HL7J z?HniiC;b`n7wXA(qnw(nelzkvE3xj$Sgh+Btn(7>d5p#PhTIR6yc*;4-GYefIa|B- z8$S`}J#-H5^i=H6GjN`>M1D!$S^H!B4laQE+r}i$vAN)XsDFDp2Yi+9;2ur+N~)>R zS!;4me z3sA-9<^iyWrFF2I7|taaJO5*SBeBi~-z(t0jpx)(QU3SX;Ky8F0#1HIp1tqP2d4s; z!DVuD;hdwvSEa+YuS`rYjGJ){hVp-{JmYB}-jCk{`)J9p{G9Oz_&xVEPO13Jd~dx=3=J7as^#&Ul29VLgTzTf1SxNV7h zLyYgrJ`R6flQ9`sx19likeQnhx%H-pdS73ujH)-lKb)gFC-v*ZNc9*kRzYSdVHp9#4u#H~g#{$6sy zx-rak4f`YD*>(8LyU#cmzD2)coWNT+@6Hkg{<_B<_Sg8F%V)a32hAXVVthE7-+T6R zU~gOSE%uk70f{;RYTX_D60G1d*kB9ujhkV&XzS~x8(OV@jI{mr~|)ZUHK-4d2eFB#b;j`U-bv}0-w)T^|$z(>j}R9 z0^W6N1-?_k_A}-#=&)NbUf+$9)BC9B8Zx>A^GU4t;5yLnnZE@MaaHWa^E^hor~Nq< zvW=m4*M1u=z^T9`{O*l4lVi}Y4PWi|9Gtv&PWu<2G1g}Ucn%rPxqa6eyBOsY-S2~+ z#rHr{xVm<=IUO~X6vJ7$UTtg1&qjIXEExy54%g2|Y+utj@C^UMlII>8FJIv^X59n* z=oPw3Ux$I(+TXxOR2GfzV|-VEcV{X-Th_LRzE%`H3iQq%$isESJD#Jb(!#sP?%xhH zVj^7(`?rPrL7s6H=kNC&M~>kP16}0}bDDDn^!^cNj6KPVHJCBBW+JX%8{-apgZ3FR z?oYtGlJP4SuodGylm7&shvNKSGj{%6@zwgy<$7NL`-or+)ZXXX7v5g_Jm$DnxYuZ7 zTQHWV_+3kfKd76~jkX%Gj_YyXxArg*<7RN*f$j|6@T+h>i;EF&T_s|edkxoO>vw&X zH%2i|pD~a3hTlyZ>?(3K$6AS)k3bs5)L3=K?|N!ZFT0r?*Zz6WsLXEBYbeYe!D zF?Wa?OI?F|VT|W97Ja^>&XQDecIX*sgQx=EdA@^l8LL-}J$LuPchw0oy}&K8_wi-m znu4*t_3uphvt&-(_n;wm1MEEqW3bl8IIyj=Vtl~ZJN~5TIllMyo7f#b-#`24mT`yf z(8flomC$nT%elQ_p1-48#tr@|8QcD^gHON`C^?3CFEQSh`hidR9G^Wpmb0$Cj72U1 z_gMZV$kx>gc%uB#|Ji`Fb!HlszMB%+N*18Pmdv%3fB@yE}7}El6&&!$(oTB{?d^z6L zt(<&<_rIn7ni%hy^N%Gv2Hrp8?4ylw#8CH$m<;!*@Z&vwiLWEayAbGa=+bs_xy)^xi{8yKkGAKegi*43;E1g*iQ?pSfj%KN52M9dirc#E;m19sS-BcV<2*u1|5z{|B{B z(9S!SB|drYj(1VJml%GJaE_njPmIU8+CBqfcSc=n%t|d|t@D3^)A|M|G5pzsyqLbL z{z!fOU!lkI_qqJA?~6ad)tF$84ZTcjSKjk{MU5w=-|APJ>*u{|JWCS1_$g^8ocHY( z_1p)~emSWd#NWq%4S4q5B;R@Ty@Y!LW|Mq*#h7C`bQSmSH{|%|629Nuw=54rji^7{ z;{)crPFNl$U4E_LIqxGW1Zs4;v2>iy1w))VnJ>)^%#|Ga%agTt{?~Ji? zO~rfm95gZX9%%Q=yl;VXHTaYW>M;HS)IKt?`s-f3WxRu5qlJCw+XwDPOYB(eX$d?7 z=lzge_gi~~K1Rz&%|jb&E$_7Rr^-=y#(1L-1Tc01I`C7{#c;=dMZG?^oL`N%mUsaF zCFsY*Wb&NvCcZ}?80%|*b_3U;f7l!L4bP8cNsPSk?(G=Q(J6*d$1S#VzA3Rs@VW3t znfnsV;ZK0`HZdTuzk>TIaj(sf7$REq0Xf#PpUQc@is%0VSkrae|7CO+J>B=c!RNDl z05-rLP9;vQ-jM5ie&5}n*_vGEpGuD5caU%3X5-p55Z;>h*I}n|4CDLe6>b6N^RYp< za2eS9HLw6Je%CigTk{t73cW)A99#rT#tra&{t9T<{R--NhZ}V7LtE!t;@sx|>%wQa zRxtMYdInOlx9EVYau@Ch7 z&<&{m6XLGouj_#A`wM)&-%d`ubh0q>pup*_k6F+j6vEM*7SFLa!d5-dKepb4WImn@e-7Lq*SZ01iTeb9$9M?>-#+7?72gWqEo^Hj_Ghl&bsm5Q+r8}qTObj` zb7ajrk8v|lV~iV%y?qJV7<&iXIsXm!7F+~Vsr=V)b??V9@*+F`8Dd}cUiCem5%UeT z9|QYn!ukGkuCb(G1a8WqJ%dH*B{LQckXzyZZ13#9UthvGzwlm6CE#D-p0xd4Q0Qwx6wIjW_=mlLzf!b(6>B*EuM778{ZryP zFUbSX=m?}3-tQOi9WWL*v3)oE0d(+dd>i0A_W23^$H4bU11}P|jqe}er}n_Jv&K1M ze0~Eo)+o}&(9_TH-vcLb&TCH}Fb?!z(4PU<(a%GUHIKjy*w;_Z?=-Gcz9nystya`6 z{>%8D1J|+w9e(?^_8QDV1KgW$K?@(CihlR^9I&SU|T292XMw6P&1EW&f{wtzrio>8Fh>o=#LreON^KLf!dmiwd7sze!&dA1zik$ zjZgU8OaDyRUUrO)y^5WPb&uTN8{jQ=htFPouh;n!z6HK-l6mC%RV}YpNcj7?%=&S zi|^x!aUD}}Z>{aQw8S)GB>G;%8ROn~1_|GL!ua1MCd-#QV2pN!_ixNq{tNu>ZBXZ! zex`l8e$S?bw~u3Dr(#|ASpM9EuXDEWO-wU~o~+-&+2b4I&XA11uCt9F2b`Eke*YPF z24DNAnT~_FIXM@B<93vnuru(Ctmzr6TYT=3@1nVLA}NOVP``iJ#$?b4#M*wQx;F>p zxW;-P7uW$(47_7|dIK7K`Wt*l;P3dH<1MK9u)Vy1a~(^#47^j$RmFS$E%2Rr3;29C zQQ1Ks;`5&EfOAbnpX>HLKIQdofW0R0s@S!Ld-oNvKVy6^%(RO{3^kwNvw!zH;j1F= znmhDeIOosUrvm3QXieiCeUW<%syKI|z7oWEeqRIYSFw)$JO|FRW}Kq3!@F1i72v(mZbrP3GjeX?7yF~y zauNO<#CiWjOf!mcFRd%*dhK&Q;@y|KAP0Hi4z}~1CAs*m5yUDh?9a$?k9vvW-tOaT zvE`k=!>-~SKLGb8@XyT!89RZia0j6G>nraW^%lQ-Jf6?^uH^n6+u8}Zj<)1C=nZ3W z9qtwQ9QeCXf>XK}&fzA$U5UMb-Qure?W0n+`f?0+);sboSi?8?#`nX!VeVDX!38)W z?$3;^ml+%5drhC~o9PD$u8Kb6m-^WcrHkQNd4kXH&uaIxpWizQtn&?=_ssZS&@1D> z9N7CKa1PYk4KcM&5EG2;Eu+sA{p7y@eIKKs)0+4`f%7Yv?tr{!)5lP=10Pby zc{+5J1!H}I&zu&!&S6XnfY1Bz9WjS!HhTjK10Ec=X&4>+IuJ{F&K6MnH}{NHf*fzPvZ%|L4& zc#E$=_dq4=aE!FXSu@llaZTs<-t9?_p^q#0R&f10pFHgjZjKJnf@AQSxKBU>H$$fq z)2|P^%9>dBG~-)f2U;=b8SqZK7T3EO@!qK;&;avNV57B#`(`ih?^9ylqN^BduP4A> zFT(fvH30o7KA%hZ6&TBs@vXuy(d!9sy!&K*`@0K{u=_JZUuA6G6Kw0`AP(5Gwd>r@ zukSmwu^lnOI@XgHzI)|oU<;lz&gc!ehwWOGh~a&`!Pnu_@BU=`4cZ#_<$!lR;qQQR zTm=jGd5Jeyah=D&xfN@;wuoV0?4@5fJy)M|p2xoc<}JY?&@Vg>KkqtfWN-~z-!Yu= z`o$VM1ADM9#ktzRU~K(MATc)Y7PfUnXH12;z#0iyuS1`JCAi7hep=!a2z(j1R{J&X z0{mqlU)M|3zGr#;8}uPDe*rCH#Ts1iti%&26zj% z0vphR`oEQX3C>>oT=JA1yzh_K-~rH{;adRnBM3sbX#4yNxC-V#e}{jA9q0zA!+2o4 zd(r=QMe>My*~RdC$3EQ0#8@lvDe`R$Ip&>%y8@QPCj1##`wqUFpaDC^fxn71guV{6 z#3Xc;BjWAZ`R}8xVSE+O#Lr6SJ`X+sIo^*kw!?P_r}T4@XIw96dHwbq#U9Ty!=J$a z%{uMrEb+em9C$CsxivPIJlA3!5tCY;qjAE|@iA{rbNn5li(2)ac6}${ExB<9{~?@` zV|YHSb=oVw+Oy|X`?J@vcu(X!@2R91o|~t{WbCn6yTzxDq7%A`{yP7fIoEr``|v$J z7=aV`H?*19}``iuS`A;QcnBVV?_K_Hm#eVJ;ZjOFWVt5`ix}~<-GjGvK7yNKdXyH4+ zIbQAIA4?3M6LRA2lqc5u-klj*sb`vl0qB7HbPFVX$aF938eb4|mUJ~&Pe9)X zG5YP({dTUV*iX>bv7Ymvu7mRoauj>8&IaDtCWg<|ONXe9>*}zd!MQ(U(f>z$E!sH~dMx+g*1$d$>*f*{F??tG51uXYF>$HH z)w|d*Hpg|;xW3TnhdsGQ`6YTR=I!*Ml`hx^>_9glm%8rRSe)M+@BgO68{4lDZijsb zu8Scnp)WI@<5!N+hm5VG-Pe}4uf;oYN8(OYyEL!E?PF|PaFFqS*S7r=8D#`%oOoi)Gpom;*UMXc){*L}$W z0qT0a^KvJ|y(h*1Inn3Y2m56HSoA$9J)ZibSZMFhuYqx$eo@5tw)I`B((l8lmt*YP z#PovgxrjD~o&wznB*#$4_q}=5FE^Gy!8hV3WJzu|e);GPTM=>yj_o~vYmR!vb;O?(-t#u*IjGXFmzV^s*`ZyFabwB&MFMhD-dKG;hhKs9 zs0X>sSpF{1&M~aj`Gs>|fot#|VcYXq^wn7Fd=C2FM?o`u7r_tU8tCF3nX&KVbDq#I z#sb$mC)&BDe4Tp<=l@Rr&X_YKV&LN^_%;5&Gsm=dOIh~>{;XVk{~ow*8hPVIs z$=eB6>$K$AUwu}MAB)f6dNgn4>ij9nTF^fw&-R9M?T9hYb%ZwXKHUL+hwTbKgZEiW z`0UHxGn|rQsNuQ20w-|Cz;hEy#DETM|MCeuBHri7`4gP}tBjq`vGBaT>whgUM!SI< zOD??M?R+lByfr?-cM0^lCGiOV&++X8-`(<0@Z}f+)UMkc*VpL>{bw-xbkEsCZP#X< zXJCnKYz7^+`*|5W1P#75KKCH718w~^uvcr%(T9v(yJuo<5UcopYvG;4y~@BEZ46`Q z2#_746I_R_r0CUqKg>10L7ycH{O-|rU;*rJDmlvE>lpJBb==GL4DKm8wRTILgHeog zy)OJMwBOwxftI)ijCJaeodY{%3Hv!4k+HgG6qXz_#}t{twYBV7(T%A*Ma$`5<_n%_+G-vSA5Iu2V$E^Q zOSJdGp8dY=Ue>iV#Cd1!%lNf90x>4Vz{$%kfa}QkJJ15>d3n_OII!3UaNq9@ z&#yV-JVX3F#53xM+krOTkI`R6&Uk;%981P8Jm2YFH2BSN{Vn!XJU@B+Oz_kGK7d!` zUX<9I`WT-A(><`xPHrMAd~zbigk<;%-p_mQ$aMZpyg424*>LaQ6a4btm$$(6jB99T z_-FWE0{7>19{dgHzzn~7iJp(<2z;0KnjguE81I+Q_jtYdMw@*dGQ0h>#tJxO#MgeM`Z?`7>gFT zpKrnSy~2?bjOW0bnV7HOoM+lY182+^@XtYJd@9)ezQRwX_v?&dp6|$YJyj~NUf_4` zAJs3x_8Kvqz4a9H#&|}3A#2jDHPg z_}#A+NQEDw_=)d!iAmVT8|V4D_jk}I`oRLoZ9uCZn7abb-vMJ<=E!Kj_Zj0ITr$p+ zxgGmCc?>6i7u&J9VGZCqcLguttTzMpVUKe9#3#V-G#z;X+?QM63Glm?wWc!1XO3&N zhnBo59ri`Ief_}iy5EC({>HV${5QUjf&DwrRF24%KsoJ;;ssLEC*jA+Pq*jOK9Ptb3K1C3Z{xSj>wOZ>kE+J8+_(F{~rrC-iJ(# zXyG&bdC-|xq>W+yzC+y00G{!J_ypJQGum}@=mp#h;Ga+22Gh9T;JX2q#J9x1C-}TO z-PBKz^H|HX*p;|*)LCI~fop8c6ZmfdpF`g{^5*{q+xqT_c{9fDW02!}$+cU@eRLlE zRTAUzy*Xi=iT8P13C0argC%f{&M*4d7;MjR0WXYO1LYR}BhWEUG0fkusb}B+oxFoz z6YF`5d&>Cjq0aj`{H)Y(;ryI&4taad#w#(L->>oc3^;F}XD{rVqAy}NGuOHUnekYT zj0gT6;ytt%#TxFZci%mCe$TFnp{Bg`TgFTD2JSov#z~YO+|!0}75&EV*Cfokwx(UHbuC2d{v&dWoS|>wSRFIM2hm8@PMe)|9t5=d#`ru&;-XiK`OW*0Haz zKw>-=^W^;fe~xXtBH2BQF1MG2S%t&$!_q@gL-WgZV%CH1)PYdALPxE)=IKR2h zbp?BzZ;hbF9M1Ecim~>!1`A@A)|rTY@5MfN3a0f_414?;g1sM?<+y>im~|(n1Q$8 zb81*ixYjj3`?8ugG#@veCX68H$ty>Gw*%z*3pPyAm4?^ndICrKO5T;F>cm_KLy zrugl{^(AsLJ~^Mk4Z6ekF?I{IjWe&#YwRt!`@l250lo#EaU%Xy7(WNTzvRz@81n=s z##`!H-+dKJ>;}C7Yi#GejD3K%j(ytm39vWg^?T3Vf5%ni-B{hP@}Wruv%dK2v6 z_R%M3^Nh>DJonH2b{_9om4J6$_VX25-nBINMFy=JUjR9g@Ht1It=|B9tMlq#Fg8cq zeYpx+>;#Ð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

9s*mOcBq@_zgbjIE8KwtGJUu9M-aC1SbXfP28W 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 z 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̽Mi?cf(65t~YnFO(eP_p|Gs)O`18?I7^;8c*l~euVc7TkoD6 zIrp|iKZpAkXb+tHM10*0N=AY2x6Ua`vLFDlK45=n0dZG*0k^5*UyWT7sUN+ zmfw&sH}LfAf%b6z*c}M+{vE79kZ;T!wV$i@5m$iH1%H5-_{Qy(@dK!xxkGzCz5`8+ z$$3Ao8^`w^TR*Qg9kDR4&U^>%P#*X$d7fS66SmK(pbIhIJ=gQynE`tmS6V;gp1n0b zpHH^-1V{Lx`|#2%7!4g%x}Z&Jaxm%K>iPsLfj0#|`^JHsF`u4~N#1pcn9$(Q%{ zmHR2=bl`Ol`+*hk3_q{AZ3gqsiCcGpPVnX_*6rc{wZ@z+f;dnoAn*DQzyjWR3UIwS zFh0yeuD&xK6MF`R_mX(y!(8}|SO{%!(|9|RguoTBfja}<pj?%JojzPI@k9Z`7T{xUqXvSo^yVI{U`7V@VOXMoZ}qZ*{vNU-pnEIIb^T`Yf#`5 zxCiHq!yNd-J%FEsj6Z{0fzQDA!1F7_ojIw&4Prgo&qLQboN&&Wi6wY@Z)#tC;W^KU zT}D3u{{Vx)72rC~?(>v;1-cr~=tbqfB<_9u4OkMhZrBUvLt@WBCf`_#Lk%;yC+~-| z9$OpZ8uqyl_Z{#Iz5$*?s}J(*dqQ3hoKLvk+&)Oe*f--FI{=$%Cpha|w*%(P)XXS1 z0NV2z)E&o2Zq;eBayEa8iFVAyxf@tOL}T+4SwzQ8TatGNjYVsm)+ydmD> zTjLoC?JY2`oe5>bcb+q>;YzJ(>&wrH+qXk|XFZc3PsuUf(T|9K44k#VUq*ilyn~*X zNWfk_I3Vud%iPyga*W?|-XUjw3EHgcbNnBuvG)qweglv8Y){aCM%(*C(9^GpwzDf& z;EsUzc}Xmy?g{N04~VN*XlIdE`WSl;b73dA4(%LrzEfLJ@Y~#E4dQPF=V~G!nf; z_J}$61$@MKk9zb1zsU@H1v2s6G_|SbxWBK#8b4~R)mq~{_$wG@w}-U~xm#d=>#R3_ zD(=VsZpF`%fNOVV+CyGkuen2?wgxqYzUP&57W)iR*VSKOe-77SXK)pJ3GC~$?T9JX zC$Iqzz#(;_15053inw+Taw`J8ApR71=Sq#MGk(&C>-3r3oKtX@*c{!qU(39=5`U!@C5!3*N9UEi76!p z_2v&a^Zo^V1QLGRuSqj&iC&ssUL5~6w7;?}7-^9D)ecVi9jmt59PTOm>!`~qG zE%4k<<;b@2KLC~Jh z5%ApCa2*KZx#p@@z<#cgj=!reFPo@xga(JK686M2Laaj8Qz%v-BYfyAg;e4?)Qm$ zjz1OWasCtZ5)^6@dYBI_pDS-)KVw`g%tOp`M$g&zN+WypCP(!Wj^ysN%xS26@ z0ClU`5O>~EW3aEqS^RsZv-LrlJ*E=ld;XvBPr<+wvv;5i*iy3su4BBfak=CD@qPui zVyua_Yl|gleoy?hU|-Nz-m~8VXLhe0oa;5|hy^j>EI$7)$bSzkuzdy{Ttc^Xe}uDN z6XU1A{aykoDo{)EynoT+#9Tj;&w4YAulOKvdXoM%=ULiDf~o$-wWA>p8!5N*Ci@+Yl26z4 zh^o&gYdG7VfOn?IPsDR-z1)X>%V}|Sj!6;rs@9#Ld;GSKJ#ue?2cU^PkHG@WK$D1Z zy)SD`#!trBYmW}#vvU1Fx0rl34;Ztr`uhI(d(hm3AHY4Sn|wl!=d9RA-`_VWjEv`7 zDzD$i$gj*n>|J6ohd;D0!}(6eBra*+X>VgMsdwHK<7b=v83_C)1$$FxaJ|;&F?n*r z*_96dE^%{wzEd%_u6?F)?E|<^L5a5+`?`N?XV${^z&^g8o}KTQ&qc0)b_av_oOqkf zd!TR5uE>1|dbpO~a)KJy_s(?iQz`h);97xg?NE=sB7P2BGvU8WGTcjQm*$8avDW9| zXX{&hym?1`_x}hwax?K^ee3{RVBFc8$h)5Ra@KLdqc&RXCD41(|3gs8DOc8{%} zu`j@-{qcL~KH7YxMExGcci%p5-(TxpKj6hFzTZ3dzykEdlrF~S*~5G8fnPwvmRq1b zlMnW(K_|6*75D6#r@-7-=np}Yj+pOMALBaaigV(H*lJZgU-#LRcL zgl^(_+u!xYfm}3pd=B!z0=I$tbp~_Q&M)+R$2VY!J(U@Li7}qhqDhDS-}~b__HZvf zv8i~E?R^M*W_iMgHgyYdA8xna{dgwsa|`AbJ$26g49@kvAD60aO`fdbS-WrZM5?vw z6`Xx%HOHPx#<%A!a0LW@1OzZWC=;I6z;qC(06&)z_@OkZlgl}Ge);HjdZ$KeOm^;UxfgWDH0)FrP z1U?4ZnOK6)Ab_8VKC>Ue3$TUvjvRvp2y$McjSuUi|C78=fq92Oy#$F|pOfnd>n?!3 zoXwbLaSvPv*0_d!J;UDt&%n4n6W9Rv;X39P)+p!z)|orkr&d4Uea43%5%*jQu%F*q z4}kn_P{>WdS)B6{+C1YTPqe+fbIvoBj+{i?&+}c*JkP*0cF*puBY!wYNn}OrZ*acf z1v`SEsABFhaqFFV4>akB&++HzK8S))SLun{TbQeMh9>rYRQWHfw%4w#hV*Kg91a}KZ06^%>y-VN)ET%A4D{Ek=;)UBu5nOw)uy-m$c zRpiY#$G?wkf&J~7h>KON3H0#Xhy}1#?K|_Yps%sEcB=9%oW1>ivu}@nD~Gx*aqp*j zVwj;dXxcg8nz)zu@O>t(pJHSJoq>1h1^5W~P6shzf4@Whyjjx2SgPpo<&1eca zuG!={c`GoV#2ROc@#pTmEL{RwDd zJQ4T%;R)!lr)Sy0_rRF;5-nDs;IGk9eb3=<73O=!!aDuNc|HYyS7x=3&%@_$U6Vch ze&XA=t?Sv?`!;BKLGBg&1wHSeSLiKp#vYx~)+Er8Tfma|4Bz+G8Bg$yyOw9#VZRn^ z&&+&#*sCMf#5I0T%x4{F=a`CfTJvjg2In49jL)>gcisY==>^;?FswCc;u<2rxA5jS zxr+b58e*|ugZ1?jkkg*fI@6ll61~Kc5C+vrC_8xfrb>%wjAqMZ~{4w#Ue6DuF zKft#B1Z=<&xqk(6O{~2^%=`ShwvlMh=n(i!{{sy3HJ-TregN&g>!Oh?1Mf4izq6S8 z3N-QgI-j%2--NTqcoS!LF5!%>FPz7GXR_~>n6(l0Go$8QhV%WLgU_)42oAssBx0_W zsd|TTjFwaa0AXW_x=|2b@W5fk*CavIj7&1=h!~O1lm02-G(#PW2-&iN1)&vn-hDE zudVou3ckI}^}YBBd<{MXOX4lB!@ft%+KY{9+&pJO|_{Zb4i!(2VKGyDF!?grlb zl50-jyPoS7V)oOYqo-&1KCx#&&U0Edo|?Yad`Wzb?abDja|~Sj1@Jr<_yL-@hBba( z?}2Ne?C|DniMh5I>RC5|Hlur!+XKeriaZG5{yaP9alJVh^3v$vggYbFlk5FAXDS)r z9QTlbeiQpxdzbiaa2e?5AVVN+Eobk8=RnR1Eb)Er&Yg%W*RbycXH>cvKVMxx5%aUQ z5Sz-J*hk<5$h%JL18^IqPb3BOd}4QF~z z{1{}=!DZll+V=1E-~J7ih>NU7{NDTvFn5r6GlP38_&xe#FctUbJ@Xt3InnA(!nfxa zK<$jX(vcIDH)lAPNs@dImek6Nmy)k^)>1&?7 zGqD@iqW#>-*v~;vowK^;xpDkN+*uAm=p!4r9yn7$D??v;cQMxWXnUEPu#I~UPVfWF zje|^FzJMkEb#h!YYRvm}4&-~#feZpP(LN%_yJC-o?|Ht?!M8{3kMH&=w$I#|r}6=@ z@4!RwAxQCtol&y}g_ym1@VcIu@A_lVV>?GeXP`uke;58~e_YqSYoD1nkzWyW|1ZHY z*iP0k*E{PRkI;wc0yaR-nj~W6)N6d#@gDpecpq4=7;jkCSRdnaac{1lh4%$`&peat zS~cHuw5Ky))Y#Cx{_!nw*EoO+Q0V{q%=88PU2wJLb>s+Vnu8u&Xp0qSdq{}A{SLhY zv=h0?5q1|C!1?6&K;W<8e#TybjNfKzd-XZGRt5!L`w%4TL7K*~#=TqfU%)d9cxzi< z_x6ABzqdR0x)>8eZN3_8u-9OSI#T=P18;$5}9f3Dpm6Yqh0^BmlVy|3eY zkL8?wMXU!aVuAKvEkM94ImYi6zq`(fD{?QZ-C_F-<;A+j%~R|pT%)Tw{vMs-x956@ ze+L{BbH0o&F_aJUeNAi$oGlR#(19NKtdE2oFrGjGZ6^I5IP;JDz!pT+5BJCKnkBxy6M2`2xtDvuxq4z#xgh5L-9vyjgX^al=QF3rZfl+6 z@0pK21~;(n@0!jy2MK?T{wv!4OKi1!8J@TO5#KR?XScia2)jwk>*CG#g8Om32f#Tl zqZ7Q6W1Q82tTl zKi{G^M6f)PWWD zoY)p^|5W20TH8L?;N9nMfS+rgYnDg4824}92XL;Vt=Rh<1TbIy9DW5l>^V3BJ)Cz> z(OwZ7&Io%UFNdw1;1^@&5WfM8ZS-TT4RkMvbwJ*j$b$3oxePt(`4!>`1n@2t;B)c3 z?tvM$dTwgCJ*J^UUqA z4=cWd_dMqy#W>3!umfA^W88!DI>R?`KLGEDYZZ7UWB0^ebMRyQO=!&mw0RTuRdU=* zduHApdA0fT$_-ohGj1%uhjyalhBGr{dZjoVh2H zT5~dS`yYs%I{5;hh<^n>dk1gMmfA1iegwmQ3{EAuv*i2)U(kWC1h)PPY=Ax1=p2&c ztlp#N;5P6x@l#;#yyj){oZWM`f6F}~mf)0#aUXw#e+68xC+7Ql4K#U4{3*V*&(QX> zce{UqZA{z();G=`&h(`6!}m&ST(!CP;ky{;d5rCTn>d%f-Jf{@rm}}`+;egt`fo{$ z@5F85)4ATtsp|!~!`k=-+dHzNuE(BX`)+*-0zU!!8PC{Pi2n_o)6Ub^}x8bZ^V|#W!L*rAi&S&rfuGHKV zH3NN(*e4*cUE4hx%is{(cYcMISM0aNcWu{o&wUU#2NdA_9cbxj59i$>)O|u?0FZ=v4b2X$9UGRdk@&x&jR-x zaMm7~50nM^Iot=po~K|2N{sK(9}{Ud_Sxw~xKQK;O|eUd89> zezxE-uxE~1k87_-#Jy8K1E2k6V1MWG-(WiOl|IIIE}`XJ)7gB!2cXBc$5b}>uZY{r zcdkQ6t#5huD#YG{S3C>n>f+6u15y8QzwR~Q6By2-a;j@^{{L}(Nso6*Fe}`!9`;nM z_1*NWcl(+bwYU9K7|Np+%lnM__+^H@JZI0&{@(F( zbd!i?jc04G2jooUWBh5}l=C@T^FPT;YQ29s#{M1o9d?tqo(FO7*6v=7dG=z}>d8&m zdvJkPJm-k<-YtoH$9#4ju|d$@WBY8tSJ(yE$2o@kik<^&7U(4?K--)PFsJ4T@U9HA z5^G{!NBl>y0zJMncutv~_73zp+MI^7$|tx%(8t8Q)9z~}503HMc{p1F_DsY-0rqny z`^jbcv^9eGuR#zqo`5~RC-ylA>@Z%X#5jYlv-liu0oR&}^UaAlo4ra*+3_>o_tSU4 z*o=eA!5pMd>+j^2@*;1l3X zzYt=FlXy_;KKvzOGd)20w zPHa*07uvu*JOW$n8QS_xZq(TC(JRmsvuCa~o{zTi1lk%MwzU@^;HRR0mAHGB{{egk zoPR2FeAjxv=K1-XV?;qGU@y;P3*1w}pMeFCx4-M`N``X=dCzbvnc59FF^=wI?5Ulx zeo1)S?l#kE}1&o%Gl8vFJ7 zlSJ2j0>41-%7)m-aJkk-kRcFzIn$5uH_eH0_MTXW{aWy!!9NG?>!ji}uMuy57g=wv z&-jcw&&Qm%1m8W$`&lcmJtH<1XZ(uzAAx*F-mVm4<}^8|eG9P_b~`t9o5|;P+Zxb# z^Ic=;6=S?ZE1qQs=VxUKBX6Wcy?5jU@Okc$XHACdKmeuf`2fDHJ2K<_zeL>6r2tdu zW31iQo*BQ%tgiVIEq|TbyTF`t6Em`XyM% z1web=uJ2sdtty}8kuJt{t`K+aLf$L1>v%p(eBX6-kZZ3E{xx7v^#)zweuI4rm=nPF zZMe5^-XqsvpcQ*t|2{GA%MWOCrm{!u&%n`}ljnwihxiTPyw2|0=6MHtVu^fZ zj_<5F#vUDd$S3AAKL)$c#9prJ98W-pzk6rw-O+3KJk+U@W1Pjg?twM6O`OlYI#UKe z!@CFP3+je7h%al-A=(+1K>MBYj`)_C&&qRfJ=az2@474EuIbtT2XKzYr>J@8Q*z~m zeR^WM;y&%=8EHQP?oW6&_kri&^Lhq821jryM)cTijRa?(=~>?*CjSCV<86*Jdx4YM z=eOkTis$L~lYM6I;2%`ZcVYLO`xw9X^E>KX$9?+FuYvXLtmT}yi}5$*Ib2{Xeeeg+ zFTl@_0`!fW>v?Bv&q{788Q*n9J5SGd*c-8+PTS|_`Ppv{+WGbHm+?FJr5w5tOTbyo zKSvw)?Ao)>@ICN3YX_X?YQDWh5LbLI*NFSMy{dd7<_x0M`JT;)H*r1R{m+4Y&ASTv zsPn_0fCEs7c|OjwLa#w4R?r_2J4YK|fFLehyGIXuBxetN2-<8|B#wLjJ@K!=4S8Zy zY3q5$TaYKbu@20DdDB|gcRlZld+=-vwZ?}$Z0n5A$$1FuujC*F6tEzse{-K0Fh}2g z_<0<)CWvVd{h{sc--mxB=RR;9{R^~bxdi6U(Fxx3Kf_)FXFdd(o=pzT2k!YC^uYIB zu}>dk-ULwxz4-9cw0Ni z+Zi+Jj(~jGskir*n0xb{Ezob((`!S_--f^VCyIN9_@YG0`Kx`fs=P{!o6*# zyovB15bNOW8ThWz_O4820dHOgt&jFp=H$Fj-A7;n^rvE- zGv1Wn;hb51crJ4BrqWrzhno@ah@YbW72oH*#9o0Jc1Ev(_s~1!`6lwMcNTLyaGUsZ zxv9jsXV+*wgP4+oGc_NsiLsSFn8Q5)iwVEME}$cCsKb6tj{6T{&g2}ud=>ZQxo2SQ zTt6C%#=Zsj6SxdI_-?}Y*q4Z31#7qikSDx##uV584BsBg30mIoMemCIR1S&R`)lAn zJY(%1-NpE>Ij{3A(Ocl>Vn#Qy|7_yh&ps)}bCK_`r?Q4O&)?j8AXnb`j^V8F_g@0H zt4`!}z!{Ff60CsvO52;-ydeGuYSq??mSbPn_zt+f@|wdwCiX4xE)LHv%y?Ve^YHhQ zX*kBSa7I6ed;GTq-`VGI{=0_rUqKri)`#yv2JY(s?h(k??-K7zn>(oa3g72w{02zG z0(4+Ok2Nvx!3XGnf~K9Jkkfjp?P1O*;1}zY>-qb+aEgxF|1bEiqhG)Qc1B+#ehTc@ z5i7(p2;k?Q@t;A#pUNS*4~RbluG6<#<_mIX)lb;2tKVUl%IV+VA3vL}qdn6eZeDZE z`<%Gzd$09>A;jK;^IXrUYiHE**2LtUbqk!)bv`{iYhVsMlOA3K zwtfK%xI4i6VQ>4&yN|Bs_Smj}f_AU}00-Esn)3?ZSu**4&&oS%0?(^&@0Q>8r{2PQ z56n{+dNe*^TjRQG5Wu~7&IQ}K-RBwhOHi;~+ZhwJ3u4ZF3OXQXuc;gmy9GW0u73e9 zmK7b^wVkQZQ~MlvUUT5u_VwOB0G^Av9l05J{yi~2Ys?GmS}|XNb*kJs z++%Qpul*s&@YeU}kMRE;Y=C^Rc2{ED!<-&B%t3pvR-lJVASyayACP0Ohro547!#L( zJ%XA9oWAFp{ zyBK@y!JoqqJ~8WxoVJ?WX|4Ii9PkADHt5W4LVOK!jPF4YpTtyRylgih#P zxgh2pbNxl-hx3W?@63Mx$rb!0kbx(+&FuNuV+N*Y>nuJmXB8=|9>u(f@h+NYk7=!0 zLF^ki*Ez)Yer&-YF@9gX2X{^^qg|sX-b7o-AGNwhqFr-C-7~N&p4tE6?;7Gm_znIE z$T2>XHL(?N-||a2bb-%c(Co3v?%s?q$hW`G;K2HJH)D*+eM^qdReMEFz$qohHQkq- z?}jtV%T1rP_p2keg*PY3BN4>$o!#>lKEoC8tb2HK3UCeUJ(p8pyvhCj@qYEh+dikf zb(BEN-eXPx8CS(tYMXRL`m9};^H*w_DikCWQBC$9s8 zpnnU0qvm){g_!U>tm&{bu%Bm-+iT*;vyg;>{lC#Gk>ZTJLPa-{zuV-$rM2YIW!j zhzot61|r^O zjl0fN+PiXA>&!XDZgG2b;K&%-b8I<5?DzOS4>@aG|B%=U-4Xj%8zg+|3b8O3B!O7} zbbtJuo?%Z#-#cV&j#|q)#!rB8`KzFZH=fbnD`$R)_RNiUwZ2C$s-KW0_6gX60=Fx^ zAFksb+PRpcor87YJ^^d_mP5P)1$Y(#?C*Q#too_uY_ONW&jHW30CP{kA@F(l+}hun zI_d%xkbv*V2K3m&eCPm8toQl4k7g(ABVw*`8QZyC(|T*Qt+BW3I`4|4cg|@LSCIkHB*Z;tAfFop(XZec9(@ za1Fd9ehB)S+mkPx{Q_iBd$@+Rd%%4;XAhU;fopF-F$QOkdCjp_Kfwi{DYevjV) zYt7Ht?K!D4F>?>lSJ3(^P{`{+fDWVvxDWTo=it2dY!c+0*LwS$f?+KZ&dJ@@+)Q4J zTl*2*F?az!1@1k_83bKg9rHebx0h#>;HKgkJSBbu*rTmyjx|?70MBKZJI1}4|LI5{SYzDh;@MfVoYc*U9|6x)-u(u(+J|5*kG8HSo+c>Rg?J*zH68tNUe`CHI~S=IKQN*8!= z?nlnLUkEYRoq>gUz`w&j0|7SpUDP{@ZQeCtjrTz)ImR{a;IGKjFTnNJ;8(<#U;#S( z*AnA7T6ao(3qHbjorg8nk+UG4(f5g+gD=5NV7!U(pMcsKr()ic*a5I^rVsjfla;aC zSv?|W+Ph_KsImV!+UGc}w{{NqEm&iVOi!Pmc`=F2unX{f}5ty|wlR+Gnl)92|iTehKGn&f~fPJS+FvVcXNXCQ)lniF?j|hr9N!INS5e*>fuP zY%@Dg30PtoEsn82AnsfXZ2iU+cw>FdJI8iT_uclMkW19MhW{Qm#K{lP#5#HRw#H7; zm{FT6_dXZ|KLckn=KeZ-C1Y=aI>k7f&&T?wz_kwK>$3@R?h^k2c<()L&%a3z?>$)% z>#$!7b|H2K=Ur<3^|BVn?&t#hu92$4U(u*V(hsj)?+uZ?$^|q@4VNsU2iId9Ph|Q z#e9c1_tAvU&utyHnG<3#$=q7=!?_3+;^YGbB#hz=hA|7(_hBdZ=3u40e#JwGXf$P-`)IF?WH-yPS7`q=`YZCfosXl(e7=JSix`N8S2mAI<$DT|K@XR zK|B*{(qsPxUijR5c<-8GuLumVCVrc^dA|ZTf$LBAQ^>nVe0ctFK9?=9=051*6Bu~3 zalZ?H0PWl|@fZ01-ZFj-Bw~Z0m-yB_0~voR_I0KU5WqWfQ0<;v;r`Vf__zIWF3+~$ zD-q+f^j^4*=V9MrW_a`L`vA0=2@lfpR@Oufq5@mrv$#!N>(w%x>376kufrBoG2i6Emmn zd5!Hp&cTQ9uIc&MYX+Q8>0(gBbNZgRy!UMmn)vzt2OyVYJikCInLa-gcR$Y5&a%XK z=ietLTtA3ucj#XT{Ks&^8a4NI4!+On4D|74hB@8V5{yuR?=aBa`Ro0Tz8FL0`uI@unxV>v0uSkli`dz z>k@c(28nT2&ue#m`3~N-0^Ymv7!3V9>naf#paY)wKY_nNrt_0AyhrZiC(y~0A7Bu) z=e1?61=tm1m*7J#MjT=fKKcZl!5^c&ALb9wvgU5_Jq!2X3}^VxTI8|alUhH(3QqLc z?nB(JG1tt*o!35xU<2Cv`la@HkDNW=9e4-|T%hOZWAm^d0Pn#PBsN6O5v^G;W%tCxMndu0- ziG6x}&tg&gbksE|*zW5;8i(z(nTk1&h&=&q9s34xbw(R6UHPL`ZodQWfCYA< zW~ilpj=uqahjSLs(^%^ftoj@D3jRBAyJ9G=e|QfHH4E~3a0$Pi^p_b;PFP-FXCl27d+x-rmA_ zOYP}-DLKZz-VI|bumI+-h;@~h+ZxBW#}RP-J#uy>$Z@Uj)N*iiqF5z5|vxZ0sFcB%bII`lM>@Q1-fi#3N8lcq$_&o+%`NBvO^p4O z{O>`JJ>|?X=I7c4xC~yeO?6sJmh<~&HW*@If4C`m`EBJ3ghaJ=y@6qS@+Qxhi^5zG)ME(lx zJ+i)7S8G$1o5cTb?zcF_w%1hp7<+hD=KPHAh=~jW41$&~`@dYnxb-csS`?4pEAnT| zxhvig_v~};$(^Hzy;a+uevTQ>#BO0H>?ZEz6yH61HYvt=jSu@IHiz@-hcV=fzT<`4fD?i+-Pm#QX4T&=I?)_1Y3=d;|PEY2ZD#>%@US z!`}c2eQa~Iui*V&v|n}Co5A064DRbO*Y>@71R{Fs{2#|V@U9~gxnrw*i`GR^igzua zfdhPobKHU3a4lZGg=;b<`76cZdPAXc1_cO%LJmVHxQeEBL>IDV7yac`kOOW8il6m4YIG+K}*j^j; zk-4}2e9(4?-J|bB#<#$A#R0I!DVV7R_23+@z=y>4@Hb$dy$3nYeOvO)a}VmSIVJY& zPKfPom$<_(fOXaC{3+uJI0Q@Z63zF2My$Es<-#4oIrkXvUQ!JEcAa4C{Cjxs*7eM7 z$;rTa#&f)V+LQSmob@-v_U(C0fPGBh>VB^?{uI20Gyg6~%vEpk@_xUr@!s3Exlhma z2pFe$KVuH(-&LNAd&?tzi8ce){x7rzNF#j$Z%;SCoHzmd%H*^_E`x{Y8<0Q)UvsSM z*;@N8aBO^@Q|`Ql_c!P%@cnlmJNU<7MLYpPU1QI935=hidwva?`mFGQ_pDq?Z+Z;vo!bK5b-Nh$tRVMm=5$3nPcA`@;j`VpH|@nc+BVnw2>x?$GOFWR5%01a z=WEgb+xu6{IRZ~WhVQ{V&Aals*axof`=w8{PM8p}6#k=mg1rf+)?jhb-E`WEr z5^$cmns+YmIeVTn(2?5!*B6gK%lLdP;yH6af%mzy*4P650sNV35LYvHk9WZo&Dy^J zo^wXCzGpgf9=Hnc8h1c2Zpo?E5nqR2!y9KX?!)?jKu_@7W}fTp@cYMgE;4hh9q~@x zm`hE$Zp7D&2Cd&uA*`P+sP8`C!mBT~bZfh|XSCg$cjTGP(L3_C&CjiV%_4X=7aIJJ zV0wX`W2iB%Q)@J(XSHstZ*#maHJ`h&oj*5{!Lx<#9*o6%I@E8dvjE#XQvW&d1KN6P z4K>a8$og#z`?JQlj=Xq5jTw2p##kSW-@yC4O^Lt2FY)I_yoB>yeTOF?!PPYmh+AN9 zzQ2AxTeI4P*zczXpYd7Gx?03g`+wm5Z(Ucw3CQqTUBfl~JI%a5fjYnU)N}o3@IL!< z>j#rT3w-8Z!n?lbBzKDUtk3Y@;{OQb6Jyu#bM7(-IM$={& zz&RZ?rg&?wzznqDH{{;~*T4?w$VZQ$x<0+`w1! zd*08M4z35e)^{yyyg{1-xkQe=s?CA*chNoo3&-fQp)k5P_w?mBN|a^^QN+^xPhyqfdRnBz0Aw$hJkx@Vv53|!OmT8#9L zIWxxBiuMwp;gZ0-M}NC5@w<3)tEP87*Z&H%X#Q47@YU?`E&Px0=KTa>q?_mXA-sA+ z?3{#eL4sR@Obyqb0@t|-x54|}@(P5xjICj;~Kvtl^zo>m_2jGq3>FB8JZod$5jr3!K}Z!+GNH8NNg9 z%fQcquff=y<9&Sy|1EH@=N7}d8T}soT&=9(I)UDT@8Nwv5;#Ubw;2BWg*AoiEJ46m zYZz~U=UmU)+$o%<7deJ|_Uta9ha7Ot4*vje57uhQ4KP;+);lsTR<--^Y74Y_Zb9sR z~nQd-W2{C`df2BwMpS7aOSkY zdY<_TJVpN}cmz7uYC*tfykpJWgS{coT%XnPnOWCd_x)R7e$~x)?cT^q#B1;p{&V2_ zeihVw{Sjm5eG00{=NSIBRr^YfI`-NC;|;L(3V25c_&=Lh%o^Tz6GN?CG~e&B*}MBt z^UjuxYj454HQbND_rcs(_<%n*V|ee$9OF9Q9Q*3veCIv$32};{A9I7a1wW&Sj@TUg zsJiFn?>fIX8}tM==zT4QE8@@4T%%QIe4BWVU*gr}rXau!w4mq7m+!!Ra_u33^E*Yi zj?a+V7ezOI4I1<)HJsBCKY>34wSIq>+=bQzeWQ7<*08Si1KvD2F$dmV3oq2{@jG~Z z0?zZ?{S30Ed(MpAN8mf=nKxd4#`rP1>)yd{@KbYK1FVQ${|T_h30RKwAZJm=iP*F9 ze(E~Tw;$(*dbJpyh3jbI9%$h-`->Q!54~nz?r8?*#I7lt=;i*Oj(7^!;v2j*e**rt z@>~-9w)rmkTVB}f*xFzOI#6@0>l*T+B@VoMtTi0F2lM=0-GLim+a~DFabLzMhFV$A z*uPVZt)=ccJp|U<0S9GHBFD83;XI#jK*KoT*Z2%t;%e5L!TH<9`*bb!Wr>})Aa?y~ z9o(Gp9q?uGa@DNqeAn_b(DROwUh@+C6#YYB{Tls5pxJ)| z>}i~n8Q(-t_yza_u|83|E%46m^&{{E1iWUQQ*y-|Oo6@SKm;3N@3pTID zlfZHecm5jw4rm$I-t-OQoABO`>yPaPywB4d-r5g=dky9|cTKzxteZf6j%RR5kk@E2j(_F-gEc@oB@ANxOPL1-n=8A^>NAb+}v{;@7Cy(_~#|Ob?rByYu3)CjylSN7oi1?b>EW8A2ZEC&Ph*J%6r zu^lj;!w0wlmW=CJns>(dkMPzt$FmM|VnEwH60v8j-mjqsPT)S? z8}>0Jj-q#XYj$v7;xoPl8UEai1$;dpM!lKWf#u%t_l7-IbA4fLzmr8Kx5di^vDU@A z@A^NXeGf9ay!94f0;a(CS+lP9_E#_g4cZ2z7}ju}oX?JP?t&!HYcJLd#tEPCjxUk( z6_|kz&bw>O0X|>j@9$rc^9Ho)Ba2`FT;H|4*LoK6Uo#FgW9wVjSnf8O`)C+v!9J_C z@GsD(_zYU~YTmhboMK>{Ydz;T#D2DZ4m#ot5(vFk=6e6v!2-;!HL@;-dpPGASDTXm z6KKnvzGrpNfM-QF$DZ_E(aGw2^!<{rXw*m6#&Di~wv5fQ`v&gHhJI9;}+!{@b81{CJ@n$PGp~)Sixp((GHpd^pe+N8o*9zuT z^Lf1tQVjf9ldF7UUcAZ&Ny+eYxSBV0-j+4NXDd1P z!2;d2g>wV=4!DPXy!TjZS*BsG$e{AR%l$ipUM*tyj_-Nm4md|!mio?b144`~hR^O7 z=ss7T^9~r>9Nzw}!ha3k5|7REXaWX!1_$bnv3d_ab7OPwEqDrl2e|jKxt`C)x8N06 zf{1tb-x9l)_h^n<0t>hmP}8~?&Z7U_P$G zQZHe~p1Im>&@fIQif7cX@er-9<1_sUu!qLHV)lCj-v2p*-zTo=9L+Oy4RHo{1s_FI zzs~q`@EJ%WUQL_Bc_%G+3vQCFA0&h?$^p10ST!MVQktUHEv z>|tz84DX%u#%s0k*3Q5?^SN}*j`6hQ?&IB$*hRYwj2q^L9(2~hat!C_oFp{7b>Dym zv8ZO>_VhK{&)|FDnS2S%izu1IQ(%rTUrjhan^)qG_R4cp&LtST{;~By1I&E@r{-GL zY~hl?d?w@$L5{LNygi%&&#JQ)TyMk^;2M|E?g4WXSb>_?#qjyoz)ectzwp^ytiQ(? zKC}F980H+J9f5!su9M*3;x}LhmO#xqQR2k712@UN3{K#kYfc9=*P9csfSUJeKR(|} z;@P$$bg@JnQ%8y`VYYHPk);##8*?z<+_~Ady$= z>+it*4Aj@;*Lvo)CD--k8^+#60~P{4;3__b`w3Xjrwd2(V#EdB=n z1XOF$tnVJD@{BWMdvTu$m^1FzJ%0+WfmO+glGCpPpFoZ6#b;p(7N8-wnsp~|);hy` zM@xK)AtUsl)9(SaT*fVa&e%QocSPL5jm_LI(7pEsSXq0^CUE|iYJhiVz5bnx;T~G_ zOlUHTwzpYSunLcWuw@2$(kmDF*BlXZR06Lu`%f#E(G~E|D80zeN{y zZQr%?X8_*4s9C3DPA*7{UE{alOJHv?syk)uJtepn91**(HE0;m@b;SahVNt7xB;q} zV~t}tHRlCf0!@MO0sO_fjZB=o#$s>Lv9jdD|)|fyc68t3his=SBUb1tFv=Q$GV`j3icUft7z^>^VDXoxeKz1r6dw2Tuz;RDp#=GA<4--Q-` z0z5<4a!)~?mf_am1GqcjL*P0&hMH62t8msxg?C`3z3Cbn|^DkMXWC?#&wJUqQbH?t|N))~K~x>YtM5{;cC( zGMswgHRC3R=VM9E3IuSkUw{cnjB9P@XluBi(R|kWwejBp*D|-a;9p{U@ScAGz5yNM z7R|M*b&Lbvx#BbOd>$J33_OnxpYU(s-+~`Ns8grK%RL9)#~FEHKBn$Dsow?}ErrTp zZ4Bqzz_(xuCLrLQ+k3|D`N`f;=PADS-;uXOvq#r;9lvLK9qkZq1~woGwCn1`P0@q6 zBi5fA;}gcaY+qBx&%i$M*zC!D zc%O&hGU$6E$!E+pe9m$VXz>Y5nb*SK0gW7%V>oly^PDuF-;Qw?u!MiFy{c@mVD=XZVP+^SFN7I(mCK0a$GOPkP-OK7|q^)Mw^00 zZe-T6KXrc>8Ov$<9x>c=|6KIS@Q>>{?;hy)N`6bO<~)1*7_F}FeDia>t6g(%7VRti z)E>y`3KG5n=2V-LvjG9;eYuvF1CF?bv#*Z0f$I(L`o5PdFe`J4I(+ZK?}F=~-!F3# z2vPEl{Y={dnRsmO`!T%hY-{E@?@`g4t@WLIinfAxKY2^3!FxCE=RV%|^DXG&-8w##V_Puxxv+-^ z_?BFA0s1q>=6NSm5O7(Icmk~Nv(d^`i(%ZFgVy&3*UuwI zze4lbaW4(yz*}<()B~u^$*E&G;knCuM$Soa8LWvdcY033GzXLPI zb8ws3`7^wl`9Yrbt(k#mW8P1o|ND`#XS)VMrVby#=S9u$nkl?o58}&k?r{NDj5X`#7xJ7e6uKy93f++Kt-S^Ouvyj8=sR;tc_FxUi^_-@K z&*oq)<9mDbh!<`2^n3rjh4(k8XLX@P`E9!;Ht_yUb{llWj>jga{#S4n7-zV#%~;cS zNv#7HnR9&pZvfBNXXX$e@HdHlX5`)bDX`YBf#>rGALJzIg4d-tHVc+b9#e%Qx9 zI|g@vHL@DsHGBqJ#>d1yZ)d>#XJA3>x_!?~X~?tRjCP6-klKE?a^m%P3*h< z4_O*)4kyi7sN|q?>u`6$2L2fMoM!Z~nb*PDuk{jf1I~!u?*s(MpoLdA z@7dl^)3x326YvLMk1II$Vn6y_xC~rh$c@b&JVW0D{Y$+4xOTNB7{hJgYMl({T+Mm% z4}qWKzH?)<7xm9T#8?^P#RAA-wZh8E&v#cnY%+PP(?O{PI?h=0q*2I~5EwEn4cmuvAb}eJIP7vF}4D14XaK4sf7|SK% z+vqK5i0vid#R}Myb-Ww(-tZZmqCbRJ{{?8|nLmNgU;z@iiuP*|=)K|XMR*?GiTP*1 zeDkisxhM4i`qzvfgBkI*c}C{BPQS11gc#Q7&zyKku5b^otKR_i2K|QhfamAhE$}yH zih;{Ol;4NuN6%3o=J!1++1?}ob`L} zA!yN!r}%{48@^%eyP+ns`nJXJ4)-*1lv+>7Zx|;~&ua&+)_O&3ZneLRG<)vnAnHA< zui)%CVwh2DCbS8VZ$YPLyaH;uXnNlt`%-Vn>kaSxCGhjrXDoxaj5FE{FT8(!1J{9R zi4(aSVmYxSPWTw1CBC=!jw7Qt_mG48LF+%$iMQ=Cn*Tqr9^q4LtHYY^%UVaQZSPOP zs`PO_11`bMfxR^5S`YZ%y2d4Zf3DDD`+LzlYhGXrYq7q2_nH0@xX#$R7@j59@&A_Z zWJ~{~tl>E{H~oUysyDX`87zCU|ZA47#IBuzpDVAy1K{44AjogPT{wGio#Y(gXPWZ^{T6Y*2JyJRDSAS?42;zd z%N&&c?+DjSF=#E`HRR^zg9)hSefr)$14rNs&@$&eW8C*Z?gliBlPETWv!?Uz?+y1; zHNETK27$gNuftc9`(CZgcP|M}b4_bsWOtb3Z-7P(&$$h7txzwf?stD(-}5$3@YS3%f%osVns=SJBS%eZVmQw;@-ngg zwRk_PR=_w5@|zMjrRExa;XE|q8unogedYB}(bOAiRFhBS+2faJT8?3#K9hb9SbuDt zI{Yue5n3>==2`B54}dvi>w>+&S+`%eh_%N#yg3RGJ)7lu$$l5`yzl!eu)jaPPjDH61Lv!5-0wAX*tUI;_ zJ%d%5=lgyQ{0aEXzGvjE$@?9=wfeolxmL!@9T#naZ{bqW-Iw}p(8_@ZOk5Z5z36=& zJcq{d-uq|n`CFs^elf@VV*P&MzDGBw3j`1#g9dcK{Rerjkw85sb@$!E8TUqPU!Jpl zx~_A_=6U#RJ9iGei)z+(ybJ#boDrXbE{1jcb0bHyAMp$F?g4Waj9(IGVr@sh%y%3y z{MLN}Z;$@&?ax!O*c{&8)P!f4qN?xWhiKXjyz9H~Tlg>JLuGjGK4om34BnD+7eBKm zsB83kygNttWuE*MkkQWfj^>$6;q7w?+^2n8wbT|I5A!lyVeWhCtz$%44-k<5)akks(sD)4?wNIn=0V#S-t@);`c0uH9d=dkDQ-5 z!ael+Ajfwozy|IBEWx5+g7>^%ffL}KwtKMN8k~X|NYvCK2K0lT7|z9Y?dciyrue=d zxh=>*bA5kz+yt(9ZZXuf&o^ivfH`pspFpi;+<|61mlU5l>plh@n)yLqwU&4v-W=h+ z^zvF0L%wxi!>c_5^3|-_18$C1Ef|~s8{qyuE4eBD1a$EITEw2EypXHwEEzke-zSB= zf1jxtu%_DB@@VWF_tU{$B7X`djNPyMu`k~b^Ez^To_D}?;4^j`B=WR~cYExJtuq5l zb;eEAskMMp575dN$ZdeRsc>D1f4N7VKzDul2IvDk+#BAb2YAoU=fQdjZEUVN2i9?) z3-E?H$H3V94rnvR!g~HKB%G&D_z1@ANAtN8Ux42M^{Vv={9`{))uQyqcmu5Gp5!&x z_>i&u3hz0;h08IlDgPYqFTl?xtzV0r#CR99Q8;`8f%Xjk4sh(=FA*Pt*M&prtws9` zZUM|$F>Ye0;d!{X1$c#a59Bg-e^Zdjt^KSSUn9r$HXy(;I5%=Tu!Qr@eot;1>kO^y zciNG4Kqi0N+LB}5YHNNXzk~CB>|*IP05h&U?n#&sl$)egn4c6`VbI7ptwg_Tj!f&!t+t>&-gq|F#~y z+%9u`e}Xw<^Eo^P&wzc^-ur!%>mJlEgG1_U@EQD@p-tsuSmOclru5jrJz{+3xL79s z5U#=do76SD3;h%M81B_It?Os5&x*Qd_nwh^L|zN@`@m;uvXyrLul47MX006M?(y;+ zoPDYJ?54tJy#4#z;4R)W)tr-z;XS_vaRg(~pP@SDefb+}Vr~p)b7EX9h}~lwL;tSh zdAw(goxhexk9bcVdV!PgfPH%J4RP(|C&n{)VXqxf7q8I#E||kD@oR7eY#6`5d#2T# z?;X3R{#+TmhI3O4I3oTG-Mt0e6z|>i##sKZ=z-RVj@C-P%H`lcO3Ahgb68MZS7*D`!V%PC59S8Fgm>GjN@P}YUEUKAn zy&GUoY%d=Y_v>*ko{eh=_wYGz9p|MO^ag**Sl)A(sg10QVSWpL6+J+;7As@9zO|1n!1IIw!diLdh#%A6%#kHHDXJ9-B z3xQ^ia2@?y_#m%e1Mhix?j2AMxc7{42R=sAoaY+O`xJDlw*gOU=H$cl*|w7~&P<4bYEmhg{dV1ZHTpx0>@2{IjB^_;=lU ztu^)Nfp1El^_eK~7lP{3&QlE=pg=d-@Vg)W{v1<9)QdpdmIV@MF7$b{Vwr zuJHl!P8shren{NmUArOYK4X8+xgYay68rxHp+86TYMxKa_%?b2T*Eue%o*F9v9(>- zI`-%|nA-vCE`WPbe}lgU8ng_|m-m_Q*;z6kTafdg@GX1;GUKtW;LNc%>m=ff%;!h_ zx8!Y`&*HSqUtFMjMknO-XS6lhbF!}qIreU?4G558==Y4+=ibjB;|a)U0UBWa=fJz^ z(43#(JCKR5!+V#FV=yOPfdyFW(LL8w;t4nevl6R&-|E88@cQiQcNiyfjzG#@+>^70PfAYYEwCCYUV#KT8=@p7oUMkz_W7RguL2s zBJW}0t!q8G#=0fXTt8fd34r+mGm?m;1iIgKy!EK~s3^eFU#J zSJ-ou@f3dwa>;jH&Aa_GIArYpoZqMw{S3bk-vZCqc?&QBj~IJ4DTaGj>xkWJ#{Y=6 z3j#hd7X6vwy>I7!1h~3l_u~ z*#ADh0V`skheVy)uXT?>T?@50b?5r~rfN@!H{{xH0xft@bYpqztqRt7&%$w^AH&{S z`~ypL+e9k8bvnsvVeKI@xNp1rxA-e=(-z-QYW zYxKQS)bnf^FM#)H&JCd1+biOl>%MO?p5WD95W9XG!@dHqseM(n6cFG5&NZyz9I+&J zJ-y~S?oDlqZ$KNp)c+%Q87;wuVElpOky*n$_izNdc)v!&*zcn`Fwf7tDX8ZBHGGg) z_gyvb=RQ#H&^5hz!hSli0<)6ixjPQ>H1nFkgI8#0Xf5bHTmk|5wc)Ed?%?k*$M3q@ zbK`vY1Om90ce=*Ufw@;0kIh=bHGOX1;+3>z?Yk1GDf!7w~KVs}U z=XVjq{>+izkmEi3ypHWU<3EB4y6Xk`88pD>#X0IHUpG6tXb$*KvG;{3h z6j;Z(>Owu4Q}Wj6!q288idn-Px&BOy#|HlfSU+OOIU$}~uV@Q=i4%nNYvDcX zi_HD}4=}$0V{@*W@D6;xV=Jd+?0K5w_i-@p*Blojc5X)x?qgvuz}yz^{F~rL$??vu zW!^2k`}V9{!Wp za~;p#^R$-@cnds-6=<2WV(fEl4W9$o$-sMQ@eMg0vASnb&9j=ITT9J7USytY6T{u@ zkTV4V*TFg8I^L5t?iMZ3dc$X6zWNbfQx_eW!ddeYsAkRnF3~&mHP|?pvDOe@A>Vg% z0s4ImQlBH&p#KNoH8=5d5HXz15^W9=+*jZeVC@#&J5?W>yuIif@Q57$=P5qxnX#73 zeDi$I{ssd0E_!D6VePu7-ZSrzd1`C4HijP6GV!d`9G?qQ`o9g9{XVHKpMy9@mGbdsYj5okuXP~cHG;>_*WAFyp>l|#GdFsMi|7Pg+?R(s> z;k|$cehSwz$LD~!)NLN zh!}ER$GbBpKtp^2I&^ITXN|uA`+W?iaOW2E3Fp1JuMff4T(c!73F0I4>*E}F_vbUI z_xDGbTP=q5e*=FTcrO{QT3?^K`vrbR*>klvhH-;$;nn1(_#<#u#_|maw7|dE8_r@y zoI!%`VGi0?z@D9R0$TJneqQ2)p8=oCgy!8lw$JaGcL;8PY0=3#x99M0z)#>B@a%U$ z87Ci*0(j0X`JPGdiS5O+nW1m+E8x3w3hZ0!V)%Xi4DKmtfzLtJ6S_5B z=Q*(6*dm5~n^P^rwO}g89D6&j2jv`l^GtsWPKgi9fgfAL*u8%bt^xD5&AP2~%YJ&D zaRdIyod1u{RQs6A1u8H%@M^+4(XYuFn{#%Hw!vrSY}<^SXKK_`_n!U-Tmn9`_Mvt7 z8*r|(z^54Q);weRpN&DsSnKx|!~T}=E%DfbvHjf!6Y6Ki?xn9eN^Ic+xSvCG=d6eu zxN6?Lcf5wTR;Yp6gLmj0IZfW!yal{>vkyAPYSk~{Zte~5i082Zu5}0WH7Mi!x8N$A zdpQQaJ5>*Ao-kg6MBcWwF?>#(q5GUTPfjzQGUphm3;P+@X<`_=znU{4XX09F*qU+2 z*#6Hz19A-e^t_$toCG&E*Z0g_v)>!@v^oAVoW05S7DIi{`U#vh?b{ljul*Qz)HoFG0t6LEaK1fkg~s=U*o$0pop; z(e$ookB%Gg4e^(b>A%9>JGeQR5jUV(W{&)Sf+=ViCt&RsOu<|8ft;FV?FnPoc5X+U zW2oOJlz*JREIH5dekX2Q#8AUJ!ZWbX4QSCcb3Q_I?Ai(6gPa%ehj_P} zW$h@j>2-a%RjK8(F+Rr+sL`U=wQe)6dY$9`5;>x3jQZap_E+^#C$}wmo|SW^_}#tX z?+jP>$|UncdYgm;|b^(uNk|JvF19Tqx~KDeZ67)8Qwbe z-tFmIIDgCg8^v7vUxF@%o~Oh|z`OC@)oX;ndkMyMKYGUpYM>)-1bN2VbNG5Db&dH*_uSe7 z&)A%5zhSQ51#SHMx*gmR+7dLx70wOD9mpURKeaBfXV*UklLC}}PDAdjaOVAUZ`iwa z%=P)IbL>lf2e{uQuzs~W@U@n)pB42C=j2(Z4YHksH@-y97r--V7a$W*+#%8bo4gY`myvcZb zybXf97EFmN?hz;QFX7b!zhOMK44;6$o|Aj|59(hhzwSHG?aRJ@55ER8U?1+OpIhoQ z_$i#)9dahb!amHcwjyrHwWjaEWl$}{H{dGVbMO`T1hjCP>oqZ~u?sJ5fw~8CK49z_ z?o&U=&7cJdG++sDpX#2KpC7II$PVEi7d*q~7>UgLxM-i^Z-Rv0)ExYVoFs~Q4#&WC z%~SUd-!sO3Hu?ORKemYBOn*Xu2t1QM2j0DByyxt>ZNOXRcW^C8AcQr6c@5(hBoM$_ z?qvz=F{_QtHLjq!{=E2++=pEZ&y6|$_kql~0nQEl%Jt#v_n2e#7P#&UV1II+!7Ijp z1i?51&(Aw^o@*?C>$GT^>vSLeGjNX0zf8WpnXCUF;PY_<`~VWXmV=s% zTYLw;BsRBSn_8~7F1f}&2i92P8}i+=z2C<>&psB6J*yUu;1X!{*aoiFQP=8zPnc7`(>t^-db!u_(RVUHg0FL2&%OK#G{g;>+yu15J~N)9 z^VOW^-QHomC^;G4v+xY7nLCpM&bf=$KRY#HDV zv$lvB&nz*VcTsZ||4R=6Z;rWRlS^A%)mLSXJ+|@h{auIe$e94w{ho2Z$5J4eQ>`I( ztxV3?{0tiBjkTt%Kjy}J?0&U*e`;odGZ zc%Sw0z4@83TWVTk+kDqPQZHuxbU}SdsiQ#kiN+tNJG`nQmI+xDjDm0vQx z$U5qFXxryyZWqHEeeYY7Pnah!)?2-qdabO#y{Gre#Bi?txf3U`We3!G1jc7yQ@po7 zp*0t*Z;o|E7sKz4x8{+51_JKfi2qvn-{A8F^{nG(+Y{%4jyZi#_yjzUzJBGQtC{CK zKgT`=&%t}fTzjgxwWa%c+LB`rFG}75Z{5BJ_$lMdz|TYbYhzeJy&<;0u4qeqwLtU! zI_5O^9sF#hC-fH1&!-@spxNg>sCJcj3g4hR_i#&>53oc#0)Cb|uBP6?_eQ*nzHm(J zdTYkMBh}2cPxS+0`)P>-$lYW76!hmKN6rn#*6J7sXykv4S_}8S&b=#MUr&&(3iT&m%xa7oq1~=Wsp` z-+(t@YK^fmUV<-+z9OE0T=*12@(JTPP(LZTu9=J8;1AJUL%6PMweVt5v{&%{R&b56 zb&UTEzs3jo+va?qanD#xh)?mZ;Xd_sZTEW}WVjSVr4Db7{o8~0wr%~hK&_VC1|+Z~ z{|p>~j&Z#o)IQI8p2ryo^lE(!=R7q(>wE4zVW>AlpQ5#;eiy@Y=JVgdSzm1d#%sT2 z{5?6p0Bf)d{touxwH(9#t^WhOJv79vd^s;`I?uDPhlExw6I;t?*15*^atu<5-S=(q z30T9KCtTCo*38rqXN;X|osO|ueZH4)4V-nyHf4N?y!&7WSleDRe8hkb?^>r|AMHpG z9{~I4&kXN;<9deHz6Ey|9G2Wft@jN61lX(fFR~5%TXcVatS-oL9q<14Meo;-_bauG zJ&Qzc?JvPu`)l~8pd}U=UUP2=-goIW@NZxHh)^A@kIAb&X7n6G&iOi~!cEXTqmI~j z$6B8Kn)xdbz%?EK@8BW$5G>$3=F~NuHvN3>4E=d7KYWb$3B#Roa&X2#YuzplsVy?$K(7P;2&oPB<##3HC=o!el-*!SOcoujvQ zRFHd2Y#r~Uepj^c4afz?XXI#Iy!+oVUly(x_$Sa@({(=Id%u5k2|K?JMtCop*GJrMh&mMfQtgkm`Y%RF~ym!~}4&AHg)WK_>^+Wi-fE>eq zCg|2~84K(7XG@&G_%7#ra3gcBz1W}c_;gFR?myssSMBSMTe^F*7w`Q?aA!-m{%3H< zc-L9s?PrQV0`}wDYA1MO=bRh7>-)}a;Ek^V%{ps1&okl8`KZL|5rgj9t~XOF)-c{M zwq6j|HLZ2UJUG2`-TOX1#gOkD<4%m`+RtmW6?M_aqM;Vv zGn>NO-%QWgXQ!^8!|Y*i>c?n)&w4&f#;*S(@%i5Xa4TT0_vEuwzn|r{Eu-646T@fC zpBY=XW$an(mpR_WztCze*9~&?&X*S*aR)!P8_e^Wnt(tP)q?znu|0QqYpG{ozv>fk z1ZI0f4Yl6zu5aE0v?XZak{DYId$N}G8^(R#C8uMoW)D+PYZzxV*Ioe6qQ>UPIrrzi z;Tc~tPK?K9zVGNq!2E4%V_@uOgC69)#mn1Ihd(IZXTu(>GX=L8_sq2J%zJ89z4nCtCPpyyw&r+lRl=e0~#r zZ!zpK@UCrbv0wEetN&O1e$jmf7L2_k&m@>{ePK^63Kb25tp1{Pz0heoKzI37D70dBoqt+gq}R z_lfC+Yx|kwJL9uc^&xAxi_V(P-!l7p4Da(4u_ZF}%umsLC;GY<pOxPNp9|Lxczdy@UHk-};5yI%YpGl7BD;&GW%LQL&+fCr4a%^_4LJAl zE%08(X74-TJFo^#yi;3Z^Rpc2Jz=#e+Jdz!?|!=&K39Bh-hv~L;57FazfNR)CwK?%ExE21RqW=<~nJYRlLDM(Ddwj4rJg3%; z!p}-h!l%M{2EJE5yY)Pr;N6ooH(&uaEu;{!3teZU$usKLcV?3&(*EDQ@AtGf(Gr` zmLAls_h~PFPwavYUQJVPW4O25XvWoiw*Cp6>-iYhdgi$9ui@53^W7Wk5yLw6@3W+r zvuA5h@N=*PGti4)k}-p2lWK#chSb?nfN&t@-ZkgxFA;Z{O4$%wR^T#f1^zC?#(<+-xbYw zeA^oIXYfAz&a-yF$-jcT1&p;&XY4u&Oc|^7XUkdmtf_qi8nk*&9XY-qD`0#XeHTQT z>$!S1&T;M>zbN^coNDUU7mvZVnX7gRT%)dE^VA#g8qH^H+dRhrKF^-R44i-i@FDrW z6V9{#8QiA8+ziY&*Sq`@tbp@7)(p^=*!^AtS{wWWoNMhJ@Jry`h8pHRtmC>jfxUbT zJdbM68Fw*o=7|Nct~SA|JGMXd30N==`2MUI2Y3rNE%_NuU3`aj2EPIcI49$$@ZP;z zL!Re%oAF1$bq;{fUcHY@PD9QOICY<~4sHRL@d5M=*xeh>#P}(3M^0Nbxf$FG;F%tw z&A~4UcWOOi*O?g8uV()N=Na#SVB7`*FlWZtI&0u_+rg{r)hBQXT-_Vq5!di6J=gav z$S3a!{Eq)!%y}1>eOw;T4U)ha`JcgC+kULos9`f=-&yN=-fLj&oN5unnJnRaFRlZ* z490edZf&iLclTvY_utQ9-$8t5Z`iYIt%wiGJm<;@?_x6IJ+n+*&w2`P&3YHklM8fB zZ{3%mA>KC6!ZrMC9M>>!PMsG1Cy+oBvc=-vKHOJ3>Y?uyy#?-PR_1q%MFRGm1hGB? z*E<2eiIKMHc*o^T__)owTG>qG*>Tpgi+@{QH(Cp_nxzE8P;CdardEQlD1Mhot z2G+z=VC)^cW=p=-#h{(Q9|Li)&aQJ0I3DLr z8GB});T-g5S!%eRx^)Ae;GHXa!}sTgH&-;oGje?f)_bgr@6-zt;~@6z{7up@?$5FC zYUc*0E%DZDg8_3q$3AA55LdCh{fcJkd$=Vkhx$4XRML*}M<365~|0(dZ)H4Zq_cQ}5a0lLcr^H$p z!}tZfv39-@tor)(W%@v32|##kKc~=G?l5x_e0ESIfi= zb9|;7;sCY3j<~eT z$9=e-Yn%b=jm^(j;kx>5^IQ%~&P967|Bjr78kg`(dL{Vm=)dd<5!1NIUzd^YtOv2&;JEA&r+_s}rT!1J6L zlVd&khB=<4zd;hQ=05+*xQijD#cR%MV)!g`{S)#MFt%P_7kw@dXMLZ6kHL!AvH9j@ z@|MK**Ai!9pHtU;1iY6FuT9XdGrkADEB-FNjbZ<;Z*BLm1PkKc@HZIO=friZ8K0rw zMAstT?aN-LAj7$~eny_ZO=m|c+lCfv;rs%0ye;)7~a0VWtcjQ-duDyCjE%AH( zF`l8_N4o^xGx%S?9T&~}`Zt3+LjMum0m+=p;^xwSAqM{(B@;wXIL-#Yz9%|nSz6JUX`V#2nYTu}RpHuj6_lEDiC^-#z zz2SXMyzeDgqo0BU5NOtQU2BZZHN*D%=|XDK&P$wwd=0ynlx^v8@h!@eVVZ zdRu&l*F4wSi(}(pJxkZ`^Ppbcr=N_~v`I-0zxCe#Ly(Xc(V?fU9P% z-#u%P;TzBb%{4q*=k;ee(0%OKJoA_6EqF-o3?Fa_bin#&z|V8fClNb0qt)2=$o@LC zR=!xo@Q!8p33`3jtKOh{|N1F8J_Ei_b8rvb1lDcAA=pQ^zlQt;-kSF39?jbYo`0LhOcJ)4Boz0z9^n$@i5Gj+7ZSG|ql_ow5ActY+aat}r|)B-nBmfE#n00UOQs%%XNGYJriqH zy9sCA6hkfj*zDP7u7eNI0{7R~FR?xK9OF5${jBi~W50J?b8L=p!`}zK58i2zyKUBO z;9cMP=D2Qenaj9G}jN} zy2jUxUAuwvci1h^8{RceL1!QI)R5yDIQ|^o+8M0$=-OrY?}2%b@t$ebhKzUr{($xZ z{BLG2-gCcByq`6vzWeix4uL)N<WX_Y^<2iDPOx&-}63pL_EEw#jpHx+uSi@M?j# z{t_({e}nh8Q8hVH&Abiyi-Kdk?~y$PdFJX9u;+Vw!`=AI*+JIDtdPo|o~5z_ZNcyUz@)odjmTO$@s0y#>#hBfo9d zI5P*`bsNUj%oj^^*Rwa*H)jVgpNMM-u#H+`&HdJW6Nmn=@xub z*D47eW8W*!#NHZmtyk?D+Rq@+{vTcM4bKtTlx6ey@bfdU1K zMu7qa6(~@kpaKOGD5yYz0tFi(L}Lb1m|$mzY@GM>1oW`EO*{VG!Zhl?g+-co4H6SD@~% zCHHIM&fuQLGRHUm8u(17g%4^H2z;MihuvWNjJ^Zb)&33K7O^|PUSeJPP}NI~AHhxF zau6<9;NK)}?~YjAcT3zpGvMBQhSTCxeI~|&TAzXIc+OFBP1?gwG2|S=AL9GHx(qtv zElA*)xc9|%T+<%v4A+1TIGcXoe;Xe}iLc3hjNhVt?_75RdLhU4{sC6R?0a^8By{lB z+y@uQ--*8j9eHPheMBGE*@652`1vZP_-8_nYc=RKTHfz<#^00#@A;gdvl!)AHzBqu ziJUjo^gPoRw$IAn_iDfKIRyPW^8CN!T8w&qPrm#7nUL?fx_)y3Z*R}7 zg-hg$6}Ip33?2B(QJwkM;Z|Tg7v0aqcQsK{@1#A%SoEjlJR{frc3`ugzJ0!i`%->1 z$GF!NZY=*U`E8VEgzmtc`YpHwPOx){c}J|d4Hg?~ID_9rdEeiQ#PjWECAXp8_tbUT z7<4}$_CZ<4@6)8L;~XnsZ`TlG*@v5qxLQ|pQVf0T+39D{0_~u_o}0e&nQNb2;MuOx z&YRIwP{sVOh@XJ*x3BW*W$ED>nS3R}KZbsD;&L5+ABU1_!GCQJ&pqJvt2kfa8}G<@ zZ65wb;c(8K`aTfk>AMThYsEwNX`8lXM1ZX{g{&Kr22Q;To^ zDDiG=g$c_;o1$c zx@UjyuiPnX$|>?W25wG{`)TpTvdo*&=5@rp4|}8fAZEM;&hNM938?F4;;HcN^Ali? z8moChPtVDonE_ZO`Kpb=QEu zZ`}ngu@2t#&5={PzIVX&`t`{P&=!3{+Nn6pRBHGBuU z4NhOYhm*H=l|)sjzJNR-lVBeR-8uHEryCd$bJ8+Ld5KBO9o&EPg2A)k*;9i|UJOxYQ z+IK-9$}!AxQhIyN*WulRedIgPf&dLz zk>gqB;wN-R?9DbjI`F+0#;XKzzro(8yG4(A_xGOoufQwdImW2oKGr=3zHsqeqbJxyr9q??-OJI%NuY*1W#^eIqzF%z*|6XOD z&sM$z89afz32J}u)E+s#sDXW2U@z?yWesT0Ch+IP?@~KO&p;!P&xw5j+`|?0s>BC& zIGYpeKt1Qmse||nVE+{7bL9H9hzH1^1^0=&C;QgknRo&X2+)BEJwMtW{{L{iM%Ob) zaCMdiInUq@(Z54aK)@^h9iZC!*0}!z@EM$IA7NLKzeDT>@Q!;Ix)|z0O|CWmzBUCJ z-x?A4e*r!l*I0pf_zha=b7J6(IfFlUGO@875LWm1 z`Kv%NX1`{;7{ng8o(X?ei9#6XMT_ zIhW}0$CB|Y=e~Byac0H-&S>8R4zar!;(=~JSW~bvPEOg_!ewS#p}9TlfG~61Lw7f1hyguAhMW8t0Ae9XQwZ zT>9r*nt2DT-7CCnw)F3xRf+jb`#lmL%M0RIUTn1WptEYub+acZw{ISRzYssnN zUd{DfoukSM`w;v{+;5eAMcuRO`<^`oHCAhv^33)7?HSfJ`hC=5w6!gDchIh5{pK1OJ`ukO zKSOWIauf@48!#t!kNhogPKevf_xfL8f^E(T+Pye?3%nl)r}Yn z{7Z7}y*5998c8vn(-FSB@cF9~vGKlV_zwzq7v0}Ko6tkfSv*Vcl6ATC_TBeBIe!&v zeGabU`=MXg%hVZv1N^uSBT_zbO?f|j}yv~y0-!kBCLJ{^E3;5lf^8pBG%UGf|r zf`F@MnyKyd!69~lIry0n`x~`4z)O(HuhL>K;GY=>&Ktz4%JDOzgPu=KLOCt_3NE zeHic0tkg~68tkcc0T9>o{jgT9jp4oO(2Dg9+^!r**bhO*u99Qu^D%MHVGS3=l)fH) zg?JYOoI7JHYR|&j9pDV-B!-$9@sHr2nM2IJcd?yGKZ8B&dj9f$H+_cooP(B}UeM;- za{{#8Qvm%a+$H=|`~zT*OuPa1UgP^SS0wCy9q6$v3U7}6+aOm^ukE}Ga34L;etz3Mk0m*YxUr1wyobPjOo2T-TlrTdr|)G?>N04E_c8OaUw{U? z=j2D?KJ8^s^J=eMY->D!XTJ}gfCawK{tsYZJ7HILua*3Gl z)?=_sp8Gy0G3?LY--0^lI44uH12+M=9RIZa5Z<#zbC!~Z47_E8*|!+ z^m_*HJ@A|od1INw`!3Bu2Pc1S9eB^I-vivHd=2*$cs_IVrr7^~h>LG8;GIwIze~<8 zevS`aoFx-`0pA)Qab|V;@ah%XJHIJw;&OG4O@3y5;ooi6$8bNkh_~4GxlrJ0k8|fY zO0N9)JqYTirDsOpVx3IvOtANeJ7a_0i&`K)xB3n7?nV#Ac?mxg4m{l6Rl@3HS+2Kn4x*Dz5VpF?nGx#khC& zkbZ3pv&toW=Tv)7t`l1r2UGkE8n6W45wqu2a2Yi8(RYqs$gz+4_PR;j-_^rd4Dkte z#-5>1fqCnK$|ZR1DOdq}+QaYS5qJ!Y&w%TH4BTJF7m0fPCH4)txiS2v#IgDr?CE(r ze}YrgFY(>q1pYbNJCKQ2@!7bqr{Erl5ogYnSO;E%h8|<-V&FaBV>s*g(Jk=#ILi~z zlGg!aGvF+NZ$Ep#0~y=6LlGM*uGy^i2Jj`^%U0^OMGXyZ!a;_+0*`>M-fA+(emrUH$_@vb7BkN9QN^9Hu%DRL5{q+E&2eMtH?FrqwV28 z3-#ID0+p8w;QXh=#okPag7HDG~Tn5H-fqk8!C9duLXyJMx zrfuK90(sA+BfdaC!*?BL4D3M9f%&QUiQEQEh-Yw#_$y$q+rW4SKSdvx_yTRuD$d&w z^Pbt;9#_FBaqH#0JDx!Tf!)_f?J(^71a1oFb3Ozuyyq=ke~XxN*?VoT!Zp|(xnVzS z_iV2!atX*qiT6FX2S3B@88=6Xq5qHYp8Zq~c=j1?hW!HDnuITI;b&0qYh%3Jr3RUh zE26|RdXIe1Xczdq)*5YGXuJMCSYkgwzXdC7_Yl|7%U}pUaW+ z3VaMarxe4S3+wKz{*RVpW{Y^L$R+_3wdANiqE2Anm|uZ_1J$Rr+TWL(hh|>m9fTv8eH4 zUxRaB?%f>wuSzfbq*9;AZ-IICy9??aFs_}^JLJ0$*Hx_d{!Gy`U`~q;wD>1nMMu0L zR{P4|Df|ue+&b_W`xUTX1Ds`o_W3s0Pr+1sB=Ua4UCW;l*7Xv@`&DOH%WX&-!=CMX zO5JsIBG!wVSOC9PiC%K+ZcF#LVr`jX>7;0cULs9%8=){$6t% zq#y}cm%ty0+3zOW*&5@Vg)#5`65n$+-cc98S)ajaSLtnh&-OQP9k%^1VNZc}75iuS z88K&atvl!{^7_tXKhJw-qu%%w*h4)5O$;-+)-jk<*Pw%VDqP@q*zW0Lc=uPu-$QH7 zinzV4Q`(>>{9WK$Z_#sf5LcYJjiI+|TkG1Hn6}zIy#p(J*AHUOb5eNwi>;z_iPNbU z{mXD)6#go@iGe%&6Mspb|2}&in7_t1uLU#g4!FK^{uSOeuK>ABjxhEbnCDry#1!{= zfbV^3(dQ(F*b#B-r}D%^sEb(Z497O0)o@2345An%&$1|%@U-vOO5WQqM^ zdw93CYuvMp7;;@(JO!S~AA!%#HIx+OV!O6^eitYB_Hey`Z-gzCZul ze}B?k|L&-?!Je`I1#STSD)y=Ctl;!T6GO(Yi20wvxK1J_7wC!efWN?Jw6U?6w-2Y7 z>mGbYZIu2!GyIXPhhL+Qz;$e6y`Zh}*>va``Wn2w?RN>?&pTxIfA%xN*>h7K5p(7_ zyy9$4Xbqw-pTKR<_Xs%9fhoN3KK=xpXA6Cb&R_u&c>&Z_oXNT`$hEG)R;-aN3-&y-Jq=)f} zah-iT_&e}E51-pH*a60sHa^(i-z9kuf%C~_u#bO&?_OQoxR_wu+uR4}cc4nZH^iOW zIbGAcFa-g&$j#))`ER6h3E!S!ZIu{uefRu#&X0jPRjhADU$$@@d%u{0azf8S%!})#(+;3Cz>^T9qh`SHZM6N+w zdxe;~B_{f_z_+Jsx_&|joJhd2A=-s~lERL~;^XK-e!Wnb;#Z`6@xo^N@EIzYPts1U$QEU>CIbN+EA2Yr$3gV{}7aJu~a?5?_G;6L~~FV$jA; zLDB~q`*U(fVTX5ZMeofFe7GdTR8a@b}#S^_7<@P+I#GteJ1Yd z8F&cXn|WbAV%$EjihhFbV&Ln~Lixu)k;~u){@;N6Uzc?f@g;VL?$<%PmgnFd=+OGD zaU^0`+x{oSJN!lz$uT_J-@u#WI%By?ED@W6OWNcwurqps4zzp=JbU+lCU9Tl`(3{c zt^;$c1iX9k-SL}ao_np*-v#(Di9H9_8atC1&U681|3mnen37|-ht6+b(SVkC0*X4o z0d?Nn@4*Yu&q&<07I0HyQQ{fjeK+tK*ms6+Zf6Zp+}A#w&m^$rrfB0w!1esuxx#MX z`n{s{cVH~?-dVo|e*ztLL#)b6VqXE* zSb*2qEqp&;dG`Weah@ClIbWjbT0Ow4cKrV+VEy4X}sj=p62M z0i4%!@Lp80$0K4p!1<~;M-xM?^*;gk(8rWsEB&*i zuX{`}>}N@?eXX;XdwC4ZT>xjE0Po}_a1C4s=8na>?}78*1$*#yU*-kAIj&=m1GIhC zX#2a?5qL_hiy_|{bM0mCAHft`y+YUi>LsxQ<3Rp7s3I>iece}}?Hk|(e+w;wcrR$@ zx<$-hPk`sp0Q(pdhxpE%$XC=IzMM06_*DYi*;}}beFL5Fjkg62+Wz{^<~PComb`|T z((ffc%y1RnzGE@p-aaq)n=4P}zNB%n8eNZKnn?--JfY77zOJ{x zo?8pt$mjF?Sc- z+#dceR&z%w{oj$?*FK0Cn0{}?_Gjp~!1Hg2$&L4J?Mu*=e6o63vF;nzzuz7xq|l0I&!N7b`Z1I40v9O^>P_} zP2BZcZ2NR**YFNb$?In(R>gS_;Jlwp;NLe|_zqa_dJVRiW4o4I7%P%uco*EC&$GoJ zi|gBa4ZpMpeXGpyAHy|KBIpFnU4Tn)=C{Vt8SSj&=lT-=nA|8iE!sIUu@-cKnCCeG zNUK_B$g7^v$XVf#$v9-&`@hFrxu^ST&jH|IV63y_HY4&4=w^j>_{ z-jO%J+!Vup8){v*#aDN5$_)Dudj`z+48}4o@l*0v*v@B-@)5TA?)M&WZ*!1inB9JN zLExVg{8z-C=>WKPLO(+5*XP(jAAI}V1{ruBRcg&;VqyVSCMF1WWT_I31+!1-EuCC6~~Yk2={^bf$g39yf__YLAJbdW!m7T=!UlbQUe z&OGmq{0Vwl@-j7wxt@0~F+2xzUjo;3h9GX=w)n?rpJ4|)OYfFHb5`gnSc6*EU>|`e z@a{wD_Y}kL3$EoiXe^ohj+mTyC{L_Pis8P>c_&)9+B?HJ>lX2@*!m52fF-v1?!j82 zEhn72MPDQS20RDe6MNJ(oMl4HcP*2ffcy?)tNxFGa}UN6u>b#Tvp#6>t2nP~+$7!tb5_7LsziM7Gq%suyd~HpFA-}% z3+xwY&*U-a;1^&5teK)WWk&2@a36sthWdJrfp48qjJGkIqj$M-^NqfVoDBbWFaZtz zk{s7>1%8zd`#w1R#;Qe#Vkw==DqD?|^-S*jSADoDR{ca%lT@=u_ec@VRh- z7IobO?|twN``quL6MP0;$#vel#9ssNsLy7NHg2CP=8q-d{f^i>3g&NSAPmIAO^a6C?4!-MoHZAoT%&~nxTt|4f#$wF#bRFj# zi_h5oOu>x06tD%(kcqjMM_`4W<&cQMZqe3x?_I~)dLiEL2kmV3kiS;>A*=s$3U7bW z&oDZF6L#UNL=5+^F$Qi>V@xQn>HZhsIo#928?W=27x4bBBV6-m666#2Ui=YM$;3UY z20elIcXwm@2`q_yOU#)&a0twoTVbz3#t!g1;{Fcc`5T{uMiiM~`)+>^JVW`JyeRSn z?$=;J%p7wQsInyH&wyiepj~TRzbZA}3upHE*r&&3H@H8-JfUF zz_lP@x8O4IU2q+2?v3oT-`UN*NsjlezmNDK=ru(*XxDlM?_IwFTr(5<1^@olq2(L$ zoIjyw_+OGEe;@7H2l25aa(o7Ba2wt;YDYQF?E21RAK`O4llTyqbItMj@8EajpP=m( z*b#7_K1c78amBhj_`e0#sO1&c_Z^So57FV=T1(kPBbq>O`zcVB6RD30lrQblAePT7d@0P0925RheL$ z7jVLF{2mD4e0?wC_HKc9VUE6pu5}6DZ}1Y`0H4hi%s`@cq75I|`c2XHHt!I$#N6|B zaE!k|`~3~#Vv7AE@V#<9_uzW=kZ*wVK8A16-c#4FVr@%K1FY!<+qJ)ibI|sxU>sjBJ3p{K0>G~P0z#0Uc>)T^2#uKrpaQ?2oz^-eWXK%kD)@pZS zo?7F=^Y;CH2^!+|=+Gy`9}u%||Lqyoo0G{AACuGf#%{=&7R-tJdxyQh0|Bh-XC&9& z55W?+_9M`9v=GB?c_!yq?_a$cw{Tq;pHy{D`v;y`Jp3xdV(Efhr9Wf`7>%FL=?>Sj> z6PQya;5?Jx1J|^lyn8kOHt<;+>&R_D2B(Ezp%cFM()9z|oJF;9-Rm6R9_G2$4%#)W zJwf{(S{In)b}0ro5J;HT6oVhmHb>{YB3|Oc0Kp^>Gsg?1bZy~ zJjC38m5AXiUsH3DtjPTyPCb^4pX0;*==W0+T&JUEj_&s`+LtNr%{x?U)H7lyU=JJ> zH1w|$*w?7}0^A4J!KO@!wcsWA6L9?|K4jHdR>ZHsH|Qv~`&okooWXdewgn4p@5eu> zc>(0KGdkcEdprLP;yz1x^DYv740t0$K-;TYrdgo zAMFgA;;f&;p8~%>nVJN`T;Ms}BmNw;*nT?~MLS23+Y5SzpTHC>fzNG@_WkVO-IJW} zihKZT^nZkNhC}R@+y=NW?Fq5BaQ^&u4%aZ&nNu*wUxJ75?#KIJY%FX1Tf|-GDd?;% z=Qx2gejBJ~8@0P7F7NsswS5j+xlTM{IG<Itz1xc&rH=v#!UN3S#kZ+!-Yqv4X{u<7h zy*|PI7`R@CKNe@Q*ADt;dnug!=K4+HUZ4|wH|4Ozth4?Oc^8TAl6-qX5A(fWKLMY| z*$jaVX2d)n=iUWX%#(9XdF@PoJuCB!XK)NApo2H&9KWLO3NW_7w_jWM!2b^JF6f1L zKNs;S@O#wHf^ChxSD*pz#c$aHB)ASVzRFy(+doI2(w}=r%yU_xJx_C5_yjVx_iBmu z%$=nxocpPLjXRIE?k|B3yr9Osz6ZAXu3>&lp9URhbG|BZ&(L$2f+OPQx|c*=1_{5e z`<5KfQ0ZcrvvS7gHlh*eFFQt zH*3tDpzq<|1t-{RD;W@a6fHz*Hx8e7Q zAHX}qn6G(i*A4jDMi0N|_I0LlZHwLmrIc}DE-|ItSLOTb2f%*~tPr!K(;Ee@n zN{@tYK?jb=xdAeEpNqbxPyP&h3L0#EXIQ{J2KM(kB;o<;o-%evT)v-+n#wgu!naQV z&&0er&~K=1K?dgeyzYVyU#y8)YmNI3Vq;18J8<4jXUq6i=H$O7=34GcaW3PZ5c7AW zr@-@%fCMXS{p-a2JM$jc$3F(0IU|`6^ZdLg?t4={Bj(%-(25{~eD`Tj*O9vo8ad#) zcfnc?M2RQ$hD^!Z0-3x`$uWFi{sVus!F!%ph_`6@TVO2C;GUeZ0Xc?qt2qh(A-uJo zi~jg|Pl*|q_h-!#`!jTqr}VjjLChR60}JvzldIU?`5o*zxQ0EJ17h!pnK#3B#wLdT z?#+I$fajBlH^A5fa02gI###_yU20auGqxCud1G-+&!!b{_E=a0-1i;&m@@%#?#Vmq zKDXf!2(oC@ZvhLmmq;g zC^5W8H;nVHWPInUGj;ghozH;#%=n6YpA*A*`ny#N)JN2-ovHTeYsft)IiH{dUzw8U zo%CE*;3I6Mi{TrvAoc~Z9gv9ig3iQU$M<>(E`cEKn#RQ&;5=sn?_93;8u*M7{si>1 zqUBp~Q0$;4gBCObajo0n8*mroDD{%s)cP!b2c{qqtCF#OrXAP^0Ty7Y4VTcT;1P9| zAJ^NbCC}&dBRT#o)gPa=If}e@t>_g`i0-EwS;^wu3z_?>6d_WoWgk@ zR%m(A!TpMubGTMLH}61|Am6^;1MgBoXX+YY&pt*krH>PfpyN)#SqVEdna&CVwhz?+~=(HeFFmo_&xFW z;K=%NS3CLA%a}Po0!4ogXO3vW)Li(4Jr;fMCCzxcP%{@m?Z);yO-%=OLt z9on@sb-kbicpm?R+mr*!#I{Q0ol>85!hI5vG0N>}2N$hM*;Zh9wYH5V{gf#&*KT51L;JVDHEXPcv!C;sZ=ZdzMV`F_9ODOhRm^)t z{66se?>8ifwdAbO9Xdb*oNY!dWACAF(O|TjS5L)eXKg?_hsKtOL$z|6I6G>x0kW8+;|j zQ0HtXpaoN4yq?Dl-=2P-zXZ{r$h|Tzu3=BlCljyxXs~<0D=CIM)PM7g;a8dC*S*-M zgX_ZOSe0wz7AOUS-Tie4sGQ(a1d#Obx$N9Z?Ejn3;v@zTT z&;2%-!!^VLs9oE;V%P!v&_V6=W zTd}w2^${>n*t1H+hkN`6uEUpK0pE#lz;$p=$nl%L16~5}RFxIB=dcTQTqlMZ5?cQ| z;+yN+XALHxiaqXu;V9PkCD$I_ z4cC4Tt^xflSL6nROP2eVpYp zbVj?5dt2exIjr+uFNv$2e;>P{z5|}q8({s+_=b27Zoyvy_O8;!@N>rgH^FqonUnD4 z{QbAX{tbFlaNAfPLOZBuN@V6_iDW7$Q{cT{8Mm3y)!gXo*z1iGON194{|zm6>}PJO8kfI za&PT})Eas3jXxtZwtK7d_nO$0*b=nZ6YJ4qIUwf!xd9HbucCL*){DURt~-bR5qckg zt`9C@cl7MnqwypBcVGs$04-b<-~WALo3bY69RGnAb5Pfxm=9Vt;?G}mrp99UM$6Up zufcr+0xkj1=Xvq{-W$6}{Fd7HaMa5@=k>jkOEL7V^{#1LIR6<>o-=2(cih+9aul`C z@hf0n#y=zlTg0re<@dHj>#hd`g#DCZ>zb9FbSZA*M4Y+SX#&&OY{$3NC5?g{6+w*8gIaKud zKCjDg&OF0D1ReQ`&*4qso)Urej%{57uEY6V(^e8(7Z{)g`k`OMyC$bBu-oln9&?uX|1bZ(bb!v_ zR83q?IIm|M#Jx{GyLv`ydw1kHpW3xsaG$)aPmXt}?qQ1k2e>alz&H4=Z~X+c#5&_e zd`B{{uj~8GwnvpUw!H(rMW65Ccd(bBi*g?F*sfE5re=6!)*5fAQ~SLbi|hJtjF-Ry zTWx>qlpMuI?-AGU1??Gh#H^cwU*osvD)yR!6*2FWzx%t#D*e7WFnCt#y`@?hgdG#E$Vy^GbE_wpyz`p%C z#BhFc_6m?dQ+)eA0E?OrrI=%ld<%MwU(eW_mK?=3-;v{Y&^-Mrb%qqf&oO7;lLsv^ z^PM%Y$CB~y!O1t+O2jay&&s&>WGs(M-1{rvuU!(fPg!S9yhAU`n(8Ko-e>vvGvX^S zkuTE5VBDaG{kMR;bs`tucj^$d_#LQy`#gMmi^}hh)@T%R>>FtD)%Nh8qZmIEYhu70 z`)B_-ha9qFAK=~-I4AgT==~mCB+hGJ;S3SyvpRgAop++?-WCd5*F_&0IwDl<5r)Bh$d{L%lyFX29i^IR{I zHSvA;!!aLZ3dD1R>DY?eR5^(Y>xSxRjSdu>QXOFz+Y>$eX+mZ7U{+Gb#mGK*a zSm)35H(+yp&!-{23(WJ~IVUmH_#UiFj?bVa-hnFi)qhKl-_eeoiM81Xf)A@&2@_duOMeQxIL!|P9h-$Zl#PPnI*H3GO!l@5Q6@4Cm}7P)W1 z(j2%=c?@UIT(}M`?D>MYTwAyXacyJXi$4R`>EIKXmGyjP8NVs#I*pNmOuL(HGR{o;b}WQG&Y^AqT> z$5QX#HMkaJ))|YueLsckXNfU8Jlnrm2h8(%)ShOhlJA|DH@C*doxCSoaIb;S#62(6 z)LS>f?(8K-;@t96_%?=TkG#5Ym@`KQ`b@Cx<+-=mr|1UlcdPawa!!0E z)|^Rv$hGE6_)M(IU3{NaLvQz&T%(Bj&g)sY-^4)wMSwv&$E*+oa-tn zhP^(8Z{emOO3eK=*yduKgcZr(Mz)R4_W6%wH z4nHeBc8lH559hoY9l-nkIcSLKCy8Neo=b#LF}z({5IiuJ;CJOvH*IVryD$}i9tiSdi(Gk1?V=TA{8(aw5<_%5*TJ>a+N zOk4-w+BT@g|3Th3;(7bKcfCVR40pz}n1U1F9rEm4qt;owD!en8@A}p#Ifj~N#5_~E zuEgwd2)2kB7fbvM?3u_@B8I)myD#@XUO&Tkpck}x_Eh>lrI&j(7z+^Ht3>H z@Au!^#9YJN{!HMb=Ah4=KdFj*2G)H-{nx;|Ql*U#ylcOPe+C-jN?k{tWBB(Cf98xu zE{KiyIOd(#|7|tl?+AVy`o1N}b?uqaE3|n&mnMdU4juU3ofja1mROP}uJ#+%7Mtif zS=-C^SDsln#kF@p#IQ$g^WUh6?UcS5y9FJ-XHIuGkyGEY-&7(fXJ_Gh~zs-ol>+kW$g`dJF_znb6?A?`k z9|-n}KLg4a)SeVu-+AoQl$<%b?-jC04F8#qe=jy?swQTgQ2e**--9>6JF+0pJ~<$P zd4YEB>mYzR3Cys)$5HZXPb&M`=Wza=_$iR<-zDnC;&;`)p96F4tC*i+(1Dgyx)|p3 zIlTq?0qWY$(*mD^HNJC|bFapPXWFmfIv~@-_+2o8(;tiX>P%wz7I;nx+vl#WT*Cen zuuntGUe#`5cyHElZOM1-tN6}oAHUlZbQIp6L0t@Awo6-@NdkS|dPu*Ci_;s$ZXAG=!btBI6zd^ma$^zTI4cd8{ zsLTf)#1b%9=#Ry9=G()2XzxvaMa(ri^b2%b>c{7&-OmLV6Y=da}W zu-`twA5-dof?t(Y9cm-U0Qu@?+toPpA`(L1;*H~J7>-;%u&fmbI zu2DE=`i%Ie;ICk}@}<#xVs*Xi*!HPnt-jygh#DQV+##GZ%O&(a=*$B?AJ0+VT=(cZ z*~uf$Jtc0e$`$NyM!x&{&B!;;I>l$_*<|!Z;>`aAKP$X-wbuM4alb1OIH2+^wr3>Y z0N2UH#-i_Yb2hbmZ-^=V8u$z1?|^%B#uey_ouW@Y`=iqb#@(~;@hQ3i*0;oS;RE0K z{9V_aOT72}tfco6L!Z6E`Fp-=2XVFcV1ZUbE_omd&K3{E&TW#jf)P> zc#vPuGL!oW@!LR|pr3*^KI9solIM5EeOWs}iz>!lV<{iQ&xP94UasN3s#yD4zvOo@ zFbO>)HV4j<@y+ebEB9*1EcwLD^&Xl3GlBEG?!vtU;~uW_z?uNq3ozyn@wec8C&Ro8 zBw~2){}2547vwm5BIiDwIe*y5$#6=*dd|u{94C`LS_KtejJ^za&k^2HZ(B}l-nGY`FO5zFJ8}Pr0&*m=hxy(Th z<^b-wL5mjnbI!kKXlKy#%?HWkdlsIh_w+k*^)Hes@z3F{sj|TDV(|L=f#1Ie#GYZh zzUSI=#O#sKE%-h0rGB}))|tN|-e7Oeu`2v4_@G`1Vq?+24!@7~J}tpmTx$;ZKg3^(dQS; z>3$UVR?o8cW8fF?#yk9s?H&~S*L?Mq_znAl8gIx^^q26L;KuuMedmZ6dbj8*YvS^9 zN{8>6rWpE7wg;|Xi`Y~A6>uGAX#{a4#qh435SswC{4V)&O5mS@HgM3th4YS`NepMV z2j^U3EUxR`E7$iKCj<^Te<8>JT-o`@5-~i}89C0l0GpD?as7W&`{aUp`}=d*8G_ug z)Mw(|UXYXRA7#Io@_y^XcoAdX6~D1cjv=pi_@gD)Z`mgxjp{1zcS>#r=iE(HX3&q| ze7}RZ@7<4}!LD*pV*Z?Pmb!pEdqjs;tnb$! z-2Qy@k60sOcpg3%*I1+FTH+mWZ##uc_|B9-#h6}$p1B{(#3El z)%Sj1DZKl3{Y1`1aue>TN0~z}|`Zj2>?GfZuaXoY9;1DEW&Iz!;=hu>-L6wB9FE5tl?x4@jPO^8dgZm!s z&#nf$&!M(zWA<2~@1ws0hroCKB`~k{4eESO=DVLMc0)|je+EvCfm);XPSoF1Bg`Ho z#lStJ&fiblQtO#6K)@^YJ_Y=Wxa;qMx`sL0_IUu>7|wH6=fKzA1?s?0=nU-L;k)-4 zNZ1$2lDsASThPSMGlJN?!jI=V%Y>iO!!vErV=>>~i4KWhRNE1k{{pC+7+06y6UzSO z&w7w|W?NSJWOTn4x{7r)G@?`JPvmh+#i++8wxwUF&>Ddpzi&txCC#wI@@_D{GLoyo0p*(2dQ-$~{01I+MSbf1gfCC59j zq!|7!If`%Id-yF7*w%Re{e7v$-^V`0?(Z*tFZlh>(&7i&+%>uC+G9bUy$(PwxlIvs zI^zC}a((Cd4Bc$xt%%EuBjDa9;4$_wx)*Bv{}Ytg+;z5LlX9se1=oRZ?h8piYkG~~H|?|qBT#NJ^aV#^D2eoJft{Kh$V zM?4kI{rVmBS-Y2hACx)!0#1L5zJWhSch+IsSCL<0dylVzEwB&lD<@XiIr{Ye_qzUl zD7?`b_M94Z0d&u4QZjGPdVY=QGFqH3!b(ceGzWKFnv1vs>Gt zy*K7oaW2m;(Au8Oxc_T>dv99kJtq5J@R=4 zx&E$}(Y>G(sPX`Ad>$>_3H48iJ5L8{|61dj{2RUnu62>zg!?OKVz~Fyjl4wM*)v)^ z+b+M)jLyy)^W?R^Cg<$kYKFZ9oUsl)FB^kr##zJO z-D3yL5u0L7F8q6XoD(?z_tOvIFB0#(Jx}0++_5<0C-wtv4Eub9-OrBin%<{`9l*QS z|1N@E#rWsM|2J{ni}uv#!+k}qckv==iF;;yXlD{#kSU6IZU?~MQM}tflNj#W9k@#% z@Rct31K(#pqu%%edx@>&7@q5o#9D0E_B-QDRi@ak-GIArTcC=wSQ~ITK72na@4F?x zfba9j>Ce3+bj075oL`|E_ze29LhIZ6UE%ukDRH?L+=a{NE9gIgDQNJO6vNNPjQ$(( zWAG(7q-PN81$~>?cffCxXOoFVL5udxCd3oA$c1Z0;{M(M>&@vvm5luq?mjqyzl^qL z5EmZD z|IH$y6b}D{rp_+^<2za9%C? zoZwIB#$C>l8IQ=sjZneIPDpANQ+748E~zAmQIe2fVgt zk>4AHOEJW6!8=2}r!~!cxdbz~1ia5>-VrxTQlu@RSvDJ z(Fee~i^MfQBLB5DaX!O)JcqZ(Px7N4?)RI*Tjz7~+^PgIZX zi|@#ixOd$3#aT|Bi5|wh18+wBDZJVh#i7l;@WkF z6YOd6>D0>%-)}~J=C`n|-INu1{$BVQxJW!x*KtPY8cSVs3E#z#S9$k0A%6}6Zi}1- zJr>W%cPtqPUCGrJ)9vA`g1Be*6yG(gxJD+=_5DsB!nvOYxbGd%!t3{OOeLax2dME~ z-i24}mtx=>bW7ZOm<0X_xpAdbolPqd)i`WVD1(C4!grX0@f-K!+FX1uG+`* zlRrj#jtyMDFF1eZXbXFO43voBjwH04{+wE$TZi2M`)=WDn==;u8T_B&oxk1434P*E z;GKU08e&yk%eZH;+1uJv>i&Pa-XBD+E8G9w4B|cWdwTEH1N}gOf(jHUa8Q8)2M!jE z0tE^xaNs~e1qvJ}s6c@O1qUI77{pLq%pfjiI0$2!iy4Z+49#GMgE6MLn4uZWATDM& z7%_;88Jb}j#AO)X=d=HGpDvdde0#0EzH6<$_MdaATGDu4fu~?sI`|P-JO4eaF^sL# zse#f*<@v5|T)sQ_jCJqEYO8NBc0E0|Yc}2!bixe#1C|0q{;w^H+@h z{l`6f2#h%s>={1S@jlu*1Mw%I0}FM%%RR9jFvfaYxL~ZjgKvm(N8ZIA;hN|-e%|64 zD`OPDT%Ln*fCPHr?_F}Pc`5_kCvg7VV0%6rZ=E&qFM<1LtfH1{u$N=dQO9`4Q!y^^ zc_zyp&bWw@*UMphm)*zRI&$l_+kF|y{|Mhdf$s!; zQ!)P@{;z@e(in9U=MyQ4=Tmq;vuDJ(9=T7@2|j>l<{sI{cfftkX9efn_G+BcMd@#W z&suAA!k70CQ*m8>ml)7vWLNp2jsHX7d_CjPClG7c!^WD3dulIxCCYoo{m=ao*WsH= z&-fwyi5wUhXHf&!;6AGr`4(d@{`pIXZ=cxz|AN1cz64s07W)o9&!k5`04wJJuYq<% z*&B0vY-NMrnvd~0zx%saf^&h(f5%VG$hgUXJ-}Hfush&<>UFIz_ck%RvaI}*J=`?b zTCOG3J7VAOk?$I&qF=agZ-Bk*6VLkubW!%yIP;Vs&->BFKHslEPs|+HQwo5zm=2%M zm~rm?R9vrOto_~uQ@PC8m|QE$Stoo0wr6Y2DS;ZXm-+-qyL_{Z4ZmnO!G1UAg?{`-E&KHO6oqkK;qiOYiiE3pIqCTo1bc!~B| zb$;)f(nlHlEE(4^*4MpW8*{?Wdd6Xw~e=x##fxgm+!`lly|-m4VpC zjo3euTGwY#IorcBJpUQ2hgj?FO5ij97q!M2kG}_R&khbp8~mkau4nqFjlet7}?A}2J97FpzjkW-(xq)cOBl( zrTq6Pji}mqVcgj|CNb{IKftoie^_-3aV~wQ;B(@3@1}7BT$`umHT`nJZLoLc3N^n3 z_PBzUoePXV2#2(%~S>QhbL+r~wzu##OKO^rIwcGbLwQFvo?cH1e z&+%c^jlZB{{~5VA)=luwtzF~VdAf&w*I&Z5K8QM#h;oL$xBRSbd1nFDSd*VQV*U;; zNEB{P%nZ(Xj_qYCQT!YHH;H+@!#~3J+ugd8{54!q!{_TYupifSLEzoTZ{hENzVbc( zggwXCp>LsoC9fX@c#7Y1&{kY)gX0h2ehn7ZjKb+};<|iZeMg>v-F@t$MEZM(@4TOq zcj4W`E%oNkH4*b#9d&>v1F`a+V}O3b8Pm>VB<=l027LA^TvyLnZgWs= z=fwXF<3JySQ}B%O9Jnse<0ke3ZLEIp;}%=#qSRNr_s(UVvHCrS1gx*jDyMCZ`=xH; z{@w;n>>))PmFLsFbUi;MYdF_11hrXX6Tgc+1e-~&{r1G!yYIArR_JSDjV-*|y)eel zb?XeolC= ztv$evKx$7dn1?ca49FXq7cKf&j{v5$^C*SrG8^o#?2S~>5de)YG+YMy7?WW?{?cfEb(pQBq} z4=U$e+m=U82dwS;uLpkC_SLT*;5?IrEe7DeJ;ZkpG%?Tl-vZY2b99a#iNA*Z3DD>K zH-LAkgG=B9+dI&KRfRn^`w)8roOc15xVF!0y@WrgWo>JY;1K&`ux@$y662%>Yi!@` z-+-3y*~%%_cWh11!2N78MCrw6<$G`h*W**n8}a=eJOP)gZU0RMZ1>#S#topuXRerA zuVM+e#Exj$MGuVMgR_Sfd;&Qi{|WXB{CB|?+c{o>EbxJEL_3Fj@)&g5N|etzd;0*$ z+q?HI;G9FCR_c@9vbt|3cX!~ZJ4t|BcRb!2_ zrwP5lV}p8bOzUfdE&my4>+Olr7S888 z;tm+`3uTD1SH8!Jq3HUt*f7!0m0`re1~qLeHKUj0(jOJ@@lZYp7`&n@eK&S5)i?ViOZdu1UK;TcnxQ_Af;oLvhJ{9wN;`WK3J@Nzmbbo^J4QhQ4 zoGWwq#)_Btyx$l06>g3HE&TE=_B!K$`;p+g4EF@=6YrwESu4fGh&jIZ;eQ22ImVuI zXoD5@psoL)>|f^?sPmq=Z`ki1lt1(K-y66eO#-e5YR^|b?|%(wd(z_k{xnYV4Kv2? z2|jo3%RsFjG?~@9{{HkAkk?wti1P33Mzrg3{`TjAJ-z{7hgO_N{;vncc05F}U*LNV zT*I!kJojMUc=JFoeudvN&4N$Ad*ph2XHWOTwRi@`EYWgzf%A{}_K7(U;kzl1ZD01| z*`*1m{{+AFJ^u&t6NxB$mEeb(-{Jd~IPcS5fj@$K4Ho3=lVkjzqcPUq71uF`y98F) z_9+y5{H1x3hi5-F#JP{w^mp5Lz#QK|Tmbb6;}Pw1cJ-jd8vhnZ`13sIH}J>!Zh{WG z&25bPe>Nsf>7x9e^BJ7=%xTiYt?;=HIoFo(Dc1P_pZ-()TVPy7;aWcf;}O4oKOy!q zxFGNeY~VkIv+pKL^B7xKK8Tyj$oK@_yX9Tn<&CwEHT(d-Pu$DDfwYG=cUgJQy^lQ= z@R@%KT<1RVS$+X;J?EK$Mb+laE0_0-n5^-8hrDa|fjP(MF(xx$U%~eq;P(joFm6{m z;^YQ&5C0Tw!F7CVwDSdA0-n>q;dehjM*D2%zM&ssTgUsU=y$%HkCuB0T6~ErKixki z(BAa`_Ax|u=N}{X2A}Uh=Xj27e_;$b#QtymGti{R@1Bn6Pbzm|e*95mK7?*PFb_^D9Tl7=M*dGDol(s(uoO3%*7+2+8 z#vNnN-uvl$^gf7a5!j5Mf*zm#+!wtmLzMnJ3#F~8i}L;E%Y*FBKjdb_jc~5{4NzYO zihKkHG0yodSOWKWDsy?zMR}Gt*!J((yKx=cewHBcoeB19e9q|_oqxoqb`RRR)C2w( z_`d`4i^iibF<#ZNdoI`T0IsbkQKRLpi8+DGbD9emK+z|BCs?obk)rhR1^!!L26qUy zAXQs!T+UI0CO66X2-t&l?_dvTV-K_&R*T__6wl z%rZpjH^(qn2Os#FjM%Ra%5(3!-UA)JsT`AI%uBEUQ?Y;d;R^n%pvUf_?9~R_o;SdL z2mDDOeUxYH9-J5%yDzV>-vx>BnP7j2?*_1s0LmC;-%_pZd|%6>kH9l*eFJgUwmzXiq)@J&YJ z!B>?tzKhDDM-cFVUZLmk3v-Y@>RrsE`UBq#-n=A`56Ce#3%YUkXl=h!t9#(NxsOfm zG0tnzhwZa45LM_*!jQ*Z-eDKF+Xye`_k$kW@myYs((4U4bL`DIXN@PMBPRDW@!`&~ z1Ds-i-+`8AodxlIWV-A-(&&&nEXFmzNXKWOf z7hnxeft)cZN{#mze*ijs+OFF=jz7b8K5>k_L5nT$d9v0GaKhLcVNLKyY@fM1U=F7? zW`Gk3`)hoj*BV&Qe%W z83G6K|2NN(@UELb71uOIS$~V`87sNh$Yx%zynC3cuQ2Q>KKEgtxJTwCVj|F@iaBx{ zbRT7X_lR?y?QX3Zw>|>fXU#SE?7KF(0qryO8vP@Q@}Btu{t9UOpX1=(!RLHEb^;w3 zfqfr?Q=qTq1-5-Z2R-%x>|+h|XNeMj);DA8{ntU6%NkQLZU(=E_j|$;dm5wdeD>30 z?@Hc(^6aBYjtlz0_dVPZFm4W-1pK__blCD@1g`k>_dev26SO&w`#^&% zXvbsaJM6ZHnXmqj5Avw|AZAtl*8ChS7=Jj4v4&?o;8$kY_Amwm(B@Fv(*{_x`H9N1 zG>6=4z`Q0Mws-F;@b0K z2f?_lyT|T{pP>WpH}Z`2jrjb2d5GQ>>pQ1=c_bg_=g?!fo;EEP-wOLO@i)Pz!0-O< zgFOplo%1dHOSJJF$n%pwm0-Mv^B%drU9qn7xbB`(YwK&WVf+fr@!8LDwHvSBXYof8rRNT9FH7RoiE$Ih z?#XTPe+TmUG_vY%@c*sCdlFFyb61ReAaBoe^cB#=SmV?^cm!wcu8eSZE4PnN@Q*9+ zoLz-^asxQU_YzF^4mS6N03An_v6(3%6m`G?y7lJdvM1kdx`FWeOcSS=GcA)y#&`lTiY?5eJ#*8(bgNOJ7fGV_H*EOvK8YVzq!`d7CtZP zP8-}~Y>fM7Eo0ky=H}t^85*(wh&JE3ltZ*V+K)Y(Z~u)?K@h$peD)pS1ho1cygfUo z`JP*jGp~xZzQR8TOW^sg@ikds+q=D*zgO^|0&DFP&s5%h*cW5J^1?p%iF@I*X6z8< zOgen7c>t$C>4F~uk+a@No_B6-9D0mQpZzfZ5P$1oUynhKe2-od{~Wxl3C0=d-ExyI5w{@PL_^ZTtH?pt#jhSPg0Dn)mKli|X zJ95N`{XPCmpvj2eydIsOtqEsL?gcIp<9e*o0rSjh64-a(AAm1_eI$HMdh8XxIZ%5y z?|}{W05^h989!yLIIsJhfOa3{-~YZ%%*ViW>1z^(bhCS&jr^rZhf@*jeiQaFc#aj$&HM! zV0$;6=R@oyM~vbfcn#by<6o;IQ+fV7aG!!1xFC$}ul4S{_whv(T$T$mn!`L;sw*zA(??a8d0T;ltl@GAchSxTBj_q9X&bI_} zVouPXqy3xZdnzaRtosmH z>n&hh6MOE1dNt1ejL-WCH^Ob;%iEEGXEC) zJABsC*JQ@n_y=HY9J+}$ns^tSbDyl>p2FF)z3hsd^YpRHl+TqFoH5EYKko~*yU0}e zfo^0#t|L^GOe8%4?;YX2OS^M;2KH?JE8-T|_Tab!_Vp4dW0bXCBd!A{;2p58yfIPZALBoj0|~Ts zIlp)p^wb+c2Nd^W3GTq%18VD~kVPW@%+Hzc81L7hulfsH_PEVs%{I4uPi*6+{+6p= zQTJo;#<_PTO1(h4H}0u5XXp*ML|(3IoWOSqM(mq#)0)rmJC8Bucvq~~`g)3eA77B$ zu#~n@Y`c2uled6%T)%Plq_}rmVE><>_z}x#{@CESf=J?j2t=X~X?>zeYD4#c5Y^BBOSFG!~ z-2)NXb@2yz0XCI4#vIYazP^R`PX7*Vt)93h1NLQnC-C0CuRsS9{vPbs(`W1!tbuWD zKDiO}_*X#N+VdLw|M~q7+qfpdcm_TrPTn&Ncw;*3gjP1#?(cozdM|;+gilfCIl*V0 zWB3kVK09;({hpsXKR2oP6WkL2&+wb?Ts^)HWI^AB_x&K({B3XSGe2MGCGd<#a+D$J zdlp}hy?`IE^(%A6j~UNF!kz(ZG+ALkg6pHa+dL!pDDOEw#rQGG``CMT%J>QTcoNsa zoAVC-EpROfEQp!axFE*7UxMCvAUB|e>$0DA-U;85@oR7c?i5(_4sbmkyrPz~)-$yB zP4F%_0UiFg(F59dr~Z)~*J>gZ$GuFAAIG=sllbpS-T7Hx>)h}8< zo}+Ul_%+%;&w2ocI<}TI+=IZ^_F}|-3+{d3Jo=B&uEp_HbcY^^YjVQ)A%3-U-otkP zr(zv*I-m?uY<(h$CQ*Lh+#KM*z94n%otSaY!?bky)M2;v8ETGqV`zSK5>@^T zXKm+?XkIk7doTz0Ym9MQ#sgdr z>^}HToa4U&E`bGO&(LS%=OFJDzLEGDdW|ozr_$!P*E~PGz6Rra@S5Dt7?2q2Ut@29 z{*8WMtb7*q2WQC<`{}(J(0#2j5M!LRI&=b2$MzSZ`e3up7kSkBdCwx7@r60xBjM)twzqLMvM7` zoFzHdehr36{a|cf5ToC_Hto@SwZJ#RS>sE_-m9V3Z*!=7c;5q;z!uy2dg4ZOLMzr@ z0c&+&0rLD&`W?{bw7Tw%HM8LV2>atU#_73C<(RSey$ieo`R_I^!}Dj2@tpX7!iROD zyj#+==F}#{*uR0PtZJ^l6`c1~$!mZ!XNc^|KkP5(7*qMK@#p}3)rr`toG^C(d-9H) z7ioK?b}skGeVNP0`FH9L+dONI*aH|DkBk%cRQx_*t?%R}(naY_PB>?q->`vt`TXJj zu)_zr*YSBqBX&Y}=vHIScvXGgAKxF|k6fR)0rWtzhP4#^qSeu--F!i;&rQBZ#O+Gp z^Uqw28QXk2K^^|PHAcNF1N>4Ry#iDDHGZG}E~Z|#oVd&8fG^dIt+O$|#=8C8>{FoM z7}0A3``Chy56U?03Na7hz5+p96Ys8j*26zSkLan`w>=wY-_Elu5#^3JzZgIV^mibz zmFc?Ny9NG3@C@5^^-=!3)@NqLI2bE)Z0CQ0-_NKGc9T4hWAGuI---0~QO?nOVr?bQ zAKA=5R``E_e^qlF{|Vc^6yqb#-=D_1SMv#zW>ZX!2>+khGV7rdGxAfu-+$cX0=W)#~W{5&M z&r8t3y$g&Buq*oAJ7sKb_j6h89-X2f(1(nlgOQjQz?$!&AA(e4JL0UJ z1v`NN`mPeU2CuQBj@?6JtbG?wzkS(DzQb^5f_;S;_gHj{2Vm{I7HmH!zW~Y_{|4A+ zit`vb<9p)XG8S%ET&J8htZ!dEaVK@$;;obC#u4z3$+5?Toq#b}s#jdR~3^(eA|) z5cr!6)H}rY8odPHVCTC+uX5&(=mh#e3&gc_L4WY}JBPo9cAX=B$L`H*e9yph@HI#R zG5<350FI3VU6gmk`}nlYx2IiM<8z*e#5qqppBCqM!2iFw_s;2_4AI!4JI4N7x9{Ox zw8DM5AT4UvGMY2w0*vZ-&)^-Yv3)Q^ilkBAA(?{RU2I`=?|iW;!89{vru0^S8-3^GP}SDT-(-6wrbwv5g1 z^$8`)JJ@GH*z0JE$&PF!urYvJ!9w2U^jWn_*?vPJ}+~|3osDl+&%Eje*^T7_>*94PKU3Fx!(0p z!3O&!dWCMixetE?=2=UTizst-_@4u7Bz)F3-`FG2;}Zd#YkN@cb*l1=@qKU^1iU(- zgZNw6ex7*lerI|YTmvIq0wZzmh2tI!g7Hbk8vWrx@uwZJj%WJ^U`&wP#P!*`G5Y6d z`^+D4?0y_t_Pv6zCio^NnhJfGS20o@ORMWOvQNTcYViT1xDar4Con1G0iA@ zeiz<%#}?iihuGatoLK`tpG*5o*i)I4`$OfNr}ZAh*@rpe5PMhLD>?U7X}M)|{?j?! z<9#wl`RspOYwX5&*PLS@ZlBoKyTs(VvEP8p#H*+MXuHR+D}Nt*D%QV;&t84DZ%lY| zm-y4fH_g>vz&!&mYn<^B5WxHq-QEZO@2Y(Ur_#YYw|P(CT*F6b{pR;-YgakN_O2)q znx9{&oD`%_s8I67I`4jClqGF)|~UP6+ajID0}F<-q(kq!>2@Km4CQ5x4=N$bPt~4o5r1Iu+MP* z`_ZYi+*R#uh{9T91Z({Ie7D-S(g$-^zkDzrfZBTMrG79Kxi+7EdY zHZjgXT|SunSp(y#`~uG2+?)Rbvq=w|TG#j?%HLI-O!yAp|B&N3tR{Zrl_Pw2;64Li zgXeR6p( zfV_GCO%2}{?o*TLdCPwZ_Q|EnS$|i|b8n}$jGNIT$D9|47LD2CfGKw$ggMg3ot`xlfUhFcwYnK1{~V-?V)VJA6dhrygxjKA#=7(i7`^tLj_T@fexT??~4ib!`3CTZt$? zt+zD}Be+m+C z-VV4v>w2DtU{{Q{=Bjf4!oCIe$w-X+6EFwn3_%;92VdYDt9=ajfU)r%=<$0$rs7^Z zx6jAAa>k~ZMpYZX@1B=?YPfFa5owYe*xy#a+y`J+Tu1J4QrEtEa+^5zZbXZL+hCvF z6~^8H_gaZ4`#+%P_}+p0IoP&*ViwqP)*SQ`t2ob$Sb6K8%^?{j{-5wKz)wlQ8RNPC zNTR&QH*ibm-4Vavo%!P;>0Vh^oW&5*`n-(a{{3uxANV==7Vxh2)C#bz>+{~psfBqP zZG27ijpUpOoO8Qx7ld)^Yq68#xN&Jx+kE@(qx^ZI&+jR*17k(*8oncZDHwyaQ(M2j z9{rDl^Y3?fFNnGJ@CfV^=W=h~1-C)(oI7I78~mQB`{rly4KPOSjrbXS$2fuZJ!Zf* zSAPKa)cspltuKKU;}QMlfce3$^l&G{d=KYZ9)pgtV*M1Lj;-%==W}h`Ly+W=E=s() zm+*fKehut>gfp*0PsRE#;r{~n3T&}^Vp`k-eD);tiJ@X7R=;;K@b&WePQiffntlg& zCisjw#P2$q7~4ArE8tz%rz{w|FW!0c#;Coa75lvd=Ne{}w?-eeU)DD;*4F{!67lj; zF`(tI;NQrD4xhH1w(kv}>x8YiZ%g=j#cR0N*#7R=N68r&FTlXq`u^GJ+h7e|fNP+G zQ>-&Y(dK*%_a7kPbFLBX9PW+t2IIbR3H=-V@(;mOZZme@j)1&9&46pk^HW>-72}AK z|0TAudA*q}Iq%{7zH(2gk?&^ZdvfJ_{BNP<1E1@4ZpUwcYhMEQBf&S>Fdi8n!8u3E zZ+r)**z+HNb)A3OgS=zsII;e&L_K%sn#@1qcYdGiEeLGK1Ae8Ca;N9`T-yfZ&oy*{ zQ(7OMzh|+XoNI0ezuMXN^O_jvJ&S0bb3Njd zzXQK3u2D{;Nxd8wJR{_MU>gMX7ClB_gW}Kfa=dy!+MS46vq{;s0}u@i}QdxaMo1$(4!Sd~0$a}Z0rQ;WCH@iK8XZu(=L3-M;FJg0ey3>iwsw>?`wT3=z&O*y29@D*C0-Q_#V{GH) z9BaE59eMzPEuLd1V&>>pw`V*6b@rismbTzF&_6aVmHXh_qNk3vva)86tyudNe(y!9 z^|~l$={an`5(GZaHt!Lk#@u3@^RN}`KLHV??&sL^I^I%4-ut}39>B-g_BRkeXY4%o za2J1oOCZ6C4Swe`UU;WYKnHsG6*{Wz_#hMk z3!v?K0^Q_@ahuZ~U6V0wez|90fzLeAgO0JB>onG}dnY#t#v72p2tvC`#Ce{vUmuju zMAs_k{LW{d?-S2;39Q${cVGl7eB0_vjGe=E_n-s5_wxRxBJ!^9B{+sl0=tXCFBty- zUICvO*EYg+^1ys~@fLUp>^0=k#=D=|1F)Afi4yDlBX~gWw6`Aq7C!&{#NQ|12F|mt zHH>wx4t$3H3HSjP}(%EDORbH-6^>u)O`Xg}Z0mruaD&VK`Rb!=_L z`CO~diRa_Ky$9}qK5|IrPl#!24E)aHI0M@rNBnDSzv~P&H_$7_&hNRqr-x{JYBI<6 zvs7*g)@xv&lh8QV)u!4<-Y>EvWD|+4(Juwm6velrafGWa>wMq z2g{w95#AW}$MD8|2By-RgKv($Wz0^EpPZXC_r!UJDEpME4)h4jol!5J72~%U>$?nG z&n0x!*a3Zl?;gGpyPdh`6O4Z(_-?~_A9tmPy8`FA#Duq|_hkmmbFK?Q-W&YWoUQq_ zMi1Zm8n8$FFTuLEntc7FL3VyYls20M_`e(-C(; z;BHnf^Ni2-0eeBb{$pa!{1ni(miOgr;9jnFYZGVw6FB$Ky>`3>Bek=jJFvu;_Y%D% zF2Dx6hcm~RCIhzIAu(@*p7F?dL~9>m4?z1u&y{z*XMgVHIvD31cqPd7y|T6jxQx95 zo@+$8D+#SwzmM}hmw)eodO+PV&ixao%&Fnr!XBMNdxlo>z7lJWeLREv8g$rlLzMGU zE4ScsF8n9hFM#W_*D=a`*3xeC`aPjz+~(4M9efJLIuE6@xG&%0PjXRu>d|xj$KV8L z2R`qB@mUzV{u@9}`3v?pAkQ20h;6S+a=gR#@eqt~E5;pmV9WQ_r+<#$bGK*bzJpHi zinSxMnSb=yuD9_zUz76`pZQztDHn{z27C^G0-Uppvd@0^l2i0uX1oB-tLU4_qeTzo zr}8hx!aHW|Af}0RPVl_}?v-&pw*HZ_QX=Qb)=8IeBuz ze(mwEz?i2Xh)bZu{s{j~bFMChstQ1@c<) zPjij22W$S57|(smXS?R~YA_Xf?_lO8J)OnCwRK0FdC!bT@ZPT_^SciBYAW8_CLh9o z3)T~#+%0@_ec%{G=&i!ooXxHu+H>&x(m%i{_Jx=z`_RKhwVmHs(L~OE7C^suDzMK4 z-m{Tg0ppqkoIQVy|L>J=J&bT27;3!x{A*&oSFMJ+oz)!MIer16)_q=cPb&8rTwi@X zF_&tr`>+Kwu&R7QHrV1maZ7MPqReg1Cvf+G&(vk~h#ug@0$b7E!p%YUF>d1hG3UtG z8sE4s%6scC#O#V|_qiItA-D~;oMM#@-SA8({n#bjA>G zFZz`Z-DB@#rZzP{|#8QdB|zv{&*e%me>(xK6L_~ z=N1fgtS_gk`1cP3TFJddHp>rk-M6F5wvu&ZGynMh;QaUX5&xR;X{|Fbc3q0LbuPj0if1#c^Z2fxN*5*X zzwn!H+*CaOQ}8~x1=?O%Q|XD1DC_*kHGO%mc-?E1U32{uC3$PTJ-0i%QWA#hBdu|r^X4!O&*iupR4H0 z>#kbfv44Lh?hzB@w)!1$?Ori@vy&rl z?f;}^TaWqH8G-Mh1h&|7;4}XkE$`Uer@*>bjh#x=ePHcx;D5&at*@yL;_U5^n4#wM zXzO-h4V+WoSowq)yToq~2|Liopw-5k#c}q*eSJ{waYQAj3f}we`FqB@b$l03IcxMF z*GJ2}ZH)GgjDZ7Q_>4I=FVOCz?{{tQfiWL3?y(oZ^~s%T9>y(A{lLtwYLYe??d|2|dT|K^-% z*ZCg#Be_Z+=WEtCfF=uKU2hXP^Iz)24lteHy?XTu2%2LPpVxR}%`x6u#{UMWeW#81v#1%n zKR3W3vF=Te|2ewdNqY@r1!B#=!YAiYqP)+dj$PA;Pce7F*nM(8o$DHCdo?G=zVbNA z`JS}8xx)F6H~8<=*p`3JmUo}emVI?`&J5UMiC=zgjR}8=vG+;o15`UZCO^#0_4UPs zsHXQp-Wq3dlQ8H1p~n0T-PW+h@7^o=>~B|Q@ZQPR+Za0$jNQus1NOf8TZZ$=xA~K` zL6gPAZa!nJ+j6qaxJmQ3vGu1ln_q437v{$|&3CQJbUyiMUn^p~qb*Op#@BK@&lC8m zTxIM#(fU5~9hk}y<6Zn1-w(fKkW52dX6vePn4cUwDs-VTG~yl(Zegg3l#VF z3$TP+18Yyk{qfngmUnY1<|gCyjAo#yZ3oRfbC?laKD zzTXA*>%JX=4QO&7?n`hNJOIwqYUh|J@6ji4S!#_s%Kr}If7RzEqU`TwHeZ6DgGyOeS z0PO+(I@;VMu(xRYxdKkGo#PsqihHwxTZ0H{GhSj_%lq;S{1V8Y?K^SK=Uw~|_}n?) zZ$WPjuz2`J~zg_L@U-B0|Rtm4mXE0?qh6Y^JfC%88Ak%rkt=h*BU@^FP>Cx zjO;p_$9`VHeE>Gt&L75L4`}z^+SCAB;WI{RXIDL<|4oWfl9R2ibIv+;pH@b$pH z9uVJh#dquCbpIAB=lo9}Cc7n>z;yTd~gbgZgKsfkRY@AP4>! zJT<3E7Z{>R)H6iuH_u-0ACx&e{S#?t@r68byS$+hr8n!$oSSize8!Wpeq*c?X#f8i z{BN}QJ$6@~!;i$dZsTrFVtV{ZAYGi-xkF6j?EN0&fKSxO8nfB+T6aC=pw0KrehoS} z#~ZZu6m9$QovY{%>_g!HUg!~do|E-kzPxoV2xH&x`de-J-aP!bz|=3NY~h`MK<|pV z`mJl+Q*`#lPA$d>-v6%x*SQ5V#-o0L^uZ6X!f(tH{0;Q_cSPTuIDgMrqnrGNvH8xm zD@%ON@4QMxx%=t?JRx^PH~EmU@d@3N(??^9cHe#WHgH|#>^W)IF;*6N@0Gu2?uzea z=gD&scP7MdLE~aFk1@`BiQI?aV=x9z5TLKN=h+~4;e4$J?|%9IabG&~kmh&X=F#V~ z9{6^p$0vMW4d|(KUt*8dZm|R7 zHE|=Hd)-a=8Dsa)XUp%G_rO$!I@~J? z21vvueCF$S-5q!i7TWL&{0aRI`j$5EJO+GC%oiv4`E%zJa+(}t`+PhD{|Qo@&!6`Pe!$lQMPHLK zh_x14znC2~_M(=vf7dsa*W|m#4(%SStS6=tWsk1I&nH}uzh~^ZeFAq2_-7dUv!F*X zfEh6xc%QXktc+258qkX8CTC53&eefS_#L~3%h>8B*1e5y4z}3Nzd-NG808$jt4++k zXKsxTY;*O$jcu(fm2Y#}i#|E+L~QQUo}&1FhyR7#jts<_w?&Up_S*e#vcz_7_u(_3 zZsPo{hZTP7Y$myjnrkl~R^De+v1aZu${pV_c71DkeAW%LGT`q6A2?f=1Y*tu5K*4l zAF%DEiTlys!8frV0q1VgVVmQ+x+uTzFDAUtpWj3N2-YA?IBP`B|23R_SZkn86W?7M z;O`%DBG-tzcj({X^E2GFAAz$uutzWu^BKIk@{T)@)a;Y<+MDx?_>i!(1KN5E5a1fIb9B2W_TW3E zN9SDPr()bC_zr#m#`*i_6|h&}JsZz>pY&1x{9PXV44BSkui1yn66GA0#INDx{a(K@ zZjX3x}Lzyb9*|iyyxsa32G^FDYS}=vH!hh+yM87gYqt|;TM!=>-^8_oEJz2 z=Fj2Z1_|5uM*Kvq^F4*TO6+gzvB)3b z(ghZX3j339>oH!gjfu|U_>{N-eu+M|Cg_3lC{L>{qcXPMg*69bkidp`&wR=ozpZtq zell{7YhA%NZlsRLg7!V+U1@w}a_$`N=fL~6sB@h082UQ6=U~2vx2DgE&*ue+^ZDMu z1u=myi7Mv411JA`uuo3NTfuqXyEu=quaU7n?{){K;u*T`0sik*C+w+ojGw?czp+zs z-X7n7fhG23^mPBs5nH(3Gq#SO(dJ$U?)?xyepk2k+kX$gK_|5SIeA}$Ujg|AaF2U= zpx4^8wvE-9L`Y89>=gMbW{vEXI zmrFqHnn&~i?AzzleQM%7=GwPw?ueW2ZR3q;wzZlVYo6~}WBwiOoW|yL6WfChxJLDv zFm^9qfDSu=J-QzwajwPZ?-odm73Uc6PkYoB9}(y0@KQdC&zf&Q0>6NpRnGAWI1XY5 z~|td#^$KcB+mOVSKb~{t>t)K<6D2ua|&J% z=l9p1ye4@~jO}asT}0k|I&c+CF>x#QVPiuEBi!aW4`W z!F-apWNeSV`|VFC?qdqAi(um|_myldE}V8hrL`}|AwJwVU#d1t2kIg&Tv`vm+*@b&Ob%sZjRJNUO~=Mwg= zbW!T}j0X^K-vZC@5lHYIh#H3{_w*9Z9%ke$fia5jN5@mKwpak?ezU_HyRMwNiM?mw z^Ltb7yOHRKvQ~S&0XoJv(Fr}3k#T@6b-W+by=-wOa9{rfXS{pj-QE?skzDVtYwY5D ztqaCUC{eIt>@#EhY2)Opcut`o?RT2lBxZyCH~A>RP1n?X#=nE#g5DTW#Xg59f7WLW z*E&vW=P>vVpM86ejaz~y9lSnu0(Y@Brg| zFp~=~k%&^)+9$+VOVO_kQGBk)7}4YNtc+>#c=CH!epmeWv9F0AW9R${)R*U;^li;K zW9PYdz#M3Of%dEexF7CmUUw?I=ju8;^d)rW$hnK%qxXsR26O7Vr!ifW-i&Fyb-WWf z58G!!F7u2NSix_Av5tLDEE(@g&V%>AU-2O^3t~jzYhsLJ^L^*Lu7sWE!))_z@a4TB zwgdUzq800};djNjpq~6AwBxz8(Fs`FcaOGnI>#Y!p11Jl*t&1V4#t7|aMsLYTt|%e zNgw6kg8dtOV5bJmt#eRAG%=>HXq;!hEBfU71DH7PV>ixv9kFdMr~C-_8}j{JUhaum z;CEflHIuhi-3#mFarL`T3vGBY5<8VOT#qm3qc@D*;}!6{-Sb@u;=B)k2UGDmb^onp zUEh-@=(bLKId)uoRS(n}fwps5(|chL3(&(Qffy6`mf%xjjC~3sN}RP{g5(%2?=xbK zz76^*X!Glv!P}R;8~;5B{5b}l;5PVv04uO&obZo8+Z^Hhw!_!N{1bThps)TV3}`4GP~g!|M3=Q#l@kbs=^tmC`7)gGeoSMbUG9d!B-bG-ix^8E9M*C2&V zl_>8P=V|lLs@*~yFRO2kZn2Gbk39?PZqUM7iaMXCJYv4Jn#g-+U7vqG5mA@{?f#}Z zHg8sAyuaI>c(XcUw{X_+{wKy$aev;B=N-#EPWZq!&pzyFWb9cvr{enl$k>bMQ8}3Z8={oZ`6}Ged8{J8<@*3{mGtH@N|SC?Dm|d3+X(YcgYOkNR`( zjc7W`zs2|^yzAQ5xf(sdzhAipobU0exMt^Aq1`*zJr&pE*&64)8)C{9yNA0CXPs^* z--tOr_hSr}NsQwrKC>d}1D|03Cm0<^*=zUDJ?$6|;2Qkzz@T5?%RDj47$x6lA_2K3 zeqZj%ai5&y19@;#$E_dFHR%i50B!yiK4U+Ex4vh8%-EPFBetCP@DAGf59NI#8gX0tE^bRG>hCg9;Ql zP_Pj~G=mt5K@5#ChZkW?GnkIgBgm!49#GM&0tJ3m_sv|K@7v;d!GHi zZ);1cTRk!Uq1F*js)ds$E^p3P8uR&(`9sUOWg8U`gdASyAejw%? zegr;m4Y2^;ALEYyKKlG_!SyAlA+FTva{v2EbOsO&%htA|8r_uIAiX; z=ji;a)VjfkbBr!3n{}^G%}|FO!2NQ~#yy`e!K~z%HwWf9?qj$;;8@;4_o0JR ziCMn{O=P}B+pC5D1bhq}cUT{sl7d{~KY|5t{*DvGl?C=GI0KIH4SbjrxsSO!_^ZO- z#CDA10_Sswm}lej;e1^8udqGqjd|z;bW2a`8le9cIIlUnE1dVV0gr(5H~=l&l$<^6 zsXn$f)$icXg}CpG`(S~62zoGaeU`ImNmZd&w%4Qk1FnM3g%0W&Ld~0vuyY2up>{H|9CZO%#w|`E2TU>+ZyFxc{k#(HwTks5+o5%}L&udCd_}$F4v~Wl0D0%ww4Y2Q1xbMLQiFa#t zZq{B9@{J4U)NS)5%egkkvVK^*8uV)7OW+zBeEXQEm}~sMci;Uzwu>BdozDFwoaYwA zIY>JGT|^9o~U$@v|er+oy?(tg$J4 zl=uYy@Az+k(na<^#5eB_@R?`@+!4A*Pto7PS?k)~;&;RoaK2|ieF8RM3FH=N&tWX5 z`1Wx>%+sz?_iIJ`JK}!;5rsuN567@ZIHqG*r>N)no{xL#*fadGw1rEN>(`_DnrC0% zHSURH2DuIB)cEexeW1M$i>!|U6*W^{nsry*@4SWM9yt{Mo9`M~XRNKfd5-NIHsEt| zj?q0i)`_RYYEPf5kMZ4y4tPF}eH$#W8!!d-+#@Du?WDvy`fC4BIP)4}RT8#ixDUQN zTKq;JE8;$n*4MaNUkS8#+&Of?TCu+a3Hw~EWj^LPH|Ho{*H`l#>j|7aOu072{qz0jdIkx8;@7pv*Y*E~xViRG`pEZShHt)i zLSEbiOJY4aqAfKocFpm*PWS<;Xde;xtfwI1*FCZB4(LX)rr6$j`6%P`#D_KEci5gm z?bF~t!0&|l_~#t1GKceXayZ8v8s0^&sg0lJyFT9&y8R)_BsLt<9!?}?wpU_pT|0TS0xB<3hSRXZ>(F+h;Ir7e92^^!RpHlZ_LCpVF z?iAex=S{t9sA8S`hPdyECMuKH=DFF+x&v?*Bx+n^L#~|Yu)dl~ z#a#F4OZhEH!JQ>;AMI^1F0Nft+mkQXUcwzR{=CeqAuoY*!Jfi(Xt|&5=D#Q4T@dHJ zCht4=w)VP^k;m|E)m|Tv`$zMsjVN<~cTXqa2)LF6x50jc?frWV4)B9`6?^Ox{~mk; zd?trAk=I1d3bb$y%1yNAV9fFUiEaNXEpg}2fcJ>Yhd%N-b|1`Ll=<(&xmWfycUf}H zAB*oT*HhQmN1lWCc?!JSVT>I6{2tiL{w;B9y-)Ue0`3FncrKCahWL3f8!g;|TzmJ} z&V4LX;*aeY@8)nqYy#wd19u3Vdm=|P_y_pL0^7N&tr?4By&~@Zcn03PCf;S#eQb!o z5AXW?TdIA>V%~z-9-RB*zHEzol)wx`WZjPPeE&Gkw%FT#^4`xEAVtoSYp`z+o078{ zx6IojPY)v8~iFA_ONCH*h_K}x)r2`SW|SuHupKGGSrUzGjg5Z6ucn*2K;1C z>2rnnH^6%PE9QBA!m}8-Or8HUCY)!)yECo{GkPuH?t_=+;1A=Y6Zz+Y?fbSzE9d*e z9E^QW?Gf0Pfb&i}hXwVQ$s;(|P^FJNc0#vcERO4*S<}Rrd1nW4`T4&Y&&*++U=n-R;N;bCH^x;$4nstG_K9;=}(o(-vp%!+$gHj<|fYo5yv1 z#-_kA{2jKAHIc*r2wVmF&M(M&i@hM`{~mL#O~e(?q1rj}?x*jaVSGc8&%Hxe@ws>I z_H;a-RexU#avXa_Yzc)CTQoWPLb_>Ic(?c zJg)#{(D80Rd2H8ghnt%a;uFdoD?p&y)gLVIc`wr}YhJM35Fsr;J$9dYz+%xnbX!j!`yYdJ4OSC=quxoxx z&JXy*8Ndxf>>;slf$wN@x1}ZLE^*fu^z~gF#FRdAP3L&nbMykfM9h8sI%hV8@)ge#(B1zac&W!`S4G z#eKIf5r2g(0y|1g&6RhIB{1h3^T1f_KL;-hzkTQbNc??}=;b`e&tXH%?@n)k5|P)j zpkD)e{1rN(uaWZt9OL_)&^7oBPD}0?`fGf9Ex{eoQRke^Q_NXmuh9{Cf12VC3H;c= zeMxKzZWhdm)&2c|m_1#STHl(6egPcczn6LL_I9q|1+$2s4E^BEt@z`=WuoNI?&_h!)e#)oyFFOzc~veugSL8+^K zT+f(a;je*XdQQXHS-2(MO~+!9zgLkL;lCzcjL5?KXaFG&S8fB9Nsno>;}j;@I7`5 z67aLdxlO@m*ghxzF8MK-WBa^x3Yi=nojBfNPVdV2qE!oMhaL0uKsA-@FI3g2RnMc*9X+1{;vZ1da5^BKm* z@A1u@f?2_@$xqmI&K)@kcwd~adluLYF=c|k2Yw0WrAMt*N96u5;ayKd&K31YQsg=Q zjJR{VR0`+5Y>VR@5q~7-+z{t=T;}P#8o2<7YyA#?4(c51oQDMB@)3F63+&5eMV|!c zyJ;-ey&-nTICcVeu{{&_F|fVEo}c52SJ+R1YnXz125RSj0uG7a13mqeHu8JpfY`9c zQEtH1H60RnJW5N`#!?%&WC+qs`vFX#SYJEs}ie7`Hq3s2SsiOAn0 zoU8V>40Uiz(AZ;34v4vq8~=uHBmaFP$kE;w*X_T@@|gO|_yxRs;osWFd*nLn`mCFh zGa^y=Dd#Fcp z-TD%*ebg&rzC(`WOaF-cUUn`W@%r!oc>dFDkC((<%e0{KGkoW7k2Q7&oTJ*@E=nfa{$GKHc;L5!I;ABhe;*87iD&lRc`V4Y zPCW$;b`Qp4PmzdE%(s`hMIzpf(P1Yz_i7Fv@8)N*Ctk&|6nh=O_r=fA{Id--XyH8D z8M@BHjIaj2flH%$a~$`S_z~KDUW|AuhW}R6Jzkc)=h(MFPd~>w0rif(#rF5Er=W^! zdxG!0{sbH=sI6jeW3Rvs@C9h7sp44Q0DJe5_saZ+nl3j7{7z%=dndrPj;;iu?fmR*w1h`VlyW z^Ab(SWN}_yR4>oby{OVg{`-Z!9cx>r#O*JR!H`4El6at3=ue411nWp7x}DRMj+I`k{Z(jgo32qRyp8@AF{IT@-p4*U*-2m@W2;%;3BV6~C zm}@#jD~{=%h{&AJhPm#Cu`2f25cABOYZF<|uzT!7;xll7-{RM~I;M5@bj=N%d;+f3 z*fr4L+iQy5mY#Lqb&Md#`OgdF{e4Ma-H0ONvtGmdjCtNw9NYRcVqN6Dv8Kw5cpZO& z?K58`Mc$i*{fN6Kj?oZbq3_}cw*9P4_&t7u?cRI-LoFetiwt}DIqO)xb;La<&%(L; zUOYvQ=Q+nWW>5FNsl70($cZc9bKv{Ai9E*+{nk3<9&z*heatcJ=RDfT{u|=*^5$So%x7v_YTXQeYHj46?!_%&d@OZMM{w?YNB*{$ z^IN#*U@XR~L>X`FuN*6K7@W(YW&ha&z{Ab`YIU>isd^Y0k<6Z2^81|{X)f0T* zN!}Uj&(Ovq-sL$~hi@OpcW=jXfPV~r04=pkP{lE<5$^4MP^Hep=S1#LVBy#xje3~h zMgCiX+!@#**Ltys{V`Yq&-G66gBtnw@Vx`aaBqQQh_RUWoE+Eo01Q0!+hTunTHtfM zEidH)koTJ{eva>6IaWi?1;IDpdf!*pUna&+;XenzHP2onnZg@;2xp%d^_gM2e)%@? zIz4M;fi_<}2IIa%J~ifEgLD1vgL7#k`_G7t$1>ObNuUGnzcTK7gP41M7dSWTU4O)o zdj6xw--q)Y+byon`w(tP&bD;q_i(Q3GD+~x-Me4KxqnE^yZQ(?w<>b3>A!&UNh8jj zHNM{wp91%)!*508waah76uAB#y#R_io=<=l^!Rtkc>+EMa_;>R@N=@Ox#bQFb<|9W zJC5`G4*U#E%!PZ6Ennpx{(WGrz0FVLjYZ$P`!V)1@e0!;Tv@vmF z41A028MoFkZ`XDphdo6ffjO{8L(U5ASaPB(b@fh~ze5k-$$td;=2c19Ul4x;_P{>4 z2|D^H5gFP`a`hYZ4D{F=bV9daj;(n2``!Eh`G z{*Tmn9>ZAp#)h?`uMqdnm?Ii7k~Z>OgWfggx;c(j6Mo`rbeJGsnb#jO`g#NyO|a=e)1N zx7dpD1+f52;*QabYR&h)y#cOIuFfwauPqUK3p)Hd&K$o7zH>b52Cm8zdYRV}Tfl|9 z68SkB|8HO!?uaK~{$FcWx9RGa( zVsxjmUz58BoU`Liu@8WC9ejsY_KEpCd!9RBEY8t0`UE)E{Slvny)5zf(F<~eSe^e8 zUtEWC?zh$QHK%BO&*Tg!)@!f81l*#|v3;*Kk?TDx=O6e!@2^1MFM)Gx(aH>+BCoeW zYabJ{-u!KGY;(Ta&F_$Np4bP(tZlKs#5N~kyZ=60J`){&3r>i+?o;$r^b}pC?$40R zcunN_wrC|qzQg0YV0{oD1pUKqhG*tJxz3(=6`v1t9)O#mgPYr<^hx+@Y>~h-a#rXn z0pH-yz#*`g=Ws5>mL)Ftdk}HX4s&tc-++f8!5xtQ9(GsqTKpII6Lb)3K`LB_o)Y)> zgeTw)a6T6#@||=1kK_^e*1l1Cs=Zsoo<}~b_sR8KTKofS&(z-g!2GMku7gd9!4B(L z5c6614%pLt?^@7DaUE+g2lD3GSD0h|Fc<6&O!3WCAA(QF@6lhQPe3YpLk|8k&=Iq* zxKVVXCP2McEjgZl58OZRrn!z&a~g6S^EUBgwBxR^9V_4lK_{>xR>#!th}p+H<9C31 zAB<&F>h_4YrEgHv2xN!>&Q%+=+JajkUxat3#XXd{<~=bF{Vg@opMF7i`bj{q`)+ zdqy6oL$Bc`)?jaoaqq@dzKHe}VsC(V_tI@70II z{{ZUutsq{-o+rS1zoW*8>&uu8G3WCE{2oyBzb<}|*8=BbT%=%pc;gSz*1pguF5jUi z_}*c^qj>(#WrAO&CFce)_huhFz@8S~9&&4aV4t^O33}?B%PFwt8c4wJoI^e(EjcTA z&)VM&-`G2ude@NFe&{5eh+_! z@7m3AeD}-sH1Ki>ZL9+)z?YpEdz!`8KlRVm5_ol~pEa&4q zKLIVVV`3}NU{BH3xCgI+aeLXrxRQb&+G@mkI{rRbmbiViC&2mzus%h87kotSORyo< z5gP>CvpogYRBbQMKWlr5H#5OOKkajyZN)e$9Apq_L<-(&;ZZ#Eociz zbolHub^|z%76g11dt8Mx=P|H<2OnS%w9l{npMdKa#;}*`fKR}?`whI@4sc%PdQVp1 zHQ3;v0VN{u;}hba0{47TxH5eeAnrbS4?YBYpd~h}waMaqt`j$Bf_*_Ej~(c3bi|g91+?pUt#-+m z>#?uw=Jg+y{0({r5}cxaM$R=bNMw5le+t**yH@L}xEHSH7oY)-KOrWnw2}MT+xJ9= zKNiRJoX!Ni7``Ldq{w{}df0pT6$pHxyux?PHgYfLTO~^0RAT0Iz#R9&-+5a(Vv1vY zM(ho6F5b7XxQ}w~i)(h=o9KF;`ZN0#=_B`9me?8kDfx4>+zQ>IhqGhgK8!{DyeBCg{*UmkeTZ-I#vZ}>94SK& zVv5hPV~xc-e*oM+`-=OZj;W5wYirOq;LQ01bkupq9r2oP@0-L@!LQL(tZSlrxu(Z& zfn&-qx8^s)x0l>7hWV}sy@50C-AJQ4dkE+H4XAUwgB{deCgwNrOyXL>^}k-ZRiQ&+!xXRpP^W zVh{62-zBzhf3Q?S^I-kmqVyV}IXJ(*GCdWB=S{s}S1ZOJ{s_WAN&yT9J2 zu!kVF!mrX6PTwBhmk)ux9eY7+IHRBz`wW=p82=4_t>jMe8*-|&*zVJ>;6DdR9^A(c z?JD@Q;(Mq3e!tL$R}nW=OuS8*v7mU&NEp%5@YiAR`$^mgE{&$Be@j%}JJ-lOg z#5~{n+>&)c+Q^?-!!vk+$)7QQpw`bAdvD8dAK_kuweWmnBF@(>51ipQQ>((EO{#Ce7fH?`jiqD+$P}E&u2xLyLYU|6jKyh!} zL)YYb#L|3l3Qpj5z#JH>>umxX|1t3&L8s5SGh!m)Un6e69{VPC0}}Rx*f7_Uvq!uu zb&la$oP%Tf8RfqH3%xitGdEFuY9oPX)$i9<+pAmPQ zPr(d-m}5yXE>>UyHx_$abA(Qj_sw4R41C{n_L6gLs}gVVKfu2Y61My07(I5C_wm0d zG0(#HK@%CRnqD19*pB0v#vSJd&{jUj{)t4c**A~*jirP8fw+C9^t?>&!I|TJ|2z3B zoO|&Gbnz}Lu$^lH_DJ}34%+4$_ik*q#&1jQi;^>(`BqMY*v}rv;1v8EG}L;2zRLnz zSzxz;p)NJnt?>tmqEQ|8H*nVX*!EH;#IAxAd0m0Fm%QgPoT0hIXXvH&C1Tz0cgx=Z zw$7x5v(`J{cw_0{o)UAcDX4q7o#SU&B3FsX?}l(L*stI|1Ls2grhe(?UAQ&k-Gf7X z$7>?*;b4~ro{M+T`jBTm*8E7!zCAJT&af7F(0~pYH&67`xbBv?NT3JKMg9qR1?J?` zv9N}{|J*omUmQQE`x@W6UxFTg0q0z=<9`6ou>C&u32+|vHP&E1E3t&X1goO$*J4jW zPtR5`o_Nn1;>ITE-{QXnYi#{vV4pc~9`wJS=3wY;whJP2WpNI!&Kuf$u z+uMCGX8rfO`JML!9r%fOLU-sH+VAs@c^hrMb36iTumNXa30m-qoFzB~-o=hsqR$*X z1v7AyxMKVY_Mh~LJEsFRP|W=b&R*6xk>_Nd?~Zlh{u6C)`5xHI8u1*MpNK8YLAn^! z@MGZc18DoKdl#y>&u7*Fb3TS!fm>igYzZ90Gf-0GHN7U*VFyr~Clv3-XQ0j}NAu4% z^5^Rwe22ZE#@>(d{XNNZxQiYH-abCl&S_HPg?2qtV)kgr)fd|TBz_xQCR6hLj`{;I zZ)RTPJ#Nt*P@KQKb8uc_=%4Aq_Pc;NuHF2IoMUVUjPpy`@LbC`peMf($TNKJ=%+xj z*11lAdt}X*pp6`p@30-)oPfIm+%NaV@!t|3i#0*acTb1zsBh6?PRu<%z*bW51N#u1 zf;~9<^~5{5A`$s6tBt##`{cFQ#=J`l;2iDcxD9cUuvcIQevSSs+UL=l7T&o$#l8kk zu)jb*1Pusy*Yh#$;A>&$f7<$9up#*2KF?`!B#0&c0uRx)1NNC?QAQ zzV5-Nz+OWx`YZef-JpLB%r&oz9G}6>!Bt}BtgzjK+r@Ssudx3MxR#c>I*-97=Gx_| z)STDE9k1rgFUWhJn0HC;AqZ^GwFCBPMdaty`<}3!hx6>QYd`IVSfCf^L(mv261%yl z`~-Uns@TJG@vdsS?i1@r(&O)tBk%b=0Jp%o#JM%R=f8t{GUf~2k@t+aeA*hrlv85v z#|Ai$Aiv54-?=+}Ph2#hCH@wuou|Fe`cfD0U#U9Vc z8uQ$w){iBK z-GCqNdZ`=p+V+?K5Hw+AB*dJ{U9{^+k+~KfrOrFBkL_9-v@+}izR#-X``;r@{)jxE zWu=bqnd|}kOyT<|?{I9#a!);P_xucd4mP05W8zET*q+HtY{%9QdWjC$+w}^2D8>Ug zU*n#EYrY9qCC5Gse0kT~kUy40{1F%=_z9d-m222O7pY){UwhY_88Q32Kd$YAtsLjz z*nQ+VyT%q@xUMSZE%Al<&dW7bvG=h5k>|4yw;)!vj_$k~g@IAN=I`}ob zx=O;Aw~zWcP@LPam+)%$LH;#pi8;3>_&-p^b(r%Mtgt&!W2Ys52kuzA$Q68R9)T$F z2yA?N9HNyJ`JSmA-B*#MB`}7TPY~=*)xSrQt^t{C79MicSf*G(z?fc^v@V&Gx z);RuWz`fa)3H&G4m0IWHo!XY6miSG0*FWy{7=Hp*@JqQ-eMJ7w{(`uBc@N!>_y*o} z>;u>08ZPim#PRHZU>z9ucmDoP;2K+couV6bm4q#S0My>GAXcTt?tyzK?;HZZN{4N4 z&!xp4i+kYxk$3*eL+l80y_0C`T=yFM63#J}CD;7AkKPZtpGYt#;@3dU9p^Z%oX?m1 zA%5+z-%+24g}`=A(zMFrCnb2nj)E#JmV}1oc1$$tDAJi%Kn&Lkp z{v9yCi9A-1?to`&57*+e?|K4Tt^xKq#=k?{-i~cg$4cm%=)Zzf>@)Nky0fm-_h|3+ zZ^28@!mq&bM(i4~e1Q@GxYOxb=%v*5#U|M>cqwTr3 z#2w=*2=c20oHh0qP2~T^U_3W-XK?P<_h6WV!6N3ik?)W_ZUFlRG4*r&rugbPNN^1} z!?wo$_A#z+jxzKn9+B;J$)6N{NE-b}#JwBlEB13fEn2$=_FRxN15e?80Bwmki2Jbt z&NUI=mJi|X%U>e)UQ*YVTF?CqH1RIkoX@Fut{rjjU5t6`|KPt(@Of)SalCUmv=(f@ zxYh)pDdTPAXJCq7#d$UO_WuQXh3`DJC6%0E4%;NYYj{o0W&2?7W$BrMWb8nTN7Tss zJ==4d7S4V%Y`H|<1p8}po`5O~Vmrk*=SOVs^R|4n6|yzMisDe~5P29Lo5;8?DIEbhe~+#kUT+wsl?I{|YR zppCq@>LtF<&#CdPp4R^k&in2&aTjdJ8_PptUF4pgt-X%OF)vDdm@ocqIQL|QJw?ya zJvqK79Dj-4M^|w^*4T5H_h^3B8-EQtdJJ<{+Xu*r33d>#Vy@%L%|MSYTHsh$fpc*! z4chpi8QU=ezXKn`e+eAxvVC)%hrqG6`Ih=ya0#x#UZ{~i@_nuO`lsZr;RD;e5Ae0k z=?Y)RFuo$kztyOh;1Tw@z@HI&Kx~Sx@+W-b*7*KuA~TNhb2#TSH)OgV%MB>)2fk^e{)? zWzKN|`VyBlUw^1WugOcGtub<{xaR-h{o?P0=532TR&bt;;~!s=Gn{uR?1JZloTYi# z)(gi^_zk*M7m3LK{*B*z+>c?-l`Pu%3HP)ie>>+h;)%HXY~B~u#yvpnLMtR<1Gsx8oP&xDW1|b;=>y@44P3*P(Qg zpNmuc>%?z?hS*rlS;Na6S%<$Z?)^=8$J71;c0EVe-V)PSJGSRNMJsLOzH%Mtfp!pA zhWg0=oGVdR=RQ881^M5>eFd(7--9vVQNK^lGvelnhFBGIr|{0(vvs}8g0AEZHN=#m zcjP&0e@Tt}utxlVOP~dFYVN}|=oRq!w|6Ip?RdrqLA!?mcZaw=9|5IPhgRmRt-pYK z117Z(u|w<)P$#&tq{ubL#6Ok8-?J+d=q7Ss=h$MO3%-4Zo@o1Z@YCI&uEF?M#E;4O9_{~@;UjdF z1n(R>Fa@dP_|IJ%xXL?Tl`l)q(tL7ypxC>M!94%ry8O)WF3I0QZ_A9>cc6>huc7b6 z@$h?K-6!x>0?yAH$8X`EVLSgd`V8F@8%y11zXQ9ssnpdyx28VB#uD|S1p!{{=68RC zeVNpIFy^N8bloZ5McXp2kvh)Mlbitlcj=!}bD1ot^}X>Suy4IXH8(}I@;&u4)aS9T zQTC7??yF}xfwQLaYR7jR)cMjYuMmV3fxa^^BliJ+s}OO z;S$V2l=uPh9vD~p$j`Jn*4+R>tV)M%pAA?8*LxkDuN8jCM=Oic$9{_S&ap?!x!;bX zU!^4;-~^n338=EfUh4yE%++>I)&#MxK-=0Q;CVZiIf~p4zR&drypQc#?N#Mx_&!s{ z&evDSh%!D}PT$-KH5>42;Fyg(@vpS)g?Prk?~{GOo8r&)V@Mh5d@h{(6?2Jqz%hET z1RYp`DVPA?2~%^i&wyiG1D!qb8}tS(@0j+L8*+%*!y2F0C3X+j0ONCDp8Qj=#`igK z-y8FgKJwhu$Haetcdb>fVt)(lHM35P#2Wkievlu|qw@F@V0;DclT+`vF?-3kfh~%7 z9#24Be~qgn@^^~2@E!K{8Mnk--ysO_io9{o0)ODh8w8!eHR2D!$H3mt!L|f>3A~0g z$F=*6-UVZEyaPDj8|Lkdc>M&I=rfiDu}|UT1B~Z9+#h0J0PmK2)={r^&ek}mHGV@} ziO6^5koa{_r6tF)robF~G++rjFbD3R^B*K~U&nX>60qJp=V*^JY(J}oEr@yN z+90=Z9d;uS^X|Z}M_feiJ0$SqeR$U%z_G@AQ**rkXJ8{w{kH7Ed8fu)N1ki-?(PHE zUwf+)zT>UoUIKd@0oPdb>Np<~cYJZhoGppS_rdp*b^_i*do|cov|~6Q*U(}A8MK8b zYj{?ji(`BX5_Mx)lPmWO41Eh}-n{fZhMQq;&)-zXb{`)BpBwY4MC3DS(ci;;25Jw- zwYGzspohC(YR&QdcYyo}@tfGEXxFkRc@1K&oO^i>{0_|F>o|^a2(A)$ZuWH_j4NHx z4}aLR;ybsVxZ;?P;eFPp*d5q_=lISefjw;R;|Jgtcm&K@7Oc?Dq0xtPFYKc@PyL4= zBKLfNor>+V>)PsitT`rT&2{iT82XW~MC5T3@fQ3Qbi``?O?>l>dxu*%&v)v4u+`>x z9uu^mZ9Va^yoI|$-1P)-j$@hN&*5FizIj{H!hcEJ{Zc+h_c55mkA&_1wdjSKJ<@hA z3o!V`;2PqOi8%-N;ufgV!p-nq@0qzJU)~{FmN*ZJH4&wxD=IlZ~q)*TY>fb)yOJB~TlTlWe~vCVJ56@2rLuv_3f zj)Ad#u*9}UqKCX^*rEL{Y>s?axWI0(jh|t=2l|aUz_mJm`+1(uX$tJI0FEnX+#c6J zPkjQX#Jv8UuZzaGvp8uF{?yKcq21iHv|#++YI%0scY$s^ptd_pF5<_6L43;>}U4xdrEVwZ`~_ z_+w%Xx{HgPzVmkP8|(q7DiL{qehq&QB>XBf`pto3wZzYg9oSXmg1Y~Q-MPGTjJi|C7kvJ!Qa5m;nrxyF}f&y(Tz5kz+WLxer_(Y z0P1srA0*z*OW(W|H62>%Blm02&Of1}*#7^A)vvK;Bpq?bm#b3OukU^+10RDq%w50c zJ=uNNKWCJmt`0=R)2Qb>0=%F6{5`mphgAgEi=85`QQrI3 zWi0kvT7zDrf3wBQxhLu%XI`{Dtf}WH z=eP^_23tvy-y0oTv4?X%m&pGv#gDs`5LegSn&X}u_e_q!@GhlJ=_8LZrS`1$MZ0$a zcMEN8gI#3}|BzTh9}DajZH~DuT07Ll^%MBjZs}!i5%1Eh_>bU~4&Od2^s*o``DYM2 zD82lB;QXwhhq=NVv(Fhg7i{@H&LjDbmmK4V@VCK+*tl=4_!#aU@VlJznAUx~ zaq1v}UQJ^)Af<_~>iNFDe&u`1SGCibzvdlNCrD7N2e zc@r6aG-!ExLZ=l;BK_tA-*%fx)wuynjjNnZ)52S=kEiqrKN5x)=jr+ zJO=*G zv;ogRop;2$dHTJ|-uu8Fj;XXkAJF4_e!@J*t72^;N7&o@>UtaeL+m4Ph`$6g(3iYG z+sn0e*z%sG?+kzMw3qiS!A;>7U;^fHz&Rw~ed@_^|7)x%az@NC+><$WL!Pa^YG zHXwoeCNXWroWI~d0K>lEJN6RHupN5^Jf|zf>o#S-W)tbP! zuj_pe+daDh=J@uuzQwLF=Q9O~9%ty6@V@^x*j40C@!taHV4sFq703P;F>xDw2)4yq z`}%n~1;czvY9qh10zR;x$zv~pb5PswE3m?D$VuoHeVy1G+kAT;fm^_NoDu8DspB-* z6Jo!IbI*MK#3w_|b%kyur575I|;40Rv0tI*XxCADwd84g{ynz-ZR{Bs z&&8ZhzKlC?_)+?upcDQeXmiDy`1Req4)@=DYsbBVJh`{PJ?g*%>=n9-{T2KD748Ly z7(&C3Iv?xpbvml8S;qefTx&b3l~4HcJD|gUOZ`#l5%|u@Ie15&f-^Y*r|4j+!dw|45EKyk9r5t*v6N zweE}e#oV_e-g^7{yjtIqU*}MJ1f25=xE?*cZwMuP*I>^H2>b>;0Hv(Se?qK9+rxQm z@Kea<=g9q%ZzJ~@wE6fwa1W}?iGPKk(5~6{hv&M&cHTk0y{2HF_&4AfI}umRnG>^z z^BDF5ek?P5d%9naJsI&S-tG6A_%ry9*tW>IFR#F5VqAVT>Rs~|#9qLC4D3Iwi&z&W z1A9h1iZ6eR@4BkE{;{m!{N6Mf<&1f4=kmGyR_!;$9B&*Ca{9>U(8HY-1hI3$zE0fO zy~20s6KWTrCEkH5b7J=K`}7pMiZS=|GC3+W_G{u|hWFXpo_H(p_ks8A6R-g8a}~$@ zIsVtc=edgapohCm-1|fL%g(Wh{F$HNH)ZS~Hk>EA2WQ094ch1GXJ9!R%UtJj8%#!V zDh7$j>-szVSD?YaOne5+alQ837SHK5a1XY{x*E53TyLGcaNa30-=Vb~*LgdC*H`bU z&((~$y?h4m<9n7XV1A-@iC%+0!c|!mUf-N+aE{$!kL7^8I19SI* z|NOh=_mSzD?wexi(Py9q}!A4U7$ILOcF* zVvj-K2ekud3u5-~O8zr!?{t+e@@J!e+p))jyvt-$#yKVDymv|L;XDK9@g90x68w_* z8tvE*wsIVI0@p^VMC&(bd;3h;-~IW?*yOb4!h4^ef^D&8Nsjw-WbT$YZ|}W%ePkU) zTPOeNzp33J?)aYREpSDjJ`MG*p(}l+*e~GD-@Anm^moLEH8cqRSW+3kB|cue_s+d^ zZVT)>rnTC?E8KX!;~vh{+EZ%B`&!3PC&qOB8?Y^|`+IN*&L!T>(eD@bcMqCN>es}4 z@3~*wk|K}YphcY%-XMLT?1`3}?7n+{6TKjF^8N{b*&Ix~Cx_Ta`wob}2a53}J@nlx z*PXD(y!Y-iaORvY5yx+Vd%nGvLux)CzC!;e+Iv(bBL6$iex93WpJ6RE0o{}Hw-Wyf z{RnK!J~5x4wcOSmz4!L)WcmnPLy`mgj4IBj5tevAt7Yf^WcWumkEC?%|9a z*Xfx#R#W%~=;y$Bw)C2!6aEzt*ur&tZ(Hn}=oR{!Jo!Dg<2Z*UaNgz%_f*dL*rz97 z?V4Rn!heO!##f1;?NxUVGPEegE0Kb8>w1k3gNTc^l$Y&aeZxCTr$} zOOb1C7z2mI?QPt?_1^-eH)?RN96k>@At_Tzlv*l zOU%z&`3ZItmCd=vpAwG}cb@ij?h7#NC3+6FWsf@N)<-^*x7dfkaXVtJ%U&zs-Sn>6 zvw@qK2kbl8#D=|B1MlDtxB@N}>UzY{44wh?pz}G zGRJ4g@x6Ov@jN%w_^f#5b#CTF|hRpeeq!zXG0dl>{drz?#3o zyS}k}Ozai71wH{ixnsFc?2MW{^m7n}Z_z?=&aUgPV6oLdXXN#{{)gnGD1Fc^=zwdf zw!VE1i21kS2HV&LA?De5PpjDf!kwuE`h{hA;79NiDc`Wf*c)(E7JobTSZ@E!hG z68;L#{i$cBZ+u%4_5QnmuKj`p`Ebrl1pZjOt3OaP%p1FoQ*)-oK7oG@hT4E3)~H7^ zAvOnH7I`soj&;0{c}-u>v27Hg1(`@k_ z+~>d^N8kjcc(n2i}`cK!?2miuMP@-0vOWK5dIR|A2EIA>v}j z9-O>-0qp0QSNRyfDLu?P!fqq?se9@=ufzG7&|`P-spL>S#2w#QBSvye+`i5;A`|wV z;8)I`q7`s0dG4uoH^5wU*Q0>(OWTA)tAzUCOKGVBwv;oON2 ze=FauESi{OTjTilH)n-iWsdE+nrDu@*aP((!YzSyL;sS~!7F{_+74bZ zZjaX>u&o)+9^Uw>r*!Z z(RbgxgWlyOaIVI!>0?Oy$&ZI{^5%v)z%g4jF*$wvIETCVH%naZlvr4YbdleY-Wi|K zufPg^16sHaG-4zta2@C)2Z!|*-aGaMu%^ywM(#0qPW%mMv7OschhBpvu%~As|B}3g zw(9~N{Sv~E^83ZN-{<%}dI9cWx74~e`z_IH;9YU;UEx|{ z_A#D_9pTSFi|yTXFYK#drNa(l{|)TrxdgEUdf=UU1Dw+#_z=4#u0-Uqy-x|w@f_dv z$TeVP4D{HpL*8C;E$Bc1bC$dB{#G=>pVmC~dj;2%w=MN9{0jbkP-}wR1nPZhu;0LY zkL)daVq@753-}YXbz}LSco*YHwiB@h+&>FiYR6)qdT-2m1RT2o3$O+exuQeQ;2Y3m zn>Pmyw&xS*ZIMrK_I8}HEQt9oc?$wg)OD%-jJ59Pph`rx)c##f-uXQ zrJwh;H;r=+j4@{{q|nG^YU_@yBTQRNM9X zY!1BRBM}+$2~Phq@%*g22FBugo)_*@^sMw9aw6CGJiH}t{n?l&DadJvB{1FMUY|k~oBlBtxa!;^t5px{J-p9TR6n+0LHvG4? z*sg63dUGS=kK}s4-6#KkY(MKnkTWqKoq%IB^4L`lcXNO5@jhIPICJXwQ#kEzi(e7H zPwg`x{{&s7CD%G7(E6eW=YnmIK)VL_$($;#qr*?Y{_4x*>2Bt&uadA|5O-bjZGf^j z>MB9J13jpG<<#!s55$ZM7*KqI`C{7dW@xwJTLdGK64j%^1p`@iQEOg zbE)E<{sPYX;{5D$1&qb@$aSEuS?!)A;Jm!M-kVv;af~)HUc0>;=88y!7f)MjPQ1{Uq_r|sL z^k_gwj&a3!0##Z#`!CV%r?z`kMSlvM@2$f3ky(4Xf8+i${LjhT7$;ACncO7jV^HTc z&PkEK_kIDdL=5Wuhc!p^^_~0z^dsKfw)n<(cAK9H@z03+_w&od{^P&B|KXAzuDRx@ zmu0;Ty{oj??)SF1=MRYc+z%4`1OXCo58YS!I+tm&$;=Wt*E4ba^)_G9yjO~SM715G zi|qR|uzS#oQ7+Wbe^UFykHvh)5BSR@!Q0RJz*ZmDUZueMCZ{a1Z|~-L41s8x|BwFG zoeMGZ?fXk|y-RJ0HRxX3e9)=!i#U;E?Q$Il_haohtiAMx(*{}evaYb;0P`5Ao&EU@iw@3!Q% z*k8hZ3LL-21Kx4HAC6_c<4@5_8#%s)>#!eI9>2;2+q?u;*pJBB0X@Dl-cxPkVLfo( zd*rsns(26V6T}?P_lPnl=2)j7#Sj|qiR<>R_$*xkec^IO&b8;c1Qu{EPs#t^tamoz z1FkFlUkl&jn`eA1YwE5N_x$CDb=3qo>k{z$m9ilA9=37CIk>JS^iYxCWv)XR_Rc=! z+28mIf2heR19#*9@b&(na$Q&d_vU%^@(O+`h8GnoR7{~lg^DRusBp0mDpaVLLWK$y zQ>aj(VhR^3Tx^68mmtg#Ot=^m4nmkq5M~G_T#N|^W6UL(Fa#4W!Gwbd<`PU8f(aso zhxhY2XYZ?{@y)wk={8XfUKPw|&%`!&Q8cuLIgTBEAN$(M4qkZQmBC|3Xfc99TeYpDElOV6J=cSvgOYhS&TdZcD8>_VC?U z5?_E+ICGLdcmv<*k0i(2TKO-4Yq#WgaJ`_f6LXCf`ghL-dlesk#mj?H1I8O2G7y&B=tEqpu)=oT+rSyDF(y2Nd&Dxe z*U(%1Iq<$ZQ%gL7DRu|eAb@oX?ZO{mkEO-;?{BtX4`_Gh7RfQZTb{q1y%Mp0zvyMD zmvb+BUY9#TlJ7latW)xd^IwUp64euvVbQ;yGEfFQ|9UU2#_9 zpMx%jJJ_K6J(OhQQ|j&aBe(>DSd|vrS?AyoT!7EuGT7iJ__1VSa?aF&y4F|3yvHs1 zHD+DlC*rOx?Cm_6cndnv;3xD7?Hw`C&uh;w%w?ZdGXD2)PeF{}=6=rvh(I0M|dqe)Ox@|6|Y*yN&i78|=D{`?AKo z8R+Bi{hoY(ux}Cfj5e(M${b=$a$cs7#!uD8GOZ?Jde8L@wW8zpa-cb+-5 zug|FMVwlrAZ=UNXVq-DxvpE5N2H0y?+8Fk~dv>RJ@V*a94t@xv?;X9_|B&;pHD|10 z&4##l_zAG~9f9|Je9q$;&FkRK>S;gk?Oo826Fci#6L43+W3a^U$V=ve4*xpwCtx4= zY!}wRWsrcjeO5Q$eij&;5Oe(rac7uf`>yxvlj+G$Y;_0>1-y;CjJ!7Vp$c@X$Ch#eAQuaqr}(;13{T;OzejTmz}Z%+J{CGG9Fd zGKO~wF2HST6!QF>G;a!)pq`bqy*`A00xpAuU&Xn_A(#Mr*&|~3-o8h^{eC9!58&o- z8C$u5|0SrtGx)CUfzQEtFz(gQ7{hn|bGQ=_U_85hH>~kT;+=Es%;Np5qHPcFMjP}g zev8)ML(kzB=#2jJ;r|8it8CW2QC3^`}r(gGsnO=i=R^ybRuS*&&J>X zt?}IDwjjgzf_?<|J_zE@w#81wt7PnNh}{MIz+Ss&e3h7g#**8WIX#Vw8FtWbT;JjQ z{4RnOymzi4wkyWW@jlom;VbsKLd-jEp9!3OJlC36`&VvmeW@L+;f~3B4s8t4eQayZ zpMi#WgZ5c?7Vm>7xqSupFNitgx4_>+#$x|p5wmZg{{tFos@U6obZFOe-3op8YK`!m zR>a|^)q5x2k3 zr6o2+2mBhl0rqiSV^84@u=hZNKbH64<{+uzFQQjy=c;Ge#OSWTzXS_=m3}qXzL{Lt z^$fP?DX`}U;5q0ehBIBm*+)L3m5AYtHu#>Qee6-!c#Z!h=!i|xlfqe>sr{Ci=Q1PS z;U{n%zcEiAxr1*X^R~pbm*^^+67yWV`+hGsK`UUM&)*u+f+c9+7A1ZG-+5bN&hNR; zfzrjW{$=6`JAXiF^791o>x)^F4!irVSX2--Rn;yS?Yc{NDaMu=fP)O2lw>J_mEA z)EolOU@Z1NN9+yUk7z%Ws#v!s-b9TII^#cqlXrh(nUU|iw*l6ArV&GiYgpsCFR=Ub zE6>~9`^25M?$?}_T9JW!(Dq(zfxV3fP^`1YHGT^|0_IfS9Pf|3-;e!#QT9jPF=+7Z z<9lz;J~|WonGp9qv)?D6Uu!ohSev}t@II?u$?y|+&)>Xy9zi^TEpgXBOZqc_Z{Qnp zoxREwdoD*j34D94zzll{`t{(VAi=!=cfb*_$76JYuXEw`(#G)a-ICuCbB~F;-dJ4E z??C@dAm^QTt}1N|aewzaJ#%78zkUqQ-Dl?BJAC6~X^7pW-u`dwEr`{;4*OBzeGf8z z66AR<_V#(U#t?H{%lH&DG59NNXZ#HQIq>=30|9TJ3D^MFeN5avIaddt!Kq;T+#0mG zfu7^HXl|zE8niLtb8ugEzv})B>AApO0rP$XGIiakM?IT0IUSHsg@1W- zcn@0qIri^BBS)U^hdn)KdvwGn*uE34^9=O!ra@lgdk#x-9-`MEQ_}(K?LYqPvC4Y+ z0E)E}^6GQh;!ll%6}SlJIXlxiwC`oauudj+6@QMNfezbsD}2sNV)jeaG@u2_HRAsS z#;TZSt-X2sJrC`mQ!QB6 zldB)-I^S3Lo`+mRj!@btf2Jqi=ab|42Jxq8*WMMMfuGavyRAI=E!fx}xR!UjpP2^s zHebw3PAWC#h!ycK;a$Ih^PXG=XNmbQ;BJq2>!u)6D<9}8p7WpKTt8u_80PEH+D*X( zuEk!WPr$94!x?ua9&r7<=svgbf%Z&%@61uupAqv;u8Dtu-l7xnUeG=#&(r>YK|5!a zjNjn9PD5^$1N;*>dwIt8e+=rmIl~M5OwA+ox4@i>;5?YZEAHb7{vKF>2f%()v|^1p zyYi5@>x(LV9<}yp(cj6T`?I2ldWmmM-!}?}PC|*{v!k^Z+p}rW?+E^kJ~!a(6=e-` z%=NS90{9TP{&{pmTybyKIEV8r(2a_6reg{eCi1lIuXV*>8iyeGi@cs2{-nVbYpu&)qnu>*U7ZEnW5u0<;m{D4nt z#I?qJ9}Mba#Vs+G@|?K718p_B>B) z3hs=!h@syS-n04=_{?^tBX3K52A{E=V}&2svorF2p02eAz60mLu55|o`6iO z0SWw(cs+9>{W-M6=j8dU>>K!Fv4?l>2)={ctzX0W-}`VKzOH8v^D;Vt+i>D82xB9u z{Tlil!;eMIo?QUAnp<<0)&TpuZ}0wC`WfiqbM)E20pmLsK~HKj+I6nN+q23K_}0iL zpnWjn&*QsqXHV#@n!I;}*b_MSZ~bgkZ|)wkDR>R~S(vxVhFohVV2!;-x71W=u!GpY zfO*=xvZU@Maqr$mP|u{-)cb6OTrb47_zil7c0Sh*eCP9>_skV@0=omAzccKicb}7a zez#o%o?nMw=b%k*J79{hi?oIuXmDE4W9j1Ln+1PQZz=WH{IU1@LpApRpuZ_a|cV zGvM>>C5C?|GcL{p_tgyBqb%_|E?bB;r$$hzXz3 zl=ud$i2ID~bNc*AGjB=Exo^NXXyu(8{D|QUzanQtPK%!eVy@@l^LzmBIWz$Q)Xp>k z8Qag;B}mw(z*M%xo!5Rfe_)0_@_wIsPrOg&RB2=Qy9slC2kJQlIob`p^L+r zvxECJdTovp!ybHQ=E*z59Jt?xn7OVkJd=)C<%~H~e~xJ5#unP-S?{{u4}GPJf%jbe z>~Z!WR>fJoYyK`QXP$j`#khR`Oh@F5xaXPC&b9<&S>aoImz*zvJ$5C6ISY5PQ{U&p zx5TY)(5?BP0ZAav>{?ynUGE9#qNj)Rfy?;f2)lu|U*LDZHClOkWo+Li^HPan^_+V+ zC~;#|ni%d~{qNlRhCKUJv2ROG2fTMRPv5wxvY^g)-roTeSmSR&j`E*NK&Rp-?IP#M zt^fU9yU)?@1-UkcvkU5dSM6VCv0lDE1N3$LN5;UnYHF;@aGuRR7)wXonq|o`ugVqT zAA*)xfDY`DXYQ2vK5(B?YdNbq+FtrI(30Be{p`mMc|`sm{v6%J@I7s= zaAwyG;<$IC+oONBYo5V!^ga7uHl*f3N(RFeuqw?$c$Ky zA^z{1HTtf$#`|&!G}v=$T;JHT)Z0gK4)2D~dL_pUW3m2o`2MpEdn~T+d7dSnk^49X z-+(rTxf5C}%KBfz*~fXr1a#&UX=2z%NBr019ii)t)~)e(B~#PEdCqU(>ssb{4%P{! zjbYt{PH>+UF6$$`j^6Co{vQ4nP+Z$P>75-*#Bd)2{vn+Av?bOHTK^nSoaX_y=hX!3 zp`E+#(fFN`Yko(L&q{Gt&%fpl(P3uSZoxiq4eOkD1`?R7i&*~^eNMn~6!*St@a3;y z-v&*TBJ@lAaeiU?&o5{5Ue!C8$!~yqMb8^>_SK)@n{U7Idtu%=Vy^umxC)#-Q6rqU z)!q^7HgNLWnomx|aECr7?sIe9L`($8_m@j$_OIxs%;k*ztfk;QoaL%X=sP8*oh?za^)x(cw4v?!)I{?s$!W zQx?Qm;05TP*AVW1TH_s?f)sBF*U0$(Id4OMXHg=CH7CUPKvVpgJeY!(m}h(m1h%m` z@SGY!%sJM;bFudow0Q}1@BuPtf#N)GO1_^JelDH^V{wffLyh}tL4!XQ*D$t0e+A#6 zeMgPkKZCKf`0nK=@CuwI-xS{c?Mi=+@ZOyZyY(^r+0Hf1^F03yf_N{)UH1j>8F^-7 zxkYS2Y=$<^d*nNwh_x|%PI<;laFMw4d1f=Td!1rm0mh;r#+z6)Ax*Y>mE2B>G-8Ltw$s&-e=f~JvP|xQ_h*KSZ-5qk3D$z^cnV89>{?!z&xLy=TYSk*gijJSd}&0cN=8j z&%h_}{XC^8;7*8p_w6f;C1AdNoGZ||#GLIiu{x`HQEH~x`kg*v-W*&25d=X0EHIT@ z#O>oVm)n)Qg%7kdj^z%qh~X}6;Mx)25dQ}LmtZoA*ZL0LdvP7!J%0_HHHe!(2Mss` z-tjeh2IM>Rhr}KLa~5DM{r=$o7n}q3%G8a;eSHtE0e|0hPS3T9&v}afd$fHLh(L=X zKDVpHeeSLk@$Ne9ILrwdeyd2LYq_oR{0pEVmPC=tpNI48GEiK9QS2cy{EQgRPd;N;G2Vds4EIO19r1tO9C}_yuM6kg z{TjrKAA+aAy{ya;)Q)8Ze+$_E2y`Ppu$}AIpuzSGHsl1h`93STz*f9J_kiooi8;&Z zIYyt-|1iEJZ(Hgnqr8SZ&((Ku0bHjgc8t9;zXCH8&-mBid`5Eint~Y!V5}o=sgJJW zd+P7+DavP+xka4$TeyFKaeErCu&1$#2EU#`e_r^$YYnxE>nb^h?-%tbNdo8m|DjrK9}=0L9IR?fTjA^00`f98$FeXimBbG*+o z@9^d}F?^QT!*?<8l^OOWVxF0C?|nT>^%nnoIO{}2>VN0Vej@Ey3UjWjVl z_XU04*qgX}=!hru2Ka3C8_;8v5?D-LxVkbEH zEw*R-1T^>wsJ%On!4kXxH$Wn;c;50~fjQ82jsWMdy(7La{W?R*a1Y?^V~uAdzW~l_ zZGR7=+#_-}#P&elchA$WB{m!JGyI_LB{BO?if?Qz)=a^lz!NYQdw)jE_3oj~Jr!b0 zeCN$E?9sbk#k=S8cmw8YxE1Kgt3;_zb@d zU(dty_8AznZVejpDsKH9B)&jM?U)>z;L4)u9$N51lk>f0$={KNCzpr3TaE*AsCiartEBMdB zeGuj_*H}7Y{+sqg_+74rv*uGc?}+`z;+|_wOI`+5rsTRGpS|~4KgF=$2Kzi*hrWb% z{e*VE3vdKBAjnUk=9sr4ug3jeOyu=~zJ=e$;5KO2u2SdJZ^%0a(-Cicg8xh6uJaPz zgweP1W8rS2yBO|BLRVQ)FO1E|scQzl&!wLg`;Z*(T*9u>Vf$=-4nE%iyW%w$YE_`TP%OEiRB3#2V0oB#P9WyEh3$jlR`ShH~0{7YP zbzu6R4g3M|SHKw(zH_*~&o}TF#NA7M-Wl6>=Q>znn^PrY-y`nl!ZVQY1GGSUa&xG8 zfS!S-a1;8trt>@F6xdt7itDdS>_>Rf!q>S1F6pBy-=AS=upqt#uH${JITx_46XpcI zYX`pjZb8qZ{XI6J`|~wk#2y(~=kqcrMIlkn=$>4&1s&XkoWl~Ud+?oj0+yxsHS8Zi zl@0OP8NI##_6y(|YjbwQHQbBeL94<~(Hs1FP7$RRoq_T1;QRfc?C)AFTor5VcZEEk z>7wKuq7~=znflDVH_DRO5q1;9+34@#dqzP_JjJ$`GDAPcx7RJSzB9?sK?{5)Tkvmq z;XF!?;ZB?D`YpbHk716svV?ny?|wa}CIz`y9gF#%fqfeCdqMjg%O81VpwO6UDs%dP4GM5_t0w)#1wND#C?8h=eq-( z=>&X){R>e0IjFO|5Q^BNON;$0XW*3w=Q|1GeGYZ|+T?;0!M88pP|9@oU& z=M23B=dj29r}*Y55yPFYyq{-LIQz+W_@5AWoyCZ^-W<He?sg%@Vf%< z%2@XC{r`~>o@EzfcKBW8FT{Obbtbi;BbZGbtj zPfN^NVV}#y8e((oY%TT#t#7Xm-KYj@a5AA}&j0o$8{4cm)-UK6v% zXV5>}7-~##7WaD*v?bmYeGJ#XKWOWwAi>#F9l+QEcs|X|^8240envaHd0)Z(5hUUr zzP%fCFX%n|IY`)bzs8){~O?0r_!g_aBJZD?#Z6+#eGci zqxhd;D{{}V&F>=h`^xBg23HFwZ?7$g!apdSpK&d*BoJ#o%e%xgsOQ?}m=JHzt;0S? zj_WL_8B2z9z3<`P2MNCisuyA(g9S+B&46nwIeOKfp?jZz1_bf8U}Zi?_(~VUvx}0q zLEpIfwwL@<{2##y+C%Vz0<+&~wm{C%+G@(SHu_ew2veJIoo!QfDwP$ak$w?gD*M>yJv01}x4&_5h#lmQ#T@tb z3j7uL{!B{$)4UjBE8;%eG4CGi-J#!r-PxU0eh!?aqt~u1iTfO{lXD+ra$MsG)P8DX z|AKGO?nT?WDi^FJ&-#6AdCyrf-p24Q{et)u=vN8s1-TnA1=ji8>iT^ivA!qqV{H3m z>Z-U;XGp+25rGe84=RQmG=7ob91mDkf`^uTG*mn!%pbWJZo> z=qw3)3R*a!M7-r%a$MiO@0>SzPl)*}6Zt)dePquf3v6fgy>_k7(at#*{maCE1Fizs zIu-2dH*p&6_dbVnAAY}ga=^XzbLf}aPvKtx_hGL5cpuK_8GHvmDm;;1)^N9oxt8ap z*vC0NvroVte(l%B@Q%8U_wNL*A*PsP{0s0Eu+OQ)a0YYYp0n$kAH=8FEqYaA-@tpO za-M02*6s!E8sZIH!cV0RtIvH{_>7i2EIrJ1Ex#|FyY9)lUV@(m8SUB|;8{$}Cl+YW zqs10VhyOJ>$LJ=8_n~s~TjKwQPv9a5aztHU+qlnKyGo1g8UGnfL46Lj&YApt{|B&t zgMSH~&{fP`mG#Z(=ZMOd8Sveg+yPqHV-0*K7wDFpB|6Y2Xk&Nbtm)?>p1@Q5A3=uC zCFTs;_BG#kp-M;G`ONYBlnGiG^Yi#uqx>d_!>PqRIMEQZ|7~pVP79~lBgOD6o%;tl zbQSY_&VlZL`D)>Q=fIe}Fy`MYc#n^;6S1+JBkp|O8GoN{M!dcLMNF~hm^1bOE`xp0 z1~xbqZR&k@>>-?GSEj@cfis#DU@XSk820i3wlh_6Pk#Zw0$bwt8cX2+3C_i+auo4%V+JH8QZ;0fHnFpaLo>VD%!*z-XspL zfS(Dxb2*Fm;vI>h=X=CGrxsr*O$?Y(FJ8jG2JWv)M~-`_oOATw+2kj)5%Lri3B{cmo*`|nYnq0e<`4l~&A32^@tu)_A;cgBwT)8|m;HRpS{LvRK7 zeC!t`H=#YBmYBJowa;atPuw$-zYZE=zH_cM#a66YgTI!zci;WKb6)V)ya3ka7|vo- z?1c7naG^gsXY-6XxAhCq;k#xP^SxWn_&IQnY#(Z?^gW6Bd&pdlnrql1#gJ9kRku4a zGghNDhl;m9Jx~Al?fzSiGkXuy89iLjXIdr4+waI4Q`z^MwfcrR0yr2JXJ&&CP>z@?fp5I|N@ov&y;eTJWGqmLR z9Mp<^{9WTLc|+bBDCWqb5IaY0hI39ohsI*=gqkBD?|HQ3&h3M);^$0?QB0d! zrRpYz@A>NY=V%MsWiDn+`0+zhF*boCT9)&eYD@7N9aGG8!(mweK>#jbsaI54A+7~;_hR- zwt3ZWW5{#f20MeXcs{4^8Qd;Eh4Gf;QdT-Hp^WLS<`nfo(>o@Up&WOKr_V0Y*ypRIlZ^*v4GXD}t!pjYIc!?s_) z9)2P&-Y+qqg|qL0Al`xv_8*BKgCp#YSOT7pJ&o5ARo$70Lr|AXAwXq|S%8~5|Tvs63lSQ>Jl z6MqW4^PWi}HqLVm_n(Pp^bPXf5#!z|IG@91d16)MgzIlg|H@VE*~%{q-$rEyEjNd2 zOP=#2(2Vk2!}-k>TkLMcJC||4YdY&kT!+0RF5k~k_&WOu{t6s`mfQ@yuA=R+S9rW$^u6=$sR7?&d$-2o_vdd*j_Y_2tK?uU z^ND=}GVq>NaSrd?_rUq|-;o%8?{V!bpLfYzpg5y7&MS_wGdio8Rha92_r93(3GmL^J3taj4D}oQDZD*?kM=!ourvHj zO;2TkZNH~rS@>-tB)lM~mNpj$CI9?6Ek5{2YA`KBF(7&F_ed3<4-> zXZ3ef&(M9eU<$6_TW?OFoik%^(9ZoIdHgEQ*Ws(Jmv_&uzre53=i!@U-;dzUeF9qQ z6R{4xMSDhmc6mOonFNw!s0s90vZB_WyZoB?BjUdWZLKBdp7dMd*0uOmme_m1^N@QA zQoQ>-Yp%M1dq_@)9?OIt9}su_{@IlKS#uirH*jBpjO{u7OyKP8OiG}=ZxO?p^uf^& z-#hQ0dD`ZU<%HM40bA{;mLf zw&d8$yO!#$TZ`zG6HHVz1$Z`=~RjH|7KPD6j85+W_aw)+6=V_^vzye+4U0dzo_&zpmq& z5k?2meg*G&T?83F3G97x=fG$92CeTtjP*I>P2mFl8ZA!Xmf&=KIK}gm_k2#df$D!w zhL8|c z*xprRKa#%yZ46it(^lq%zXbmVdmnuVSZB^YI-xVLkH430iFNpgMJMcpE$?34`vm`> z@ZS-84+MErV&0`H&M4oa<(uKOEs0rUbFpaJ{viTG5F zK>z%@Gbnz(o9 zCy=p?XW~f|SrPBx?c<&HuI3o}n;+KUyJp`9KJZ(7_pRtBFoSymZi5HF^=q9v%qhB` zh5j3S`!3OSzKi(RKq9sUy~Oaj;hF(wji}PWTVsFUKRIWy=RNeCSW8Y6Xm5zEz+HHK zWrBYU0@%a5xWqQ@J%0&2E1y{dZec6h=C9E?hIJC!^~Vy#ejv}iRnD5R%<;|ZfM@F8 z%j=&dKCi!luJ8?df7IK#6R}))&&YnQzH#QeK+L?rSG#|?7R<2CSDz(QYWsgT7?D?q zC6I$QYS!>PGq$;p(PMGV+Gh`Ly0g}wOWilt#n7+T2mXEHTWd<4&vOY}H;;N5f4{`7 zU%|E1D{5zRjymreK8Pzm^Fy#C=KZ>bokC`i9BG@^pnrT zs#w1PGq_&Re6FqNAZL?Cqapl+zgo zxA%R9=BSq?PrBbv471)VInU8`&KKBz&WzVAZF}{HQq$3+if119EjYqlEQ_!;R8#$BtAqsHpJYZehZfb zvLY_;XTvk_5;W0M@BGNb%sYKQ@Xz5J7bo-?i~Bi(pM(9fws}>YWlDSrymwplztH`h zQ9`@mZ&NiBxbd31hWi>M_zYj=3NgPctqm2UU-@SZBrxN55?|^^z z=WI%j0WG?PGcG!OCC4yh?_lp2{v5hW5TD|&sL$9+6TLe9(cybmx4)t(=cK?h4s6$u z{|4W_37iA=8cP>LZ|k zGY0M4iutbX*|sG%Fay^RvyZck<@7A6`xWr{Rx$U0SOh)5C2aS(Cf?#ZlYOgnG3>`0 z@5E{ElA!MzeJ#0FjElQ)8Jq);f%^#ZY9H6Cxz6?HdFS!J1bg5BKbu?OY}l^(G5p_ww%S@H$IyF)zb5Wyd*xeVe(ol6s=SY1_bmTi z$)DLThO7qdJ+qJZ=LB?xv(|qT=n6kny#3jdXPxJA47{_(0(5G)DhoLG@4nYyi5=v0 z!2Rsw_j6G&#s39`I7jf<`hV_lPufQKamoS&u8vPM{w5xb- z?#s0|pzbS^(}L@Tmvc7f?a#UJLCo`50@pUrx)v>W8%(e>F-2|tirDYq>T{jrJIAiH z1-yf&9A*{gbY6Sf%lsSz>zM`ioE))dZ(yv7 zHMfB0_z~zvoH_Or4RtHvpI_^rcV191uHzcMbEFJ2^iT zZi1e{nU~^i7yGVD%^~_bc%NA&$F-fSigSCfz6Bj<$r+3MbK=5#?%iodIT<_bS7ImR z*y~h?`#rfJ$GQBwjm3!X3LnIrabmBr5bub&AJ5TR{S-q|Rs-i0U%~$ww8R>qzJPxP z_&k3D#%r|j&gb`rIb$v%cZoS$l{ssFj_(~wG1RE5H1PIGz;pKeoqL5|0%shH`R?bq zV2W;mwQUTa3+gJ?U#Fj+F|MP%+tYO}65pWhFW=I`zRsgRK|7;y*EFVHfgtA0w?M|< z0_V}5g9M+@=6G(i60`mh{y9)(DTml!T!C}1PtpH2uhd2i`~ttjmJ{|=ADE{^|Fb{K zFG|i4I+wW5`Xy+K{{Y(_fj=p|%yDL8uGgUN67ze+wGuINon6kD@az=#5izW3-uol2 zCGM>Iz%vtDP-_Ca)d$wzqV@)GCcn>|y^1yG@H=|?ofu$F%?#K_Udd7B(Z_CpImSD1 z`R3ctgH%LrN{+mD#Ty4PoeK6txT|2Y%aQaY@o|1bzGrEl z4*UoHQ(%w4Ux2zd&oYz$2e=k2@s0V}*AiFEKLPeMCK_zdeg^!{2#m$pF)+{P?)uhG zfa2Po$A00AJJ%dEF|2Qma80!{RjKtp*H1u0%~+hb_Db;f-jyw}4sHX?e@9~YJM3@a z_TgN=p4Vv}Ia9d%aDgqa-(dGL(tUsYnrE(g9k9lKmpDR?#T@fJNBI`}EO~X4XbkXq z*v~rQx-HsRDz^F!@O+HR+yC;-VGph=67dFj#_}2aXF|;Hf`k_4omAhDaYX%;xcn47 zW8Ja%ogpVWax*v;Y(Iz2g9cl!1B!F{PNW#tc!Yfq1iour!Cs;>{vGUo{j#>Tey(`# z+P%v&dr!NP-=dvI-*@6K^9-14o^yFe z&G*b+f?8*7o%uTPSKu>X{V5kiPM{aWy$AK#xR&R*CFXn$IY|_;_ch}3en$HpvnIb^ zGlrx#v-&y?qX$x1S=Hyc6JOPnBsPCou@4@{J%!r#KKQFfYPjLSa-*${J$#Q9y<{<&Z`Z$-|sem-b`nK$4A0p8+3R1x z8O(8}2JPpHT6~4=8gd!m8vo9~XXX3Y#|T&P&!4_$=L@vG+Yv(_Ys6Jz-WTtx`>dk9 z4^DvVi1mo?=+m!H-3HieEa!;%E?Dnbc(1pkoQ`_sfLI4spoziG#h#%(6YspAFN)j^ zY}Zsj1I}UnSndZ~aILZSRmd zz6(KoSI!mw3c4Bb);QN$a=X-6+gVfKT#t#p51b{4cfe=qU3~!jeIt$g!apVEdo&}y z0MyNpipHlr!F+IM#gTyreOTtAbuE56h6 z&Zs`#sr6oG>O3F$Rvy0r>L~fH*}^-gTqg&79@e=>{avwMerq2QLx#CNGdb-HoXzt{ z*!PLc{T);Z;-UfG75NtX3EF*LLNBZzOAK+>Hdi#j_k17tY{%k$%(2(!U_IjH`uhjp z68D*AY|-Ecn42$*lOO1X{>|YY_B^iA#IWBNa32BBBZyUzZ;Ab_aCPm@M1OXje|iy-j?9ZopXD7z%x^$e=GW-DhbYLx!?{aL_w#z)-3zVLqbnCIC|h)qF5UfoC5FF8-p7l8b!U_UMV z5xGlX?;!4b@CMtS312bp9xlSUc2oQg?fNf?IoB5;70!Hn{F0cniVW8P<6(c`Y`4HA z;4B^JpAmVfz_|Gh@C@DOb@X}Q>s!T`(K&F2(`6H&qZ(k?1$^gJAX^g zl)8itpr39IchC3i1^5!&0Uv{{>yYCt-{RXtzXkUE2)LIH{oka1uS{HbBtAQTzqgNE zjzXdX7$0-)yNYW*gMR>041Z>*+^+U{cca?MyXF8s z`B~{(b9@e;!`}n$KSz1jN?xFYScmp=qr*N+mT><=|A}=m?7!x@r^oQ#)qv|kUdFEC zTy?D_wr84RU_I{!=-W$CH!+;)gj~<&4Y0OKzzf&)+5G_Kp!P5?lkXkfpj&d+=qc#1 z17vV;b9i^B=y7dAT6oue4PJsvAW`pUnBuuOe}EOX@1(Qd1`A?s4Btx=?2K*g0qDR3 za*ohq3+z$FInKdf1sh;piedj#ZQy#&mWfv}-*-sioMKn{VVWm^smsFSOUfZ^n!2R90azt zui$>HJV~#ybK!7F9M0I>1$BN7X$NsRMPE3(-=QmX0$mKfy%WYBqZ?vVZ2QcBYySph z;`aCf`%U5K(&zUa{Fb<=>jg1;WZ-&paG!ebz#M%Kd;sj{v)ltduWRTNa11U1`G#J~ zU3_O!yH<#R02w&Dwy~9U0=orr-lG$=Yuo`7Z0A+FU|wS9fNS_!GnNdW$iG0`_t2b2 zpkK2j_O^M*hTH@n>KNwmGq1y55NkkPJBZo$Z(s_Rz`M~BuQ^Ndg?0acn}EtCq#^ej zF>}`D;g2Qbzkv5S`Vv6hdZ0tJ$&ge6`4N~xbAQPX11kMvT zuX4uZ?0bxE$Tv0v8C&?AzlC2IW4$Qx75+Wq&ejsEVxLFEUKg(4PkEMoP7L|ZVy*L! z&&%~Yumsx9H|F>8?de?Kpk3!3iDAYciQC^^XNl{64S$GsFXJ^DdQ6D_#8BX5GK*?ZLP7Sz`NH5cUL$XK&wWt%>2!rf=|j!FR2` zAGYh5?^-Rsf7Z=4mje4`;!3S?-986>RO%x7l)lF&)LaJ%t|9I@?O9XqnXv@)TeRy} zE*mdgLOi>tpg#lR0a{@1sXf6)O{~ImT;CktHRpIAggomxhjsgf{~kTJ9?l$j*SbP{ zi#`J0vs)mrTM*d3=RVstSb%Hz9rYdd3AT7%V%qjd@QV50;ya_yuLFJm80JW5=e`I$ zJJ)bN(ZQYI8@~jcX9DhHC*b?=MbR_jiG1_i=N-`C2XVhor}Du2XTJ>R8jAJ>Vo!lm z&nE&$AT`%@#BFjrbdG^jciO;nd~tL5p3qOg8fWNzwEOC3hVCUu1IE{20qUB@MFakI zbNJm$+n7@GoX7eD;Pd*N+!g3z$ce&P(-JdZXlJm&cBc1k4(r@QD-pxFC-h5VewI1M zlw4zCfqevgj>0~!ZJt~L0eTx(IS1$6XyxPWyFbCdM!X^B-n`@Xu}21#Z{ZX0najKW z9y$}VZi>ADp2siHPr=e0kjas^&V8ES5NpAC{1rLc8CWwRmawm*1K*x&;5^PJZ`^)C zUN6}8%J{}M@N;ltKKLD+ce#P9^0@dxtj?6k?eIMl<8SbvVK344I|6bEPBH!f-*a)c zHMk&OWP+dYjmgbG7X!H^wvaFW5FPvjxG%vBd;~m$WFBaMd+qdz+vgR?*v@jA3%w+E zNX&fC!gsQ@4zVtU*1M8p;Ch}K&qisme@~5T+yXw!Jz}oW2CdN6h<)riIEQ@)IGZs) zuhc=le`fK|2^;)fv33sEqA#QEaShxxM(u+5Q*8J804>*G`wU#uz0QEKHAr9y0z86W zp&RgR_wfDgNDmjLAC-@!q5qbvSVE2M{pQnQDyV??0tXs>+V4J%K z?_9kQcYh7qnO-*;CWpFOL9*I z-X3>|e-2!$B~~SCm+#kX9rj{W?{|fF&U(*Hel_B)@%eV>V-O>b?0!zabEe=zsgIBu z#Jc)B#iH;zDqG$~;@%gZ%X+8(6yN<`gZmY5&Rpv2XF)^E`+7oNpxfHN)OmhifeF4f z-htaA-&jS0TL7P70-0VuZ+ms6c@N1r;bzpkUD`P@td!1qvppK!E}U6(~@k;2?x(j2H?d zOk;%E2q79X48<^*#th~#3`1iEQ<%XtW-y0g7#cH}#tav6G3I^WIeWK`%DM}Fz5e{x zT6^t%_NlIxeSKeomOhH-Z+^tE*Hi2kcos7O-=ODUA3LKJpGS-Dd)LN*KA*T;ovDMX z;u#v3e}VSB_A@u(*R$~~?bF1t$5ZUUc1HIaV2z!KO^e3s^N;YC@Kcb1XO_rQ?4M&e z{{?v++^66p(DxxnzOyHA2K)K_@X**u%(I_+zX1Zjirgu&FTrM9M_jH0_Wc+9YoITj zDWj{b@B`lUJ+~_R=HZ*$0P6x>oDNl_d_I7sXaK9;r{dVY=_}_pT zcmjN0&gVHM_%k6Uzb@Ph?2K(r0JZZwx3lNEZfT_uQ5@y%JH zU%^+A^LOcWu!eJeZF7|_hO>74zks=Yh>c}MER2KOJ=&+=%ZRj}d;Yj^ zp6yti%bE?a&$i5nMGW`Hv#8H&oaY(;63#vsz_zq8+%x%)Mtl(WEG`lA_v`kv>-&)7 z8O%WkmcVz!Tx&DD(nYxoXmd~DooS6-&)YonSH#?_&(eJ-Vq!t;5cK`g_UVXwXTzK# zukr0~zWq}S_pd>F7INYqIFUymp}Ued#h!p8;^sX8`UyUOqFxbS1JB1A-wks=0ar_G zMLfv8g8vfO?-}r}CF05w`>=5K$kB)UyJlbKH~{BC!f)UMbilJPp3!sQe)`^|D$Z@b zGn)Gx{RSAT=WfmeV&098xNFR?XXr2wZLR$izB$(DyS9BAV&-S`6#W(ikTYLCsqxkG z-Qlyjj==wygAnQ+POv&)P4`- zPRW@9*K1>dYZ!O`N)AQ@_H$joGu3r7G0(PvZ-MW+&wC1HaIWzbyFQPE1bNo~NL+r6 z?V5?Wl4H2bci`(82eB5|%lRAZ1SZ(ty$-tpJJ>6GA#Duby)v=!`aKEfx(%HBA4`Vw zp4lq__c)e0zIVXy5%S}DxqlF|?`z;%+Dpet+nT-~QL`0n~Sc^7Pm zO~C{#ft>4n0Zxk__5f>Q&%iBk4s^t-c)r#dpOt>@p(V%O4~cKkbKvuEJ~{P5AKShs z*q*2Vrs!ED(86iA!1+7_zlYxj^{nhM#Xm&{a7}AnucO|WV*W?unV({q_Zq%&^E%=_ z?-twG8vhggrEz@E)LsE^>;TTYGsW(Oc%zMWZNDo`DrW-m7T=JB#v^n7sMlpbv|0UK_)G@6c;}WBcGdIhVjqaENa&XEEn3u%9qz2gnIy z)^zl%vjp+LPldk<-{Q~kjWyWzzen8Xt6yaS?|M^k3cQcjwDIoukk4vP>;$-W1E)B* z=iZ^MG4D?!zMhY{+8NF>vR94OeZPWp?tM7t@qRgvdVy}i3N$gC(LV7h2x9gdua(F# zH^E;AW8TkN*QsLNlw9X>?VsU}zysj>+Qjhrnc(ab_@5E~BanXx^fO!)doJ)d!1cZb zResct>J9xG`~!0B>3IgW^B7lV#Oxy?hI^n^PRbf`)>M&S<3AlSg@*N6JTk(#h&>CX(Oxt+(?|2LH-E#|k zRvAtt;-BI-XwUs)ZR4N==Kle>7e(DhZ}vaD3;zbz+DmaQ^W5hO{kY`V+j}^cHimcc zQpvHGvn1jTm}38xSckpDUShA&_D;lJ<6CncH25vBMn14z&wG6iH277V&$*ntBQ9EC zA7}Bo*w<%}iC1xLInVG4xC5SpyI=;_kQ+el90~Lqvx>a6e*cyqi(Ce`;5_@WxTgy5 zsLxYz-8KfDvFF4W=!RGlNEgF9*!Q&-j3wZk-Qn|WE{8uB*L6+NY;m6NlK7;+-p=7! z?to)pZ~yl%Jnyi+^sq*0;@$rSM@!84t7Nz-zR$}uS<4mPx$J9=c93g+Q)&)~%O8(; zdztT?m+4ofrRF;ROJL0sK8QWRUto(BNccx!j_phfee9Op_XOV@`M|C+BW6$U&?B%d zerCD;n!Jd2?_SO8i1{46o8G?;y#$BY-m9@R#1oi+f5ACR6=MPXEZd;(p%2k#62qRY z%h>hqCG09I^5xyXwrh>$Be=hT6)?{=#eHC>X^Mr86CYDZaD4#m?{tYOny0h~ER(fNK~_!0M9^OH=<^|yBk5S^X-8Q zZ=ZGPWuH%oe*~7;4ZP>@HAwh(&<)xiO2qKl;_tr|n3s4@@~z|X=N2=Y?Fb^Mp$1~?_xp4NNDKIh$chkHF`&$zw$9Yb{6wHCXv)S(n=exe;IQe-p#L{T}-_pzn;%QFDTrao4{<&Ki6HdTU`6^ z;1{5uag?BctMCue{~6G{8H2jhO2^MjJQpHui79A3)$Y=&sZ>=+E(;(b_3|5YsoW!R`uL zHN1EL_Z#4v4RPfN+r6*QZ$U&K?td)sAHmJgo}+U&z+O{)_j?X>)GUe3u>T6&qkL;G zpl*QY=iK&4f>>AwGWOSS6XQq|!X=Xu`+{WHcl<{BqpPR=Rl_r)`B;rd*-08=>k zwxf?uU>}%Q`<>u-@Wz#h;rEGW)?vGb@3HYJf5vzHhS&z)=cl;ddF&j+erEXQsqLS^ zF=*lM6F0U1=1hTN?jg3%#~HgAdb!R$;+KK>hxok|eu8g}&t`>o7IS|ET*tmk5aeg@ zl(=VgK+K#gAeUawnXnc6XuIaOUj#xIC@PM){%F%q#G zaLyB8gFhDg{s``aOuudM%w1pY?}_W6A;f&`%BHoeXUC^%5V6Tb!xwHoMH1;Lho)ZxG z3$)Lyo{N3F53XtcDf&nFDY`8&>zu`yym$B>Xo-)dgR}Mym|-jWXA;9cmxbS;-Pc&A z_|`a&&&(M*>H^(>IhdB1bH5-bp+6)O;@+KSV6WuV=W2e$urJT!HAwh<3_X^sa96;B z9?cf_?-C#9Yq#XNuDo#8u{ekO$>e-vr0PfHCF=3nMp1u2t9M7dC-T`@g>u*aY zR@b+FEVron6Zjg)%|L%HB&m;y+xID$l-e962kk8Ko}2GofBwYB68P@nf;{$EJWuz0 z8=R8k3}f+q-Un0QY-4f04Kcqj?SNOn`X+|EwKvM|i2Veg<*8G&MZ|C?%&F24|26r( z6Z_yM_5%>u${PI~-}MyNI>4Wzg=-xYu1_d2^CO16SidMar|1@BIO~_-CA@c~BX$kj zXPEI5zS{X3ec=Ar=zvqc!G9yqUZ=#p`*%P@PxpJ;!#@X{RWyam=m2l2`z>*~i@?sz+eD3|6=-Z%5NA3&!J~zs{SxL0#`F9ZHg?XiSP07?4yA1alcn;fQj&XB5ud8T# zjb%Yxt|iyKjAt~@J$lFH=nR~9Ea%~z)4Of%e@G1HYhUO53#j6q@Z6NXFaCHR&TVf$ zqjLf`3*7W%h>MO&y+wnV5%OSX-AH^S3u9sf6ndm{*XBL_rSHb#oz1u#B&Vq zb)e4#+rHuvdG86_DRu7cIh;97$?@#GGXWa%7KQhG^aH5f?=xb~rVVqEEZs@Ov~9`=aFZGZOdQJY(~Hu6{?_2O;3yQ(N-UI&d`RY2`Zd-s4PehyMb*Uk5(pJG+0s9|6}&~m1^&8z$|w(r(4xC8dV9%y3d_f(%8{S`V1Ibfc0fcBnLk#mNOcKx^D7QE+Y zj|Q}GzE@YknGg$*f%S)Q+W(VO?i_g&P~|PQP}&%JI=8lasr;tc=2eLpX7pUly9hoc z&bK5-@%z~IQJ!b+{;8~hpk6L1wAgOjp`ytRJbgn7ixX|Wa8@EmgV?tlIue%*X>YLEAl;N6?&^h{dvJQL5RioR#)tP9}XNm1EhHuHZZ=OQ@3-aaFHds-`tNk93)8Tu*9}=INxwqxxU4}j69uk+|mbSz_(-iNso{P`RXIa->(98YJ(MrT{ z9>x=P2Rvi#UeG_|i;QhupvQ7bO#T9R2AVMsx3)KN^{V*p>pHPFU7 zK?W_nx!d<96ZhHv4md}`uW}yWHI4b1e+76q`~6~@KLaiN%seHA^YT8+H^l3jkMIxi z=jf>UmQdq5=KBt0{1&)YgI3PL8LP5156r<0xD9#+*1)~EZ@CmhzX^7W{hYY#^jvLL zbW6@5ocC>3YPV9(T;D;@twUd~`Gs8)ledR==M)%IJc|u>Be0FjdoCBy#siGSHJ-tZ zB@?sm35fX5nncWZ>@)BYPbB;6L4xz_FwNtilLu(I%8L9uqWg?pS{fQhU>buZ8nm{|OFU zAHN4mv1X5W$Zd&tS3bkJRswTypV;pUH^XjcZJacf{6c&%rs&{h$#4gE=E{ug>e=4d2LZ)#ez^!Mgv)-`5@fL+l1U7WXax z$D%KyGdZH(i#ff2MZAjfNBEwp+zIgBq!^IVzrz=D9k9lA?h$L@v$;sba84~b@=N$c z%=lRROs?XYIp+-B#=AR`u=Q8OU%{UTo=Xr@ya(riGfaq&he2!su&wVYApF|P!?JGR@ z9Pjs7Qj>ts!<_HI1CYq;Knrf-=hAzDJ_bQtJK&DwfVoxVJ7Txs?VHRYmVnw??}l7| z=Ej-TUY`^5nS2AhhhKtEfczAGp^fhA(Bsc4Rv6B&tl@od?J8{yYh<)**gLSt(&8Ub z<7}R*+VeRR_za9agY&!UDRv8j`1l#=3!lHAcNu$I%=e5pAOZK5;$2q8pBBu~@@wF8 zSb={~<31PIJLqmy>s+^qy#cR5l_19+@=Ax^gRlKwVo!)QG291jrHkR;QRU4w?%F{- z1JA?HAN@Tz{Y%B~&!yyfzRoS&n^Mp1u*7{QuYxsjtt!{>_d$+fz8Y8i{nE2cG0dQL z{VF%GH}rBgXRwd=XDpu(`#WfZ{h{4!ow3g&e`XDQ2QI@0egpIa*xR%5{`!5(b)C(7 z(7?Aq>Bz|eh|V?j z_BH1gm}2YqGvHqaW0~UTfCn8oB3C$ff^&wJcmjPd{3qZlxC0)5D(3neX4KAsvozF+ z0QS92EMY6oWWDokOFf?rymz_o!`?ZD>;~=q`)_#fseKx7)(>9)1)MnvyGjIo@cmrx zuoLLd2vgBs!dn;MBFNEGXFpna-zRhK7k)!*4Q9agPJwr-E46R2Pr%hu=XZ@3ZoGEC z0I~BWXG(rk>JvKfJ$u((Ve9wnQRp2pE_`Qd9I6-B|BASG!|x|P6Zhadwk=Hz&;O7d zXWk*l`V0=h9JJ&(pLb=g5A693{$-Hh8!$1a$P(K*?c=^{{eO|~IY$hM{h5q>XLg1v zr_@{H{TTPJ{Kw{k4SAjGMOh1-fHSBAy$2qW+W~v7<&ZuHdrnN$`zY7MkZb=X*nWn; zC;xj8Ad$Nm<(cbxif4I@?Tiih2z!F=C5E^&y#_6QfGYkQ!q1?dLygK-TXZ%bTmf$wv#lIdeVbp!0_8ZCC9y>s%l zpW2+U)IFTV;>_v|=W$Kn{q?9<&6P6^>dMEO@^C+zhZw6BHr=Z-sLI$ydV)% z?BN~w7Q6u4l4H1g&*1*O#UJAP*|kT{4lF^Psin^RFM#oz=#vreI?m(F9k~sBpsUzt z0{4KppC6um?Ok*1FFbE`7nK>b&+}988z6s5k3^1r0-Z`v=h_zehPZd3!LDwoZGl3=cP&;5+W_{#afVv94+=l%wq z2j;cFvlJ=J7~Z)h@do(W<~jlV+{y87Zf)=J9dH-i0-0D9*RQi&fU{o}=XC8U=wirw zi``(m)^p(6&gDH=qg}s&_ZfKSJZ*v=X*KocE;9IZ+D`G8N2F_;93*h$-XOR!M1k`i< z1!%B4;Q9%z%!uF6muLQ)*ydN!{u?o8y1m7juQV~--BuZTm zz#-Vct%0@fc>#hv#aw;k^)tY_o(p(vVU9W*E3@@Ih`Ihxz&#{<=?ODtH2KcT9u?()@*L5@TskL&&PS}dM-eu3ybv+M1k2>Ot>(w7Y{atIV(B2l~)_qSO&!viU9$QB&(C$Hf1bnX^f~!D2 z#ZVJ+ST7pMmFqJp<CwQ~8GU|LjM-Z;*L~JLeX#tvNZikS_q8qk z>~P-8`3LwmhTlIKZLVitMQ%aO3V0UZ0ApjZ#+gOHyH1L6#_%5gK-`>`Ud~%*vA!d} z1+KF#Q)1rtw?Nz6v0SHD2NIaTyT%e-#s2+T#Qs5!{5^DIP7DY&vLolK*C zu3@ct!n=7i;_WX!By9|TUyt7bV~bL6za9ED#A<)JC&X50b6sm>+Q+|OO-dVsF8S(~VB zKn8E%0xcBh`hl3Ur7$wg(ep9u?=eiwtS{{+r8 z?PI=sc72~o!q0-3FvolG5E!?a;)?F*&o0TaORG< z^G4yF>oT|r?7x6}?_9_W;2IhIA@N!I-PgPhjK#gky(rpuWGox{`pnD`O^n&WcAl@~ z&@1w9VUJ}>%sp9a5BF2Wm}_SA@6qxza>pX)*~tYMOTZ=I-B3F8tF4@Y8Sddf;C!Dy zB;JjUTnuc3Ziw~sVE1d3b@~iqOMK7Q=l)M%jiT;Al@@!tJM49i{uTHPB;tx^7csoA zza#!J@E!H+#^Uoj2EJpinMb_qcl1!+yCeASP2L$!f$w_6yLDT5Yt|*tzo|O-e(%K0 zRWfn=^y>xz0k0mfPvlH;41c4^_qk^b2HbvGQ?8$zSODde*n~QB&LqyP{_N%Lvp|0f zHsjoqIw7`#^I470#`qj8tN~+A+n)As=)Wyf@_lz3YY{&;Jh$=v?ui(Fclyi{yzklp zc7Pek@N0AjTJQ?$j4?^*}kyU+b8h!`@| zuH#Jhb-q6X@A@7vSKX2qpaTnHw?K<+{~5MDI`k4$@%*mi-vf_<{2WwiWBAuMXVaqX-(kz;7_|13*aGeX@C;n*7#x5r_$S47uYqse z^*%4$A+~*-?f;hFgSs@SKE;qOO3k6wWpc~8-D6-#2yvOxR2 z@V-2C9WZ|a%vDaYtC-W^dmq+d2BPGeKgD(~=X(R^4E9p5&_R7K=r#Thac8T1CcYuA zu5ya+v-aF>pzZCNslan`UHjWd%&?mv2RPR^C4PeT8P#)W;3wpMPwYHUB6`*5ba3~G z{{`%Uws1qn@YCn&K70;O3Y@i`U!O&t>$t{)l4D&*JU|PQK$;ltf_w5#O~4#GK!3*g zo_!*(%0+yC$NvpH08bxm{JWs;)4qOQ zc^_Om=+S@#v|DR;`MpBka?~foHTa%|`}Fx3Q<@mgMgM?!psUEOsW}0jseS)r&v5q6 z@Tc14KGz=JrE_2dI{L}i9JSB=7C53-J(fO?ngH^@+~WIO;x~z(0MD%Uu6-87uD~6D zZ7$K*^KHr52cFM$ec}z+7H4<}?|sqsEE75f`DmX_75kll2F{$H;Q}qpe~fQTJA-rB zUx5`!_&rby@>_h*UEA}__)~1_#SA-DU@Gp_XSO14Z}aW|&&pnPuQ`VIO8y>j?gq5P z75zC-rx@0LL7u%n0=^HfpWzzdnn%DMA&3dr{Dk;lL4Pizd*ZD2`wZCgwDe0O$@FlJ zW8kb0!H2}&@<-@xaUFk`_V)d{q2#l+u~m%W}euCyM=G;GVqN3zjHf8 zdmh4^126?G@NCRAz5OQymhWr-%yX17(O2iP?pV4CnzF!-^5yYHl4W_`g zjgRFbHA~_P;QhV_#xfzUsJ+AP$8&3ASidLv@q~CsPJgEORm;DIy9sjWy)RSZ_5Y8D z@7x8@OAKo^^mJ|GHBa9DE8@9)WM}3S1^0#Fg#YF2T9}n!G)bq5!41zVG54a2w+@;hJ$LKP&83fdEwHzrt8xJ*_;=8rkFi6VRXG-`IV3uTJrw;hWd@ zE_ny|-l0d}0m#Jb+Ug9yL)`OfM_f|y`xrV3I<&~30SoFqucy23e;-eXoD#tg?%~(u zd`NN-g?GMfagUy%`&)xLyLnv<_r$YU%HdbZ+VuQ_dh4_wW4qrfXU~s7{~nU_9XVt1 znYA(80q2V`U;17q){(O<{oSUg^C?XXcO>uwyDf1!rOzYZHS0djtKu5&XI}V>?>yeO z&8Syji!Xm0&htyy##{7NV*XC3&j+@bh~e)ozeD>>KO~pnE`Tc4xAsGFm)tkz*M3p< zhPGw`cM3NJ=dsl-@hP@*)^lixeT8qXG56#-WnxQ^;kTtB_9r;k_r3Eu&CrRsJto*K zb_U*sf5N+;jBU?rpn*#z$M?wj6wmb=U`GqpSI7afm0@><{~kBxbJho->VD!Ci=AZe!PIoZ~>;^CjKF4v3 zVouDOyCB8T*Y%S=+I`=`ZsFuRVBIy)%Hy|SjqPmvz&X5sat(fm7X3M+<;-~u6yrj1 zo>#;lfF-u|m6M<0d&ge@d%Pzx+)Lx$!wI?lK1N9kVmGV*E1IA>-gro zzP&ndLhK<3a#qDp*!_&?nm31gZXQ~xe8T_2IM~CkduwBuxg~Z0e5S571q=KcP#Y6Z zz-jT#w{J&}`z4;SvFAE%r9YIjm1H$|!b5AHv@S z&6p?EJL_F;&@G&Mu#dLut25fWD(Bs~4z7R%ce&V}%>lfzIr=8PJ!haJrf$&_v}O86Vf%bVWz!Vr488n~+`-M9}JD+oGO6;sBdEN;> ze{KWUbO!IwNBDJJW9D5Tb{V*4rdBbhjbXj3aIb;)W=T%1H_z`{&LH;|ZY+U+h4>up zzI&xpxo zYR=}W3B)~TdHa7%?i~>1CZP6gI<$M=0}IgLx4^q?tQY(Lh0v3yN3O46z&&jXLlxR+aO6G5yLF5`w~9TivCUfW3=^t zmgN{wzxx?mf{vV8=h_=$`)KE}&#c(y8Efg&fVcP?@PK^pT@`Zzz5}Q5{yk=`y)v-| zsHga@C;#`|A>Ug07I-J-C1-{9vm%J6!dv${Vh3>7(KEF9M_>(neluX+5?{T8-%{^7 ziuxY0pTMs{G7mBSHU85Q^BkSGi{Y$X=LGl}F+nfD3?%$Zz!^f2ep?o0H*#ycX1)T5GH+J(|+z``t1NwQ?uKy`z4nEwB@@v6y4ugR)NLJ#%aS z3|HrN4bNHs8FB0O@psVHFVVhFLC+cfHEj29O$VN0+q3p_4sFl3qsBGW0j#+|TqOLl zSaX&5o*a3uH5U1ZVJ7d@A-H5NlH=X;(r@s8fOBsjlDEWHUohWE#PpNG2(u7D}%;8H=0Hpf2V1p5#ecP(QVfW7;AbYm@&W8gbuWj^ED z0ryMlo`E&I`&QJVjo~@SE#%1i19%L+01Yvpp=-C~CU6=1Ch++O{#CS}%i7!G41V`8 z*FG&dKD!N=fGM!focrJ-um_wY5m%ZRo|Vtm^J_pqD{&?4Ma(;=?V3%A^=E+H!nv+~ z4vLJSPtZ5uJl_Xki9Z8AtNwXoJFEBH=WX8S;FOp%UIBA#ePNAz&A?p!DY%CntS1!b zNHNUo-7?ob%*a*b?eny7YvP_?6T`i!aqBYiDLUYk34Y+q`T1~+U-!GfUIO>+TGpsn z;0PRoM63hOZN2x}`i9sXZ9iv8#2I?7JdhG z_@V&;T>sYYu+PSNVteR@nEP0Qme{s5#C#u|&-Fb=>w~z`#;}gIbDh9n0nTw5H1Jh? zM&1+O7w^A0pMhqSV{YJ2>D8id!hZ)+T@&rB6JX39-^(L8hMHN4yUsVDe@1--Va?elUk#$0P(dnCEW(7uO0zbekI2(*x(7U`x@L;nVR$a) z^>+sC`ftGo1bI_*0(YtR8T$Opt+Te|cuy_?WBQB2XKdHs0ORsg>_c?IZ-DC@gBCbr z0yE$`^1lDh)PX55-`E_SVtXDxfFD6aegZ4vK1=lpkh=!#Gb!lE(|4_ezJq=Z%zX?p zd; z-Un~xK^1fBew^beInKH?Cx%}79d-uBt=Cs(*uFa*@L4p`hu{0*yz=5YIL6V}!}UCG-#g=;;Sz1W{amZ1 zk7whVxn=?n3a_nnG3+VO4VV#ke;v?P(dlMS&<>;Sly{VT8jH8JOMPhWu$^j4Z+ zFZc_4W1pb^jbH2g9C{=;Mc(z6;1mRyl0Qc)lcL@KcfkA{J@wuX``>_fwpppE39f$? zq^Oa1+H>54^D{;??-x<6y|6*%vq_b1`|{GMQ+j{3v&oV_}7y!Y;FR&$7Xmu`bz zi2ME=q64l&_wNC=>#p&AHdUtB#^mhrq5Yfddfv0fT40`YG$A{DZWwz?Y=w6H7Q2m} z?)Tt2KEo+G1M?gB`V6hFM<2D|F%4a z`y)ue`kUHC+_%p=#W1sHcVol{@$d0n!?`D0{pa{{Vg`J^{oYG|RYQ+No?NR90+`?F z7cuq;G1ti0p2wK~Eu8cDoZi9(IcI|XXW{{zb6e~s=YFjdN7x&Ekb!5n1_@4)e@ab< zo`TP@UE>gYdyicV{|4jv+M~s9OWgwP-t9HV_AXom?qha}D84RaV$ni1`dIfj7Wd zFERZ7vBw&Vo%ZLM!Z|6!Cw=%&r%N58J)>K_rOfM z!1to1#{%vBc8~s@=eiqW83cR=*4XE;@VC*Pg|!X5vceAHzDuqba()&TX=8XU9a=jB z`924GN&dy%;or{^{(FKyg?G)nBM!2}pzkket?E22;D&*2<#pTYm-KmQ2ye+V(pTfPfe zU_VjC{nc25ZC(R1n989&YwwlokEMlkR{J~ahvXWy^7iQk-GL+!pNrg@`ud!-Gcnh1 z(HpdR{XX%l1n~y=-_P|q_&1U@V_D&!%@^de_l)kq1nw8qG}xEX{hY+=dB`U?r7eB3 zd<@_1J^NnJOW=FtGdacHpzGZ^!VhZF2>ZnRyUca#diK(u!+E!+z;&&^i0v9PaG=Id z=pHfb#oq(I6ZKBPo{4?Ghik2ivv6ujgH!)Inc5AhD13AQskmy%=np4!iX?Q;zK zmA$wJ`*mdv&%%3AdEd*9x&(~<4&VGMK#3UMiGDq7wfA&YdbGq`vqLw)cj#N7t;pH$ zxa1pOUpAcMIEOu5 z$MbY1_h7F3SYij-96vXLo?}@O_x-vE?B%*uCfI(C?187izBww(n)ufE?z+YryB+b` z&UzhO0hhqGWOA%`)&xI3uNKbQXTW`A{IMKRb7&mh?{SN7@U8QXx)<}6`b@PK#4eKK z+DRVt`w47hPTcooztqa-fDqU#@B_SS^b!N#qFvMH>in+x9ol>)V)$J;M&ef=_Q)~sGO>H$0=NqTuJ5TXd5QQ|YX-@6X8|0*N37XMfM%xUm&>i&h@P$+yJh8qoJbE5-uuQ*vBC<0pam`RBXQL|MC! z4nLg5GrA1C^CzGquZn!&JB!?N@;(9`w()*1B=6&2CH@QGTFz2Azbkn*`ZZ>M>pgex z`%PevJ!^>zb6flwa7NGID{u?=Js=aW;_N=xIdH~j;1JmF9{NMFgmbnPXyaW*XcP0i zpUy@?VOgFYwUr*9@krQo%ktm z{U!Pk-P#9PV0SUhqi%{_wda z=2&|fze?cC1)Pxgv$W4aXJS)g9Xf%U`&YPEz%^XoK2`c0{1(_tzSb>>O@QZ-z>QMd zV7r&!gCBu?Qw(R;qP@5F@eX(R<~L~NFT~`$_XpM?uBS}#-w;otNW`$uw{R`!fPFnv zpH;th$!*E?v)KK*##dlLegfuszKI;yo&jgE*AB?U`#H$5rp{z-KPTFp0E&FgQF}(8 z)2E6(oZ0#{_!pe_Sh0uqt_1;nZ{<7e4sL;N%Kr)Yo=%8W(H75$`;NG$977*#J@3F*=J-uu0QG!#=<69ftFhbI zL7qL`;|a*br)cw>!+n}>-2IuGus7%#sJ*nUtD+s`DL(7(>9Yn^a$w=xbAf&VI%6aG zZ(_&rZ4g8!H4-trXRiIUBeC7?lavs~Wx9$>H z!h6ozIY=ltBxX;~%pCXPnRP%;S)tp&K+k~r^1hQ3eC;Vn<`gln122j1fwgrp^x4C1 zv8QO?tAwpMv%PMD4cv8f0_Jxy+!y%NiTMmHx%+x7O z4F6VW|AcLRpp`C$^*!STzQwoK6A;*nYq_p>%ljU{J*OCOjP3a^(KE0D8FcUy^a5@I zTt7gS20j@pdX4>&pq(3THW4n%bw2Hl(7<#`q7ct|CbGdd3y>}AC>ud}A zuwGviyPJiUGGzlVUK|x%K^N1();3?9};W4m;Lj? z?)#H_0%EJ?8}d4GX2e_cSY~kUb!81&emtwZeh}X$=NSLJXHA*B^=sff_85zMbtda> zU>~9t>-;?N-(TJ597I5fB63&Bk?+8F*v?U9fo;EE5_f&EE#}xG1N*%l=fn`};GTj8 zZoK~;Vl9}18JxB4sD6U&^YUDhpx?Hv;Qc=9+Rx0{64(4k;kCDAN^Bqg3D6$TXKwGu zFkeOos4?}@p2S28oX1#)?Rx*4xq2RTCV>UM-W~4ZS$t$P@Q>g#TFmG*0oon#xg_BE zxK2ZCAANCm;1hlT*AHUjnW^mMnEd~OTcEdPO3d$j)^#!TabEqtS1D-WJb%~mJ_mJU z{)@u>jLzgHF_P!Rr-C|b_duUVPK#ZoCFc!jV#qbebvzT}uHT;pu>_Zh+f)13@EvII zJ);0CHJmveI-%c!o8)DE(C?$zMEck>_y#P=t$7```#41VJH`HE$@tzuKVO>|GlOj} z`Ria?e4gW)Hiq2$#C?9&`Frp#XyJr=>1}kzzp{%D)+N3{Hz3SK7TCApeGi);7k>vk zu)jf%#WQ(K>=t+lT)!btk&ED&5c6|MF5y>^@9>Rpz?5~ICBRthZH_be*%Q=^CF6@5 zaOSN_eM3xJ%)lSuT4Evt_vs#;+k4g!dxSj$3A=yZn8p))hyDmIV^=Y!<{8WJ?z_7E z-Me*TaUUlI-q9HI#IJw_xCgey?_fux^^>*u&XBQd-^KKuSTu~wB!#N<;@N9}v}lh{=_-?Mp{t=6e0#N5B|OsxM83HA@?`?MPI<7fUA z+@~OstBg7Qw{XI98TXJ=Zo@hEamh(R5CoV~)1ig6_Q=>(T+80|-Y?-}#JAXT=3FV- zo@4PDdSA@(dALT30rqdOy{Fz2XFU(9%!%K{@5ssED)y=MMeO?sq!@VDxS>CiCWiHW zxBT4^_}k*_-+}(_kNRhFSNI*e1+KRPs<_vU`7yxx$Gmy&(R;N7-@wnz-;#)7U+%Ai zZ$V=o@v#{Dn4Eut?RCs^jkn;aF8u;ADvc$Lk1a1mE#|8wjpYQ5e z?D34)6!=`M`OKUc_T@U(%+W#YKDKwH#a8-#4QBsy4(IQ7`&6m*=6Z+5Vr-vSOa5`e za#Wk6{GE%Q5chew7w^h=joMSrn%CqxM__M@XXt)2xG~D{d_0d+;98m52A$O4Cb>Jn zclk1y!3FWL91-(gneztJ^QqdowPz*Ayp|pfP$zI_m;C{`KZ05t^3?l&_I)b~r9C~jEQfZVf$iCU4d=73@i{tIo)m5Gtar$> z*noyu0v)(XJkS}~?{lywX96B#FM#tYU65OB&%nFx*)EC6C1BhfXYyS;#dh5jZ1*6) zz?aMDws3#JZ%aL$`d;3PN5m7lKl2#ovhFGIDe%1QZEl}qEu!rnTwlJf9{~w!uIFst zWpV=D!OgL60oRdB#9H*U*tMto&v2e^gC2|hSLEBvwd;E3XuDROYl&@rA4hw3$EEHH z+V#8xKC2AB!S`7?d%tgD#@`dT9dh>29o!*0&}V{u2=6(XGY2iPI_Cuc4cvXOkKK$o zbL5@r8F&I-f^G5HEP!)}poi;tj`qlC*VY#DugUuwB27g<8{?1|Rf~W9x zE%jymJJK$urm4r+>ap1j9J&OFF6w9-v1ZmJu!Dn z?h&(Y``LLmw+km9F+7i!crW-3{2S0=D@!=nt71(HTwhc%ry(xy{NAGuTeKj7+UJD2 z2fKssIe30!X~+$rwnkgb%-tRAR3sDke|z?S0pB^_%a+(!cqByVm)# zH9)I@yWcded#pO3#Z26qY$LEXy|dn_5h??qpw34Vwo){SS57`{Kct};c}^BN+< z-8y0Y`@p}g)7F|b&sx9R`cChF2pBPvHuyb9o_ER5>AKIe6nJYshkFD5C-EG7SIpfO z*KgrHn+`Oi9QP)FEU>p_VXWkQN6vc^@4TCEKaTi-Yvh6VWlj(EFF-b4#CX3xx{dem zt~1MdJ~Q+bUF9CWTO_F2jc=WDz!xB!57&Z2Y}a-M`?$7e=l%jdgAMi$G2ap6m(dMK*mGcC z;khh}|9kAZ#|PM-gARNQ%)JR(dN0WL*|^44VwZqDdqK}YCQogAQm{dr?>T!neDCbj zk!$QoA54I2xIgOyyvBCVEx8?VPUEh92&y#1oHs>{47%?JcOFjEeKzDRiFasop2FP* zExs}%<{fLI>;ul3s$}9FcuTyB^?Uj;M6O`B*v|Vcwz=c8uFpLct|hOtRunO3P5dP} z&a*A{w8lK^``Y4<-@_lsbB08YXYWjhYI3J&`*?4i z_WLEVzX0$41oU&38C&u$!TkV!248`<_yalSH{^Lv8MyXY58^HGY&zh)9e#kmj#}6M61cuO@)PtN1X#nlepmy{ zzg_%T8+t+=ZppU=SMjs_Yj6uV zS1w%L^B2Ti-?;0w=$=E*@n68H6aH7&H$jyH;@%<8;SJi^oJVPbUi#?EXgRT|yk~&j z_ai63J$Rp)(w{fBYor+9d{4+(mK^nacbB{wF`wHZaJ@yzZQ$I?GhokGXnE(aazcEG z?_A9ak#XLBktd5ZNuZ+rOM7GMMC zp1K&G!$-vCAmKOmS5v3Iz<1xzLB==co*NL@6^T4+=fLOh9L6%(11-5CKmx9R3Y@D$ zZ;R_+fm?$e(9ctn?EMuuqHcey*1QZSCU8&C%Tdm_PhGQ#;WMRw2IT)o4)s417jta; zz9-cC{N;U?{aL=3Ku>a<*LO2vSLv`X5ewjV;Uh2wbq3Gx4gLnqz)fIIL!F|YlGC9l z#Ge7@m=RNIAMJ?YE>zB#cjE=fa4mR%?L1BKA7VS3eS+8m`zLS>wD_LI8f0wIV!Qrp zur2m5zay{8Bl7Nza^;=DJ-K(GUBx}FK?avW6YuZQHT=Hx6_}6eYQ5Ue1M}=_eHHzG zP}j$Zzr_z=AJzr*Ya`g;dqa~*!HkP`+ym!B@(URx=GXFO5 zJ?stIb?hn337{;AJF6nMZ$6lTE{1;>`i%M~;5;y{n0tur`rg%SJcjrJyCeR0kcrv9 zkuPG6a1Z`HkYXSLy(H#dT5uJZ(-IGG7vDSB3w{Tjql&rC=$-rn@ci9(0ujUPE&4g! z4?x>F8hHCuxJS=z1;)~m|8Mf;&ep|G#FaLN??)Le?(7cvp6Q2V1@E3*e*&y&LG7)r zL=4aL#_rJX*XTq{IfuQV)_v|{_vaHm)juoe-2t9K?K`l;XNb?%`LZ>@y*o>T-S5BX zo8o{1e)So=KNz`LK! z+%qF~AFh8NzikiTT>tRD)O0Tgz&&3j&oy@N?M`&Wy7wpv>vTJ%O$bjf4Q4@pTQ&W3CQGY)}J%>US9wK ztRvSkZ-rms7hncXz$q949j)XtwvO@Coafp(#{Z5|-MJlO%{i`l4|wN%md0yyu)sU# z3t%nH_3twF>^!dxK1Y$x{(d%&m=B+T{_?Hy+@IlnZkp@w6A!@euj_ig?n_hmdEEvP zvzuB`cre9nD2Y+ngcnSxvuBgX!7o10m>Z4 zuIoIXcj?hY_yFdZ?;S8lG*drCyI8rCTF0L^hrl^&IPEcUA7jlWv31J6(T>TSdh5hEzvT>!w|i>ZBjz;C9()$<*;(f^#t%VHoIoZgjJM9U!}icTqYk}UCcb`a z?A?1<&T=x>z5N{i2rP)-!}rW-7Q~+Q3Rr)8UH9$pjGuyzTj49V$@yp9XR!0fM6U|Bdg>s;eJ5-8YDF5%VpxyEAbVy-vXbzYiMejaWFQ& z!>jp>HFeLuaWmopZSI^XDP{g0c)4OR{$60cL~Ne(7R~_!W9#{iw!ZUrh~)$Lp8X6Y zV$FBR{IUaW0>-Jr-h^lE{;el&Grk9U@@DYH z-vZB3Gba-t0r&X2Vu(>I^T_x4sJUO`eSDCk?Nx3A@BV$(U8syTJdfuf#rT|jS2~ax z2e?c80dT+8wa=l(uJ;7ZHSKR8-}oC~j{WyF$9;=dyQ}s6U2G2|v>wj-?*BgAW3UT0 zRcq(wTJG2L)Mqd-S6f!?5I?WHx@+5ij&Y7P6LE*{K?uiKALG9FZ^40Wb4}le6JRgf z=AHQ)u=f;itL{PFXKi2IIl6m@32%ST$!}{7XluBP-+})Zm;-BT?#18zR`^T!FMu_h z84qxMjB~6T#F}TcZLZ}SKBqqd_w{oy1es_r!2$5S%W&?`eCw*uLBJ271DUb9+6G)9 zHn&G}jf{WG7`Ho7`XD#pH23VYzRbMu>)bLQPOT621ph5q0>2l#RVzAi=~a#RVfCf> z)*nlBzZvFDt*!qEtvv(v6yr1S+vr{H8S7Vde#s@i54XXqAK?QpG}k-@Yv6s~$Nw)r z;hpcc`kG0=p{t8V~56}Vk>G@dS^VV{_sc+q2 z`~WS$3UrJ`>A@IVkmsI#kG6ZW_6&a8BF1;_L-btdO>F}M8S|%Ry=+ZjZ$bW<5&w=k zeh=s7uwI61J?pPl{ZII1&5=*!Sz89;eM^qtp=pg)Oa6UeJ=z8)w}S&06%~g#6zOD0k>gd^=Eo0sfo4gLWTy zA0o!A1+nL$FBaonKVWQcPl5NqJ=?bka_++YSg~ny#|q^g@;=I&JKe7-x6wNIX1`(V z8rqUM*1ZFciTA-3;v>9uPVw?Pa32D5Z-CZYhqkWzOT2p(8?X!9hxecl78983`z^6X zjyHclXf-qW)^MKd*;CVwiG2rpZ~{Ebff~(>y%WxRP3{V0IQtAe@GM=U*--O}4mo4& zv-5e_gKJMM#kjU>Sbt!AX2by(Xft5!`~$r_dI#_RruGcZ_t&+}nXZ``-$(P@FM!3? zT-W$3{NOy$iHYr^zeHaFwG09@OT^AU00X(D*Scr>@IE{Q_WT(C3doCrx&Gex0SIEb z6?q$A?6b4)Q+y||#=D;TS;PBWXCTLTZqBnOzoBy=uPrM7YdCAFmEV7&$YuZT;iVez zF1X&*QjBN)3EBZU{+`*vHFItE>e{V`X$?8gb4iYO#POL97lL}?HSr;Eog*;7P0gHN z-WtEZp21n2n&j9!z6Y#fzUaZa)?1+2Z-P5BV%Ju?1KtBy!FGLnJ%JauK``&kh)>aH z@b{|z9B;0*+`DTGsrreWgk~3x^8l(vl!Q1GB=3rb-JGc z?g{z+|3wSeW<2fB*mp#Ii7z?iCGs@&Ax1v%Uy|dyGPNFF%`>ph;g)W$yx-ctfth_w z%rjE=uJpm0j5EHO`nza>U*X;B)SkkbvkR=_eTW!)@A2L@^`GI@t>tqFw65j_+%Cv+ z*!CGk6#DHysPTK|IJeu@(Okzp`^*N$=Cry&yn$1@0}}B8u+NsmjAG_yFhlF`%^aUF z*BW!;0c{Vz28r17aQ*jzKHwT!jlSlnFMxA8^4>Cdd-EITT2qS{dvgz-uXP@Pwg-Jr zj(i97kBld_s{9FSO7mfXxG3IaJ{KTjC*?t zpUHK+ZQh~Vpr6(!ZvZ{GjJ7~)=DrUZTXPO(YBAPc5ih|Syo+YvGtgIkz^58_c%Mn& zJG`1O|8wBnV7x(_o_U6QjV5kZpWvDW@d0yuZsvGC2~M+4pdEt?@K1rgI_{&Slz*3X zo;4EODc*fr=L6vU>-dac0CPLglPl*voq=Gy2k+e0KbhtC%a7oe;0Cw~{JY|uIp*o@ zt(ni=-zUsVNS6aV{3j0{|E#~@YYKe?rjZx zej?CU_;<+7#KrKQTaS0`1(@0~gS+j<}g;eFB{KE#A5IzXln|UxHfzd-LqR2KHj@E?T8=pDVbFXc^ubC1;XnJ^M)L zYS#Gxbc{9U+s7&1^Vtwvr%Ip2Vo@J-)?Ge5=Hzr9b*wNIP}UV@C?$D51|Tsc4Z zUGOK6Cwe0GoYjU2-zsFd_t0k4aW7(O^7inU9PiRq@Rr5+&9Fz$<@0Twk3FQj!)rkGX5Ss13oj&_jZ@qJ({C;uDN%C^$x&8V*5)mVu$fn z;Mkn|#NLrl!9}nS7ie!8oIMMB{E5Z*j{OGRI*FV$n1ejYPvqIZd0zlE-_2#qLANLO z=6BUS{}b5XwgsGPc?JXXrsg?hxb|&pT9B(|O}}-nYhE$@g7FHz!+Q?)_|P%h9sFHj zf5CW;_nY8;Jo6X8{d8zY#Ogm;AMF~N>zg+<_h=2@?QP9G=Lnzkwz-blE{GVv-KVZk zd}fT@Uxr&+13$GrxWC>Se{Y%cElz4+h{n9_AE0?2_Tm}4|MM(I*Zp7qUhxa_$?^I1 zaP6!T@c=sb88G+%fIP`TJ+qx#QU!axjgHy$?4#m-tLS!YvxVQ!nLetelz!3#xdUc1IN|+nr}|TcwSA@duQCQ zTC;)NQWGK*FF`YVbba}$mA#{Rp2ri-=i{BVr!|x%wGg$VGi$8F#?C_GSORlN;imoF3od z?JMDzc-QwG@(vpx)f_U54KeQjE3`-8B5-Zjb$ntzW~~%sPw&8I#?E;NnmOk-W7qLK z=8R{~vmSHhzXzVf!1&CFJ#TC2&A(9dTxSgy!1LG#*3^842f+Lk;~byCuR*GL0k7^H z_u~8PIXiCwRu%T%*IY^$bL_pbmw|YwbBvEC`PT2@?9HExp3fRR!F3?OlCd_!e}w)C z*aK>B8DrOL_aZTFwhM31JzS6XjMW2d82kVC-0x3&J{`Qe@VRDu556Qm0oHp4=FIKj zwH5Ip@EomYPP40%Sk7GgxCFnf`7KxPxpbAcR)lP|7|&C_Xw>nnMa#41SHLsNL z&E?3kkD|w$j3B;@_5nCT-v{2AGeh5F{Mh-#<^;Z3B9`xfJ@^i}US?eGocq&aJo6=* z^>3560v&Ne>%oFp7~9hipqvkB+6K+N=Aaz$0H)^i_#Ak5eGd|T4qA<1o;AHwdhcfk z*Ua8#K>w=dJj9>n#Q5Iah5H$B4;{I!{=&I%cR(igEG~ei>s|Ll5Y);Qp7|PFfj3U@ z19*?I`TowN_7ctgS=%#QfkTjL9rtYy@&jC}Yi#`)*nk9@Ik&$x{v1);wv28M;sAZ= zeD=}yWWKTY=LzV@AAotn{rjAaHMI`38VB$nqyHKB&i9PnoB1s#lka`--z4ScXki^K z;23x4XPi8?fd4JL^E~rn=EitN&hzKa-@p^#H}PK}p%<`LF~)Ov>um6C{b0U%J+PKJ z1K!>8qx(!YXs6~?STBR$qn*I{3_4Ch5G=QV}8>Etz$exlfQ|d+7RP2c?j?CNzPl4*Ua$_ymepV*J#Gm za|>$tEUfQc@@I!@77P9a)(JSzRf`zMOUBQ@9@+qBULxKHnXzksTlJ2yoa=j5=E}KN zi3zf5I7S^fpAnjUZJX5y!4flnZllfVq9 z$?HWA=J1|H2OL{p?e(p(XUE%i15N!h&=$<~S*9q%@$U)5o}YO>|EaZ_o{75Hwol=D z;CJYhys2&KJl|1!?_+!(Gh%D|^Wrhs11E5S-b_8}oV)0*ZSDfjXKsx!pZHzy3fuwq z`ULMjdvJyLORymx$Zu=AjyZly5Ae+*-i#Bm=dN$IX8aX%?A>Q^s6IJ+;~~bn-E1f#`CTgS4eMsczhmrr8(^IT*MXTjSXDeD&u`IC^}zeAI>!@}_e@MSzjXR9P$!zv5EJ2%t6S3R-aMX=Lz$kqWkT# zmuwE`K%;xvEP+=-Pr za6ZphzcIY>N-2-PRyJE%{yri zLyThJr?vj-Jh&d{1N{8f+iUuM59-xYjQN4j!20Fqd)0NWQF=h%zctovvb=K#;9TQQ zRI_jQ)y!|bx#t?ZH4e!yYcjT$akE9!;AX^gYsa|m5wZJAjDKQq_VNjOb`HMB2Yj=E z*tLA0yr%)Yn{ADj*L+XDYkEhmRgC`kTU;sgR&X=&e5d`^Pxs-P=D2PEbFER{74p45 z19}EiGw(Ip6%b7$e`qnu^1|A$ZvFJ%$6VWUw66l()aJ}N)5x2fJF$WBm*kw{vxtdU z!vyyd&9gku${f~TQm2cbW|Vghy_~B#TNc!{uM;r6D=qdJc}6L!j_=??kGZZtchrw7 zzp)l$?SS}m^rv9A>aJ(p)-Z3y_&oEw>c1m*asK)I51P8`=o5KUa~*&8SNjBS9oOyg z##)N18KY^%GuQ9mhrqEvGaiDbM~u(SyJr8c@t3NPS>vCHynFEf0*Soy?1>tA-Bf2R zS9qkmKAEFl{{QQ5ac$lW^40ae3!;nh_pAYL&9ZM|`!siev)3IkJrl?3 z3-q4+(g$8{ZQU)47~g&GS|+wutLNQvo78YWr}WmAYEnOHC<1*ZzZU z&UxmVz9$QOMEyGq@j%=I*Pfc+ga=?%^VO_>6ZCP;`sAq#^=9_z*!z&cMf5q|JL}I3 z(Gz!KV(!=X$=}~Iam1Uy15eV%5Z&+4m!KzaYOeJf-oEVREuei zs=mPYG2Q{se+_P;FY(@O-^&g?fevnJ{_deRwNrAe|32u^P8er=Gqrti1fSslMEnq# zx50a+0k7#lgDdO8zaqANv(MF{jmG_c3bzN`i+j96yl{?r`0I>aV-1$Te!Oo9UGKbR z&a+;R7QkH5Y+*df&oS=Jb%WUYo}oT5?tsrk(`R_=9jP;pKoHfeR~&)__JI4JIVM+ckIp#&oh_w6{l@w&a1Hkscx(9l5Aptdcmz_N_eWyuEzx?or^KIw zi$Jr^F0pmohwGezh$4@F5X)P`wawo)@66BOUjgr6W==8q#5mytZbf`RY_Cmk->5Q& zoDR*tJi~2su6f>yaa;`F@&nzR9&S!vCT`{)H^4hEwTSUs zYyR|qPo3s;LOT?c2+gQ=e}wtvrVAh%f%yZ8S9WBam>xihc;-=aD<5cHbZ(#hsxp+;k?O)D*2l9is2N^8kz674l1K|C0uRYokx%Y_u7Q7~Y zRDG)RKVf_Ybc{3DC&%@DCc$_B2`m|Rc=?~-8fypRW5%v0)GpQ7H3Plu6W*E|;P=rU z+*6=mCcXhYJLhKLdlZZV{WkH2xFgm)EBCYqj9vF5FvOUzcP-z0wH;ud=W&1^>YTfb z=T#55j(G|AUGVQ;p2H0I4jMNz$373?tn0bo1kIcij1%y=^yJUsR$w5$3TM3q*ahYr zTdM;Be8zLf)y|$jWAnd4cTU7OcKu9jp67Xl_Io*e0`6x(Z`Q+k=9+Z|;Iq@LaX>t) zW4RpT&wx3c`~DYmdpHq5J}T7Qm*?v7I5zZ>-v1H(d-JbcUJR!UJ>7$=tGS4{W-m% zzWq;4&h_`ebzmRCoT)iZ;4+$bfX?h`NZeT;e5@Y}Hqw*iiOe6vj6CAiPPS0ET``UK2%j#vYq?YhlJZ#5sl zujKI^e6uHvZ_A;Xdu2-Tdp8cjocT+py=$j%&i9$v zquPepT;lit7u<}T(kJ=mO>=xl zTzd(A0cPe*Y{l4f^-k}COCZN2fiRJ?1HWy*f_o2K1?{}2IlqPf1lZ3WHBN~K*LO`g z5q0c$sE-lqr@)#k;Ir5VQ*$5QMSsV#=U}eSr^h?ryM4g;44|f#VUGF={vB{swWgPK$aP)^7U&)0sojQGckk}OvrH`q zZ$IwYd;V9jYYlJ!yjwv|#;?Ho$Hy{2F*3Ujf%i zL9);o{{!B6cY*KUnZ?+{njG(%n&)f1|7HpO8qk8gpA&mu?8BZsmu5q}`ES9kc^&QP zL@#;dXnlTO?`KvAu6LEO-!}Ida0~p@HjF<*_iVh&KErl)(>&*SCq4f@ zrpma+P52{nre|-~MR@-=?|u9X{T{vxmC+KMzk^-?p1-*%n)=4u(*b&*Wne!Y-m@Lx zJy+`o+y?KyJ7Uf6T6rc>f2U;JJHJ|rabAyieZQ&J>KIRLug-aZ?sGE7{>9WDqFJYp zDf=c?^Y5S?dIke%HiP#bl$z9a%~h=*}3n+@bl?HQVPJHco06>+BC9LO#3 z1HJ>^9rx4|yXM*))@T;+88kE3+MY*(ckJ`;1mnQl+e*FGG5-UgHV5)e^I6W(2K+_* zYcRD;&1Oq-PSAe@)^Y6)m}BfW%)MR#Q*-@mU`;EmZEt5P+&(x4?r~~4C*tA7ah5ydH zH|iqTwi()U_$3(P&3yBmvqnG9Ue}sk)y?yc+L&Z?~md1L5}MUK(o#}#O|?~&+Y4~%lY0}SNr{hcRU0&(5!PA?GM2H zzJz-ZU!E^H+Kh3E@$UnfIFqvh8LnARynx#U<{BS>AlCfdb%+v(L$ax5w9^_f`OE}NrJhX@wr>udl8JyE$fr$z4Cd_ zLC0M0T~~96MuSh_2>b%Q&26&&1^fXhYt;N9#T*fobf4R-<1boccOVG{tUhce%C#N!-<|^ zJi8ruYv040>z<~zVf-$<^X<83UNiHT=!L7ieFw37x2EUk8UtJgJ^9Xi3bbJC86JY0 z!0})3cYt;o|2tr<9OLtMuQT#Kt6WLsk3g3fJ}Y~h+6m(?nB#f81Eyzep5sK0{rw7@ zXG4s-eNHXld*B`(ga2krH2=GIa}(G$dscr!p67j@t;pH_-J|7Y<~TnBMr@fsJJlC; zoh`XMr>|;`dFPquv>~V4Isdt@%Oh=)|mFE*3Ld^ABkM^%^UFk998Rxx6S9PZr*t|UEl9a%e8jv zLvIgi*4wtf)_MOAdYjX7QjGJ~{ig2Vz3W3Xb$s5=xeXG0sDTVz zr@u8m6YHqmVSF7NqTR>)T$`EW8Tie1Zt0Ub{%m+3gkapv_zK*6!0%nuTHe{aKy3-v zlQ*>i&hPgh!Bf!18`Ztfz}$J@6g0EGeQ%pw1T22gPb|TC@26`_qzPq}IAb5AkC zXSoF1w#yps)APB1j_&#o;d|?F##58?_s;>pZEEeDyc^c`JKMoG^GpuFB{bLZ?{wQH z|GMf|@Y{A3?wA@YQ0mu&KE{1H-)E8;+y8VAu6qbFy1&yO;iu-A&7BMWm)QSpaB6*w zbzQskwxyR`a?Xs{Ii&~Y?2zx-YlVvvmOt$IJ9OWV1RrXk^{>8*b`MPL5o7x?*JpcX zjC;o3ZM6ZIw*bZgTI~)~`|{Sfeh_b)>;D7&7^E20i^P8dgJa-x(GKt@@cwRkI;rJ) zbH;wZ-KTj|>tp2AJ_U*K)EwJ`&q;fxuW=#x!!=H*YmIHK<-DxA??;Ztj$X|({To;l z$3!>IaQ5vwJ>w*ZJG|z6^W@7p;wx1#{?GJ`19-;r_T-$$pq)Fj%DsB+8szqMZpL3DFM*EuEn}?iH)`Fq7}xFK zj^KR1ngyEtUEnwG0L;i~`)%iBzR%Jg1HFK`JB)t=&J1pa?%LM;4E$oMn@G+laQ+VD z+QE2go`wBq_#}8%3&u}@vHCvo5^o>+X2-+=5MUBl<6A$0~yYH zttNteYo7x1eg)(*u$LqF-{Q?_=hdUx!=K?-_*SQbch9c*bKv}d>%bv-8^+hcyI>7^ zcxw)L&%*UDgT#2&)+6>T5;y?zuDL^=J($~p4CGv+hd%<=TjRAQ{wm`XW3G9b*!2T% zEqfm-*Wve^3o^0w?9sI~IrRko0-u0fvmg$%(kEK)JUO5j)|>d`zye^1%K z+oS$V#tXbQ!+*>82Jm;F_rb1OsE)r&b&Q|FoA*0#z&N7F<&R99z0JOF@Yr6i_ z2F88B-~(TBYeHh|-#g^bvnRL4_n=45z#5$%ix~Gm;N6qw_ELSz0?wZ9p(hYANg#Ip z1$rXRp!KJJPW}%d;5E4v<9NVdL)$R-EBp(Ph&%XV)o1(xyz2;iDF&~}`40Mj@BO-I zqg3{LjCKjQckkQWoEUq_)gQwB(;UXH2egnDZS=64? z%K62cEYG%M+|JdwZ)5xg)(!l5mYJ)bs&3xhTjM#H-_BBAbRbOtQ})!ut*NCJAcNMY z^}DJOotd@$+43hawP5U7>HRsNdA_G$$(-}-T{PG6`EA=A?SrbnrIG8m*z?~2zn>lG zWBlfL_sYG1*84NtdruE6KS2l#W>g+I>{yz3`w zink0cQ&W9b^R{)*R=i*Hnx5j#xdibYbo(mCxCdp7_qlcWH9p}3WKj0O9QB^Dee9ci zjxBGEXI7qbkN^T$BjcZ<%V}-haWwuJ)HUCnGyzO8wSV7w^YgmWXU=uM1IO-xHOm@j zYW=x}=JT^wC$QF^W1rn?YKUNb)+e#LJ^IYmy&D5uR>SnS;d~E#cNQSQ$$PFd@GaU4 z;LoI~xsGRS-5-HxX)iBD=-{=8@j2P2ck_Un$Drxv6bmSL_t~pY zEyleL@cvHVc?aCo-1iB(>${F;I5l-^ySDpVfE431T$A4sH|vR0)xF~x3~(LZH7=2V z2;@D_-hAq3{0h!Jz6XDb_xp2%pPISN)V?F<0CdsVvHw8x**!+ff;fQ={4Znqelo|p zj+a#*@O$P@au}7p43#tY`K{U`+yP^MKUMd>xQ?)oW@@X6Hr-Fl`49RFQ2K48KE_(E zqeYBoR|fo%8M~g(%HD1h%QfqXo9-F^3jV^+G(d=WiHGF~_@IE8+-v`j*& zOthBM=K6lDU3<&Q9QY;p$^014t!M5XaGnjdZ_mvAZkzXJ4))Oewz*C_gK6$dc>B9g z&I=GRRo}#y(f)_ugQnlcrk*fA0oSu$rbanuWAGaOHVAXT)XcT6D9>ps5?i+;$G?Z0 z<9Q^;a^)^ep67=($9~lNis$eH+zi-%z&G14wyymR6JEV%tmfHyMx}SW{1JYaIleQq z%Du+>j;PyPISaU(aP4kqv;bN;qZsFWLC#}v0VFuJ9`F5e+zD#=?X#B+@Ju$~lsKzn zrRErpKmXC~?*a3Ttm%v`sdt%q0 zo{MvqaGwC5OC~RYW&^tC>^fote3okvUgD@6t8=2`hO>|em= zb)pW}%=jAo0Nl4Z%_7JpzsC>2wO5SW`NmC8 z>EXUZe+t}32N$3t_WopIYtFy{+;4%sUBF)g#mG^2kFMv>ZTHvqo6zNjcR0vvre?kS z@ScI=%y`1Oc+bOk@RWEC26X59ysyIV<5wV8-{Uuq$!q;m zt(?94cTSJyzbiOz+nm$%-E(yFU4I5zeb3JIyQmy~YMzDr$?=AD{eCijql{;zzFAnz#$2x6M8I{_KIazm~CKu6>DZ>*I~K zu4}xNgZ>9zKI_UGApe%_U% zGBpzLJYSIe4G6}Xy~t0^nq7>~;)K|Db9)cwTf;SHK3{y#cmSE$`PwgUjq?j1<2T9t zb}mbDt zsm}F%nG**{P++$>=A7RuA_ekdbnmmY)|gv2$-AU+P$1H_Gje}z`akkR>L_zqKh^0 z9B8Emv3=S574RY0RSz@9{XBzP!tH^!?x>E>%DTQ!uH*e2qN$^Iy|%vIKDX@vu6!f$ z5u@7U{pR?57xHzUy&M7W*!RG`2j_r&V%O-+mD7TAVeCA$Iha~P_ing{AfB4Nn|~F| zh^_m&`hi@}%JZ|fxd~iie1LD}+-snN^PY6kl+kC#);t96^&KELHTg%tHLUG@687{2 z-fzN&cwk-zJ+bF(FaHJ$Fu-qWY#qma&Chtpd+-^^FRFK)d~1A1%+Yf2M}_|#mROVX zAxQEQdkFVy;NOAF^NyTZj8Wj-{~Gu_?bkIu+atID9Xa--_gVQn_kC~yENhPSGrATr zo=+L@#|Px8yT|iviQb_NG0t^<20jnp@kA^)@i{>+GmyDjqCI=^6tO&UUYcJ@4{Pu#a!!%so8f~gWL@{-q)$Qw=yT* zuuC}KFLOP=)0RVu&+7{`&mxGmb{@{V5AV6&07De{?2k3N&+iaiNB8XVBDZR0$j=Tguh8yr|=4a;G*K2$a&WxO{=J8)->PGrmSTjlJsp6SZw;TppPA!x zGuPfabAaOvJQsi7WiY@mz}y_{Hr#t4VthufpNKWNg!ygjH|-vnO+@88s1SKa+*=4j4;4(FY_jqhVz+h^B$G|#mLG;M)q z9eZl#{Z5RR!274ZCbouoavAS>r@-~pF2V1EBgS2fn)&uVldBeiOrFozd$9%?&KzsZ z@dNNa{~8=tz3nTJ+kss)ze#Ox^6tm=jK3%DiM6vF`s`wS&VK)`Z;b)20~wh6+Ihel zPe6iq?C&)8Yt9^RZylPPYn$)f0q%%6<2Cb34?()~(0&Vy3tzIvGqZ+B@UK@eCY+ z6_9g0wK;Q6)aYeEFE#9|TEtj?M&1g10OXpLy)fRV#=p@9;-cf1a2t?`=Xk%Fd-$Sv zqxoH#1MBp4j=E#}_e_rQ9oQibuy%}@*O1{{-!n2-vxd4pGcjSBc6R;$w7`$2rvs(K(`kdJJ%=J37Gh^&~W)H%>oM#KPW;w)kp8 zM-oE;J=lK-+8VpWo3zf;m6nKL!VNzH7;C9FyBD5zpWPe^PVoLz6$V7=Nx=qbEK>yGz^=YxeA! zKL+=KdBVJ=55$+?5h9Yfrx}iiZ&O`v4zv_+zHR1b z#@CqZ^O)Kp<9qNK{|J8vxL4;S=D3ExdpPe~`~lu|hN=bJnz7GmE{Hp{4)1ywfopg+ z_UgEuHCg3%ChPilkW+HL#@_|aobv)a1W$pv9Y|4s7BMG)b?vo-?}0gc-~qS__R+53 z?aSYRo`5^xHgMk`0X5&T55Z+%J@FDO7~7xgUjki>dr~vD2eAY_W9z!ks`3fnferW! z-rqys2lgaqzpiCZ*MN868Sst_)a$?u{aePaFXz~r&2o(M3g1Y4!1v_2&VA*Y{_w=QsndV?P;mr`c7;asymnq2`^xA&>9i6POe0wX?IV+-Kyz3x+82*&pWblJg0gXSQd(i5)O5 zXApc8N_pm%KT5ApVCZTB*OKE^f5^Jd&J7S`PWbItkvt?`*S?>4bDXXax$ z#&caV_ME>5=lzW8$y=gb2T|ubzZjgqC;H4&z*O)09btOdBzFOy!Y|D z_+c{N-&K4T`|um^9GiKk}I3%DIL*V+J|Q&3AAVm!-)cm4tR9q?InaL#Y$_uHRe z)(Nz!^>BHMQ%`W7#Xo>^%RZ$akJt66YWT1n7aBv7EJ^-WqwB zV)mzQo;4DFYVOlLuHfDGww=OzWT#lGsShjK)V23 z&pNK3@F~W#9`GI5fj6hwoOl3BU{4=!>E`*oJTvd`Z@{!Sb^Ei9d7g#mH_cI3%YhEm zW?%&l!2#%iy6`!9zn+2&Z@&9}&N$FTYM$Dj$IsDxC*Cr0dNgayG+eyL7afvD>VBkI^3Fg1FUx+t(iHkR^y6~@s6q;nonNqS?|wB zHBr`>OdiPfxm*Ei=4UwfVf+%`!CP}5+$PWdrY7$@Vtw-?Pz7d<@yb6NQrzJo7@569=&5aavcdtUlx?EQaT^X2>|1pEMeKYfQDQuDSN;xS4Yw!13w0#{i_FXstK9d1$$1(99aE|DSoAu;~Q#gM&H~|}C&t{n9b>y^l60zs+ zzMHLxz5jQB>uGbmJ!wn4YrE$@3RTWy#<*D`XTf-lw|<+OgABMHZx4ZAqQ3%v1cUmP z$+^~R5X4inhWZsW&+7u{7*EZ43)a;98RRo+=3dlqgS#L{Q^q*p2Dsgt=Q$+CEBp~~ zf0{Wxv3d64^WP^ncTF64ttb8jbTM)}#D53V=aJAfzial^w2>Xh_NsORY+JDIKjFV> zTD-|9&jdch^}y#66FoEb{;K(2?Su2|#5}YCzisyGo_$Zd81JAxof%xmcwX@?d8eTC z0_XhgJ+I)G=%ad3AeM>+l0(&pfK$!+!@(;WYWC zId(sP2HK3A)~D;GI!Dc3T<6SUj1qpu{2ywKGrb1wJlY<&^~}8Y>fD6)9?d7~cuw}x z!Fz{?7%SMPc~9Z|JFm~PV=NcufPLcU@K1o>!Zmn7e1umQE8+mw>lyE$J1#oT+G0T4 zt$EOAcE9S*Gq2Q(QEokMs;2IDWo~^e$GFx3<4@u3ORa|&n%rfy8U7vo9pD=6Ikmpk zt?#oOqD+13k4y010rNWa088Ql@7elptr@$%xsO1oRWp7HcOAI?z&HucE#o`5FVT*H z`nE-kXInJ%#MtwkgG@XCYuKOT06kDwll$Nn^MLokvH2a|IEZIx>bt=Ekl_blp0Ver zx8@22aSx1paER_baV!#AF}(Hs{`!qD_buHda{P`BX!r0B&4W8&d-WtKYZ9A^oC+Oz%TRGPM3)lf)g85{P`;4D~8Qc=Mw-r9NYS^p2xt6s$AZMQb z%ouw=tz*vndge4U*Y$IZ--a9Li;4c@R{nIJ-zasFn4f`r%C+9cI&gR4ZdSaiKEW5m zyS{r}qxrl}iFcQ>MhXMfDl-TNV$YnOGZn#jEZ=eTEu!|$*fYqC4~U&J5bxog=Y23<;a&eXphNG$W#aFFzb}6U z5_waz-U95PeGbg^Jg4S*C%`+e?pn?4>uWgguJ7Y(G;7L>7jVuIo>RogJKxw`>utcX z^T@dfI^rc5$mxOpxA4CJjswimkHB*{*V3%xyk;MxJyegzjDBF8$+NFK(X4X{Zx22< zdvmNsjO%zFuA#p|j(S-i-PpWl*U-xt&RPRwpNYNCYHmX7h&{(gz}f+>5__hZcm)oC z?^N4st~Fnh)7B4bP0aPY%XiEHo?i+QsMF!C@AxU+T<^(iv>p5duqJNnc8p(u6>wj^ zTMKmOS;yW6(E4MA@_f|2ABlA|>lF^~{2Xu2$oM+B>fXmd4>)V;pTMc@g1f+VGdb_# zuYy$b*Lcl&p8LMzkQslTS|bGm;QRWr&dYMdr$D_2))Llsp7olwzMOvq9-`j>iFuvC zzGD0jAaB3UAL7luKCm8ejUL|kK6$=#=4qMu6qK`#de(TYC%4tM#|5yT*T6gMdHVD0 zJ76De9iNw)7FDyq8T>IAVqDKPZ^D=70T{caOSJqQzqVkCGZ&^f-tvPjJfjjs-3ORzMLn@xz;(> z&Y(S8^{IJAN41vyxnAI1!@WD6+6nvv_#eP`;4KT@2RMH}P~VW-2`%32Er`V~+5wmW z*ET)Q4l)gR%fW}lf{=bcbv z2PDQq(_6=N2CyV{PO+-_o%|Bq12gmtZ_a=Z(1XP-?i8@kLu;5LPwe~nYj6iNbAF(E zCjYMJ8RzNxBs>2-bkE26S3pnRd3F_TI7hn+?;7_(K1cUHsCVGJ-;w9^@NvyCZ(zLI z>eGJgvz_v3EnXy)Q<_4Hro7ej6VycdD&m47oJaT>Oke38&d3QSE_KX<)#LRbX z&$ab8P5S26n{TVS^@@?dLHh%^3=(_*z3+t2_fMeoP$sb zKtTlx6gXH21qu{Y;6Qa}WnJY>Y9@ zV1{Ne2QipoV~lAAGc?0+5C?O(&-4E2-d%3r#rgGG@A|E^-u3?3yQUSp($nUf!=NfzSS&&ssi9jyvo*`WE96TQSBSR+T?$ zHr$WIdEVyi$_AfjY>Y@X-+D?!R#~^0E5w=CB*!xD@q6DhS9v+}w(?QX^0J1LcaP)) zbmro-&JXA&@~+>#Z@rHAnmE^Mc<;YG?tx%D0;P}h^AC(y#P~d&3cdhKe9z&WXIJ*| zeE~eLyw*v8J$PT7{|T63+mHJy*9XBsTdg>keGY*i?Ktyrf$#g<<@q1w!8sxJZTJ;> zAN)J^G-f3JQ+xxQ;yBkwE6(HIJAckYd#_H=)^u;2-+hnBDW^XY;|-krh;5C}u-~Bb zTB-ev@khYEe4afM`%J_u>Mi5X@tf;A^H;!m1Fl1V$k;k^>L$+dnDGm6M4anbgA`}; z+naUm-+2b0wEiB#`Hr!UYw^tGoOcFZ1N&Y8YyH0R5oi7N#H=cBUK3;HjE}(#euK8w zeV~7U@4z>Vt?Ql9b`4$SLS6kIRlSm*h;`qFvtReeUh^7i%ss{@aPHq0xF-3C@{V`T zIk2~D!1;4Ny!&SToA`~p1rmPG(D?$}*i_>-@b(a3flqN=O0J3TGUE~LeD1$J$%%;4 ztNamg&Lvur%X6Xie+;a(EAQcx_d86hJB`uTQS$-3d$ptm@#?L@ZYPFOU>^a;B-ZF;qRD2fPQ)>>`Ptm(`8t+`rVNVff z73Pes{f>I#cMsN}!}kVl%oaTdJ-!)wq0N4cXwTleYh2HGD$Z$t9|7;zRNOCXPGyD9 zcY^zGUtN?roy+yQcb|ek0_XM_>WK+p-k(9j=e)+x(e`=>oUg^Zt|JiSO=Tp;^B>@} zr?SF#fX_2=9`|&Pua6S-s^-|EHLiiNaz^Yic7FSL54)dm^1)b)U`@;n{6z50Zyc+{XIC9|)ZDTIWUO?KdOJvn(eP<8#7T|7+kL>`JdM_&+d$ z1Qcuk>+Q0>H8H}oipX^4t!vB-&U=3h%xm&{#>Tk+3()pjzSZ|UF2P0M1PK`DeBL8# zPo;++@om6(yL_%BZ1b{U57>_7h5OerR_-u<2A<=y#sNr-BWmy1Pe5X071uRHdB?e~gGpSE-}S8UZNM7a+P)J4PHY+H{gR{BksP+?Z`>jH2JAD= zg0>fXcnOw_%@bXeb@phV5o6rjg)#U#kiZN4BfdEZ#;5s&Bz$kc`^0<-a?ivVH>)|u z_#XHJ&@Xymy&kN9y*&UO{wC(NbsS;K_wZYDu+2Y>$M0D@2llgvo&opeL-aK;V9)iV zN8;5z_zvF{(4>b8pqSsq83t_k*_<%neXNqA%#rYaP-DE;UxH1I4Pts=?o<5M5#6NL z0B^i&|3XfQ@}9TP2jCV6e8L{Quh#MWtu^9TC-iH4p3MNZ_yV6f1A3@=ud2VpH^*K( z2FE}#-rS|*D0p(aet%$W?2>U``2)25IF?(1ld2bJ&uD~qUf0y$?plfj`%(a}A7L zw>9My*W~ly94|l*&Pf!%ylYdB_{0F(I@G>DgL*g7hiLcd2&{p85HIGA(H$6Xmw#`- zb;w!2m#dNj!+7u*PTuiUA{gO&1lMEFu}8FXo?yEtO#*)>lqlaDughaA)^|^uM3g$M zfBAz6Z=9S+#5P$GBbr!8-g{=Rj;GQy-r~2u=d&v_{9gd~$+@O7$NxF7@61JcUahq& z@8au;^S)|NCE+(monpdZU&Ak_ehcItYs`xH-{A9Jd+t5{0iEYZH*tLdXTMK@yuPWt zsD3|hgV?Dg#@;ROf%=%-9$%A$?OpEh&%o(^)Bt-6@RAtkej5ZiP0U#WxxWL)QyGF0 zSmSSNnBJ9k56tO_+Yo1L6Zr$jQRa2uL_5zT>}R)25B50+Q`u*1Z*R~8HSB*ji8;Y; zJtTPdr_Gn^;JZRjphxg)?AMcgW52~`&olHm;mr5ko!>b(;A)MPbKYad9dJ!UlsQ~S zU}wR0e&1u(@%w%kh4N=$>%Rg13Lb)~^yGi94}1bvpzWP;cNsqbW0YD`PJT(g^*;b= z_irkX7<;d*FE7qXux@s$w6K2X%Y3!FEAb-afoe&r?H^qJ}4dVKEzKmX*~xvBdo``}zBaNfBNpS6#`fGzIf z7fK)SpaW0w-2&Q5t6fIy6WkNvKXdyAI7b(aEqV{Xz5Nz^3Oe}RIwQWjaM_RT`3~qA z`aArWDmR)7qUr_wOE^DU-v@KXD4@&?I1i z?>~X-_Z&y+oeK7xc{gASr}RhYf z#qYgYqf<~{Kl+IA5@-k7^XajjJE7C<`p;Cbn+)3Ek8rsMwBs!31gsi!1q z17L0E8zylEJGXw<;obkrIFNSY?7=g)jydBF?>H)Y_yim){&&!w!=Bpu3R6Byj&7H= zZPBkmi%C)H7^}~9TFbL?{hdIDIO}(d?^F19f%_0}7yUQft!IxfiTecPIf*r1@tHPH z-9_OO+P!%KbNgTL^;cS#sjwebNC+nRIo?j`~y&obB|J#*tc(&_p58rw?unJ zfvuci-zTPv@~j)DeJa=k&>z6~CGoF}yFlbm;PXA+iIMBz&5iPzGQ*zZdjg!p_slsV?jb(! zj`J)2PIHl@D9^ZSx=7qld)t*U$~)#`xN8^j^yRv8-y~nbwom)&$(@ROcu4#=aGvi5 z`yw%K4Sx*WgNwvkJ`=Cu6Y)*Vc^~B8pWy<|Sn-_k49?H82f&^e6iyOsNl<~h^8H(rAOO>JTBR8E+;kMa(ee?aV1 z!8is1(8B&b49(!j0bGz8_`M%eh7T}U59Hr#$JH$uxIETL!2>7 z;N44b1G>jAug~~|4#wu&m;L)J>r>CGpR9cMju?MKjPHPFU{(2nce$;||CT_-4TIRNPnRnwzu3t?>EIl^=IFYkUCbp1RHi-x~w8 z75i{J0^gZS5ZF_(rvaaRKY(AO?cF&O_!~Y&-!#`VmJ?UNbPt=I?|PK_9}+YDev|Nv zCasq9X9<3S*W@)Wu$wrC&qLz|Vwf;Pffh`+PFiXO6iM1;_AjgDm()FaX8awx$$6{fseYMXq~sA9$u6al6vv z8){Ee?gXFp-(0{s_YD65ywAs?#s;;fV$5~;KZ9>-+>}pIa<_GkHQMLQ@eF+pWFgKu z^?!|TA6VDBH&m|mI>+xGyT5V^^fB;Gb?7D$h4b8BgPyU^v(Jh-&Ua4W+kQVKM!Uz? z#OKR7M{okjJf8#SpW#d7tNujqmIcEU}-U`)M5ZJ_za$;2-eb#h(+`;=K=I>~|^=yE`f{0=R-b$AbSc8C3?`U0_M@8-GtTh}jVU!v_vALVWbzE3Lm0)0-1`KWTvJ1}-%=AhM?#&7U1 zKq9UOoj{D8-#&Xj97hx+w0TeA^FEt^j8W!tuLi+bSz&wE13m4*c;SBi8ooz64$y%C zn5*x~?ebZ79lZpefwjaI+dY}<4fKt~d)9~8ZEb;XhHoF=1{`2d04*nr={{TJ|iW)RbZ4!?aI0L6KY5w2$eQe^71?iQc?W6<{62z|~ol{sT^7fya{ zPMk$(dp2_R;GEXD&iFELP3~`xuSp`u&t`M>z{ptHulBU3!tfK$?=XovoE>Ew7(2In#HIc+gR&$((Tl16bg9@46_g^SfUwpl<}mE9$j2@Jx)Gig)P+ zSmMw56W%(`GvM>N@~-B2Yk`3O0-w+49_SfQ#d@jMm2;jC!BkEdiy4>`8^kH<0od2S z!WnZPC=sRZ4DJm$s=V`AV~__6>|WHnx5jqXb}b401KJw;dbx_H z_|1DCc;D?K$sxvj|J^TRc4dgN)(vqZw*5_|$9IK1d-RzzW-0^Yef*yR=Xnq8iZ!ia z+ei?wHSuYriNzF%P{MjaEDhvFc_dCSAM)#F>9yt+U3p@ws@Qma; z#!cEjMwEI9t?hoeCiluZOEBU$*LkhucbqwPlRnCS^VaWM^4?c{O`J>rAMx9hT!0Q} z_xgao=C}U<9q^vr2PfFOb8ql@&U3W;_!V*Pi{iZ38IO#Odj*z2zerL0!S@q^b1w$) zIS9t*1mFM3ywA`*`IpgCNm1T;hj42+$4&Z)oqZS04{?CsIh^0U5Ay80iJZ6!uioWX z}N!|Q!El6N0|Ad=^ zi)2IW49;HL9%jwh9s-7)f5AZ(#zXh#U2R8`fXJ8-B_lIj3 z@ptG{wdXv7EAR>3M85TO4NkkwZA{~P{Ox;T%T@1F>jhk(|Aua2Kd-?Je4epm>qgYG zL@VZd2JX4y{GM4Kd6<99%>}OEk2~B3-#vWJ<2~=loA%$qKg2)aSGJ6eZ4!ZnujL$L zd(Ya~IAiR84MyxKC!g?NCdajO@TbB!K*G0x_Z_d8Z{Oy;1Si-_Fb5IkoZV~ZbIrof zpBdWR0sS`PZ5``#9`nD#@4oMfz4>>T1k_&x>o`ZxoaT-|`Jl!)?--@eRpsOZ+jqh} zkl^>!mACdoaFHAlBk%bRbNkJKZY?b0g~faG!!1am{bPKKJIjM%U%L!aW&Ma4G)Y($##&5oK=mUgh*F&i6UKm!OX_9`JQ_?Apwk>qDF; zVxqCz*f|qpV{<>)uK5H67#NS>7ks{%qqMj#7=ZV0^Vtuk>w(Fl&%NlQU`x#hj2G6& zx2|*SqqUuL1MI)$80Y+V@O9XZd(dP{y!;BiE5_!%mB2o^U1A69bHaF4Ipf`rseDp7 zpVdTcCnh5AU7nc-Tt|*$nD1VVeT$ewFhrTdvr^2vi+{S#F(B~E_1Hca-ve`c(71qe zJfe*~0XK>38E0v_4x92GTd(^WUas*YF@2454&gKVInXbb_y%-TB*va&$G8Xbsd5|a zHFys1+0TLEeTgV{;2XFHU;+0%`T%_b1~3Ee!v+}RzPkT&;C??w-vWwz<1_dXIKqB{ zUdn}R>1l{;=Kd0#YqO3q0i3^MY@d#;qb>g(oH=9ljrfeWFU7t*yD%Q{oZWlH_5Rwp zDE2+sK^F!sLs`)m{UvWo)ev%enR z{(AiXtTqv+k~#P<;9O%H=YZfR2$1)hq0&eBXOY$$v6~Fo0XpU#;NIBJM2vUM#`Rz- zBYycyK;9ZjT_rJ&U;w;B#_pq)A<7+UwwxI8H*sC7>X%#A+{UY4;QtoPD!(>n5|`p^ zf3%wn*eAqo!3I1fKi|6=Fv8pO40wOP0)bC4&ij%g5A*$VtsUb9`UAKV$B55|b>x~H zGB$3&w?YRneq^i!IsWb8KDxFIU<*zeN zV8jk!za84~fc@F+@);fat61M&JtylL-^9Bje=vz(VOviL_>ElS(LRqodWib`R@;~p z;GS*KZ9i@?z6>q_^X4FtI|BQ8f#2LF5yXMOcMWbtyYAf><3tZ0!p}hydwc|XIAuu< z=XX6R%3bzc?tmtN-`}g(#OCv4yuo(wX4R)&fVYWr&$jxBGhRtiKD+&{C5(4J8lN>W zu1)@H@FmzVJ_7b*jxxsC-`jfZef-YbVgg?WhN^q?JGV>Sf!OAE9zVzW8tdHlA@4rP zyLXG~@2be($KT{#?5E(>PMmy-IxoC?+%Z<1$9;DWaYAm2;%|H6-G2{s_!~CFd0z*7 zel9s@=1_{cIX}>FZ-CF`MZM(&e)w!$19M{A+>KLz2~mLg-OA^6?gW^(E3FszQ{FxzcB9I>?FPNMpZ2gT=Jiqb*>jpo z!XNNH6F(;d{6+n>_(ZPvritAIYHVP8Ctf>7jPo9!-qk42yS;VT ziuUKkEYJ}pr|n@5;Ku{_qgu21)Cu1sxPJksIZS+dc5}yU8@x-k-xcUl%Q+{Eo1D z2XY=UBRTePWKNSf>)|>45)Akh`?J;xZH;sDS3bc9e3KK#Dca~voBJ``!9_gr12rDQ z&C$VlI+x=ue$Ov+jPso6Ea=wv8)~eGyGY!3`Q7I>&qdC>a@LxP_3pqO>5uch85eS( zgSY-M+WQ{Fo(i__Jim+0tuv7ozQ2QiRxWmUYYOZ4@zdYy{?K?rR>W+;eSF$Icn5oi z4stzXbrWrS7smbx?OLa@$Jlx!vA%cwXWaY5o)b9bk8tw|XO43ZXz@LK+egRmGwuX- z2FmkD{59Mkz&+r*NIr|Pj9;PWRr@S>W+S;hu;v}c);Dhi*7NLz`}vIVV-VQ6cGcEB z2A{*Nz#7|lYj`KV1lBrXoR~{Emp=D@4c-OT=__8N?d1h=i@#{Rd!wK!g&r(#dP1@_eg^~{(kQTch} z`_NFw*~>Uh#@^E=uKy)yzB#q_7&mcmnmAVnHwSmYKY;npKSb%({yXM-fxnSSzwD!Anw|JD`?}~BPGRIj&)My@1UJ0;5#7a z9yl7dCv$jwyjHFu4Qf&a~1t#lzH=*JkQnhoaPP080WfNtNHH9sW5gv_j-w6 zI1X|Y^&viMDz5t?nGxf&xJ6$i&iiMu2NpXq_VY1*?{l1SN@DC@2}sHySonajdw5o_cTP$xQX-3>UbaB zVoujo&pXG%FR1eYaPJ~om6CTdse8th_rG;#`Eyk{fhsci7&J7<2qgHzs` zSIPDMybBb4DN6h!eEu^q-(5@m_VwS`CupUQf^1WN1!q6Tb#QC+0Kz!_9g$CWBtAZ7qAXw*k&`AJGY) zoah(_Feah(d8X=t@l;%&`}G^JvhEJwG4}2zwEQsP*Nm-sgf`|Wws*HlPpoHTZ@ zW9s^zo}u+OaemkN8L-9*J|=vJ?KAu>_zo=KoyWVbnBSQLzQq3p_$$~0-h0nDqQp73 z`}Vr#n(uymgwK6boZq+vhQNXT`-C^f`L`hR#29bf90d3T&bkRMDi(~F_;apt_>FO2 z2XvDjzxCX&5&RPVD(LVl5#@XFHGB!%afhAvgLu#Q05oxbJQHKA>D|nGW&mU7vgZvj z&VC%PfOA|oKFa=hez$oMBTxiv`S2e^;z{COU8{LzJ_z{)w@S=VK@zgT@b`|0$%{nX8>EU0E%_NC+=OoI0tnfbt zbKu@IF@Gu%<@t55eokh5zxkFrO%k!@DSedp<2cDT-hH`Hh)eE{g3t z;vopeO^i>BvkyI$Tg2wG#&13EW{=$gYwK%boZkg~@6PcrKqAgqIc@L42Vm51K03eS z(b{<~D8;eQMo-*;t+ZaWUH=_;duVxWo-WEh`_G(Qe_}iWV*}lR>$lJTnUrg}!PxbM zJd$hS-vFN}>xc!Ifi6njL+lMOe!%DXI8UdadaZ{ZZYsvf3F`@aTA-WE88;cQk3fpE z^~xFVyDry32Ye^0d|o;ET`^X_eJ1Pw-aP3pESMxmosYH}@^k{iu55c$t35>wIq4xdmJ@?w&rodxtm=gB{|35&A<~`Hy!?5EI$JB8h)^+X^#%(QTYwzLr z3_T0u*61b)+x$Mt`A_G!?dNfDYa@blMY{)w~VdMZKNCzlM8k?gjD)WIP975HknPu?JF= z`PIfd{}R8o>~+OB4-K(d-wWcWCfHuc@+Ppo!E#nUVW#ArkAn~+cwL67*_K6Kb~pw1GdpE}BZ*WhzCYcZ!}F`mE)*U*zcmAq#YpL_CG z<0j{Ce7+OJ&EfXJR1TQefA{SKoqHv2D&7fsbr@};J%Sl=swQk16$d^{Rz(Jd5i5Decuk)N+0EO-Wmt^KLcv}nHhs_Vn5bv zXRPhBskkP4izt09uoLzP`aawMT-zE9_>G<6dk6dr2z&$ZuFQb*TT?6 z7JZR8hyVVfv8NJPz}n7n7jDppM9?SWeW2ZmiS)rf!MUC$)<0sr+pGMHSb67=7h{z9 zX5_q!-`oLT2aG!gPk?7;jAEY8!5Uc8`CAXhrYL)v$KP8yc52{@28~ z4)?HQJe6R)g!B2o1ssdFvE4&$#rr%&>2FT_-x)s!O#)6{B(NZ+10%Mg-yGjhO$K<+ z=neWkwEVi}9HF}?*kH@0IyT0!pGkMXjInp12i9BxYkKbb11v$VPka;Wz6R!8!mpj2 zVDrC5#vXpxkf_xWKNWfFI)}ZvZr9Sp zb^BftW0d)wZz_R*pST|FyFz;^`rVr?_-}YIy@M;p{|cUh=frqkO@dtGzXA5|9eIWB z@GC=@8|eU&_&%F^hGk@573LcH>Yvb%Kk~rh}{Xqc;|Di zp7YB1$y#zylxK4P_Sri*`|FPZ-g=&!cj;U{KJQ5a_rX|W$;c8>{x&g~gT0Q5VIjcL6aH+@Hp#C2jSQQn8Xw-Q(Y_xdV&gSP$_cu!g_d22rhYwTTd zetY=~7$*EmJIeknu&rwiYxyoraPEusd+aBb%j>ONS4H0jxG%jRuZj1;xt{^|!@2BZ zZC&E##z*n{ye`4WxJN&NGhW{Py#qX#j&TBkZT(xI1J?Qy9GgRJYh7ae0tEI*j_-m5 z9CwTdw6THxHE|C>?w_%IUtu3V!o3G}2)VRs<+i>YXD;obo2UnI^W@4C7; zA2BlS!DYC+U^S^>ZSU)IVBfv5_!^w=-{GwNB{*a}5YqwYOy&^p_&?!Yx8G|XgC--K zF$-dy-&)rzum6EIT-3M`?VjDhZ!P2Pqs=qJ{xv=!XHOkDig7K+y_HJ=0S4f_z8~BR z#hTXh90znniQi!N*p45;IUcbUeOK{$2VBqFU;(dK&mQuc@W0U?GDVEjXCD#OiSEJa z825~rXT*3mdEGU%sc-QA2#$z50V7D%Xky+m=)e%=Gs<^ZtFZH(wi}#fEE0RZ&yBt+m$7;Kj^PD7dy4PD0{5mSm)?>V`|Ym zaPrr{MY5gbc`nxLqu?|i-wfm$@|^KhtncqP#{5L0%s>B``RBEsb6z55Kr8k!Fn)zj zQP#U;yk+cX)t5ki!}toiC#D113vd;9$9)!h`~yh9dne~}(N|wL5!ZGE=eatE{dL4O zF{i`t-4f2>zV!G*4q1>B_D!`ha{;W=f&?|Jp0!**WRAJ~fH-&bCr=i(X? zcI(kN#hSO^#>m5;{CEfMUGNpqJ}2Z3fd{>UTh_6<$M3qntNz4TpS?T>f&Bzd-mzQ< z>@U#5I>vZUo`T?50~j2G8L=I@iTA_WVuPLcquwuLeYO+&OL@>^H*wxa_!em2 zG0wBaw$CBTvt`}8AQ+Do+UA<$o*iTBo1=~IupMt0zXGmRIKR(ITf6Ur4?vT>iTxDY z{jg?G%bX_K-b?3N!B53rb1eRc*rW4Df$zYh8gIw% zmM0Y*<1A>o1^$7!6=-X)ep^QgKKp6iBVf&r{3au|-#6Rd^^6lxi$C4&GPg7j$@4}w z^Zv+xXbj@s9%A=3ws_0WAxfWrguiJ#<0i(Bz&)|Q_uvn$5hX{v$5!58FX5;AH$ z^5cK8A2*0?V(&`Jb^k8Q2Y|bWov<@seVMDa^?vSrH?=mEvRKFX|Da}*0iWVt&cUZ} zSAb*tcn3t(=K^gX32klHVZDy=RE!bN;FTaYu)RZ`t7kGqxij+at#$6BUl|M6gBiBt zw<`ZnbQZW3etR&_z4yJbWvsNl8f%REvo9wCASur7&4OHOOl4l0+5?@5= z@j15VWIr9gQ((G>2jCLu;ZBIjy}&8fehBxEisG$5qdXt(kNit8m62TiGZ4g{6UNTz zcOzrm^BFh-E6~FW-_h5AJy?Il*TFBrhVc#HxqJ?+<6g;IYXj~uo`XbQK6kYB@8R16 z!C2lqwZ?x`G2oYbjbEK};d(F!*$3yja9<=B28wr%#!q_lcA9O!NJTOr8GNz`X+IO~ubV*L#sz|1!_d8*7U=pFc2mZGQF` z_Y~dXYm)bkfph*)W5#G~(Fge5!)e}WM4f+o0dJkJ$@LDc;opD(Uz5OZPhAvTW_$u3 zgC((d(B575>HvgsJ2FK5+aP*Z+-vLg7jVYD2bbrcCK5XW`+W&Npl_k4lFx@2}2 zr{ee_{vUyBxJW!Vd2x{}D(Bhl#;owAAPe|zu*a#iy817=XXf9n_1EZNJWy*YNBFFB zSanx<*X~)gJKAIWUT7j`o@c3~D0jNU-(&`7eYqa^{4c?-1f2Lz4y`!v7}+d8sIw%(I`yyAMqk*sj}NtP|L+o-xk%3+}ZsJ~zfs z#n=&_`{4K8{T;s5HP2@ufX|LHMENXopR=G>&BhT?=63!WexD!jx&9_S_A9t!VB89R zSB$al6FBd3Vyt){KWE&>**onTW1o@0XRI|_e*?aR@4vwN;Dr1UUkB8OjNJq8%NE-; zN9B98d-yF}pp`MoeaT$Ci#`JjkcfF3?fi*2C8FFPV;+G!pd&8f&vzI*u+6;*XMb|~ zloq2;8RIPet=r{%_iGJf-Jk!){}fyT?v3M)JY@zi=l+brbAY|ZmY<`27XBSLR*bi9 z?jy>3@gBVUJqJDfvgRjv_wz6Kozq$;jI{%8jRo3V*Q>n2-heJjAHT-7@5ER!KhGa! zo_~SMdzjhsV}RQb=Naa;q61$OeV+r@yh3+%ZuvR(XZXx-YxEASYm9u88Me>r)R#H@ zE8ux}m%3;fMLXv=U=R4r#SZV8xo`S=;QlNaH`&MT9Y^!jJz+of+1KC6@$Til(qAR7 z3EO?M2luy+##YVv3VwUrI@cuM2y@qyH2fdI->q?;Llfsp#CWE! z!F|v(o{GO)xyFlR4tLSqLzMkCH}5U^JwEM)HZboI@V>nZJO}-*!!sC(x7P%IB5-s3 z&hNe3l>zQ=__yE~dv{Nrv+dgr?4Ei}?BN4^*8c-q8RINwh5tGJBeb%_wnjUDeb#rs zQj*r7`wbZI1#m6aw$G8V??`jx z!~*+ceD*T~8!#1P67U`Si~1Qm<>$n2foGC=wBwPSCc*e~{BOVk_6_tATE99G+XM6L z_nhE2?kYL1`zDx54`-fd>%R}}nfW&u{fg@zqO95bX&?6a&^Y{gK5XNZ6?x5etli)o zo`reM*Wnu&i#ePz)=!M(rnU4P5F_8_*<*YKGUOD$2wEPXw#8^4c!#elD z?tYuI1lC!BF6)}hVvJK#l+V=5a3^ri=iYVr6PV$9!Pr_0aELwP zpJN{YV~){1a9;b#XTf=Na6R}HKJUJ@uYiuYsr(wBy&d6q&)oB=xEEuTyJ9WtZ;18$ zI{Zo>Wnb;n`qp%$*Z}BI5 zGwc&=*Rw&}muvS~Spnm(Fo%Y8-J zC+G1z-v-7T)1y5Pb?�og@3rWnbSSHi3?@;=Z_FO`O|(F>Z^tkEukI{@#W6E*C9sZhgB;RF zR^^mXPe8oae*^X~l~*;-J{IskXH)Tx$ax1I0prg}&^vJdoc}jqDtWDN2bK5SN8+3G*ng}( z*SZCPuZhp>&B`Ck0c$2>fShwj9qTj3{r&>DudBwBvXAX}j^F3n`U}RJ>Th@6xRF`| z@cEPXSsc;sllw8i?V&q-N<`_!y&i#UxmIoGvF{*8S;E~i2F!r*&e2Dv^E+eBcx0?E zfOGvBd;;cR#MglZamKFj<-NqVe|`35ZRfG?-f_+A(4OZV{K;6xJs7dwzZ<|B_N|!v z0lp#fFmu-#%lrOy9@iO_H%i<7|aDZ_)PZnYMX5{2P3OIoKWAXSMO_ zr||AilW(!tK+f|xAl{lON`!m=J7A3Off2v;jTwv)NUAyRh4U_f@zzgaL^-!?!}U>W z$uGdbSlilxt=N-wtnJ?#y-RcKF-p8#hixzBW?^j4{@(jO@ZP_MUx29b#)^U14&Mx{ zfIf4cfKF7gj}!P8_*|do<32@{9E!@a>j<)X}+nTO-20F(3jOEv01)QV7`k#Y4U?8>=6Op%80Q-)ZkeEw+ zpMjHF_dHwf<6g~k&YW)zU|;`)Yp}nm42<1V_r;hGL6FzPdjG)p6}TkV@@tH|p9xXN zIggm0v7Gy9UH4>D{W*poS1LEdKN9bKbd8SZ;3Z?3;OlGL zO}SkjSHPQVZ`RtCC0y&>bxg&v&!)9q*9dmy7~c=@N9Y5zYif1WJ>$#xokQEWF{lEJ z^-L020)1kR?Rnn2U1M=u%ROqfab-Cq&NI!QcYK#}u09H9?0{{(6Z}4>#+eiNo%0D} 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 literal 0 HcmV?d00001 diff --git a/rust/diskann/tests/data/siftsmall_learn.bin_pq_compressed.bin b/rust/diskann/tests/data/siftsmall_learn.bin_pq_compressed.bin new file mode 100644 index 0000000000000000000000000000000000000000..5f1ddab29499207ab040974db1c2cd128493e444 GIT binary patch literal 25008 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 z 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 literal 0 HcmV?d00001 diff --git a/rust/diskann/tests/data/siftsmall_learn.bin_pq_pivots.bin b/rust/diskann/tests/data/siftsmall_learn.bin_pq_pivots.bin new file mode 100644 index 0000000000000000000000000000000000000000..e84f8d8a940cb1f6bcaca17b6cf733dad83c45e1 GIT binary patch literal 135712 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

{4c@>Op?ZxOXY5Kx;;T=ZH3ne(7($IV9mHL} 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 E0jr$dcK`qY literal 0 HcmV?d00001 diff --git a/rust/diskann/tests/data/siftsmall_learn_256pts.fbin b/rust/diskann/tests/data/siftsmall_learn_256pts.fbin new file mode 100644 index 0000000000000000000000000000000000000000..357a9db87f54646e91da98d722ef2178a41eb5bc GIT binary patch literal 131080 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 literal 0 HcmV?d00001 diff --git a/rust/diskann/tests/data/truth_disk_index_siftsmall_learn_256pts_R4_L50_A1.2_disk.index b/rust/diskann/tests/data/truth_disk_index_siftsmall_learn_256pts_R4_L50_A1.2_disk.index new file mode 100644 index 0000000000000000000000000000000000000000..55fcbb58d60c99bc288ffd5c48b062eac5498acf GIT binary patch literal 155648 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 r=kFTjcQ}7`^T7gF^@Mr}dt-$~PEAamSP#!Jb literal 0 HcmV?d00001 diff --git a/rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_1+2_R4_L50_A1.2 b/rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_1+2_R4_L50_A1.2 new file mode 100644 index 0000000000000000000000000000000000000000..9c803c3fa27e9e4b11a3f096eaf9cfb169e4b33e GIT binary patch literal 10236 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 b26MauI)`=#)_e_xUZHt+3?$a|;^zAwi>u5| literal 0 HcmV?d00001 diff --git a/rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_1+2_saturated_R4_L50_A1.2 b/rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_1+2_saturated_R4_L50_A1.2 new file mode 100644 index 0000000000000000000000000000000000000000..a9dac1013c980f7a8a87fb1cf537c3042569043d GIT binary patch literal 10264 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 literal 0 HcmV?d00001 diff --git a/rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_R4_L50_A1.2.data b/rust/diskann/tests/data/truth_index_siftsmall_learn_256pts_R4_L50_A1.2.data new file mode 100644 index 0000000000000000000000000000000000000000..357a9db87f54646e91da98d722ef2178a41eb5bc GIT binary patch literal 131080 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 Result<(), LogError> { + let mut log = Log::default(); + let error_log = ErrorLog { + log_level: LogLevel::Error as i32, + error_message, + }; + log.error_log = Some(error_log); + + send_log(log) +} + +#[cfg(test)] +mod error_logger_test { + use super::*; + + #[test] + fn log_error_works() { + log_error(String::from("Error")).unwrap(); + } +} + diff --git a/rust/logger/src/examples/trace_example.rs b/rust/logger/src/examples/trace_example.rs new file mode 100644 index 000000000..7933a5699 --- /dev/null +++ b/rust/logger/src/examples/trace_example.rs @@ -0,0 +1,30 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use log::{debug, info, log_enabled, warn, Level}; +use logger::trace_logger::TraceLogger; + +// cargo run --example trace_example + +fn main() { + static LOGGER: TraceLogger = TraceLogger {}; + log::set_logger(&LOGGER) + .map(|()| log::set_max_level(log::LevelFilter::Trace)) + .unwrap(); + + info!("Rust logging n = {}", 42); + warn!("This is too much fun!"); + debug!("Maybe we can make this code work"); + + let error_is_enabled = log_enabled!(Level::Error); + let warn_is_enabled = log_enabled!(Level::Warn); + let info_is_enabled = log_enabled!(Level::Info); + let debug_is_enabled = log_enabled!(Level::Debug); + let trace_is_enabled = log_enabled!(Level::Trace); + println!( + "is_enabled? error: {:5?}, warn: {:5?}, info: {:5?}, debug: {:5?}, trace: {:5?}", + error_is_enabled, warn_is_enabled, info_is_enabled, debug_is_enabled, trace_is_enabled, + ); +} + diff --git a/rust/logger/src/indexlog.proto b/rust/logger/src/indexlog.proto new file mode 100644 index 000000000..68310ae41 --- /dev/null +++ b/rust/logger/src/indexlog.proto @@ -0,0 +1,50 @@ +syntax = "proto3"; + +package diskann_logger; + +message Log { + IndexConstructionLog IndexConstructionLog = 1; + DiskIndexConstructionLog DiskIndexConstructionLog = 2; + ErrorLog ErrorLog = 3; + TraceLog TraceLog = 100; +} + +enum LogLevel { + UNSPECIFIED = 0; + Error = 1; + Warn = 2; + Info = 3; + Debug = 4; + Trace = 5; +} + +message IndexConstructionLog { + float PercentageComplete = 1; + float TimeSpentInSeconds = 2; + float GCyclesSpent = 3; + LogLevel LogLevel = 4; +} + +message DiskIndexConstructionLog { + DiskIndexConstructionCheckpoint checkpoint = 1; + float TimeSpentInSeconds = 2; + float GCyclesSpent = 3; + LogLevel LogLevel = 4; +} + +enum DiskIndexConstructionCheckpoint { + None = 0; + PqConstruction = 1; + InmemIndexBuild = 2; + DiskLayout = 3; +} + +message TraceLog { + string LogLine = 1; + LogLevel LogLevel = 2; +} + +message ErrorLog { + string ErrorMessage = 1; + LogLevel LogLevel = 2; +} \ No newline at end of file diff --git a/rust/logger/src/lib.rs b/rust/logger/src/lib.rs new file mode 100644 index 000000000..6cfe2d589 --- /dev/null +++ b/rust/logger/src/lib.rs @@ -0,0 +1,19 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![cfg_attr( + not(test), + warn(clippy::panic, clippy::unwrap_used, clippy::expect_used) +)] + +pub mod logger { + pub mod indexlog { + include!(concat!(env!("OUT_DIR"), "/diskann_logger.rs")); + } +} + +pub mod error_logger; +pub mod log_error; +pub mod message_handler; +pub mod trace_logger; diff --git a/rust/logger/src/log_error.rs b/rust/logger/src/log_error.rs new file mode 100644 index 000000000..149d094a2 --- /dev/null +++ b/rust/logger/src/log_error.rs @@ -0,0 +1,27 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::sync::mpsc::SendError; + +use crate::logger::indexlog::Log; + +#[derive(thiserror::Error, Debug, Clone)] +pub enum LogError { + /// Sender failed to send message to the channel + #[error("IOError: {err}")] + SendError { + #[from] + err: SendError, + }, + + /// PoisonError which can be returned whenever a lock is acquired + /// Both Mutexes and RwLocks are poisoned whenever a thread fails while the lock is held + #[error("LockPoisonError: {err}")] + LockPoisonError { err: String }, + + /// Failed to create EtwPublisher + #[error("EtwProviderError: {err:?}")] + ETWProviderError { err: win_etw_provider::Error }, +} + diff --git a/rust/logger/src/message_handler.rs b/rust/logger/src/message_handler.rs new file mode 100644 index 000000000..37f352a28 --- /dev/null +++ b/rust/logger/src/message_handler.rs @@ -0,0 +1,167 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use crate::log_error::LogError; +use crate::logger::indexlog::DiskIndexConstructionCheckpoint; +use crate::logger::indexlog::Log; +use crate::logger::indexlog::LogLevel; + +use std::sync::mpsc::{self, Sender}; +use std::sync::Mutex; +use std::thread; + +use win_etw_macros::trace_logging_provider; + +trait MessagePublisher { + fn publish(&self, log_level: LogLevel, message: &str); +} + +// ETW provider - the GUID specified here is that of the default provider for Geneva Metric Extensions +// We are just using it as a placeholder until we have a version of OpenTelemetry exporter for Rust +#[trace_logging_provider(guid = "edc24920-e004-40f6-a8e1-0e6e48f39d84")] +trait EtwTraceProvider { + fn write(msg: &str); +} + +struct EtwPublisher { + provider: EtwTraceProvider, + publish_to_stdout: bool, +} + +impl EtwPublisher { + pub fn new() -> Result { + let provider = EtwTraceProvider::new(); + Ok(EtwPublisher { + provider, + publish_to_stdout: true, + }) + } +} + +fn log_level_to_etw(level: LogLevel) -> win_etw_provider::Level { + match level { + LogLevel::Error => win_etw_provider::Level::ERROR, + LogLevel::Warn => win_etw_provider::Level::WARN, + LogLevel::Info => win_etw_provider::Level::INFO, + LogLevel::Debug => win_etw_provider::Level::VERBOSE, + LogLevel::Trace => win_etw_provider::Level(6), + LogLevel::Unspecified => win_etw_provider::Level(6), + } +} + +fn i32_to_log_level(value: i32) -> LogLevel { + match value { + 0 => LogLevel::Unspecified, + 1 => LogLevel::Error, + 2 => LogLevel::Warn, + 3 => LogLevel::Info, + 4 => LogLevel::Debug, + 5 => LogLevel::Trace, + _ => LogLevel::Unspecified, + } +} + +impl MessagePublisher for EtwPublisher { + fn publish(&self, log_level: LogLevel, message: &str) { + let options = win_etw_provider::EventOptions { + level: Some(log_level_to_etw(log_level)), + ..Default::default() + }; + self.provider.write(Some(&options), message); + + if self.publish_to_stdout { + println!("{}", message); + } + } +} + +struct MessageProcessor { + sender: Mutex>, +} + +impl MessageProcessor { + pub fn start_processing() -> Self { + let (sender, receiver) = mpsc::channel::(); + thread::spawn(move || -> Result<(), LogError> { + for message in receiver { + // Process the received message + if let Some(indexlog) = message.index_construction_log { + let str = format!( + "Time for {}% of index build completed: {:.3} seconds, {:.3}B cycles", + indexlog.percentage_complete, + indexlog.time_spent_in_seconds, + indexlog.g_cycles_spent + ); + publish(i32_to_log_level(indexlog.log_level), &str)?; + } + + if let Some(disk_index_log) = message.disk_index_construction_log { + let str = format!( + "Time for disk index build [Checkpoint: {:?}] completed: {:.3} seconds, {:.3}B cycles", + DiskIndexConstructionCheckpoint::from_i32(disk_index_log.checkpoint).unwrap_or(DiskIndexConstructionCheckpoint::None), + disk_index_log.time_spent_in_seconds, + disk_index_log.g_cycles_spent + ); + publish(i32_to_log_level(disk_index_log.log_level), &str)?; + } + + if let Some(tracelog) = message.trace_log { + let str = format!("{}:{}", tracelog.log_level, tracelog.log_line); + publish(i32_to_log_level(tracelog.log_level), &str)?; + } + + if let Some(err) = message.error_log { + publish(i32_to_log_level(err.log_level), &err.error_message)?; + } + } + + Ok(()) + }); + + let sender = Mutex::new(sender); + MessageProcessor { sender } + } + + /// Log the message. + fn log(&self, message: Log) -> Result<(), LogError> { + Ok(self + .sender + .lock() + .map_err(|err| LogError::LockPoisonError { + err: err.to_string(), + })? + .send(message)?) + } +} + +lazy_static::lazy_static! { + /// Singleton logger. + static ref PROCESSOR: MessageProcessor = { + + MessageProcessor::start_processing() + }; +} + +lazy_static::lazy_static! { + /// Singleton publisher. + static ref PUBLISHER: Result = { + EtwPublisher::new() + }; +} + +/// Send a message to the logging system. +pub fn send_log(message: Log) -> Result<(), LogError> { + PROCESSOR.log(message) +} + +fn publish(log_level: LogLevel, message: &str) -> Result<(), LogError> { + match *PUBLISHER { + Ok(ref etw_publisher) => { + etw_publisher.publish(log_level, message); + Ok(()) + } + Err(ref err) => Err(LogError::ETWProviderError { err: err.clone() }), + } +} + diff --git a/rust/logger/src/trace_logger.rs b/rust/logger/src/trace_logger.rs new file mode 100644 index 000000000..96ef38611 --- /dev/null +++ b/rust/logger/src/trace_logger.rs @@ -0,0 +1,41 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use crate::logger::indexlog::{Log, TraceLog}; +use crate::message_handler::send_log; + +use log; + +pub struct TraceLogger {} + +fn level_to_i32(value: log::Level) -> i32 { + match value { + log::Level::Error => 1, + log::Level::Warn => 2, + log::Level::Info => 3, + log::Level::Debug => 4, + log::Level::Trace => 5, + } +} + +impl log::Log for TraceLogger { + fn enabled(&self, metadata: &log::Metadata) -> bool { + metadata.level() <= log::max_level() + } + + fn log(&self, record: &log::Record) { + let message = record.args().to_string(); + let metadata = record.metadata(); + let mut log = Log::default(); + let trace_log = TraceLog { + log_line: message, + log_level: level_to_i32(metadata.level()), + }; + log.trace_log = Some(trace_log); + let _ = send_log(log); + } + + fn flush(&self) {} +} + diff --git a/rust/platform/Cargo.toml b/rust/platform/Cargo.toml new file mode 100644 index 000000000..057f9e852 --- /dev/null +++ b/rust/platform/Cargo.toml @@ -0,0 +1,13 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "platform" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +log="0.4.18" +winapi = { version = "0.3.9", features = ["errhandlingapi", "fileapi", "ioapiset", "handleapi", "winnt", "minwindef", "basetsd", "winerror", "winbase"] } + diff --git a/rust/platform/src/file_handle.rs b/rust/platform/src/file_handle.rs new file mode 100644 index 000000000..23da8796a --- /dev/null +++ b/rust/platform/src/file_handle.rs @@ -0,0 +1,212 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::ffi::CString; +use std::{io, ptr}; + +use winapi::um::fileapi::OPEN_EXISTING; +use winapi::um::winbase::{FILE_FLAG_NO_BUFFERING, FILE_FLAG_OVERLAPPED, FILE_FLAG_RANDOM_ACCESS}; +use winapi::um::winnt::{FILE_SHARE_DELETE, FILE_SHARE_READ, FILE_SHARE_WRITE, GENERIC_READ, GENERIC_WRITE}; + +use winapi::{ + shared::minwindef::DWORD, + um::{ + errhandlingapi::GetLastError, + fileapi::CreateFileA, + handleapi::{CloseHandle, INVALID_HANDLE_VALUE}, + winnt::HANDLE, + }, +}; + +pub const FILE_ATTRIBUTE_READONLY: DWORD = 0x00000001; + +/// `AccessMode` determines how a file can be accessed. +/// These modes are used when creating or opening a file to decide what operations are allowed +/// to be performed on the file. +/// +/// # Variants +/// +/// - `Read`: The file is opened in read-only mode. +/// +/// - `Write`: The file is opened in write-only mode. +/// +/// - `ReadWrite`: The file is opened for both reading and writing. +pub enum AccessMode { + Read, + Write, + ReadWrite, +} + +/// `ShareMode` determines how a file can be shared. +/// +/// These modes are used when creating or opening a file to decide what operations other +/// opening instances of the file can perform on it. +/// # Variants +/// - `None`: Prevents other processes from opening a file if they request delete, +/// read, or write access. +/// +/// - `Read`: Allows subsequent open operations on the same file to request read access. +/// +/// - `Write`: Allows subsequent open operations on the same file file to request write access. +/// +/// - `Delete`: Allows subsequent open operations on the same file file to request delete access. +pub enum ShareMode { + None, + Read, + Write, + Delete, +} + +/// # Windows File Handle Wrapper +/// +/// Introduces a Rust-friendly wrapper around the native Windows `HANDLE` object, `FileHandle`. +/// `FileHandle` provides safe creation and automatic cleanup of Windows file handles, leveraging Rust's ownership model. + +/// `FileHandle` struct that wraps a native Windows `HANDLE` object +#[cfg(target_os = "windows")] +pub struct FileHandle { + handle: HANDLE, +} + +impl FileHandle { + /// Creates a new `FileHandle` by opening an existing file with the given access and shared mode. + /// + /// This function is marked unsafe because it creates a raw pointer to the filename and try to create + /// a Windows `HANDLE` object without checking if you have sufficient permissions. + /// + /// # Safety + /// + /// Ensure that the file specified by `file_name` is valid and the calling process has + /// sufficient permissions to perform the specified `access_mode` and `share_mode` operations. + /// + /// # Parameters + /// + /// - `file_name`: The name of the file. + /// - `access_mode`: The access mode to be used for the file. + /// - `share_mode`: The share mode to be used for the file + /// + /// # Errors + /// This function will return an error if the `file_name` is invalid or if the file cannot + /// be opened with the specified `access_mode` and `share_mode`. + pub unsafe fn new( + file_name: &str, + access_mode: AccessMode, + share_mode: ShareMode, + ) -> io::Result { + let file_name_c = CString::new(file_name).map_err(|_| { + io::Error::new( + io::ErrorKind::InvalidData, + format!("Invalid file name. {}", file_name), + ) + })?; + + let dw_desired_access = match access_mode { + AccessMode::Read => GENERIC_READ, + AccessMode::Write => GENERIC_WRITE, + AccessMode::ReadWrite => GENERIC_READ | GENERIC_WRITE, + }; + + let dw_share_mode = match share_mode { + ShareMode::None => 0, + ShareMode::Read => FILE_SHARE_READ, + ShareMode::Write => FILE_SHARE_WRITE, + ShareMode::Delete => FILE_SHARE_DELETE, + }; + + let dw_flags_and_attributes = FILE_ATTRIBUTE_READONLY + | FILE_FLAG_NO_BUFFERING + | FILE_FLAG_OVERLAPPED + | FILE_FLAG_RANDOM_ACCESS; + + let handle = unsafe { + CreateFileA( + file_name_c.as_ptr(), + dw_desired_access, + dw_share_mode, + ptr::null_mut(), + OPEN_EXISTING, + dw_flags_and_attributes, + ptr::null_mut(), + ) + }; + + if handle == INVALID_HANDLE_VALUE { + let error_code = unsafe { GetLastError() }; + Err(io::Error::from_raw_os_error(error_code as i32)) + } else { + Ok(Self { handle }) + } + } + + pub fn raw_handle(&self) -> HANDLE { + self.handle + } +} + +impl Drop for FileHandle { + /// Automatically closes the `FileHandle` when it goes out of scope. + /// Any errors in closing the handle are logged, as `Drop` does not support returning `Result`. + fn drop(&mut self) { + let result = unsafe { CloseHandle(self.handle) }; + if result == 0 { + let error_code = unsafe { GetLastError() }; + let error = io::Error::from_raw_os_error(error_code as i32); + + // Only log the error if dropping the handle fails, since Rust's Drop trait does not support returning Result types from the drop method, + // and panicking in the drop method is considered bad practice + log::warn!("Error when dropping IOCompletionPort: {:?}", error); + } + } +} + +/// Returns a `FileHandle` with an `INVALID_HANDLE_VALUE`. +impl Default for FileHandle { + fn default() -> Self { + Self { + handle: INVALID_HANDLE_VALUE, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fs::File; + use std::path::Path; + + #[test] + fn test_create_file() { + // Create a dummy file + let dummy_file_path = "dummy_file.txt"; + { + let _file = File::create(dummy_file_path).expect("Failed to create dummy file."); + } + + let path = Path::new(dummy_file_path); + { + let file_handle = unsafe { + FileHandle::new(path.to_str().unwrap(), AccessMode::Read, ShareMode::Read) + }; + + // Check that the file handle is valid + assert!(file_handle.is_ok()); + } + + // Try to delete the file. If the handle was correctly dropped, this should succeed. + match std::fs::remove_file(dummy_file_path) { + Ok(()) => (), // File was deleted successfully, which means the handle was closed. + Err(e) => panic!("Failed to delete file: {}", e), // Failed to delete the file, likely because the handle is still open. + } + } + + #[test] + fn test_file_not_found() { + let path = Path::new("non_existent_file.txt"); + let file_handle = + unsafe { FileHandle::new(path.to_str().unwrap(), AccessMode::Read, ShareMode::Read) }; + + // Check that opening a non-existent file returns an error + assert!(file_handle.is_err()); + } +} diff --git a/rust/platform/src/file_io.rs b/rust/platform/src/file_io.rs new file mode 100644 index 000000000..e5de24773 --- /dev/null +++ b/rust/platform/src/file_io.rs @@ -0,0 +1,154 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +/// The module provides unsafe wrappers around two Windows API functions: `ReadFile` and `GetQueuedCompletionStatus`. +/// +/// These wrappers aim to simplify and abstract the use of these functions, providing easier error handling and a safer interface. +/// They return standard Rust `io::Result` types for convenience and consistency with the rest of the Rust standard library. +use std::io; +use std::ptr; + +use winapi::{ + ctypes::c_void, + shared::{ + basetsd::ULONG_PTR, + minwindef::{DWORD, FALSE}, + winerror::{ERROR_IO_PENDING, WAIT_TIMEOUT}, + }, + um::{ + errhandlingapi::GetLastError, fileapi::ReadFile, ioapiset::GetQueuedCompletionStatus, + minwinbase::OVERLAPPED, + }, +}; + +use crate::FileHandle; +use crate::IOCompletionPort; + +/// Asynchronously queue a read request from a file into a buffer slice. +/// +/// Wraps the unsafe Windows API function `ReadFile`, making it safe to call only when the overlapped buffer +/// remains valid and unchanged anywhere else during the entire async operation. +/// +/// Returns a boolean indicating whether the read operation completed synchronously or is pending. +/// +/// # Safety +/// +/// This function is marked as `unsafe` because it uses raw pointers and requires the caller to ensure +/// that the buffer slice and the overlapped buffer stay valid during the whole async operation. +pub unsafe fn read_file_to_slice( + file_handle: &FileHandle, + buffer_slice: &mut [T], + overlapped: *mut OVERLAPPED, + offset: u64, +) -> io::Result { + let num_bytes = std::mem::size_of_val(buffer_slice); + unsafe { + ptr::write(overlapped, std::mem::zeroed()); + (*overlapped).u.s_mut().Offset = offset as u32; + (*overlapped).u.s_mut().OffsetHigh = (offset >> 32) as u32; + } + + let result = unsafe { + ReadFile( + file_handle.raw_handle(), + buffer_slice.as_mut_ptr() as *mut c_void, + num_bytes as DWORD, + ptr::null_mut(), + overlapped, + ) + }; + + match result { + FALSE => { + let error = unsafe { GetLastError() }; + if error != ERROR_IO_PENDING { + Err(io::Error::from_raw_os_error(error as i32)) + } else { + Ok(false) + } + } + _ => Ok(true), + } +} + +/// Retrieves the results of an asynchronous I/O operation on an I/O completion port. +/// +/// Wraps the unsafe Windows API function `GetQueuedCompletionStatus`, making it safe to call only when the overlapped buffer +/// remains valid and unchanged anywhere else during the entire async operation. +/// +/// Returns a boolean indicating whether an I/O operation completed synchronously or is still pending. +/// +/// # Safety +/// +/// This function is marked as `unsafe` because it uses raw pointers and requires the caller to ensure +/// that the overlapped buffer stays valid during the whole async operation. +pub unsafe fn get_queued_completion_status( + completion_port: &IOCompletionPort, + lp_number_of_bytes: &mut DWORD, + lp_completion_key: &mut ULONG_PTR, + lp_overlapped: *mut *mut OVERLAPPED, + dw_milliseconds: DWORD, +) -> io::Result { + let result = unsafe { + GetQueuedCompletionStatus( + completion_port.raw_handle(), + lp_number_of_bytes, + lp_completion_key, + lp_overlapped, + dw_milliseconds, + ) + }; + + match result { + 0 => { + let error = unsafe { GetLastError() }; + if error == WAIT_TIMEOUT { + Ok(false) + } else { + Err(io::Error::from_raw_os_error(error as i32)) + } + } + _ => Ok(true), + } +} + +#[cfg(test)] +mod tests { + use crate::file_handle::{AccessMode, ShareMode}; + + use super::*; + use std::fs::File; + use std::io::Write; + use std::path::Path; + + #[test] + fn test_read_file_to_slice() { + // Create a temporary file and write some data into it + let path = Path::new("temp.txt"); + { + let mut file = File::create(path).unwrap(); + file.write_all(b"Hello, world!").unwrap(); + } + + let mut buffer: [u8; 512] = [0; 512]; + let mut overlapped = unsafe { std::mem::zeroed::() }; + { + let file_handle = unsafe { + FileHandle::new(path.to_str().unwrap(), AccessMode::Read, ShareMode::Read) + } + .unwrap(); + + // Call the function under test + let result = + unsafe { read_file_to_slice(&file_handle, &mut buffer, &mut overlapped, 0) }; + + assert!(result.is_ok()); + let result_str = std::str::from_utf8(&buffer[.."Hello, world!".len()]).unwrap(); + assert_eq!(result_str, "Hello, world!"); + } + + // Clean up + std::fs::remove_file("temp.txt").unwrap(); + } +} diff --git a/rust/platform/src/io_completion_port.rs b/rust/platform/src/io_completion_port.rs new file mode 100644 index 000000000..5bb332281 --- /dev/null +++ b/rust/platform/src/io_completion_port.rs @@ -0,0 +1,142 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::io; + +use winapi::{ + ctypes::c_void, + shared::{basetsd::ULONG_PTR, minwindef::DWORD}, + um::{ + errhandlingapi::GetLastError, + handleapi::{CloseHandle, INVALID_HANDLE_VALUE}, + ioapiset::CreateIoCompletionPort, + winnt::HANDLE, + }, +}; + +use crate::FileHandle; + +/// This module provides a safe and idiomatic Rust interface over the IOCompletionPort handle and associated Windows API functions. +/// This struct represents an I/O completion port, which is an object used in asynchronous I/O operations on Windows. +pub struct IOCompletionPort { + io_completion_port: HANDLE, +} + +impl IOCompletionPort { + /// Create a new IOCompletionPort. + /// This function wraps the Windows CreateIoCompletionPort function, providing error handling and automatic resource management. + /// + /// # Arguments + /// + /// * `file_handle` - A reference to a FileHandle to associate with the IOCompletionPort. + /// * `existing_completion_port` - An optional reference to an existing IOCompletionPort. If provided, the new IOCompletionPort will be associated with it. + /// * `completion_key` - The completion key associated with the file handle. + /// * `number_of_concurrent_threads` - The maximum number of threads that the operating system can allow to concurrently process I/O completion packets for the I/O completion port. + /// + /// # Return + /// + /// Returns a Result with the new IOCompletionPort if successful, or an io::Error if the function fails. + pub fn new( + file_handle: &FileHandle, + existing_completion_port: Option<&IOCompletionPort>, + completion_key: ULONG_PTR, + number_of_concurrent_threads: DWORD, + ) -> io::Result { + let io_completion_port = unsafe { + CreateIoCompletionPort( + file_handle.raw_handle(), + existing_completion_port + .map_or(std::ptr::null_mut::(), |io_completion_port| { + io_completion_port.raw_handle() + }), + completion_key, + number_of_concurrent_threads, + ) + }; + + if io_completion_port == INVALID_HANDLE_VALUE { + let error_code = unsafe { GetLastError() }; + return Err(io::Error::from_raw_os_error(error_code as i32)); + } + + Ok(IOCompletionPort { io_completion_port }) + } + + pub fn raw_handle(&self) -> HANDLE { + self.io_completion_port + } +} + +impl Drop for IOCompletionPort { + /// Drop method for IOCompletionPort. + /// This wraps the Windows CloseHandle function, providing automatic resource cleanup when the IOCompletionPort is dropped. + /// If an error occurs while dropping, it is logged and the drop continues. This is because panicking in Drop can cause unwinding issues. + fn drop(&mut self) { + let result = unsafe { CloseHandle(self.io_completion_port) }; + if result == 0 { + let error_code = unsafe { GetLastError() }; + let error = io::Error::from_raw_os_error(error_code as i32); + + // Only log the error if dropping the handle fails, since Rust's Drop trait does not support returning Result types from the drop method, + // and panicking in the drop method is considered bad practice + log::warn!("Error when dropping IOCompletionPort: {:?}", error); + } + } +} + +impl Default for IOCompletionPort { + /// Create a default IOCompletionPort, whose handle is set to INVALID_HANDLE_VALUE. + /// Returns a new IOCompletionPort with handle set to INVALID_HANDLE_VALUE. + fn default() -> Self { + Self { + io_completion_port: INVALID_HANDLE_VALUE, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::file_handle::{AccessMode, ShareMode}; + + #[test] + fn create_io_completion_port() { + let file_name = "../diskann/tests/data/delete_set_50pts.bin"; + let file_handle = unsafe { FileHandle::new(file_name, AccessMode::Read, ShareMode::Read) } + .expect("Failed to create file handle."); + + let io_completion_port = IOCompletionPort::new(&file_handle, None, 0, 0); + + assert!( + io_completion_port.is_ok(), + "Failed to create IOCompletionPort." + ); + } + + #[test] + fn drop_io_completion_port() { + let file_name = "../diskann/tests/data/delete_set_50pts.bin"; + let file_handle = unsafe { FileHandle::new(file_name, AccessMode::Read, ShareMode::Read) } + .expect("Failed to create file handle."); + + let io_completion_port = IOCompletionPort::new(&file_handle, None, 0, 0) + .expect("Failed to create IOCompletionPort."); + + // After this line, io_completion_port goes out of scope and its Drop trait will be called. + let _ = io_completion_port; + // We have no easy way to test that the Drop trait works correctly, but if it doesn't, + // a resource leak or other problem may become apparent in later tests or in real use of the code. + } + + #[test] + fn default_io_completion_port() { + let io_completion_port = IOCompletionPort::default(); + assert_eq!( + io_completion_port.raw_handle(), + INVALID_HANDLE_VALUE, + "Default IOCompletionPort did not have INVALID_HANDLE_VALUE." + ); + } +} + diff --git a/rust/platform/src/lib.rs b/rust/platform/src/lib.rs new file mode 100644 index 000000000..e28257078 --- /dev/null +++ b/rust/platform/src/lib.rs @@ -0,0 +1,20 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![cfg_attr( + not(test), + warn(clippy::panic, clippy::unwrap_used, clippy::expect_used) +)] + +pub mod perf; +pub use perf::{get_process_cycle_time, get_process_handle}; + +pub mod file_io; +pub use file_io::{get_queued_completion_status, read_file_to_slice}; + +pub mod file_handle; +pub use file_handle::FileHandle; + +pub mod io_completion_port; +pub use io_completion_port::IOCompletionPort; diff --git a/rust/platform/src/perf.rs b/rust/platform/src/perf.rs new file mode 100644 index 000000000..1ea146f9a --- /dev/null +++ b/rust/platform/src/perf.rs @@ -0,0 +1,50 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[cfg(target_os = "windows")] +#[link(name = "kernel32")] +extern "system" { + fn OpenProcess(dwDesiredAccess: u32, bInheritHandle: bool, dwProcessId: u32) -> usize; + fn QueryProcessCycleTime(hProcess: usize, lpCycleTime: *mut u64) -> bool; + fn GetCurrentProcessId() -> u32; +} + +/// Get current process handle. +pub fn get_process_handle() -> Option { + if cfg!(windows) { + const PROCESS_QUERY_INFORMATION: u32 = 0x0400; + const PROCESS_VM_READ: u32 = 0x0010; + + unsafe { + let current_process_id = GetCurrentProcessId(); + let handle = OpenProcess( + PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, + false, + current_process_id, + ); + if handle == 0 { + None + } else { + Some(handle) + } + } + } else { + None + } +} + +pub fn get_process_cycle_time(process_handle: Option) -> Option { + let mut cycle_time: u64 = 0; + if cfg!(windows) { + if let Some(handle) = process_handle { + let result = unsafe { QueryProcessCycleTime(handle, &mut cycle_time as *mut u64) }; + if result { + return Some(cycle_time); + } + } + } + + None +} + diff --git a/rust/project.code-workspace b/rust/project.code-workspace new file mode 100644 index 000000000..29bed0024 --- /dev/null +++ b/rust/project.code-workspace @@ -0,0 +1,58 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "search.exclude": { + "target": true, + }, + "files.exclude": { + "target": true, + }, + "rust-analyzer.linkedProjects": [ + ".\\vector\\Cargo.toml", + ".\\vector\\Cargo.toml", + ".\\vector\\Cargo.toml", + ".\\diskann\\Cargo.toml" + ], + "[rust]": { + "editor.defaultFormatter": "rust-lang.rust-analyzer", + "editor.formatOnSave": true, + } + }, + "launch": { + "version": "0.2.0", + "configurations": [ + { + "name": "Build memory index", + "type": "cppvsdbg", + "request": "launch", + "program": "${workspaceRoot}\\target\\debug\\build_memory_index.exe", + "args": [ + "--data_type", + "float", + "--dist_fn", + "l2", + "--data_path", + ".\\base1m.fbin", + "--index_path_prefix", + ".\\rust_index_sift_base_R32_L50_A1.2_T1", + "-R", + "64", + "-L", + "100", + "--alpha", + "1.2", + "-T", + "1" + ], + "stopAtEntry": false, + "cwd": "c:\\data", + "environment": [], + "externalConsole": true + }, + ] + } +} \ No newline at end of file diff --git a/rust/readme.md b/rust/readme.md new file mode 100644 index 000000000..a6c5a1bd4 --- /dev/null +++ b/rust/readme.md @@ -0,0 +1,25 @@ + +# readme + +run commands under disnann_rust directory. + +build: +``` +cargo build // Debug + +cargo build -r // Release +``` + + +run: +``` +cargo run // Debug + +cargo run -r // Release +``` + + +test: +``` +cargo test +``` diff --git a/rust/rust-toolchain.toml b/rust/rust-toolchain.toml new file mode 100644 index 000000000..183a72c9c --- /dev/null +++ b/rust/rust-toolchain.toml @@ -0,0 +1,4 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[toolchain] +channel = "stable" diff --git a/rust/vector/Cargo.toml b/rust/vector/Cargo.toml new file mode 100644 index 000000000..709a2905c --- /dev/null +++ b/rust/vector/Cargo.toml @@ -0,0 +1,24 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "vector" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +half = "2.2.1" +thiserror = "1.0.40" +bytemuck = "1.7.0" + +[build-dependencies] +cc = "1.0.79" + +[dev-dependencies] +base64 = "0.21.2" +bincode = "1.3.3" +serde = "1.0.163" +approx = "0.5.1" +rand = "0.8.5" + diff --git a/rust/vector/build.rs b/rust/vector/build.rs new file mode 100644 index 000000000..2d36c213c --- /dev/null +++ b/rust/vector/build.rs @@ -0,0 +1,29 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +fn main() { + println!("cargo:rerun-if-changed=distance.c"); + if cfg!(target_os = "macos") { + std::env::set_var("CFLAGS", "-mavx2 -mfma -Wno-error -MP -O2 -D NDEBUG -D MKL_ILP64 -D USE_AVX2 -D USE_ACCELERATED_PQ -D NOMINMAX -D _TARGET_ARM_APPLE_DARWIN"); + + cc::Build::new() + .file("distance.c") + .warnings_into_errors(true) + .debug(false) + .target("x86_64-apple-darwin") + .compile("nativefunctions.lib"); + } else { + std::env::set_var("CFLAGS", "/permissive- /MP /ifcOutput /GS- /W3 /Gy /Zi /Gm- /O2 /Ob2 /Zc:inline /fp:fast /D NDEBUG /D MKL_ILP64 /D USE_AVX2 /D USE_ACCELERATED_PQ /D NOMINMAX /fp:except- /errorReport:prompt /WX /openmp:experimental /Zc:forScope /GR /arch:AVX2 /Gd /Oy /Oi /MD /std:c++14 /FC /EHsc /nologo /Ot"); + // std::env::set_var("CFLAGS", "/permissive- /MP /ifcOutput /GS- /W3 /Gy /Zi /Gm- /Obd /Zc:inline /fp:fast /D DEBUG /D MKL_ILP64 /D USE_AVX2 /D USE_ACCELERATED_PQ /D NOMINMAX /fp:except- /errorReport:prompt /WX /openmp:experimental /Zc:forScope /GR /arch:AVX512 /Gd /Oy /Oi /MD /std:c++14 /FC /EHsc /nologo /Ot"); + + cc::Build::new() + .file("distance.c") + .warnings_into_errors(true) + .debug(false) + .compile("nativefunctions"); + + println!("cargo:rustc-link-arg=nativefunctions.lib"); + } +} + diff --git a/rust/vector/distance.c b/rust/vector/distance.c new file mode 100644 index 000000000..ee5333a53 --- /dev/null +++ b/rust/vector/distance.c @@ -0,0 +1,35 @@ +#include +#include + +inline __m256i load_128bit_to_256bit(const __m128i *ptr) +{ + __m128i value128 = _mm_loadu_si128(ptr); + __m256i value256 = _mm256_castsi128_si256(value128); + return _mm256_inserti128_si256(value256, _mm_setzero_si128(), 1); +} + +float distance_compare_avx512f_f16(const unsigned char *vec1, const unsigned char *vec2, size_t size) +{ + __m512 sum_squared_diff = _mm512_setzero_ps(); + + for (int i = 0; i < size / 16; i += 1) + { + __m512 v1 = _mm512_cvtph_ps(_mm256_loadu_si256((const __m256i *)(vec1 + i * 2 * 16))); + __m512 v2 = _mm512_cvtph_ps(_mm256_loadu_si256((const __m256i *)(vec2 + i * 2 * 16))); + + __m512 diff = _mm512_sub_ps(v1, v2); + sum_squared_diff = _mm512_fmadd_ps(diff, diff, sum_squared_diff); + } + + size_t i = (size / 16) * 16; + + if (i != size) + { + __m512 va = _mm512_cvtph_ps(load_128bit_to_256bit((const __m128i *)(vec1 + i * 2))); + __m512 vb = _mm512_cvtph_ps(load_128bit_to_256bit((const __m128i *)(vec2 + i * 2))); + __m512 diff512 = _mm512_sub_ps(va, vb); + sum_squared_diff = _mm512_fmadd_ps(diff512, diff512, sum_squared_diff); + } + + return _mm512_reduce_add_ps(sum_squared_diff); +} diff --git a/rust/vector/src/distance.rs b/rust/vector/src/distance.rs new file mode 100644 index 000000000..8ca6cb250 --- /dev/null +++ b/rust/vector/src/distance.rs @@ -0,0 +1,442 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use crate::l2_float_distance::{distance_l2_vector_f16, distance_l2_vector_f32}; +use crate::{Half, Metric}; + +/// Distance contract for full-precision vertex +pub trait FullPrecisionDistance { + /// Get the distance between vertex a and vertex b + fn distance_compare(a: &[T; N], b: &[T; N], vec_type: Metric) -> f32; +} + +// reason = "Not supported Metric type Metric::Cosine" +#[allow(clippy::panic)] +impl FullPrecisionDistance for [f32; N] { + /// Calculate distance between two f32 Vertex + #[inline(always)] + fn distance_compare(a: &[f32; N], b: &[f32; N], metric: Metric) -> f32 { + match metric { + Metric::L2 => distance_l2_vector_f32::(a, b), + _ => panic!("Not supported Metric type {:?}", metric), + } + } +} + +// reason = "Not supported Metric type Metric::Cosine" +#[allow(clippy::panic)] +impl FullPrecisionDistance for [Half; N] { + fn distance_compare(a: &[Half; N], b: &[Half; N], metric: Metric) -> f32 { + match metric { + Metric::L2 => distance_l2_vector_f16::(a, b), + _ => panic!("Not supported Metric type {:?}", metric), + } + } +} + +// reason = "Not yet supported Vector i8" +#[allow(clippy::panic)] +impl FullPrecisionDistance for [i8; N] { + fn distance_compare(_a: &[i8; N], _b: &[i8; N], _metric: Metric) -> f32 { + panic!("Not supported VectorType i8") + } +} + +// reason = "Not yet supported Vector u8" +#[allow(clippy::panic)] +impl FullPrecisionDistance for [u8; N] { + fn distance_compare(_a: &[u8; N], _b: &[u8; N], _metric: Metric) -> f32 { + panic!("Not supported VectorType u8") + } +} + +#[cfg(test)] +mod distance_test { + use super::*; + + #[repr(C, align(32))] + pub struct F32Slice112([f32; 112]); + + #[repr(C, align(32))] + pub struct F16Slice112([Half; 112]); + + fn get_turing_test_data() -> (F32Slice112, F32Slice112) { + let a_slice: [f32; 112] = [ + 0.13961786, + -0.031577103, + -0.09567415, + 0.06695563, + -0.1588727, + 0.089852564, + -0.019837005, + 0.07497972, + 0.010418192, + -0.054594643, + 0.08613386, + -0.05103466, + 0.16568437, + -0.02703799, + 0.00728657, + -0.15313251, + 0.16462992, + -0.030570814, + 0.11635703, + 0.23938893, + 0.018022912, + -0.12646551, + 0.018048918, + -0.035986554, + 0.031986624, + -0.015286017, + 0.010117953, + -0.032691937, + 0.12163067, + -0.04746277, + 0.010213069, + -0.043672588, + -0.099362016, + 0.06599016, + -0.19397286, + -0.13285528, + -0.22040887, + 0.017690737, + -0.104262285, + -0.0044555613, + -0.07383778, + -0.108652934, + 0.13399786, + 0.054912474, + 0.20181285, + 0.1795591, + -0.05425621, + -0.10765217, + 0.1405377, + -0.14101997, + -0.12017701, + 0.011565498, + 0.06952187, + 0.060136646, + 0.0023214167, + 0.04204699, + 0.048470616, + 0.17398086, + 0.024218207, + -0.15626553, + -0.11291045, + -0.09688122, + 0.14393932, + -0.14713104, + -0.108876854, + 0.035279203, + -0.05440188, + 0.017205412, + 0.011413814, + 0.04009471, + 0.11070237, + -0.058998976, + 0.07260045, + -0.057893746, + -0.0036240944, + -0.0064988653, + -0.13842176, + -0.023219328, + 0.0035885905, + -0.0719257, + -0.21335067, + 0.11415403, + -0.0059823603, + 0.12091869, + 0.08136634, + -0.10769281, + 0.024518685, + 0.0009200326, + -0.11628049, + 0.07448965, + 0.13736208, + -0.04144517, + -0.16426727, + -0.06380103, + -0.21386267, + 0.022373492, + -0.05874115, + 0.017314062, + -0.040344074, + 0.01059176, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ]; + let b_slice: [f32; 112] = [ + -0.07209058, + -0.17755842, + -0.030627966, + 0.163028, + -0.2233766, + 0.057412963, + 0.0076995124, + -0.017121306, + -0.015759075, + -0.026947778, + -0.010282468, + -0.23968373, + -0.021486737, + -0.09903155, + 0.09361805, + 0.0042711576, + -0.08695552, + -0.042165346, + 0.064218745, + -0.06707651, + 0.07846054, + 0.12235762, + -0.060716823, + 0.18496591, + -0.13023394, + 0.022469055, + 0.056764495, + 0.07168404, + -0.08856144, + -0.15343173, + 0.099879816, + -0.033529017, + 0.0795304, + -0.009242254, + -0.10254546, + 0.13086525, + -0.101518914, + -0.1031299, + -0.056826904, + 0.033196196, + 0.044143833, + -0.049787212, + -0.018148342, + -0.11172959, + -0.06776237, + -0.09185828, + -0.24171598, + 0.05080982, + -0.0727684, + 0.045031235, + -0.11363879, + -0.063389264, + 0.105850354, + -0.19847773, + 0.08828623, + -0.087071925, + 0.033512704, + 0.16118294, + 0.14111553, + 0.020884402, + -0.088860825, + 0.018745849, + 0.047522716, + -0.03665169, + 0.15726231, + -0.09930561, + 0.057844743, + -0.10532736, + -0.091297254, + 0.067029804, + 0.04153976, + 0.06393326, + 0.054578528, + 0.0038539872, + 0.1023088, + -0.10653885, + -0.108500294, + -0.046606563, + 0.020439683, + -0.120957725, + -0.13334097, + -0.13425854, + -0.20481694, + 0.07009538, + 0.08660361, + -0.0096641015, + 0.095316306, + -0.002898167, + -0.19680002, + 0.08466311, + 0.04812689, + -0.028978813, + 0.04780206, + -0.2001506, + -0.036866356, + -0.023720587, + 0.10731964, + 0.05517358, + -0.09580819, + 0.14595725, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + ]; + + (F32Slice112(a_slice), F32Slice112(b_slice)) + } + + fn get_turing_test_data_f16() -> (F16Slice112, F16Slice112) { + let (a_slice, b_slice) = get_turing_test_data(); + let a_data = a_slice.0.iter().map(|x| Half::from_f32(*x)); + let b_data = b_slice.0.iter().map(|x| Half::from_f32(*x)); + + ( + F16Slice112(a_data.collect::>().try_into().unwrap()), + F16Slice112(b_data.collect::>().try_into().unwrap()), + ) + } + + use crate::test_util::*; + use approx::assert_abs_diff_eq; + + #[test] + fn test_dist_l2_float_turing() { + // two vectors are allocated in the contiguous heap memory + let (a_slice, b_slice) = get_turing_test_data(); + let distance = <[f32; 112] as FullPrecisionDistance>::distance_compare( + &a_slice.0, + &b_slice.0, + Metric::L2, + ); + + assert_abs_diff_eq!( + distance, + no_vector_compare_f32(&a_slice.0, &b_slice.0), + epsilon = 1e-6 + ); + } + + #[test] + fn test_dist_l2_f16_turing() { + // two vectors are allocated in the contiguous heap memory + let (a_slice, b_slice) = get_turing_test_data_f16(); + let distance = <[Half; 112] as FullPrecisionDistance>::distance_compare( + &a_slice.0, + &b_slice.0, + Metric::L2, + ); + + // Note the variance between the full 32 bit precision and the 16 bit precision + assert_eq!(distance, no_vector_compare_f16(&a_slice.0, &b_slice.0)); + } + + #[test] + fn distance_test() { + #[repr(C, align(32))] + struct Vector32ByteAligned { + v: [f32; 512], + } + + // two vectors are allocated in the contiguous heap memory + let two_vec = Box::new(Vector32ByteAligned { + v: [ + 69.02492, 78.84786, 63.125072, 90.90581, 79.2592, 70.81731, 3.0829668, 33.33287, + 20.777142, 30.147898, 23.681915, 42.553043, 12.602162, 7.3808074, 19.157589, + 65.6791, 76.44677, 76.89124, 86.40756, 84.70118, 87.86142, 16.126896, 5.1277637, + 95.11038, 83.946945, 22.735607, 11.548555, 59.51482, 24.84603, 15.573776, 78.27185, + 71.13179, 38.574017, 80.0228, 13.175261, 62.887978, 15.205181, 18.89392, 96.13162, + 87.55455, 34.179806, 62.920044, 4.9305916, 54.349373, 21.731495, 14.982187, + 40.262867, 20.15214, 36.61963, 72.450806, 55.565, 95.5375, 93.73356, 95.36308, + 66.30762, 58.0397, 18.951357, 67.11702, 43.043316, 30.65622, 99.85361, 2.5889993, + 27.844774, 39.72441, 46.463238, 71.303764, 90.45308, 36.390602, 63.344395, + 26.427078, 35.99528, 82.35505, 32.529175, 23.165905, 74.73179, 9.856939, 59.38126, + 35.714924, 79.81213, 46.704124, 24.47884, 36.01743, 0.46678782, 29.528152, + 1.8980742, 24.68853, 75.58984, 98.72279, 68.62601, 11.890173, 49.49361, 55.45572, + 72.71067, 34.107483, 51.357758, 76.400635, 81.32725, 66.45081, 17.848074, + 62.398876, 94.20444, 2.10886, 17.416393, 64.88253, 29.000723, 62.434315, 53.907238, + 70.51412, 78.70744, 55.181683, 64.45116, 23.419212, 53.68544, 43.506958, 46.89598, + 35.905994, 64.51397, 91.95555, 20.322979, 74.80128, 97.548744, 58.312725, 78.81985, + 31.911612, 14.445949, 49.85094, 70.87396, 40.06766, 7.129991, 78.48008, 75.21636, + 93.623604, 95.95479, 29.571129, 22.721554, 26.73875, 52.075504, 56.783104, + 94.65493, 61.778534, 85.72401, 85.369514, 29.922367, 41.410553, 94.12884, + 80.276855, 55.604828, 54.70947, 74.07216, 44.61955, 31.38113, 68.48596, 34.56782, + 14.424729, 48.204506, 9.675444, 32.01946, 92.32695, 36.292683, 78.31955, 98.05327, + 14.343918, 46.017002, 95.90888, 82.63626, 16.873539, 3.698051, 7.8042626, + 64.194405, 96.71023, 67.93692, 21.618402, 51.92182, 22.834194, 61.56986, 19.749891, + 55.31206, 38.29552, 67.57593, 67.145836, 38.92673, 94.95708, 72.38746, 90.70901, + 69.43995, 9.394085, 31.646872, 88.20112, 9.134722, 99.98214, 5.423498, 41.51995, + 76.94409, 77.373276, 3.2966614, 9.611201, 57.231106, 30.747868, 76.10228, 91.98308, + 70.893585, 0.9067178, 43.96515, 16.321218, 27.734184, 83.271835, 88.23312, + 87.16445, 5.556643, 15.627432, 58.547127, 93.6459, 40.539192, 49.124157, 91.13276, + 57.485855, 8.827019, 4.9690843, 46.511234, 53.91469, 97.71925, 20.135271, + 23.353004, 70.92099, 93.38748, 87.520134, 51.684677, 29.89813, 9.110392, 65.809204, + 34.16554, 93.398605, 84.58669, 96.409645, 9.876037, 94.767784, 99.21523, 1.9330144, + 94.92429, 75.12728, 17.218828, 97.89164, 35.476578, 77.629456, 69.573746, + 40.200542, 42.117836, 5.861628, 75.45282, 82.73633, 0.98086596, 77.24894, + 11.248695, 61.070026, 52.692616, 80.5449, 80.76036, 29.270136, 67.60252, 48.782394, + 95.18851, 83.47162, 52.068756, 46.66002, 90.12216, 15.515327, 33.694042, 96.963036, + 73.49627, 62.805485, 44.715607, 59.98627, 3.8921833, 37.565327, 29.69184, + 39.429665, 83.46899, 44.286453, 21.54851, 56.096413, 18.169249, 5.214751, + 14.691341, 99.779335, 26.32643, 67.69903, 36.41243, 67.27333, 12.157213, 96.18984, + 2.438283, 78.14289, 0.14715195, 98.769, 53.649532, 21.615898, 39.657497, 95.45616, + 18.578386, 71.47976, 22.348118, 17.85519, 6.3717127, 62.176777, 22.033644, + 23.178005, 79.44858, 89.70233, 37.21273, 71.86182, 21.284317, 52.908623, 30.095518, + 63.64478, 77.55823, 80.04871, 15.133011, 30.439043, 70.16561, 4.4014096, 89.28944, + 26.29093, 46.827854, 11.764729, 61.887516, 47.774887, 57.19503, 59.444664, + 28.592825, 98.70386, 1.2497544, 82.28431, 46.76423, 83.746124, 53.032673, 86.53457, + 99.42168, 90.184, 92.27852, 9.059965, 71.75723, 70.45299, 10.924053, 68.329704, + 77.27232, 6.677854, 75.63629, 57.370533, 17.09031, 10.554659, 99.56178, 37.53221, + 72.311104, 75.7565, 65.2042, 36.096478, 64.69502, 38.88497, 64.33723, 84.87812, + 66.84958, 8.508932, 79.134, 83.431015, 66.72124, 61.801838, 64.30524, 37.194263, + 77.94725, 89.705185, 23.643505, 19.505919, 48.40264, 43.01083, 21.171177, + 18.717121, 10.805857, 69.66983, 77.85261, 57.323063, 3.28964, 38.758026, 5.349946, + 7.46572, 57.485138, 30.822384, 33.9411, 95.53746, 65.57723, 42.1077, 28.591347, + 11.917269, 5.031073, 31.835615, 19.34116, 85.71027, 87.4516, 1.3798475, 70.70583, + 51.988052, 45.217144, 14.308596, 54.557167, 86.18323, 79.13666, 76.866745, + 46.010685, 79.739235, 44.667603, 39.36416, 72.605896, 73.83187, 13.137412, + 6.7911267, 63.952374, 10.082436, 86.00318, 99.760376, 92.84948, 63.786434, + 3.4429908, 18.244314, 75.65299, 14.964747, 70.126366, 80.89449, 91.266655, + 96.58798, 46.439327, 38.253975, 87.31036, 21.093178, 37.19671, 58.28973, 9.75231, + 12.350321, 25.75115, 87.65073, 53.610504, 36.850048, 18.66356, 94.48941, 83.71898, + 44.49315, 44.186737, 19.360733, 84.365974, 46.76272, 44.924366, 50.279808, + 54.868866, 91.33004, 18.683397, 75.13282, 15.070831, 47.04839, 53.780903, + 26.911152, 74.65651, 57.659935, 25.604189, 37.235474, 65.39667, 53.952206, + 40.37131, 59.173275, 96.00756, 54.591274, 10.787476, 69.51549, 31.970142, + 25.408005, 55.972492, 85.01888, 97.48981, 91.006134, 28.98619, 97.151276, + 34.388496, 47.498177, 11.985874, 64.73775, 33.877014, 13.370312, 34.79146, + 86.19321, 15.019405, 94.07832, 93.50433, 60.168625, 50.95409, 38.27827, 47.458614, + 32.83715, 69.54998, 69.0361, 84.1418, 34.270298, 74.23852, 70.707466, 78.59845, + 9.651399, 24.186779, 58.255756, 53.72362, 92.46477, 97.75528, 20.257462, 30.122698, + 50.41517, 28.156603, 42.644154, + ], + }); + + let distance = compare::(256, Metric::L2, &two_vec.v); + + assert_eq!(distance, 429141.2); + } + + fn compare(dim: usize, metric: Metric, v: &[f32]) -> f32 + where + for<'a> [T; N]: FullPrecisionDistance, + { + let a_ptr = v.as_ptr(); + let b_ptr = unsafe { a_ptr.add(dim) }; + + let a_ref = + <&[f32; N]>::try_from(unsafe { std::slice::from_raw_parts(a_ptr, dim) }).unwrap(); + let b_ref = + <&[f32; N]>::try_from(unsafe { std::slice::from_raw_parts(b_ptr, dim) }).unwrap(); + + <[f32; N]>::distance_compare(a_ref, b_ref, metric) + } +} diff --git a/rust/vector/src/distance_test.rs b/rust/vector/src/distance_test.rs new file mode 100644 index 000000000..0def0264a --- /dev/null +++ b/rust/vector/src/distance_test.rs @@ -0,0 +1,152 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[cfg(test)] +mod e2e_test { + + #[repr(C, align(32))] + pub struct F32Slice104([f32; 104]); + + #[repr(C, align(32))] + pub struct F16Slice104([Half; 104]); + + use approx::assert_abs_diff_eq; + + use crate::half::Half; + use crate::l2_float_distance::{distance_l2_vector_f16, distance_l2_vector_f32}; + + fn no_vector_compare_f32(a: &[f32], b: &[f32]) -> f32 { + let mut sum = 0.0; + for i in 0..a.len() { + let a_f32 = a[i]; + let b_f32 = b[i]; + let diff = a_f32 - b_f32; + sum += diff * diff; + } + sum + } + + fn no_vector_compare(a: &[Half], b: &[Half]) -> f32 { + let mut sum = 0.0; + for i in 0..a.len() { + let a_f32 = a[i].to_f32(); + let b_f32 = b[i].to_f32(); + let diff = a_f32 - b_f32; + sum += diff * diff; + } + sum + } + + #[test] + fn avx2_matches_novector() { + for i in 1..3 { + let (f1, f2) = get_test_data(0, i); + + let distance_f32x8 = distance_l2_vector_f32::<104>(&f1.0, &f2.0); + let distance = no_vector_compare_f32(&f1.0, &f2.0); + + assert_abs_diff_eq!(distance, distance_f32x8, epsilon = 1e-6); + } + } + + #[test] + fn avx2_matches_novector_random() { + let (f1, f2) = get_test_data_random(); + + let distance_f32x8 = distance_l2_vector_f32::<104>(&f1.0, &f2.0); + let distance = no_vector_compare_f32(&f1.0, &f2.0); + + assert_abs_diff_eq!(distance, distance_f32x8, epsilon = 1e-4); + } + + #[test] + fn avx_f16_matches_novector() { + for i in 1..3 { + let (f1, f2) = get_test_data_f16(0, i); + let _a_slice = f1.0.map(|x| x.to_f32().to_string()).join(", "); + let _b_slice = f2.0.map(|x| x.to_f32().to_string()).join(", "); + + let expected = no_vector_compare(f1.0[0..].as_ref(), f2.0[0..].as_ref()); + let distance_f16x8 = distance_l2_vector_f16::<104>(&f1.0, &f2.0); + + assert_abs_diff_eq!(distance_f16x8, expected, epsilon = 1e-4); + } + } + + #[test] + fn avx_f16_matches_novector_random() { + let (f1, f2) = get_test_data_f16_random(); + + let expected = no_vector_compare(f1.0[0..].as_ref(), f2.0[0..].as_ref()); + let distance_f16x8 = distance_l2_vector_f16::<104>(&f1.0, &f2.0); + + assert_abs_diff_eq!(distance_f16x8, expected, epsilon = 1e-4); + } + + fn get_test_data_f16(i1: usize, i2: usize) -> (F16Slice104, F16Slice104) { + let (a_slice, b_slice) = get_test_data(i1, i2); + let a_data = a_slice.0.iter().map(|x| Half::from_f32(*x)); + let b_data = b_slice.0.iter().map(|x| Half::from_f32(*x)); + + ( + F16Slice104(a_data.collect::>().try_into().unwrap()), + F16Slice104(b_data.collect::>().try_into().unwrap()), + ) + } + + fn get_test_data(i1: usize, i2: usize) -> (F32Slice104, F32Slice104) { + use base64::{engine::general_purpose, Engine as _}; + + let b64 = general_purpose::STANDARD.decode(TEST_DATA).unwrap(); + + let decoded: Vec> = bincode::deserialize(&b64).unwrap(); + debug_assert!(decoded.len() > i1); + debug_assert!(decoded.len() > i2); + + let mut f1 = F32Slice104([0.0; 104]); + let v1 = &decoded[i1]; + debug_assert!(v1.len() == 104); + f1.0.copy_from_slice(v1); + + let mut f2 = F32Slice104([0.0; 104]); + let v2 = &decoded[i2]; + debug_assert!(v2.len() == 104); + f2.0.copy_from_slice(v2); + + (f1, f2) + } + + fn get_test_data_f16_random() -> (F16Slice104, F16Slice104) { + let (a_slice, b_slice) = get_test_data_random(); + let a_data = a_slice.0.iter().map(|x| Half::from_f32(*x)); + let b_data = b_slice.0.iter().map(|x| Half::from_f32(*x)); + + ( + F16Slice104(a_data.collect::>().try_into().unwrap()), + F16Slice104(b_data.collect::>().try_into().unwrap()), + ) + } + + fn get_test_data_random() -> (F32Slice104, F32Slice104) { + use rand::Rng; + + let mut rng = rand::thread_rng(); + let mut f1 = F32Slice104([0.0; 104]); + + for i in 0..104 { + f1.0[i] = rng.gen_range(-1.0..1.0); + } + + let mut f2 = F32Slice104([0.0; 104]); + + for i in 0..104 { + f2.0[i] = rng.gen_range(-1.0..1.0); + } + + (f1, f2) + } + + const TEST_DATA: &str = "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"; +} + diff --git a/rust/vector/src/half.rs b/rust/vector/src/half.rs new file mode 100644 index 000000000..87d7df6a1 --- /dev/null +++ b/rust/vector/src/half.rs @@ -0,0 +1,82 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use bytemuck::{Pod, Zeroable}; +use half::f16; +use std::convert::AsRef; +use std::fmt; + +// Define the Half type as a new type over f16. +// the memory layout of the Half struct will be the same as the memory layout of the f16 type itself. +// The Half struct serves as a simple wrapper around the f16 type and does not introduce any additional memory overhead. +// Test function: +// use half::f16; +// pub struct Half(f16); +// fn main() { +// let size_of_half = std::mem::size_of::(); +// let alignment_of_half = std::mem::align_of::(); +// println!("Size of Half: {} bytes", size_of_half); +// println!("Alignment of Half: {} bytes", alignment_of_half); +// } +// Output: +// Size of Half: 2 bytes +// Alignment of Half: 2 bytes +pub struct Half(f16); + +unsafe impl Pod for Half {} +unsafe impl Zeroable for Half {} + +// Implement From for Half +impl From for f32 { + fn from(val: Half) -> Self { + val.0.to_f32() + } +} + +// Implement AsRef for Half so that it can be used in distance_compare. +impl AsRef for Half { + fn as_ref(&self) -> &f16 { + &self.0 + } +} + +// Implement From for Half. +impl Half { + pub fn from_f32(value: f32) -> Self { + Self(f16::from_f32(value)) + } +} + +// Implement Default for Half. +impl Default for Half { + fn default() -> Self { + Self(f16::from_f32(Default::default())) + } +} + +// Implement Clone for Half. +impl Clone for Half { + fn clone(&self) -> Self { + Half(self.0) + } +} + +// Implement PartialEq for Half. +impl fmt::Debug for Half { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "Half({:?})", self.0) + } +} + +impl Copy for Half {} + +impl Half { + pub fn to_f32(&self) -> f32 { + self.0.to_f32() + } +} + +unsafe impl Send for Half {} +unsafe impl Sync for Half {} + diff --git a/rust/vector/src/l2_float_distance.rs b/rust/vector/src/l2_float_distance.rs new file mode 100644 index 000000000..b818899bf --- /dev/null +++ b/rust/vector/src/l2_float_distance.rs @@ -0,0 +1,78 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] + +//! Distance calculation for L2 Metric + +#[cfg(not(target_feature = "avx2"))] +compile_error!("Library must be compiled with -C target-feature=+avx2"); + +use std::arch::x86_64::*; + +use crate::Half; + +/// Calculate the distance by vector arithmetic +#[inline(never)] +pub fn distance_l2_vector_f16(a: &[Half; N], b: &[Half; N]) -> f32 { + debug_assert_eq!(N % 8, 0); + + // make sure the addresses are bytes aligned + debug_assert_eq!(a.as_ptr().align_offset(32), 0); + debug_assert_eq!(b.as_ptr().align_offset(32), 0); + + unsafe { + let mut sum = _mm256_setzero_ps(); + let a_ptr = a.as_ptr() as *const __m128i; + let b_ptr = b.as_ptr() as *const __m128i; + + // Iterate over the elements in steps of 8 + for i in (0..N).step_by(8) { + let a_vec = _mm256_cvtph_ps(_mm_load_si128(a_ptr.add(i / 8))); + let b_vec = _mm256_cvtph_ps(_mm_load_si128(b_ptr.add(i / 8))); + + let diff = _mm256_sub_ps(a_vec, b_vec); + sum = _mm256_fmadd_ps(diff, diff, sum); + } + + let x128: __m128 = _mm_add_ps(_mm256_extractf128_ps(sum, 1), _mm256_castps256_ps128(sum)); + /* ( -, -, x1+x3+x5+x7, x0+x2+x4+x6 ) */ + let x64: __m128 = _mm_add_ps(x128, _mm_movehl_ps(x128, x128)); + /* ( -, -, -, x0+x1+x2+x3+x4+x5+x6+x7 ) */ + let x32: __m128 = _mm_add_ss(x64, _mm_shuffle_ps(x64, x64, 0x55)); + /* Conversion to float is a no-op on x86-64 */ + _mm_cvtss_f32(x32) + } +} + +/// Calculate the distance by vector arithmetic +#[inline(never)] +pub fn distance_l2_vector_f32(a: &[f32; N], b: &[f32; N]) -> f32 { + debug_assert_eq!(N % 8, 0); + + // make sure the addresses are bytes aligned + debug_assert_eq!(a.as_ptr().align_offset(32), 0); + debug_assert_eq!(b.as_ptr().align_offset(32), 0); + + unsafe { + let mut sum = _mm256_setzero_ps(); + + // Iterate over the elements in steps of 8 + for i in (0..N).step_by(8) { + let a_vec = _mm256_load_ps(&a[i]); + let b_vec = _mm256_load_ps(&b[i]); + let diff = _mm256_sub_ps(a_vec, b_vec); + sum = _mm256_fmadd_ps(diff, diff, sum); + } + + let x128: __m128 = _mm_add_ps(_mm256_extractf128_ps(sum, 1), _mm256_castps256_ps128(sum)); + /* ( -, -, x1+x3+x5+x7, x0+x2+x4+x6 ) */ + let x64: __m128 = _mm_add_ps(x128, _mm_movehl_ps(x128, x128)); + /* ( -, -, -, x0+x1+x2+x3+x4+x5+x6+x7 ) */ + let x32: __m128 = _mm_add_ss(x64, _mm_shuffle_ps(x64, x64, 0x55)); + /* Conversion to float is a no-op on x86-64 */ + _mm_cvtss_f32(x32) + } +} + diff --git a/rust/vector/src/lib.rs b/rust/vector/src/lib.rs new file mode 100644 index 000000000..d221070b5 --- /dev/null +++ b/rust/vector/src/lib.rs @@ -0,0 +1,26 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![cfg_attr( + not(test), + warn(clippy::panic, clippy::unwrap_used, clippy::expect_used) +)] + +// #![feature(stdsimd)] +// mod f32x16; +// Uncomment above 2 to experiment with f32x16 +mod distance; +mod half; +mod l2_float_distance; +mod metric; +mod utils; + +pub use crate::half::Half; +pub use distance::FullPrecisionDistance; +pub use metric::Metric; +pub use utils::prefetch_vector; + +#[cfg(test)] +mod distance_test; +mod test_util; diff --git a/rust/vector/src/metric.rs b/rust/vector/src/metric.rs new file mode 100644 index 000000000..c60ef291b --- /dev/null +++ b/rust/vector/src/metric.rs @@ -0,0 +1,36 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#![warn(missing_debug_implementations, missing_docs)] +use std::str::FromStr; + +/// Distance metric +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum Metric { + /// Squared Euclidean (L2-Squared) + L2, + + /// Cosine similarity + /// TODO: T should be float for Cosine distance + Cosine, +} + +#[derive(thiserror::Error, Debug)] +pub enum ParseMetricError { + #[error("Invalid format for Metric: {0}")] + InvalidFormat(String), +} + +impl FromStr for Metric { + type Err = ParseMetricError; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "l2" => Ok(Metric::L2), + "cosine" => Ok(Metric::Cosine), + _ => Err(ParseMetricError::InvalidFormat(String::from(s))), + } + } +} + diff --git a/rust/vector/src/test_util.rs b/rust/vector/src/test_util.rs new file mode 100644 index 000000000..7cfc92985 --- /dev/null +++ b/rust/vector/src/test_util.rs @@ -0,0 +1,29 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +#[cfg(test)] +use crate::Half; + +#[cfg(test)] +pub fn no_vector_compare_f16(a: &[Half], b: &[Half]) -> f32 { + let mut sum = 0.0; + debug_assert_eq!(a.len(), b.len()); + + for i in 0..a.len() { + sum += (a[i].to_f32() - b[i].to_f32()).powi(2); + } + sum +} + +#[cfg(test)] +pub fn no_vector_compare_f32(a: &[f32], b: &[f32]) -> f32 { + let mut sum = 0.0; + debug_assert_eq!(a.len(), b.len()); + + for i in 0..a.len() { + sum += (a[i] - b[i]).powi(2); + } + sum +} + diff --git a/rust/vector/src/utils.rs b/rust/vector/src/utils.rs new file mode 100644 index 000000000..a61c99aad --- /dev/null +++ b/rust/vector/src/utils.rs @@ -0,0 +1,21 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::arch::x86_64::{_mm_prefetch, _MM_HINT_T0}; + +/// Prefetch the given vector in chunks of 64 bytes, which is a cache line size +/// NOTE: good efficiency when total_vec_size is integral multiple of 64 +#[inline] +pub fn prefetch_vector(vec: &[T]) { + let vec_ptr = vec.as_ptr() as *const i8; + let vecsize = std::mem::size_of_val(vec); + let max_prefetch_size = (vecsize / 64) * 64; + + for d in (0..max_prefetch_size).step_by(64) { + unsafe { + _mm_prefetch(vec_ptr.add(d), _MM_HINT_T0); + } + } +} + diff --git a/rust/vector_base64/Cargo.toml b/rust/vector_base64/Cargo.toml new file mode 100644 index 000000000..6f50ad96e --- /dev/null +++ b/rust/vector_base64/Cargo.toml @@ -0,0 +1,15 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT license. +[package] +name = "vector_base64" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +base64 = "0.21.2" +bincode = "1.3.3" +half = "2.2.1" +serde = "1.0.163" + diff --git a/rust/vector_base64/src/main.rs b/rust/vector_base64/src/main.rs new file mode 100644 index 000000000..2867436a9 --- /dev/null +++ b/rust/vector_base64/src/main.rs @@ -0,0 +1,82 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT license. + */ +use std::fs::File; +use std::io::{self, BufReader, Read}; +use std::{env, vec}; + +fn main() -> io::Result<()> { + // Retrieve command-line arguments + let args: Vec = env::args().collect(); + + // Check if the correct number of arguments is provided + if args.len() != 4 { + print_usage(); + return Ok(()); + } + + // Retrieve the input and output file paths from the arguments + let input_file_path = &args[1]; + let item_count: usize = args[2].parse::().unwrap(); + let return_dimension: usize = args[3].parse::().unwrap(); + + // Open the input file for reading + let mut input_file = BufReader::new(File::open(input_file_path)?); + + // Read the first 8 bytes as metadata + let mut metadata = [0; 8]; + input_file.read_exact(&mut metadata)?; + + // Extract the number of points and dimension from the metadata + let _ = i32::from_le_bytes(metadata[..4].try_into().unwrap()); + let mut dimension: usize = (i32::from_le_bytes(metadata[4..].try_into().unwrap())) as usize; + if return_dimension < dimension { + dimension = return_dimension; + } + + let mut float_array = Vec::>::with_capacity(item_count); + + // Process each data point + for _ in 0..item_count { + // Read one data point from the input file + let mut buffer = vec![0; dimension * std::mem::size_of::()]; + match input_file.read_exact(&mut buffer) { + Ok(()) => { + let mut float_data = buffer + .chunks_exact(4) + .map(|chunk| f32::from_le_bytes([chunk[0], chunk[1], chunk[2], chunk[3]])) + .collect::>(); + + let mut i = return_dimension; + while i > dimension { + float_data.push(0.0); + i -= 1; + } + + float_array.push(float_data); + } + Err(err) => { + println!("Error: {}", err); + break; + } + } + } + + use base64::{engine::general_purpose, Engine as _}; + + let encoded: Vec = bincode::serialize(&float_array).unwrap(); + let b64 = general_purpose::STANDARD.encode(encoded); + println!("Float {}", b64); + + Ok(()) +} + +/// Prints the usage information +fn print_usage() { + println!("Usage: program_name input_file "); + println!( + "Itemcount is the number of items to convert. Expand to dimension if provided is smaller" + ); +} + diff --git a/scripts/dev/install-dev-deps-ubuntu.bash b/scripts/dev/install-dev-deps-ubuntu.bash new file mode 100755 index 000000000..84f558ed6 --- /dev/null +++ b/scripts/dev/install-dev-deps-ubuntu.bash @@ -0,0 +1,12 @@ +#!/bin/bash + +apt install cmake \ + g++ \ + libaio-dev \ + libgoogle-perftools-dev \ + libunwind-dev \ + clang-format \ + libboost-dev \ + libboost-program-options-dev \ + libboost-test-dev \ + libmkl-full-dev \ No newline at end of file diff --git a/setup.py b/setup.py index dc453fcb2..ff5bed187 100644 --- a/setup.py +++ b/setup.py @@ -3,13 +3,14 @@ import os import re +import shutil import subprocess import sys from pathlib import Path -from typing import List from setuptools import Extension, setup from setuptools.command.build_ext import build_ext +from setuptools.command.install_lib import install_lib # Convert distutils Windows platform specifiers to CMake -A arguments PLAT_TO_CMAKE = { @@ -45,7 +46,7 @@ def build_extension(self, ext: CMakeExtension) -> None: f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={extdir}{os.sep}", f"-DPYTHON_EXECUTABLE={sys.executable}", f"-DCMAKE_BUILD_TYPE={cfg}", # not used on MSVC, but no harm - f"-DVERSION_INFO={self.distribution.get_version()}" # commented out because we want this set in the CMake file + f"-DVERSION_INFO={self.distribution.get_version()}" # commented out, we want this set in the CMake file ] build_args = [] # Adding CMake arguments set as environment variable @@ -126,8 +127,43 @@ def build_extension(self, ext: CMakeExtension) -> None: ) +class InstallCMakeLibs(install_lib): + def run(self): + """ + Windows only copy from the x64/Release directory and place them in the package + """ + + self.announce("Moving library files", level=3) + + self.skip_build = True + + # we only need to move the windows build output + windows_build_output_dir = Path('.') / 'x64' / 'Release' + + if windows_build_output_dir.exists(): + libs = [ + os.path.join(windows_build_output_dir, _lib) for _lib in + os.listdir(windows_build_output_dir) if + os.path.isfile(os.path.join(windows_build_output_dir, _lib)) and + os.path.splitext(_lib)[1] in [".dll", '.lib', '.pyd', '.exp'] + ] + + for lib in libs: + shutil.move( + lib, + os.path.join(self.build_dir, 'diskannpy', os.path.basename(lib)) + ) + + super().run() + + setup( - ext_modules=[CMakeExtension("diskannpy", ".")], - cmdclass={"build_ext": CMakeBuild}, - zip_safe=False + ext_modules=[CMakeExtension("diskannpy._diskannpy", ".")], + cmdclass={ + "build_ext": CMakeBuild, + 'install_lib': InstallCMakeLibs + }, + zip_safe=False, + package_dir={"diskannpy": "python/src"}, + exclude_package_data={"diskannpy": ["diskann_bindings.cpp"]} ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d993ccc69..2206a01f7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,20 +1,26 @@ #Copyright(c) Microsoft Corporation.All rights reserved. #Licensed under the MIT license. -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_COMPILE_WARNING_AS_ERROR ON) if(MSVC) add_subdirectory(dll) else() #file(GLOB CPP_SOURCES *.cpp) - set(CPP_SOURCES ann_exception.cpp disk_utils.cpp distance.cpp index.cpp + set(CPP_SOURCES abstract_data_store.cpp ann_exception.cpp disk_utils.cpp + distance.cpp index.cpp in_mem_graph_store.cpp in_mem_data_store.cpp linux_aligned_file_reader.cpp math_utils.cpp natural_number_map.cpp + in_mem_data_store.cpp in_mem_graph_store.cpp natural_number_set.cpp memory_mapper.cpp partition.cpp pq.cpp - pq_flash_index.cpp scratch.cpp logger.cpp utils.cpp) + pq_flash_index.cpp scratch.cpp logger.cpp utils.cpp filter_utils.cpp index_factory.cpp abstract_index.cpp) if (RESTAPI) list(APPEND CPP_SOURCES restapi/search_wrapper.cpp restapi/server.cpp) endif() add_library(${PROJECT_NAME} ${CPP_SOURCES}) add_library(${PROJECT_NAME}_s STATIC ${CPP_SOURCES}) endif() -install() + +if (NOT MSVC) + install(TARGETS ${PROJECT_NAME} LIBRARY) +endif() diff --git a/src/abstract_data_store.cpp b/src/abstract_data_store.cpp new file mode 100644 index 000000000..a980bd545 --- /dev/null +++ b/src/abstract_data_store.cpp @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include + +#include "abstract_data_store.h" + +namespace diskann +{ + +template +AbstractDataStore::AbstractDataStore(const location_t capacity, const size_t dim) + : _capacity(capacity), _dim(dim) +{ +} + +template location_t AbstractDataStore::capacity() const +{ + return _capacity; +} + +template size_t AbstractDataStore::get_dims() const +{ + return _dim; +} + +template location_t AbstractDataStore::resize(const location_t new_num_points) +{ + if (new_num_points > _capacity) + { + return expand(new_num_points); + } + else if (new_num_points < _capacity) + { + return shrink(new_num_points); + } + else + { + return _capacity; + } +} + +template DISKANN_DLLEXPORT class AbstractDataStore; +template DISKANN_DLLEXPORT class AbstractDataStore; +template DISKANN_DLLEXPORT class AbstractDataStore; +} // namespace diskann diff --git a/src/abstract_index.cpp b/src/abstract_index.cpp new file mode 100644 index 000000000..518f8b7dd --- /dev/null +++ b/src/abstract_index.cpp @@ -0,0 +1,280 @@ +#include "common_includes.h" +#include "windows_customizations.h" +#include "abstract_index.h" + +namespace diskann +{ + +template +void AbstractIndex::build(const data_type *data, const size_t num_points_to_load, + const IndexWriteParameters ¶meters, const std::vector &tags) +{ + auto any_data = std::any(data); + auto any_tags_vec = TagVector(tags); + this->_build(any_data, num_points_to_load, parameters, any_tags_vec); +} + +template +std::pair AbstractIndex::search(const data_type *query, const size_t K, const uint32_t L, + IDType *indices, float *distances) +{ + auto any_indices = std::any(indices); + auto any_query = std::any(query); + return _search(any_query, K, L, any_indices, distances); +} + +template +size_t AbstractIndex::search_with_tags(const data_type *query, const uint64_t K, const uint32_t L, tag_type *tags, + float *distances, std::vector &res_vectors) +{ + auto any_query = std::any(query); + auto any_tags = std::any(tags); + auto any_res_vectors = DataVector(res_vectors); + return this->_search_with_tags(any_query, K, L, any_tags, distances, any_res_vectors); +} + +template +std::pair AbstractIndex::search_with_filters(const DataType &query, const std::string &raw_label, + const size_t K, const uint32_t L, IndexType *indices, + float *distances) +{ + auto any_indices = std::any(indices); + return _search_with_filters(query, raw_label, K, L, any_indices, distances); +} + +template +void AbstractIndex::search_with_optimized_layout(const data_type *query, size_t K, size_t L, uint32_t *indices) +{ + auto any_query = std::any(query); + this->_search_with_optimized_layout(any_query, K, L, indices); +} + +template +int AbstractIndex::insert_point(const data_type *point, const tag_type tag) +{ + auto any_point = std::any(point); + auto any_tag = std::any(tag); + return this->_insert_point(any_point, any_tag); +} + +template int AbstractIndex::lazy_delete(const tag_type &tag) +{ + auto any_tag = std::any(tag); + return this->_lazy_delete(any_tag); +} + +template +void AbstractIndex::lazy_delete(const std::vector &tags, std::vector &failed_tags) +{ + auto any_tags = TagVector(tags); + auto any_failed_tags = TagVector(failed_tags); + this->_lazy_delete(any_tags, any_failed_tags); +} + +template void AbstractIndex::get_active_tags(tsl::robin_set &active_tags) +{ + auto any_active_tags = TagRobinSet(active_tags); + this->_get_active_tags(any_active_tags); +} + +template void AbstractIndex::set_start_points_at_random(data_type radius, uint32_t random_seed) +{ + auto any_radius = std::any(radius); + this->_set_start_points_at_random(any_radius, random_seed); +} + +template int AbstractIndex::get_vector_by_tag(tag_type &tag, data_type *vec) +{ + auto any_tag = std::any(tag); + auto any_data_ptr = std::any(vec); + return this->_get_vector_by_tag(any_tag, any_data_ptr); +} + +// exports +template DISKANN_DLLEXPORT void AbstractIndex::build(const float *data, const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const int8_t *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const uint8_t *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const float *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const int8_t *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const uint8_t *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const float *data, const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const int8_t *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const uint8_t *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const float *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const int8_t *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); +template DISKANN_DLLEXPORT void AbstractIndex::build(const uint8_t *data, + const size_t num_points_to_load, + const IndexWriteParameters ¶meters, + const std::vector &tags); + +template DISKANN_DLLEXPORT std::pair AbstractIndex::search( + const float *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); +template DISKANN_DLLEXPORT std::pair AbstractIndex::search( + const uint8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); +template DISKANN_DLLEXPORT std::pair AbstractIndex::search( + const int8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); + +template DISKANN_DLLEXPORT std::pair AbstractIndex::search( + const float *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); +template DISKANN_DLLEXPORT std::pair AbstractIndex::search( + const uint8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); +template DISKANN_DLLEXPORT std::pair AbstractIndex::search( + const int8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); + +template DISKANN_DLLEXPORT std::pair AbstractIndex::search_with_filters( + const DataType &query, const std::string &raw_label, const size_t K, const uint32_t L, uint32_t *indices, + float *distances); + +template DISKANN_DLLEXPORT std::pair AbstractIndex::search_with_filters( + const DataType &query, const std::string &raw_label, const size_t K, const uint32_t L, uint64_t *indices, + float *distances); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags(const float *query, const uint64_t K, + const uint32_t L, int32_t *tags, + float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t +AbstractIndex::search_with_tags(const uint8_t *query, const uint64_t K, const uint32_t L, + int32_t *tags, float *distances, std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags(const int8_t *query, + const uint64_t K, const uint32_t L, + int32_t *tags, float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags(const float *query, const uint64_t K, + const uint32_t L, uint32_t *tags, + float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags( + const uint8_t *query, const uint64_t K, const uint32_t L, uint32_t *tags, float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags(const int8_t *query, + const uint64_t K, const uint32_t L, + uint32_t *tags, float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags(const float *query, const uint64_t K, + const uint32_t L, int64_t *tags, + float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t +AbstractIndex::search_with_tags(const uint8_t *query, const uint64_t K, const uint32_t L, + int64_t *tags, float *distances, std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags(const int8_t *query, + const uint64_t K, const uint32_t L, + int64_t *tags, float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags(const float *query, const uint64_t K, + const uint32_t L, uint64_t *tags, + float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags( + const uint8_t *query, const uint64_t K, const uint32_t L, uint64_t *tags, float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT size_t AbstractIndex::search_with_tags(const int8_t *query, + const uint64_t K, const uint32_t L, + uint64_t *tags, float *distances, + std::vector &res_vectors); + +template DISKANN_DLLEXPORT void AbstractIndex::search_with_optimized_layout(const float *query, size_t K, + size_t L, uint32_t *indices); +template DISKANN_DLLEXPORT void AbstractIndex::search_with_optimized_layout(const uint8_t *query, size_t K, + size_t L, uint32_t *indices); +template DISKANN_DLLEXPORT void AbstractIndex::search_with_optimized_layout(const int8_t *query, size_t K, + size_t L, uint32_t *indices); + +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const float *point, const int32_t tag); +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const uint8_t *point, const int32_t tag); +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const int8_t *point, const int32_t tag); + +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const float *point, const uint32_t tag); +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const uint8_t *point, const uint32_t tag); +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const int8_t *point, const uint32_t tag); + +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const float *point, const int64_t tag); +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const uint8_t *point, const int64_t tag); +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const int8_t *point, const int64_t tag); + +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const float *point, const uint64_t tag); +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const uint8_t *point, const uint64_t tag); +template DISKANN_DLLEXPORT int AbstractIndex::insert_point(const int8_t *point, const uint64_t tag); + +template DISKANN_DLLEXPORT int AbstractIndex::lazy_delete(const int32_t &tag); +template DISKANN_DLLEXPORT int AbstractIndex::lazy_delete(const uint32_t &tag); +template DISKANN_DLLEXPORT int AbstractIndex::lazy_delete(const int64_t &tag); +template DISKANN_DLLEXPORT int AbstractIndex::lazy_delete(const uint64_t &tag); + +template DISKANN_DLLEXPORT void AbstractIndex::lazy_delete(const std::vector &tags, + std::vector &failed_tags); +template DISKANN_DLLEXPORT void AbstractIndex::lazy_delete(const std::vector &tags, + std::vector &failed_tags); +template DISKANN_DLLEXPORT void AbstractIndex::lazy_delete(const std::vector &tags, + std::vector &failed_tags); +template DISKANN_DLLEXPORT void AbstractIndex::lazy_delete(const std::vector &tags, + std::vector &failed_tags); + +template DISKANN_DLLEXPORT void AbstractIndex::get_active_tags(tsl::robin_set &active_tags); +template DISKANN_DLLEXPORT void AbstractIndex::get_active_tags(tsl::robin_set &active_tags); +template DISKANN_DLLEXPORT void AbstractIndex::get_active_tags(tsl::robin_set &active_tags); +template DISKANN_DLLEXPORT void AbstractIndex::get_active_tags(tsl::robin_set &active_tags); + +template DISKANN_DLLEXPORT void AbstractIndex::set_start_points_at_random(float radius, uint32_t random_seed); +template DISKANN_DLLEXPORT void AbstractIndex::set_start_points_at_random(uint8_t radius, + uint32_t random_seed); +template DISKANN_DLLEXPORT void AbstractIndex::set_start_points_at_random(int8_t radius, uint32_t random_seed); + +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(int32_t &tag, float *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(int32_t &tag, uint8_t *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(int32_t &tag, int8_t *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(uint32_t &tag, float *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(uint32_t &tag, uint8_t *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(uint32_t &tag, int8_t *vec); + +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(int64_t &tag, float *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(int64_t &tag, uint8_t *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(int64_t &tag, int8_t *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(uint64_t &tag, float *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(uint64_t &tag, uint8_t *vec); +template DISKANN_DLLEXPORT int AbstractIndex::get_vector_by_tag(uint64_t &tag, int8_t *vec); + +} // namespace diskann diff --git a/src/ann_exception.cpp b/src/ann_exception.cpp index 7ba70a6d9..ba55e3655 100644 --- a/src/ann_exception.cpp +++ b/src/ann_exception.cpp @@ -18,7 +18,7 @@ std::string package_string(const std::string &item_name, const std::string &item } ANNException::ANNException(const std::string &message, int errorCode, const std::string &funcSig, - const std::string &fileName, unsigned lineNum) + const std::string &fileName, uint32_t lineNum) : ANNException(package_string(std::string("FUNC"), funcSig) + package_string(std::string("FILE"), fileName) + package_string(std::string("LINE"), std::to_string(lineNum)) + " " + message, errorCode) @@ -26,7 +26,7 @@ ANNException::ANNException(const std::string &message, int errorCode, const std: } FileException::FileException(const std::string &filename, std::system_error &e, const std::string &funcSig, - const std::string &fileName, unsigned int lineNum) + const std::string &fileName, uint32_t lineNum) : ANNException(std::string(" While opening file \'") + filename + std::string("\', error code: ") + std::to_string(e.code().value()) + " " + e.code().message(), e.code().value(), funcSig, fileName, lineNum) diff --git a/src/disk_utils.cpp b/src/disk_utils.cpp index a2372abc3..08adb186c 100644 --- a/src/disk_utils.cpp +++ b/src/disk_utils.cpp @@ -24,9 +24,9 @@ namespace diskann 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); + std::unique_ptr metadata; + uint64_t nr, nc; + diskann::load_bin(index_file, metadata, nr, nc); if (nc != 1) { std::stringstream stream; @@ -34,9 +34,9 @@ void add_new_file_to_single_index(std::string index_file, std::string new_file) throw diskann::ANNException(stream.str(), -1); } size_t index_ending_offset = metadata[nr - 1]; - _u64 read_blk_size = 64 * 1024 * 1024; + size_t read_blk_size = 64 * 1024 * 1024; cached_ofstream writer(index_file, read_blk_size); - _u64 check_file_size = get_file_size(index_file); + size_t check_file_size = get_file_size(index_file); if (check_file_size != index_ending_offset) { std::stringstream stream; @@ -57,7 +57,7 @@ void add_new_file_to_single_index(std::string index_file, std::string new_file) 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++) + for (uint64_t 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; @@ -68,12 +68,12 @@ void add_new_file_to_single_index(std::string index_file, std::string new_file) // writer.close(); delete[] dump; - std::vector<_u64> new_meta; - for (_u64 i = 0; i < nr; i++) + std::vector new_meta; + for (uint64_t 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); + diskann::save_bin(index_file, new_meta.data(), new_meta.size(), 1); } double get_memory_budget(double search_ram_budget) @@ -96,7 +96,7 @@ double get_memory_budget(const std::string &mem_budget_str) size_t calculate_num_pq_chunks(double final_index_ram_limit, size_t points_num, uint32_t dim, const std::vector ¶m_list) { - size_t num_pq_chunks = (size_t)(std::floor)(_u64(final_index_ram_limit / (double)points_num)); + size_t num_pq_chunks = (size_t)(std::floor)(uint64_t(final_index_ram_limit / (double)points_num)); diskann::cout << "Calculated num_pq_chunks :" << num_pq_chunks << std::endl; if (param_list.size() >= 6) { @@ -217,7 +217,7 @@ T *load_warmup(const std::string &cache_warmup_file, uint64_t &warmup_num, uint6 Support for Merging Many Vamana Indices ***************************************************/ -void read_idmap(const std::string &fname, std::vector &ivecs) +void read_idmap(const std::string &fname, std::vector &ivecs) { uint32_t npts32, dim; size_t actual_file_size = get_file_size(fname); @@ -239,27 +239,27 @@ void read_idmap(const std::string &fname, std::vector &ivecs) } int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suffix, const std::string &idmaps_prefix, - const std::string &idmaps_suffix, const _u64 nshards, unsigned max_degree, + const std::string &idmaps_suffix, const uint64_t nshards, uint32_t max_degree, const std::string &output_vamana, const std::string &medoids_file, bool use_filters, const std::string &labels_to_medoids_file) { // Read ID maps std::vector vamana_names(nshards); - std::vector> idmaps(nshards); - for (_u64 shard = 0; shard < nshards; shard++) + std::vector> idmaps(nshards); + for (uint64_t shard = 0; shard < nshards; shard++) { vamana_names[shard] = vamana_prefix + std::to_string(shard) + vamana_suffix; read_idmap(idmaps_prefix + std::to_string(shard) + idmaps_suffix, idmaps[shard]); } // find max node id - _u64 nnodes = 0; - _u64 nelems = 0; + size_t nnodes = 0; + size_t nelems = 0; for (auto &idmap : idmaps) { for (auto &id : idmap) { - nnodes = std::max(nnodes, (_u64)id); + nnodes = std::max(nnodes, (size_t)id); } nelems += idmap.size(); } @@ -267,15 +267,15 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf diskann::cout << "# nodes: " << nnodes << ", max. degree: " << max_degree << std::endl; // compute inverse map: node -> shards - std::vector> node_shard; + std::vector> node_shard; node_shard.reserve(nelems); - for (_u64 shard = 0; shard < nshards; shard++) + for (size_t shard = 0; shard < nshards; shard++) { diskann::cout << "Creating inverse map -- shard #" << shard << std::endl; - for (_u64 idx = 0; idx < idmaps[shard].size(); idx++) + for (size_t idx = 0; idx < idmaps[shard].size(); idx++) { - _u64 node_id = idmaps[shard][idx]; - node_shard.push_back(std::make_pair((_u32)node_id, (_u32)shard)); + size_t node_id = idmaps[shard][idx]; + node_shard.push_back(std::make_pair((uint32_t)node_id, (uint32_t)shard)); } } std::sort(node_shard.begin(), node_shard.end(), [](const auto &left, const auto &right) { @@ -287,29 +287,29 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf // combined file if (use_filters) { - std::unordered_map> global_label_to_medoids; + std::unordered_map> global_label_to_medoids; - for (_u64 i = 0; i < nshards; i++) + for (size_t i = 0; i < nshards; i++) { std::ifstream mapping_reader; std::string map_file = vamana_names[i] + "_labels_to_medoids.txt"; mapping_reader.open(map_file); std::string line, token; - unsigned line_cnt = 0; + uint32_t line_cnt = 0; while (std::getline(mapping_reader, line)) { std::istringstream iss(line); - _u32 cnt = 0; - _u32 medoid; - _u32 label; + uint32_t cnt = 0; + uint32_t medoid = 0; + uint32_t label = 0; while (std::getline(iss, token, ',')) { token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); - unsigned token_as_num = std::stoul(token); + uint32_t token_as_num = std::stoul(token); if (cnt == 0) label = token_as_num; @@ -329,7 +329,7 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf { mapping_writer << iter.first << ", "; auto &vec = iter.second; - for (_u32 idx = 0; idx < vec.size() - 1; idx++) + for (uint32_t idx = 0; idx < vec.size() - 1; idx++) { mapping_writer << vec[idx] << ", "; } @@ -340,7 +340,7 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf // create cached vamana readers std::vector vamana_readers(nshards); - for (_u64 i = 0; i < nshards; i++) + for (size_t i = 0; i < nshards; i++) { vamana_readers[i].open(vamana_names[i], BUFFER_SIZE_FOR_CACHED_IO); size_t expected_file_size; @@ -348,8 +348,8 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf } size_t vamana_metadata_size = - sizeof(_u64) + sizeof(_u32) + sizeof(_u32) + sizeof(_u64); // expected file size + max degree + medoid_id + - // frozen_point info + sizeof(uint64_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint64_t); // expected file size + max degree + + // medoid_id + frozen_point info // create cached vamana writers cached_ofstream merged_vamana_writer(output_vamana, BUFFER_SIZE_FOR_CACHED_IO); @@ -360,34 +360,34 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf merged_vamana_writer.write((char *)&merged_index_size, sizeof(uint64_t)); // we will overwrite the index size at the end - unsigned output_width = max_degree; - unsigned max_input_width = 0; - // read width from each vamana to advance buffer by sizeof(unsigned) bytes + uint32_t output_width = max_degree; + uint32_t max_input_width = 0; + // read width from each vamana to advance buffer by sizeof(uint32_t) bytes for (auto &reader : vamana_readers) { - unsigned input_width; - reader.read((char *)&input_width, sizeof(unsigned)); + uint32_t input_width; + reader.read((char *)&input_width, sizeof(uint32_t)); max_input_width = input_width > max_input_width ? input_width : max_input_width; } diskann::cout << "Max input width: " << max_input_width << ", output width: " << output_width << std::endl; - merged_vamana_writer.write((char *)&output_width, sizeof(unsigned)); + merged_vamana_writer.write((char *)&output_width, sizeof(uint32_t)); std::ofstream medoid_writer(medoids_file.c_str(), std::ios::binary); - _u32 nshards_u32 = (_u32)nshards; - _u32 one_val = 1; + uint32_t nshards_u32 = (uint32_t)nshards; + uint32_t one_val = 1; medoid_writer.write((char *)&nshards_u32, sizeof(uint32_t)); medoid_writer.write((char *)&one_val, sizeof(uint32_t)); - _u64 vamana_index_frozen = 0; // as of now the functionality to merge many overlapping vamana - // indices is supported only for bulk indices without frozen point. - // Hence the final index will also not have any frozen points. - for (_u64 shard = 0; shard < nshards; shard++) + uint64_t vamana_index_frozen = 0; // as of now the functionality to merge many overlapping vamana + // indices is supported only for bulk indices without frozen point. + // Hence the final index will also not have any frozen points. + for (uint64_t shard = 0; shard < nshards; shard++) { - unsigned medoid; + uint32_t medoid; // read medoid - vamana_readers[shard].read((char *)&medoid, sizeof(unsigned)); - vamana_readers[shard].read((char *)&vamana_index_frozen, sizeof(_u64)); + vamana_readers[shard].read((char *)&medoid, sizeof(uint32_t)); + vamana_readers[shard].read((char *)&vamana_index_frozen, sizeof(uint64_t)); assert(vamana_index_frozen == false); // rename medoid medoid = idmaps[shard][medoid]; @@ -395,9 +395,9 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf medoid_writer.write((char *)&medoid, sizeof(uint32_t)); // write renamed medoid if (shard == (nshards - 1)) //--> uncomment if running hierarchical - merged_vamana_writer.write((char *)&medoid, sizeof(unsigned)); + merged_vamana_writer.write((char *)&medoid, sizeof(uint32_t)); } - merged_vamana_writer.write((char *)&merged_index_frozen, sizeof(_u64)); + merged_vamana_writer.write((char *)&merged_index_frozen, sizeof(uint64_t)); medoid_writer.close(); diskann::cout << "Starting merge" << std::endl; @@ -407,23 +407,23 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf std::mt19937 urng(rng()); std::vector nhood_set(nnodes, 0); - std::vector final_nhood; + std::vector final_nhood; - unsigned nnbrs = 0, shard_nnbrs = 0; - unsigned cur_id = 0; + uint32_t nnbrs = 0, shard_nnbrs = 0; + uint32_t cur_id = 0; for (const auto &id_shard : node_shard) { - unsigned node_id = id_shard.first; - unsigned shard_id = id_shard.second; + uint32_t node_id = id_shard.first; + uint32_t shard_id = id_shard.second; if (cur_id < node_id) { // Gopal. random_shuffle() is deprecated. std::shuffle(final_nhood.begin(), final_nhood.end(), urng); - nnbrs = (unsigned)(std::min)(final_nhood.size(), (uint64_t)max_degree); + nnbrs = (uint32_t)(std::min)(final_nhood.size(), (uint64_t)max_degree); // write into merged ofstream - merged_vamana_writer.write((char *)&nnbrs, sizeof(unsigned)); - merged_vamana_writer.write((char *)final_nhood.data(), nnbrs * sizeof(unsigned)); - merged_index_size += (sizeof(unsigned) + nnbrs * sizeof(unsigned)); + merged_vamana_writer.write((char *)&nnbrs, sizeof(uint32_t)); + merged_vamana_writer.write((char *)final_nhood.data(), nnbrs * sizeof(uint32_t)); + merged_index_size += (sizeof(uint32_t) + nnbrs * sizeof(uint32_t)); if (cur_id % 499999 == 1) { diskann::cout << "." << std::flush; @@ -435,18 +435,18 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf final_nhood.clear(); } // read from shard_id ifstream - vamana_readers[shard_id].read((char *)&shard_nnbrs, sizeof(unsigned)); + vamana_readers[shard_id].read((char *)&shard_nnbrs, sizeof(uint32_t)); if (shard_nnbrs == 0) { diskann::cout << "WARNING: shard #" << shard_id << ", node_id " << node_id << " has 0 nbrs" << std::endl; } - std::vector shard_nhood(shard_nnbrs); + std::vector shard_nhood(shard_nnbrs); if (shard_nnbrs > 0) - vamana_readers[shard_id].read((char *)shard_nhood.data(), shard_nnbrs * sizeof(unsigned)); + vamana_readers[shard_id].read((char *)shard_nhood.data(), shard_nnbrs * sizeof(uint32_t)); // rename nodes - for (_u64 j = 0; j < shard_nnbrs; j++) + for (uint64_t j = 0; j < shard_nnbrs; j++) { if (nhood_set[idmaps[shard_id][shard_nhood[j]]] == 0) { @@ -458,14 +458,14 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf // Gopal. random_shuffle() is deprecated. std::shuffle(final_nhood.begin(), final_nhood.end(), urng); - nnbrs = (unsigned)(std::min)(final_nhood.size(), (uint64_t)max_degree); + nnbrs = (uint32_t)(std::min)(final_nhood.size(), (uint64_t)max_degree); // write into merged ofstream - merged_vamana_writer.write((char *)&nnbrs, sizeof(unsigned)); + merged_vamana_writer.write((char *)&nnbrs, sizeof(uint32_t)); if (nnbrs > 0) { - merged_vamana_writer.write((char *)final_nhood.data(), nnbrs * sizeof(unsigned)); + merged_vamana_writer.write((char *)final_nhood.data(), nnbrs * sizeof(uint32_t)); } - merged_index_size += (sizeof(unsigned) + nnbrs * sizeof(unsigned)); + merged_index_size += (sizeof(uint32_t) + nnbrs * sizeof(uint32_t)); for (auto &p : final_nhood) nhood_set[p] = 0; final_nhood.clear(); @@ -488,32 +488,32 @@ int merge_shards(const std::string &vamana_prefix, const std::string &vamana_suf the new nodes at the end. The dummy map contains the real graph id of the new nodes added to the graph */ template -void breakup_dense_points(const std::string data_file, const std::string labels_file, _u32 density, +void breakup_dense_points(const std::string data_file, const std::string labels_file, uint32_t density, const std::string out_data_file, const std::string out_labels_file, const std::string out_metadata_file) { std::string token, line; std::ifstream labels_stream(labels_file); T *data; - _u64 npts, ndims; + uint64_t npts, ndims; diskann::load_bin(data_file, data, npts, ndims); - std::unordered_map<_u32, _u32> dummy_pt_ids; - _u32 next_dummy_id = (_u32)npts; + std::unordered_map dummy_pt_ids; + uint32_t next_dummy_id = (uint32_t)npts; - _u32 point_cnt = 0; + uint32_t point_cnt = 0; std::vector> labels_per_point; labels_per_point.resize(npts); - _u32 dense_pts = 0; + uint32_t dense_pts = 0; if (labels_stream.is_open()) { while (getline(labels_stream, line)) { std::stringstream iss(line); - _u32 lbl_cnt = 0; - _u32 label_host = point_cnt; + uint32_t lbl_cnt = 0; + uint32_t label_host = point_cnt; while (getline(iss, token, ',')) { if (lbl_cnt == density) @@ -522,13 +522,13 @@ void breakup_dense_points(const std::string data_file, const std::string labels_ dense_pts++; label_host = next_dummy_id; labels_per_point.resize(next_dummy_id + 1); - dummy_pt_ids[next_dummy_id] = (_u32)point_cnt; + dummy_pt_ids[next_dummy_id] = (uint32_t)point_cnt; next_dummy_id++; lbl_cnt = 0; } token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); - unsigned token_as_num = std::stoul(token); + uint32_t token_as_num = std::stoul(token); labels_per_point[label_host].push_back(token_as_num); lbl_cnt++; } @@ -543,9 +543,9 @@ void breakup_dense_points(const std::string data_file, const std::string labels_ diskann::cout << labels_per_point.size() << " is the new number of points" << std::endl; std::ofstream label_writer(out_labels_file); assert(label_writer.is_open()); - for (_u32 i = 0; i < labels_per_point.size(); i++) + for (uint32_t i = 0; i < labels_per_point.size(); i++) { - for (_u32 j = 0; j < (labels_per_point[i].size() - 1); j++) + for (uint32_t j = 0; j < (labels_per_point[i].size() - 1); j++) { label_writer << labels_per_point[i][j] << ","; } @@ -579,11 +579,11 @@ void extract_shard_labels(const std::string &in_label_file, const std::string &s // point in labels file diskann::cout << "Extracting labels for shard" << std::endl; - _u32 *ids = nullptr; - _u64 num_ids, tmp_dim; + uint32_t *ids = nullptr; + uint64_t num_ids, tmp_dim; diskann::load_bin(shard_ids_bin, ids, num_ids, tmp_dim); - _u32 counter = 0, shard_counter = 0; + uint32_t counter = 0, shard_counter = 0; std::string cur_line; std::ifstream label_reader(in_label_file); @@ -611,55 +611,49 @@ void extract_shard_labels(const std::string &in_label_file, const std::string &s } template -int build_merged_vamana_index(std::string base_file, diskann::Metric compareMetric, unsigned L, unsigned R, +int build_merged_vamana_index(std::string base_file, diskann::Metric compareMetric, uint32_t L, uint32_t R, double sampling_rate, double ram_budget, std::string mem_index_path, std::string medoids_file, std::string centroids_file, size_t build_pq_bytes, bool use_opq, - bool use_filters, const std::string &label_file, + uint32_t num_threads, bool use_filters, const std::string &label_file, const std::string &labels_to_medoids_file, const std::string &universal_label, - const _u32 Lf) + const uint32_t Lf, uint32_t universal_label_num = 0) { size_t base_num, base_dim; diskann::get_bin_metadata(base_file, base_num, base_dim); - double full_index_ram = estimate_ram_usage(base_num, base_dim, sizeof(T), R); + double full_index_ram = estimate_ram_usage(base_num, (uint32_t)base_dim, sizeof(T), R); // TODO: Make this honest when there is filter support if (full_index_ram < ram_budget * 1024 * 1024 * 1024) { diskann::cout << "Full index fits in RAM budget, should consume at most " << full_index_ram / (1024 * 1024 * 1024) << "GiBs, so building in one shot" << std::endl; - diskann::Parameters paras; - paras.Set("L", (unsigned)L); - paras.Set("Lf", (unsigned)Lf); - paras.Set("R", (unsigned)R); - paras.Set("C", 750); - paras.Set("alpha", 1.2f); - paras.Set("num_rnds", 2); - if (!use_filters) - paras.Set("saturate_graph", 1); - else - paras.Set("saturate_graph", 0); + + diskann::IndexWriteParameters paras = diskann::IndexWriteParametersBuilder(L, R) + .with_filter_list_size(Lf) + .with_saturate_graph(!use_filters) + .with_num_threads(num_threads) + .build(); using TagT = uint32_t; - paras.Set("save_path", mem_index_path); - std::unique_ptr> _pvamanaIndex = - std::unique_ptr>(new diskann::Index( - compareMetric, base_dim, base_num, false, false, false, build_pq_bytes > 0, build_pq_bytes, use_opq)); + diskann::Index _index(compareMetric, base_dim, base_num, false, false, false, + build_pq_bytes > 0, build_pq_bytes, use_opq); if (!use_filters) - _pvamanaIndex->build(base_file.c_str(), base_num, paras); + _index.build(base_file.c_str(), base_num, paras); else { if (universal_label != "") { // indicates no universal label - LabelT unv_label_as_num = 0; - _pvamanaIndex->set_universal_label(unv_label_as_num); + // LabelT unv_label_as_num = 0; + _index.set_universal_label(universal_label_num); } - _pvamanaIndex->build_filtered_index(base_file.c_str(), label_file, base_num, paras); + _index.build_filtered_index(base_file.c_str(), label_file, base_num, paras); } - _pvamanaIndex->save(mem_index_path.c_str()); + _index.save(mem_index_path.c_str()); if (use_filters) { - // need to copy the labels_to_medoids file to the specified input file + // need to copy the labels_to_medoids file to the specified input + // file std::remove(labels_to_medoids_file.c_str()); std::string mem_labels_to_medoid_file = mem_index_path + "_labels_to_medoids.txt"; copy_file(mem_labels_to_medoid_file, labels_to_medoids_file); @@ -697,36 +691,28 @@ int build_merged_vamana_index(std::string base_file, diskann::Metric compareMetr std::string shard_index_file = merged_index_prefix + "_subshard-" + std::to_string(p) + "_mem.index"; - diskann::Parameters paras; - paras.Set("L", L); - paras.Set("Lf", Lf); - paras.Set("R", (2 * (R / 3))); - paras.Set("C", 750); - paras.Set("alpha", 1.2f); - paras.Set("num_rnds", 2); - paras.Set("saturate_graph", 0); - paras.Set("save_path", shard_index_file); - - _u64 shard_base_dim, shard_base_pts; + diskann::IndexWriteParameters paras = + diskann::IndexWriteParametersBuilder(L, (2 * R / 3)).with_filter_list_size(Lf).build(); + + uint64_t 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_dim, shard_base_pts, false, false, false, - build_pq_bytes > 0, build_pq_bytes, use_opq)); + diskann::Index _index(compareMetric, shard_base_dim, shard_base_pts, false, false, false, build_pq_bytes > 0, + build_pq_bytes, use_opq); if (!use_filters) { - _pvamanaIndex->build(shard_base_file.c_str(), shard_base_pts, paras); + _index.build(shard_base_file.c_str(), shard_base_pts, paras); } else { diskann::extract_shard_labels(label_file, shard_ids_file, shard_labels_file); if (universal_label != "") { // indicates no universal label - LabelT unv_label_as_num = 0; - _pvamanaIndex->set_universal_label(unv_label_as_num); +// LabelT unv_label_as_num = 0; + _index.set_universal_label(universal_label_num); } - _pvamanaIndex->build_filtered_index(shard_base_file.c_str(), shard_labels_file, shard_base_pts, paras); + _index.build_filtered_index(shard_base_file.c_str(), shard_labels_file, shard_base_pts, paras); } - _pvamanaIndex->save(shard_index_file.c_str()); + _index.save(shard_index_file.c_str()); // copy universal label file from first shard to the final destination // index, since all shards anyway share the universal label if (p == 0) @@ -781,8 +767,8 @@ int build_merged_vamana_index(std::string base_file, diskann::Metric compareMetr // 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) + uint64_t tuning_sample_num, uint64_t tuning_sample_aligned_dim, uint32_t L, + uint32_t nthreads, uint32_t start_bw) { uint32_t cur_bw = start_bw; double max_qps = 0; @@ -797,7 +783,7 @@ uint32_t optimize_beamwidth(std::unique_ptr> &p 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++) + for (int64_t 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), @@ -835,11 +821,11 @@ template void create_disk_layout(const std::string base_file, const std::string mem_index_file, const std::string output_file, const std::string reorder_data_file) { - unsigned npts, ndims; + uint32_t npts, ndims; // amount to read or write in one shot - _u64 read_blk_size = 64 * 1024 * 1024; - _u64 write_blk_size = read_blk_size; + size_t read_blk_size = 64 * 1024 * 1024; + size_t write_blk_size = read_blk_size; cached_ifstream base_reader(base_file, read_blk_size); base_reader.read((char *)&npts, sizeof(uint32_t)); base_reader.read((char *)&ndims, sizeof(uint32_t)); @@ -852,7 +838,7 @@ void create_disk_layout(const std::string base_file, const std::string mem_index bool append_reorder_data = false; std::ifstream reorder_data_reader; - unsigned npts_reorder_file = 0, ndims_reorder_file = 0; + uint32_t npts_reorder_file = 0, ndims_reorder_file = 0; if (reorder_data_file != std::string("")) { append_reorder_data = true; @@ -862,11 +848,12 @@ void create_disk_layout(const std::string base_file, const std::string mem_index try { reorder_data_reader.open(reorder_data_file, std::ios::binary); - reorder_data_reader.read((char *)&npts_reorder_file, sizeof(unsigned)); - reorder_data_reader.read((char *)&ndims_reorder_file, sizeof(unsigned)); + reorder_data_reader.read((char *)&npts_reorder_file, sizeof(uint32_t)); + reorder_data_reader.read((char *)&ndims_reorder_file, sizeof(uint32_t)); if (npts_reorder_file != npts) - throw ANNException("Mismatch in num_points between reorder data file and base file", -1, __FUNCSIG__, - __FILE__, __LINE__); + throw ANNException("Mismatch in num_points between reorder " + "data file and base file", + -1, __FUNCSIG__, __FILE__, __LINE__); if (reorder_data_file_size != 8 + sizeof(float) * (size_t)npts_reorder_file * (size_t)ndims_reorder_file) throw ANNException("Discrepancy in reorder data file size ", -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -883,7 +870,7 @@ void create_disk_layout(const std::string base_file, const std::string mem_index cached_ofstream diskann_writer(output_file, write_blk_size); // metadata: width, medoid - unsigned width_u32, medoid_u32; + uint32_t width_u32, medoid_u32; size_t index_file_size; vamana_reader.read((char *)&index_file_size, sizeof(uint64_t)); @@ -896,18 +883,18 @@ void create_disk_layout(const std::string base_file, const std::string mem_index throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } - _u64 vamana_frozen_num = false, vamana_frozen_loc = 0; + uint64_t 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)); + vamana_reader.read((char *)&width_u32, sizeof(uint32_t)); + vamana_reader.read((char *)&medoid_u32, sizeof(uint32_t)); + vamana_reader.read((char *)&vamana_frozen_num, sizeof(uint64_t)); // compute - _u64 medoid, max_node_len, nnodes_per_sector; - npts_64 = (_u64)npts; - medoid = (_u64)medoid_u32; + uint64_t medoid, max_node_len, nnodes_per_sector; + npts_64 = (uint64_t)npts; + medoid = (uint64_t)medoid_u32; if (vamana_frozen_num == 1) vamana_frozen_loc = medoid; - max_node_len = (((_u64)width_u32 + 1) * sizeof(unsigned)) + (ndims_64 * sizeof(T)); + max_node_len = (((uint64_t)width_u32 + 1) * sizeof(uint32_t)) + (ndims_64 * sizeof(T)); nnodes_per_sector = SECTOR_LEN / max_node_len; diskann::cout << "medoid: " << medoid << "B" << std::endl; @@ -917,22 +904,22 @@ void create_disk_layout(const std::string base_file, const std::string mem_index // 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); - unsigned &nnbrs = *(unsigned *)(node_buf.get() + ndims_64 * sizeof(T)); - unsigned *nhood_buf = (unsigned *)(node_buf.get() + (ndims_64 * sizeof(T)) + sizeof(unsigned)); + uint32_t &nnbrs = *(uint32_t *)(node_buf.get() + ndims_64 * sizeof(T)); + uint32_t *nhood_buf = (uint32_t *)(node_buf.get() + (ndims_64 * sizeof(T)) + sizeof(uint32_t)); // number of sectors (1 for meta data) - _u64 n_sectors = ROUND_UP(npts_64, nnodes_per_sector) / nnodes_per_sector; - _u64 n_reorder_sectors = 0; - _u64 n_data_nodes_per_sector = 0; + uint64_t n_sectors = ROUND_UP(npts_64, nnodes_per_sector) / nnodes_per_sector; + uint64_t n_reorder_sectors = 0; + uint64_t n_data_nodes_per_sector = 0; if (append_reorder_data) { n_data_nodes_per_sector = SECTOR_LEN / (ndims_reorder_file * sizeof(float)); n_reorder_sectors = ROUND_UP(npts_64, n_data_nodes_per_sector) / n_data_nodes_per_sector; } - _u64 disk_index_file_size = (n_sectors + n_reorder_sectors + 1) * SECTOR_LEN; + uint64_t disk_index_file_size = (n_sectors + n_reorder_sectors + 1) * SECTOR_LEN; - std::vector<_u64> output_file_meta; + std::vector output_file_meta; output_file_meta.push_back(npts_64); output_file_meta.push_back(ndims_64); output_file_meta.push_back(medoid); @@ -940,7 +927,7 @@ void create_disk_layout(const std::string base_file, const std::string mem_index 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((_u64)append_reorder_data); + output_file_meta.push_back((uint64_t)append_reorder_data); if (append_reorder_data) { output_file_meta.push_back(n_sectors + 1); @@ -953,42 +940,42 @@ void create_disk_layout(const std::string base_file, const std::string mem_index std::unique_ptr cur_node_coords = std::make_unique(ndims_64); diskann::cout << "# sectors: " << n_sectors << std::endl; - _u64 cur_node_id = 0; - for (_u64 sector = 0; sector < n_sectors; sector++) + uint64_t cur_node_id = 0; + for (uint64_t sector = 0; sector < n_sectors; sector++) { if (sector % 100000 == 0) { diskann::cout << "Sector #" << sector << "written" << std::endl; } memset(sector_buf.get(), 0, SECTOR_LEN); - for (_u64 sector_node_id = 0; sector_node_id < nnodes_per_sector && cur_node_id < npts_64; sector_node_id++) + for (uint64_t sector_node_id = 0; sector_node_id < nnodes_per_sector && cur_node_id < npts_64; sector_node_id++) { memset(node_buf.get(), 0, max_node_len); // read cur node's nnbrs - vamana_reader.read((char *)&nnbrs, sizeof(unsigned)); + vamana_reader.read((char *)&nnbrs, sizeof(uint32_t)); // sanity checks on nnbrs assert(nnbrs > 0); assert(nnbrs <= width_u32); // read node's nhood - vamana_reader.read((char *)nhood_buf, (std::min)(nnbrs, width_u32) * sizeof(unsigned)); + vamana_reader.read((char *)nhood_buf, (std::min)(nnbrs, width_u32) * sizeof(uint32_t)); if (nnbrs > width_u32) { - vamana_reader.seekg((nnbrs - width_u32) * sizeof(unsigned), vamana_reader.cur); + vamana_reader.seekg((nnbrs - width_u32) * sizeof(uint32_t), vamana_reader.cur); } // write coords of node first - // T *node_coords = data + ((_u64) ndims_64 * cur_node_id); + // T *node_coords = data + ((uint64_t) ndims_64 * cur_node_id); 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)) = (std::min)(nnbrs, width_u32); + *(uint32_t *)(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, - (std::min)(nnbrs, width_u32) * sizeof(unsigned)); + memcpy(node_buf.get() + ndims_64 * sizeof(T) + sizeof(uint32_t), nhood_buf, + (std::min)(nnbrs, width_u32) * sizeof(uint32_t)); // get offset into sector_buf char *sector_node_buf = sector_buf.get() + (sector_node_id * max_node_len); @@ -1007,7 +994,7 @@ void create_disk_layout(const std::string base_file, const std::string mem_index auto vec_len = ndims_reorder_file * sizeof(float); std::unique_ptr vec_buf = std::make_unique(vec_len); - for (_u64 sector = 0; sector < n_reorder_sectors; sector++) + for (uint64_t sector = 0; sector < n_reorder_sectors; sector++) { if (sector % 100000 == 0) { @@ -1016,7 +1003,7 @@ void create_disk_layout(const std::string base_file, const std::string mem_index memset(sector_buf.get(), 0, SECTOR_LEN); - for (_u64 sector_node_id = 0; sector_node_id < n_data_nodes_per_sector && sector_node_id < npts_64; + for (uint64_t sector_node_id = 0; sector_node_id < n_data_nodes_per_sector && sector_node_id < npts_64; sector_node_id++) { memset(vec_buf.get(), 0, vec_len); @@ -1030,14 +1017,15 @@ void create_disk_layout(const std::string base_file, const std::string mem_index } } diskann_writer.close(); - diskann::save_bin<_u64>(output_file, output_file_meta.data(), output_file_meta.size(), 1, 0); + diskann::save_bin(output_file, output_file_meta.data(), output_file_meta.size(), 1, 0); diskann::cout << "Output disk index file written to " << output_file << std::endl; } template int build_disk_index(const char *dataFilePath, const char *indexFilePath, const char *indexBuildParameters, - diskann::Metric compareMetric, bool use_opq, bool use_filters, const std::string &label_file, - const std::string &universal_label, const _u32 filter_threshold, const _u32 Lf) + diskann::Metric compareMetric, bool use_opq, const std::string &codebook_prefix, bool use_filters, + const std::string &label_file, const std::string &universal_label, const uint32_t filter_threshold, + const uint32_t Lf) { std::stringstream parser; parser << std::string(indexBuildParameters); @@ -1047,7 +1035,7 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const { param_list.push_back(cur_param); } - if (param_list.size() < 5 || param_list.size() > 8) + if (param_list.size() < 5 || param_list.size() > 9) { diskann::cout << "Correct usage of parameters is R (max degree)\n" "L (indexing list size, better if >= R)\n" @@ -1059,7 +1047,8 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const "reorder (set true to include full precision in data file" ": optional paramter, use only when using disk PQ\n" "build_PQ_byte (number of PQ bytes for inde build; set 0 to use " - "full precision vectors)" + "full precision vectors)\n" + "QD Quantized Dimension to overwrite the derived dim from B " << std::endl; return -1; } @@ -1097,7 +1086,7 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const } } - if (param_list.size() == 8) + if (param_list.size() >= 8) { build_pq_bytes = atoi(param_list[7].c_str()); } @@ -1107,7 +1096,9 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const std::string labels_file_original = label_file; std::string index_prefix_path(indexFilePath); std::string labels_file_to_use = index_prefix_path + "_label_formatted.txt"; - std::string pq_pivots_path = index_prefix_path + "_pq_pivots.bin"; + std::string pq_pivots_path_base = codebook_prefix; + std::string pq_pivots_path = file_exists(pq_pivots_path_base) ? pq_pivots_path_base + "_pq_pivots.bin" + : index_prefix_path + "_pq_pivots.bin"; std::string pq_compressed_vectors_path = index_prefix_path + "_pq_compressed.bin"; std::string mem_index_path = index_prefix_path + "_mem.index"; std::string disk_index_path = index_prefix_path + "_disk.index"; @@ -1148,8 +1139,8 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const diskann::cout << timer.elapsed_seconds_for_step("preprocessing data for inner product") << std::endl; } - unsigned R = (unsigned)atoi(param_list[0].c_str()); - unsigned L = (unsigned)atoi(param_list[1].c_str()); + uint32_t R = (uint32_t)atoi(param_list[0].c_str()); + uint32_t L = (uint32_t)atoi(param_list[1].c_str()); double final_index_ram_limit = get_memory_budget(param_list[2]); if (final_index_ram_limit <= 0) @@ -1165,7 +1156,7 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const std::cerr << "Not building index. Please provide more RAM budget" << std::endl; return -1; } - _u32 num_threads = (_u32)atoi(param_list[4].c_str()); + uint32_t num_threads = (uint32_t)atoi(param_list[4].c_str()); if (num_threads != 0) { @@ -1182,9 +1173,9 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const // into replica dummy points which evenly distribute the filters. The rest // of index build happens on the augmented base and labels std::string augmented_data_file, augmented_labels_file; + std::uint32_t universal_label_id = 0; if (use_filters) { - std::uint32_t universal_label_id = 0; convert_labels_string_to_int(labels_file_original, labels_file_to_use, disk_labels_int_map_file, universal_label, universal_label_id); augmented_data_file = index_prefix_path + "_augmented_data.bin"; @@ -1194,8 +1185,8 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const dummy_remap_file = index_prefix_path + "_dummy_remap.txt"; breakup_dense_points(data_file_to_use, labels_file_to_use, filter_threshold, augmented_data_file, augmented_labels_file, - dummy_remap_file); // RKNOTE: This has large memory footprint, need - // to make this streaming + dummy_remap_file); // RKNOTE: This has large memory footprint, + // need to make this streaming data_file_to_use = augmented_data_file; labels_file_to_use = augmented_labels_file; } @@ -1212,17 +1203,25 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const generate_disk_quantized_data(data_file_to_use, disk_pq_pivots_path, disk_pq_compressed_vectors_path, compareMetric, p_val, disk_pq_dims); } - size_t num_pq_chunks = (size_t)(std::floor)(_u64(final_index_ram_limit / points_num)); + size_t num_pq_chunks = (size_t)(std::floor)(uint64_t(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; + if (param_list.size() >= 9 && atoi(param_list[8].c_str()) <= MAX_PQ_CHUNKS && atoi(param_list[8].c_str()) > 0) + { + std::cout << "Use quantized dimension (QD) to overwrite derived quantized " + "dimension from search_DRAM_budget (B)" + << std::endl; + num_pq_chunks = atoi(param_list[8].c_str()); + } + diskann::cout << "Compressing " << dim << "-dimensional data into " << num_pq_chunks << " bytes per vector." << std::endl; generate_quantized_data(data_file_to_use, pq_pivots_path, pq_compressed_vectors_path, compareMetric, p_val, - num_pq_chunks, use_opq); + num_pq_chunks, use_opq, codebook_prefix); diskann::cout << timer.elapsed_seconds_for_step("generating quantized data") << std::endl; // Gopal. Splitting diskann_dll into separate DLLs for search and build. @@ -1234,8 +1233,8 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const timer.reset(); diskann::build_merged_vamana_index(data_file_to_use.c_str(), diskann::Metric::L2, L, R, p_val, indexing_ram_budget, mem_index_path, medoids_path, centroids_path, - build_pq_bytes, use_opq, use_filters, labels_file_to_use, - labels_to_medoids_path, universal_label, Lf); + build_pq_bytes, use_opq, num_threads, use_filters, labels_file_to_use, + labels_to_medoids_path, universal_label, Lf, universal_label_id); diskann::cout << timer.elapsed_seconds_for_step("building merged vamana index") << std::endl; timer.reset(); @@ -1246,10 +1245,10 @@ int build_disk_index(const char *dataFilePath, const char *indexFilePath, const else { if (!reorder_data) - diskann::create_disk_layout<_u8>(disk_pq_compressed_vectors_path, mem_index_path, disk_index_path); + diskann::create_disk_layout(disk_pq_compressed_vectors_path, mem_index_path, disk_index_path); else - diskann::create_disk_layout<_u8>(disk_pq_compressed_vectors_path, mem_index_path, disk_index_path, - data_file_to_use.c_str()); + diskann::create_disk_layout(disk_pq_compressed_vectors_path, mem_index_path, disk_index_path, + data_file_to_use.c_str()); } diskann::cout << timer.elapsed_seconds_for_step("generating disk layout") << std::endl; @@ -1316,91 +1315,97 @@ template DISKANN_DLLEXPORT float *load_warmup(MemoryMappedFiles &files, c 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); + uint64_t tuning_sample_num, uint64_t 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); + uint64_t tuning_sample_num, uint64_t 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); + std::unique_ptr> &pFlashIndex, float *tuning_sample, + uint64_t tuning_sample_num, uint64_t 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, int8_t *tuning_sample, - _u64 tuning_sample_num, _u64 tuning_sample_aligned_dim, uint32_t L, uint32_t nthreads, uint32_t start_bw); + uint64_t tuning_sample_num, uint64_t 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); + uint64_t tuning_sample_num, uint64_t 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); + std::unique_ptr> &pFlashIndex, float *tuning_sample, + uint64_t tuning_sample_num, uint64_t tuning_sample_aligned_dim, uint32_t L, uint32_t nthreads, uint32_t start_bw); template DISKANN_DLLEXPORT int build_disk_index(const char *dataFilePath, const char *indexFilePath, const char *indexBuildParameters, diskann::Metric compareMetric, bool use_opq, - bool use_filters, const std::string &label_file, + const std::string &codebook_prefix, bool use_filters, + const std::string &label_file, const std::string &universal_label, - const _u32 filter_threshold, const _u32 Lf); + const uint32_t filter_threshold, const uint32_t Lf); template DISKANN_DLLEXPORT int build_disk_index(const char *dataFilePath, const char *indexFilePath, const char *indexBuildParameters, diskann::Metric compareMetric, bool use_opq, - bool use_filters, const std::string &label_file, + const std::string &codebook_prefix, bool use_filters, + const std::string &label_file, const std::string &universal_label, - const _u32 filter_threshold, const _u32 Lf); + const uint32_t filter_threshold, const uint32_t Lf); template DISKANN_DLLEXPORT int build_disk_index(const char *dataFilePath, const char *indexFilePath, const char *indexBuildParameters, diskann::Metric compareMetric, bool use_opq, - bool use_filters, const std::string &label_file, + const std::string &codebook_prefix, bool use_filters, + const std::string &label_file, const std::string &universal_label, - const _u32 filter_threshold, const _u32 Lf); + const uint32_t filter_threshold, const uint32_t Lf); // LabelT = uint16 template DISKANN_DLLEXPORT int build_disk_index(const char *dataFilePath, const char *indexFilePath, const char *indexBuildParameters, diskann::Metric compareMetric, bool use_opq, - bool use_filters, const std::string &label_file, + const std::string &codebook_prefix, bool use_filters, + const std::string &label_file, const std::string &universal_label, - const _u32 filter_threshold, const _u32 Lf); + const uint32_t filter_threshold, const uint32_t Lf); template DISKANN_DLLEXPORT int build_disk_index(const char *dataFilePath, const char *indexFilePath, const char *indexBuildParameters, diskann::Metric compareMetric, bool use_opq, - bool use_filters, const std::string &label_file, + const std::string &codebook_prefix, bool use_filters, + const std::string &label_file, const std::string &universal_label, - const _u32 filter_threshold, const _u32 Lf); + const uint32_t filter_threshold, const uint32_t Lf); template DISKANN_DLLEXPORT int build_disk_index(const char *dataFilePath, const char *indexFilePath, const char *indexBuildParameters, diskann::Metric compareMetric, bool use_opq, - bool use_filters, const std::string &label_file, + const std::string &codebook_prefix, bool use_filters, + const std::string &label_file, const std::string &universal_label, - const _u32 filter_threshold, const _u32 Lf); + const uint32_t filter_threshold, const uint32_t Lf); template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric compareMetric, unsigned L, unsigned R, double sampling_rate, + std::string base_file, diskann::Metric compareMetric, uint32_t L, uint32_t R, double sampling_rate, double ram_budget, std::string mem_index_path, std::string medoids_path, std::string centroids_file, - size_t build_pq_bytes, bool use_opq, bool use_filters, const std::string &label_file, - const std::string &labels_to_medoids_file, const std::string &universal_label, const _u32 Lf); + size_t build_pq_bytes, bool use_opq, uint32_t num_threads, bool use_filters, const std::string &label_file, + const std::string &labels_to_medoids_file, const std::string &universal_label, const uint32_t Lf); template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric compareMetric, unsigned L, unsigned R, double sampling_rate, + std::string base_file, diskann::Metric compareMetric, uint32_t L, uint32_t R, double sampling_rate, double ram_budget, std::string mem_index_path, std::string medoids_path, std::string centroids_file, - size_t build_pq_bytes, bool use_opq, bool use_filters, const std::string &label_file, - const std::string &labels_to_medoids_file, const std::string &universal_label, const _u32 Lf); + size_t build_pq_bytes, bool use_opq, uint32_t num_threads, bool use_filters, const std::string &label_file, + const std::string &labels_to_medoids_file, const std::string &universal_label, const uint32_t Lf); template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric compareMetric, unsigned L, unsigned R, double sampling_rate, + std::string base_file, diskann::Metric compareMetric, uint32_t L, uint32_t R, double sampling_rate, double ram_budget, std::string mem_index_path, std::string medoids_path, std::string centroids_file, - size_t build_pq_bytes, bool use_opq, bool use_filters, const std::string &label_file, - const std::string &labels_to_medoids_file, const std::string &universal_label, const _u32 Lf); + size_t build_pq_bytes, bool use_opq, uint32_t num_threads, bool use_filters, const std::string &label_file, + const std::string &labels_to_medoids_file, const std::string &universal_label, const uint32_t Lf); // Label=16_t template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric compareMetric, unsigned L, unsigned R, double sampling_rate, + std::string base_file, diskann::Metric compareMetric, uint32_t L, uint32_t R, double sampling_rate, double ram_budget, std::string mem_index_path, std::string medoids_path, std::string centroids_file, - size_t build_pq_bytes, bool use_opq, bool use_filters, const std::string &label_file, - const std::string &labels_to_medoids_file, const std::string &universal_label, const _u32 Lf); + size_t build_pq_bytes, bool use_opq, uint32_t num_threads, bool use_filters, const std::string &label_file, + const std::string &labels_to_medoids_file, const std::string &universal_label, const uint32_t Lf); template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric compareMetric, unsigned L, unsigned R, double sampling_rate, + std::string base_file, diskann::Metric compareMetric, uint32_t L, uint32_t R, double sampling_rate, double ram_budget, std::string mem_index_path, std::string medoids_path, std::string centroids_file, - size_t build_pq_bytes, bool use_opq, bool use_filters, const std::string &label_file, - const std::string &labels_to_medoids_file, const std::string &universal_label, const _u32 Lf); + size_t build_pq_bytes, bool use_opq, uint32_t num_threads, bool use_filters, const std::string &label_file, + const std::string &labels_to_medoids_file, const std::string &universal_label, const uint32_t Lf); template DISKANN_DLLEXPORT int build_merged_vamana_index( - std::string base_file, diskann::Metric compareMetric, unsigned L, unsigned R, double sampling_rate, + std::string base_file, diskann::Metric compareMetric, uint32_t L, uint32_t R, double sampling_rate, double ram_budget, std::string mem_index_path, std::string medoids_path, std::string centroids_file, - size_t build_pq_bytes, bool use_opq, bool use_filters, const std::string &label_file, - const std::string &labels_to_medoids_file, const std::string &universal_label, const _u32 Lf); + size_t build_pq_bytes, bool use_opq, uint32_t num_threads, bool use_filters, const std::string &label_file, + const std::string &labels_to_medoids_file, const std::string &universal_label, const uint32_t Lf); }; // namespace diskann diff --git a/src/distance.cpp b/src/distance.cpp index 15d30c8cb..31ab9d3ff 100644 --- a/src/distance.cpp +++ b/src/distance.cpp @@ -22,6 +22,49 @@ namespace diskann { +// +// Base Class Implementatons +// +template +float Distance::compare(const T *a, const T *b, const float normA, const float normB, uint32_t length) const +{ + throw std::logic_error("This function is not implemented."); +} + +template uint32_t Distance::post_normalization_dimension(uint32_t orig_dimension) const +{ + return orig_dimension; +} + +template diskann::Metric Distance::get_metric() const +{ + return _distance_metric; +} + +template bool Distance::preprocessing_required() const +{ + return false; +} + +template +void Distance::preprocess_base_points(T *original_data, const size_t orig_dim, const size_t num_points) +{ +} + +template void Distance::preprocess_query(const T *query_vec, const size_t query_dim, T *scratch_query) +{ + std::memcpy(scratch_query, query_vec, query_dim * sizeof(T)); +} + +template size_t Distance::get_required_alignment() const +{ + return _alignment_factor; +} + +template Distance::~Distance() +{ +} + // // Cosine distance functions. // @@ -104,7 +147,7 @@ float DistanceL2Int8::compare(const int8_t *a, const int8_t *b, uint32_t size) c #else int32_t result = 0; #pragma omp simd reduction(+ : result) aligned(a, b : 8) - for (_s32 i = 0; i < (_s32)size; i++) + 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])); } @@ -181,12 +224,12 @@ float DistanceL2Float::compare(const float *a, const float *b, uint32_t size) co return result; } -float SlowDistanceL2Float::compare(const float *a, const float *b, uint32_t length) const +template float SlowDistanceL2::compare(const T *a, const T *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]); + result += ((float)(a[i] - b[i])) * (a[i] - b[i]); } return result; } @@ -259,7 +302,7 @@ float AVXDistanceL2Float::compare(const float *, const float *, uint32_t) const } #endif -template float DistanceInnerProduct::inner_product(const T *a, const T *b, unsigned size) const +template float DistanceInnerProduct::inner_product(const T *a, const T *b, uint32_t size) const { if (!std::is_floating_point::value) { @@ -281,9 +324,9 @@ template float DistanceInnerProduct::inner_product(const T *a, c __m256 sum; __m256 l0, l1; __m256 r0, r1; - unsigned D = (size + 7) & ~7U; - unsigned DR = D % 16; - unsigned DD = D - DR; + uint32_t D = (size + 7) & ~7U; + uint32_t DR = D % 16; + uint32_t DD = D - DR; const float *l = (float *)a; const float *r = (float *)b; const float *e_l = l + DD; @@ -296,7 +339,7 @@ template float DistanceInnerProduct::inner_product(const T *a, c AVX_DOT(e_l, e_r, sum, l0, r0); } - for (unsigned i = 0; i < DD; i += 16, l += 16, r += 16) + for (uint32_t 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); @@ -314,9 +357,9 @@ template float DistanceInnerProduct::inner_product(const T *a, c __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; + uint32_t D = (size + 3) & ~3U; + uint32_t DR = D % 16; + uint32_t DD = D - DR; const float *l = a; const float *r = b; const float *e_l = l + DD; @@ -335,7 +378,7 @@ template float DistanceInnerProduct::inner_product(const T *a, c default: break; } - for (unsigned i = 0; i < DD; i += 16, l += 16, r += 16) + for (uint32_t 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); @@ -372,14 +415,14 @@ template float DistanceInnerProduct::inner_product(const T *a, c return result; } -template float DistanceFastL2::compare(const T *a, const T *b, float norm, unsigned size) const +template float DistanceFastL2::compare(const T *a, const T *b, float norm, uint32_t size) const { float result = -2 * DistanceInnerProduct::inner_product(a, b, size); result += norm; return result; } -template float DistanceFastL2::norm(const T *a, unsigned size) const +template float DistanceFastL2::norm(const T *a, uint32_t size) const { if (!std::is_floating_point::value) { @@ -397,9 +440,9 @@ template float DistanceFastL2::norm(const T *a, unsigned size) c __m256 sum; __m256 l0, l1; - unsigned D = (size + 7) & ~7U; - unsigned DR = D % 16; - unsigned DD = D - DR; + uint32_t D = (size + 7) & ~7U; + uint32_t DR = D % 16; + uint32_t 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}; @@ -409,7 +452,7 @@ template float DistanceFastL2::norm(const T *a, unsigned size) c { AVX_L2NORM(e_l, sum, l0); } - for (unsigned i = 0; i < DD; i += 16, l += 16) + for (uint32_t i = 0; i < DD; i += 16, l += 16) { AVX_L2NORM(l, sum, l0); AVX_L2NORM(l + 8, sum, l1); @@ -425,9 +468,9 @@ template float DistanceFastL2::norm(const T *a, unsigned size) c __m128 sum; __m128 l0, l1, l2, l3; - unsigned D = (size + 3) & ~3U; - unsigned DR = D % 16; - unsigned DD = D - DR; + uint32_t D = (size + 3) & ~3U; + uint32_t DR = D % 16; + uint32_t DD = D - DR; const float *l = a; const float *e_l = l + DD; float unpack[4] __attribute__((aligned(16))) = {0, 0, 0, 0}; @@ -444,7 +487,7 @@ template float DistanceFastL2::norm(const T *a, unsigned size) c default: break; } - for (unsigned i = 0; i < DD; i += 16, l += 16) + for (uint32_t i = 0; i < DD; i += 16, l += 16) { SSE_L2NORM(l, sum, l0); SSE_L2NORM(l + 4, sum, l1); @@ -492,9 +535,9 @@ float AVXDistanceInnerProductFloat::compare(const float *a, const float *b, uint __m256 sum; __m256 l0, l1; __m256 r0, r1; - unsigned D = (size + 7) & ~7U; - unsigned DR = D % 16; - unsigned DD = D - DR; + uint32_t D = (size + 7) & ~7U; + uint32_t DR = D % 16; + uint32_t DD = D - DR; const float *l = (float *)a; const float *r = (float *)b; const float *e_l = l + DD; @@ -511,7 +554,7 @@ float AVXDistanceInnerProductFloat::compare(const float *a, const float *b, uint AVX_DOT(e_l, e_r, sum, l0, r0); } - for (unsigned i = 0; i < DD; i += 16, l += 16, r += 16) + for (uint32_t 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); @@ -522,6 +565,40 @@ float AVXDistanceInnerProductFloat::compare(const float *a, const float *b, uint return -result; } +uint32_t AVXNormalizedCosineDistanceFloat::post_normalization_dimension(uint32_t orig_dimension) const +{ + return orig_dimension; +} +bool AVXNormalizedCosineDistanceFloat::preprocessing_required() const +{ + return true; +} +void AVXNormalizedCosineDistanceFloat::preprocess_base_points(float *original_data, const size_t orig_dim, + const size_t num_points) +{ + for (uint32_t i = 0; i < num_points; i++) + { + normalize((float *)(original_data + i * orig_dim), orig_dim); + } +} + +void AVXNormalizedCosineDistanceFloat::preprocess_query(const float *query_vec, const size_t query_dim, + float *query_scratch) +{ + normalize_and_copy(query_vec, (uint32_t)query_dim, query_scratch); +} + +void AVXNormalizedCosineDistanceFloat::normalize_and_copy(const float *query_vec, const uint32_t query_dim, + float *query_target) const +{ + float norm = get_norm(query_vec, query_dim); + + for (uint32_t i = 0; i < query_dim; i++) + { + query_target[i] = query_vec[i] / norm; + } +} + // Get the right distance function for the given metric. template <> diskann::Distance *get_distance_function(diskann::Metric m) { @@ -540,7 +617,7 @@ template <> diskann::Distance *get_distance_function(diskann::Metric m) else { diskann::cout << "L2: Older CPU. Using slow distance computation" << std::endl; - return new diskann::SlowDistanceL2Float(); + return new diskann::SlowDistanceL2(); } } else if (m == diskann::Metric::COSINE) @@ -592,7 +669,7 @@ template <> diskann::Distance *get_distance_function(diskann::Metric m) diskann::cout << "Older CPU. Using slow distance computation " "SlowDistanceL2Int." << std::endl; - return new diskann::SlowDistanceL2Int(); + return new diskann::SlowDistanceL2(); } } else if (m == diskann::Metric::COSINE) @@ -616,7 +693,8 @@ template <> diskann::Distance *get_distance_function(diskann::Metric m) if (m == diskann::Metric::L2) { #ifdef _WINDOWS - diskann::cout << "WARNING: AVX/AVX2 distance function not defined for Uint8. Using " + diskann::cout << "WARNING: AVX/AVX2 distance function not defined for Uint8. " + "Using " "slow version. " "Contact gopalsr@microsoft.com if you need AVX/AVX2 support." << std::endl; @@ -634,7 +712,7 @@ template <> diskann::Distance *get_distance_function(diskann::Metric m) else { std::stringstream stream; - stream << "Only L2 and cosine supported for unsigned byte vectors." << std::endl; + stream << "Only L2 and cosine supported for uint32_t byte vectors." << std::endl; diskann::cerr << stream.str() << std::endl; throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -648,4 +726,8 @@ template DISKANN_DLLEXPORT class DistanceFastL2; template DISKANN_DLLEXPORT class DistanceFastL2; template DISKANN_DLLEXPORT class DistanceFastL2; +template DISKANN_DLLEXPORT class SlowDistanceL2; +template DISKANN_DLLEXPORT class SlowDistanceL2; +template DISKANN_DLLEXPORT class SlowDistanceL2; + } // namespace diskann diff --git a/src/dll/CMakeLists.txt b/src/dll/CMakeLists.txt index f9abe1e15..d00cfeb95 100644 --- a/src/dll/CMakeLists.txt +++ b/src/dll/CMakeLists.txt @@ -1,11 +1,13 @@ #Copyright(c) Microsoft Corporation.All rights reserved. #Licensed under the MIT license. -add_library(${PROJECT_NAME} SHARED dllmain.cpp ../partition.cpp ../pq.cpp ../pq_flash_index.cpp ../logger.cpp ../utils.cpp - ../windows_aligned_file_reader.cpp ../distance.cpp ../memory_mapper.cpp ../index.cpp ../math_utils.cpp ../disk_utils.cpp - ../ann_exception.cpp ../natural_number_set.cpp ../natural_number_map.cpp ../scratch.cpp) +add_library(${PROJECT_NAME} SHARED dllmain.cpp ../abstract_data_store.cpp ../partition.cpp ../pq.cpp ../pq_flash_index.cpp ../logger.cpp ../utils.cpp + ../windows_aligned_file_reader.cpp ../distance.cpp ../memory_mapper.cpp ../index.cpp + ../in_mem_data_store.cpp ../in_mem_graph_store.cpp ../math_utils.cpp ../disk_utils.cpp ../filter_utils.cpp + ../ann_exception.cpp ../natural_number_set.cpp ../natural_number_map.cpp ../scratch.cpp ../index_factory.cpp ../abstract_index.cpp) set(TARGET_DIR "$<$:${CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG}>$<$:${CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE}>") + set(DISKANN_DLL_IMPLIB "${TARGET_DIR}/${PROJECT_NAME}.lib") target_compile_definitions(${PROJECT_NAME} PRIVATE _USRDLL _WINDLL) diff --git a/src/filter_utils.cpp b/src/filter_utils.cpp new file mode 100644 index 000000000..965762d1f --- /dev/null +++ b/src/filter_utils.cpp @@ -0,0 +1,284 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include +#include +#include +#include +#include + +#include +#include "filter_utils.h" +#include "index.h" +#include "parameters.h" +#include "utils.h" + +namespace diskann +{ +/* + * Using passed in parameters and files generated from step 3, + * builds a vanilla diskANN index for each label. + * + * Each index is saved under the following path: + * final_index_path_prefix + "_" + label + */ +template +void generate_label_indices(path input_data_path, path final_index_path_prefix, label_set all_labels, uint32_t R, + uint32_t L, float alpha, uint32_t num_threads) +{ + diskann::IndexWriteParameters label_index_build_parameters = diskann::IndexWriteParametersBuilder(L, R) + .with_saturate_graph(false) + .with_alpha(alpha) + .with_num_threads(num_threads) + .build(); + + std::cout << "Generating indices per label..." << std::endl; + // for each label, build an index on resp. points + double total_indexing_time = 0.0, indexing_percentage = 0.0; + std::cout.setstate(std::ios_base::failbit); + diskann::cout.setstate(std::ios_base::failbit); + for (const auto &lbl : all_labels) + { + path curr_label_input_data_path(input_data_path + "_" + lbl); + path curr_label_index_path(final_index_path_prefix + "_" + lbl); + + size_t number_of_label_points, dimension; + diskann::get_bin_metadata(curr_label_input_data_path, number_of_label_points, dimension); + diskann::Index index(diskann::Metric::L2, dimension, number_of_label_points, false, false); + + auto index_build_timer = std::chrono::high_resolution_clock::now(); + index.build(curr_label_input_data_path.c_str(), number_of_label_points, label_index_build_parameters); + std::chrono::duration current_indexing_time = + std::chrono::high_resolution_clock::now() - index_build_timer; + + total_indexing_time += current_indexing_time.count(); + indexing_percentage += (1 / (double)all_labels.size()); + print_progress(indexing_percentage); + + index.save(curr_label_index_path.c_str()); + } + std::cout.clear(); + diskann::cout.clear(); + + std::cout << "\nDone. Generated per-label indices in " << total_indexing_time << " seconds\n" << std::endl; +} + +// for use on systems without writev (i.e. Windows) +template +tsl::robin_map> generate_label_specific_vector_files_compat( + path input_data_path, tsl::robin_map labels_to_number_of_points, + std::vector point_ids_to_labels, label_set all_labels) +{ + auto file_writing_timer = std::chrono::high_resolution_clock::now(); + std::ifstream input_data_stream(input_data_path); + + uint32_t number_of_points, dimension; + input_data_stream.read((char *)&number_of_points, sizeof(uint32_t)); + input_data_stream.read((char *)&dimension, sizeof(uint32_t)); + const uint32_t VECTOR_SIZE = dimension * sizeof(T); + if (number_of_points != point_ids_to_labels.size()) + { + std::cerr << "Error: number of points in labels file and data file differ." << std::endl; + throw; + } + + tsl::robin_map labels_to_vectors; + tsl::robin_map labels_to_curr_vector; + tsl::robin_map> label_id_to_orig_id; + + for (const auto &lbl : all_labels) + { + uint32_t number_of_label_pts = labels_to_number_of_points[lbl]; + char *vectors = (char *)malloc(number_of_label_pts * VECTOR_SIZE); + if (vectors == nullptr) + { + throw; + } + labels_to_vectors[lbl] = vectors; + labels_to_curr_vector[lbl] = 0; + label_id_to_orig_id[lbl].reserve(number_of_label_pts); + } + + for (uint32_t point_id = 0; point_id < number_of_points; point_id++) + { + char *curr_vector = (char *)malloc(VECTOR_SIZE); + input_data_stream.read(curr_vector, VECTOR_SIZE); + for (const auto &lbl : point_ids_to_labels[point_id]) + { + char *curr_label_vector_ptr = labels_to_vectors[lbl] + (labels_to_curr_vector[lbl] * VECTOR_SIZE); + memcpy(curr_label_vector_ptr, curr_vector, VECTOR_SIZE); + labels_to_curr_vector[lbl]++; + label_id_to_orig_id[lbl].push_back(point_id); + } + free(curr_vector); + } + + for (const auto &lbl : all_labels) + { + path curr_label_input_data_path(input_data_path + "_" + lbl); + uint32_t number_of_label_pts = labels_to_number_of_points[lbl]; + + std::ofstream label_file_stream; + label_file_stream.exceptions(std::ios::badbit | std::ios::failbit); + label_file_stream.open(curr_label_input_data_path, std::ios_base::binary); + label_file_stream.write((char *)&number_of_label_pts, sizeof(uint32_t)); + label_file_stream.write((char *)&dimension, sizeof(uint32_t)); + label_file_stream.write((char *)labels_to_vectors[lbl], number_of_label_pts * VECTOR_SIZE); + + label_file_stream.close(); + free(labels_to_vectors[lbl]); + } + input_data_stream.close(); + + std::chrono::duration file_writing_time = std::chrono::high_resolution_clock::now() - file_writing_timer; + std::cout << "generated " << all_labels.size() << " label-specific vector files for index building in time " + << file_writing_time.count() << "\n" + << std::endl; + + return label_id_to_orig_id; +} + +/* + * Manually loads a graph index in from a given file. + * + * Returns both the graph index and the size of the file in bytes. + */ +load_label_index_return_values load_label_index(path label_index_path, uint32_t label_number_of_points) +{ + std::ifstream label_index_stream; + label_index_stream.exceptions(std::ios::badbit | std::ios::failbit); + label_index_stream.open(label_index_path, std::ios::binary); + + uint64_t index_file_size, index_num_frozen_points; + uint32_t index_max_observed_degree, index_entry_point; + const size_t INDEX_METADATA = 2 * sizeof(uint64_t) + 2 * sizeof(uint32_t); + label_index_stream.read((char *)&index_file_size, sizeof(uint64_t)); + label_index_stream.read((char *)&index_max_observed_degree, sizeof(uint32_t)); + label_index_stream.read((char *)&index_entry_point, sizeof(uint32_t)); + label_index_stream.read((char *)&index_num_frozen_points, sizeof(uint64_t)); + size_t bytes_read = INDEX_METADATA; + + std::vector> label_index(label_number_of_points); + uint32_t nodes_read = 0; + while (bytes_read != index_file_size) + { + uint32_t current_node_num_neighbors; + label_index_stream.read((char *)¤t_node_num_neighbors, sizeof(uint32_t)); + nodes_read++; + + std::vector current_node_neighbors(current_node_num_neighbors); + label_index_stream.read((char *)current_node_neighbors.data(), current_node_num_neighbors * sizeof(uint32_t)); + label_index[nodes_read - 1].swap(current_node_neighbors); + bytes_read += sizeof(uint32_t) * (current_node_num_neighbors + 1); + } + + return std::make_tuple(label_index, index_file_size); +} + +/* + * Parses the label datafile, which has comma-separated labels on + * each line. Line i corresponds to point id i. + * + * Returns three objects via std::tuple: + * 1. map: key is point id, value is vector of labels said point has + * 2. map: key is label, value is number of points with the label + * 3. the label universe as a set + */ +parse_label_file_return_values parse_label_file(path label_data_path, std::string universal_label) +{ + std::ifstream label_data_stream(label_data_path); + std::string line, token; + uint32_t line_cnt = 0; + + // allows us to reserve space for the points_to_labels vector + while (std::getline(label_data_stream, line)) + line_cnt++; + label_data_stream.clear(); + label_data_stream.seekg(0, std::ios::beg); + + // values to return + std::vector point_ids_to_labels(line_cnt); + tsl::robin_map labels_to_number_of_points; + label_set all_labels; + + std::vector points_with_universal_label; + line_cnt = 0; + while (std::getline(label_data_stream, line)) + { + std::istringstream current_labels_comma_separated(line); + label_set current_labels; + + // get point id + uint32_t point_id = line_cnt; + + // parse comma separated labels + bool current_universal_label_check = false; + while (getline(current_labels_comma_separated, token, ',')) + { + token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); + token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); + + // if token is empty, there's no labels for the point + if (token == universal_label) + { + points_with_universal_label.push_back(point_id); + current_universal_label_check = true; + } + else + { + all_labels.insert(token); + current_labels.insert(token); + labels_to_number_of_points[token]++; + } + } + + if (current_labels.size() <= 0 && !current_universal_label_check) + { + std::cerr << "Error: " << point_id << " has no labels." << std::endl; + exit(-1); + } + point_ids_to_labels[point_id] = current_labels; + line_cnt++; + } + + // for every point with universal label, set its label set to all labels + // also, increment the count for number of points a label has + for (const auto &point_id : points_with_universal_label) + { + point_ids_to_labels[point_id] = all_labels; + for (const auto &lbl : all_labels) + labels_to_number_of_points[lbl]++; + } + + std::cout << "Identified " << all_labels.size() << " distinct label(s) for " << point_ids_to_labels.size() + << " points\n" + << std::endl; + + return std::make_tuple(point_ids_to_labels, labels_to_number_of_points, all_labels); +} + +template DISKANN_DLLEXPORT void generate_label_indices(path input_data_path, path final_index_path_prefix, + label_set all_labels, uint32_t R, uint32_t L, float alpha, + uint32_t num_threads); +template DISKANN_DLLEXPORT void generate_label_indices(path input_data_path, path final_index_path_prefix, + label_set all_labels, uint32_t R, uint32_t L, + float alpha, uint32_t num_threads); +template DISKANN_DLLEXPORT void generate_label_indices(path input_data_path, path final_index_path_prefix, + label_set all_labels, uint32_t R, uint32_t L, + float alpha, uint32_t num_threads); + +template DISKANN_DLLEXPORT tsl::robin_map> +generate_label_specific_vector_files_compat(path input_data_path, + tsl::robin_map labels_to_number_of_points, + std::vector point_ids_to_labels, label_set all_labels); +template DISKANN_DLLEXPORT tsl::robin_map> +generate_label_specific_vector_files_compat(path input_data_path, + tsl::robin_map labels_to_number_of_points, + std::vector point_ids_to_labels, label_set all_labels); +template DISKANN_DLLEXPORT tsl::robin_map> +generate_label_specific_vector_files_compat(path input_data_path, + tsl::robin_map labels_to_number_of_points, + std::vector point_ids_to_labels, label_set all_labels); + +} // namespace diskann \ No newline at end of file diff --git a/src/in_mem_data_store.cpp b/src/in_mem_data_store.cpp new file mode 100644 index 000000000..f5f973917 --- /dev/null +++ b/src/in_mem_data_store.cpp @@ -0,0 +1,370 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include +#include "in_mem_data_store.h" + +#include "utils.h" + +namespace diskann +{ + +template +InMemDataStore::InMemDataStore(const location_t num_points, const size_t dim, + std::shared_ptr> distance_fn) + : AbstractDataStore(num_points, dim), _distance_fn(distance_fn) +{ + _aligned_dim = ROUND_UP(dim, _distance_fn->get_required_alignment()); + alloc_aligned(((void **)&_data), this->_capacity * _aligned_dim * sizeof(data_t), 8 * sizeof(data_t)); + std::memset(_data, 0, this->_capacity * _aligned_dim * sizeof(data_t)); +} + +template InMemDataStore::~InMemDataStore() +{ + if (_data != nullptr) + { + aligned_free(this->_data); + } +} + +template size_t InMemDataStore::get_aligned_dim() const +{ + return _aligned_dim; +} + +template size_t InMemDataStore::get_alignment_factor() const +{ + return _distance_fn->get_required_alignment(); +} + +template location_t InMemDataStore::load(const std::string &filename) +{ + return load_impl(filename); +} + +#ifdef EXEC_ENV_OLS +template location_t InMemDataStore::load_impl(AlignedFileReader &reader) +{ + size_t file_dim, file_num_points; + + diskann::get_bin_metadata(reader, file_num_points, file_dim); + + if (file_dim != this->_dim) + { + std::stringstream stream; + stream << "ERROR: Driver requests loading " << this->_dim << " dimension," + << "but file has " << file_dim << " dimension." << std::endl; + diskann::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); + } + + if (file_num_points > this->capacity()) + { + this->resize((location_t)file_num_points); + } + copy_aligned_data_from_file(reader, _data, file_num_points, file_dim, _aligned_dim); + + return (location_t)file_num_points; +} +#endif + +template location_t InMemDataStore::load_impl(const std::string &filename) +{ + size_t file_dim, file_num_points; + if (!file_exists(filename)) + { + std::stringstream stream; + stream << "ERROR: data file " << filename << " does not exist." << std::endl; + diskann::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); + } + diskann::get_bin_metadata(filename, file_num_points, file_dim); + + if (file_dim != this->_dim) + { + std::stringstream stream; + stream << "ERROR: Driver requests loading " << this->_dim << " dimension," + << "but file has " << file_dim << " dimension." << std::endl; + diskann::cerr << stream.str() << std::endl; + aligned_free(_data); + throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); + } + + if (file_num_points > this->capacity()) + { + this->resize((location_t)file_num_points); + } + + copy_aligned_data_from_file(filename.c_str(), _data, file_num_points, file_dim, _aligned_dim); + + return (location_t)file_num_points; +} + +template size_t InMemDataStore::save(const std::string &filename, const location_t num_points) +{ + return save_data_in_base_dimensions(filename, _data, num_points, this->get_dims(), this->get_aligned_dim(), 0U); +} + +template void InMemDataStore::populate_data(const data_t *vectors, const location_t num_pts) +{ + memset(_data, 0, _aligned_dim * sizeof(data_t) * num_pts); + for (location_t i = 0; i < num_pts; i++) + { + std::memmove(_data + i * _aligned_dim, vectors + i * this->_dim, this->_dim * sizeof(data_t)); + } + + if (_distance_fn->preprocessing_required()) + { + _distance_fn->preprocess_base_points(_data, this->_aligned_dim, num_pts); + } +} + +template void InMemDataStore::populate_data(const std::string &filename, const size_t offset) +{ + size_t npts, ndim; + copy_aligned_data_from_file(filename.c_str(), _data, npts, ndim, _aligned_dim, offset); + + if ((location_t)npts > this->capacity()) + { + std::stringstream ss; + ss << "Number of points in the file: " << filename + << " is greater than the capacity of data store: " << this->capacity() + << ". Must invoke resize before calling populate_data()" << std::endl; + throw diskann::ANNException(ss.str(), -1); + } + + if ((location_t)ndim != this->get_dims()) + { + std::stringstream ss; + ss << "Number of dimensions of a point in the file: " << filename + << " is not equal to dimensions of data store: " << this->capacity() << "." << std::endl; + throw diskann::ANNException(ss.str(), -1); + } + + if (_distance_fn->preprocessing_required()) + { + _distance_fn->preprocess_base_points(_data, this->_aligned_dim, this->capacity()); + } +} + +template +void InMemDataStore::extract_data_to_bin(const std::string &filename, const location_t num_points) +{ + save_data_in_base_dimensions(filename, _data, num_points, this->get_dims(), this->get_aligned_dim(), 0U); +} + +template void InMemDataStore::get_vector(const location_t i, data_t *dest) const +{ + memcpy(dest, _data + i * _aligned_dim, this->_dim * sizeof(data_t)); +} + +template void InMemDataStore::set_vector(const location_t loc, const data_t *const vector) +{ + size_t offset_in_data = loc * _aligned_dim; + memset(_data + offset_in_data, 0, _aligned_dim * sizeof(data_t)); + memcpy(_data + offset_in_data, vector, this->_dim * sizeof(data_t)); + if (_distance_fn->preprocessing_required()) + { + _distance_fn->preprocess_base_points(_data + offset_in_data, _aligned_dim, 1); + } +} + +template void InMemDataStore::prefetch_vector(const location_t loc) +{ + diskann::prefetch_vector((const char *)_data + _aligned_dim * (size_t)loc, sizeof(data_t) * _aligned_dim); +} + +template float InMemDataStore::get_distance(const data_t *query, const location_t loc) const +{ + return _distance_fn->compare(query, _data + _aligned_dim * loc, (uint32_t)_aligned_dim); +} + +template +void InMemDataStore::get_distance(const data_t *query, const location_t *locations, + const uint32_t location_count, float *distances) const +{ + for (location_t i = 0; i < location_count; i++) + { + distances[i] = _distance_fn->compare(query, _data + locations[i] * _aligned_dim, (uint32_t)this->_aligned_dim); + } +} + +template +float InMemDataStore::get_distance(const location_t loc1, const location_t loc2) const +{ + return _distance_fn->compare(_data + loc1 * _aligned_dim, _data + loc2 * _aligned_dim, + (uint32_t)this->_aligned_dim); +} + +template location_t InMemDataStore::expand(const location_t new_size) +{ + if (new_size == this->capacity()) + { + return this->capacity(); + } + else if (new_size < this->capacity()) + { + std::stringstream ss; + ss << "Cannot 'expand' datastore when new capacity (" << new_size << ") < existing capacity(" + << this->capacity() << ")" << std::endl; + throw diskann::ANNException(ss.str(), -1); + } +#ifndef _WINDOWS + data_t *new_data; + alloc_aligned((void **)&new_data, new_size * _aligned_dim * sizeof(data_t), 8 * sizeof(data_t)); + memcpy(new_data, _data, this->capacity() * _aligned_dim * sizeof(data_t)); + aligned_free(_data); + _data = new_data; +#else + realloc_aligned((void **)&_data, new_size * _aligned_dim * sizeof(data_t), 8 * sizeof(data_t)); +#endif + this->_capacity = new_size; + return this->_capacity; +} + +template location_t InMemDataStore::shrink(const location_t new_size) +{ + if (new_size == this->capacity()) + { + return this->capacity(); + } + else if (new_size > this->capacity()) + { + std::stringstream ss; + ss << "Cannot 'shrink' datastore when new capacity (" << new_size << ") > existing capacity(" + << this->capacity() << ")" << std::endl; + throw diskann::ANNException(ss.str(), -1); + } +#ifndef _WINDOWS + data_t *new_data; + alloc_aligned((void **)&new_data, new_size * _aligned_dim * sizeof(data_t), 8 * sizeof(data_t)); + memcpy(new_data, _data, new_size * _aligned_dim * sizeof(data_t)); + aligned_free(_data); + _data = new_data; +#else + realloc_aligned((void **)&_data, new_size * _aligned_dim * sizeof(data_t), 8 * sizeof(data_t)); +#endif + this->_capacity = new_size; + return this->_capacity; +} + +template +void InMemDataStore::move_vectors(const location_t old_location_start, const location_t new_location_start, + const location_t num_locations) +{ + if (num_locations == 0 || old_location_start == new_location_start) + { + return; + } + + /* // Update pointers to the moved nodes. Note: the computation is correct + even + // when new_location_start < old_location_start given the C++ uint32_t + // integer arithmetic rules. + const uint32_t location_delta = new_location_start - old_location_start; + */ + // The [start, end) interval which will contain obsolete points to be + // cleared. + uint32_t mem_clear_loc_start = old_location_start; + uint32_t mem_clear_loc_end_limit = old_location_start + num_locations; + + if (new_location_start < old_location_start) + { + // If ranges are overlapping, make sure not to clear the newly copied + // data. + if (mem_clear_loc_start < new_location_start + num_locations) + { + // Clear only after the end of the new range. + mem_clear_loc_start = new_location_start + num_locations; + } + } + else + { + // If ranges are overlapping, make sure not to clear the newly copied + // data. + if (mem_clear_loc_end_limit > new_location_start) + { + // Clear only up to the beginning of the new range. + mem_clear_loc_end_limit = new_location_start; + } + } + + // Use memmove to handle overlapping ranges. + copy_vectors(old_location_start, new_location_start, num_locations); + memset(_data + _aligned_dim * mem_clear_loc_start, 0, + sizeof(data_t) * _aligned_dim * (mem_clear_loc_end_limit - mem_clear_loc_start)); +} + +template +void InMemDataStore::copy_vectors(const location_t from_loc, const location_t to_loc, + const location_t num_points) +{ + assert(from_loc < this->_capacity); + assert(to_loc < this->_capacity); + assert(num_points < this->_capacity); + memmove(_data + _aligned_dim * to_loc, _data + _aligned_dim * from_loc, num_points * _aligned_dim * sizeof(data_t)); +} + +template location_t InMemDataStore::calculate_medoid() const +{ + // allocate and init centroid + float *center = new float[_aligned_dim]; + for (size_t j = 0; j < _aligned_dim; j++) + center[j] = 0; + + for (size_t i = 0; i < this->capacity(); i++) + for (size_t j = 0; j < _aligned_dim; j++) + center[j] += (float)_data[i * _aligned_dim + j]; + + for (size_t j = 0; j < _aligned_dim; j++) + center[j] /= (float)this->capacity(); + + // compute all to one distance + float *distances = new float[this->capacity()]; + + // TODO: REFACTOR. Removing pragma might make this slow. Must revisit. + // Problem is that we need to pass num_threads here, it is not clear + // if data store must be aware of threads! + // #pragma omp parallel for schedule(static, 65536) + for (int64_t i = 0; i < (int64_t)this->capacity(); i++) + { + // extract point and distance reference + float &dist = distances[i]; + const data_t *cur_vec = _data + (i * (size_t)_aligned_dim); + dist = 0; + float diff = 0; + for (size_t j = 0; j < _aligned_dim; j++) + { + diff = (center[j] - (float)cur_vec[j]) * (center[j] - (float)cur_vec[j]); + dist += diff; + } + } + // find imin + uint32_t min_idx = 0; + float min_dist = distances[0]; + for (uint32_t i = 1; i < this->capacity(); i++) + { + if (distances[i] < min_dist) + { + min_idx = i; + min_dist = distances[i]; + } + } + + delete[] distances; + delete[] center; + return min_idx; +} + +template Distance *InMemDataStore::get_dist_fn() +{ + return this->_distance_fn.get(); +} + +template DISKANN_DLLEXPORT class InMemDataStore; +template DISKANN_DLLEXPORT class InMemDataStore; +template DISKANN_DLLEXPORT class InMemDataStore; + +} // namespace diskann \ No newline at end of file diff --git a/src/in_mem_graph_store.cpp b/src/in_mem_graph_store.cpp new file mode 100644 index 000000000..e9bfd4e9e --- /dev/null +++ b/src/in_mem_graph_store.cpp @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include "in_mem_graph_store.h" +#include "utils.h" + +namespace diskann +{ + +InMemGraphStore::InMemGraphStore(const size_t max_pts) : AbstractGraphStore(max_pts) +{ +} + +int InMemGraphStore::load(const std::string &index_path_prefix) +{ + return 0; +} +int InMemGraphStore::store(const std::string &index_path_prefix) +{ + return 0; +} + +void InMemGraphStore::get_adj_list(const location_t i, std::vector &neighbors) +{ +} + +void InMemGraphStore::set_adj_list(const location_t i, std::vector &neighbors) +{ +} + +} // namespace diskann diff --git a/src/index.cpp b/src/index.cpp index d348a510f..ef35c6912 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -30,34 +30,38 @@ namespace diskann // (bin), and initialize max_points template Index::Index(Metric m, const size_t dim, const size_t max_points, const bool dynamic_index, - const Parameters &indexParams, const Parameters &searchParams, const bool enable_tags, - const bool concurrent_consolidate, const bool pq_dist_build, const size_t num_pq_chunks, - const bool use_opq) + const IndexWriteParameters &indexParams, const uint32_t initial_search_list_size, + const uint32_t search_threads, const bool enable_tags, const bool concurrent_consolidate, + const bool pq_dist_build, const size_t num_pq_chunks, const bool use_opq) : Index(m, dim, max_points, dynamic_index, enable_tags, concurrent_consolidate, pq_dist_build, num_pq_chunks, - use_opq, indexParams.Get("num_frozen_pts", 0)) + use_opq, indexParams.num_frozen_points) { - _indexingQueueSize = indexParams.Get("L"); - _indexingRange = indexParams.Get("R"); - _indexingMaxC = indexParams.Get("C"); - _indexingAlpha = indexParams.Get("alpha"); - _filterIndexingQueueSize = indexParams.Get("Lf"); + if (dynamic_index) + { + this->enable_delete(); + } + _indexingQueueSize = indexParams.search_list_size; + _indexingRange = indexParams.max_degree; + _indexingMaxC = indexParams.max_occlusion_size; + _indexingAlpha = indexParams.alpha; + _filterIndexingQueueSize = indexParams.filter_list_size; - uint32_t num_threads_srch = searchParams.Get("num_threads"); - uint32_t num_threads_indx = indexParams.Get("num_threads"); - uint32_t num_scratch_spaces = num_threads_srch + num_threads_indx; - uint32_t search_l = searchParams.Get("L"); + uint32_t num_threads_indx = indexParams.num_threads; + uint32_t num_scratch_spaces = search_threads + num_threads_indx; - initialize_query_scratch(num_scratch_spaces, search_l, _indexingQueueSize, _indexingRange, _indexingMaxC, dim); + initialize_query_scratch(num_scratch_spaces, initial_search_list_size, _indexingQueueSize, _indexingRange, + _indexingMaxC, dim); } template Index::Index(Metric m, const size_t dim, const size_t max_points, const bool dynamic_index, const bool enable_tags, const bool concurrent_consolidate, const bool pq_dist_build, - const size_t num_pq_chunks, const bool use_opq, const size_t num_frozen_pts) - : _dist_metric(m), _dim(dim), _num_frozen_pts(num_frozen_pts), _max_points(max_points), + const size_t num_pq_chunks, const bool use_opq, const size_t num_frozen_pts, + const bool init_data_store) + : _dist_metric(m), _dim(dim), _max_points(max_points), _num_frozen_pts(num_frozen_pts), _dynamic_index(dynamic_index), _enable_tags(enable_tags), _indexingMaxC(DEFAULT_MAXC), _query_scratch(nullptr), - _conc_consolidate(concurrent_consolidate), _delete_set(new tsl::robin_set), _pq_dist(pq_dist_build), - _use_opq(use_opq), _num_pq_chunks(num_pq_chunks) + _pq_dist(pq_dist_build), _use_opq(use_opq), _num_pq_chunks(num_pq_chunks), + _delete_set(new tsl::robin_set), _conc_consolidate(concurrent_consolidate) { if (dynamic_index && !enable_tags) { @@ -71,14 +75,12 @@ Index::Index(Metric m, const size_t dim, const size_t max_point "index construction", -1, __FUNCSIG__, __FILE__, __LINE__); if (m == diskann::Metric::INNER_PRODUCT) - throw ANNException("ERROR: Inner product metrics not yet supported with PQ distance " + throw ANNException("ERROR: Inner product metrics not yet supported " + "with PQ distance " "base index", -1, __FUNCSIG__, __FILE__, __LINE__); } - // data stored to _nd * aligned_dim matrix with necessary zero-padding - _aligned_dim = ROUND_UP(_dim, 8); - if (dynamic_index && _num_frozen_pts == 0) { _num_frozen_pts = 1; @@ -98,25 +100,31 @@ Index::Index(Metric m, const size_t dim, const size_t max_point alloc_aligned(((void **)&_pq_data), total_internal_points * _num_pq_chunks * sizeof(char), 8 * sizeof(char)); std::memset(_pq_data, 0, total_internal_points * _num_pq_chunks * sizeof(char)); } - alloc_aligned(((void **)&_data), total_internal_points * _aligned_dim * sizeof(T), 8 * sizeof(T)); - std::memset(_data, 0, total_internal_points * _aligned_dim * sizeof(T)); - _start = (unsigned)_max_points; + _start = (uint32_t)_max_points; _final_graph.resize(total_internal_points); - if (m == diskann::Metric::COSINE && std::is_floating_point::value) + if (init_data_store) { - // This is safe because T is float inside the if block. - this->_distance = (Distance *)new AVXNormalizedCosineDistanceFloat(); - this->_normalize_vecs = true; - diskann::cout << "Normalizing vectors and using L2 for cosine " - "AVXNormalizedCosineDistanceFloat()." - << std::endl; - } - else - { - this->_distance = get_distance_function(m); + // Issue #374: data_store is injected from index factory. Keeping this for backward compatibility. + // distance is owned by data_store + if (m == diskann::Metric::COSINE && std::is_floating_point::value) + { + // This is safe because T is float inside the if block. + this->_distance.reset((Distance *)new AVXNormalizedCosineDistanceFloat()); + this->_normalize_vecs = true; + diskann::cout << "Normalizing vectors and using L2 for cosine " + "AVXNormalizedCosineDistanceFloat()." + << std::endl; + } + else + { + this->_distance.reset((Distance *)get_distance_function(m)); + } + // Note: moved this to factory, keeping this for backward compatibility. + _data_store = + std::make_unique>((location_t)total_internal_points, _dim, this->_distance); } _locks = std::vector(total_internal_points); @@ -128,6 +136,37 @@ Index::Index(Metric m, const size_t dim, const size_t max_point } } +template +Index::Index(const IndexConfig &index_config, std::unique_ptr> data_store) + : Index(index_config.metric, index_config.dimension, index_config.max_points, index_config.dynamic_index, + index_config.enable_tags, index_config.concurrent_consolidate, index_config.pq_dist_build, + index_config.num_pq_chunks, index_config.use_opq, index_config.num_frozen_pts, false) +{ + + _data_store = std::move(data_store); + _distance.reset(_data_store->get_dist_fn()); + + // enable delete by default for dynamic index + if (_dynamic_index) + { + this->enable_delete(); + } + if (_dynamic_index && index_config.index_write_params != nullptr) + { + _indexingQueueSize = index_config.index_write_params->search_list_size; + _indexingRange = index_config.index_write_params->max_degree; + _indexingMaxC = index_config.index_write_params->max_occlusion_size; + _indexingAlpha = index_config.index_write_params->alpha; + _filterIndexingQueueSize = index_config.index_write_params->filter_list_size; + + uint32_t num_threads_indx = index_config.index_write_params->num_threads; + uint32_t num_scratch_spaces = index_config.search_threads + num_threads_indx; + + initialize_query_scratch(num_scratch_spaces, index_config.initial_search_list_size, _indexingQueueSize, + _indexingRange, _indexingMaxC, _data_store->get_dims()); + } +} + template Index::~Index() { // Ensure that no other activity is happening before dtor() @@ -141,16 +180,13 @@ template Index::~I LockGuard lg(lock); } - if (this->_distance != nullptr) - { - delete this->_distance; - this->_distance = nullptr; - } - if (this->_data != nullptr) - { - aligned_free(this->_data); - this->_data = nullptr; - } + // if (this->_distance != nullptr) + //{ + // delete this->_distance; + // this->_distance = nullptr; + // } + // REFACTOR + if (_opt_graph != nullptr) { delete[] _opt_graph; @@ -169,12 +205,13 @@ void Index::initialize_query_scratch(uint32_t num_threads, uint { for (uint32_t i = 0; i < num_threads; i++) { - auto scratch = new InMemQueryScratch(search_l, indexing_l, r, maxc, dim, _pq_dist, bitmask_size); + auto scratch = new InMemQueryScratch(search_l, indexing_l, r, maxc, dim, _data_store->get_aligned_dim(), + _data_store->get_alignment_factor(), _pq_dist, bitmask_size); _query_scratch.push(scratch); } } -template _u64 Index::save_tags(std::string tags_file) +template size_t Index::save_tags(std::string tags_file) { if (!_enable_tags) { @@ -183,7 +220,7 @@ template _u64 Index _u64 Index _u64 Index::save_data(std::string data_file) +template size_t Index::save_data(std::string data_file) { - // Note: at this point, either _nd == _max_points or any frozen points have been - // temporarily moved to _nd, so _nd + _num_frozen_points is the valid location limit. - return save_data_in_base_dimensions(data_file, _data, _nd + _num_frozen_pts, _dim, _aligned_dim); + // Note: at this point, either _nd == _max_points or any frozen points have + // been temporarily moved to _nd, so _nd + _num_frozen_points is the valid + // location limit. + return _data_store->save(data_file, (location_t)(_nd + _num_frozen_pts)); } // 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 _u64 Index::save_graph(std::string graph_file) +// 4 byte uint32_t) +template size_t Index::save_graph(std::string graph_file) { std::ofstream out; open_file_to_write(out, graph_file); - _u64 file_offset = 0; // we will use this if we want + size_t file_offset = 0; // we will use this if we want out.seekp(file_offset, out.beg); - _u64 index_size = 24; - _u32 max_degree = 0; + size_t index_size = 24; + uint32_t max_degree = 0; out.write((char *)&index_size, sizeof(uint64_t)); - out.write((char *)&_max_observed_degree, sizeof(unsigned)); - unsigned ep_u32 = _start; - out.write((char *)&ep_u32, sizeof(unsigned)); - out.write((char *)&_num_frozen_pts, sizeof(_u64)); - // Note: at this point, either _nd == _max_points or any frozen points have been - // temporarily moved to _nd, so _nd + _num_frozen_points is the valid location limit. - 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)); - max_degree = _final_graph[i].size() > max_degree ? (_u32)_final_graph[i].size() : max_degree; - index_size += (_u64)(sizeof(unsigned) * (GK + 1)); + out.write((char *)&_max_observed_degree, sizeof(uint32_t)); + uint32_t ep_u32 = _start; + out.write((char *)&ep_u32, sizeof(uint32_t)); + out.write((char *)&_num_frozen_pts, sizeof(size_t)); + // Note: at this point, either _nd == _max_points or any frozen points have + // been temporarily moved to _nd, so _nd + _num_frozen_points is the valid + // location limit. + for (uint32_t i = 0; i < _nd + _num_frozen_pts; i++) + { + uint32_t GK = (uint32_t)_final_graph[i].size(); + out.write((char *)&GK, sizeof(uint32_t)); + out.write((char *)_final_graph[i].data(), GK * sizeof(uint32_t)); + max_degree = _final_graph[i].size() > max_degree ? (uint32_t)_final_graph[i].size() : max_degree; + index_size += (size_t)(sizeof(uint32_t) * (GK + 1)); } out.seekp(file_offset, out.beg); out.write((char *)&index_size, sizeof(uint64_t)); - out.write((char *)&max_degree, sizeof(_u32)); + out.write((char *)&max_degree, sizeof(uint32_t)); out.close(); return index_size; // number of bytes written } template -_u64 Index::save_delete_list(const std::string &filename) +size_t Index::save_delete_list(const std::string &filename) { if (_delete_set->size() == 0) { return 0; } - std::unique_ptr<_u32[]> delete_list = std::make_unique<_u32[]>(_delete_set->size()); - _u32 i = 0; + std::unique_ptr delete_list = std::make_unique(_delete_set->size()); + uint32_t i = 0; for (auto &del : *_delete_set) { delete_list[i++] = del; } - return save_bin<_u32>(filename, delete_list.get(), _delete_set->size(), 1); + return save_bin(filename, delete_list.get(), _delete_set->size(), 1); } template @@ -323,9 +362,9 @@ void Index::save(const char *filename, bool compact_before_save { std::ofstream label_writer(std::string(filename) + "_labels.txt"); assert(label_writer.is_open()); - for (_u32 i = 0; i < _pts_to_labels.size(); i++) + for (uint32_t i = 0; i < _pts_to_labels.size(); i++) { - for (_u32 j = 0; j < (_pts_to_labels[i].size() - 1); j++) + for (uint32_t j = 0; j < (_pts_to_labels[i].size() - 1); j++) { label_writer << _pts_to_labels[i][j] << ","; } @@ -362,7 +401,8 @@ void Index::save(const char *filename, bool compact_before_save << std::endl; } - // If frozen points were temporarily compacted to _nd, move back to _max_points. + // If frozen points were temporarily compacted to _nd, move back to + // _max_points. reposition_frozen_point_to_end(); diskann::cout << "Time taken for save: " << timer.elapsed() / 1000000.0 << "s." << std::endl; @@ -378,8 +418,9 @@ size_t Index::load_tags(const std::string tag_filename) { 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__); + diskann::cerr << "Tag file " << tag_filename << " does not exist!" << std::endl; + throw diskann::ANNException("Tag file " + tag_filename + " does not exist!", -1, __FUNCSIG__, __FILE__, + __LINE__); } #endif if (!_enable_tags) @@ -409,7 +450,7 @@ size_t Index::load_tags(const std::string tag_filename) const size_t num_data_points = file_num_points - _num_frozen_pts; _location_to_tag.reserve(num_data_points); _tag_to_location.reserve(num_data_points); - for (_u32 i = 0; i < (_u32)num_data_points; i++) + for (uint32_t i = 0; i < (uint32_t)num_data_points; i++) { TagT tag = *(tag_data + i); if (_delete_set->find(i) == _delete_set->end()) @@ -440,7 +481,6 @@ size_t Index::load_data(std::string filename) std::stringstream stream; stream << "ERROR: data file " << filename << " does not exist." << std::endl; diskann::cerr << stream.str() << std::endl; - aligned_free(_data); throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } diskann::get_bin_metadata(filename, file_num_points, file_dim); @@ -455,7 +495,6 @@ size_t Index::load_data(std::string filename) stream << "ERROR: Driver requests loading " << _dim << " dimension," << "but file has " << file_dim << " dimension." << std::endl; diskann::cerr << stream.str() << std::endl; - aligned_free(_data); throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -466,9 +505,10 @@ size_t Index::load_data(std::string filename) } #ifdef EXEC_ENV_OLS - copy_aligned_data_from_file(reader, _data, file_num_points, file_dim, _aligned_dim); + // REFACTOR TODO: Must figure out how to support aligned reader in a clean manner. + copy_aligned_data_from_file(reader, _data, file_num_points, file_dim, _data_store->get_aligned_dim()); #else - copy_aligned_data_from_file(filename.c_str(), _data, file_num_points, file_dim, _aligned_dim); + _data_store->load(filename); // offset == 0. #endif return file_num_points; } @@ -482,13 +522,13 @@ template size_t Index::load_delete_set(const std::string &filename) { #endif - std::unique_ptr<_u32[]> delete_list; - _u64 npts, ndim; + std::unique_ptr delete_list; + size_t npts, ndim; #ifdef EXEC_ENV_OLS - diskann::load_bin<_u32>(reader, delete_list, npts, ndim); + diskann::load_bin(reader, delete_list, npts, ndim); #else - diskann::load_bin<_u32>(filename, delete_list, npts, ndim); + diskann::load_bin(filename, delete_list, npts, ndim); #endif assert(ndim == 1); for (uint32_t i = 0; i < npts; i++) @@ -516,15 +556,16 @@ void Index::load(const char *filename, uint32_t num_threads, ui _has_built = true; size_t tags_file_num_pts = 0, graph_num_pts = 0, data_file_num_pts = 0, label_num_pts = 0; - +#ifndef EXEC_ENV_OLS std::string mem_index_file(filename); std::string labels_file = mem_index_file + "_labels.txt"; std::string labels_to_medoids = mem_index_file + "_labels_to_medoids.txt"; std::string labels_map_file = mem_index_file + "_labels_map.txt"; - +#endif if (!_save_as_one_file) { - // For DLVS Store, we will not support saving the index in multiple files. + // For DLVS Store, we will not support saving the index in multiple + // files. #ifndef EXEC_ENV_OLS std::string data_file = std::string(filename) + ".data"; std::string tags_file = std::string(filename) + ".tags"; @@ -557,10 +598,9 @@ void Index::load(const char *filename, uint32_t num_threads, ui << 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; diskann::cerr << stream.str() << std::endl; - aligned_free(_data); throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } - +#ifndef EXEC_ENV_OLS if (file_exists(labels_file)) { _label_map = load_label_map(labels_map_file); @@ -571,21 +611,21 @@ void Index::load(const char *filename, uint32_t num_threads, ui { std::ifstream medoid_stream(labels_to_medoids); std::string line, token; - unsigned line_cnt = 0; + uint32_t line_cnt = 0; _label_to_medoid_id.clear(); while (std::getline(medoid_stream, line)) { std::istringstream iss(line); - _u32 cnt = 0; - _u32 medoid = 0; + uint32_t cnt = 0; + uint32_t medoid = 0; LabelT label; while (std::getline(iss, token, ',')) { token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); - LabelT token_as_num = std::stoul(token); + LabelT token_as_num = (LabelT)std::stoul(token); if (cnt == 0) label = token_as_num; else @@ -607,7 +647,7 @@ void Index::load(const char *filename, uint32_t num_threads, ui universal_label_reader.close(); } } - +#endif _nd = data_file_num_pts - _num_frozen_pts; _empty_slots.clear(); _empty_slots.reserve(_max_points); @@ -638,17 +678,17 @@ template size_t Index::get_graph_num_frozen_points(const std::string &graph_file) { size_t expected_file_size; - unsigned max_observed_degree, start; - _u64 file_frozen_pts; + uint32_t max_observed_degree, start; + size_t file_frozen_pts; std::ifstream in; in.exceptions(std::ios::badbit | std::ios::failbit); in.open(graph_file, std::ios::binary); - in.read((char *)&expected_file_size, sizeof(_u64)); - in.read((char *)&max_observed_degree, sizeof(unsigned)); - in.read((char *)&start, sizeof(unsigned)); - in.read((char *)&file_frozen_pts, sizeof(_u64)); + in.read((char *)&expected_file_size, sizeof(size_t)); + in.read((char *)&max_observed_degree, sizeof(uint32_t)); + in.read((char *)&start, sizeof(uint32_t)); + in.read((char *)&file_frozen_pts, sizeof(size_t)); return file_frozen_pts; } @@ -665,29 +705,29 @@ size_t Index::load_graph(std::string filename, size_t expected_ { #endif size_t expected_file_size; - _u64 file_frozen_pts; + size_t file_frozen_pts; #ifdef EXEC_ENV_OLS - int header_size = 2 * sizeof(_u64) + 2 * sizeof(unsigned); + int header_size = 2 * sizeof(size_t) + 2 * sizeof(uint32_t); std::unique_ptr header = std::make_unique(header_size); read_array(reader, header.get(), header_size); - expected_file_size = *((_u64 *)header.get()); - _max_observed_degree = *((_u32 *)(header.get() + sizeof(_u64))); - _start = *((_u32 *)(header.get() + sizeof(_u64) + sizeof(unsigned))); - file_frozen_pts = *((_u64 *)(header.get() + sizeof(_u64) + sizeof(unsigned) + sizeof(unsigned))); + expected_file_size = *((size_t *)header.get()); + _max_observed_degree = *((uint32_t *)(header.get() + sizeof(size_t))); + _start = *((uint32_t *)(header.get() + sizeof(size_t) + sizeof(uint32_t))); + file_frozen_pts = *((size_t *)(header.get() + sizeof(size_t) + sizeof(uint32_t) + sizeof(uint32_t))); #else - _u64 file_offset = 0; // will need this for single file format support + size_t file_offset = 0; // will need this for single file format support std::ifstream in; in.exceptions(std::ios::badbit | std::ios::failbit); in.open(filename, std::ios::binary); in.seekg(file_offset, in.beg); - in.read((char *)&expected_file_size, sizeof(_u64)); - in.read((char *)&_max_observed_degree, sizeof(unsigned)); - in.read((char *)&_start, sizeof(unsigned)); - in.read((char *)&file_frozen_pts, sizeof(_u64)); - _u64 vamana_metadata_size = sizeof(_u64) + sizeof(_u32) + sizeof(_u32) + sizeof(_u64); + in.read((char *)&expected_file_size, sizeof(size_t)); + in.read((char *)&_max_observed_degree, sizeof(uint32_t)); + in.read((char *)&_start, sizeof(uint32_t)); + in.read((char *)&file_frozen_pts, sizeof(size_t)); + size_t vamana_metadata_size = sizeof(size_t) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(size_t); #endif diskann::cout << "From graph header, expected_file_size: " << expected_file_size @@ -710,7 +750,6 @@ size_t Index::load_graph(std::string filename, size_t expected_ << std::endl; } diskann::cerr << stream.str() << std::endl; - aligned_free(_data); throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -733,18 +772,18 @@ size_t Index::load_graph(std::string filename, size_t expected_ _max_points = expected_max_points; } #ifdef EXEC_ENV_OLS - _u32 nodes_read = 0; - _u64 cc = 0; - _u64 graph_offset = header_size; + uint32_t nodes_read = 0; + size_t cc = 0; + size_t graph_offset = header_size; while (nodes_read < expected_num_points) { - _u32 k; + uint32_t k; read_value(reader, k, graph_offset); - graph_offset += sizeof(_u32); - std::vector<_u32> tmp(k); + graph_offset += sizeof(uint32_t); + std::vector tmp(k); tmp.reserve(k); read_array(reader, tmp.data(), k, graph_offset); - graph_offset += k * sizeof(_u32); + graph_offset += k * sizeof(uint32_t); cc += k; _final_graph[nodes_read].swap(tmp); nodes_read++; @@ -760,11 +799,11 @@ size_t Index::load_graph(std::string filename, size_t expected_ #else size_t bytes_read = vamana_metadata_size; size_t cc = 0; - unsigned nodes_read = 0; + uint32_t nodes_read = 0; while (bytes_read != expected_file_size) { - unsigned k; - in.read((char *)&k, sizeof(unsigned)); + uint32_t k; + in.read((char *)&k, sizeof(uint32_t)); if (k == 0) { @@ -773,11 +812,11 @@ size_t Index::load_graph(std::string filename, size_t expected_ cc += k; ++nodes_read; - std::vector tmp(k); + std::vector tmp(k); tmp.reserve(k); - in.read((char *)tmp.data(), k * sizeof(unsigned)); + in.read((char *)tmp.data(), k * sizeof(uint32_t)); _final_graph[nodes_read - 1].swap(tmp); - bytes_read += sizeof(uint32_t) * ((_u64)k + 1); + bytes_read += sizeof(uint32_t) * ((size_t)k + 1); if (nodes_read % 10000000 == 0) diskann::cout << "." << std::flush; if (k > _max_range_of_loaded_graph) @@ -792,6 +831,25 @@ size_t Index::load_graph(std::string filename, size_t expected_ return nodes_read; } +template +int Index::_get_vector_by_tag(TagType &tag, DataType &vec) +{ + try + { + TagT tag_val = std::any_cast(tag); + T *vec_val = std::any_cast(vec); + return this->get_vector_by_tag(tag_val, vec_val); + } + catch (const std::bad_any_cast &e) + { + throw ANNException("Error: bad any cast while performing _get_vector_by_tags() " + std::string(e.what()), -1); + } + catch (const std::exception &e) + { + throw ANNException("Error: " + std::string(e.what()), -1); + } +} + template int Index::get_vector_by_tag(TagT &tag, T *vec) { std::shared_lock lock(_tag_lock); @@ -801,73 +859,34 @@ template int Index return -1; } - size_t location = _tag_to_location[tag]; - memcpy((void *)vec, (void *)(_data + location * _aligned_dim), (size_t)_dim * sizeof(T)); + location_t location = _tag_to_location[tag]; + _data_store->get_vector(location, vec); + return 0; } -template unsigned Index::calculate_entry_point() +template uint32_t Index::calculate_entry_point() { // TODO: need to compute medoid with PQ data too, for now sample at random if (_pq_dist) { size_t r = (size_t)rand() * (size_t)RAND_MAX + (size_t)rand(); - return (unsigned)(r % (size_t)_nd); + return (uint32_t)(r % (size_t)_nd); } - // allocate and init centroid - float *center = new float[_aligned_dim](); - for (size_t j = 0; j < _aligned_dim; j++) - center[j] = 0; - - for (size_t i = 0; i < _nd; i++) - for (size_t j = 0; j < _aligned_dim; j++) - center[j] += (float)_data[i * _aligned_dim + j]; - - for (size_t j = 0; j < _aligned_dim; j++) - center[j] /= (float)_nd; - - // compute all to one distance - 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 - float &dist = distances[i]; - const T *cur_vec = _data + (i * (size_t)_aligned_dim); - dist = 0; - float diff = 0; - for (size_t j = 0; j < _aligned_dim; j++) - { - diff = (center[j] - (float)cur_vec[j]) * (center[j] - (float)cur_vec[j]); - dist += diff; - } - } - // find imin - unsigned min_idx = 0; - float min_dist = distances[0]; - for (unsigned i = 1; i < _nd; i++) - { - if (distances[i] < min_dist) - { - min_idx = i; - min_dist = distances[i]; - } - } - - delete[] distances; - delete[] center; - return min_idx; + // TODO: This function does not support multi-threaded calculation of medoid. + // Must revisit if perf is a concern. + return _data_store->calculate_medoid(); } -template std::vector Index::get_init_ids() +template std::vector Index::get_init_ids() { - std::vector init_ids; + std::vector init_ids; init_ids.reserve(1 + _num_frozen_pts); init_ids.emplace_back(_start); - for (unsigned frozen = _max_points; frozen < _max_points + _num_frozen_pts; frozen++) + for (uint32_t frozen = (uint32_t)_max_points; frozen < _max_points + _num_frozen_pts; frozen++) { if (frozen != _start) { @@ -878,32 +897,66 @@ template std::vector Inde return init_ids; } +// Find common filter between a node's labels and a given set of labels, while taking into account universal label +template +bool Index::detect_common_filters(uint32_t point_id, bool search_invocation, + const std::vector &incoming_labels) +{ + auto &curr_node_labels = _pts_to_labels[point_id]; + std::vector common_filters; + std::set_intersection(incoming_labels.begin(), incoming_labels.end(), curr_node_labels.begin(), + curr_node_labels.end(), std::back_inserter(common_filters)); + if (common_filters.size() > 0) + { + // This is to reduce the repetitive calls. If common_filters size is > 0 , we dont need to check further for + // universal label + return true; + } + if (_use_universal_label) + { + if (!search_invocation) + { + if (std::find(incoming_labels.begin(), incoming_labels.end(), _universal_label) != incoming_labels.end() || + std::find(curr_node_labels.begin(), curr_node_labels.end(), _universal_label) != curr_node_labels.end()) + common_filters.push_back(_universal_label); + } + else + { + if (std::find(curr_node_labels.begin(), curr_node_labels.end(), _universal_label) != curr_node_labels.end()) + common_filters.push_back(_universal_label); + } + } + return (common_filters.size() > 0); +} + template std::pair Index::iterate_to_fixed_point( - const T *query, const unsigned Lsize, const std::vector &init_ids, InMemQueryScratch *scratch, + const T *query, const uint32_t Lsize, const std::vector &init_ids, InMemQueryScratch *scratch, bool use_filter, const std::vector &filter_label, bool search_invocation) { std::vector &expanded_nodes = scratch->pool(); NeighborPriorityQueue &best_L_nodes = scratch->best_l_nodes(); best_L_nodes.reserve(Lsize); - tsl::robin_set &inserted_into_pool_rs = scratch->inserted_into_pool_rs(); + tsl::robin_set &inserted_into_pool_rs = scratch->inserted_into_pool_rs(); boost::dynamic_bitset<> &inserted_into_pool_bs = scratch->inserted_into_pool_bs(); - std::vector &id_scratch = scratch->id_scratch(); + std::vector &id_scratch = scratch->id_scratch(); std::vector &dist_scratch = scratch->dist_scratch(); assert(id_scratch.size() == 0); - T *aligned_query = scratch->aligned_query(); - memcpy(aligned_query, query, _dim * sizeof(T)); - if (_normalize_vecs) - { - normalize((float *)aligned_query, _dim); - } + // REFACTOR + // T *aligned_query = scratch->aligned_query(); + // memcpy(aligned_query, query, _dim * sizeof(T)); + // if (_normalize_vecs) + //{ + // normalize((float *)aligned_query, _dim); + // } + + T *aligned_query = scratch->aligned_query(); std::vector& query_bitmask_buf = scratch->query_label_bitmask(); - - float *query_float; - float *query_rotated; - float *pq_dists; - _u8 *pq_coord_scratch; + float *query_float = nullptr; + float *query_rotated = nullptr; + float *pq_dists = nullptr; + uint8_t *pq_coord_scratch = nullptr; // Intialize PQ related scratch to use PQ based distances if (_pq_dist) { @@ -948,13 +1001,13 @@ std::pair Index::iterate_to_fixed_point( } // Lambda to determine if a node has been visited - auto is_not_visited = [this, fast_iterate, &inserted_into_pool_bs, &inserted_into_pool_rs](const unsigned id) { + auto is_not_visited = [this, fast_iterate, &inserted_into_pool_bs, &inserted_into_pool_rs](const uint32_t id) { return fast_iterate ? inserted_into_pool_bs[id] == 0 : inserted_into_pool_rs.find(id) == inserted_into_pool_rs.end(); }; // Lambda to batch compute query<-> node distances in PQ space - auto compute_dists = [this, pq_coord_scratch, pq_dists](const std::vector &ids, + auto compute_dists = [this, pq_coord_scratch, pq_dists](const std::vector &ids, std::vector &dists_out) { diskann::aggregate_coords(ids, this->_pq_data, this->_num_pq_chunks, pq_coord_scratch); diskann::pq_dist_lookup(pq_coord_scratch, ids.size(), this->_num_pq_chunks, pq_dists, dists_out); @@ -1022,9 +1075,13 @@ std::pair Index::iterate_to_fixed_point( float distance; if (_pq_dist) + { pq_dist_lookup(pq_coord_scratch, 1, this->_num_pq_chunks, pq_dists, &distance); + } else - distance = _distance->compare(_data + _aligned_dim * (size_t)id, aligned_query, (unsigned)_aligned_dim); + { + distance = _data_store->get_distance(aligned_query, id); + } Neighbor nn = Neighbor(id, distance); best_L_nodes.insert(nn); } @@ -1114,17 +1171,15 @@ std::pair Index::iterate_to_fixed_point( assert(dist_scratch.size() == 0); for (size_t m = 0; m < id_scratch.size(); ++m) { - unsigned id = id_scratch[m]; + uint32_t id = id_scratch[m]; if (m + 1 < id_scratch.size()) { auto nextn = id_scratch[m + 1]; - diskann::prefetch_vector((const char *)_data + _aligned_dim * (size_t)nextn, - sizeof(T) * _aligned_dim); + _data_store->prefetch_vector(nextn); } - dist_scratch.push_back( - _distance->compare(aligned_query, _data + _aligned_dim * (size_t)id, (unsigned)_aligned_dim)); + dist_scratch.push_back(_data_store->get_distance(aligned_query, id)); } } // cmps += id_scratch.size(); @@ -1139,32 +1194,35 @@ std::pair Index::iterate_to_fixed_point( } template -void Index::search_for_point_and_prune(int location, _u32 Lindex, std::vector &pruned_list, +void Index::search_for_point_and_prune(int location, uint32_t Lindex, + std::vector &pruned_list, InMemQueryScratch *scratch, bool use_filter, - _u32 filteredLindex) + uint32_t filteredLindex) { - const std::vector init_ids = get_init_ids(); + const std::vector init_ids = get_init_ids(); const std::vector unused_filter_label; if (!use_filter) { - iterate_to_fixed_point(_data + _aligned_dim * location, Lindex, init_ids, scratch, false, unused_filter_label, - false); + _data_store->get_vector(location, scratch->aligned_query()); + iterate_to_fixed_point(scratch->aligned_query(), Lindex, init_ids, scratch, false, unused_filter_label, false); } else { - std::vector<_u32> filter_specific_start_nodes; + std::vector filter_specific_start_nodes; for (auto &x : _pts_to_labels[location]) filter_specific_start_nodes.emplace_back(_label_to_medoid_id[x]); - iterate_to_fixed_point(_data + _aligned_dim * location, filteredLindex, filter_specific_start_nodes, scratch, - true, _pts_to_labels[location], false); + + _data_store->get_vector(location, scratch->aligned_query()); + iterate_to_fixed_point(scratch->aligned_query(), filteredLindex, filter_specific_start_nodes, scratch, true, + _pts_to_labels[location], false); } auto &pool = scratch->pool(); - for (unsigned i = 0; i < pool.size(); i++) + for (uint32_t i = 0; i < pool.size(); i++) { - if (pool[i].id == (unsigned)location) + if (pool[i].id == (uint32_t)location) { pool.erase(pool.begin() + i); i--; @@ -1183,10 +1241,10 @@ void Index::search_for_point_and_prune(int location, _u32 Linde } template -void Index::occlude_list(const unsigned location, std::vector &pool, const float alpha, - const unsigned degree, const unsigned maxc, std::vector &result, +void Index::occlude_list(const uint32_t location, std::vector &pool, const float alpha, + const uint32_t degree, const uint32_t maxc, std::vector &result, InMemQueryScratch *scratch, - const tsl::robin_set *const delete_set_ptr) + const tsl::robin_set *const delete_set_ptr) { if (pool.size() == 0) return; @@ -1218,8 +1276,8 @@ void Index::occlude_list(const unsigned location, std::vector::max(); - // Add the entry to the result if its not been deleted, and doesn't add - // a self loop + // Add the entry to the result if its not been deleted, and doesn't + // add a self loop if (delete_set_ptr == nullptr || delete_set_ptr->find(iter->id) == delete_set_ptr->end()) { if (iter->id != location) @@ -1238,8 +1296,8 @@ void Index::occlude_list(const unsigned location, std::vectorid; - _u32 b = iter2->id; + uint32_t a = iter->id; + uint32_t b = iter2->id; simple_bitmask bm1(_bitmask_buf.get_bitmask(a), _bitmask_buf._bitmask_size); simple_bitmask bm2(_bitmask_buf.get_bitmask(b), _bitmask_buf._bitmask_size); @@ -1249,8 +1307,7 @@ void Index::occlude_list(const unsigned location, std::vectorcompare(_data + _aligned_dim * (size_t)iter2->id, - _data + _aligned_dim * (size_t)iter->id, (unsigned)_aligned_dim); + float djk = _data_store->get_distance(iter2->id, iter->id); if (_dist_metric == diskann::Metric::L2 || _dist_metric == diskann::Metric::COSINE) { occlude_factor[t] = (djk == 0) ? std::numeric_limits::max() @@ -1273,16 +1330,16 @@ void Index::occlude_list(const unsigned location, std::vector -void Index::prune_neighbors(const unsigned location, std::vector &pool, - std::vector &pruned_list, InMemQueryScratch *scratch) +void Index::prune_neighbors(const uint32_t location, std::vector &pool, + std::vector &pruned_list, InMemQueryScratch *scratch) { prune_neighbors(location, pool, _indexingRange, _indexingMaxC, _indexingAlpha, pruned_list, scratch); } template -void Index::prune_neighbors(const unsigned location, std::vector &pool, const _u32 range, - const _u32 max_candidate_size, const float alpha, - std::vector &pruned_list, InMemQueryScratch *scratch) +void Index::prune_neighbors(const uint32_t location, std::vector &pool, const uint32_t range, + const uint32_t max_candidate_size, const float alpha, + std::vector &pruned_list, InMemQueryScratch *scratch) { if (pool.size() == 0) { @@ -1297,14 +1354,14 @@ void Index::prune_neighbors(const unsigned location, std::vecto if (_pq_dist) { for (auto &ngh : pool) - ngh.distance = _distance->compare(_data + _aligned_dim * (size_t)ngh.id, - _data + _aligned_dim * (size_t)location, (unsigned)_aligned_dim); + ngh.distance = _data_store->get_distance(ngh.id, location); } // sort the pool based on distance to query and prune it with occlude_list std::sort(pool.begin(), pool.end()); pruned_list.clear(); pruned_list.reserve(range); + occlude_list(location, pool, alpha, range, max_candidate_size, pruned_list, scratch); assert(pruned_list.size() <= range); @@ -1322,7 +1379,7 @@ void Index::prune_neighbors(const unsigned location, std::vecto } template -void Index::inter_insert(unsigned n, std::vector &pruned_list, const _u32 range, +void Index::inter_insert(uint32_t n, std::vector &pruned_list, const uint32_t range, InMemQueryScratch *scratch) { const auto &src_pool = pruned_list; @@ -1334,14 +1391,14 @@ void Index::inter_insert(unsigned n, std::vector &pru // des.loc is the loc of the neighbors of n assert(des < _max_points + _num_frozen_pts); // des_pool contains the neighbors of the neighbors of n - std::vector copy_of_neighbors; + std::vector copy_of_neighbors; bool prune_needed = false; { LockGuard guard(_locks[des]); auto &des_pool = _final_graph[des]; if (std::find(des_pool.begin(), des_pool.end(), n) == des_pool.end()) { - if (des_pool.size() < (_u64)(GRAPH_SLACK_FACTOR * range)) + if (des_pool.size() < (uint64_t)(GRAPH_SLACK_FACTOR * range)) { des_pool.emplace_back(n); prune_needed = false; @@ -1358,7 +1415,7 @@ void Index::inter_insert(unsigned n, std::vector &pru if (prune_needed) { - tsl::robin_set dummy_visited(0); + tsl::robin_set dummy_visited(0); std::vector dummy_pool(0); size_t reserveSize = (size_t)(std::ceil(1.05 * GRAPH_SLACK_FACTOR * range)); @@ -1369,13 +1426,12 @@ void Index::inter_insert(unsigned n, std::vector &pru { if (dummy_visited.find(cur_nbr) == dummy_visited.end() && cur_nbr != des) { - float dist = _distance->compare(_data + _aligned_dim * (size_t)des, - _data + _aligned_dim * (size_t)cur_nbr, (unsigned)_aligned_dim); + float dist = _data_store->get_distance(des, cur_nbr); dummy_pool.emplace_back(Neighbor(cur_nbr, dist)); dummy_visited.insert(cur_nbr); } } - std::vector new_out_neighbors; + std::vector new_out_neighbors; prune_neighbors(des, dummy_pool, new_out_neighbors, scratch); { LockGuard guard(_locks[des]); @@ -1387,51 +1443,49 @@ void Index::inter_insert(unsigned n, std::vector &pru } template -void Index::inter_insert(unsigned n, std::vector &pruned_list, InMemQueryScratch *scratch) +void Index::inter_insert(uint32_t n, std::vector &pruned_list, InMemQueryScratch *scratch) { inter_insert(n, pruned_list, _indexingRange, scratch); } -template void Index::link(Parameters ¶meters) +template +void Index::link(const IndexWriteParameters ¶meters) { - unsigned num_threads = parameters.Get("num_threads"); + uint32_t num_threads = parameters.num_threads; if (num_threads != 0) omp_set_num_threads(num_threads); - _saturate_graph = parameters.Get("saturate_graph"); + _saturate_graph = parameters.saturate_graph; - if (num_threads != 0) - omp_set_num_threads(num_threads); - - _indexingQueueSize = parameters.Get("L"); // Search list size - _filterIndexingQueueSize = parameters.Get("Lf"); - _indexingRange = parameters.Get("R"); - _indexingMaxC = parameters.Get("C"); - _indexingAlpha = parameters.Get("alpha"); + _indexingQueueSize = parameters.search_list_size; + _filterIndexingQueueSize = parameters.filter_list_size; + _indexingRange = parameters.max_degree; + _indexingMaxC = parameters.max_occlusion_size; + _indexingAlpha = parameters.alpha; /* 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; + tsl::robin_set visited; visit_order.reserve(_nd + _num_frozen_pts); - for (unsigned i = 0; i < (unsigned)_nd; i++) + for (uint32_t i = 0; i < (uint32_t)_nd; i++) { visit_order.emplace_back(i); } // If there are any frozen points, add them all. - for (unsigned frozen = _max_points; frozen < _max_points + _num_frozen_pts; frozen++) + for (uint32_t frozen = (uint32_t)_max_points; frozen < _max_points + _num_frozen_pts; frozen++) { visit_order.emplace_back(frozen); } // if there are frozen points, the first such one is set to be the _start if (_num_frozen_pts > 0) - _start = (unsigned)_max_points; + _start = (uint32_t)_max_points; else _start = calculate_entry_point(); - for (uint64_t p = 0; p < _nd; p++) + for (size_t p = 0; p < _nd; p++) { _final_graph[p].reserve((size_t)(std::ceil(_indexingRange * GRAPH_SLACK_FACTOR * 1.05))); } @@ -1439,14 +1493,14 @@ template void Index> manager(_query_scratch); auto scratch = manager.scratch_space(); - std::vector pruned_list; + std::vector pruned_list; if (_filtered_index) { search_for_point_and_prune(node, _indexingQueueSize, pruned_list, scratch, _filtered_index, @@ -1458,7 +1512,7 @@ template void Index void Index _indexingRange) @@ -1485,16 +1539,15 @@ template void Index> manager(_query_scratch); auto scratch = manager.scratch_space(); - tsl::robin_set dummy_visited(0); + tsl::robin_set dummy_visited(0); std::vector dummy_pool(0); - std::vector new_out_neighbors; + 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); + float dist = _data_store->get_distance(node, cur_nbr); dummy_pool.emplace_back(Neighbor(cur_nbr, dist)); dummy_visited.insert(cur_nbr); } @@ -1513,24 +1566,25 @@ template void Index -void Index::prune_all_nbrs(const Parameters ¶meters) +void Index::prune_all_neighbors(const uint32_t max_degree, const uint32_t max_occlusion_size, + const float alpha) { - const unsigned range = parameters.Get("R"); - const unsigned maxc = parameters.Get("C"); - const float alpha = parameters.Get("alpha"); + const uint32_t range = max_degree; + const uint32_t maxc = max_occlusion_size; + _filtered_index = true; diskann::Timer timer; #pragma omp parallel for - for (_s64 node = 0; node < (_s64)(_max_points + _num_frozen_pts); node++) + for (int64_t node = 0; node < (int64_t)(_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); + tsl::robin_set dummy_visited(0); std::vector dummy_pool(0); - std::vector new_out_neighbors; + std::vector new_out_neighbors; ScratchStoreManager> manager(_query_scratch); auto scratch = manager.scratch_space(); @@ -1539,14 +1593,13 @@ void Index::prune_all_nbrs(const Parameters ¶meters) { 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); + float dist = _data_store->get_distance((location_t)node, (location_t)cur_nbr); dummy_pool.emplace_back(Neighbor(cur_nbr, dist)); dummy_visited.insert(cur_nbr); } } - prune_neighbors((_u32)node, dummy_pool, range, maxc, alpha, new_out_neighbors, scratch); + prune_neighbors((uint32_t)node, dummy_pool, range, maxc, alpha, new_out_neighbors, scratch); _final_graph[node].clear(); for (auto id : new_out_neighbors) _final_graph[node].emplace_back(id); @@ -1560,7 +1613,7 @@ void Index::prune_all_nbrs(const Parameters ¶meters) { if (i < _nd || i >= _max_points) { - const std::vector &pool = _final_graph[i]; + const std::vector &pool = _final_graph[i]; max = (std::max)(max, pool.size()); min = (std::min)(min, pool.size()); total += pool.size(); @@ -1578,6 +1631,7 @@ void Index::prune_all_nbrs(const Parameters ¶meters) } } +// REFACTOR template void Index::set_start_points(const T *data, size_t data_count) { @@ -1586,23 +1640,47 @@ void Index::set_start_points(const T *data, size_t data_count) if (_nd > 0) throw ANNException("Can not set starting point for a non-empty index", -1, __FUNCSIG__, __FILE__, __LINE__); - if (data_count != _num_frozen_pts * _aligned_dim) + if (data_count != _num_frozen_pts * _dim) throw ANNException("Invalid number of points", -1, __FUNCSIG__, __FILE__, __LINE__); - memcpy(_data + _aligned_dim * _max_points, data, _aligned_dim * sizeof(T) * _num_frozen_pts); + // memcpy(_data + _aligned_dim * _max_points, data, _aligned_dim * + // sizeof(T) * _num_frozen_pts); + for (location_t i = 0; i < _num_frozen_pts; i++) + { + _data_store->set_vector((location_t)(i + _max_points), data + i * _dim); + } _has_built = true; diskann::cout << "Index start points set: #" << _num_frozen_pts << std::endl; } template -void Index::set_start_points_at_random(T radius, unsigned int random_seed) +void Index::_set_start_points_at_random(DataType radius, uint32_t random_seed) +{ + try + { + T radius_to_use = std::any_cast(radius); + this->set_start_points_at_random(radius_to_use, random_seed); + } + catch (const std::bad_any_cast &e) + { + throw ANNException( + "Error: bad any cast while performing _set_start_points_at_random() " + std::string(e.what()), -1); + } + catch (const std::exception &e) + { + throw ANNException("Error: " + std::string(e.what()), -1); + } +} + +template +void Index::set_start_points_at_random(T radius, uint32_t random_seed) { std::mt19937 gen{random_seed}; std::normal_distribution<> d{0.0, 1.0}; std::vector points_data; - points_data.reserve(_aligned_dim * _num_frozen_pts); - std::vector real_vec(_aligned_dim); + points_data.reserve(_dim * _num_frozen_pts); + std::vector real_vec(_dim); for (size_t frozen_point = 0; frozen_point < _num_frozen_pts; frozen_point++) { @@ -1623,7 +1701,8 @@ void Index::set_start_points_at_random(T radius, unsigned int r } template -void Index::build_with_data_populated(Parameters ¶meters, const std::vector &tags) +void Index::build_with_data_populated(const IndexWriteParameters ¶meters, + const std::vector &tags) { diskann::cout << "Starting index build with " << _nd << " points... " << std::endl; @@ -1636,26 +1715,26 @@ void Index::build_with_data_populated(Parameters ¶meters, c stream << "ERROR: Driver requests loading " << _nd << " points from file," << "but tags vector is of size " << tags.size() << "." << std::endl; diskann::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.set(static_cast(i), tags[i]); + _tag_to_location[tags[i]] = (uint32_t)i; + _location_to_tag.set(static_cast(i), tags[i]); } } - uint32_t index_R = parameters.Get("R"); - uint32_t num_threads_index = parameters.Get("num_threads"); - uint32_t index_L = parameters.Get("L"); - uint32_t maxc = parameters.Get("C"); + uint32_t index_R = parameters.max_degree; + uint32_t num_threads_index = parameters.num_threads; + uint32_t index_L = parameters.search_list_size; + uint32_t maxc = parameters.max_occlusion_size; if (_query_scratch.size() == 0) { - initialize_query_scratch(5 + num_threads_index, index_L, index_L, index_R, maxc, _aligned_dim); + initialize_query_scratch(5 + num_threads_index, index_L, index_L, index_R, maxc, + _data_store->get_aligned_dim()); } generate_frozen_point(); @@ -1674,13 +1753,30 @@ void Index::build_with_data_populated(Parameters ¶meters, c diskann::cout << "Index built with degree: max:" << max << " avg:" << (float)total / (float)(_nd + _num_frozen_pts) << " min:" << min << " count(deg<2):" << cnt << std::endl; - _max_observed_degree = std::max((unsigned)max, _max_observed_degree); + _max_observed_degree = std::max((uint32_t)max, _max_observed_degree); _has_built = true; } - template -void Index::build(const T *data, const size_t num_points_to_load, Parameters ¶meters, - const std::vector &tags) +void Index::_build(const DataType &data, const size_t num_points_to_load, + const IndexWriteParameters ¶meters, TagVector &tags) +{ + try + { + this->build(std::any_cast(data), num_points_to_load, parameters, + tags.get>()); + } + catch (const std::bad_any_cast &e) + { + throw ANNException("Error: bad any cast in while building index. " + std::string(e.what()), -1); + } + catch (const std::exception &e) + { + throw ANNException("Error" + std::string(e.what()), -1); + } +} +template +void Index::build(const T *data, const size_t num_points_to_load, + const IndexWriteParameters ¶meters, const std::vector &tags) { if (num_points_to_load == 0) { @@ -1698,25 +1794,31 @@ void Index::build(const T *data, const size_t num_points_to_loa std::unique_lock tl(_tag_lock); _nd = num_points_to_load; - memcpy((char *)_data, (char *)data, _aligned_dim * _nd * sizeof(T)); + _data_store->populate_data(data, (location_t)num_points_to_load); - if (_normalize_vecs) - { - for (uint64_t i = 0; i < num_points_to_load; i++) - { - normalize(_data + _aligned_dim * i, _aligned_dim); - } - } + // REFACTOR + // memcpy((char *)_data, (char *)data, _aligned_dim * _nd * sizeof(T)); + // if (_normalize_vecs) + //{ + // for (size_t i = 0; i < num_points_to_load; i++) + // { + // normalize(_data + _aligned_dim * i, _aligned_dim); + // } + // } } build_with_data_populated(parameters, tags); } template -void Index::build(const char *filename, const size_t num_points_to_load, Parameters ¶meters, - const std::vector &tags) +void Index::build(const char *filename, const size_t num_points_to_load, + const IndexWriteParameters ¶meters, const std::vector &tags) { + // idealy this should call build_filtered_index based on params passed + std::unique_lock ul(_update_lock); + + // error checks if (num_points_to_load == 0) throw ANNException("Do not call build with 0 points", -1, __FUNCSIG__, __FILE__, __LINE__); @@ -1744,8 +1846,6 @@ void Index::build(const char *filename, const size_t num_points if (_pq_dist) aligned_free(_pq_data); - else - aligned_free(_data); throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -1757,8 +1857,6 @@ void Index::build(const char *filename, const size_t num_points if (_pq_dist) aligned_free(_pq_data); - else - aligned_free(_data); throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -1771,8 +1869,6 @@ void Index::build(const char *filename, const size_t num_points if (_pq_dist) aligned_free(_pq_data); - else - aligned_free(_data); throw diskann::ANNException(stream.str(), -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -1787,25 +1883,18 @@ void Index::build(const char *filename, const size_t num_points generate_quantized_data(std::string(filename), pq_pivots_file, pq_compressed_file, _dist_metric, p_val, _num_pq_chunks, _use_opq); - copy_aligned_data_from_file<_u8>(pq_compressed_file.c_str(), _pq_data, file_num_points, _num_pq_chunks, - _num_pq_chunks); + copy_aligned_data_from_file(pq_compressed_file.c_str(), _pq_data, file_num_points, _num_pq_chunks, + _num_pq_chunks); #ifdef EXEC_ENV_OLS - throw ANNException("load_pq_centroid_bin should not be called when EXEC_ENV_OLS is defined.", -1, __FUNCSIG__, - __FILE__, __LINE__); + throw ANNException("load_pq_centroid_bin should not be called when " + "EXEC_ENV_OLS is defined.", + -1, __FUNCSIG__, __FILE__, __LINE__); #else _pq_table.load_pq_centroid_bin(pq_pivots_file.c_str(), _num_pq_chunks); #endif } - copy_aligned_data_from_file(filename, _data, file_num_points, file_dim, _aligned_dim); - if (_normalize_vecs) - { - for (uint64_t i = 0; i < file_num_points; i++) - { - normalize(_data + _aligned_dim * i, _aligned_dim); - } - } - + _data_store->populate_data(filename, 0U); diskann::cout << "Using only first " << num_points_to_load << " from file.. " << std::endl; { @@ -1816,8 +1905,8 @@ void Index::build(const char *filename, const size_t num_points } template -void Index::build(const char *filename, const size_t num_points_to_load, Parameters ¶meters, - const char *tag_filename) +void Index::build(const char *filename, const size_t num_points_to_load, + const IndexWriteParameters ¶meters, const char *tag_filename) { std::vector tags; @@ -1859,6 +1948,43 @@ void Index::build(const char *filename, const size_t num_points build(filename, num_points_to_load, parameters, tags); } +template +void Index::build(const std::string &data_file, const size_t num_points_to_load, + IndexBuildParams &build_params) +{ + std::string labels_file_to_use = build_params.save_path_prefix + "_label_formatted.txt"; + std::string mem_labels_int_map_file = build_params.save_path_prefix + "_labels_map.txt"; + + size_t points_to_load = num_points_to_load == 0 ? _max_points : num_points_to_load; + + auto s = std::chrono::high_resolution_clock::now(); + if (build_params.label_file == "") + { + this->build(data_file.c_str(), points_to_load, build_params.index_write_params); + } + else + { + // TODO: this should ideally happen in save() + uint32_t unv_label_as_num = 0; + convert_labels_string_to_int(build_params.label_file, labels_file_to_use, mem_labels_int_map_file, + build_params.universal_label, unv_label_as_num); + if (build_params.universal_label != "") + { + LabelT unv_label_as_num = 0; + this->set_universal_label(unv_label_as_num); + } + this->build_filtered_index(data_file.c_str(), labels_file_to_use, points_to_load, + build_params.index_write_params); + } + std::chrono::duration diff = std::chrono::high_resolution_clock::now() - s; + std::cout << "Indexing time: " << diff.count() << "\n"; + // cleanup + if (build_params.label_file != "") + { + // clean_up_artifacts({labels_file_to_use, mem_labels_int_map_file}, {}); + } +} + template std::unordered_map Index::load_label_map(const std::string &labels_map_file) { @@ -1873,7 +1999,7 @@ std::unordered_map Index::load_label_map(c getline(iss, token, '\t'); label_str = token; getline(iss, token, '\t'); - token_as_num = std::stoul(token); + token_as_num = (LabelT)std::stoul(token); string_to_int_mp[label_str] = token_as_num; } return string_to_int_mp; @@ -1908,7 +2034,7 @@ void Index::parse_label_file(const std::string &label_file, siz } std::string line, token; - unsigned line_cnt = 0; + uint32_t line_cnt = 0; while (std::getline(infile, line)) { @@ -1930,7 +2056,7 @@ void Index::parse_label_file(const std::string &label_file, siz { token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); - LabelT token_as_num = std::stoul(token); + LabelT token_as_num = (LabelT)std::stoul(token); lbls.push_back(token_as_num); _labels.insert(token_as_num); } @@ -2017,20 +2143,21 @@ void Index::set_universal_label(const LabelT &label) template void Index::build_filtered_index(const char *filename, const std::string &label_file, - const size_t num_points_to_load, Parameters ¶meters, + const size_t num_points_to_load, IndexWriteParameters ¶meters, const std::vector &tags) { - _labels_file = label_file; + _labels_file = label_file; // original label file _filtered_index = true; _label_to_medoid_id.clear(); size_t num_points_labels = 0; + parse_label_file(label_file, - num_points_labels); // determines medoid for each label and - // identifies the points to label mapping + num_points_labels); // determines medoid for each label and identifies + // the points to label mapping convert_pts_label_to_bitmask(_pts_to_labels, _bitmask_buf, _labels.size()); - std::unordered_map> label_to_points; + std::unordered_map> label_to_points; std::vector label_bitmask; for (int lbl = 0; lbl < _labels.size(); lbl++) { @@ -2051,8 +2178,8 @@ void Index::build_filtered_index(const char *filename, const st bitmask_full_val.merge_bitmask_val(bitmask_val); } - std::vector<_u32> labeled_points; - for (_u32 point_id = 0; point_id < num_points_to_load; point_id++) + std::vector labeled_points; + for (uint32_t point_id = 0; point_id < num_points_to_load; point_id++) { simple_bitmask bm(_bitmask_buf.get_bitmask(point_id), _bitmask_buf._bitmask_size); bool pt_has_lbl = bm.test_full_mask_val(bitmask_full_val); @@ -2065,17 +2192,17 @@ void Index::build_filtered_index(const char *filename, const st label_to_points[x] = labeled_points; } - _u32 num_cands = 25; + uint32_t num_cands = 25; for (auto itr = _labels.begin(); itr != _labels.end(); itr++) { - _u32 best_medoid_count = std::numeric_limits<_u32>::max(); + uint32_t best_medoid_count = std::numeric_limits::max(); auto &curr_label = *itr; - _u32 best_medoid; + uint32_t best_medoid; auto labeled_points = label_to_points[curr_label]; - for (_u32 cnd = 0; cnd < num_cands; cnd++) + for (uint32_t cnd = 0; cnd < num_cands; cnd++) { - _u32 cur_cnd = labeled_points[rand() % labeled_points.size()]; - _u32 cur_cnt = std::numeric_limits<_u32>::max(); + uint32_t cur_cnd = labeled_points[rand() % labeled_points.size()]; + uint32_t cur_cnt = std::numeric_limits::max(); if (_medoid_counts.find(cur_cnd) == _medoid_counts.end()) { _medoid_counts[cur_cnd] = 0; @@ -2098,9 +2225,41 @@ void Index::build_filtered_index(const char *filename, const st this->build(filename, num_points_to_load, parameters, tags); } +template +std::pair Index::_search(const DataType &query, const size_t K, const uint32_t L, + std::any &indices, float *distances) +{ + try + { + auto typed_query = std::any_cast(query); + if (typeid(uint32_t *) == indices.type()) + { + auto u32_ptr = std::any_cast(indices); + return this->search(typed_query, K, L, u32_ptr, distances); + } + else if (typeid(uint64_t *) == indices.type()) + { + auto u64_ptr = std::any_cast(indices); + return this->search(typed_query, K, L, u64_ptr, distances); + } + else + { + throw ANNException("Error: indices type can only be uint64_t or uint32_t.", -1); + } + } + catch (const std::bad_any_cast &e) + { + throw ANNException("Error: bad any cast while searching. " + std::string(e.what()), -1); + } + catch (const std::exception &e) + { + throw ANNException("Error: " + std::string(e.what()), -1); + } +} + template template -std::pair Index::search(const T *query, const size_t K, const unsigned L, +std::pair Index::search(const T *query, const size_t K, const uint32_t L, IdType *indices, float *distances) { if (K > (uint64_t)L) @@ -2120,16 +2279,18 @@ std::pair Index::search(const T *query, con } const std::vector unused_filter_label; - const std::vector init_ids = get_init_ids(); + const std::vector init_ids = get_init_ids(); std::shared_lock lock(_update_lock); - auto retval = iterate_to_fixed_point(query, L, init_ids, scratch, false, unused_filter_label, true); + _distance->preprocess_query(query, _data_store->get_dims(), scratch->aligned_query()); + auto retval = + iterate_to_fixed_point(scratch->aligned_query(), L, init_ids, scratch, false, unused_filter_label, true); NeighborPriorityQueue &best_L_nodes = scratch->best_l_nodes(); size_t pos = 0; - for (int i = 0; i < best_L_nodes.size(); ++i) + for (size_t i = 0; i < best_L_nodes.size(); ++i) { if (best_L_nodes[i].id < _max_points) { @@ -2153,16 +2314,39 @@ std::pair Index::search(const T *query, con } if (pos < K) { - diskann::cerr << "Found fewer than K elements for query" << std::endl; + diskann::cerr << "Found pos: " << pos << "fewer than K elements " << K << " for query" << std::endl; } return retval; } +template +std::pair Index::_search_with_filters(const DataType &query, + const std::string &raw_label, const size_t K, + const uint32_t L, std::any &indices, + float *distances) +{ + auto converted_label = this->get_converted_label(raw_label); + if (typeid(uint64_t *) == indices.type()) + { + auto ptr = std::any_cast(indices); + return this->search_with_filters(std::any_cast(query), converted_label, K, L, ptr, distances); + } + else if (typeid(uint32_t *) == indices.type()) + { + auto ptr = std::any_cast(indices); + return this->search_with_filters(std::any_cast(query), converted_label, K, L, ptr, distances); + } + else + { + throw ANNException("Error: Id type can only be uint64_t or uint32_t.", -1); + } +} + template template std::pair Index::search_with_filters(const T *query, const LabelT &filter_label, - const size_t K, const unsigned L, + const size_t K, const uint32_t L, IdType *indices, float *distances) { if (K > (uint64_t)L) @@ -2182,7 +2366,7 @@ std::pair Index::search_with_filters(const } std::vector filter_vec; - std::vector init_ids = get_init_ids(); + std::vector init_ids = get_init_ids(); std::shared_lock lock(_update_lock); @@ -2198,15 +2382,16 @@ std::pair Index::search_with_filters(const } filter_vec.emplace_back(filter_label); - T *aligned_query = scratch->aligned_query(); - memcpy(aligned_query, query, _dim * sizeof(T)); - - auto retval = iterate_to_fixed_point(aligned_query, L, init_ids, scratch, true, filter_vec, true); + // REFACTOR + // T *aligned_query = scratch->aligned_query(); + // memcpy(aligned_query, query, _dim * sizeof(T)); + _distance->preprocess_query(query, _data_store->get_dims(), scratch->aligned_query()); + auto retval = iterate_to_fixed_point(scratch->aligned_query(), L, init_ids, scratch, true, filter_vec, true); auto best_L_nodes = scratch->best_l_nodes(); size_t pos = 0; - for (int i = 0; i < best_L_nodes.size(); ++i) + for (size_t i = 0; i < best_L_nodes.size(); ++i) { if (best_L_nodes[i].id < _max_points) { @@ -2237,7 +2422,26 @@ std::pair Index::search_with_filters(const } template -size_t Index::search_with_tags(const T *query, const uint64_t K, const unsigned L, TagT *tags, +size_t Index::_search_with_tags(const DataType &query, const uint64_t K, const uint32_t L, + const TagType &tags, float *distances, DataVector &res_vectors) +{ + try + { + return this->search_with_tags(std::any_cast(query), K, L, std::any_cast(tags), distances, + res_vectors.get>()); + } + catch (const std::bad_any_cast &e) + { + throw ANNException("Error: bad any cast while performing _search_with_tags() " + std::string(e.what()), -1); + } + catch (const std::exception &e) + { + throw ANNException("Error: " + std::string(e.what()), -1); + } +} + +template +size_t Index::search_with_tags(const T *query, const uint64_t K, const uint32_t L, TagT *tags, float *distances, std::vector &res_vectors) { if (K > (uint64_t)L) @@ -2257,10 +2461,12 @@ size_t Index::search_with_tags(const T *query, const uint64_t K std::shared_lock ul(_update_lock); - const std::vector init_ids = get_init_ids(); + const std::vector init_ids = get_init_ids(); const std::vector unused_filter_label; - iterate_to_fixed_point(query, L, init_ids, scratch, false, unused_filter_label, true); + _distance->preprocess_query(query, _data_store->get_dims(), scratch->aligned_query()); + iterate_to_fixed_point(scratch->aligned_query(), L, init_ids, scratch, false, unused_filter_label, true); + NeighborPriorityQueue &best_L_nodes = scratch->best_l_nodes(); assert(best_L_nodes.size() <= L); @@ -2278,7 +2484,7 @@ size_t Index::search_with_tags(const T *query, const uint64_t K if (res_vectors.size() > 0) { - memcpy(res_vectors[pos], _data + ((size_t)node.id) * _aligned_dim, _dim * sizeof(T)); + _data_store->get_vector(node.id, res_vectors[pos]); } if (distances != nullptr) @@ -2337,7 +2543,7 @@ template void Indexcopy_vectors((location_t)res, (location_t)_max_points, 1); } } @@ -2351,33 +2557,38 @@ template int Index return -2; } + if (this->_deletes_enabled) + { + return 0; + } + std::unique_lock ul(_update_lock); std::unique_lock tl(_tag_lock); std::unique_lock dl(_delete_lock); if (_data_compacted) { - for (unsigned slot = (unsigned)_nd; slot < _max_points; ++slot) + for (uint32_t slot = (uint32_t)_nd; slot < _max_points; ++slot) { _empty_slots.insert(slot); } } - + this->_deletes_enabled = true; return 0; } template -inline void Index::process_delete(const tsl::robin_set &old_delete_set, size_t loc, - const unsigned range, const unsigned maxc, const float alpha, +inline void Index::process_delete(const tsl::robin_set &old_delete_set, size_t loc, + const uint32_t range, const uint32_t maxc, const float alpha, InMemQueryScratch *scratch) { - tsl::robin_set &expanded_nodes_set = scratch->expanded_nodes_set(); + tsl::robin_set &expanded_nodes_set = scratch->expanded_nodes_set(); std::vector &expanded_nghrs_vec = scratch->expanded_nodes_vec(); // If this condition were not true, deadlock could result - assert(old_delete_set.find(loc) == old_delete_set.end()); + assert(old_delete_set.find((uint32_t)loc) == old_delete_set.end()); - std::vector adj_list; + std::vector adj_list; { // Acquire and release lock[loc] before acquiring locks for neighbors std::unique_lock adj_list_lock; @@ -2421,13 +2632,12 @@ inline void Index::process_delete(const tsl::robin_setcompare(_data + _aligned_dim * loc, _data + _aligned_dim * ngh, (unsigned)_aligned_dim)); + expanded_nghrs_vec.emplace_back(ngh, _data_store->get_distance((location_t)loc, (location_t)ngh)); } std::sort(expanded_nghrs_vec.begin(), expanded_nghrs_vec.end()); - std::vector &occlude_list_output = scratch->occlude_list_output(); - occlude_list(loc, expanded_nghrs_vec, alpha, range, maxc, occlude_list_output, scratch, &old_delete_set); + std::vector &occlude_list_output = scratch->occlude_list_output(); + occlude_list((uint32_t)loc, expanded_nghrs_vec, alpha, range, maxc, occlude_list_output, scratch, + &old_delete_set); std::unique_lock adj_list_lock(_locks[loc]); _final_graph[loc] = occlude_list_output; } @@ -2436,7 +2646,7 @@ inline void Index::process_delete(const tsl::robin_set -consolidation_report Index::consolidate_deletes(const Parameters ¶ms) +consolidation_report Index::consolidate_deletes(const IndexWriteParameters ¶ms) { if (!_enable_tags) throw diskann::ANNException("Point tag array not instantiated", -1, __FUNCSIG__, __FILE__, __LINE__); @@ -2480,7 +2690,7 @@ consolidation_report Index::consolidate_deletes(const Parameter diskann::cout << "Starting consolidate_deletes... "; - std::unique_ptr> old_delete_set(new tsl::robin_set); + std::unique_ptr> old_delete_set(new tsl::robin_set); { std::unique_lock dl(_delete_lock); std::swap(_delete_set, old_delete_set); @@ -2491,18 +2701,17 @@ consolidation_report Index::consolidate_deletes(const Parameter throw diskann::ANNException("ERROR: start node has been deleted", -1, __FUNCSIG__, __FILE__, __LINE__); } - const unsigned range = params.Get("R"); - const unsigned maxc = params.Get("C"); - const float alpha = params.Get("alpha"); - const unsigned num_threads = - params.Get("num_threads") == 0 ? omp_get_num_threads() : params.Get("num_threads"); + const uint32_t range = params.max_degree; + const uint32_t maxc = params.max_occlusion_size; + const float alpha = params.alpha; + const uint32_t num_threads = params.num_threads == 0 ? omp_get_num_threads() : params.num_threads; - unsigned num_calls_to_process_delete = 0; + uint32_t num_calls_to_process_delete = 0; diskann::Timer timer; #pragma omp parallel for num_threads(num_threads) schedule(dynamic, 8192) reduction(+ : num_calls_to_process_delete) - for (_s64 loc = 0; loc < (_s64)_max_points; loc++) + for (int64_t loc = 0; loc < (int64_t)_max_points; loc++) { - if (old_delete_set->find((_u32)loc) == old_delete_set->end() && !_empty_slots.is_in_set((_u32)loc)) + if (old_delete_set->find((uint32_t)loc) == old_delete_set->end() && !_empty_slots.is_in_set((uint32_t)loc)) { ScratchStoreManager> manager(_query_scratch); auto scratch = manager.scratch_space(); @@ -2510,7 +2719,7 @@ consolidation_report Index::consolidate_deletes(const Parameter num_calls_to_process_delete += 1; } } - for (_s64 loc = _max_points; loc < (_s64)(_max_points + _num_frozen_pts); loc++) + for (int64_t loc = _max_points; loc < (int64_t)(_max_points + _num_frozen_pts); loc++) { ScratchStoreManager> manager(_query_scratch); auto scratch = manager.scratch_space(); @@ -2543,8 +2752,8 @@ template void Index 0) { - reposition_points(_max_points, _nd, _num_frozen_pts); - _start = (_u32)_nd; + reposition_points((uint32_t)_max_points, (uint32_t)_nd, (uint32_t)_num_frozen_pts); + _start = (uint32_t)_nd; } } @@ -2570,11 +2779,11 @@ template void Index new_location = std::vector(_max_points + _num_frozen_pts, (_u32)UINT32_MAX); + std::vector new_location = std::vector(_max_points + _num_frozen_pts, UINT32_MAX); - _u32 new_counter = 0; - std::set<_u32> empty_locations; - for (_u32 old_location = 0; old_location < _max_points; old_location++) + uint32_t new_counter = 0; + std::set empty_locations; + for (uint32_t old_location = 0; old_location < _max_points; old_location++) { if (_location_to_tag.contains(old_location)) { @@ -2586,7 +2795,7 @@ template void Index void Index new_adj_list; + std::vector new_adj_list; if ((new_location[old] < _max_points) // If point continues to exist || (old >= _max_points && old < _max_points + _num_frozen_pts)) @@ -2627,8 +2836,7 @@ template void Indexcopy_vectors(old, new_location[old], 1); } } else @@ -2650,7 +2858,7 @@ template void Index void Index int Index { return -1; } - unsigned location; + uint32_t location; if (_data_compacted && _empty_slots.is_empty()) { // This code path is encountered when enable_delete hasn't been // called yet, so no points have been deleted and _empty_slots // hasn't been filled in. In that case, just keep assigning // consecutive locations. - location = (unsigned)_nd; + location = (uint32_t)_nd; } else { @@ -2707,13 +2914,14 @@ template size_t Index -size_t Index::release_locations(const tsl::robin_set &locations) +size_t Index::release_locations(const tsl::robin_set &locations) { for (auto location : locations) { if (_empty_slots.is_in_set(location)) - throw ANNException("Trying to release location, but location already in empty slots", -1, __FUNCSIG__, - __FILE__, __LINE__); + throw ANNException("Trying to release location, but location " + "already in empty slots", + -1, __FUNCSIG__, __FILE__, __LINE__); _empty_slots.insert(location); _nd--; @@ -2726,40 +2934,43 @@ size_t Index::release_locations(const tsl::robin_set } template -void Index::reposition_points(unsigned old_location_start, unsigned new_location_start, - unsigned num_locations) +void Index::reposition_points(uint32_t old_location_start, uint32_t new_location_start, + uint32_t num_locations) { if (num_locations == 0 || old_location_start == new_location_start) { return; } - // Update pointers to the moved nodes. Note: the computation is correct even when - // new_location_start < old_location_start given the C++ unsigned integer arithmetic - // rules. - const unsigned location_delta = new_location_start - old_location_start; + // Update pointers to the moved nodes. Note: the computation is correct even + // when new_location_start < old_location_start given the C++ uint32_t + // integer arithmetic rules. + const uint32_t location_delta = new_location_start - old_location_start; - for (unsigned i = 0; i < _max_points + _num_frozen_pts; i++) + for (uint32_t i = 0; i < _max_points + _num_frozen_pts; i++) for (auto &loc : _final_graph[i]) if (loc >= old_location_start && loc < old_location_start + num_locations) loc += location_delta; - // The [start, end) interval which will contain obsolete points to be cleared. - unsigned mem_clear_loc_start = old_location_start; - unsigned mem_clear_loc_end_limit = old_location_start + num_locations; + // The [start, end) interval which will contain obsolete points to be + // cleared. + uint32_t mem_clear_loc_start = old_location_start; + uint32_t mem_clear_loc_end_limit = old_location_start + num_locations; - // Move the adjacency lists. Make sure that overlapping ranges are handled correctly. + // Move the adjacency lists. Make sure that overlapping ranges are handled + // correctly. if (new_location_start < old_location_start) { // New location before the old location: copy the entries in order // to avoid modifying locations that are yet to be copied. - for (unsigned loc_offset = 0; loc_offset < num_locations; loc_offset++) + for (uint32_t loc_offset = 0; loc_offset < num_locations; loc_offset++) { assert(_final_graph[new_location_start + loc_offset].empty()); _final_graph[new_location_start + loc_offset].swap(_final_graph[old_location_start + loc_offset]); } - // If ranges are overlapping, make sure not to clear the newly copied data. + // If ranges are overlapping, make sure not to clear the newly copied + // data. if (mem_clear_loc_start < new_location_start + num_locations) { // Clear only after the end of the new range. @@ -2770,25 +2981,21 @@ void Index::reposition_points(unsigned old_location_start, unsi { // Old location after the new location: copy from the end of the range // to avoid modifying locations that are yet to be copied. - for (unsigned loc_offset = num_locations; loc_offset > 0; loc_offset--) + for (uint32_t loc_offset = num_locations; loc_offset > 0; loc_offset--) { assert(_final_graph[new_location_start + loc_offset - 1u].empty()); _final_graph[new_location_start + loc_offset - 1u].swap(_final_graph[old_location_start + loc_offset - 1u]); } - // If ranges are overlapping, make sure not to clear the newly copied data. + // If ranges are overlapping, make sure not to clear the newly copied + // data. if (mem_clear_loc_end_limit > new_location_start) { // Clear only up to the beginning of the new range. mem_clear_loc_end_limit = new_location_start; } } - - // Use memmove to handle overlapping ranges. - memmove(_data + _aligned_dim * new_location_start, _data + _aligned_dim * old_location_start, - sizeof(T) * _aligned_dim * num_locations); - memset(_data + _aligned_dim * mem_clear_loc_start, 0, - sizeof(T) * _aligned_dim * (mem_clear_loc_end_limit - mem_clear_loc_start)); + _data_store->move_vectors(old_location_start, new_location_start, num_locations); } template void Index::reposition_frozen_point_to_end() @@ -2802,8 +3009,8 @@ template void Index void Index::resize(size_t new_max_points) @@ -2812,22 +3019,14 @@ template void Indexresize((location_t)new_internal_points); _final_graph.resize(new_internal_points); _locks = std::vector(new_internal_points); if (_num_frozen_pts != 0) { - reposition_points((_u32)_max_points, (_u32)new_max_points, (_u32)_num_frozen_pts); - _start = (_u32)new_max_points; + reposition_points((uint32_t)_max_points, (uint32_t)new_max_points, (uint32_t)_num_frozen_pts); + _start = (uint32_t)new_max_points; } _max_points = new_max_points; @@ -2841,13 +3040,31 @@ template void Index(stop - start).count() << "s" << std::endl; } +template +int Index::_insert_point(const DataType &point, const TagType tag) +{ + try + { + return this->insert_point(std::any_cast(point), std::any_cast(tag)); + } + catch (const std::bad_any_cast &anycast_e) + { + throw new ANNException("Error:Trying to insert invalid data type" + std::string(anycast_e.what()), -1); + } + catch (const std::exception &e) + { + throw new ANNException("Error:" + std::string(e.what()), -1); + } +} + template int Index::insert_point(const T *point, const TagT tag) { assert(_has_built); if (tag == static_cast(0)) { - throw diskann::ANNException("Do not insert point with tag 0. That is reserved for points hidden " + throw diskann::ANNException("Do not insert point with tag 0. That is " + "reserved for points hidden " "from the user.", -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -2888,8 +3105,9 @@ int Index::insert_point(const T *point, const TagT tag) location = reserve_location(); if (location == -1) { - throw diskann::ANNException("Cannot reserve location even after expanding graph. Terminating.", -1, - __FUNCSIG__, __FILE__, __LINE__); + throw diskann::ANNException("Cannot reserve location even after " + "expanding graph. Terminating.", + -1, __FUNCSIG__, __FILE__, __LINE__); } #else return -1; @@ -2911,20 +3129,12 @@ int Index::insert_point(const T *point, const TagT tag) } tl.unlock(); - // Copy the vector in to the data array - auto offset_data = _data + (size_t)_aligned_dim * location; - memset((void *)offset_data, 0, sizeof(T) * _aligned_dim); - memcpy((void *)offset_data, point, sizeof(T) * _dim); - - if (_normalize_vecs) - { - normalize((float *)offset_data, _dim); - } + _data_store->set_vector(location, point); // Find and add appropriate graph edges ScratchStoreManager> manager(_query_scratch); auto scratch = manager.scratch_space(); - std::vector pruned_list; + std::vector pruned_list; if (_filtered_index) { search_for_point_and_prune(location, _indexingQueueSize, pruned_list, scratch, true, _filterIndexingQueueSize); @@ -2940,7 +3150,7 @@ int Index::insert_point(const T *point, const TagT tag) LockGuard guard(_locks[location]); _final_graph[location].clear(); - _final_graph[location].reserve((_u64)(_indexingRange * GRAPH_SLACK_FACTOR * 1.05)); + _final_graph[location].reserve((size_t)(_indexingRange * GRAPH_SLACK_FACTOR * 1.05)); for (auto link : pruned_list) { @@ -2960,6 +3170,35 @@ int Index::insert_point(const T *point, const TagT tag) return 0; } +template int Index::_lazy_delete(const TagType &tag) +{ + try + { + return lazy_delete(std::any_cast(tag)); + } + catch (const std::bad_any_cast &e) + { + throw ANNException(std::string("Error: ") + e.what(), -1); + } +} + +template +void Index::_lazy_delete(TagVector &tags, TagVector &failed_tags) +{ + try + { + this->lazy_delete(tags.get>(), failed_tags.get>()); + } + catch (const std::bad_any_cast &e) + { + throw ANNException("Error: bad any cast while performing _lazy_delete() " + std::string(e.what()), -1); + } + catch (const std::exception &e) + { + throw ANNException("Error: " + std::string(e.what()), -1); + } +} + template int Index::lazy_delete(const TagT &tag) { std::shared_lock ul(_update_lock); @@ -3015,6 +3254,23 @@ template bool Index +void Index::_get_active_tags(TagRobinSet &active_tags) +{ + try + { + this->get_active_tags(active_tags.get>()); + } + catch (const std::bad_any_cast &e) + { + throw ANNException("Error: bad_any cast while performing _get_active_tags() " + std::string(e.what()), -1); + } + catch (const std::exception &e) + { + throw ANNException("Error :" + std::string(e.what()), -1); + } +} + template void Index::get_active_tags(tsl::robin_set &active_tags) { @@ -3052,12 +3308,12 @@ template void Index visited(_max_points + _num_frozen_pts); size_t MAX_BFS_LEVELS = 32; - auto bfs_sets = new tsl::robin_set[MAX_BFS_LEVELS]; + auto bfs_sets = new tsl::robin_set[MAX_BFS_LEVELS]; bfs_sets[0].insert(_start); visited.set(_start); - for (unsigned i = _max_points; i < _max_points + _num_frozen_pts; ++i) + for (uint32_t i = (uint32_t)_max_points; i < _max_points + _num_frozen_pts; ++i) { if (i != _start) { @@ -3087,6 +3343,13 @@ template void Index void +// Index::optimize_index_layout() +//{ // use after build or load +//} + +// REFACTOR: This should be an OptimizedDataStore class template void Index::optimize_index_layout() { // use after build or load if (_dynamic_index) @@ -3095,40 +3358,70 @@ template void Indexget_aligned_dim()]; + std::memset(cur_vec, 0, _data_store->get_aligned_dim() * sizeof(float)); + _data_len = (_data_store->get_aligned_dim() + 1) * sizeof(float); + _neighbor_len = (_max_observed_degree + 1) * sizeof(uint32_t); _node_size = _data_len + _neighbor_len; _opt_graph = new char[_node_size * _nd]; - DistanceFastL2 *dist_fast = (DistanceFastL2 *)_distance; - for (unsigned i = 0; i < _nd; i++) + DistanceFastL2 *dist_fast = (DistanceFastL2 *)_data_store->get_dist_fn(); + for (uint32_t 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); + _data_store->get_vector(i, (T *)cur_vec); + float cur_norm = dist_fast->norm((T *)cur_vec, (uint32_t)_data_store->get_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)); + std::memcpy(cur_node_offset + sizeof(float), cur_vec, _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]); + uint32_t k = (uint32_t)_final_graph[i].size(); + std::memcpy(cur_node_offset, &k, sizeof(uint32_t)); + std::memcpy(cur_node_offset + sizeof(uint32_t), _final_graph[i].data(), k * sizeof(uint32_t)); + std::vector().swap(_final_graph[i]); } _final_graph.clear(); _final_graph.shrink_to_fit(); + delete[] cur_vec; +} + +// REFACTOR: once optimized layout becomes its own Data+Graph store, we should +// just invoke regular search +// template +// void Index::search_with_optimized_layout(const T *query, +// size_t K, size_t L, uint32_t *indices) +//{ +//} + +template +void Index::_search_with_optimized_layout(const DataType &query, size_t K, size_t L, uint32_t *indices) +{ + try + { + return this->search_with_optimized_layout(std::any_cast(query), K, L, indices); + } + catch (const std::bad_any_cast &e) + { + throw ANNException( + "Error: bad any cast while performing _search_with_optimized_layout() " + std::string(e.what()), -1); + } + catch (const std::exception &e) + { + throw ANNException("Error: " + std::string(e.what()), -1); + } } template -void Index::search_with_optimized_layout(const T *query, size_t K, size_t L, unsigned *indices) +void Index::search_with_optimized_layout(const T *query, size_t K, size_t L, uint32_t *indices) { - DistanceFastL2 *dist_fast = (DistanceFastL2 *)_distance; + DistanceFastL2 *dist_fast = (DistanceFastL2 *)_data_store->get_dist_fn(); NeighborPriorityQueue retset(L); - std::vector init_ids(L); + std::vector init_ids(L); boost::dynamic_bitset<> flags{_nd, 0}; - unsigned tmp_l = 0; - unsigned *neighbors = (unsigned *)(_opt_graph + _node_size * _start + _data_len); - unsigned MaxM_ep = *neighbors; + uint32_t tmp_l = 0; + uint32_t *neighbors = (uint32_t *)(_opt_graph + _node_size * _start + _data_len); + uint32_t MaxM_ep = *neighbors; neighbors++; for (; tmp_l < L && tmp_l < MaxM_ep; tmp_l++) @@ -3139,7 +3432,7 @@ void Index::search_with_optimized_layout(const T *query, size_t while (tmp_l < L) { - unsigned id = rand() % _nd; + uint32_t id = rand() % _nd; if (flags[id]) continue; flags[id] = true; @@ -3147,23 +3440,23 @@ void Index::search_with_optimized_layout(const T *query, size_t tmp_l++; } - for (unsigned i = 0; i < init_ids.size(); i++) + for (uint32_t i = 0; i < init_ids.size(); i++) { - unsigned id = init_ids[i]; + uint32_t 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++) + for (uint32_t i = 0; i < init_ids.size(); i++) { - unsigned id = init_ids[i]; + uint32_t 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); + float dist = dist_fast->compare(x, query, norm_x, (uint32_t)_data_store->get_aligned_dim()); retset.insert(Neighbor(id, dist)); flags[id] = true; L++; @@ -3174,21 +3467,21 @@ void Index::search_with_optimized_layout(const T *query, size_t auto nbr = retset.closest_unexpanded(); auto n = nbr.id; _mm_prefetch(_opt_graph + _node_size * n + _data_len, _MM_HINT_T0); - neighbors = (unsigned *)(_opt_graph + _node_size * n + _data_len); - unsigned MaxM = *neighbors; + neighbors = (uint32_t *)(_opt_graph + _node_size * n + _data_len); + uint32_t MaxM = *neighbors; neighbors++; - for (unsigned m = 0; m < MaxM; ++m) + for (uint32_t m = 0; m < MaxM; ++m) _mm_prefetch(_opt_graph + _node_size * neighbors[m], _MM_HINT_T0); - for (unsigned m = 0; m < MaxM; ++m) + for (uint32_t m = 0; m < MaxM; ++m) { - unsigned id = neighbors[m]; + uint32_t id = neighbors[m]; if (flags[id]) continue; flags[id] = 1; T *data = (T *)(_opt_graph + _node_size * id); float norm = *data; data++; - float dist = dist_fast->compare(query, data, norm, (unsigned)_aligned_dim); + float dist = dist_fast->compare(query, data, norm, (uint32_t)_data_store->get_aligned_dim()); Neighbor nn(id, dist); retset.insert(nn); } @@ -3231,131 +3524,130 @@ template DISKANN_DLLEXPORT class Index; template DISKANN_DLLEXPORT class Index; template DISKANN_DLLEXPORT std::pair Index::search( - const float *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const float *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const float *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const float *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const uint8_t *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const uint8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const uint8_t *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const uint8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const int8_t *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const int8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const int8_t *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const int8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); // TagT==uint32_t template DISKANN_DLLEXPORT std::pair Index::search( - const float *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const float *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const float *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const float *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const uint8_t *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const uint8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const uint8_t *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const uint8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const int8_t *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const int8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const int8_t *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const int8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const float *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const float *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const float *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const float *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const uint8_t *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const uint8_t *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const uint8_t *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const uint8_t *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const int8_t *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const int8_t *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const int8_t *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const int8_t *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); // TagT==uint32_t template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const float *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const float *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const float *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const float *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const uint8_t *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const uint8_t *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const uint8_t *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const uint8_t *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const int8_t *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const int8_t *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const int8_t *query, const uint32_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const int8_t *query, const uint32_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const float *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const float *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const float *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const float *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const uint8_t *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const uint8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const uint8_t *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const uint8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const int8_t *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const int8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const int8_t *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const int8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); // TagT==uint32_t template DISKANN_DLLEXPORT std::pair Index::search( - const float *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const float *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const float *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const float *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const uint8_t *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const uint8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const uint8_t *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const uint8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const int8_t *query, const size_t K, const unsigned L, uint64_t *indices, float *distances); + const int8_t *query, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search( - const int8_t *query, const size_t K, const unsigned L, uint32_t *indices, float *distances); + const int8_t *query, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const float *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const float *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const float *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const float *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const uint8_t *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const uint8_t *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const uint8_t *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const uint8_t *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const int8_t *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const int8_t *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const int8_t *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const int8_t *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); // TagT==uint32_t template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const float *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const float *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const float *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const float *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const uint8_t *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const uint8_t *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const uint8_t *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const uint8_t *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint64_t>(const int8_t *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint64_t *indices, + uint64_t>(const int8_t *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint64_t *indices, float *distances); template DISKANN_DLLEXPORT std::pair Index::search_with_filters< - uint32_t>(const int8_t *query, const uint16_t &filter_label, const size_t K, const unsigned L, uint32_t *indices, + uint32_t>(const int8_t *query, const uint16_t &filter_label, const size_t K, const uint32_t L, uint32_t *indices, float *distances); - } // namespace diskann diff --git a/src/index_factory.cpp b/src/index_factory.cpp new file mode 100644 index 000000000..c5607f4a0 --- /dev/null +++ b/src/index_factory.cpp @@ -0,0 +1,150 @@ +#include "index_factory.h" + +namespace diskann +{ + +IndexFactory::IndexFactory(const IndexConfig &config) : _config(std::make_unique(config)) +{ + check_config(); +} + +std::unique_ptr IndexFactory::create_instance() +{ + return create_instance(_config->data_type, _config->tag_type, _config->label_type); +} + +void IndexFactory::check_config() +{ + if (_config->dynamic_index && !_config->enable_tags) + { + throw ANNException("ERROR: Dynamic Indexing must have tags enabled.", -1, __FUNCSIG__, __FILE__, __LINE__); + } + + if (_config->pq_dist_build) + { + if (_config->dynamic_index) + throw ANNException("ERROR: Dynamic Indexing not supported with PQ distance based " + "index construction", + -1, __FUNCSIG__, __FILE__, __LINE__); + if (_config->metric == diskann::Metric::INNER_PRODUCT) + throw ANNException("ERROR: Inner product metrics not yet supported " + "with PQ distance " + "base index", + -1, __FUNCSIG__, __FILE__, __LINE__); + } + + if (_config->data_type != "float" && _config->data_type != "uint8" && _config->data_type != "int8") + { + throw ANNException("ERROR: invalid data type : + " + _config->data_type + + " is not supported. please select from [float, int8, uint8]", + -1); + } + + if (_config->tag_type != "int32" && _config->tag_type != "uint32" && _config->tag_type != "int64" && + _config->tag_type != "uint64") + { + throw ANNException("ERROR: invalid data type : + " + _config->tag_type + + " is not supported. please select from [int32, uint32, int64, uint64]", + -1); + } +} + +template +std::unique_ptr> IndexFactory::construct_datastore(DataStoreStrategy strategy, size_t num_points, + size_t dimension) +{ + const size_t total_internal_points = num_points + _config->num_frozen_pts; + std::shared_ptr> distance; + switch (strategy) + { + case MEMORY: + if (_config->metric == diskann::Metric::COSINE && std::is_same::value) + { + distance.reset((Distance *)new AVXNormalizedCosineDistanceFloat()); + return std::make_unique>((location_t)total_internal_points, dimension, distance); + } + else + { + distance.reset((Distance *)get_distance_function(_config->metric)); + return std::make_unique>((location_t)total_internal_points, dimension, distance); + } + break; + default: + break; + } + return nullptr; +} + +std::unique_ptr IndexFactory::construct_graphstore(GraphStoreStrategy, size_t size) +{ + return std::make_unique(size); +} + +template +std::unique_ptr IndexFactory::create_instance() +{ + size_t num_points = _config->max_points; + size_t dim = _config->dimension; + // auto graph_store = construct_graphstore(_config->graph_strategy, num_points); + auto data_store = construct_datastore(_config->data_strategy, num_points, dim); + return std::make_unique>(*_config, std::move(data_store)); +} + +std::unique_ptr IndexFactory::create_instance(const std::string &data_type, const std::string &tag_type, + const std::string &label_type) +{ + if (data_type == std::string("float")) + { + return create_instance(tag_type, label_type); + } + else if (data_type == std::string("uint8")) + { + return create_instance(tag_type, label_type); + } + else if (data_type == std::string("int8")) + { + return create_instance(tag_type, label_type); + } + else + throw ANNException("Error: unsupported data_type please choose from [float/int8/uint8]", -1); +} + +template +std::unique_ptr IndexFactory::create_instance(const std::string &tag_type, const std::string &label_type) +{ + if (tag_type == std::string("int32")) + { + return create_instance(label_type); + } + else if (tag_type == std::string("uint32")) + { + return create_instance(label_type); + } + else if (tag_type == std::string("int64")) + { + return create_instance(label_type); + } + else if (tag_type == std::string("uint64")) + { + return create_instance(label_type); + } + else + throw ANNException("Error: unsupported tag_type please choose from [int32/uint32/int64/uint64]", -1); +} + +template +std::unique_ptr IndexFactory::create_instance(const std::string &label_type) +{ + if (label_type == std::string("uint16") || label_type == std::string("ushort")) + { + return create_instance(); + } + else if (label_type == std::string("uint32") || label_type == std::string("uint")) + { + return create_instance(); + } + else + throw ANNException("Error: unsupported label_type please choose from [uint/ushort]", -1); +} + +} // namespace diskann diff --git a/src/logger.cpp b/src/logger.cpp index 1444487f7..052f54877 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -10,20 +10,19 @@ namespace diskann { +#ifdef ENABLE_CUSTOM_LOGGER DISKANN_DLLEXPORT ANNStreamBuf coutBuff(stdout); DISKANN_DLLEXPORT ANNStreamBuf cerrBuff(stderr); DISKANN_DLLEXPORT std::basic_ostream cout(&coutBuff); DISKANN_DLLEXPORT std::basic_ostream cerr(&cerrBuff); - -#ifdef EXEC_ENV_OLS std::function g_logger; void SetCustomLogger(std::function logger) { g_logger = logger; + diskann::cout << "Set Custom Logger" << std::endl; } -#endif ANNStreamBuf::ANNStreamBuf(FILE *fp) { @@ -37,11 +36,7 @@ ANNStreamBuf::ANNStreamBuf(FILE *fp) } _fp = fp; _logLevel = (_fp == stdout) ? LogLevel::LL_Info : LogLevel::LL_Error; -#ifdef EXEC_ENV_OLS _buf = new char[BUFFER_SIZE + 1]; // See comment in the header -#else - _buf = new char[BUFFER_SIZE]; // See comment in the header -#endif std::memset(_buf, 0, (BUFFER_SIZE) * sizeof(char)); setp(_buf, _buf + BUFFER_SIZE - 1); @@ -87,17 +82,16 @@ int ANNStreamBuf::flush() } void ANNStreamBuf::logImpl(char *str, int num) { -#ifdef EXEC_ENV_OLS str[num] = '\0'; // Safe. See the c'tor. // Invoke the OLS custom logging function. if (g_logger) { g_logger(_logLevel, str); } +} #else - fwrite(str, sizeof(char), num, _fp); - fflush(_fp); +using std::cerr; +using std::cout; #endif -} } // namespace diskann diff --git a/src/math_utils.cpp b/src/math_utils.cpp index 151e6a97d..7481da848 100644 --- a/src/math_utils.cpp +++ b/src/math_utils.cpp @@ -27,7 +27,7 @@ float calc_distance(float *vec_1, float *vec_2, size_t dim) void compute_vecs_l2sq(float *vecs_l2sq, float *data, const size_t num_points, const size_t dim) { #pragma omp parallel for schedule(static, 8192) - for (int64_t n_iter = 0; n_iter < (_s64)num_points; n_iter++) + for (int64_t n_iter = 0; n_iter < (int64_t)num_points; n_iter++) { vecs_l2sq[n_iter] = cblas_snrm2((MKL_INT)dim, (data + (n_iter * dim)), 1); vecs_l2sq[n_iter] *= vecs_l2sq[n_iter]; @@ -96,7 +96,7 @@ void compute_closest_centers_in_block(const float *const data, const size_t num_ if (k == 1) { #pragma omp parallel for schedule(static, 8192) - for (int64_t i = 0; i < (_s64)num_points; i++) + for (int64_t i = 0; i < (int64_t)num_points; i++) { float min = std::numeric_limits::max(); float *current = dist_matrix + (i * num_centers); @@ -113,7 +113,7 @@ void compute_closest_centers_in_block(const float *const data, const size_t num_ else { #pragma omp parallel for schedule(static, 8192) - for (int64_t i = 0; i < (_s64)num_points; i++) + for (int64_t i = 0; i < (int64_t)num_points; i++) { std::priority_queue top_k_queue; float *current = dist_matrix + (i * num_centers); @@ -182,7 +182,7 @@ void compute_closest_centers(float *data, size_t num_points, size_t dim, float * #pragma omp parallel for schedule(static, 1) for (int64_t j = cur_blk * PAR_BLOCK_SIZE; - j < std::min((_s64)num_points, (_s64)((cur_blk + 1) * PAR_BLOCK_SIZE)); j++) + j < std::min((int64_t)num_points, (int64_t)((cur_blk + 1) * PAR_BLOCK_SIZE)); j++) { for (size_t l = 0; l < k; l++) { @@ -212,7 +212,7 @@ void process_residuals(float *data_load, size_t num_points, size_t dim, float *c 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 (int64_t n_iter = 0; n_iter < (int64_t)num_points; n_iter++) { for (size_t d_iter = 0; d_iter < dim; d_iter++) { @@ -259,7 +259,7 @@ float lloyds_iter(float *data, size_t num_points, size_t dim, float *centers, si memset(centers, 0, sizeof(float) * (size_t)num_centers * (size_t)dim); #pragma omp parallel for schedule(static, 1) - for (int64_t c = 0; c < (_s64)num_centers; ++c) + for (int64_t c = 0; c < (int64_t)num_centers; ++c) { float *center = centers + (size_t)c * (size_t)dim; double *cluster_sum = new double[dim]; @@ -290,7 +290,7 @@ float lloyds_iter(float *data, size_t num_points, size_t dim, float *centers, si std::vector residuals(nchunks * BUF_PAD, 0.0); #pragma omp parallel for schedule(static, 32) - for (int64_t chunk = 0; chunk < (_s64)nchunks; ++chunk) + for (int64_t chunk = 0; chunk < (int64_t)nchunks; ++chunk) for (size_t d = chunk * CHUNK_SIZE; d < num_points && d < (chunk + 1) * CHUNK_SIZE; ++d) residuals[chunk * BUF_PAD] += math_utils::calc_distance(data + (d * dim), centers + (size_t)closest_center[d] * (size_t)dim, dim); @@ -405,7 +405,7 @@ void kmeanspp_selecting_pivots(float *data, size_t num_points, size_t dim, float float *dist = new float[num_points]; #pragma omp parallel for schedule(static, 8192) - for (int64_t i = 0; i < (_s64)num_points; i++) + for (int64_t i = 0; i < (int64_t)num_points; i++) { dist[i] = math_utils::calc_distance(data + i * dim, data + init_id * dim, dim); } @@ -446,7 +446,7 @@ void kmeanspp_selecting_pivots(float *data, size_t num_points, size_t dim, float std::memcpy(pivot_data + num_picked * dim, data + tmp_pivot * dim, dim * sizeof(float)); #pragma omp parallel for schedule(static, 8192) - for (int64_t i = 0; i < (_s64)num_points; i++) + for (int64_t i = 0; i < (int64_t)num_points; i++) { dist[i] = (std::min)(dist[i], math_utils::calc_distance(data + i * dim, data + tmp_pivot * dim, dim)); } diff --git a/src/natural_number_map.cpp b/src/natural_number_map.cpp index f5ba9523f..9050831a2 100644 --- a/src/natural_number_map.cpp +++ b/src/natural_number_map.cpp @@ -107,8 +107,8 @@ template void natural_number_map::cle } // Instantiate used templates. -template class natural_number_map; -template class natural_number_map; -template class natural_number_map; -template class natural_number_map; +template class natural_number_map; +template class natural_number_map; +template class natural_number_map; +template class natural_number_map; } // namespace diskann diff --git a/src/partition.cpp b/src/partition.cpp index ece453e87..2d46f9faf 100644 --- a/src/partition.cpp +++ b/src/partition.cpp @@ -33,7 +33,7 @@ template void gen_random_slice(const std::string base_file, const std::string output_prefix, double sampling_rate) { - _u64 read_blk_size = 64 * 1024 * 1024; + size_t read_blk_size = 64 * 1024 * 1024; cached_ifstream base_reader(base_file.c_str(), read_blk_size); std::ofstream sample_writer(std::string(output_prefix + "_data.bin").c_str(), std::ios::binary); std::ofstream sample_id_writer(std::string(output_prefix + "_ids.bin").c_str(), std::ios::binary); @@ -68,7 +68,7 @@ void gen_random_slice(const std::string base_file, const std::string output_pref if (sample < sampling_rate) { sample_writer.write((char *)cur_row.get(), sizeof(T) * nd); - uint32_t cur_i_u32 = (_u32)i; + uint32_t cur_i_u32 = (uint32_t)i; sample_id_writer.write((char *)&cur_i_u32, sizeof(uint32_t)); num_sampled_pts_u32++; } @@ -100,13 +100,13 @@ void gen_random_slice(const std::string data_file, double p_val, float *&sampled std::vector> sampled_vectors; // amount to read in one shot - _u64 read_blk_size = 64 * 1024 * 1024; + size_t read_blk_size = 64 * 1024 * 1024; // create cached reader + writer cached_ifstream base_reader(data_file.c_str(), read_blk_size); // metadata: npts, ndims - base_reader.read((char *)&npts32, sizeof(unsigned)); - base_reader.read((char *)&ndims32, sizeof(unsigned)); + base_reader.read((char *)&npts32, sizeof(uint32_t)); + base_reader.read((char *)&ndims32, sizeof(uint32_t)); npts = npts32; ndims = ndims32; @@ -115,7 +115,7 @@ void gen_random_slice(const std::string data_file, double p_val, float *&sampled std::random_device rd; // Will be used to obtain a seed for the random number size_t x = rd(); - std::mt19937 generator((unsigned)x); + std::mt19937 generator((uint32_t)x); std::uniform_real_distribution distribution(0, 1); for (size_t i = 0; i < npts; i++) @@ -154,7 +154,7 @@ void gen_random_slice(const T *inputdata, size_t npts, size_t ndims, double p_va std::random_device rd; // Will be used to obtain a seed for the random number engine size_t x = rd(); - std::mt19937 generator((unsigned)x); // Standard mersenne_twister_engine seeded with rd() + std::mt19937 generator((uint32_t)x); // Standard mersenne_twister_engine seeded with rd() std::uniform_real_distribution distribution(0, 1); for (size_t i = 0; i < npts; i++) @@ -193,7 +193,7 @@ int estimate_cluster_sizes(float *test_data_float, size_t num_test, float *pivot } size_t block_size = num_test <= BLOCK_SIZE ? num_test : BLOCK_SIZE; - _u32 *block_closest_centers = new _u32[block_size * k_base]; + uint32_t *block_closest_centers = new uint32_t[block_size * k_base]; float *block_data_float; size_t num_blocks = DIV_ROUND_UP(num_test, block_size); @@ -222,7 +222,7 @@ int estimate_cluster_sizes(float *test_data_float, size_t num_test, float *pivot diskann::cout << "Estimated cluster sizes: "; for (size_t i = 0; i < num_centers; i++) { - _u32 cur_shard_count = (_u32)shard_counts[i]; + uint32_t cur_shard_count = (uint32_t)shard_counts[i]; cluster_sizes.push_back((size_t)cur_shard_count); diskann::cout << cur_shard_count << " "; } @@ -236,12 +236,12 @@ template int shard_data_into_clusters(const std::string data_file, float *pivots, const size_t num_centers, const size_t dim, const size_t k_base, std::string prefix_path) { - _u64 read_blk_size = 64 * 1024 * 1024; - // _u64 write_blk_size = 64 * 1024 * 1024; + size_t read_blk_size = 64 * 1024 * 1024; + // uint64_t write_blk_size = 64 * 1024 * 1024; // create cached reader + writer cached_ifstream base_reader(data_file, read_blk_size); - _u32 npts32; - _u32 basedim32; + uint32_t npts32; + uint32_t basedim32; base_reader.read((char *)&npts32, sizeof(uint32_t)); base_reader.read((char *)&basedim32, sizeof(uint32_t)); size_t num_points = npts32; @@ -254,8 +254,8 @@ int shard_data_into_clusters(const std::string data_file, float *pivots, const s std::unique_ptr shard_counts = std::make_unique(num_centers); std::vector shard_data_writer(num_centers); std::vector shard_idmap_writer(num_centers); - _u32 dummy_size = 0; - _u32 const_one = 1; + uint32_t dummy_size = 0; + uint32_t const_one = 1; for (size_t i = 0; i < num_centers; i++) { @@ -271,7 +271,7 @@ int shard_data_into_clusters(const std::string data_file, float *pivots, const s } 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); + std::unique_ptr block_closest_centers = std::make_unique(block_size * k_base); std::unique_ptr block_data_T = std::make_unique(block_size * dim); std::unique_ptr block_data_float = std::make_unique(block_size * dim); @@ -306,7 +306,7 @@ int shard_data_into_clusters(const std::string data_file, float *pivots, const s diskann::cout << "Actual shard sizes: " << std::flush; for (size_t i = 0; i < num_centers; i++) { - _u32 cur_shard_count = (_u32)shard_counts[i]; + uint32_t cur_shard_count = (uint32_t)shard_counts[i]; total_count += cur_shard_count; diskann::cout << cur_shard_count << " "; shard_data_writer[i].seekp(0); @@ -328,12 +328,12 @@ template int shard_data_into_clusters_only_ids(const std::string data_file, float *pivots, const size_t num_centers, const size_t dim, const size_t k_base, std::string prefix_path) { - _u64 read_blk_size = 64 * 1024 * 1024; - // _u64 write_blk_size = 64 * 1024 * 1024; + size_t read_blk_size = 64 * 1024 * 1024; + // uint64_t write_blk_size = 64 * 1024 * 1024; // create cached reader + writer cached_ifstream base_reader(data_file, read_blk_size); - _u32 npts32; - _u32 basedim32; + uint32_t npts32; + uint32_t basedim32; base_reader.read((char *)&npts32, sizeof(uint32_t)); base_reader.read((char *)&basedim32, sizeof(uint32_t)); size_t num_points = npts32; @@ -346,8 +346,8 @@ int shard_data_into_clusters_only_ids(const std::string data_file, float *pivots std::unique_ptr shard_counts = std::make_unique(num_centers); std::vector shard_idmap_writer(num_centers); - _u32 dummy_size = 0; - _u32 const_one = 1; + uint32_t dummy_size = 0; + uint32_t const_one = 1; for (size_t i = 0; i < num_centers; i++) { @@ -359,7 +359,7 @@ int shard_data_into_clusters_only_ids(const std::string data_file, float *pivots } 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); + std::unique_ptr block_closest_centers = std::make_unique(block_size * k_base); std::unique_ptr block_data_T = std::make_unique(block_size * dim); std::unique_ptr block_data_float = std::make_unique(block_size * dim); @@ -393,7 +393,7 @@ int shard_data_into_clusters_only_ids(const std::string data_file, float *pivots diskann::cout << "Actual shard sizes: " << std::flush; for (size_t i = 0; i < num_centers; i++) { - _u32 cur_shard_count = (_u32)shard_counts[i]; + uint32_t cur_shard_count = (uint32_t)shard_counts[i]; total_count += cur_shard_count; diskann::cout << cur_shard_count << " "; shard_idmap_writer[i].seekp(0); @@ -409,29 +409,29 @@ int shard_data_into_clusters_only_ids(const std::string data_file, float *pivots template int retrieve_shard_data_from_ids(const std::string data_file, std::string idmap_filename, std::string data_filename) { - _u64 read_blk_size = 64 * 1024 * 1024; - // _u64 write_blk_size = 64 * 1024 * 1024; + size_t read_blk_size = 64 * 1024 * 1024; + // uint64_t write_blk_size = 64 * 1024 * 1024; // create cached reader + writer cached_ifstream base_reader(data_file, read_blk_size); - _u32 npts32; - _u32 basedim32; + uint32_t npts32; + uint32_t basedim32; base_reader.read((char *)&npts32, sizeof(uint32_t)); base_reader.read((char *)&basedim32, sizeof(uint32_t)); size_t num_points = npts32; size_t dim = basedim32; - _u32 dummy_size = 0; + uint32_t dummy_size = 0; std::ofstream shard_data_writer(data_filename.c_str(), std::ios::binary); shard_data_writer.write((char *)&dummy_size, sizeof(uint32_t)); shard_data_writer.write((char *)&basedim32, sizeof(uint32_t)); - _u32 *shard_ids; - _u64 shard_size, tmp; - diskann::load_bin<_u32>(idmap_filename, shard_ids, shard_size, tmp); + uint32_t *shard_ids; + uint64_t shard_size, tmp; + diskann::load_bin(idmap_filename, shard_ids, shard_size, tmp); - _u32 cur_pos = 0; - _u32 num_written = 0; + uint32_t cur_pos = 0; + uint32_t num_written = 0; std::cout << "Shard has " << shard_size << " points" << std::endl; size_t block_size = num_points <= BLOCK_SIZE ? num_points : BLOCK_SIZE; @@ -495,7 +495,8 @@ int partition(const std::string data_file, const float sampling_rate, size_t num // kmeans_partitioning on training data - // cur_file = cur_file + "_kmeans_partitioning-" + std::to_string(num_parts); + // cur_file = cur_file + "_kmeans_partitioning-" + + // std::to_string(num_parts); output_file = cur_file + "_centroids.bin"; pivot_data = new float[num_parts * train_dim]; @@ -544,7 +545,8 @@ int partition_with_ram_budget(const std::string data_file, const double sampling // kmeans_partitioning on training data - // cur_file = cur_file + "_kmeans_partitioning-" + std::to_string(num_parts); + // cur_file = cur_file + "_kmeans_partitioning-" + + // std::to_string(num_parts); output_file = cur_file + "_centroids.bin"; while (!fit_in_ram) @@ -572,8 +574,9 @@ int partition_with_ram_budget(const std::string data_file, const double sampling { // to account for the fact that p is the size of the shard over the // testing sample. - p = (_u64)(p / sampling_rate); - double cur_shard_ram_estimate = diskann::estimate_ram_usage(p, train_dim, sizeof(T), graph_degree); + p = (uint64_t)(p / sampling_rate); + double cur_shard_ram_estimate = + diskann::estimate_ram_usage(p, (uint32_t)train_dim, sizeof(T), (uint32_t)graph_degree); if (cur_shard_ram_estimate > max_ram_usage) max_ram_usage = cur_shard_ram_estimate; diff --git a/src/pq.cpp b/src/pq.cpp index 2eb0a3cb0..86c68ce0a 100644 --- a/src/pq.cpp +++ b/src/pq.cpp @@ -41,16 +41,16 @@ void FixedChunkPQTable::load_pq_centroid_bin(const char *pq_table_file, size_t n { #endif - _u64 nr, nc; + uint64_t nr, nc; std::string rotmat_file = std::string(pq_table_file) + "_rotation_matrix.bin"; #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_table_file, file_offset_data, nr, nc); + size_t *file_offset_data; // since load_bin only sets the pointer, no need + // to delete. + diskann::load_bin(files, pq_table_file, file_offset_data, nr, nc); #else - std::unique_ptr<_u64[]> file_offset_data; - diskann::load_bin<_u64>(pq_table_file, file_offset_data, nr, nc); + std::unique_ptr file_offset_data; + diskann::load_bin(pq_table_file, file_offset_data, nr, nc); #endif bool use_old_filetype = false; @@ -150,32 +150,32 @@ void FixedChunkPQTable::load_pq_centroid_bin(const char *pq_table_file, size_t n // alloc and compute transpose tables_tr = new float[256 * this->ndims]; - for (_u64 i = 0; i < 256; i++) + for (size_t i = 0; i < 256; i++) { - for (_u64 j = 0; j < this->ndims; j++) + for (size_t j = 0; j < this->ndims; j++) { tables_tr[j * 256 + i] = tables[i * this->ndims + j]; } } } -_u32 FixedChunkPQTable::get_num_chunks() +uint32_t FixedChunkPQTable::get_num_chunks() { - return static_cast<_u32>(n_chunks); + return static_cast(n_chunks); } void FixedChunkPQTable::preprocess_query(float *query_vec) { - for (_u32 d = 0; d < ndims; d++) + for (uint32_t d = 0; d < ndims; d++) { query_vec[d] -= centroid[d]; } std::vector tmp(ndims, 0); if (use_rotation) { - for (_u32 d = 0; d < ndims; d++) + for (uint32_t d = 0; d < ndims; d++) { - for (_u32 d1 = 0; d1 < ndims; d1++) + for (uint32_t d1 = 0; d1 < ndims; d1++) { tmp[d] += query_vec[d1] * rotmat_tr[d1 * ndims + d]; } @@ -189,14 +189,14 @@ void FixedChunkPQTable::populate_chunk_distances(const float *query_vec, float * { memset(dist_vec, 0, 256 * n_chunks * sizeof(float)); // chunk wise distance computation - for (_u64 chunk = 0; chunk < n_chunks; chunk++) + for (size_t chunk = 0; chunk < n_chunks; chunk++) { // sum (q-c)^2 for the dimensions associated with this chunk float *chunk_dists = dist_vec + (256 * chunk); - for (_u64 j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) + for (size_t j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) { const float *centers_dim_vec = tables_tr + (256 * j); - for (_u64 idx = 0; idx < 256; idx++) + for (size_t idx = 0; idx < 256; idx++) { double diff = centers_dim_vec[idx] - (query_vec[j]); chunk_dists[idx] += (float)(diff * diff); @@ -205,12 +205,12 @@ void FixedChunkPQTable::populate_chunk_distances(const float *query_vec, float * } } -float FixedChunkPQTable::l2_distance(const float *query_vec, _u8 *base_vec) +float FixedChunkPQTable::l2_distance(const float *query_vec, uint8_t *base_vec) { float res = 0; - for (_u64 chunk = 0; chunk < n_chunks; chunk++) + for (size_t chunk = 0; chunk < n_chunks; chunk++) { - for (_u64 j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) + for (size_t j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) { const float *centers_dim_vec = tables_tr + (256 * j); float diff = centers_dim_vec[base_vec[chunk]] - (query_vec[j]); @@ -220,12 +220,12 @@ float FixedChunkPQTable::l2_distance(const float *query_vec, _u8 *base_vec) return res; } -float FixedChunkPQTable::inner_product(const float *query_vec, _u8 *base_vec) +float FixedChunkPQTable::inner_product(const float *query_vec, uint8_t *base_vec) { float res = 0; - for (_u64 chunk = 0; chunk < n_chunks; chunk++) + for (size_t chunk = 0; chunk < n_chunks; chunk++) { - for (_u64 j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) + for (size_t j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) { const float *centers_dim_vec = tables_tr + (256 * j); float diff = centers_dim_vec[base_vec[chunk]] * query_vec[j]; // assumes centroid is 0 to @@ -238,11 +238,11 @@ float FixedChunkPQTable::inner_product(const float *query_vec, _u8 *base_vec) } // assumes no rotation is involved -void FixedChunkPQTable::inflate_vector(_u8 *base_vec, float *out_vec) +void FixedChunkPQTable::inflate_vector(uint8_t *base_vec, float *out_vec) { - for (_u64 chunk = 0; chunk < n_chunks; chunk++) + for (size_t chunk = 0; chunk < n_chunks; chunk++) { - for (_u64 j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) + for (size_t j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) { const float *centers_dim_vec = tables_tr + (256 * j); out_vec[j] = centers_dim_vec[base_vec[chunk]] + centroid[j]; @@ -254,35 +254,35 @@ void FixedChunkPQTable::populate_chunk_inner_products(const float *query_vec, fl { memset(dist_vec, 0, 256 * n_chunks * sizeof(float)); // chunk wise distance computation - for (_u64 chunk = 0; chunk < n_chunks; chunk++) + for (size_t chunk = 0; chunk < n_chunks; chunk++) { // sum (q-c)^2 for the dimensions associated with this chunk float *chunk_dists = dist_vec + (256 * chunk); - for (_u64 j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) + for (size_t j = chunk_offsets[chunk]; j < chunk_offsets[chunk + 1]; j++) { const float *centers_dim_vec = tables_tr + (256 * j); - for (_u64 idx = 0; idx < 256; idx++) + for (size_t idx = 0; idx < 256; idx++) { double prod = centers_dim_vec[idx] * query_vec[j]; // assumes that we are not // shifting the vectors to // mean zero, i.e., centroid // array should be all zeros - chunk_dists[idx] -= (float)prod; // returning negative to keep the search code clean - // (max inner product vs min distance) + chunk_dists[idx] -= (float)prod; // returning negative to keep the search code + // clean (max inner product vs min distance) } } } } -void aggregate_coords(const std::vector &ids, const _u8 *all_coords, const _u64 ndims, _u8 *out) +void aggregate_coords(const std::vector &ids, const uint8_t *all_coords, const size_t ndims, uint8_t *out) { - for (_u64 i = 0; i < ids.size(); i++) + for (size_t i = 0; i < ids.size(); i++) { - memcpy(out + i * ndims, all_coords + ids[i] * ndims, ndims * sizeof(_u8)); + memcpy(out + i * ndims, all_coords + ids[i] * ndims, ndims * sizeof(uint8_t)); } } -void pq_dist_lookup(const _u8 *pq_ids, const _u64 n_pts, const _u64 pq_nchunks, const float *pq_dists, +void pq_dist_lookup(const uint8_t *pq_ids, const size_t n_pts, const size_t pq_nchunks, const float *pq_dists, std::vector &dists_out) { //_mm_prefetch((char*) dists_out, _MM_HINT_T0); @@ -291,47 +291,50 @@ void pq_dist_lookup(const _u8 *pq_ids, const _u64 n_pts, const _u64 pq_nchunks, _mm_prefetch((char *)(pq_ids + 128), _MM_HINT_T0); dists_out.clear(); dists_out.resize(n_pts, 0); - for (_u64 chunk = 0; chunk < pq_nchunks; chunk++) + for (size_t chunk = 0; chunk < pq_nchunks; chunk++) { const float *chunk_dists = pq_dists + 256 * chunk; if (chunk < pq_nchunks - 1) { _mm_prefetch((char *)(chunk_dists + 256), _MM_HINT_T0); } - for (_u64 idx = 0; idx < n_pts; idx++) + for (size_t idx = 0; idx < n_pts; idx++) { - _u8 pq_centerid = pq_ids[pq_nchunks * idx + chunk]; + uint8_t pq_centerid = pq_ids[pq_nchunks * idx + chunk]; dists_out[idx] += chunk_dists[pq_centerid]; } } } -// Need to replace calls to these functions with calls to vector& based functions above -void aggregate_coords(const unsigned *ids, const _u64 n_ids, const _u8 *all_coords, const _u64 ndims, _u8 *out) +// Need to replace calls to these functions with calls to vector& based +// functions above +void aggregate_coords(const uint32_t *ids, const size_t n_ids, const uint8_t *all_coords, const size_t ndims, + uint8_t *out) { - for (_u64 i = 0; i < n_ids; i++) + for (size_t i = 0; i < n_ids; i++) { - memcpy(out + i * ndims, all_coords + ids[i] * ndims, ndims * sizeof(_u8)); + memcpy(out + i * ndims, all_coords + ids[i] * ndims, ndims * sizeof(uint8_t)); } } -void pq_dist_lookup(const _u8 *pq_ids, const _u64 n_pts, const _u64 pq_nchunks, const float *pq_dists, float *dists_out) +void pq_dist_lookup(const uint8_t *pq_ids, const size_t n_pts, const size_t pq_nchunks, const float *pq_dists, + float *dists_out) { _mm_prefetch((char *)dists_out, _MM_HINT_T0); _mm_prefetch((char *)pq_ids, _MM_HINT_T0); _mm_prefetch((char *)(pq_ids + 64), _MM_HINT_T0); _mm_prefetch((char *)(pq_ids + 128), _MM_HINT_T0); memset(dists_out, 0, n_pts * sizeof(float)); - for (_u64 chunk = 0; chunk < pq_nchunks; chunk++) + for (size_t chunk = 0; chunk < pq_nchunks; chunk++) { const float *chunk_dists = pq_dists + 256 * chunk; if (chunk < pq_nchunks - 1) { _mm_prefetch((char *)(chunk_dists + 256), _MM_HINT_T0); } - for (_u64 idx = 0; idx < n_pts; idx++) + for (size_t idx = 0; idx < n_pts; idx++) { - _u8 pq_centerid = pq_ids[pq_nchunks * idx + chunk]; + uint8_t pq_centerid = pq_ids[pq_nchunks * idx + chunk]; dists_out[idx] += chunk_dists[pq_centerid]; } } @@ -342,8 +345,8 @@ void pq_dist_lookup(const _u8 *pq_ids, const _u64 n_pts, const _u64 pq_nchunks, // 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 -int generate_pq_pivots(const float *const 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, +int generate_pq_pivots(const float *const passed_train_data, size_t num_train, uint32_t dim, uint32_t num_centers, + uint32_t num_pq_chunks, uint32_t max_k_means_reps, std::string pq_pivots_path, bool make_zero_mean) { if (num_pq_chunks > dim) @@ -440,7 +443,7 @@ int generate_pq_pivots(const float *const passed_train_data, size_t num_train, u for (uint32_t b = 0; b < num_pq_chunks; b++) { if (b > 0) - chunk_offsets.push_back(chunk_offsets[b - 1] + (unsigned)bin_to_dims[b - 1].size()); + chunk_offsets.push_back(chunk_offsets[b - 1] + (uint32_t)bin_to_dims[b - 1].size()); } chunk_offsets.push_back(dim); @@ -460,7 +463,7 @@ int generate_pq_pivots(const float *const passed_train_data, size_t num_train, u << chunk_offsets[i + 1] << ")" << std::endl; #pragma omp parallel for schedule(static, 65536) - for (int64_t j = 0; j < (_s64)num_train; j++) + for (int64_t j = 0; j < (int64_t)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)); @@ -486,7 +489,7 @@ int generate_pq_pivots(const float *const passed_train_data, size_t num_train, u 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(), chunk_offsets.data(), chunk_offsets.size(), 1, cumul_bytes[2]); - diskann::save_bin<_u64>(pq_pivots_path.c_str(), cumul_bytes.data(), cumul_bytes.size(), 1, 0); + diskann::save_bin(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; @@ -494,8 +497,8 @@ int generate_pq_pivots(const float *const passed_train_data, size_t num_train, u return 0; } -int generate_opq_pivots(const float *passed_train_data, size_t num_train, unsigned dim, unsigned num_centers, - unsigned num_pq_chunks, std::string opq_pivots_path, bool make_zero_mean) +int generate_opq_pivots(const float *passed_train_data, size_t num_train, uint32_t dim, uint32_t num_centers, + uint32_t num_pq_chunks, std::string opq_pivots_path, bool make_zero_mean) { if (num_pq_chunks > dim) { @@ -591,7 +594,7 @@ int generate_opq_pivots(const float *passed_train_data, size_t num_train, unsign for (uint32_t b = 0; b < num_pq_chunks; b++) { if (b > 0) - chunk_offsets.push_back(chunk_offsets[b - 1] + (unsigned)bin_to_dims[b - 1].size()); + chunk_offsets.push_back(chunk_offsets[b - 1] + (uint32_t)bin_to_dims[b - 1].size()); } chunk_offsets.push_back(dim); @@ -599,10 +602,10 @@ int generate_opq_pivots(const float *passed_train_data, size_t num_train, unsign rotmat_tr.reset(new float[dim * dim]); std::memset(rotmat_tr.get(), 0, dim * dim * sizeof(float)); - for (_u32 d1 = 0; d1 < dim; d1++) + for (uint32_t d1 = 0; d1 < dim; d1++) *(rotmat_tr.get() + d1 * dim + d1) = 1; - for (_u32 rnd = 0; rnd < MAX_OPQ_ITERS; rnd++) + for (uint32_t rnd = 0; rnd < MAX_OPQ_ITERS; rnd++) { // rotate the training data using the current rotation matrix cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, (MKL_INT)num_train, (MKL_INT)dim, (MKL_INT)dim, 1.0f, @@ -624,7 +627,7 @@ int generate_opq_pivots(const float *passed_train_data, size_t num_train, unsign << chunk_offsets[i + 1] << ")" << std::endl; #pragma omp parallel for schedule(static, 65536) - for (int64_t j = 0; j < (_s64)num_train; j++) + for (int64_t j = 0; j < (int64_t)num_train; j++) { std::memcpy(cur_data.get() + j * cur_chunk_size, rotated_train_data.get() + j * dim + chunk_offsets[i], cur_chunk_size * sizeof(float)); @@ -644,7 +647,7 @@ int generate_opq_pivots(const float *passed_train_data, size_t num_train, unsign } } - _u32 num_lloyds_iters = 8; + uint32_t num_lloyds_iters = 8; kmeans::run_lloyds(cur_data.get(), num_train, cur_chunk_size, cur_pivot_data.get(), num_centers, num_lloyds_iters, NULL, closest_center.get()); @@ -654,10 +657,10 @@ int generate_opq_pivots(const float *passed_train_data, size_t num_train, unsign cur_pivot_data.get() + j * cur_chunk_size, cur_chunk_size * sizeof(float)); } - for (_u64 j = 0; j < num_train; j++) + for (size_t j = 0; j < num_train; j++) { std::memcpy(rotated_and_quantized_train_data.get() + j * dim + chunk_offsets[i], - cur_pivot_data.get() + (_u64)closest_center[j] * cur_chunk_size, + cur_pivot_data.get() + (size_t)closest_center[j] * cur_chunk_size, cur_chunk_size * sizeof(float)); } } @@ -670,9 +673,9 @@ int generate_opq_pivots(const float *passed_train_data, size_t num_train, unsign // compute the SVD of the correlation matrix to help determine the new // rotation matrix - _u32 errcode = - LAPACKE_sgesdd(LAPACK_ROW_MAJOR, 'A', (MKL_INT)dim, (MKL_INT)dim, correlation_matrix.get(), (MKL_INT)dim, - singular_values.get(), Umat.get(), (MKL_INT)dim, Vmat_T.get(), (MKL_INT)dim); + uint32_t errcode = (uint32_t)LAPACKE_sgesdd(LAPACK_ROW_MAJOR, 'A', (MKL_INT)dim, (MKL_INT)dim, + correlation_matrix.get(), (MKL_INT)dim, singular_values.get(), + Umat.get(), (MKL_INT)dim, Vmat_T.get(), (MKL_INT)dim); if (errcode > 0) { @@ -694,7 +697,7 @@ int generate_opq_pivots(const float *passed_train_data, size_t num_train, unsign diskann::save_bin(opq_pivots_path.c_str(), centroid.get(), (size_t)dim, 1, cumul_bytes[1]); cumul_bytes[3] = cumul_bytes[2] + diskann::save_bin(opq_pivots_path.c_str(), chunk_offsets.data(), chunk_offsets.size(), 1, cumul_bytes[2]); - diskann::save_bin<_u64>(opq_pivots_path.c_str(), cumul_bytes.data(), cumul_bytes.size(), 1, 0); + diskann::save_bin(opq_pivots_path.c_str(), cumul_bytes.data(), cumul_bytes.size(), 1, 0); diskann::cout << "Saved opq pivot data to " << opq_pivots_path << " of size " << cumul_bytes[cumul_bytes.size() - 1] << "B." << std::endl; @@ -711,13 +714,14 @@ int generate_opq_pivots(const float *passed_train_data, size_t num_train, unsign // If the numbber of centers is < 256, it stores as byte vector, else as // 4-byte vector in binary format. 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, bool use_opq) +int generate_pq_data_from_pivots(const std::string &data_file, uint32_t num_centers, uint32_t num_pq_chunks, + const std::string &pq_pivots_path, const std::string &pq_compressed_vectors_path, + bool use_opq) { - _u64 read_blk_size = 64 * 1024 * 1024; + size_t read_blk_size = 64 * 1024 * 1024; cached_ifstream base_reader(data_file, read_blk_size); - _u32 npts32; - _u32 basedim32; + uint32_t npts32; + uint32_t basedim32; base_reader.read((char *)&npts32, sizeof(uint32_t)); base_reader.read((char *)&basedim32, sizeof(uint32_t)); size_t num_points = npts32; @@ -737,10 +741,10 @@ int generate_pq_data_from_pivots(const std::string data_file, unsigned num_cente } else { - _u64 nr, nc; - std::unique_ptr<_u64[]> file_offset_data; + size_t nr, nc; + std::unique_ptr file_offset_data; - diskann::load_bin<_u64>(pq_pivots_path.c_str(), file_offset_data, nr, nc, 0); + diskann::load_bin(pq_pivots_path.c_str(), file_offset_data, nr, nc, 0); if (nr != 4) { @@ -796,7 +800,7 @@ int generate_pq_data_from_pivots(const std::string data_file, unsigned num_cente } std::ofstream compressed_file_writer(pq_compressed_vectors_path, std::ios::binary); - _u32 num_pq_chunks_u32 = num_pq_chunks; + uint32_t 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)); @@ -812,8 +816,9 @@ int generate_pq_data_from_pivots(const std::string data_file, unsigned num_cente std::memset(block_inflated_base.get(), 0, block_size * dim * sizeof(float)); #endif - std::unique_ptr<_u32[]> block_compressed_base = std::make_unique<_u32[]>(block_size * (_u64)num_pq_chunks); - std::memset(block_compressed_base.get(), 0, block_size * (_u64)num_pq_chunks * sizeof(uint32_t)); + std::unique_ptr block_compressed_base = + std::make_unique(block_size * (size_t)num_pq_chunks); + std::memset(block_compressed_base.get(), 0, block_size * (size_t)num_pq_chunks * sizeof(uint32_t)); std::unique_ptr block_data_T = std::make_unique(block_size * dim); std::unique_ptr block_data_float = std::make_unique(block_size * dim); @@ -832,7 +837,7 @@ int generate_pq_data_from_pivots(const std::string data_file, unsigned num_cente diskann::cout << "Processing points [" << start_id << ", " << end_id << ").." << std::flush; - for (uint64_t p = 0; p < cur_blk_size; p++) + for (size_t p = 0; p < cur_blk_size; p++) { for (uint64_t d = 0; d < dim; d++) { @@ -840,7 +845,7 @@ int generate_pq_data_from_pivots(const std::string data_file, unsigned num_cente } } - for (uint64_t p = 0; p < cur_blk_size; p++) + for (size_t p = 0; p < cur_blk_size; p++) { for (uint64_t d = 0; d < dim; d++) { @@ -850,7 +855,8 @@ int generate_pq_data_from_pivots(const std::string data_file, unsigned num_cente if (use_opq) { - // rotate the current block with the trained rotation matrix before PQ + // rotate the current block with the trained rotation matrix before + // PQ cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, (MKL_INT)cur_blk_size, (MKL_INT)dim, (MKL_INT)dim, 1.0f, block_data_float.get(), (MKL_INT)dim, rotmat_tr.get(), (MKL_INT)dim, 0.0f, block_data_tmp.get(), (MKL_INT)dim); @@ -868,14 +874,14 @@ int generate_pq_data_from_pivots(const std::string data_file, unsigned num_cente std::unique_ptr closest_center = std::make_unique(cur_blk_size); #pragma omp parallel for schedule(static, 8192) - for (int64_t j = 0; j < (_s64)cur_blk_size; j++) + for (int64_t j = 0; j < (int64_t)cur_blk_size; j++) { - for (uint64_t k = 0; k < cur_chunk_size; k++) + for (size_t k = 0; k < cur_chunk_size; k++) cur_data[j * cur_chunk_size + k] = block_data_float[j * dim + chunk_offsets[i] + k]; } #pragma omp parallel for schedule(static, 1) - for (int64_t j = 0; j < (_s64)num_centers; j++) + for (int64_t j = 0; j < (int64_t)num_centers; j++) { std::memcpy(cur_pivot_data.get() + j * cur_chunk_size, full_pivot_data.get() + j * dim + chunk_offsets[i], cur_chunk_size * sizeof(float)); @@ -885,11 +891,11 @@ int generate_pq_data_from_pivots(const std::string data_file, unsigned num_cente num_centers, 1, closest_center.get()); #pragma omp parallel for schedule(static, 8192) - for (int64_t j = 0; j < (_s64)cur_blk_size; j++) + for (int64_t j = 0; j < (int64_t)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++) + for (size_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 @@ -926,8 +932,8 @@ int generate_pq_data_from_pivots(const std::string data_file, unsigned num_cente } template -void generate_disk_quantized_data(const std::string data_file_to_use, const std::string disk_pq_pivots_path, - const std::string disk_pq_compressed_vectors_path, diskann::Metric compareMetric, +void generate_disk_quantized_data(const std::string &data_file_to_use, const std::string &disk_pq_pivots_path, + const std::string &disk_pq_compressed_vectors_path, diskann::Metric compareMetric, const double p_val, size_t &disk_pq_dims) { size_t train_size, train_dim; @@ -944,97 +950,108 @@ void generate_disk_quantized_data(const std::string data_file_to_use, const std: generate_pq_pivots(train_data, train_size, (uint32_t)train_dim, 256, (uint32_t)disk_pq_dims, NUM_KMEANS_REPS_PQ, disk_pq_pivots_path, false); if (compareMetric == diskann::Metric::INNER_PRODUCT) - generate_pq_data_from_pivots(data_file_to_use.c_str(), 256, (uint32_t)disk_pq_dims, disk_pq_pivots_path, + generate_pq_data_from_pivots(data_file_to_use, 256, (uint32_t)disk_pq_dims, disk_pq_pivots_path, disk_pq_compressed_vectors_path); else - generate_pq_data_from_pivots(data_file_to_use.c_str(), 256, (uint32_t)disk_pq_dims, disk_pq_pivots_path, + generate_pq_data_from_pivots(data_file_to_use, 256, (uint32_t)disk_pq_dims, disk_pq_pivots_path, disk_pq_compressed_vectors_path); delete[] train_data; } template -void generate_quantized_data(const std::string data_file_to_use, const std::string pq_pivots_path, - const std::string pq_compressed_vectors_path, diskann::Metric compareMetric, - const double p_val, const size_t num_pq_chunks, const bool use_opq) +void generate_quantized_data(const std::string &data_file_to_use, const std::string &pq_pivots_path, + const std::string &pq_compressed_vectors_path, diskann::Metric compareMetric, + const double p_val, const size_t num_pq_chunks, const bool use_opq, + const std::string &codebook_prefix) { size_t train_size, train_dim; float *train_data; + if (!file_exists(codebook_prefix)) + { + // instantiates train_data with random sample updates train_size + gen_random_slice(data_file_to_use.c_str(), p_val, train_data, train_size, train_dim); + diskann::cout << "Training data with " << train_size << " samples loaded." << std::endl; - // instantiates train_data with random sample updates train_size - gen_random_slice(data_file_to_use.c_str(), p_val, train_data, train_size, train_dim); - diskann::cout << "Training data with " << train_size << " samples loaded." << std::endl; - - bool make_zero_mean = true; - if (compareMetric == diskann::Metric::INNER_PRODUCT) - make_zero_mean = false; - if (use_opq) // we also do not center the data for OPQ - make_zero_mean = false; + bool make_zero_mean = true; + if (compareMetric == diskann::Metric::INNER_PRODUCT) + make_zero_mean = false; + if (use_opq) // we also do not center the data for OPQ + make_zero_mean = false; - if (!use_opq) - { - generate_pq_pivots(train_data, train_size, (uint32_t)train_dim, NUM_PQ_CENTROIDS, (uint32_t)num_pq_chunks, - NUM_KMEANS_REPS_PQ, pq_pivots_path, make_zero_mean); + if (!use_opq) + { + generate_pq_pivots(train_data, train_size, (uint32_t)train_dim, NUM_PQ_CENTROIDS, (uint32_t)num_pq_chunks, + NUM_KMEANS_REPS_PQ, pq_pivots_path, make_zero_mean); + } + else + { + generate_opq_pivots(train_data, train_size, (uint32_t)train_dim, NUM_PQ_CENTROIDS, (uint32_t)num_pq_chunks, + pq_pivots_path, make_zero_mean); + } + delete[] train_data; } else { - generate_opq_pivots(train_data, train_size, (_u32)train_dim, NUM_PQ_CENTROIDS, (_u32)num_pq_chunks, - pq_pivots_path, make_zero_mean); + diskann::cout << "Skip Training with predefined pivots in: " << pq_pivots_path << std::endl; } - generate_pq_data_from_pivots(data_file_to_use.c_str(), NUM_PQ_CENTROIDS, (uint32_t)num_pq_chunks, pq_pivots_path, + generate_pq_data_from_pivots(data_file_to_use, NUM_PQ_CENTROIDS, (uint32_t)num_pq_chunks, pq_pivots_path, pq_compressed_vectors_path, use_opq); - - delete[] train_data; } // Instantations of supported templates -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, +template DISKANN_DLLEXPORT int generate_pq_data_from_pivots(const std::string &data_file, uint32_t num_centers, + uint32_t num_pq_chunks, + const std::string &pq_pivots_path, + const std::string &pq_compressed_vectors_path, bool use_opq); -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, +template DISKANN_DLLEXPORT int generate_pq_data_from_pivots(const std::string &data_file, uint32_t num_centers, + uint32_t num_pq_chunks, + const std::string &pq_pivots_path, + const std::string &pq_compressed_vectors_path, bool use_opq); -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, +template DISKANN_DLLEXPORT int generate_pq_data_from_pivots(const std::string &data_file, uint32_t num_centers, + uint32_t num_pq_chunks, + const std::string &pq_pivots_path, + const std::string &pq_compressed_vectors_path, bool use_opq); -template DISKANN_DLLEXPORT void generate_disk_quantized_data(const std::string data_file_to_use, - const std::string disk_pq_pivots_path, - const std::string disk_pq_compressed_vectors_path, +template DISKANN_DLLEXPORT void generate_disk_quantized_data(const std::string &data_file_to_use, + const std::string &disk_pq_pivots_path, + const std::string &disk_pq_compressed_vectors_path, diskann::Metric compareMetric, const double p_val, size_t &disk_pq_dims); -template DISKANN_DLLEXPORT void generate_disk_quantized_data(const std::string data_file_to_use, - const std::string disk_pq_pivots_path, - const std::string disk_pq_compressed_vectors_path, - diskann::Metric compareMetric, const double p_val, - size_t &disk_pq_dims); +template DISKANN_DLLEXPORT void generate_disk_quantized_data( + const std::string &data_file_to_use, const std::string &disk_pq_pivots_path, + const std::string &disk_pq_compressed_vectors_path, diskann::Metric compareMetric, const double p_val, + size_t &disk_pq_dims); -template DISKANN_DLLEXPORT void generate_disk_quantized_data(const std::string data_file_to_use, - const std::string disk_pq_pivots_path, - const std::string disk_pq_compressed_vectors_path, +template DISKANN_DLLEXPORT void generate_disk_quantized_data(const std::string &data_file_to_use, + const std::string &disk_pq_pivots_path, + const std::string &disk_pq_compressed_vectors_path, diskann::Metric compareMetric, const double p_val, size_t &disk_pq_dims); -template DISKANN_DLLEXPORT void generate_quantized_data(const std::string data_file_to_use, - const std::string pq_pivots_path, - const std::string pq_compressed_vectors_path, +template DISKANN_DLLEXPORT void generate_quantized_data(const std::string &data_file_to_use, + const std::string &pq_pivots_path, + const std::string &pq_compressed_vectors_path, diskann::Metric compareMetric, const double p_val, - const size_t num_pq_chunks, const bool use_opq); + const size_t num_pq_chunks, const bool use_opq, + const std::string &codebook_prefix); -template DISKANN_DLLEXPORT void generate_quantized_data(const std::string data_file_to_use, - const std::string pq_pivots_path, - const std::string pq_compressed_vectors_path, +template DISKANN_DLLEXPORT void generate_quantized_data(const std::string &data_file_to_use, + const std::string &pq_pivots_path, + const std::string &pq_compressed_vectors_path, diskann::Metric compareMetric, const double p_val, - const size_t num_pq_chunks, const bool use_opq); + const size_t num_pq_chunks, const bool use_opq, + const std::string &codebook_prefix); -template DISKANN_DLLEXPORT void generate_quantized_data(const std::string data_file_to_use, - const std::string pq_pivots_path, - const std::string pq_compressed_vectors_path, +template DISKANN_DLLEXPORT void generate_quantized_data(const std::string &data_file_to_use, + const std::string &pq_pivots_path, + const std::string &pq_compressed_vectors_path, diskann::Metric compareMetric, const double p_val, - const size_t num_pq_chunks, const bool use_opq); + const size_t num_pq_chunks, const bool use_opq, + const std::string &codebook_prefix); } // namespace diskann diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index 050d20546..943fed44c 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -14,34 +14,35 @@ #include "linux_aligned_file_reader.h" #endif -#define READ_U64(stream, val) stream.read((char *)&val, sizeof(_u64)) -#define READ_U32(stream, val) stream.read((char *)&val, sizeof(_u32)) +#define READ_U64(stream, val) stream.read((char *)&val, sizeof(uint64_t)) +#define READ_U32(stream, val) stream.read((char *)&val, sizeof(uint32_t)) #define READ_UNSIGNED(stream, val) stream.read((char *)&val, sizeof(unsigned)) // sector # on disk where node_id is present with in the graph part -#define NODE_SECTOR_NO(node_id) (((_u64)(node_id)) / nnodes_per_sector + 1) +#define NODE_SECTOR_NO(node_id) (((uint64_t)(node_id)) / nnodes_per_sector + 1) // obtains region of sector containing node -#define OFFSET_TO_NODE(sector_buf, node_id) ((char *)sector_buf + (((_u64)node_id) % nnodes_per_sector) * max_node_len) +#define OFFSET_TO_NODE(sector_buf, node_id) \ + ((char *)sector_buf + (((uint64_t)node_id) % nnodes_per_sector) * max_node_len) -// returns region of `node_buf` containing [NNBRS][NBR_ID(_u32)] +// returns region of `node_buf` containing [NNBRS][NBR_ID(uint32_t)] #define OFFSET_TO_NODE_NHOOD(node_buf) (unsigned *)((char *)node_buf + disk_bytes_per_point) // returns region of `node_buf` containing [COORD(T)] #define OFFSET_TO_NODE_COORDS(node_buf) (T *)(node_buf) // sector # beyond the end of graph where data for id is present for reordering -#define VECTOR_SECTOR_NO(id) (((_u64)(id)) / nvecs_per_sector + reorder_data_start_sector) +#define VECTOR_SECTOR_NO(id) (((uint64_t)(id)) / nvecs_per_sector + reorder_data_start_sector) // sector # beyond the end of graph where data for id is present for reordering -#define VECTOR_SECTOR_OFFSET(id) ((((_u64)(id)) % nvecs_per_sector) * data_dim * sizeof(float)) +#define VECTOR_SECTOR_OFFSET(id) ((((uint64_t)(id)) % nvecs_per_sector) * data_dim * sizeof(float)) namespace diskann { template PQFlashIndex::PQFlashIndex(std::shared_ptr &fileReader, diskann::Metric m) - : reader(fileReader), metric(m) + : reader(fileReader), metric(m), thread_data(nullptr) { if (m == diskann::Metric::COSINE || m == diskann::Metric::INNER_PRODUCT) { @@ -102,12 +103,12 @@ template PQFlashIndex::~PQFlashIndex() } template -void PQFlashIndex::setup_thread_data(_u64 nthreads, _u64 visited_reserve) +void PQFlashIndex::setup_thread_data(uint64_t nthreads, uint64_t visited_reserve) { diskann::cout << "Setting up thread-specific contexts for nthreads: " << nthreads << std::endl; // omp parallel for to generate unique thread IDs #pragma omp parallel for num_threads((int)nthreads) - for (_s64 thread = 0; thread < (_s64)nthreads; thread++) + for (int64_t thread = 0; thread < (int64_t)nthreads; thread++) { #pragma omp critical { @@ -123,30 +124,30 @@ void PQFlashIndex::setup_thread_data(_u64 nthreads, _u64 visited_rese 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(); + size_t num_cached_nodes = node_list.size(); // borrow thread data ScratchStoreManager> manager(this->thread_data); auto this_thread_data = manager.scratch_space(); IOContext &ctx = this_thread_data->ctx; - nhood_cache_buf = new unsigned[num_cached_nodes * (max_degree + 1)]; + nhood_cache_buf = new uint32_t[num_cached_nodes * (max_degree + 1)]; memset(nhood_cache_buf, 0, num_cached_nodes * (max_degree + 1)); - _u64 coord_cache_buf_len = num_cached_nodes * aligned_dim; + size_t coord_cache_buf_len = num_cached_nodes * aligned_dim; diskann::alloc_aligned((void **)&coord_cache_buf, coord_cache_buf_len * sizeof(T), 8 * sizeof(T)); memset(coord_cache_buf, 0, coord_cache_buf_len * sizeof(T)); size_t BLOCK_SIZE = 8; size_t num_blocks = DIV_ROUND_UP(num_cached_nodes, BLOCK_SIZE); - for (_u64 block = 0; block < num_blocks; block++) + for (size_t block = 0; block < num_blocks; block++) { - _u64 start_idx = block * BLOCK_SIZE; - _u64 end_idx = (std::min)(num_cached_nodes, (block + 1) * BLOCK_SIZE); + size_t start_idx = block * BLOCK_SIZE; + size_t end_idx = (std::min)(num_cached_nodes, (block + 1) * BLOCK_SIZE); std::vector read_reqs; - std::vector> nhoods; - for (_u64 node_idx = start_idx; node_idx < end_idx; node_idx++) + std::vector> nhoods; + for (size_t node_idx = start_idx; node_idx < end_idx; node_idx++) { AlignedRead read; char *buf = nullptr; @@ -160,8 +161,8 @@ template void PQFlashIndex::load_cache_ reader->read(read_reqs, ctx); - _u64 node_idx = start_idx; - for (_u32 i = 0; i < read_reqs.size(); i++) + size_t node_idx = start_idx; + for (uint32_t i = 0; i < read_reqs.size(); i++) { #if defined(_WINDOWS) && defined(USE_BING_INFRA) // this block is to handle failed reads in // production settings @@ -178,14 +179,14 @@ template void PQFlashIndex::load_cache_ coord_cache.insert(std::make_pair(nhood.first, cached_coords)); // insert node nhood into nhood_cache - unsigned *node_nhood = OFFSET_TO_NODE_NHOOD(node_buf); + uint32_t *node_nhood = OFFSET_TO_NODE_NHOOD(node_buf); auto nnbrs = *node_nhood; - unsigned *nbrs = node_nhood + 1; - std::pair<_u32, unsigned *> cnhood; + uint32_t *nbrs = node_nhood + 1; + std::pair cnhood; cnhood.first = nnbrs; cnhood.second = nhood_cache_buf + node_idx * (max_degree + 1); - memcpy(cnhood.second, nbrs, nnbrs * sizeof(unsigned)); + memcpy(cnhood.second, nbrs, nnbrs * sizeof(uint32_t)); nhood_cache.insert(std::make_pair(nhood.first, cnhood)); aligned_free(nhood.second); node_idx++; @@ -197,28 +198,39 @@ template void PQFlashIndex::load_cache_ #ifdef EXEC_ENV_OLS 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, + uint64_t l_search, uint64_t beamwidth, + uint64_t num_nodes_to_cache, uint32_t nthreads, std::vector &node_list) { #else template -void PQFlashIndex::generate_cache_list_from_sample_queries(std::string sample_bin, _u64 l_search, - _u64 beamwidth, _u64 num_nodes_to_cache, +void PQFlashIndex::generate_cache_list_from_sample_queries(std::string sample_bin, uint64_t l_search, + uint64_t beamwidth, uint64_t num_nodes_to_cache, uint32_t nthreads, std::vector &node_list) { #endif + if (num_nodes_to_cache >= this->num_points) + { + // for small num_points and big num_nodes_to_cache, use below way to get the node_list quickly + node_list.resize(this->num_points); + for (uint32_t i = 0; i < this->num_points; ++i) + { + node_list[i] = i; + } + return; + } + this->count_visited_nodes = true; this->node_visit_counter.clear(); this->node_visit_counter.resize(this->num_points); - for (_u32 i = 0; i < node_visit_counter.size(); i++) + for (uint32_t i = 0; i < node_visit_counter.size(); i++) { this->node_visit_counter[i].first = i; this->node_visit_counter[i].second = 0; } - _u64 sample_num, sample_dim, sample_aligned_dim; + uint64_t sample_num, sample_dim, sample_aligned_dim; T *samples; #ifdef EXEC_ENV_OLS @@ -241,19 +253,34 @@ void PQFlashIndex::generate_cache_list_from_sample_queries(std::strin std::vector tmp_result_ids_64(sample_num, 0); std::vector tmp_result_dists(sample_num, 0); + bool filtered_search = false; + std::vector random_query_filters(sample_num); + if (_filter_to_medoid_ids.size() != 0) + { + filtered_search = true; + generate_random_labels(random_query_filters, (uint32_t)sample_num, nthreads); + } + #pragma omp parallel for schedule(dynamic, 1) num_threads(nthreads) - for (_s64 i = 0; i < (int64_t)sample_num; i++) + for (int64_t 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_dists.data() + (i * 1), beamwidth); + auto &label_for_search = random_query_filters[i]; + // run a search on the sample query with a random label (sampled from base label distribution), and it will + // concurrently update the node_visit_counter to track most visited nodes. The last false is to not use the + // "use_reorder_data" option which enables a final reranking if the disk index itself contains only PQ data. + cached_beam_search(samples + (i * sample_aligned_dim), 1, l_search, tmp_result_ids_64.data() + i, + tmp_result_dists.data() + i, beamwidth, filtered_search, label_for_search, false); } std::sort(this->node_visit_counter.begin(), node_visit_counter.end(), - [](std::pair<_u32, _u32> &left, std::pair<_u32, _u32> &right) { return left.second > right.second; }); + [](std::pair &left, std::pair &right) { + return left.second > right.second; + }); node_list.clear(); node_list.shrink_to_fit(); + num_nodes_to_cache = std::min(num_nodes_to_cache, this->node_visit_counter.size()); node_list.reserve(num_nodes_to_cache); - for (_u64 i = 0; i < num_nodes_to_cache; i++) + for (uint64_t i = 0; i < num_nodes_to_cache; i++) { node_list.push_back(this->node_visit_counter[i].first); } @@ -263,7 +290,7 @@ void PQFlashIndex::generate_cache_list_from_sample_queries(std::strin } template -void PQFlashIndex::cache_bfs_levels(_u64 num_nodes_to_cache, std::vector &node_list, +void PQFlashIndex::cache_bfs_levels(uint64_t num_nodes_to_cache, std::vector &node_list, const bool shuffle) { std::random_device rng; @@ -272,7 +299,7 @@ void PQFlashIndex::cache_bfs_levels(_u64 num_nodes_to_cache, std::vec tsl::robin_set node_set; // Do not cache more than 10% of the nodes in the index - _u64 tenp_nodes = (_u64)(std::round(this->num_points * 0.1)); + uint64_t tenp_nodes = (uint64_t)(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 @@ -286,16 +313,31 @@ void PQFlashIndex::cache_bfs_levels(_u64 num_nodes_to_cache, std::vec auto this_thread_data = manager.scratch_space(); IOContext &ctx = this_thread_data->ctx; - std::unique_ptr> cur_level, prev_level; - cur_level = std::make_unique>(); - prev_level = std::make_unique>(); + std::unique_ptr> cur_level, prev_level; + cur_level = std::make_unique>(); + prev_level = std::make_unique>(); - for (_u64 miter = 0; miter < num_medoids; miter++) + for (uint64_t miter = 0; miter < num_medoids && cur_level->size() < num_nodes_to_cache; miter++) { cur_level->insert(medoids[miter]); } - _u64 lvl = 1; + if ((_filter_to_medoid_ids.size() > 0) && (cur_level->size() < num_nodes_to_cache)) + { + for (auto &x : _filter_to_medoid_ids) + { + for (auto &y : x.second) + { + cur_level->insert(y); + if (cur_level->size() == num_nodes_to_cache) + break; + } + if (cur_level->size() == num_nodes_to_cache) + break; + } + } + + uint64_t lvl = 1; uint64_t prev_node_set_size = 0; while ((node_set.size() + cur_level->size() < num_nodes_to_cache) && cur_level->size() != 0) { @@ -304,9 +346,9 @@ void PQFlashIndex::cache_bfs_levels(_u64 num_nodes_to_cache, std::vec // clear cur_level cur_level->clear(); - std::vector nodes_to_expand; + std::vector nodes_to_expand; - for (const unsigned &id : *prev_level) + for (const uint32_t &id : *prev_level) { if (node_set.find(id) != node_set.end()) { @@ -332,7 +374,7 @@ void PQFlashIndex::cache_bfs_levels(_u64 num_nodes_to_cache, std::vec 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> nhoods; + std::vector> nhoods; for (size_t cur_pt = start; cur_pt < end; cur_pt++) { char *buf = nullptr; @@ -349,7 +391,7 @@ void PQFlashIndex::cache_bfs_levels(_u64 num_nodes_to_cache, std::vec reader->read(read_reqs, ctx); // process each nhood buf - for (_u32 i = 0; i < read_reqs.size(); i++) + for (uint32_t i = 0; i < read_reqs.size(); i++) { #if defined(_WINDOWS) && defined(USE_BING_INFRA) // this block is to handle read failures in // production settings @@ -362,11 +404,11 @@ void PQFlashIndex::cache_bfs_levels(_u64 num_nodes_to_cache, std::vec // insert node coord into coord_cache char *node_buf = OFFSET_TO_NODE(nhood.second, nhood.first); - unsigned *node_nhood = OFFSET_TO_NODE_NHOOD(node_buf); - _u64 nnbrs = (_u64)*node_nhood; - unsigned *nbrs = node_nhood + 1; + uint32_t *node_nhood = OFFSET_TO_NODE_NHOOD(node_buf); + uint64_t nnbrs = (uint64_t)*node_nhood; + uint32_t *nbrs = node_nhood + 1; // explore next level - for (_u64 j = 0; j < nnbrs && !finish_flag; j++) + for (uint64_t j = 0; j < nnbrs && !finish_flag; j++) { if (node_set.find(nbrs[j]) == node_set.end()) { @@ -382,7 +424,7 @@ void PQFlashIndex::cache_bfs_levels(_u64 num_nodes_to_cache, std::vec } diskann::cout << ". #nodes: " << node_set.size() - prev_node_set_size - << ", #nodes thus far: " << node_list.size() << std::endl; + << ", #nodes thus far: " << node_set.size() << std::endl; prev_node_set_size = node_set.size(); lvl++; } @@ -441,7 +483,7 @@ template void PQFlashIndex::use_medoids } else { - disk_pq_table.inflate_vector((_u8 *)medoid_coords, (centroid_data + cur_m * aligned_dim)); + disk_pq_table.inflate_vector((uint8_t *)medoid_coords, (centroid_data + cur_m * aligned_dim)); } aligned_free(medoid_buf); @@ -453,7 +495,7 @@ template inline int32_t PQFlashIndex::get_filter_number(const LabelT &filter_label) { int idx = -1; - for (_u32 i = 0; i < _filter_list.size(); i++) + for (uint32_t i = 0; i < _filter_list.size(); i++) { if (_filter_list[i] == filter_label) { @@ -464,6 +506,41 @@ inline int32_t PQFlashIndex::get_filter_number(const LabelT &filter_l return idx; } +template +void PQFlashIndex::generate_random_labels(std::vector &labels, const uint32_t num_labels, + const uint32_t nthreads) +{ + std::random_device rd; + labels.clear(); + labels.resize(num_labels); + + uint64_t num_total_labels = + _pts_to_label_offsets[num_points - 1] + _pts_to_labels[_pts_to_label_offsets[num_points - 1]]; + std::mt19937 gen(rd()); + std::uniform_int_distribution dis(0, num_total_labels); + + tsl::robin_set skip_locs; + for (uint32_t i = 0; i < num_points; i++) + { + skip_locs.insert(_pts_to_label_offsets[i]); + } + +#pragma omp parallel for schedule(dynamic, 1) num_threads(nthreads) + for (int64_t i = 0; i < num_labels; i++) + { + bool found_flag = false; + while (!found_flag) + { + uint64_t rnd_loc = dis(gen); + if (skip_locs.find(rnd_loc) == skip_locs.end()) + { + found_flag = true; + labels[i] = _filter_list[_pts_to_labels[rnd_loc]]; + } + } + } +} + template std::unordered_map PQFlashIndex::load_label_map(const std::string &labels_map_file) { @@ -478,7 +555,7 @@ std::unordered_map PQFlashIndex::load_label_map( getline(iss, token, '\t'); label_str = token; getline(iss, token, '\t'); - token_as_num = std::stoul(token); + token_as_num = (LabelT)std::stoul(token); string_to_int_mp[label_str] = token_as_num; } return string_to_int_mp; @@ -502,7 +579,8 @@ LabelT PQFlashIndex::get_converted_label(const std::string &filter_la } template -void PQFlashIndex::get_label_file_metadata(std::string map_file, _u32 &num_pts, _u32 &num_total_labels) +void PQFlashIndex::get_label_file_metadata(std::string map_file, uint32_t &num_pts, + uint32_t &num_total_labels) { std::ifstream infile(map_file); std::string line, token; @@ -527,12 +605,12 @@ void PQFlashIndex::get_label_file_metadata(std::string map_file, _u32 } template -inline bool PQFlashIndex::point_has_label(_u32 point_id, _u32 label_id) +inline bool PQFlashIndex::point_has_label(uint32_t point_id, uint32_t label_id) { - _u32 start_vec = _pts_to_label_offsets[point_id]; - _u32 num_lbls = _pts_to_labels[start_vec]; + uint32_t start_vec = _pts_to_label_offsets[point_id]; + uint32_t num_lbls = _pts_to_labels[start_vec]; bool ret_val = false; - for (_u32 i = 0; i < num_lbls; i++) + for (uint32_t i = 0; i < num_lbls; i++) { if (_pts_to_labels[start_vec + 1 + i] == label_id) { @@ -553,23 +631,23 @@ void PQFlashIndex::parse_label_file(const std::string &label_file, si } std::string line, token; - _u32 line_cnt = 0; + uint32_t line_cnt = 0; - _u32 num_pts_in_label_file; - _u32 num_total_labels; + uint32_t num_pts_in_label_file; + uint32_t num_total_labels; get_label_file_metadata(label_file, num_pts_in_label_file, num_total_labels); - _pts_to_label_offsets = new _u32[num_pts_in_label_file]; - _pts_to_labels = new _u32[num_pts_in_label_file + num_total_labels]; - _u32 counter = 0; + _pts_to_label_offsets = new uint32_t[num_pts_in_label_file]; + _pts_to_labels = new uint32_t[num_pts_in_label_file + num_total_labels]; + uint32_t counter = 0; while (std::getline(infile, line)) { std::istringstream iss(line); - std::vector<_u32> lbls(0); + std::vector lbls(0); _pts_to_label_offsets[line_cnt] = counter; - _u32 &num_lbls_in_cur_pt = _pts_to_labels[counter]; + uint32_t &num_lbls_in_cur_pt = _pts_to_labels[counter]; num_lbls_in_cur_pt = 0; counter++; getline(iss, token, '\t'); @@ -578,7 +656,7 @@ void PQFlashIndex::parse_label_file(const std::string &label_file, si { token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); - LabelT token_as_num = std::stoul(token); + LabelT token_as_num = (LabelT)std::stoul(token); if (_labels.find(token_as_num) == _labels.end()) { _filter_list.emplace_back(token_as_num); @@ -610,13 +688,12 @@ template void PQFlashIndex::set_univers int32_t temp_filter_num = get_filter_number(label); if (temp_filter_num == -1) { - diskann::cout << "Error, could not find universal label. Exitting." << std::endl; - exit(-1); + diskann::cout << "Error, could not find universal label." << std::endl; } else { _use_universal_label = true; - _universal_filter_num = (_u32)temp_filter_num; + _universal_filter_num = (uint32_t)temp_filter_num; } } @@ -631,12 +708,19 @@ template int PQFlashIndex::load(uint32_ std::string pq_table_bin = std::string(index_prefix) + "_pq_pivots.bin"; std::string pq_compressed_vectors = std::string(index_prefix) + "_pq_compressed.bin"; std::string disk_index_file = std::string(index_prefix) + "_disk.index"; + std::string labels_file = std::string(index_prefix) + "_labels.txt"; + std::string labels_to_medoids = std::string(index_prefix) + "_labels_to_medoids.txt"; + std::string labels_map_file = std::string(index_prefix) + "_labels_map.txt"; + std::string univ_label_file = std::string(index_prefix) + "_universal_label.txt"; + #ifdef EXEC_ENV_OLS return load_from_separate_paths(files, num_threads, disk_index_file.c_str(), pq_table_bin.c_str(), - pq_compressed_vectors.c_str()); + pq_compressed_vectors.c_str(), labels_file.c_str(), labels_to_medoids.c_str(), + labels_map_file.c_str(), univ_label_file.c_str()); #else return load_from_separate_paths(num_threads, disk_index_file.c_str(), pq_table_bin.c_str(), - pq_compressed_vectors.c_str()); + pq_compressed_vectors.c_str(), labels_file.c_str(), labels_to_medoids.c_str(), + labels_map_file.c_str(), univ_label_file.c_str()); #endif } @@ -644,12 +728,16 @@ template int PQFlashIndex::load(uint32_ template int PQFlashIndex::load_from_separate_paths(diskann::MemoryMappedFiles &files, uint32_t num_threads, const char *index_filepath, const char *pivots_filepath, - const char *compressed_filepath) + const char *compressed_filepath, + const char* labels_filepath, const char* labels_to_medoids_filepath, + const char* labels_map_filepath, const char* unv_label_filepath) { #else template int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, const char *index_filepath, - const char *pivots_filepath, const char *compressed_filepath) + const char *pivots_filepath, const char *compressed_filepath, + const char* labels_filepath, const char* labels_to_medoids_filepath, + const char* labels_map_filepath, const char* unv_label_filepath) { #endif std::string pq_table_bin = pivots_filepath; @@ -658,10 +746,10 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons std::string medoids_file = std::string(disk_index_file) + "_medoids.bin"; std::string centroids_file = std::string(disk_index_file) + "_centroids.bin"; - std::string labels_file = std ::string(disk_index_file) + "_labels.txt"; - std::string labels_to_medoids = std ::string(disk_index_file) + "_labels_to_medoids.txt"; + std::string labels_file = (labels_filepath == nullptr ? "" : labels_filepath); + std::string labels_to_medoids = (labels_to_medoids_filepath == nullptr ? "" : labels_to_medoids_filepath); std::string dummy_map_file = std ::string(disk_index_file) + "_dummy_map.txt"; - std::string labels_map_file = std ::string(disk_index_file) + "_labels_map.txt"; + std::string labels_map_file = (labels_map_filepath == nullptr ? "" : labels_map_filepath); size_t num_pts_in_label_file = 0; size_t pq_file_dim, pq_file_num_centroids; @@ -689,9 +777,9 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons size_t npts_u64, nchunks_u64; #ifdef EXEC_ENV_OLS - diskann::load_bin<_u8>(files, pq_compressed_vectors, this->data, npts_u64, nchunks_u64); + diskann::load_bin(files, pq_compressed_vectors, this->data, npts_u64, nchunks_u64); #else - diskann::load_bin<_u8>(pq_compressed_vectors, this->data, npts_u64, nchunks_u64); + diskann::load_bin(pq_compressed_vectors, this->data, npts_u64, nchunks_u64); #endif this->num_points = npts_u64; @@ -707,24 +795,24 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons assert(medoid_stream.is_open()); std::string line, token; - _filter_to_medoid_id.clear(); + _filter_to_medoid_ids.clear(); try { while (std::getline(medoid_stream, line)) { std::istringstream iss(line); - _u32 cnt = 0; - _u32 medoid; + uint32_t cnt = 0; + std::vector medoids; LabelT label; while (std::getline(iss, token, ',')) { if (cnt == 0) - label = std::stoul(token); + label = (LabelT)std::stoul(token); else - medoid = (_u32)stoul(token); + medoids.push_back((uint32_t)stoul(token)); cnt++; } - _filter_to_medoid_id[label] = medoid; + _filter_to_medoid_ids[label].swap(medoids); } } catch (std::system_error &e) @@ -732,7 +820,8 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons throw FileException(labels_to_medoids, e, __FUNCSIG__, __FILE__, __LINE__); } } - std::string univ_label_file = std ::string(disk_index_file) + "_universal_label.txt"; + + std::string univ_label_file = (unv_label_filepath == nullptr ? "" : unv_label_filepath); if (file_exists(univ_label_file)) { std::ifstream universal_label_reader(univ_label_file); @@ -740,7 +829,7 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons std::string univ_label; universal_label_reader >> univ_label; universal_label_reader.close(); - LabelT label_as_num = std::stoul(univ_label); + LabelT label_as_num = (LabelT)std::stoul(univ_label); set_universal_label(label_as_num); } if (file_exists(dummy_map_file)) @@ -752,15 +841,15 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons while (std::getline(dummy_map_stream, line)) { std::istringstream iss(line); - _u32 cnt = 0; - _u32 dummy_id; - _u32 real_id; + uint32_t cnt = 0; + uint32_t dummy_id; + uint32_t real_id; while (std::getline(iss, token, ',')) { if (cnt == 0) - dummy_id = (_u32)stoul(token); + dummy_id = (uint32_t)stoul(token); else - real_id = (_u32)stoul(token); + real_id = (uint32_t)stoul(token); cnt++; } _dummy_pts.insert(dummy_id); @@ -768,7 +857,7 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons _dummy_to_real_map[dummy_id] = real_id; if (_real_to_dummy_map.find(real_id) == _real_to_dummy_map.end()) - _real_to_dummy_map[real_id] = std::vector<_u32>(); + _real_to_dummy_map[real_id] = std::vector(); _real_to_dummy_map[real_id].emplace_back(dummy_id); } @@ -809,7 +898,8 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons disk_pq_table.load_pq_centroid_bin(disk_pq_pivots_path.c_str(), 0); #endif disk_pq_n_chunks = disk_pq_table.get_num_chunks(); - disk_bytes_per_point = disk_pq_n_chunks * sizeof(_u8); // revising disk_bytes_per_point since DISK PQ is used. + disk_bytes_per_point = + disk_pq_n_chunks * sizeof(uint8_t); // revising disk_bytes_per_point since DISK PQ is used. diskann::cout << "Disk index uses PQ data compressed down to " << disk_pq_n_chunks << " bytes per point." << std::endl; } @@ -832,13 +922,13 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons std::ifstream index_metadata(disk_index_file, std::ios::binary); #endif - _u32 nr, nc; // metadata itself is stored as bin format (nr is number of - // metadata, nc should be 1) + uint32_t nr, nc; // metadata itself is stored as bin format (nr is number of + // metadata, nc should be 1) READ_U32(index_metadata, nr); READ_U32(index_metadata, nc); - _u64 disk_nnodes; - _u64 disk_ndims; // can be disk PQ dim if disk_PQ is set to true + uint64_t disk_nnodes; + uint64_t disk_ndims; // can be disk PQ dim if disk_PQ is set to true READ_U64(index_metadata, disk_nnodes); READ_U64(index_metadata, disk_ndims); @@ -854,7 +944,7 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons 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 - disk_bytes_per_point) / sizeof(unsigned)) - 1; + max_degree = ((max_node_len - disk_bytes_per_point) / sizeof(uint32_t)) - 1; if (max_degree > MAX_GRAPH_DEGREE) { @@ -867,7 +957,7 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons // setting up concept of frozen points in disk index for streaming-DiskANN READ_U64(index_metadata, this->num_frozen_points); - _u64 file_frozen_id; + uint64_t file_frozen_id; READ_U64(index_metadata, file_frozen_id); if (this->num_frozen_points == 1) this->frozen_location = file_frozen_id; @@ -882,8 +972,9 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons { if (this->use_disk_index_pq == false) { - throw ANNException("Reordering is designed for used with disk PQ compression option", -1, __FUNCSIG__, - __FILE__, __LINE__); + throw ANNException("Reordering is designed for used with disk PQ " + "compression option", + -1, __FUNCSIG__, __FILE__, __LINE__); } READ_U64(index_metadata, this->reorder_data_start_sector); READ_U64(index_metadata, this->ndims_reorder_vecs); @@ -954,7 +1045,8 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons if (aligned_tmp_dim != aligned_dim || num_centroids != num_medoids) { std::stringstream stream; - stream << "Error loading centroids data file. Expected bin format of " + 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."; @@ -967,7 +1059,7 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons { num_medoids = 1; medoids = new uint32_t[1]; - medoids[0] = (_u32)(medoid_id_on_file); + medoids[0] = (uint32_t)(medoid_id_on_file); use_medoids_data_as_centroids(); } @@ -975,7 +1067,7 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons if (file_exists(norm_file) && metric == diskann::Metric::INNER_PRODUCT) { - _u64 dumr, dumc; + uint64_t dumr, dumc; float *norm_val; diskann::load_bin(norm_file, norm_val, dumr, dumc); this->max_base_norm = norm_val[0]; @@ -1022,39 +1114,41 @@ bool getNextCompletedRequest(const IOContext &ctx, size_t size, int &completedIn #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, +void PQFlashIndex::cached_beam_search(const T *query1, const uint64_t k_search, const uint64_t l_search, + uint64_t *indices, float *distances, const uint64_t beam_width, const bool use_reorder_data, QueryStats *stats) { - cached_beam_search(query1, k_search, l_search, indices, distances, beam_width, std::numeric_limits<_u32>::max(), + cached_beam_search(query1, k_search, l_search, indices, distances, beam_width, std::numeric_limits::max(), use_reorder_data, stats); } 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, +void PQFlashIndex::cached_beam_search(const T *query1, const uint64_t k_search, const uint64_t l_search, + uint64_t *indices, float *distances, const uint64_t beam_width, const bool use_filter, const LabelT &filter_label, const bool use_reorder_data, QueryStats *stats) { cached_beam_search(query1, k_search, l_search, indices, distances, beam_width, use_filter, filter_label, - std::numeric_limits<_u32>::max(), use_reorder_data, stats); + std::numeric_limits::max(), use_reorder_data, stats); } 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, - const _u32 io_limit, const bool use_reorder_data, QueryStats *stats) +void PQFlashIndex::cached_beam_search(const T *query1, const uint64_t k_search, const uint64_t l_search, + uint64_t *indices, float *distances, const uint64_t beam_width, + const uint32_t io_limit, const bool use_reorder_data, + QueryStats *stats) { LabelT dummy_filter = 0; - cached_beam_search(query1, k_search, l_search, indices, distances, beam_width, false, dummy_filter, - std::numeric_limits<_u32>::max(), use_reorder_data, stats); + cached_beam_search(query1, k_search, l_search, indices, distances, beam_width, false, dummy_filter, io_limit, + use_reorder_data, stats); } 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, - const bool use_filter, const LabelT &filter_label, const _u32 io_limit, - const bool use_reorder_data, QueryStats *stats) +void PQFlashIndex::cached_beam_search(const T *query1, const uint64_t k_search, const uint64_t l_search, + uint64_t *indices, float *distances, const uint64_t beam_width, + const bool use_filter, const LabelT &filter_label, + const uint32_t io_limit, const bool use_reorder_data, + QueryStats *stats) { int32_t filter_num = 0; if (use_filter) @@ -1107,7 +1201,7 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s for (size_t i = 0; i < this->data_dim - 1; i++) { - aligned_query_T[i] /= query_norm; + aligned_query_T[i] = (T)(aligned_query_T[i] / query_norm); } pq_query_scratch->set(this->data_dim, aligned_query_T); } @@ -1122,12 +1216,11 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s // pointers to buffers for data T *data_buf = query_scratch->coord_scratch; - _u64 &data_buf_idx = query_scratch->coord_idx; _mm_prefetch((char *)data_buf, _MM_HINT_T1); // sector scratch char *sector_scratch = query_scratch->sector_scratch; - _u64 §or_scratch_idx = query_scratch->sector_idx; + uint64_t §or_scratch_idx = query_scratch->sector_idx; // query <-> PQ chunk centers distances pq_table.preprocess_query(query_rotated); // center the query and rotate if @@ -1137,28 +1230,29 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s // query <-> neighbor list float *dist_scratch = pq_query_scratch->aligned_dist_scratch; - _u8 *pq_coord_scratch = pq_query_scratch->aligned_pq_coord_scratch; + uint8_t *pq_coord_scratch = pq_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 uint32_t *ids, const uint64_t n_ids, + float *dists_out) { diskann::aggregate_coords(ids, n_ids, this->data, this->n_chunks, pq_coord_scratch); diskann::pq_dist_lookup(pq_coord_scratch, n_ids, this->n_chunks, pq_dists, dists_out); }; Timer query_timer, io_timer, cpu_timer; - tsl::robin_set<_u64> &visited = query_scratch->visited; + tsl::robin_set &visited = query_scratch->visited; NeighborPriorityQueue &retset = query_scratch->retset; retset.reserve(l_search); std::vector &full_retset = query_scratch->full_retset; - _u32 best_medoid = 0; + uint32_t best_medoid = 0; float best_dist = (std::numeric_limits::max)(); if (!use_filter) { - for (_u64 cur_m = 0; cur_m < num_medoids; cur_m++) + for (uint64_t cur_m = 0; cur_m < num_medoids; cur_m++) { float cur_expanded_dist = - dist_cmp_float->compare(query_float, centroid_data + aligned_dim * cur_m, (unsigned)aligned_dim); + dist_cmp_float->compare(query_float, centroid_data + aligned_dim * cur_m, (uint32_t)aligned_dim); if (cur_expanded_dist < best_dist) { best_medoid = medoids[cur_m]; @@ -1166,31 +1260,46 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s } } } - else if (_filter_to_medoid_id.find(filter_label) != _filter_to_medoid_id.end()) - { - best_medoid = _filter_to_medoid_id[filter_label]; - } else { - throw ANNException("Cannot find medoid for specified filter.", -1, __FUNCSIG__, __FILE__, __LINE__); + if (_filter_to_medoid_ids.find(filter_label) != _filter_to_medoid_ids.end()) + { + const auto &medoid_ids = _filter_to_medoid_ids[filter_label]; + for (uint64_t cur_m = 0; cur_m < medoid_ids.size(); cur_m++) + { + // for filtered index, we dont store global centroid data as for unfiltered index, so we use PQ distance + // as approximation to decide closest medoid matching the query filter. + compute_dists(&medoid_ids[cur_m], 1, dist_scratch); + float cur_expanded_dist = dist_scratch[0]; + if (cur_expanded_dist < best_dist) + { + best_medoid = medoid_ids[cur_m]; + best_dist = cur_expanded_dist; + } + } + } + else + { + throw ANNException("Cannot find medoid for specified filter.", -1, __FUNCSIG__, __FILE__, __LINE__); + } } compute_dists(&best_medoid, 1, dist_scratch); retset.insert(Neighbor(best_medoid, dist_scratch[0])); visited.insert(best_medoid); - unsigned cmps = 0; - unsigned hops = 0; - unsigned num_ios = 0; + uint32_t cmps = 0; + uint32_t hops = 0; + uint32_t num_ios = 0; // cleared every iteration - std::vector frontier; + std::vector frontier; frontier.reserve(2 * beam_width); - std::vector> frontier_nhoods; + std::vector> frontier_nhoods; frontier_nhoods.reserve(2 * beam_width); std::vector frontier_read_reqs; frontier_read_reqs.reserve(2 * beam_width); - std::vector>> cached_nhoods; + std::vector>> cached_nhoods; cached_nhoods.reserve(2 * beam_width); while (retset.has_unexpanded_node() && num_ios < io_limit) @@ -1202,7 +1311,7 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s cached_nhoods.clear(); sector_scratch_idx = 0; // find new beam - _u32 num_seen = 0; + uint32_t num_seen = 0; while (retset.has_unexpanded_node() && frontier.size() < beam_width && num_seen < beam_width) { auto nbr = retset.closest_unexpanded(); @@ -1222,7 +1331,7 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s } if (this->count_visited_nodes) { - reinterpret_cast &>(this->node_visit_counter[nbr.id].second).fetch_add(1); + reinterpret_cast &>(this->node_visit_counter[nbr.id].second).fetch_add(1); } } @@ -1231,10 +1340,10 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s { if (stats != nullptr) stats->n_hops++; - for (_u64 i = 0; i < frontier.size(); i++) + for (uint64_t i = 0; i < frontier.size(); i++) { auto id = frontier[i]; - std::pair<_u32, char *> fnhood; + std::pair fnhood; fnhood.first = id; fnhood.second = sector_scratch + sector_scratch_idx * SECTOR_LEN; sector_scratch_idx++; @@ -1249,13 +1358,14 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s } io_timer.reset(); #ifdef USE_BING_INFRA - reader->read(frontier_read_reqs, ctx, true); // async reader windows. + reader->read(frontier_read_reqs, ctx, + true); // async reader windows. #else reader->read(frontier_read_reqs, ctx); // synchronous IO linux #endif if (stats != nullptr) { - stats->io_us += (double)io_timer.elapsed(); + stats->io_us += (float)io_timer.elapsed(); } } @@ -1267,40 +1377,41 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s float cur_expanded_dist; if (!use_disk_index_pq) { - cur_expanded_dist = dist_cmp->compare(aligned_query_T, node_fp_coords_copy, (unsigned)aligned_dim); + cur_expanded_dist = dist_cmp->compare(aligned_query_T, node_fp_coords_copy, (uint32_t)aligned_dim); } else { if (metric == diskann::Metric::INNER_PRODUCT) - cur_expanded_dist = disk_pq_table.inner_product(query_float, (_u8 *)node_fp_coords_copy); + cur_expanded_dist = disk_pq_table.inner_product(query_float, (uint8_t *)node_fp_coords_copy); else cur_expanded_dist = disk_pq_table.l2_distance( // disk_pq does not support OPQ yet - query_float, (_u8 *)node_fp_coords_copy); + query_float, (uint8_t *)node_fp_coords_copy); } - full_retset.push_back(Neighbor((unsigned)cached_nhood.first, cur_expanded_dist)); + full_retset.push_back(Neighbor((uint32_t)cached_nhood.first, cur_expanded_dist)); - _u64 nnbrs = cached_nhood.second.first; - unsigned *node_nbrs = cached_nhood.second.second; + uint64_t nnbrs = cached_nhood.second.first; + uint32_t *node_nbrs = cached_nhood.second.second; // compute node_nbrs <-> query dists in PQ space cpu_timer.reset(); compute_dists(node_nbrs, nnbrs, dist_scratch); if (stats != nullptr) { - stats->n_cmps += (double)nnbrs; - stats->cpu_us += (double)cpu_timer.elapsed(); + stats->n_cmps += (uint32_t)nnbrs; + stats->cpu_us += (float)cpu_timer.elapsed(); } // process prefetched nhood - for (_u64 m = 0; m < nnbrs; ++m) + for (uint64_t m = 0; m < nnbrs; ++m) { - unsigned id = node_nbrs[m]; + uint32_t id = node_nbrs[m]; if (visited.insert(id).second) { if (!use_filter && _dummy_pts.find(id) != _dummy_pts.end()) continue; - if (use_filter && !point_has_label(id, filter_num) && !point_has_label(id, _universal_filter_num)) + if (use_filter && !point_has_label(id, filter_num) + && (!_use_universal_label || !point_has_label(id, _universal_filter_num))) continue; cmps++; float dist = dist_scratch[m]; @@ -1313,8 +1424,8 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s // process each frontier nhood - compute distances to unvisited nodes int completedIndex = -1; long requestCount = static_cast(frontier_read_reqs.size()); - // If we issued read requests and if a read is complete or there are reads - // in wait state, then enter the while loop. + // If we issued read requests and if a read is complete or there are + // reads in wait state, then enter the while loop. while (requestCount > 0 && getNextCompletedRequest(ctx, requestCount, completedIndex)) { assert(completedIndex >= 0); @@ -1325,50 +1436,45 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s { #endif char *node_disk_buf = OFFSET_TO_NODE(frontier_nhood.second, frontier_nhood.first); - unsigned *node_buf = OFFSET_TO_NODE_NHOOD(node_disk_buf); - _u64 nnbrs = (_u64)(*node_buf); + uint32_t *node_buf = OFFSET_TO_NODE_NHOOD(node_disk_buf); + uint64_t nnbrs = (uint64_t)(*node_buf); T *node_fp_coords = OFFSET_TO_NODE_COORDS(node_disk_buf); - // assert(data_buf_idx < MAX_N_CMPS); - if (data_buf_idx == MAX_N_CMPS) - data_buf_idx = 0; - - T *node_fp_coords_copy = data_buf + (data_buf_idx * aligned_dim); - data_buf_idx++; - memcpy(node_fp_coords_copy, node_fp_coords, disk_bytes_per_point); + memcpy(data_buf, node_fp_coords, disk_bytes_per_point); float cur_expanded_dist; if (!use_disk_index_pq) { - cur_expanded_dist = dist_cmp->compare(aligned_query_T, node_fp_coords_copy, (unsigned)aligned_dim); + cur_expanded_dist = dist_cmp->compare(aligned_query_T, data_buf, (uint32_t)aligned_dim); } else { if (metric == diskann::Metric::INNER_PRODUCT) - cur_expanded_dist = disk_pq_table.inner_product(query_float, (_u8 *)node_fp_coords_copy); + cur_expanded_dist = disk_pq_table.inner_product(query_float, (uint8_t *)data_buf); else - cur_expanded_dist = disk_pq_table.l2_distance(query_float, (_u8 *)node_fp_coords_copy); + cur_expanded_dist = disk_pq_table.l2_distance(query_float, (uint8_t *)data_buf); } full_retset.push_back(Neighbor(frontier_nhood.first, cur_expanded_dist)); - unsigned *node_nbrs = (node_buf + 1); + uint32_t *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 += (double)nnbrs; - stats->cpu_us += (double)cpu_timer.elapsed(); + stats->n_cmps += (uint32_t)nnbrs; + stats->cpu_us += (float)cpu_timer.elapsed(); } cpu_timer.reset(); // process prefetch-ed nhood - for (_u64 m = 0; m < nnbrs; ++m) + for (uint64_t m = 0; m < nnbrs; ++m) { - unsigned id = node_nbrs[m]; + uint32_t id = node_nbrs[m]; if (visited.insert(id).second) { if (!use_filter && _dummy_pts.find(id) != _dummy_pts.end()) continue; - if (use_filter && !point_has_label(id, filter_num) && !point_has_label(id, _universal_filter_num)) + if (use_filter && !point_has_label(id, filter_num) + && (!_use_universal_label || !point_has_label(id, _universal_filter_num))) continue; cmps++; float dist = dist_scratch[m]; @@ -1384,7 +1490,7 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s if (stats != nullptr) { - stats->cpu_us += (double)cpu_timer.elapsed(); + stats->cpu_us += (float)cpu_timer.elapsed(); } } @@ -1398,7 +1504,8 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s { if (!(this->reorder_data_exists)) { - throw ANNException("Requested use of reordering data which does not exist in index " + throw ANNException("Requested use of reordering data which does " + "not exist in index " "file", -1, __FUNCSIG__, __FILE__, __LINE__); } @@ -1435,20 +1542,20 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s { auto id = full_retset[i].id; auto location = (sector_scratch + i * SECTOR_LEN) + VECTOR_SECTOR_OFFSET(id); - full_retset[i].distance = dist_cmp->compare(aligned_query_T, (T *)location, this->data_dim); + full_retset[i].distance = dist_cmp->compare(aligned_query_T, (T *)location, (uint32_t)this->data_dim); } std::sort(full_retset.begin(), full_retset.end()); } // copy k_search values - for (_u64 i = 0; i < k_search; i++) + for (uint64_t i = 0; i < k_search; i++) { indices[i] = full_retset[i].id; - - if (_dummy_pts.find(indices[i]) != _dummy_pts.end()) + auto key = (uint32_t)indices[i]; + if (_dummy_pts.find(key) != _dummy_pts.end()) { - indices[i] = _dummy_to_real_map[indices[i]]; + indices[i] = _dummy_to_real_map[key]; } if (distances != nullptr) @@ -1458,8 +1565,8 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s { // flip the sign to convert min to max distances[i] = (-distances[i]); - // rescale to revert back to original norms (cancelling the effect of - // base and query pre-processing) + // rescale to revert back to original norms (cancelling the + // effect of base and query pre-processing) if (max_base_norm != 0) distances[i] *= (max_base_norm * query_norm); } @@ -1472,7 +1579,7 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s if (stats != nullptr) { - stats->total_us = (double)query_timer.elapsed(); + stats->total_us = (float)query_timer.elapsed(); } } @@ -1480,25 +1587,26 @@ void PQFlashIndex::cached_beam_search(const T *query1, const _u64 k_s // indices and distances need to be pre-allocated of size l_search and the // return value is the number of matching hits. template -_u32 PQFlashIndex::range_search(const T *query1, const double range, const _u64 min_l_search, - const _u64 max_l_search, std::vector<_u64> &indices, - std::vector &distances, const _u64 min_beam_width, QueryStats *stats) +uint32_t PQFlashIndex::range_search(const T *query1, const double range, const uint64_t min_l_search, + const uint64_t max_l_search, std::vector &indices, + std::vector &distances, const uint64_t min_beam_width, + QueryStats *stats) { - _u32 res_count = 0; + uint32_t res_count = 0; bool stop_flag = false; - _u32 l_search = min_l_search; // starting size of the candidate list + uint32_t l_search = (uint32_t)min_l_search; // starting size of the candidate list while (!stop_flag) { indices.resize(l_search); distances.resize(l_search); - _u64 cur_bw = min_beam_width > (l_search / 5) ? min_beam_width : l_search / 5; + uint64_t cur_bw = min_beam_width > (l_search / 5) ? min_beam_width : l_search / 5; cur_bw = (cur_bw > 100) ? 100 : cur_bw; for (auto &x : distances) x = std::numeric_limits::max(); this->cached_beam_search(query1, l_search, l_search, indices.data(), distances.data(), cur_bw, false, stats); - for (_u32 i = 0; i < l_search; i++) + for (uint32_t i = 0; i < l_search; i++) { if (distances[i] > (float)range) { @@ -1508,7 +1616,7 @@ _u32 PQFlashIndex::range_search(const T *query1, const double range, else if (i == l_search - 1) res_count = l_search; } - if (res_count < (_u32)(l_search / 2.0)) + if (res_count < (uint32_t)(l_search / 2.0)) stop_flag = true; l_search = l_search * 2; if (l_search > max_l_search) @@ -1519,7 +1627,7 @@ _u32 PQFlashIndex::range_search(const T *query1, const double range, return res_count; } -template _u64 PQFlashIndex::get_data_dim() +template uint64_t PQFlashIndex::get_data_dim() { return data_dim; } @@ -1548,11 +1656,11 @@ template char *PQFlashIndex::getHeaderB #endif // instantiations -template class PQFlashIndex<_u8>; -template class PQFlashIndex<_s8>; +template class PQFlashIndex; +template class PQFlashIndex; template class PQFlashIndex; -template class PQFlashIndex<_u8, uint16_t>; -template class PQFlashIndex<_s8, uint16_t>; +template class PQFlashIndex; +template class PQFlashIndex; template class PQFlashIndex; } // namespace diskann diff --git a/src/restapi/search_wrapper.cpp b/src/restapi/search_wrapper.cpp index 595882acb..dc9f5734e 100644 --- a/src/restapi/search_wrapper.cpp +++ b/src/restapi/search_wrapper.cpp @@ -176,7 +176,7 @@ template SearchResult PQFlashSearch::search(const T *query, const unsigned int dimensions, const unsigned int K, const unsigned int Ls) { - _u64 *indices_u64 = new _u64[K]; + uint64_t *indices_u64 = new uint64_t[K]; unsigned *indices = new unsigned[K]; float *distances = new float[K]; diff --git a/src/scratch.cpp b/src/scratch.cpp index 9f369c61f..745daa6a7 100644 --- a/src/scratch.cpp +++ b/src/scratch.cpp @@ -13,7 +13,7 @@ namespace diskann // template InMemQueryScratch::InMemQueryScratch(uint32_t search_l, uint32_t indexing_l, uint32_t r, uint32_t maxc, size_t dim, - bool init_pq_scratch, size_t bitmask_size) + size_t aligned_dim, size_t alignment_factor, bool init_pq_scratch, size_t bitmask_size) : _L(0), _R(r), _maxc(maxc) { if (search_l == 0 || indexing_l == 0 || r == 0 || dim == 0) @@ -24,8 +24,7 @@ InMemQueryScratch::InMemQueryScratch(uint32_t search_l, uint32_t indexing_l, throw diskann::ANNException(ss.str(), -1); } - auto aligned_dim = ROUND_UP(dim, 8); - alloc_aligned(((void **)&_aligned_query), aligned_dim * sizeof(T), 8 * sizeof(T)); + alloc_aligned(((void **)&_aligned_query), aligned_dim * sizeof(T), alignment_factor * sizeof(T)); memset(_aligned_query, 0, aligned_dim * sizeof(T)); if (init_pq_scratch) @@ -35,8 +34,8 @@ InMemQueryScratch::InMemQueryScratch(uint32_t search_l, uint32_t indexing_l, _occlude_factor.reserve(maxc); _inserted_into_pool_bs = new boost::dynamic_bitset<>(); - _id_scratch.reserve(std::ceil(1.5 * GRAPH_SLACK_FACTOR * _R)); - _dist_scratch.reserve(std::ceil(1.5 * GRAPH_SLACK_FACTOR * _R)); + _id_scratch.reserve((size_t)std::ceil(1.5 * GRAPH_SLACK_FACTOR * _R)); + _dist_scratch.reserve((size_t)std::ceil(1.5 * GRAPH_SLACK_FACTOR * _R)); resize_for_new_L(std::max(search_l, indexing_l)); @@ -92,7 +91,6 @@ template InMemQueryScratch::~InMemQueryScratch() // template void SSDQueryScratch::reset() { - coord_idx = 0; sector_idx = 0; visited.clear(); retset.clear(); @@ -101,15 +99,15 @@ template void SSDQueryScratch::reset() template SSDQueryScratch::SSDQueryScratch(size_t aligned_dim, size_t visited_reserve) { - _u64 coord_alloc_size = ROUND_UP(MAX_N_CMPS * aligned_dim, 256); + size_t coord_alloc_size = ROUND_UP(sizeof(T) * aligned_dim, 256); diskann::alloc_aligned((void **)&coord_scratch, coord_alloc_size, 256); - diskann::alloc_aligned((void **)§or_scratch, (_u64)MAX_N_SECTOR_READS * (_u64)SECTOR_LEN, SECTOR_LEN); + diskann::alloc_aligned((void **)§or_scratch, (size_t)MAX_N_SECTOR_READS * (size_t)SECTOR_LEN, SECTOR_LEN); diskann::alloc_aligned((void **)&aligned_query_T, aligned_dim * sizeof(T), 8 * sizeof(T)); _pq_scratch = new PQScratch(MAX_GRAPH_DEGREE, aligned_dim); - memset(coord_scratch, 0, MAX_N_CMPS * aligned_dim); + memset(coord_scratch, 0, coord_alloc_size); memset(aligned_query_T, 0, aligned_dim * sizeof(T)); visited.reserve(visited_reserve); @@ -120,6 +118,7 @@ template SSDQueryScratch::~SSDQueryScratch() { diskann::aligned_free((void *)coord_scratch); diskann::aligned_free((void *)sector_scratch); + diskann::aligned_free((void *)aligned_query_T); delete[] _pq_scratch; } @@ -138,11 +137,11 @@ template DISKANN_DLLEXPORT class InMemQueryScratch; template DISKANN_DLLEXPORT class InMemQueryScratch; template DISKANN_DLLEXPORT class InMemQueryScratch; -template DISKANN_DLLEXPORT class SSDQueryScratch<_u8>; -template DISKANN_DLLEXPORT class SSDQueryScratch<_s8>; +template DISKANN_DLLEXPORT class SSDQueryScratch; +template DISKANN_DLLEXPORT class SSDQueryScratch; template DISKANN_DLLEXPORT class SSDQueryScratch; -template DISKANN_DLLEXPORT class SSDThreadData<_u8>; -template DISKANN_DLLEXPORT class SSDThreadData<_s8>; +template DISKANN_DLLEXPORT class SSDThreadData; +template DISKANN_DLLEXPORT class SSDThreadData; template DISKANN_DLLEXPORT class SSDThreadData; -} // namespace diskann \ No newline at end of file +} // namespace diskann diff --git a/src/utils.cpp b/src/utils.cpp index ec25dead3..b675e656d 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -73,20 +73,20 @@ bool AvxSupportedCPU = false; namespace diskann { -void block_convert(std::ofstream &writr, std::ifstream &readr, float *read_buf, _u64 npts, _u64 ndims) +void block_convert(std::ofstream &writr, std::ifstream &readr, float *read_buf, size_t npts, size_t ndims) { readr.read((char *)read_buf, npts * ndims * sizeof(float)); - _u32 ndims_u32 = (_u32)ndims; + uint32_t ndims_u32 = (uint32_t)ndims; #pragma omp parallel for - for (_s64 i = 0; i < (_s64)npts; i++) + for (int64_t i = 0; i < (int64_t)npts; i++) { float norm_pt = std::numeric_limits::epsilon(); - for (_u32 dim = 0; dim < ndims_u32; dim++) + for (uint32_t 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++) + for (uint32_t dim = 0; dim < ndims_u32; dim++) { *(read_buf + i * ndims + dim) = *(read_buf + i * ndims + dim) / norm_pt; } @@ -100,24 +100,25 @@ void normalize_data_file(const std::string &inFileName, const std::string &outFi 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)); + readr.read((char *)&npts_s32, sizeof(int32_t)); + readr.read((char *)&ndims_s32, sizeof(int32_t)); - writr.write((char *)&npts_s32, sizeof(_s32)); - writr.write((char *)&ndims_s32, sizeof(_s32)); + writr.write((char *)&npts_s32, sizeof(int32_t)); + writr.write((char *)&ndims_s32, sizeof(int32_t)); - _u64 npts = (_u64)npts_s32, ndims = (_u64)ndims_s32; + size_t npts = (size_t)npts_s32; + size_t ndims = (size_t)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; + size_t blk_size = 131072; + size_t 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++) + for (size_t i = 0; i < nblks; i++) { - _u64 cblk_size = std::min(npts - i * blk_size, blk_size); + size_t cblk_size = std::min(npts - i * blk_size, blk_size); block_convert(writr, readr, read_buf, cblk_size, ndims); } delete[] read_buf; @@ -125,18 +126,18 @@ void normalize_data_file(const std::string &inFileName, const std::string &outFi diskann::cout << "Wrote normalized points to file: " << outFileName << std::endl; } -double calculate_recall(unsigned num_queries, unsigned *gold_std, float *gs_dist, unsigned dim_gs, - unsigned *our_results, unsigned dim_or, unsigned recall_at) +double calculate_recall(uint32_t num_queries, uint32_t *gold_std, float *gs_dist, uint32_t dim_gs, + uint32_t *our_results, uint32_t dim_or, uint32_t recall_at) { double total_recall = 0; - std::set gt, res; + std::set gt, res; 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; + uint32_t *gt_vec = gold_std + dim_gs * i; + uint32_t *res_vec = our_results + dim_or * i; size_t tie_breaker = recall_at; if (gs_dist != nullptr) { @@ -148,9 +149,9 @@ double calculate_recall(unsigned num_queries, unsigned *gold_std, float *gs_dist gt.insert(gt_vec, gt_vec + tie_breaker); res.insert(res_vec, - res_vec + recall_at); // change to recall_at for recall k@k or - // dim_or for k@dim_or - unsigned cur_recall = 0; + res_vec + recall_at); // change to recall_at for recall k@k + // or dim_or for k@dim_or + uint32_t cur_recall = 0; for (auto &v : gt) { if (res.find(v) != res.end()) @@ -163,22 +164,22 @@ double calculate_recall(unsigned num_queries, unsigned *gold_std, float *gs_dist 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 calculate_recall(uint32_t num_queries, uint32_t *gold_std, float *gs_dist, uint32_t dim_gs, + uint32_t *our_results, uint32_t dim_or, uint32_t recall_at, + const tsl::robin_set &active_tags) { double total_recall = 0; - std::set gt, res; + 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; + uint32_t *gt_vec = gold_std + dim_gs * i; + uint32_t *res_vec = our_results + dim_or * i; size_t tie_breaker = recall_at; - unsigned active_points_count = 0; - unsigned cur_counter = 0; + uint32_t active_points_count = 0; + uint32_t cur_counter = 0; while (active_points_count < recall_at && cur_counter < dim_gs) { if (active_tags.find(*(gt_vec + cur_counter)) != active_tags.end()) @@ -209,7 +210,7 @@ double calculate_recall(unsigned num_queries, unsigned *gold_std, float *gs_dist gt.insert(gt_vec, gt_vec + tie_breaker); res.insert(res_vec, res_vec + recall_at); - unsigned cur_recall = 0; + uint32_t cur_recall = 0; for (auto &v : res) { if (gt.find(v) != gt.end()) @@ -222,11 +223,11 @@ double calculate_recall(unsigned num_queries, unsigned *gold_std, float *gs_dist return ((double)(total_recall / (num_queries))) * ((double)(100.0 / recall_at)); } -double calculate_range_search_recall(unsigned num_queries, std::vector> &groundtruth, - std::vector> &our_results) +double calculate_range_search_recall(uint32_t num_queries, std::vector> &groundtruth, + std::vector> &our_results) { double total_recall = 0; - std::set gt, res; + std::set gt, res; for (size_t i = 0; i < num_queries; i++) { @@ -235,7 +236,7 @@ double calculate_range_search_recall(unsigned num_queries, std::vector #include "utils.h" +#include #define SECTOR_LEN 4096 void WindowsAlignedFileReader::open(const std::string &fname) { - #ifdef UNICODE m_filename = std::wstring(fname.begin(), fname.end()); #else @@ -44,15 +44,24 @@ void WindowsAlignedFileReader::register_thread() FILE_ATTRIBUTE_READONLY | FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED | FILE_FLAG_RANDOM_ACCESS, NULL); if (ctx.fhandle == INVALID_HANDLE_VALUE) { - diskann::cout << "Error opening " << std::string(m_filename.begin(), m_filename.end()) - << " -- error=" << GetLastError() << std::endl; + const size_t c_max_filepath_len = 256; + size_t actual_len = 0; + char filePath[c_max_filepath_len]; + if (wcstombs_s(&actual_len, filePath, c_max_filepath_len, m_filename.c_str(), m_filename.length()) == 0) + { + diskann::cout << "Error opening " << filePath << " -- error=" << GetLastError() << std::endl; + } + else + { + diskann::cout << "Error converting wchar to char -- error=" << GetLastError() << std::endl; + } } // create IOCompletionPort ctx.iocp = CreateIoCompletionPort(ctx.fhandle, ctx.iocp, 0, 0); // create MAX_DEPTH # of reqs - for (_u64 i = 0; i < MAX_IO_DEPTH; i++) + for (uint64_t i = 0; i < MAX_IO_DEPTH; i++) { OVERLAPPED os; memset(&os, 0, sizeof(OVERLAPPED)); @@ -80,9 +89,9 @@ void WindowsAlignedFileReader::read(std::vector &read_reqs, IOConte { using namespace std::chrono_literals; // execute each request sequentially - _u64 n_reqs = read_reqs.size(); - _u64 n_batches = ROUND_UP(n_reqs, MAX_IO_DEPTH) / MAX_IO_DEPTH; - for (_u64 i = 0; i < n_batches; i++) + size_t n_reqs = read_reqs.size(); + uint64_t n_batches = ROUND_UP(n_reqs, MAX_IO_DEPTH) / MAX_IO_DEPTH; + for (uint64_t i = 0; i < n_batches; i++) { // reset all OVERLAPPED objects for (auto &os : ctx.reqs) @@ -100,17 +109,17 @@ void WindowsAlignedFileReader::read(std::vector &read_reqs, IOConte } // batch start/end - _u64 batch_start = MAX_IO_DEPTH * i; - _u64 batch_size = std::min((_u64)(n_reqs - batch_start), (_u64)MAX_IO_DEPTH); + uint64_t batch_start = MAX_IO_DEPTH * i; + uint64_t batch_size = std::min((uint64_t)(n_reqs - batch_start), (uint64_t)MAX_IO_DEPTH); // fill OVERLAPPED and issue them - for (_u64 j = 0; j < batch_size; j++) + for (uint64_t j = 0; j < batch_size; j++) { AlignedRead &req = read_reqs[batch_start + j]; OVERLAPPED &os = ctx.reqs[j]; - _u64 offset = req.offset; - _u64 nbytes = req.len; + uint64_t offset = req.offset; + uint64_t nbytes = req.len; char *read_buf = (char *)req.buf; assert(IS_ALIGNED(read_buf, SECTOR_LEN)); assert(IS_ALIGNED(offset, SECTOR_LEN)); @@ -120,7 +129,7 @@ void WindowsAlignedFileReader::read(std::vector &read_reqs, IOConte os.Offset = offset & 0xffffffff; os.OffsetHigh = (offset >> 32); - BOOL ret = ReadFile(ctx.fhandle, read_buf, nbytes, NULL, &os); + BOOL ret = ReadFile(ctx.fhandle, read_buf, (DWORD)nbytes, NULL, &os); if (ret == FALSE) { auto error = GetLastError(); @@ -135,7 +144,7 @@ void WindowsAlignedFileReader::read(std::vector &read_reqs, IOConte } } DWORD n_read = 0; - _u64 n_complete = 0; + uint64_t n_complete = 0; ULONG_PTR completion_key = 0; OVERLAPPED *lp_os; while (n_complete < batch_size) @@ -153,11 +162,14 @@ void WindowsAlignedFileReader::read(std::vector &read_reqs, IOConte DWORD error = GetLastError(); if (error != WAIT_TIMEOUT) { - diskann::cerr << "GetQueuedCompletionStatus() failed with error = " << error << std::endl; + diskann::cerr << "GetQueuedCompletionStatus() failed " + "with error = " + << error << std::endl; throw diskann::ANNException("GetQueuedCompletionStatus failed with error: ", error, __FUNCSIG__, __FILE__, __LINE__); } - // no completion packet dequeued ==> sleep for 5us and try again + // no completion packet dequeued ==> sleep for 5us and try + // again std::this_thread::sleep_for(5us); } else diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 6aa5532ef..6af8405cc 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,29 +1,41 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT license. -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_COMPILE_WARNING_AS_ERROR ON) -add_executable(build_memory_index build_memory_index.cpp) -target_link_libraries(build_memory_index ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) +find_package(Boost COMPONENTS unit_test_framework) -add_executable(build_stitched_index build_stitched_index.cpp) -target_link_libraries(build_stitched_index ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) +# For Windows, fall back to nuget version if find_package didn't find it. +if (MSVC AND NOT Boost_FOUND) + set(DISKANN_BOOST_INCLUDE "${DISKANN_MSVC_PACKAGES}/boost/lib/native/include") + # Multi-threaded static library. + set(UNIT_TEST_FRAMEWORK_LIB_PATTERN "${DISKANN_MSVC_PACKAGES}/boost_unit_test_framework-vc${MSVC_TOOLSET_VERSION}/lib/native/libboost_unit_test_framework-vc${MSVC_TOOLSET_VERSION}-mt-x64-*.lib") + file(GLOB DISKANN_BOOST_UNIT_TEST_FRAMEWORK_LIB ${UNIT_TEST_FRAMEWORK_LIB_PATTERN}) -add_executable(search_memory_index search_memory_index.cpp) -target_link_libraries(search_memory_index ${PROJECT_NAME} ${DISKANN_ASYNC_LIB} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) + set(UNIT_TEST_FRAMEWORK_DLIB_PATTERN "${DISKANN_MSVC_PACKAGES}/boost_unit_test_framework-vc${MSVC_TOOLSET_VERSION}/lib/native/libboost_unit_test_framework-vc${MSVC_TOOLSET_VERSION}-mt-gd-x64-*.lib") + file(GLOB DISKANN_BOOST_UNIT_TEST_FRAMEWORK_DLIB ${UNIT_TEST_FRAMEWORK_DLIB_PATTERN}) -add_executable(build_disk_index build_disk_index.cpp) -target_link_libraries(build_disk_index ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} ${DISKANN_ASYNC_LIB} Boost::program_options) + if (EXISTS ${DISKANN_BOOST_INCLUDE} AND EXISTS ${DISKANN_BOOST_UNIT_TEST_FRAMEWORK_LIB} AND EXISTS ${DISKANN_BOOST_UNIT_TEST_FRAMEWORK_DLIB}) + set(Boost_FOUND ON) + set(Boost_INCLUDE_DIR ${DISKANN_BOOST_INCLUDE}) + add_library(Boost::unit_test_framework STATIC IMPORTED) + set_target_properties(Boost::unit_test_framework PROPERTIES IMPORTED_LOCATION_RELEASE "${DISKANN_BOOST_UNIT_TEST_FRAMEWORK_LIB}") + set_target_properties(Boost::unit_test_framework PROPERTIES IMPORTED_LOCATION_DEBUG "${DISKANN_BOOST_UNIT_TEST_FRAMEWORK_DLIB}") + message(STATUS "Falling back to using Boost from the nuget package") + else() + message(WARNING "Couldn't find Boost. Was looking for ${DISKANN_BOOST_INCLUDE} and ${UNIT_TEST_FRAMEWORK_LIB_PATTERN}") + endif() +endif() -add_executable(search_disk_index search_disk_index.cpp) -target_link_libraries(search_disk_index ${PROJECT_NAME} ${DISKANN_ASYNC_LIB} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) +if (NOT Boost_FOUND) + message(FATAL_ERROR "Couldn't find Boost dependency") +endif() -add_executable(range_search_disk_index range_search_disk_index.cpp) -target_link_libraries(range_search_disk_index ${PROJECT_NAME} ${DISKANN_ASYNC_LIB} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) -add_executable(test_streaming_scenario test_streaming_scenario.cpp) -target_link_libraries(test_streaming_scenario ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) +set(DISKANN_UNIT_TEST_SOURCES main.cpp index_write_parameters_builder_tests.cpp) -add_executable(test_insert_deletes_consolidate test_insert_deletes_consolidate.cpp) -target_link_libraries(test_insert_deletes_consolidate ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::program_options) +add_executable(${PROJECT_NAME}_unit_tests ${DISKANN_SOURCES} ${DISKANN_UNIT_TEST_SOURCES}) +target_link_libraries(${PROJECT_NAME}_unit_tests ${PROJECT_NAME} ${DISKANN_TOOLS_TCMALLOC_LINK_OPTIONS} Boost::unit_test_framework) + +add_test(NAME ${PROJECT_NAME}_unit_tests COMMAND ${PROJECT_NAME}_unit_tests) diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 000000000..113c9980b --- /dev/null +++ b/tests/README.md @@ -0,0 +1,11 @@ +# Unit Test project + +This unit test project is based on the [boost unit test framework](https://www.boost.org/doc/libs/1_78_0/libs/test/doc/html/index.html). Below are the simple steps to add new unit test, you could find more usage from the [boost unit test document](https://www.boost.org/doc/libs/1_78_0/libs/test/doc/html/index.html). + +## How to add unit test + +- Create new [BOOST_AUTO_TEST_SUITE](https://www.boost.org/doc/libs/1_78_0/libs/test/doc/html/boost_test/utf_reference/test_org_reference/test_org_boost_auto_test_suite.html) for each class in an individual cpp file + +- Add [BOOST_AUTO_TEST_CASE](https://www.boost.org/doc/libs/1_78_0/libs/test/doc/html/boost_test/utf_reference/test_org_reference/test_org_boost_auto_test_case.html) for each test case in the [BOOST_AUTO_TEST_SUITE](https://www.boost.org/doc/libs/1_78_0/libs/test/doc/html/boost_test/utf_reference/test_org_reference/test_org_boost_auto_test_suite.html) + +- Update the [CMakeLists.txt](CMakeLists.txt) file to add the new cpp file to the test project \ No newline at end of file diff --git a/tests/build_disk_index.cpp b/tests/build_disk_index.cpp deleted file mode 100644 index 8bb89141e..000000000 --- a/tests/build_disk_index.cpp +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include -#include - -#include "utils.h" -#include "disk_utils.h" -#include "math_utils.h" -#include "index.h" -#include "partition.h" - -namespace po = boost::program_options; - -int main(int argc, char **argv) -{ - std::string data_type, dist_fn, data_path, index_path_prefix, label_file, universal_label, label_type; - unsigned num_threads, R, L, disk_PQ, build_PQ, Lf, filter_threshold; - float B, M; - bool append_reorder_data = false; - bool use_opq = false; - - po::options_description desc{"Arguments"}; - try - { - desc.add_options()("help,h", "Print information on arguments"); - desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); - desc.add_options()("dist_fn", po::value(&dist_fn)->required(), "distance function "); - desc.add_options()("data_path", po::value(&data_path)->required(), - "Input data file in bin format"); - desc.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), - "Path prefix for saving index file components"); - desc.add_options()("max_degree,R", po::value(&R)->default_value(64), "Maximum graph degree"); - desc.add_options()("Lbuild,L", po::value(&L)->default_value(100), - "Build complexity, higher value results in better graphs"); - desc.add_options()("search_DRAM_budget,B", po::value(&B)->required(), - "DRAM budget in GB for searching the index to set the " - "compressed level for data while search happens"); - desc.add_options()("build_DRAM_budget,M", po::value(&M)->required(), - "DRAM budget in GB for building the index"); - desc.add_options()("num_threads,T", po::value(&num_threads)->default_value(omp_get_num_procs()), - "Number of threads used for building index (defaults to " - "omp_get_num_procs())"); - desc.add_options()("PQ_disk_bytes", po::value(&disk_PQ)->default_value(0), - "Number of bytes to which vectors should be compressed " - "on SSD; 0 for no compression"); - desc.add_options()("append_reorder_data", po::bool_switch()->default_value(false), - "Include full precision data in the index. Use only in " - "conjuction with compressed data on SSD."); - desc.add_options()("build_PQ_bytes", po::value(&build_PQ)->default_value(0), - "Number of PQ bytes to build the index; 0 for full precision build"); - desc.add_options()("use_opq", po::bool_switch()->default_value(false), - "Use Optimized Product Quantization (OPQ)."); - desc.add_options()("label_file", po::value(&label_file)->default_value(""), - "Input label file in txt format for Filtered Index build ." - "The file should contain comma separated filters for each node " - "with each line corresponding to a graph node"); - desc.add_options()("universal_label", po::value(&universal_label)->default_value(""), - "Universal label, Use only in conjuction with label file for filtered " - "index build. If a graph node has all the labels against it, we can " - "assign a special universal filter to the point instead of comma " - "separated filters for that point"); - desc.add_options()("FilteredLbuild,Lf", po::value(&Lf)->default_value(0), - "Build complexity for filtered points, higher value " - "results in better graphs"); - desc.add_options()("filter_threshold,F", po::value(&filter_threshold)->default_value(0), - "Threshold to break up the existing nodes to generate new graph " - "internally where each node has a maximum F labels."); - desc.add_options()("label_type", po::value(&label_type)->default_value("uint"), - "Storage type of Labels , default value is uint which " - "will consume memory 4 bytes per filter"); - - po::variables_map vm; - po::store(po::parse_command_line(argc, argv, desc), vm); - if (vm.count("help")) - { - std::cout << desc; - return 0; - } - po::notify(vm); - if (vm["append_reorder_data"].as()) - append_reorder_data = true; - if (vm["use_opq"].as()) - use_opq = true; - } - catch (const std::exception &ex) - { - std::cerr << ex.what() << '\n'; - return -1; - } - - bool use_filters = false; - if (label_file != "") - { - use_filters = true; - } - - diskann::Metric metric; - if (dist_fn == std::string("l2")) - metric = diskann::Metric::L2; - else if (dist_fn == std::string("mips")) - metric = diskann::Metric::INNER_PRODUCT; - else - { - std::cout << "Error. Only l2 and mips distance functions are supported" << std::endl; - return -1; - } - - if (append_reorder_data) - { - if (disk_PQ == 0) - { - std::cout << "Error: It is not necessary to append data for reordering " - "when vectors are not compressed on disk." - << std::endl; - return -1; - } - if (data_type != std::string("float")) - { - std::cout << "Error: Appending data for reordering currently only " - "supported for float data type." - << std::endl; - return -1; - } - } - - std::string params = std::string(std::to_string(R)) + " " + std::string(std::to_string(L)) + " " + - std::string(std::to_string(B)) + " " + std::string(std::to_string(M)) + " " + - std::string(std::to_string(num_threads)) + " " + std::string(std::to_string(disk_PQ)) + " " + - std::string(std::to_string(append_reorder_data)) + " " + std::string(std::to_string(build_PQ)); - - try - { - if (label_file != "" && label_type == "ushort") - { - if (data_type == std::string("int8")) - return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), - params.c_str(), metric, use_opq, use_filters, - label_file, universal_label, filter_threshold, Lf); - else if (data_type == std::string("uint8")) - return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), - params.c_str(), metric, use_opq, use_filters, - label_file, universal_label, filter_threshold, Lf); - else if (data_type == std::string("float")) - return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), - params.c_str(), metric, use_opq, use_filters, - label_file, universal_label, filter_threshold, Lf); - else - { - diskann::cerr << "Error. Unsupported data type" << std::endl; - return -1; - } - } - else - { - if (data_type == std::string("int8")) - return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), params.c_str(), - metric, use_opq, use_filters, label_file, universal_label, - filter_threshold, Lf); - else if (data_type == std::string("uint8")) - return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), params.c_str(), - metric, use_opq, use_filters, label_file, universal_label, - filter_threshold, Lf); - else if (data_type == std::string("float")) - return diskann::build_disk_index(data_path.c_str(), index_path_prefix.c_str(), params.c_str(), - metric, use_opq, use_filters, label_file, universal_label, - filter_threshold, Lf); - else - { - diskann::cerr << "Error. Unsupported data type" << std::endl; - return -1; - } - } - } - catch (const std::exception &e) - { - std::cout << std::string(e.what()) << std::endl; - diskann::cerr << "Index build failed." << std::endl; - return -1; - } -} diff --git a/tests/build_memory_index.cpp b/tests/build_memory_index.cpp deleted file mode 100644 index 07dd67938..000000000 --- a/tests/build_memory_index.cpp +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include -#include -#include - -#include "index.h" -#include "utils.h" - -#ifndef _WINDOWS -#include -#include -#else -#include -#endif - -#include "memory_mapper.h" -#include "ann_exception.h" - -namespace po = boost::program_options; - -template -int build_in_memory_index(const diskann::Metric &metric, const std::string &data_path, const unsigned R, - const unsigned L, const float alpha, const std::string &save_path, const unsigned num_threads, - const bool use_pq_build, const size_t num_pq_bytes, const bool use_opq, - const std::string &label_file, const std::string &universal_label, const _u32 Lf) -{ - diskann::Parameters paras; - paras.Set("R", R); - paras.Set("L", L); - paras.Set("Lf", Lf); - paras.Set("C", 750); // maximum candidate set size during pruning procedure - paras.Set("alpha", alpha); - paras.Set("saturate_graph", 0); - paras.Set("num_threads", num_threads); - std::string labels_file_to_use = save_path + "_label_formatted.txt"; - std::string mem_labels_int_map_file = save_path + "_labels_map.txt"; - - _u64 data_num, data_dim; - diskann::get_bin_metadata(data_path, data_num, data_dim); - - diskann::Index index(metric, data_dim, data_num, false, false, false, use_pq_build, num_pq_bytes, - use_opq); - auto s = std::chrono::high_resolution_clock::now(); - if (label_file == "") - { - index.build(data_path.c_str(), data_num, paras); - } - else - { - convert_labels_string_to_int(label_file, labels_file_to_use, mem_labels_int_map_file, universal_label); - if (universal_label != "") - { - LabelT unv_label_as_num = 0; - index.set_universal_label(unv_label_as_num); - } - index.build_filtered_index(data_path.c_str(), labels_file_to_use, data_num, paras); - } - std::chrono::duration diff = std::chrono::high_resolution_clock::now() - s; - - std::cout << "Indexing time: " << diff.count() << "\n"; - index.save(save_path.c_str()); - if (label_file != "") - std::remove(labels_file_to_use.c_str()); - return 0; -} - -int main(int argc, char **argv) -{ - std::string data_type, dist_fn, data_path, index_path_prefix, label_file, universal_label, label_type; - unsigned num_threads, R, L, Lf, build_PQ_bytes; - float alpha; - bool use_pq_build, use_opq; - - po::options_description desc{"Arguments"}; - try - { - desc.add_options()("help,h", "Print information on arguments"); - desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); - desc.add_options()("dist_fn", po::value(&dist_fn)->required(), "distance function "); - desc.add_options()("data_path", po::value(&data_path)->required(), - "Input data file in bin format"); - desc.add_options()("index_path_prefix", po::value(&index_path_prefix)->required(), - "Path prefix for saving index file components"); - desc.add_options()("max_degree,R", po::value(&R)->default_value(64), "Maximum graph degree"); - desc.add_options()("Lbuild,L", po::value(&L)->default_value(100), - "Build complexity, higher value results in better graphs"); - desc.add_options()("alpha", po::value(&alpha)->default_value(1.2f), - "alpha controls density and diameter of graph, set 1 for sparse graph, " - "1.2 or 1.4 for denser graphs with lower diameter"); - desc.add_options()("num_threads,T", po::value(&num_threads)->default_value(omp_get_num_procs()), - "Number of threads used for building index (defaults to " - "omp_get_num_procs())"); - desc.add_options()("build_PQ_bytes", po::value(&build_PQ_bytes)->default_value(0), - "Number of PQ bytes to build the index; 0 for full precision build"); - desc.add_options()("use_opq", po::bool_switch()->default_value(false), - "Set true for OPQ compression while using PQ distance comparisons for " - "building the index, and false for PQ compression"); - desc.add_options()("label_file", po::value(&label_file)->default_value(""), - "Input label file in txt format for Filtered Index search. " - "The file should contain comma separated filters for each node " - "with each line corresponding to a graph node"); - desc.add_options()("universal_label", po::value(&universal_label)->default_value(""), - "Universal label, if using it, only in conjunction with labels_file"); - desc.add_options()("FilteredLbuild,Lf", po::value(&Lf)->default_value(0), - "Build complexity for filtered points, higher value " - "results in better graphs"); - desc.add_options()("label_type", po::value(&label_type)->default_value("uint"), - "Storage type of Labels , default value is uint which " - "will consume memory 4 bytes per filter"); - - po::variables_map vm; - po::store(po::parse_command_line(argc, argv, desc), vm); - if (vm.count("help")) - { - std::cout << desc; - return 0; - } - po::notify(vm); - use_pq_build = (build_PQ_bytes > 0); - use_opq = vm["use_opq"].as(); - } - catch (const std::exception &ex) - { - std::cerr << ex.what() << '\n'; - return -1; - } - - diskann::Metric metric; - if (dist_fn == std::string("mips")) - { - metric = diskann::Metric::INNER_PRODUCT; - } - else if (dist_fn == std::string("l2")) - { - metric = diskann::Metric::L2; - } - else if (dist_fn == std::string("cosine")) - { - metric = diskann::Metric::COSINE; - } - else - { - std::cout << "Unsupported distance function. Currently only L2/ Inner " - "Product/Cosine are supported." - << std::endl; - return -1; - } - - try - { - diskann::cout << "Starting index build with R: " << R << " Lbuild: " << L << " alpha: " << alpha - << " #threads: " << num_threads << std::endl; - if (label_file != "" && label_type == "ushort") - { - if (data_type == std::string("int8")) - return build_in_memory_index( - metric, data_path, R, L, alpha, index_path_prefix, num_threads, use_pq_build, build_PQ_bytes, - use_opq, label_file, universal_label, Lf); - else if (data_type == std::string("uint8")) - return build_in_memory_index( - metric, data_path, R, L, alpha, index_path_prefix, num_threads, use_pq_build, build_PQ_bytes, - use_opq, label_file, universal_label, Lf); - else if (data_type == std::string("float")) - return build_in_memory_index( - metric, data_path, R, L, alpha, index_path_prefix, num_threads, use_pq_build, build_PQ_bytes, - use_opq, label_file, universal_label, Lf); - else - { - std::cout << "Unsupported type. Use one of int8, uint8 or float." << std::endl; - return -1; - } - } - else - { - if (data_type == std::string("int8")) - return build_in_memory_index(metric, data_path, R, L, alpha, index_path_prefix, num_threads, - use_pq_build, build_PQ_bytes, use_opq, label_file, universal_label, - Lf); - else if (data_type == std::string("uint8")) - return build_in_memory_index(metric, data_path, R, L, alpha, index_path_prefix, num_threads, - use_pq_build, build_PQ_bytes, use_opq, label_file, - universal_label, Lf); - else if (data_type == std::string("float")) - return build_in_memory_index(metric, data_path, R, L, alpha, index_path_prefix, num_threads, - use_pq_build, build_PQ_bytes, use_opq, label_file, universal_label, - Lf); - else - { - std::cout << "Unsupported type. Use one of int8, uint8 or float." << std::endl; - return -1; - } - } - } - catch (const std::exception &e) - { - std::cout << std::string(e.what()) << std::endl; - diskann::cerr << "Index build failed." << std::endl; - return -1; - } -} diff --git a/tests/build_stitched_index.cpp b/tests/build_stitched_index.cpp deleted file mode 100644 index 22c93d846..000000000 --- a/tests/build_stitched_index.cpp +++ /dev/null @@ -1,800 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -#include -#include -#include -#include -#include -#include -#include - -#include -#ifndef _WINDOWS -#include -#endif - -#include "index.h" -#include "memory_mapper.h" -#include "parameters.h" -#include "utils.h" - -namespace po = boost::program_options; - -// macros -#define PBSTR "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" -#define PBWIDTH 60 - -// custom types (for readability) -typedef tsl::robin_set label_set; -typedef std::string path; - -// structs for returning multiple items from a function -typedef std::tuple, tsl::robin_map, label_set> parse_label_file_return_values; -typedef std::tuple>, _u64> load_label_index_return_values; -typedef std::tuple>, _u64> stitch_indices_return_values; - -/* - * Inline function to display progress bar. - */ -inline void print_progress(double percentage) -{ - int val = (int)(percentage * 100); - int lpad = (int)(percentage * PBWIDTH); - int rpad = PBWIDTH - lpad; - printf("\r%3d%% [%.*s%*s]", val, lpad, PBSTR, rpad, ""); - fflush(stdout); -} - -/* - * Inline function to generate a random integer in a range. - */ -inline size_t random(size_t range_from, size_t range_to) -{ - std::random_device rand_dev; - std::mt19937 generator(rand_dev()); - std::uniform_int_distribution distr(range_from, range_to); - return distr(generator); -} - -/* - * function to handle command line parsing. - * - * Arguments are merely the inputs from the command line. - */ -void handle_args(int argc, char **argv, std::string &data_type, path &input_data_path, path &final_index_path_prefix, - path &label_data_path, std::string &universal_label, unsigned &num_threads, unsigned &R, unsigned &L, - unsigned &stitched_R, float &alpha) -{ - po::options_description desc{"Arguments"}; - try - { - desc.add_options()("help,h", "Print information on arguments"); - desc.add_options()("data_type", po::value(&data_type)->required(), "data type "); - desc.add_options()("data_path", po::value(&input_data_path)->required(), "Input data file in bin format"); - desc.add_options()("index_path_prefix", po::value(&final_index_path_prefix)->required(), - "Path prefix for saving index file components"); - desc.add_options()("max_degree,R", po::value(&R)->default_value(64), "Maximum graph degree"); - desc.add_options()("Lbuild,L", po::value(&L)->default_value(100), - "Build complexity, higher value results in better graphs"); - desc.add_options()("stitched_R", po::value(&stitched_R)->default_value(100), - "Degree to prune final graph down to"); - desc.add_options()("alpha", po::value(&alpha)->default_value(1.2f), - "alpha controls density and diameter of graph, set 1 for sparse graph, " - "1.2 or 1.4 for denser graphs with lower diameter"); - desc.add_options()("num_threads,T", po::value(&num_threads)->default_value(omp_get_num_procs()), - "Number of threads used for building index (defaults to " - "omp_get_num_procs())"); - desc.add_options()("label_file", po::value(&label_data_path)->default_value(""), - "Input label file in txt format if present"); - desc.add_options()("universal_label", po::value(&universal_label)->default_value(""), - "If a point comes with the specified universal label (and only the " - "univ. " - "label), then the point is considered to have every possible label"); - - po::variables_map vm; - po::store(po::parse_command_line(argc, argv, desc), vm); - if (vm.count("help")) - { - std::cout << desc; - exit(0); - } - po::notify(vm); - } - catch (const std::exception &ex) - { - std::cerr << ex.what() << '\n'; - throw; - } -} - -/* - * Parses the label datafile, which has comma-separated labels on - * each line. Line i corresponds to point id i. - * - * Returns three objects via std::tuple: - * 1. map: key is point id, value is vector of labels said point has - * 2. map: key is label, value is number of points with the label - * 3. the label universe as a set - */ -parse_label_file_return_values parse_label_file(path label_data_path, std::string universal_label) -{ - std::ifstream label_data_stream(label_data_path); - std::string line, token; - unsigned line_cnt = 0; - - // allows us to reserve space for the points_to_labels vector - while (std::getline(label_data_stream, line)) - line_cnt++; - label_data_stream.clear(); - label_data_stream.seekg(0, std::ios::beg); - - // values to return - std::vector point_ids_to_labels(line_cnt); - tsl::robin_map labels_to_number_of_points; - label_set all_labels; - - std::vector<_u32> points_with_universal_label; - line_cnt = 0; - while (std::getline(label_data_stream, line)) - { - std::istringstream current_labels_comma_separated(line); - label_set current_labels; - - // get point id - _u32 point_id = line_cnt; - - // parse comma separated labels - bool current_universal_label_check = false; - while (getline(current_labels_comma_separated, token, ',')) - { - token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); - token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); - - // if token is empty, there's no labels for the point - if (token == universal_label) - { - points_with_universal_label.push_back(point_id); - current_universal_label_check = true; - } - else - { - all_labels.insert(token); - current_labels.insert(token); - labels_to_number_of_points[token]++; - } - } - - if (current_labels.size() <= 0 && !current_universal_label_check) - { - std::cerr << "Error: " << point_id << " has no labels." << std::endl; - exit(-1); - } - point_ids_to_labels[point_id] = current_labels; - line_cnt++; - } - - // for every point with universal label, set its label set to all labels - // also, increment the count for number of points a label has - for (const auto &point_id : points_with_universal_label) - { - point_ids_to_labels[point_id] = all_labels; - for (const auto &lbl : all_labels) - labels_to_number_of_points[lbl]++; - } - - std::cout << "Identified " << all_labels.size() << " distinct label(s) for " << point_ids_to_labels.size() - << " points\n" - << std::endl; - - return std::make_tuple(point_ids_to_labels, labels_to_number_of_points, all_labels); -} - -/* - * For each label, generates a file containing all vectors that have said label. - * Also copies data from original bin file to new dimension-aligned file. - * - * Utilizes POSIX functions mmap and writev in order to minimize memory - * overhead, so we include an STL version as well. - * - * Each data file is saved under the following format: - * input_data_path + "_" + label - */ -template -tsl::robin_map> generate_label_specific_vector_files( - path input_data_path, tsl::robin_map labels_to_number_of_points, - std::vector point_ids_to_labels, label_set all_labels) -{ - auto file_writing_timer = std::chrono::high_resolution_clock::now(); - diskann::MemoryMapper input_data(input_data_path); - char *input_start = input_data.getBuf(); - - _u32 number_of_points, dimension; - std::memcpy(&number_of_points, input_start, sizeof(_u32)); - std::memcpy(&dimension, input_start + sizeof(_u32), sizeof(_u32)); - const _u32 VECTOR_SIZE = dimension * sizeof(T); - const size_t METADATA = 2 * sizeof(_u32); - if (number_of_points != point_ids_to_labels.size()) - { - std::cerr << "Error: number of points in labels file and data file differ." << std::endl; - throw; - } - - tsl::robin_map label_to_iovec_map; - tsl::robin_map label_to_curr_iovec; - tsl::robin_map> label_id_to_orig_id; - - // setup iovec list for each label - for (const auto &lbl : all_labels) - { - iovec *label_iovecs = (iovec *)malloc(labels_to_number_of_points[lbl] * sizeof(iovec)); - if (label_iovecs == nullptr) - { - throw; - } - label_to_iovec_map[lbl] = label_iovecs; - label_to_curr_iovec[lbl] = 0; - label_id_to_orig_id[lbl].reserve(labels_to_number_of_points[lbl]); - } - - // each point added to corresponding per-label iovec list - for (_u32 point_id = 0; point_id < number_of_points; point_id++) - { - char *curr_point = input_start + METADATA + (VECTOR_SIZE * point_id); - iovec curr_iovec; - - curr_iovec.iov_base = curr_point; - curr_iovec.iov_len = VECTOR_SIZE; - for (const auto &lbl : point_ids_to_labels[point_id]) - { - *(label_to_iovec_map[lbl] + label_to_curr_iovec[lbl]) = curr_iovec; - label_to_curr_iovec[lbl]++; - label_id_to_orig_id[lbl].push_back(point_id); - } - } - - // write each label iovec to resp. file - for (const auto &lbl : all_labels) - { - int label_input_data_fd; - path curr_label_input_data_path(input_data_path + "_" + lbl); - _u32 curr_num_pts = labels_to_number_of_points[lbl]; - - label_input_data_fd = - open(curr_label_input_data_path.c_str(), O_CREAT | O_WRONLY | O_TRUNC | O_APPEND, (mode_t)0644); - if (label_input_data_fd == -1) - throw; - - // write metadata - _u32 metadata[2] = {curr_num_pts, dimension}; - int return_value = write(label_input_data_fd, metadata, sizeof(_u32) * 2); - if (return_value == -1) - { - throw; - } - - // limits on number of iovec structs per writev means we need to perform - // multiple writevs - size_t i = 0; - while (curr_num_pts > IOV_MAX) - { - return_value = writev(label_input_data_fd, (label_to_iovec_map[lbl] + (IOV_MAX * i)), IOV_MAX); - if (return_value == -1) - { - close(label_input_data_fd); - throw; - } - curr_num_pts -= IOV_MAX; - i += 1; - } - return_value = writev(label_input_data_fd, (label_to_iovec_map[lbl] + (IOV_MAX * i)), curr_num_pts); - if (return_value == -1) - { - close(label_input_data_fd); - throw; - } - - free(label_to_iovec_map[lbl]); - close(label_input_data_fd); - } - - std::chrono::duration file_writing_time = std::chrono::high_resolution_clock::now() - file_writing_timer; - std::cout << "generated " << all_labels.size() << " label-specific vector files for index building in time " - << file_writing_time.count() << "\n" - << std::endl; - - return label_id_to_orig_id; -} - -// for use on systems without writev (i.e. Windows) -template -tsl::robin_map> generate_label_specific_vector_files_compat( - path input_data_path, tsl::robin_map labels_to_number_of_points, - std::vector point_ids_to_labels, label_set all_labels) -{ - auto file_writing_timer = std::chrono::high_resolution_clock::now(); - std::ifstream input_data_stream(input_data_path); - - _u32 number_of_points, dimension; - input_data_stream.read((char *)&number_of_points, sizeof(_u32)); - input_data_stream.read((char *)&dimension, sizeof(_u32)); - const _u32 VECTOR_SIZE = dimension * sizeof(T); - if (number_of_points != point_ids_to_labels.size()) - { - std::cerr << "Error: number of points in labels file and data file differ." << std::endl; - throw; - } - - tsl::robin_map labels_to_vectors; - tsl::robin_map labels_to_curr_vector; - tsl::robin_map> label_id_to_orig_id; - - for (const auto &lbl : all_labels) - { - _u32 number_of_label_pts = labels_to_number_of_points[lbl]; - char *vectors = (char *)malloc(number_of_label_pts * VECTOR_SIZE); - if (vectors == nullptr) - { - throw; - } - labels_to_vectors[lbl] = vectors; - labels_to_curr_vector[lbl] = 0; - label_id_to_orig_id[lbl].reserve(number_of_label_pts); - } - - for (_u32 point_id = 0; point_id < number_of_points; point_id++) - { - char *curr_vector = (char *)malloc(VECTOR_SIZE); - input_data_stream.read(curr_vector, VECTOR_SIZE); - for (const auto &lbl : point_ids_to_labels[point_id]) - { - char *curr_label_vector_ptr = labels_to_vectors[lbl] + (labels_to_curr_vector[lbl] * VECTOR_SIZE); - memcpy(curr_label_vector_ptr, curr_vector, VECTOR_SIZE); - labels_to_curr_vector[lbl]++; - label_id_to_orig_id[lbl].push_back(point_id); - } - free(curr_vector); - } - - for (const auto &lbl : all_labels) - { - path curr_label_input_data_path(input_data_path + "_" + lbl); - _u32 number_of_label_pts = labels_to_number_of_points[lbl]; - - std::ofstream label_file_stream; - label_file_stream.exceptions(std::ios::badbit | std::ios::failbit); - label_file_stream.open(curr_label_input_data_path, std::ios_base::binary); - label_file_stream.write((char *)&number_of_label_pts, sizeof(_u32)); - label_file_stream.write((char *)&dimension, sizeof(_u32)); - label_file_stream.write((char *)labels_to_vectors[lbl], number_of_label_pts * VECTOR_SIZE); - - label_file_stream.close(); - free(labels_to_vectors[lbl]); - } - input_data_stream.close(); - - std::chrono::duration file_writing_time = std::chrono::high_resolution_clock::now() - file_writing_timer; - std::cout << "generated " << all_labels.size() << " label-specific vector files for index building in time " - << file_writing_time.count() << "\n" - << std::endl; - - return label_id_to_orig_id; -} - -/* - * Using passed in parameters and files generated from step 3, - * builds a vanilla diskANN index for each label. - * - * Each index is saved under the following path: - * final_index_path_prefix + "_" + label - */ -template -void generate_label_indices(path input_data_path, path final_index_path_prefix, label_set all_labels, unsigned R, - unsigned L, float alpha, unsigned num_threads) -{ - diskann::Parameters label_index_build_parameters; - label_index_build_parameters.Set("R", R); - label_index_build_parameters.Set("L", L); - label_index_build_parameters.Set("C", 750); - label_index_build_parameters.Set("Lf", 0); - label_index_build_parameters.Set("saturate_graph", 0); - label_index_build_parameters.Set("alpha", alpha); - label_index_build_parameters.Set("num_threads", num_threads); - - std::cout << "Generating indices per label..." << std::endl; - // for each label, build an index on resp. points - double total_indexing_time = 0.0, indexing_percentage = 0.0; - std::cout.setstate(std::ios_base::failbit); - diskann::cout.setstate(std::ios_base::failbit); - for (const auto &lbl : all_labels) - { - path curr_label_input_data_path(input_data_path + "_" + lbl); - path curr_label_index_path(final_index_path_prefix + "_" + lbl); - - size_t number_of_label_points, dimension; - diskann::get_bin_metadata(curr_label_input_data_path, number_of_label_points, dimension); - diskann::Index index(diskann::Metric::L2, dimension, number_of_label_points, false, false); - - auto index_build_timer = std::chrono::high_resolution_clock::now(); - index.build(curr_label_input_data_path.c_str(), number_of_label_points, label_index_build_parameters); - std::chrono::duration current_indexing_time = - std::chrono::high_resolution_clock::now() - index_build_timer; - - total_indexing_time += current_indexing_time.count(); - indexing_percentage += (1 / (double)all_labels.size()); - print_progress(indexing_percentage); - - index.save(curr_label_index_path.c_str()); - } - std::cout.clear(); - diskann::cout.clear(); - - std::cout << "\nDone. Generated per-label indices in " << total_indexing_time << " seconds\n" << std::endl; -} - -/* - * Manually loads a graph index in from a given file. - * - * Returns both the graph index and the size of the file in bytes. - */ -load_label_index_return_values load_label_index(path label_index_path, _u32 label_number_of_points) -{ - std::ifstream label_index_stream; - label_index_stream.exceptions(std::ios::badbit | std::ios::failbit); - label_index_stream.open(label_index_path, std::ios::binary); - - _u64 index_file_size, index_num_frozen_points; - _u32 index_max_observed_degree, index_entry_point; - const size_t INDEX_METADATA = 2 * sizeof(_u64) + 2 * sizeof(_u32); - label_index_stream.read((char *)&index_file_size, sizeof(_u64)); - label_index_stream.read((char *)&index_max_observed_degree, sizeof(_u32)); - label_index_stream.read((char *)&index_entry_point, sizeof(_u32)); - label_index_stream.read((char *)&index_num_frozen_points, sizeof(_u64)); - size_t bytes_read = INDEX_METADATA; - - std::vector> label_index(label_number_of_points); - _u32 nodes_read = 0; - while (bytes_read != index_file_size) - { - _u32 current_node_num_neighbors; - label_index_stream.read((char *)¤t_node_num_neighbors, sizeof(_u32)); - nodes_read++; - - std::vector<_u32> current_node_neighbors(current_node_num_neighbors); - label_index_stream.read((char *)current_node_neighbors.data(), current_node_num_neighbors * sizeof(_u32)); - label_index[nodes_read - 1].swap(current_node_neighbors); - bytes_read += sizeof(_u32) * (current_node_num_neighbors + 1); - } - - return std::make_tuple(label_index, index_file_size); -} - -/* - * Custom index save to write the in-memory index to disk. - * Also writes required files for diskANN API - - * 1. labels_to_medoids - * 2. universal_label - * 3. data (redundant for static indices) - * 4. labels (redundant for static indices) - */ -void save_full_index(path final_index_path_prefix, path input_data_path, _u64 final_index_size, - std::vector> stitched_graph, tsl::robin_map entry_points, - std::string universal_label, path label_data_path) -{ - // aux. file 1 - auto saving_index_timer = std::chrono::high_resolution_clock::now(); - std::ifstream original_label_data_stream; - original_label_data_stream.exceptions(std::ios::badbit | std::ios::failbit); - original_label_data_stream.open(label_data_path, std::ios::binary); - std::ofstream new_label_data_stream; - new_label_data_stream.exceptions(std::ios::badbit | std::ios::failbit); - new_label_data_stream.open(final_index_path_prefix + "_labels.txt", std::ios::binary); - new_label_data_stream << original_label_data_stream.rdbuf(); - original_label_data_stream.close(); - new_label_data_stream.close(); - - // aux. file 2 - std::ifstream original_input_data_stream; - original_input_data_stream.exceptions(std::ios::badbit | std::ios::failbit); - original_input_data_stream.open(input_data_path, std::ios::binary); - std::ofstream new_input_data_stream; - new_input_data_stream.exceptions(std::ios::badbit | std::ios::failbit); - new_input_data_stream.open(final_index_path_prefix + ".data", std::ios::binary); - new_input_data_stream << original_input_data_stream.rdbuf(); - original_input_data_stream.close(); - new_input_data_stream.close(); - - // aux. file 3 - std::ofstream labels_to_medoids_writer; - labels_to_medoids_writer.exceptions(std::ios::badbit | std::ios::failbit); - labels_to_medoids_writer.open(final_index_path_prefix + "_labels_to_medoids.txt"); - for (auto iter : entry_points) - labels_to_medoids_writer << iter.first << ", " << iter.second << std::endl; - labels_to_medoids_writer.close(); - - // aux. file 4 (only if we're using a universal label) - if (universal_label != "") - { - std::ofstream universal_label_writer; - universal_label_writer.exceptions(std::ios::badbit | std::ios::failbit); - universal_label_writer.open(final_index_path_prefix + "_universal_label.txt"); - universal_label_writer << universal_label << std::endl; - universal_label_writer.close(); - } - - // main index - _u64 index_num_frozen_points = 0, index_num_edges = 0; - _u32 index_max_observed_degree = 0, index_entry_point = 0; - const size_t METADATA = 2 * sizeof(_u64) + 2 * sizeof(_u32); - for (auto &point_neighbors : stitched_graph) - { - index_max_observed_degree = std::max(index_max_observed_degree, (_u32)point_neighbors.size()); - } - - std::ofstream stitched_graph_writer; - stitched_graph_writer.exceptions(std::ios::badbit | std::ios::failbit); - stitched_graph_writer.open(final_index_path_prefix, std::ios_base::binary); - - stitched_graph_writer.write((char *)&final_index_size, sizeof(_u64)); - stitched_graph_writer.write((char *)&index_max_observed_degree, sizeof(_u32)); - stitched_graph_writer.write((char *)&index_entry_point, sizeof(_u32)); - stitched_graph_writer.write((char *)&index_num_frozen_points, sizeof(_u64)); - - size_t bytes_written = METADATA; - for (_u32 node_point = 0; node_point < stitched_graph.size(); node_point++) - { - _u32 current_node_num_neighbors = stitched_graph[node_point].size(); - std::vector<_u32> current_node_neighbors = stitched_graph[node_point]; - stitched_graph_writer.write((char *)¤t_node_num_neighbors, sizeof(_u32)); - bytes_written += sizeof(_u32); - for (const auto ¤t_node_neighbor : current_node_neighbors) - { - stitched_graph_writer.write((char *)¤t_node_neighbor, sizeof(_u32)); - bytes_written += sizeof(_u32); - } - index_num_edges += current_node_num_neighbors; - } - - if (bytes_written != final_index_size) - { - std::cerr << "Error: written bytes does not match allocated space" << std::endl; - throw; - } - - stitched_graph_writer.close(); - - std::chrono::duration saving_index_time = std::chrono::high_resolution_clock::now() - saving_index_timer; - std::cout << "Stitched graph written in " << saving_index_time.count() << " seconds" << std::endl; - std::cout << "Stitched graph average degree: " << ((float)index_num_edges) / ((float)(stitched_graph.size())) - << std::endl; - std::cout << "Stitched graph max degree: " << index_max_observed_degree << std::endl << std::endl; -} - -/* - * Unions the per-label graph indices together via the following policy: - * - any two nodes can only have at most one edge between them - - * - * Returns the "stitched" graph and its expected file size. - */ -template -stitch_indices_return_values stitch_label_indices( - path final_index_path_prefix, _u32 total_number_of_points, label_set all_labels, - tsl::robin_map labels_to_number_of_points, tsl::robin_map &label_entry_points, - tsl::robin_map> label_id_to_orig_id_map) -{ - size_t final_index_size = 0; - std::vector> stitched_graph(total_number_of_points); - - auto stitching_index_timer = std::chrono::high_resolution_clock::now(); - for (const auto &lbl : all_labels) - { - path curr_label_index_path(final_index_path_prefix + "_" + lbl); - std::vector> curr_label_index; - _u64 curr_label_index_size; - _u32 curr_label_entry_point; - - std::tie(curr_label_index, curr_label_index_size) = - load_label_index(curr_label_index_path, labels_to_number_of_points[lbl]); - curr_label_entry_point = random(0, curr_label_index.size()); - label_entry_points[lbl] = label_id_to_orig_id_map[lbl][curr_label_entry_point]; - - for (_u32 node_point = 0; node_point < curr_label_index.size(); node_point++) - { - _u32 original_point_id = label_id_to_orig_id_map[lbl][node_point]; - for (auto &node_neighbor : curr_label_index[node_point]) - { - _u32 original_neighbor_id = label_id_to_orig_id_map[lbl][node_neighbor]; - std::vector<_u32> curr_point_neighbors = stitched_graph[original_point_id]; - if (std::find(curr_point_neighbors.begin(), curr_point_neighbors.end(), original_neighbor_id) == - curr_point_neighbors.end()) - { - stitched_graph[original_point_id].push_back(original_neighbor_id); - final_index_size += sizeof(_u32); - } - } - } - } - - const size_t METADATA = 2 * sizeof(_u64) + 2 * sizeof(_u32); - final_index_size += (total_number_of_points * sizeof(_u32) + METADATA); - - std::chrono::duration stitching_index_time = - std::chrono::high_resolution_clock::now() - stitching_index_timer; - std::cout << "stitched graph generated in memory in " << stitching_index_time.count() << " seconds" << std::endl; - - return std::make_tuple(stitched_graph, final_index_size); -} - -/* - * Applies the prune_neighbors function from src/index.cpp to - * every node in the stitched graph. - * - * This is an optional step, hence the saving of both the full - * and pruned graph. - */ -template -void prune_and_save(path final_index_path_prefix, path full_index_path_prefix, path input_data_path, - std::vector> stitched_graph, unsigned stitched_R, - tsl::robin_map label_entry_points, std::string universal_label, - path label_data_path, unsigned num_threads) -{ - size_t dimension, number_of_label_points; - auto diskann_cout_buffer = diskann::cout.rdbuf(nullptr); - auto std_cout_buffer = std::cout.rdbuf(nullptr); - auto pruning_index_timer = std::chrono::high_resolution_clock::now(); - - diskann::get_bin_metadata(input_data_path, number_of_label_points, dimension); - diskann::Index index(diskann::Metric::L2, dimension, number_of_label_points, false, false); - - // not searching this index, set search_l to 0 - index.load(full_index_path_prefix.c_str(), num_threads, 1); - - diskann::Parameters paras; - paras.Set("R", stitched_R); - paras.Set("C", 750); // maximum candidate set size during pruning procedure - paras.Set("alpha", 1.2); - paras.Set("saturate_graph", 1); - std::cout << "parsing labels" << std::endl; - - index.prune_all_nbrs(paras); - index.save((final_index_path_prefix).c_str()); - - diskann::cout.rdbuf(diskann_cout_buffer); - std::cout.rdbuf(std_cout_buffer); - std::chrono::duration pruning_index_time = std::chrono::high_resolution_clock::now() - pruning_index_timer; - std::cout << "pruning performed in " << pruning_index_time.count() << " seconds\n" << std::endl; -} - -/* - * Delete all temporary artifacts. - * In the process of creating the stitched index, some temporary artifacts are - * created: - * 1. the separate bin files for each labels' points - * 2. the separate diskANN indices built for each label - * 3. the '.data' file created while generating the indices - */ -void clean_up_artifacts(path input_data_path, path final_index_path_prefix, label_set all_labels) -{ - for (const auto &lbl : all_labels) - { - path curr_label_input_data_path(input_data_path + "_" + lbl); - path curr_label_index_path(final_index_path_prefix + "_" + lbl); - path curr_label_index_path_data(curr_label_index_path + ".data"); - - if (std::remove(curr_label_index_path.c_str()) != 0) - throw; - if (std::remove(curr_label_input_data_path.c_str()) != 0) - throw; - if (std::remove(curr_label_index_path_data.c_str()) != 0) - throw; - } -} - -int main(int argc, char **argv) -{ - // 1. handle cmdline inputs - std::string data_type; - path input_data_path, final_index_path_prefix, label_data_path; - std::string universal_label; - unsigned num_threads, R, L, stitched_R; - float alpha; - - auto index_timer = std::chrono::high_resolution_clock::now(); - handle_args(argc, argv, data_type, input_data_path, final_index_path_prefix, label_data_path, universal_label, - num_threads, R, L, stitched_R, alpha); - - path labels_file_to_use = final_index_path_prefix + "_label_formatted.txt"; - path labels_map_file = final_index_path_prefix + "_labels_map.txt"; - - convert_labels_string_to_int(label_data_path, labels_file_to_use, labels_map_file, universal_label); - - // 2. parse label file and create necessary data structures - std::vector point_ids_to_labels; - tsl::robin_map labels_to_number_of_points; - label_set all_labels; - - std::tie(point_ids_to_labels, labels_to_number_of_points, all_labels) = - parse_label_file(labels_file_to_use, universal_label); - - // 3. for each label, make a separate data file - tsl::robin_map> label_id_to_orig_id_map; - _u32 total_number_of_points = point_ids_to_labels.size(); - -#ifndef _WINDOWS - if (data_type == "uint8") - label_id_to_orig_id_map = generate_label_specific_vector_files( - input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); - else if (data_type == "int8") - label_id_to_orig_id_map = generate_label_specific_vector_files( - input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); - else if (data_type == "float") - label_id_to_orig_id_map = generate_label_specific_vector_files( - input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); - else - throw; -#else - if (data_type == "uint8") - label_id_to_orig_id_map = generate_label_specific_vector_files_compat( - input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); - else if (data_type == "int8") - label_id_to_orig_id_map = generate_label_specific_vector_files_compat( - input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); - else if (data_type == "float") - label_id_to_orig_id_map = generate_label_specific_vector_files_compat( - input_data_path, labels_to_number_of_points, point_ids_to_labels, all_labels); - else - throw; -#endif - - // 4. for each created data file, create a vanilla diskANN index - if (data_type == "uint8") - generate_label_indices(input_data_path, final_index_path_prefix, all_labels, R, L, alpha, num_threads); - else if (data_type == "int8") - generate_label_indices(input_data_path, final_index_path_prefix, all_labels, R, L, alpha, num_threads); - else if (data_type == "float") - generate_label_indices(input_data_path, final_index_path_prefix, all_labels, R, L, alpha, num_threads); - else - throw; - - // 5. "stitch" the indices together - std::vector> stitched_graph; - tsl::robin_map label_entry_points; - _u64 stitched_graph_size; - - if (data_type == "uint8") - std::tie(stitched_graph, stitched_graph_size) = - stitch_label_indices(final_index_path_prefix, total_number_of_points, all_labels, - labels_to_number_of_points, label_entry_points, label_id_to_orig_id_map); - else if (data_type == "int8") - std::tie(stitched_graph, stitched_graph_size) = - stitch_label_indices(final_index_path_prefix, total_number_of_points, all_labels, - labels_to_number_of_points, label_entry_points, label_id_to_orig_id_map); - else if (data_type == "float") - std::tie(stitched_graph, stitched_graph_size) = - stitch_label_indices(final_index_path_prefix, total_number_of_points, all_labels, - labels_to_number_of_points, label_entry_points, label_id_to_orig_id_map); - else - throw; - path full_index_path_prefix = final_index_path_prefix + "_full"; - // 5a. save the stitched graph to disk - save_full_index(full_index_path_prefix, input_data_path, stitched_graph_size, stitched_graph, label_entry_points, - universal_label, labels_file_to_use); - - // 6. run a prune on the stitched index, and save to disk - if (data_type == "uint8") - prune_and_save(final_index_path_prefix, full_index_path_prefix, input_data_path, stitched_graph, - stitched_R, label_entry_points, universal_label, labels_file_to_use, num_threads); - else if (data_type == "int8") - prune_and_save(final_index_path_prefix, full_index_path_prefix, input_data_path, stitched_graph, - stitched_R, label_entry_points, universal_label, labels_file_to_use, num_threads); - else if (data_type == "float") - prune_and_save(final_index_path_prefix, full_index_path_prefix, input_data_path, stitched_graph, - stitched_R, label_entry_points, universal_label, labels_file_to_use, num_threads); - else - throw; - - std::chrono::duration index_time = std::chrono::high_resolution_clock::now() - index_timer; - std::cout << "pruned/stitched graph generated in " << index_time.count() << " seconds" << std::endl; - - clean_up_artifacts(input_data_path, final_index_path_prefix, all_labels); -} diff --git a/tests/index_write_parameters_builder_tests.cpp b/tests/index_write_parameters_builder_tests.cpp new file mode 100644 index 000000000..acd5e2227 --- /dev/null +++ b/tests/index_write_parameters_builder_tests.cpp @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#include + +#include "parameters.h" + +BOOST_AUTO_TEST_SUITE(IndexWriteParametersBuilder_tests) + +BOOST_AUTO_TEST_CASE(test_build) +{ + uint32_t search_list_size = rand(); + uint32_t max_degree = rand(); + float alpha = (float)rand(); + uint32_t filter_list_size = rand(); + uint32_t max_occlusion_size = rand(); + uint32_t num_frozen_points = rand(); + bool saturate_graph = true; + + diskann::IndexWriteParametersBuilder builder(search_list_size, max_degree); + + builder.with_alpha(alpha) + .with_filter_list_size(filter_list_size) + .with_max_occlusion_size(max_occlusion_size) + .with_num_frozen_points(num_frozen_points) + .with_num_threads(0) + .with_saturate_graph(saturate_graph); + + { + auto parameters = builder.build(); + + BOOST_TEST(search_list_size == parameters.search_list_size); + BOOST_TEST(max_degree == parameters.max_degree); + BOOST_TEST(alpha == parameters.alpha); + BOOST_TEST(filter_list_size == parameters.filter_list_size); + BOOST_TEST(max_occlusion_size == parameters.max_occlusion_size); + BOOST_TEST(num_frozen_points == parameters.num_frozen_points); + BOOST_TEST(saturate_graph == parameters.saturate_graph); + + BOOST_TEST(parameters.num_threads > (uint32_t)0); + } + + { + uint32_t num_threads = rand() + 1; + saturate_graph = false; + builder.with_num_threads(num_threads) + .with_saturate_graph(saturate_graph); + + auto parameters = builder.build(); + + BOOST_TEST(search_list_size == parameters.search_list_size); + BOOST_TEST(max_degree == parameters.max_degree); + BOOST_TEST(alpha == parameters.alpha); + BOOST_TEST(filter_list_size == parameters.filter_list_size); + BOOST_TEST(max_occlusion_size == parameters.max_occlusion_size); + BOOST_TEST(num_frozen_points == parameters.num_frozen_points); + BOOST_TEST(saturate_graph == parameters.saturate_graph); + + BOOST_TEST(num_threads == parameters.num_threads); + } +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/main.cpp b/tests/main.cpp new file mode 100644 index 000000000..53440a17a --- /dev/null +++ b/tests/main.cpp @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +#define BOOST_TEST_MODULE diskann_unit_tests + +#include diff --git a/windows/packages.config.in b/windows/packages.config.in index d444e66b1..f8eecf02f 100644 --- a/windows/packages.config.in +++ b/windows/packages.config.in @@ -4,6 +4,7 @@ + diff --git a/workflows/SSD_index.md b/workflows/SSD_index.md index 1b8440ea5..f86856796 100644 --- a/workflows/SSD_index.md +++ b/workflows/SSD_index.md @@ -1,7 +1,7 @@ **Usage for SSD-based indices** =============================== -To generate an SSD-friendly index, use the `tests/build_disk_index` program. +To generate an SSD-friendly index, use the `apps/build_disk_index` program. ---------------------------------------------------------------------------- The arguments are as follows: @@ -19,7 +19,7 @@ The arguments are as follows: 11. **--build_PQ_bytes** (default is 0): Set to a positive value less than the dimensionality of the data to enable faster index build with PQ based distance comparisons. 12. **--use_opq**: use the flag to use OPQ rather than PQ compression. OPQ is more space efficient for some high dimensional datasets, but also needs a bit more build time. -To search the SSD-index, use the `tests/search_disk_index` program. +To search the SSD-index, use the `apps/search_disk_index` program. ------------------------------------------------------------------- The arguments are as follows: @@ -31,7 +31,7 @@ The arguments are as follows: 5. **-T (--num_threads)** (default is to get_omp_num_procs()): The number of threads used for searching. Threads run in parallel and one thread handles one query at a time. More threads will result in higher aggregate query throughput, but will also use more IOs/second across the system, which may lead to higher per-query latency. So find the balance depending on the maximum number of IOPs supported by the SSD. 6. **-W (--beamwidth)** (default is 2): The beamwidth to be used for search. This is the maximum number of IO requests each query will issue per iteration of search code. Larger beamwidth will result in fewer IO round-trips per query, but might result in slightly higher total number of IO requests to SSD per query. For the highest query throughput with a fixed SSD IOps rating, use `W=1`. For best latency, use `W=4,8` or higher complexity search. Specifying 0 will optimize the beamwidth depending on the number of threads performing search, but will involve some tuning overhead. 7. **--query_file**: The queries to be searched on in same binary file format as the data file in arg (2) above. The query file must be the same type as argument (1). -8. **--gt_file**: The ground truth file for the queries in arg (7) and data file used in index construction. The binary file must start with *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` bytes. The groundtruth file, if not available, can be calculated using the program `tests/utils/compute_groundtruth`. Use "null" if you do not have this file and if you do not want to compute recall. +8. **--gt_file**: The ground truth file for the queries in arg (7) and data file used in index construction. The binary file must start with *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` bytes. The groundtruth file, if not available, can be calculated using the program `apps/utils/compute_groundtruth`. Use "null" if you do not have this file and if you do not want to compute recall. 9. **K**: search for *K* neighbors and measure *K*-recall@*K*, meaning the intersection between the retrieved top-*K* nearest neighbors and ground truth *K* nearest neighbors. 10. **result_output_prefix**: Search results will be stored in files with specified prefix, in bin format. 11. **-L (--search_list)**: A list of search_list sizes to perform search with. Larger parameters will result in slower latencies, but higher accuracies. Must be atleast the value of *K* in arg (9). @@ -48,16 +48,16 @@ mkdir -p DiskANN/build/data && cd DiskANN/build/data wget ftp://ftp.irisa.fr/local/texmex/corpus/sift.tar.gz tar -xf sift.tar.gz cd .. -./tests/utils/fvecs_to_bin float data/sift/sift_learn.fvecs data/sift/sift_learn.fbin -./tests/utils/fvecs_to_bin float data/sift/sift_query.fvecs data/sift/sift_query.fbin +./apps/utils/fvecs_to_bin float data/sift/sift_learn.fvecs data/sift/sift_learn.fbin +./apps/utils/fvecs_to_bin float data/sift/sift_query.fvecs data/sift/sift_query.fbin ``` Now build and search the index and measure the recall using ground truth computed using brutefoce. ```bash -./tests/utils/compute_groundtruth --data_type float --dist_fn l2 --base_file data/sift/sift_learn.fbin --query_file data/sift/sift_query.fbin --gt_file data/sift/sift_query_learn_gt100 --K 100 +./apps/utils/compute_groundtruth --data_type float --dist_fn l2 --base_file data/sift/sift_learn.fbin --query_file data/sift/sift_query.fbin --gt_file data/sift/sift_query_learn_gt100 --K 100 # Using 0.003GB search memory budget for 100K vectors implies 32 byte PQ compression -./tests/build_disk_index --data_type float --dist_fn l2 --data_path data/sift/sift_learn.fbin --index_path_prefix data/sift/disk_index_sift_learn_R32_L50_A1.2 -R 32 -L50 -B 0.003 -M 1 - ./tests/search_disk_index --data_type float --dist_fn l2 --index_path_prefix data/sift/disk_index_sift_learn_R32_L50_A1.2 --query_file data/sift/sift_query.fbin --gt_file data/sift/sift_query_learn_gt100 -K 10 -L 10 20 30 40 50 100 --result_path data/sift/res --num_nodes_to_cache 10000 +./apps/build_disk_index --data_type float --dist_fn l2 --data_path data/sift/sift_learn.fbin --index_path_prefix data/sift/disk_index_sift_learn_R32_L50_A1.2 -R 32 -L50 -B 0.003 -M 1 + ./apps/search_disk_index --data_type float --dist_fn l2 --index_path_prefix data/sift/disk_index_sift_learn_R32_L50_A1.2 --query_file data/sift/sift_query.fbin --gt_file data/sift/sift_query_learn_gt100 -K 10 -L 10 20 30 40 50 100 --result_path data/sift/res --num_nodes_to_cache 10000 ``` The search might be slower on machine with remote SSDs. The output lists the quer throughput, the mean and 99.9pc latency in microseconds and mean number of 4KB IOs to disk for each `L` parameter provided. diff --git a/workflows/dynamic_index.md b/workflows/dynamic_index.md index e5ad0f0d9..ca3bfbf68 100644 --- a/workflows/dynamic_index.md +++ b/workflows/dynamic_index.md @@ -9,20 +9,20 @@ While eager deletes can be supported by DiskANN, `lazy_deletes` are the preferre A sequence of lazy deletions must be followed by an invocation of the `consolidate_deletes` method that frees up slots in the index and edits the graph to maintain good recall. -The program `tests/test_insert_deletes_consolidate` demonstrates this functionality. It allows the user to specify which points from the data file will be used +The program `apps/test_insert_deletes_consolidate` demonstrates this functionality. It allows the user to specify which points from the data file will be used to initially build the index, which points will be deleted from the index, and which points will be inserted into the index. Insertions, searches and lazy deletions can be performed concurrently. Conslolidation of lazy deletes can be performed synchnronously or concurrently with insertions and deletions. When modifying the index sequentially, the user has the ability to take *snapshots*-- that is, save the index to memory for every *m* insertions or deletions instead of only at the end of the build. -The program `tests/test_streaming_scenario` simulates a scenario where the index actively maintains a sliding window of active points from a larger dataset. +The program `apps/test_streaming_scenario` simulates a scenario where the index actively maintains a sliding window of active points from a larger dataset. The program starts with an index build over the first `active_window` set of points from a data file. The program then simultaneously inserts newer points drawn from the file and deletes older points from the index in chunks of `consolidate_interval` points so that the number of active points in the index is approximately `active_window`. It terminates when the end of data file is reached, and the final index has `active_window + consolidate_interval` number of points. -`tests/test_insert_deletes_consolidate` to try inserting, lazy deletes and consolidate_delete +`apps/test_insert_deletes_consolidate` to try inserting, lazy deletes and consolidate_delete --------------------------------------------------------------------------------------------- The arguments are as follows: @@ -44,7 +44,7 @@ The arguments are as follows: 15. **--start_point_norm**: Set the starting node to a random point on a sphere of this radius. A reasonable choice is to set this to the average norm of the data set. Use when starting an index with zero points. 16. **--do_concurrent** (default false): whether to perform conslidate_deletes and other updates concurrently or sequentially. If concurrent is specified, half the threads are used for insertions and half the threads are used for processing deletes. Note that insertions are performed before deletions if this flag is set to false, so in this case is possible to delete more than beginning_index_size points. -`tests/test_streaming_scenario` to try inserting, lazy deletes and consolidate_delete +`apps/test_streaming_scenario` to try inserting, lazy deletes and consolidate_delete --------------------------------------------------------------------------------------------- The arguments are as follows: @@ -65,7 +65,7 @@ The arguments are as follows: -To search the generated index, use the `tests/search_memory_index` program: +To search the generated index, use the `apps/search_memory_index` program: --------------------------------------------------------------------------- @@ -76,7 +76,7 @@ The arguments are as follows: 3. **memory_index_path**: index built above in argument (4). 4. **T**: The number of threads used for searching. Threads run in parallel and one thread handles one query at a time. More threads will result in higher aggregate query throughput, but may lead to higher per-query latency, especially if the DRAM bandwidth is a bottleneck. So find the balance depending on throughput and latency required for your application. 5. **query_bin**: The queries to be searched on in same binary file format as the data file (ii) above. The query file must be the same type as in argument (1). -6. **truthset.bin**: The ground truth file for the queries in arg (7) and data file used in index construction. The binary file must start with *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` bytes. The groundtruth file, if not available, can be calculated using the program `tests/utils/compute_groundtruth`. Use "null" if you do not have this file and if you do not want to compute recall. +6. **truthset.bin**: The ground truth file for the queries in arg (7) and data file used in index construction. The binary file must start with *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` bytes. The groundtruth file, if not available, can be calculated using the program `apps/utils/compute_groundtruth`. Use "null" if you do not have this file and if you do not want to compute recall. 7. **K**: search for *K* neighbors and measure *K*-recall@*K*, meaning the intersection between the retrieved top-*K* nearest neighbors and ground truth *K* nearest neighbors. 8. **result_output_prefix**: search results will be stored in files, one per L value (see next arg), with specified prefix, in binary format. 9. **-L (--search_list)**: A list of search_list sizes to perform search with. Larger parameters will result in slower latencies, but higher accuracies. Must be at least the value of *K* in (7). @@ -95,8 +95,8 @@ mkdir -p DiskANN/build/data && cd DiskANN/build/data wget ftp://ftp.irisa.fr/local/texmex/corpus/sift.tar.gz tar -xf sift.tar.gz cd .. -./tests/utils/fvecs_to_bin float data/sift/sift_learn.fvecs data/sift/sift_learn.fbin -./tests/utils/fvecs_to_bin float data/sift/sift_query.fvecs data/sift/sift_query.fbin +./apps/utils/fvecs_to_bin float data/sift/sift_learn.fvecs data/sift/sift_learn.fbin +./apps/utils/fvecs_to_bin float data/sift/sift_query.fvecs data/sift/sift_query.fbin ``` The example below tests the following scenario: using a file with 100000 points, the index is incrementally constructed point by point. After the first 50000 ponts are inserted, another concurrent job deletes the first 25000 points from the index and consolidates the index (edit the graph and cleans up resources). At the same time an additional 25000 points (i.e. points 50001 to 75000) are concurrently inserted into the index. Note that the index should be built **before** calculating the ground truth, since the memory index returns the slice of the sift100K dataset that was used to build the final graph (that is, points 25001-75000 in the original index). @@ -115,15 +115,15 @@ thr=64 index=${index_prefix}.after-concurrent-delete-del${deletes}-${inserts} gt_file=data/sift/gt100_learn-conc-${deletes}-${inserts} - ~/DiskANN/build/tests/test_insert_deletes_consolidate --data_type ${type} --dist_fn l2 --data_path ${data} --index_path_prefix ${index_prefix} -R 64 -L 300 --alpha 1.2 -T ${thr} --points_to_skip 0 --max_points_to_insert ${inserts} --beginning_index_size ${begin} --points_per_checkpoint ${pts_per_checkpoint} --checkpoints_per_snapshot 0 --points_to_delete_from_beginning ${deletes} --start_deletes_after ${deletes_after} --do_concurrent true; + ~/DiskANN/build/apps/test_insert_deletes_consolidate --data_type ${type} --dist_fn l2 --data_path ${data} --index_path_prefix ${index_prefix} -R 64 -L 300 --alpha 1.2 -T ${thr} --points_to_skip 0 --max_points_to_insert ${inserts} --beginning_index_size ${begin} --points_per_checkpoint ${pts_per_checkpoint} --checkpoints_per_snapshot 0 --points_to_delete_from_beginning ${deletes} --start_deletes_after ${deletes_after} --do_concurrent true; - ~/DiskANN/build/tests/utils/compute_groundtruth --data_type ${type} --dist_fn l2 --base_file ${index}.data --query_file ${query} --K 100 --gt_file ${gt_file} --tags_file ${index}.tags + ~/DiskANN/build/apps/utils/compute_groundtruth --data_type ${type} --dist_fn l2 --base_file ${index}.data --query_file ${query} --K 100 --gt_file ${gt_file} --tags_file ${index}.tags -~/DiskANN/build/tests/search_memory_index --data_type ${type} --dist_fn l2 --index_path_prefix ${index} --result_path ${result} --query_file ${query} --gt_file ${gt_file} -K 10 -L 20 40 60 80 100 -T ${thr} --dynamic true --tags 1 +~/DiskANN/build/apps/search_memory_index --data_type ${type} --dist_fn l2 --index_path_prefix ${index} --result_path ${result} --query_file ${query} --gt_file ${gt_file} -K 10 -L 20 40 60 80 100 -T ${thr} --dynamic true --tags 1 ``` The example below tests the following scenario: using a file with 100000 points, insert 10000 points at a time. After the first 40000 -are inserted, start deleteing the first 10000 points while inserting points 40000--50000. Then delete points 10000--20000 while inserting +are inserted, start deleting the first 10000 points while inserting points 40000--50000. Then delete points 10000--20000 while inserting points 50000--60000 and so until the index is left with points 60000-100000. ``` @@ -140,7 +140,7 @@ cons_int=10000 index=${index_prefix}.after-streaming-act${active}-cons${cons_int}-max${inserts} gt=data/sift/gt100_learn-act${active}-cons${cons_int}-max${inserts} -./tests/test_streaming_scenario --data_type ${type} --dist_fn l2 --data_path ${data} --index_path_prefix ${index_prefix} -R 64 -L 600 --alpha 1.2 --insert_threads ${ins_thr} --consolidate_threads ${cons_thr} --max_points_to_insert ${inserts} --active_window ${active} --consolidate_interval ${cons_int} --start_point_norm 508; -./tests/utils/compute_groundtruth --data_type ${type} --dist_fn l2 --base_file ${index}.data --query_file ${query} --K 100 --gt_file ${gt} --tags_file ${index}.tags -./tests/search_memory_index --data_type ${type} --dist_fn l2 --index_path_prefix ${index} --result_path ${result} --query_file ${query} --gt_file ${gt} -K 10 -L 20 40 60 80 100 -T 64 --dynamic true --tags 1 +./apps/test_streaming_scenario --data_type ${type} --dist_fn l2 --data_path ${data} --index_path_prefix ${index_prefix} -R 64 -L 600 --alpha 1.2 --insert_threads ${ins_thr} --consolidate_threads ${cons_thr} --max_points_to_insert ${inserts} --active_window ${active} --consolidate_interval ${cons_int} --start_point_norm 508; +./apps/utils/compute_groundtruth --data_type ${type} --dist_fn l2 --base_file ${index}.data --query_file ${query} --K 100 --gt_file ${gt} --tags_file ${index}.tags +./apps/search_memory_index --data_type ${type} --dist_fn l2 --index_path_prefix ${index} --result_path ${result} --query_file ${query} --gt_file ${gt} -K 10 -L 20 40 60 80 100 -T 64 --dynamic true --tags 1 ``` \ No newline at end of file diff --git a/workflows/filtered_in_memory.md b/workflows/filtered_in_memory.md index c3b652685..fe34b80f8 100644 --- a/workflows/filtered_in_memory.md +++ b/workflows/filtered_in_memory.md @@ -1,7 +1,7 @@ **Usage for filtered indices** ================================ ## Building a filtered Index -DiskANN provides two algorithms for building an index with filters support: filtered-vamana and stitched-vamana. Here, we describe the parameters for building both. `tests/build_memory_index.cpp` and `tests/build_stitched_index.cpp` are respectively used to build each kind of index. +DiskANN provides two algorithms for building an index with filters support: filtered-vamana and stitched-vamana. Here, we describe the parameters for building both. `apps/build_memory_index.cpp` and `apps/build_stitched_index.cpp` are respectively used to build each kind of index. ### 1. filtered-vamana @@ -32,7 +32,7 @@ DiskANN provides two algorithms for building an index with filters support: filt 10. **`--Stitched_R`**: Once all sub-indices are "stitched" together, we prune the resulting graph down to the degree given by this parameter. ## Computing a groundtruth file for a filtered index -In order to evaluate the performance of our algorithms, we can compare its results (i.e. the top `k` neighbors found for each query) against the results found by an exact nearest neighbor search. We provide the program `tests/utils/compute_groundtruth.cpp` to provide the results for the latter: +In order to evaluate the performance of our algorithms, we can compare its results (i.e. the top `k` neighbors found for each query) against the results found by an exact nearest neighbor search. We provide the program `apps/utils/compute_groundtruth.cpp` to provide the results for the latter: 1. **`--data_type`** The type of dataset you built an index with. float(32 bit), signed int8 and unsigned uint8 are supported. 2. **`--dist_fn`**: There are two distance functions supported: l2 and mips. @@ -48,7 +48,7 @@ In order to evaluate the performance of our algorithms, we can compare its resul ## Searching a Filtered Index -Searching a filtered index uses the `tests/search_memory_index.cpp`: +Searching a filtered index uses the `apps/search_memory_index.cpp`: 1. **`--data_type`**: The type of dataset you built the index on. float(32 bit), signed int8 and unsigned uint8 are supported. Use the same data type as in arg (1) above used in building the index. 2. **`--dist_fn`**: There are two distance functions supported: l2 and mips. There is an additional *fast_l2* implementation that could provide faster results for small (about a million-sized) indices. Use the same distance as in arg (2) above used in building the index. Note that stitched-vamana only supports l2. @@ -64,23 +64,23 @@ Searching a filtered index uses the `tests/search_memory_index.cpp`: Example with SIFT10K: -------------------- We demonstrate how to work through this pipeline using the SIFT10K dataset (http://corpus-texmex.irisa.fr/). Before starting, make sure you have compiled diskANN according to the instructions in the README and can see the following binaries (paths with respect to repository root): -- `build/tests/utils/compute_groundtruth` -- `build/tests/utils/fvecs_to_bin` -- `build/tests/build_memory_index` -- `build/tests/build_stitched_index` -- `build/tests/search_memory_index` +- `build/apps/utils/compute_groundtruth` +- `build/apps/utils/fvecs_to_bin` +- `build/apps/build_memory_index` +- `build/apps/build_stitched_index` +- `build/apps/search_memory_index` Now, download the base and query set and convert the data to binary format: ```bash wget ftp://ftp.irisa.fr/local/texmex/corpus/siftsmall.tar.gz tar -zxvf siftsmall.tar.gz -build/tests/utils/fvecs_to_bin float siftsmall/siftsmall_base.fvecs siftsmall/siftsmall_base.bin -build/tests/utils/fvecs_to_bin float siftsmall/siftsmall_query.fvecs siftsmall/siftsmall_query.bin +build/apps/utils/fvecs_to_bin float siftsmall/siftsmall_base.fvecs siftsmall/siftsmall_base.bin +build/apps/utils/fvecs_to_bin float siftsmall/siftsmall_query.fvecs siftsmall/siftsmall_query.bin ``` We now need to make label file for our vectors. For convenience, we've included a synthetic label generator through which we can generate label file as follow ```bash - build/tests/utils/generate_synthetic_labels --num_labels 50 --num_points 10000 --output_file ./rand_labels_50_10K.txt --distribution_type zipf + build/apps/utils/generate_synthetic_labels --num_labels 50 --num_points 10000 --output_file ./rand_labels_50_10K.txt --distribution_type zipf ``` Note : `distribution_type` can be `rand` or `zipf` @@ -88,18 +88,18 @@ This will genearate label file with 10000 data points with 50 distinct labels, r Label count for each unique label in the generated label file can be printed with help of following command ```bash - build/tests/utils/stats_label_data.exe --labels_file ./rand_labels_50_10K.txt --universal_label 0 + build/apps/utils/stats_label_data.exe --labels_file ./rand_labels_50_10K.txt --universal_label 0 ``` Note that neither approach is designed for use with random synthetic labels, which will lead to unpredictable accuracy at search time. Now build and search the index and measure the recall using ground truth computed using bruteforce. We search for results with the filter 35. ```bash -build/tests/utils/compute_groundtruth --data_type float --dist_fn l2 --base_file siftsmall/siftsmall_base.bin --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall/siftsmall_gt_35.bin --K 100 --label_file ./rand_labels_50_10K.txt --filter_label 35 --universal_label 0 -build/tests/build_memory_index --data_type float --dist_fn l2 --data_path siftsmall/siftsmall_base.bin --index_path_prefix siftsmall/siftsmall_R32_L50_filtered_index -R 32 --FilteredLbuild 50 --alpha 1.2 --label_file ./rand_labels_50_10K.txt --universal_label 0 -build/tests/build_stitched_index --data_type float --data_path siftsmall/siftsmall_base.bin --index_path_prefix siftsmall/siftsmall_R20_L40_SR32_stitched_index -R 20 -L 40 --stitched_R 32 --alpha 1.2 --label_file ./rand_labels_50_10K.txt --universal_label 0 -build/tests/search_memory_index --data_type float --dist_fn l2 --index_path_prefix data/sift/siftsmall_R20_L40_SR32_filtered_index --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall/siftsmall_gt_35.bin --filter_label 35 -K 10 -L 10 20 30 40 50 100 --result_path siftsmall/filtered_search_results -build/tests/search_memory_index --data_type float --dist_fn l2 --index_path_prefix data/sift/siftsmall_R20_L40_SR32_stitched_index --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall/siftsmall_gt_35.bin --filter_label 35 -K 10 -L 10 20 30 40 50 100 --result_path siftsmall/stitched_search_results +build/apps/utils/compute_groundtruth --data_type float --dist_fn l2 --base_file siftsmall/siftsmall_base.bin --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall/siftsmall_gt_35.bin --K 100 --label_file ./rand_labels_50_10K.txt --filter_label 35 --universal_label 0 +build/apps/build_memory_index --data_type float --dist_fn l2 --data_path siftsmall/siftsmall_base.bin --index_path_prefix siftsmall/siftsmall_R32_L50_filtered_index -R 32 --FilteredLbuild 50 --alpha 1.2 --label_file ./rand_labels_50_10K.txt --universal_label 0 +build/apps/build_stitched_index --data_type float --data_path siftsmall/siftsmall_base.bin --index_path_prefix siftsmall/siftsmall_R20_L40_SR32_stitched_index -R 20 -L 40 --stitched_R 32 --alpha 1.2 --label_file ./rand_labels_50_10K.txt --universal_label 0 +build/apps/search_memory_index --data_type float --dist_fn l2 --index_path_prefix data/sift/siftsmall_R20_L40_SR32_filtered_index --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall/siftsmall_gt_35.bin --filter_label 35 -K 10 -L 10 20 30 40 50 100 --result_path siftsmall/filtered_search_results +build/apps/search_memory_index --data_type float --dist_fn l2 --index_path_prefix data/sift/siftsmall_R20_L40_SR32_stitched_index --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall/siftsmall_gt_35.bin --filter_label 35 -K 10 -L 10 20 30 40 50 100 --result_path siftsmall/stitched_search_results ``` The output of both searches is listed below. The throughput (Queries/sec) as well as mean and 99.9 latency in microseconds for each `L` parameter provided. (Measured on a physical machine with a Intel(R) Xeon(R) W-2145 CPU and 64 GB RAM) diff --git a/workflows/filtered_ssd_index.md b/workflows/filtered_ssd_index.md index 1b602985e..272100e6d 100644 --- a/workflows/filtered_ssd_index.md +++ b/workflows/filtered_ssd_index.md @@ -1,7 +1,7 @@ **Usage for filtered indices** ================================ -To generate an SSD-friendly index, use the `tests/build_disk_index` program. +To generate an SSD-friendly index, use the `apps/build_disk_index` program. ---------------------------------------------------------------------------- ## Building a SSD based filtered Index @@ -27,7 +27,7 @@ To generate an SSD-friendly index, use the `tests/build_disk_index` program. ## Computing a groundtruth file for a filtered index -In order to evaluate the performance of our algorithms, we can compare its results (i.e. the top `k` neighbors found for each query) against the results found by an exact nearest neighbor search. We provide the program `tests/utils/compute_groundtruth.cpp` to provide the results for the latter: +In order to evaluate the performance of our algorithms, we can compare its results (i.e. the top `k` neighbors found for each query) against the results found by an exact nearest neighbor search. We provide the program `apps/utils/compute_groundtruth.cpp` to provide the results for the latter: 1. **`--data_type`** The type of dataset you built an index with. float(32 bit), signed int8 and unsigned uint8 are supported. 2. **`--dist_fn`**: There are two distance functions supported: l2 and mips. @@ -41,7 +41,7 @@ In order to evaluate the performance of our algorithms, we can compare its resul ## Searching a Filtered Index -Searching a filtered index uses the `tests/search_disk_index.cpp`: +Searching a filtered index uses the `apps/search_disk_index.cpp`: 1. **--data_type**: The type of dataset you wish to build an index on. float(32 bit), signed int8 and unsigned uint8 are supported. Use the same data type as in arg (1) above used in building the index. 2. **--dist_fn**: There are two distance functions supported: minimum Euclidean distance (l2) and maximum inner product (mips). Use the same distance as in arg (2) above used in building the index. @@ -50,7 +50,7 @@ Searching a filtered index uses the `tests/search_disk_index.cpp`: 5. **-T (--num_threads)** (default is to get_omp_num_procs()): The number of threads used for searching. Threads run in parallel and one thread handles one query at a time. More threads will result in higher aggregate query throughput, but will also use more IOs/second across the system, which may lead to higher per-query latency. So find the balance depending on the maximum number of IOPs supported by the SSD. 6. **-W (--beamwidth)** (default is 2): The beamwidth to be used for search. This is the maximum number of IO requests each query will issue per iteration of search code. Larger beamwidth will result in fewer IO round-trips per query, but might result in slightly higher total number of IO requests to SSD per query. For the highest query throughput with a fixed SSD IOps rating, use `W=1`. For best latency, use `W=4,8` or higher complexity search. Specifying 0 will optimize the beamwidth depending on the number of threads performing search, but will involve some tuning overhead. 7. **--query_file**: The queries to be searched on in same binary file format as the data file in arg (2) above. The query file must be the same type as argument (1). -8. **--gt_file**: The ground truth file for the queries in arg (7) and data file used in index construction. The binary file must start with *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` bytes. The groundtruth file, if not available, can be calculated using the program `tests/utils/compute_groundtruth`. Use "null" if you do not have this file and if you do not want to compute recall. +8. **--gt_file**: The ground truth file for the queries in arg (7) and data file used in index construction. The binary file must start with *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` bytes. The groundtruth file, if not available, can be calculated using the program `apps/utils/compute_groundtruth`. Use "null" if you do not have this file and if you do not want to compute recall. 9. **-K**: search for *K* neighbors and measure *K*-recall@*K*, meaning the intersection between the retrieved top-*K* nearest neighbors and ground truth *K* nearest neighbors. 10. **--result_path**: Search results will be stored in files with specified prefix, in bin format. 11. **-L (--search_list)**: A list of search_list sizes to perform search with. Larger parameters will result in slower latencies, but higher accuracies. Must be atleast the value of *K* in arg (9). @@ -60,22 +60,22 @@ Searching a filtered index uses the `tests/search_disk_index.cpp`: Example with SIFT10K: -------------------- We demonstrate how to work through this pipeline using the SIFT10K dataset (http://corpus-texmex.irisa.fr/). Before starting, make sure you have compiled diskANN according to the instructions in the README and can see the following binaries (paths with respect to repository root): -- `build/tests/utils/compute_groundtruth` -- `build/tests/utils/fvecs_to_bin` -- `build/tests/build_disk_index` -- `build/tests/search_disk_index` +- `build/apps/utils/compute_groundtruth` +- `build/apps/utils/fvecs_to_bin` +- `build/apps/build_disk_index` +- `build/apps/search_disk_index` Now, download the base and query set and convert the data to binary format: ```bash wget ftp://ftp.irisa.fr/local/texmex/corpus/siftsmall.tar.gz tar -zxvf siftsmall.tar.gz -build/tests/utils/fvecs_to_bin float siftsmall/siftsmall_base.fvecs siftsmall/siftsmall_base.bin -build/tests/utils/fvecs_to_bin float siftsmall/siftsmall_query.fvecs siftsmall/siftsmall_query.bin +build/apps/utils/fvecs_to_bin float siftsmall/siftsmall_base.fvecs siftsmall/siftsmall_base.bin +build/apps/utils/fvecs_to_bin float siftsmall/siftsmall_query.fvecs siftsmall/siftsmall_query.bin ``` We now need to make label file for our vectors. For convenience, we've included a synthetic label generator through which we can generate label file as follow ```bash - build/tests/utils/generate_synthetic_labels --num_labels 50 --num_points 10000 --output_file ./rand_labels_50_10K.txt --distribution_type zipf + build/apps/utils/generate_synthetic_labels --num_labels 50 --num_points 10000 --output_file ./rand_labels_50_10K.txt --distribution_type zipf ``` Note : `distribution_type` can be `rand` or `zipf` @@ -83,9 +83,9 @@ This will genearate label file with 10000 data points with 50 distinct labels, r Now build and search the index and measure the recall using ground truth computed using bruteforce. We search for results with the filter 35. ```bash -build/tests/utils/compute_groundtruth --data_type float --dist_fn l2 --base_file siftsmall/siftsmall_base.bin --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall_gt_35.bin --K 100 --label_file rand_labels_50_10K.txt --filter_label 35 --universal_label 0 -build/tests/build_disk_index --data_type float --dist_fn l2 --data_path siftsmall/siftsmall_base.bin --index_path_prefix data/sift/siftsmall_R32_L50_filtered -R 32 --FilteredLbuild 50 -B 1 -M 1 --label_file rand_labels_50_10K.txt --universal_label 0 -F 0 -build/tests/search_disk_index --data_type float --dist_fn l2 --index_path_prefix data/sift/siftsmall_R32_L50_filtered --result_path siftsmall/search_35 --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall_gt_35.bin -K 10 -L 10 20 30 40 50 100 --filter_label 35 -W 4 -T 8 +build/apps/utils/compute_groundtruth --data_type float --dist_fn l2 --base_file siftsmall/siftsmall_base.bin --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall_gt_35.bin --K 100 --label_file rand_labels_50_10K.txt --filter_label 35 --universal_label 0 +build/apps/build_disk_index --data_type float --dist_fn l2 --data_path siftsmall/siftsmall_base.bin --index_path_prefix data/sift/siftsmall_R32_L50_filtered -R 32 --FilteredLbuild 50 -B 1 -M 1 --label_file rand_labels_50_10K.txt --universal_label 0 -F 0 +build/apps/search_disk_index --data_type float --dist_fn l2 --index_path_prefix data/sift/siftsmall_R32_L50_filtered --result_path siftsmall/search_35 --query_file siftsmall/siftsmall_query.bin --gt_file siftsmall_gt_35.bin -K 10 -L 10 20 30 40 50 100 --filter_label 35 -W 4 -T 8 ``` The output of both searches is listed below. The throughput (Queries/sec) as well as mean and 99.9 latency in microseconds for each `L` parameter provided. (Measured on a physical machine with a 11th Gen Intel(R) Core(TM) i7-1185G7 CPU and 32 GB RAM) diff --git a/workflows/in_memory_index.md b/workflows/in_memory_index.md index cc59a2c91..6d783204a 100644 --- a/workflows/in_memory_index.md +++ b/workflows/in_memory_index.md @@ -1,7 +1,7 @@ **Usage for in-memory indices** ================================ -To generate index, use the `tests/build_memory_index` program. +To generate index, use the `apps/build_memory_index` program. -------------------------------------------------------------- The arguments are as follows: @@ -18,7 +18,7 @@ The arguments are as follows: 10.**--use_opq**: use the flag to use OPQ rather than PQ compression. OPQ is more space efficient for some high dimensional datasets, but also needs a bit more build time. -To search the generated index, use the `tests/search_memory_index` program: +To search the generated index, use the `apps/search_memory_index` program: --------------------------------------------------------------------------- @@ -29,7 +29,7 @@ The arguments are as follows: 3. **memory_index_path**: index built above in argument (4). 4. **T**: The number of threads used for searching. Threads run in parallel and one thread handles one query at a time. More threads will result in higher aggregate query throughput, but may lead to higher per-query latency, especially if the DRAM bandwidth is a bottleneck. So find the balance depending on throughput and latency required for your application. 5. **query_bin**: The queries to be searched on in same binary file format as the data file (ii) above. The query file must be the same type as in argument (1). -6. **truthset.bin**: The ground truth file for the queries in arg (7) and data file used in index construction. The binary file must start with *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` bytes. The groundtruth file, if not available, can be calculated using the program `tests/utils/compute_groundtruth`. Use "null" if you do not have this file and if you do not want to compute recall. +6. **truthset.bin**: The ground truth file for the queries in arg (7) and data file used in index construction. The binary file must start with *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` bytes. The groundtruth file, if not available, can be calculated using the program `apps/utils/compute_groundtruth`. Use "null" if you do not have this file and if you do not want to compute recall. 7. **K**: search for *K* neighbors and measure *K*-recall@*K*, meaning the intersection between the retrieved top-*K* nearest neighbors and ground truth *K* nearest neighbors. 8. **result_output_prefix**: search results will be stored in files, one per L value (see next arg), with specified prefix, in binary format. 9. **-L (--search_list)**: A list of search_list sizes to perform search with. Larger parameters will result in slower latencies, but higher accuracies. Must be atleast the value of *K* in (7). @@ -46,15 +46,15 @@ mkdir -p DiskANN/build/data && cd DiskANN/build/data wget ftp://ftp.irisa.fr/local/texmex/corpus/sift.tar.gz tar -xf sift.tar.gz cd .. -./tests/utils/fvecs_to_bin float data/sift/sift_learn.fvecs data/sift/sift_learn.fbin -./tests/utils/fvecs_to_bin float data/sift/sift_query.fvecs data/sift/sift_query.fbin +./apps/utils/fvecs_to_bin float data/sift/sift_learn.fvecs data/sift/sift_learn.fbin +./apps/utils/fvecs_to_bin float data/sift/sift_query.fvecs data/sift/sift_query.fbin ``` Now build and search the index and measure the recall using ground truth computed using brutefoce. ```bash -./tests/utils/compute_groundtruth --data_type float --dist_fn l2 --base_file data/sift/sift_learn.fbin --query_file data/sift/sift_query.fbin --gt_file data/sift/sift_query_learn_gt100 --K 100 -./tests/build_memory_index --data_type float --dist_fn l2 --data_path data/sift/sift_learn.fbin --index_path_prefix data/sift/index_sift_learn_R32_L50_A1.2 -R 32 -L 50 --alpha 1.2 - ./tests/search_memory_index --data_type float --dist_fn l2 --index_path_prefix data/sift/index_sift_learn_R32_L50_A1.2 --query_file data/sift/sift_query.fbin --gt_file data/sift/sift_query_learn_gt100 -K 10 -L 10 20 30 40 50 100 --result_path data/sift/res +./apps/utils/compute_groundtruth --data_type float --dist_fn l2 --base_file data/sift/sift_learn.fbin --query_file data/sift/sift_query.fbin --gt_file data/sift/sift_query_learn_gt100 --K 100 +./apps/build_memory_index --data_type float --dist_fn l2 --data_path data/sift/sift_learn.fbin --index_path_prefix data/sift/index_sift_learn_R32_L50_A1.2 -R 32 -L 50 --alpha 1.2 + ./apps/search_memory_index --data_type float --dist_fn l2 --index_path_prefix data/sift/index_sift_learn_R32_L50_A1.2 --query_file data/sift/sift_query.fbin --gt_file data/sift/sift_query_learn_gt100 -K 10 -L 10 20 30 40 50 100 --result_path data/sift/res ``` diff --git a/workflows/rest_api.md b/workflows/rest_api.md index bae965996..2a88d721d 100644 --- a/workflows/rest_api.md +++ b/workflows/rest_api.md @@ -20,10 +20,10 @@ Follow the instructions for [building an in-memory DiskANN index](/workflows/in_ ```bash # To start serving an in-memory index -./tests/restapi/inmem_server --address --data_type --data_file --index_path_prefix --num_threads --l_search --tags_file [tags_file] +./apps/restapi/inmem_server --address --data_type --data_file --index_path_prefix --num_threads --l_search --tags_file [tags_file] # To start serving an SSD-based index. -./tests/restapi/ssd_server --address --data_type --index_path_prefix --num_nodes_to_cache --num_threads --tags_file [tags_file] +./apps/restapi/ssd_server --address --data_type --index_path_prefix --num_nodes_to_cache --num_threads --tags_file [tags_file] ``` The `data_type` and the `data_file` should be the same as those used in the construction of the index. The server returns the ids and distances of the closests vector in the index to the query. The ids are implicitly defined by the order of the vector in the data file. If you wish to assign a different numbering or GUID or URL to the vectors in the index, use the optional `tags_file`. This should be a file which lists a "tag" string for each vector in the index. The file should contain one string per line. The string on the line `n` is considered the tag corresponding to the vector `n` in the index (in the implicit order defined in the `data_file`). From daa5a7bb62aee53beb97e48542537195d38dafd6 Mon Sep 17 00:00:00 2001 From: Jerry Gao <109158931+Sanhaoji2@users.noreply.github.com> Date: Sun, 8 Oct 2023 15:43:25 +0800 Subject: [PATCH 35/61] Jegao/label hot fix test2 (#469) * read label in one file * test commit * fix last label issue * remove get label number * fix some issue --- include/pq_flash_index.h | 3 +- src/pq_flash_index.cpp | 136 +++++++++++++++++++++++---------------- 2 files changed, 83 insertions(+), 56 deletions(-) diff --git a/include/pq_flash_index.h b/include/pq_flash_index.h index ba76cd47e..d333d0e7c 100644 --- a/include/pq_flash_index.h +++ b/include/pq_flash_index.h @@ -107,7 +107,8 @@ template class PQFlashIndex DISKANN_DLLEXPORT inline bool point_has_label(uint32_t point_id, uint32_t label_id); std::unordered_map load_label_map(const std::string &map_file); DISKANN_DLLEXPORT void parse_label_file(const std::string &map_file, size_t &num_pts_labels); - DISKANN_DLLEXPORT void get_label_file_metadata(std::string map_file, uint32_t &num_pts, uint32_t &num_total_labels); + DISKANN_DLLEXPORT void get_label_file_metadata(const std::string &fileContent, uint32_t &num_pts, + uint32_t &num_total_labels); DISKANN_DLLEXPORT inline int32_t get_filter_number(const LabelT &filter_label); DISKANN_DLLEXPORT void generate_random_labels(std::vector &labels, const uint32_t num_labels, const uint32_t nthreads); diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index 943fed44c..b74c96257 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -578,30 +578,50 @@ LabelT PQFlashIndex::get_converted_label(const std::string &filter_la } } + +// test commit template -void PQFlashIndex::get_label_file_metadata(std::string map_file, uint32_t &num_pts, +void PQFlashIndex::get_label_file_metadata(const std::string &fileContent, uint32_t &num_pts, uint32_t &num_total_labels) { - std::ifstream infile(map_file); - std::string line, token; num_pts = 0; num_total_labels = 0; - while (std::getline(infile, line)) + size_t file_size = fileContent.length(); + + std::string label_str; + size_t cur_pos = 0; + size_t next_pos = 0; + while (cur_pos < file_size && cur_pos != std::string::npos) { - std::istringstream iss(line); - while (getline(iss, token, ',')) + next_pos = fileContent.find('\n', cur_pos); + if (next_pos == std::string::npos) { - token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); - token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); + break; + } + + size_t lbl_pos = cur_pos; + size_t next_lbl_pos = 0; + while (lbl_pos < next_pos && lbl_pos != std::string::npos) + { + next_lbl_pos = fileContent.find(',', lbl_pos); + if (next_lbl_pos == std::string::npos) // the last label + { + next_lbl_pos = next_pos; + } + num_total_labels++; + + lbl_pos = next_lbl_pos + 1; } + + cur_pos = next_pos + 1; + num_pts++; } diskann::cout << "Labels file metadata: num_points: " << num_pts << ", #total_labels: " << num_total_labels << std::endl; - infile.close(); } template @@ -624,77 +644,98 @@ inline bool PQFlashIndex::point_has_label(uint32_t point_id, uint32_t template void PQFlashIndex::parse_label_file(const std::string &label_file, size_t &num_points_labels) { - std::ifstream infile(label_file); + std::ifstream infile(label_file, std::ios::binary); if (infile.fail()) { throw diskann::ANNException(std::string("Failed to open file ") + label_file, -1); } + infile.seekg(0, std::ios::end); + size_t file_size = infile.tellg(); + + std::string buffer(file_size, ' '); + + infile.seekg(0, std::ios::beg); + infile.read(&buffer[0], file_size); + infile.close(); - std::string line, token; uint32_t line_cnt = 0; uint32_t num_pts_in_label_file; uint32_t num_total_labels; - get_label_file_metadata(label_file, num_pts_in_label_file, num_total_labels); + get_label_file_metadata(buffer, num_pts_in_label_file, num_total_labels); _pts_to_label_offsets = new uint32_t[num_pts_in_label_file]; _pts_to_labels = new uint32_t[num_pts_in_label_file + num_total_labels]; uint32_t counter = 0; - while (std::getline(infile, line)) + std::string label_str; + size_t cur_pos = 0; + size_t next_pos = 0; + while (cur_pos < file_size && cur_pos != std::string::npos) { - std::istringstream iss(line); - std::vector lbls(0); + next_pos = buffer.find('\n', cur_pos); + if (next_pos == std::string::npos) + { + break; + } _pts_to_label_offsets[line_cnt] = counter; uint32_t &num_lbls_in_cur_pt = _pts_to_labels[counter]; num_lbls_in_cur_pt = 0; counter++; - getline(iss, token, '\t'); - std::istringstream new_iss(token); - while (getline(new_iss, token, ',')) + + size_t lbl_pos = cur_pos; + size_t next_lbl_pos = 0; + while (lbl_pos < next_pos && lbl_pos != std::string::npos) { - token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); - token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); - LabelT token_as_num = (LabelT)std::stoul(token); - if (_labels.find(token_as_num) == _labels.end()) + next_lbl_pos = buffer.find(',', lbl_pos); + if (next_lbl_pos == std::string::npos) // the last label in the whole file { - _filter_list.emplace_back(token_as_num); + next_lbl_pos = next_pos; } - int32_t filter_num = get_filter_number(token_as_num); - if (filter_num == -1) + + if (next_lbl_pos > next_pos) // the last label in one line + { + next_lbl_pos = next_pos; + } + + label_str.assign(buffer.c_str() + lbl_pos, next_lbl_pos - lbl_pos); + if (label_str[label_str.length() - 1] == '\t') + { + label_str.erase(label_str.length() - 1); + } + + LabelT token_as_num = (LabelT)std::stoul(label_str); + if (_labels.find(token_as_num) == _labels.end()) { - diskann::cout << "Error!! " << std::endl; - exit(-1); + _filter_list.emplace_back(token_as_num); } - _pts_to_labels[counter++] = filter_num; + + _pts_to_labels[counter++] = token_as_num; num_lbls_in_cur_pt++; _labels.insert(token_as_num); + + lbl_pos = next_lbl_pos + 1; } + cur_pos = next_pos + 1; + if (num_lbls_in_cur_pt == 0) { diskann::cout << "No label found for point " << line_cnt << std::endl; exit(-1); } + line_cnt++; } - infile.close(); + num_points_labels = line_cnt; } template void PQFlashIndex::set_universal_label(const LabelT &label) { - int32_t temp_filter_num = get_filter_number(label); - if (temp_filter_num == -1) - { - diskann::cout << "Error, could not find universal label." << std::endl; - } - else - { - _use_universal_label = true; - _universal_filter_num = (uint32_t)temp_filter_num; - } + _use_universal_label = true; + _universal_filter_num = (uint32_t)label; } #ifdef EXEC_ENV_OLS @@ -1150,22 +1191,7 @@ void PQFlashIndex::cached_beam_search(const T *query1, const uint64_t const uint32_t io_limit, const bool use_reorder_data, QueryStats *stats) { - int32_t filter_num = 0; - if (use_filter) - { - filter_num = get_filter_number(filter_label); - if (filter_num < 0) - { - if (!_use_universal_label) - { - return; - } - else - { - filter_num = _universal_filter_num; - } - } - } + int32_t filter_num = filter_label; if (beam_width > MAX_N_SECTOR_READS) throw ANNException("Beamwidth can not be higher than MAX_N_SECTOR_READS", -1, __FUNCSIG__, __FILE__, __LINE__); From 155f7bd68263f5609ec8215e7af58b99d7744965 Mon Sep 17 00:00:00 2001 From: Jerry Gao <109158931+Sanhaoji2@users.noreply.github.com> Date: Thu, 19 Oct 2023 14:24:01 +0800 Subject: [PATCH 36/61] add label check API (#476) * add label check API * fix some issue --- include/index.h | 2 ++ include/pq_flash_index.h | 2 ++ src/index.cpp | 11 +++++++++++ src/pq_flash_index.cpp | 10 ++++++++++ 4 files changed, 25 insertions(+) diff --git a/include/index.h b/include/index.h index 7c38db00e..45d185d11 100644 --- a/include/index.h +++ b/include/index.h @@ -227,6 +227,8 @@ template clas // Get converted integer label from string to int map (_label_map) DISKANN_DLLEXPORT LabelT get_converted_label(const std::string &raw_label); + DISKANN_DLLEXPORT bool is_label_valid(const std::string& raw_label); + // Set starting point of an index before inserting any points incrementally. // The data count should be equal to _num_frozen_pts * _aligned_dim. DISKANN_DLLEXPORT void set_start_points(const T *data, size_t data_count); diff --git a/include/pq_flash_index.h b/include/pq_flash_index.h index d333d0e7c..e563a75ee 100644 --- a/include/pq_flash_index.h +++ b/include/pq_flash_index.h @@ -86,6 +86,8 @@ template class PQFlashIndex DISKANN_DLLEXPORT LabelT get_converted_label(const std::string &filter_label); + DISKANN_DLLEXPORT bool is_label_valid(const std::string& filter_label); + DISKANN_DLLEXPORT uint32_t range_search(const T *query1, const double range, const uint64_t min_l_search, const uint64_t max_l_search, std::vector &indices, std::vector &distances, const uint64_t min_beam_width, diff --git a/src/index.cpp b/src/index.cpp index ef35c6912..268edd76a 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2022,6 +2022,17 @@ LabelT Index::get_converted_label(const std::string &raw_label) } } +template +bool Index::is_label_valid(const std::string& raw_label) +{ + if (_label_map.find(raw_label) != _label_map.end()) + { + return true; + } + + return false; +} + template void Index::parse_label_file(const std::string &label_file, size_t &num_points) { diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index b74c96257..9854a7b9b 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -578,6 +578,16 @@ LabelT PQFlashIndex::get_converted_label(const std::string &filter_la } } +template +bool PQFlashIndex::is_label_valid(const std::string& filter_label) +{ + if (_label_map.find(filter_label) != _label_map.end()) + { + return true; + } + + return false; +} // test commit template From 337d0d5a3f4ba075c30f204860acab2355ff22fd Mon Sep 17 00:00:00 2001 From: Jerry Gao <109158931+Sanhaoji2@users.noreply.github.com> Date: Thu, 9 Nov 2023 17:13:18 +0800 Subject: [PATCH 37/61] Fix parse issue while only one label in node (#488) --- include/pq_flash_index.h | 1 + src/pq_flash_index.cpp | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/include/pq_flash_index.h b/include/pq_flash_index.h index e563a75ee..6f210b20d 100644 --- a/include/pq_flash_index.h +++ b/include/pq_flash_index.h @@ -115,6 +115,7 @@ template class PQFlashIndex DISKANN_DLLEXPORT void generate_random_labels(std::vector &labels, const uint32_t num_labels, const uint32_t nthreads); + size_t search_string_range(const std::string& str, char ch, size_t start, size_t end); // index info // nhood of node `i` is in sector: [i / nnodes_per_sector] // offset in sector: [(i % nnodes_per_sector) * max_node_len] diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index 9854a7b9b..592f2d8b3 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -614,7 +614,7 @@ void PQFlashIndex::get_label_file_metadata(const std::string &fileCon size_t next_lbl_pos = 0; while (lbl_pos < next_pos && lbl_pos != std::string::npos) { - next_lbl_pos = fileContent.find(',', lbl_pos); + next_lbl_pos = search_string_range(fileContent, ',', lbl_pos, next_pos); if (next_lbl_pos == std::string::npos) // the last label { next_lbl_pos = next_pos; @@ -698,7 +698,7 @@ void PQFlashIndex::parse_label_file(const std::string &label_file, si size_t next_lbl_pos = 0; while (lbl_pos < next_pos && lbl_pos != std::string::npos) { - next_lbl_pos = buffer.find(',', lbl_pos); + next_lbl_pos = search_string_range(buffer, ',', lbl_pos, next_pos); if (next_lbl_pos == std::string::npos) // the last label in the whole file { next_lbl_pos = next_pos; @@ -1673,6 +1673,20 @@ template diskann::Metric PQFlashIndex:: return this->metric; } +template +size_t PQFlashIndex::search_string_range(const std::string& str, char ch, size_t start, size_t end) +{ + for (; start != end; start++) + { + if (str[start] == ch) + { + return start; + } + } + + return std::string::npos; +} + #ifdef EXEC_ENV_OLS template char *PQFlashIndex::getHeaderBytes() { From 9bb0cf05b662f3ec7117ddaefa38120d0289cd3f Mon Sep 17 00:00:00 2001 From: Jerry Gao <109158931+Sanhaoji2@users.noreply.github.com> Date: Thu, 30 Nov 2023 18:03:43 +0800 Subject: [PATCH 38/61] Fix memory leak (#497) --- include/abstract_data_store.h | 2 +- include/abstract_graph_store.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/abstract_data_store.h b/include/abstract_data_store.h index 976174378..d858c8eef 100644 --- a/include/abstract_data_store.h +++ b/include/abstract_data_store.h @@ -18,7 +18,7 @@ template class AbstractDataStore public: AbstractDataStore(const location_t capacity, const size_t dim); - // virtual ~AbstractDataStore() = default; + virtual ~AbstractDataStore() = default; // Return number of points returned virtual location_t load(const std::string &filename) = 0; diff --git a/include/abstract_graph_store.h b/include/abstract_graph_store.h index f7735b79a..387c8f675 100644 --- a/include/abstract_graph_store.h +++ b/include/abstract_graph_store.h @@ -18,6 +18,8 @@ class AbstractGraphStore { } + virtual ~AbstractGraphStore() = default; + virtual int load(const std::string &index_path_prefix) = 0; virtual int store(const std::string &index_path_prefix) = 0; From 416c6612350bedb36f4b00eb3da908107940ad3b Mon Sep 17 00:00:00 2001 From: Jerry Gao <109158931+Sanhaoji2@users.noreply.github.com> Date: Thu, 7 Mar 2024 11:57:44 +0800 Subject: [PATCH 39/61] apply label parse improve to memory index (#524) * Fix compile issue * Fix issue --- include/index.h | 2 + src/index.cpp | 100 ++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 90 insertions(+), 12 deletions(-) diff --git a/include/index.h b/include/index.h index 45d185d11..f341a3db2 100644 --- a/include/index.h +++ b/include/index.h @@ -444,6 +444,8 @@ template clas DISKANN_DLLEXPORT size_t load_delete_set(const std::string &filename); #endif + size_t search_string_range(const std::string& str, char ch, size_t start, size_t end); + private: // Distance functions Metric _dist_metric = diskann::L2; diff --git a/src/index.cpp b/src/index.cpp index 268edd76a..d76690c1b 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2103,17 +2103,34 @@ void Index::convert_pts_label_to_bitmask(std::vector void Index::parse_label_file_in_bitset(const std::string& label_file, size_t& num_points, size_t num_labels) { - std::ifstream infile(label_file); + std::ifstream infile(label_file, std::ios::binary); if (infile.fail()) { throw diskann::ANNException(std::string("Failed to open file ") + label_file, -1); } + infile.seekg(0, std::ios::end); + size_t file_size = infile.tellg(); + + std::string buffer(file_size, ' '); + + infile.seekg(0, std::ios::beg); + infile.read(&buffer[0], file_size); + infile.close(); - std::string line, token; unsigned line_cnt = 0; - while (std::getline(infile, line)) + size_t cur_pos = 0; + size_t next_pos = 0; + while (cur_pos < file_size && cur_pos != std::string::npos) { + next_pos = buffer.find('\n', cur_pos); + if (next_pos == std::string::npos) + { + break; + } + + cur_pos = next_pos + 1; + line_cnt++; } @@ -2124,23 +2141,68 @@ void Index::parse_label_file_in_bitset(const std::string& label infile.seekg(0, std::ios::beg); line_cnt = 0; - while (std::getline(infile, line)) + std::string label_str; + cur_pos = 0; + next_pos = 0; + while (cur_pos < file_size && cur_pos != std::string::npos) { - std::istringstream iss(line); - std::vector lbls(0); - getline(iss, token, '\t'); - std::istringstream new_iss(token); - while (getline(new_iss, token, ',')) + next_pos = buffer.find('\n', cur_pos); + if (next_pos == std::string::npos) { - token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); - token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); - LabelT token_as_num = std::stoul(token); + break; + } + + size_t lbl_pos = cur_pos; + size_t next_lbl_pos = 0; + while (lbl_pos < next_pos && lbl_pos != std::string::npos) + { + next_lbl_pos = search_string_range(buffer, ',', lbl_pos, next_pos); + if (next_lbl_pos == std::string::npos) // the last label in the whole file + { + next_lbl_pos = next_pos; + } + + if (next_lbl_pos > next_pos) // the last label in one line + { + next_lbl_pos = next_pos; + } + + label_str.assign(buffer.c_str() + lbl_pos, next_lbl_pos - lbl_pos); + if (label_str[label_str.length() - 1] == '\t') + { + label_str.erase(label_str.length() - 1); + } + + LabelT token_as_num = (LabelT)std::stoul(label_str); simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt), _bitmask_buf._bitmask_size); bm.set(token_as_num); _labels.insert(token_as_num); + + lbl_pos = next_lbl_pos + 1; } + + cur_pos = next_pos + 1; + line_cnt++; } + + //while (std::getline(infile, line)) + //{ + // std::istringstream iss(line); + // std::vector lbls(0); + // getline(iss, token, '\t'); + // std::istringstream new_iss(token); + // while (getline(new_iss, token, ',')) + // { + // token.erase(std::remove(token.begin(), token.end(), '\n'), token.end()); + // token.erase(std::remove(token.begin(), token.end(), '\r'), token.end()); + // LabelT token_as_num = std::stoul(token); + // simple_bitmask bm(_bitmask_buf.get_bitmask(line_cnt), _bitmask_buf._bitmask_size); + // bm.set(token_as_num); + // _labels.insert(token_as_num); + // } + // line_cnt++; + //} num_points = (size_t)line_cnt; diskann::cout << "Identified " << _labels.size() << " distinct label(s)" << std::endl; } @@ -3504,6 +3566,20 @@ void Index::search_with_optimized_layout(const T *query, size_t } } +template +size_t Index::search_string_range(const std::string& str, char ch, size_t start, size_t end) +{ + for (; start != end; start++) + { + if (str[start] == ch) + { + return start; + } + } + + return std::string::npos; +} + /* Internals of the library */ template const float Index::INDEX_GROWTH_FACTOR = 1.5f; From 08333d847624e5cd776ec35ae99bf75faea303b5 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Wed, 10 Apr 2024 19:50:24 +0800 Subject: [PATCH 40/61] fix compile issue --- include/parameters.h | 2 -- include/pq_flash_index.h | 15 ++++++++++----- src/filter_utils.cpp | 1 - src/index.cpp | 10 ++++++---- src/pq_flash_index.cpp | 29 +++++++++++++++++++++-------- 5 files changed, 37 insertions(+), 20 deletions(-) diff --git a/include/parameters.h b/include/parameters.h index 75e49d951..0206814bd 100644 --- a/include/parameters.h +++ b/include/parameters.h @@ -96,8 +96,6 @@ class IndexWriteParametersBuilder return IndexWriteParameters(_search_list_size, _max_degree, _saturate_graph, _max_occlusion_size, _alpha, _num_threads, _filter_list_size); } - IndexWriteParametersBuilder(const IndexWriteParametersBuilder &) = delete; - IndexWriteParametersBuilder &operator=(const IndexWriteParametersBuilder &) = delete; IndexWriteParametersBuilder(const IndexWriteParameters &wp) : _search_list_size(wp.search_list_size), _max_degree(wp.max_degree), diff --git a/include/pq_flash_index.h b/include/pq_flash_index.h index bdac4a8fb..2b26f1177 100644 --- a/include/pq_flash_index.h +++ b/include/pq_flash_index.h @@ -37,11 +37,14 @@ template class PQFlashIndex #ifdef EXEC_ENV_OLS DISKANN_DLLEXPORT int load_from_separate_paths(diskann::MemoryMappedFiles &files, uint32_t num_threads, - const char *index_filepath, const char *pivots_filepath, - const char *compressed_filepath); + const char* index_filepath, const char* pivots_filepath, + const char* compressed_filepath, const char* labels_filepath, const char* labels_to_medoids_filepath, + const char* labels_map_filepath, const char* unv_label_filepath); #else DISKANN_DLLEXPORT int load_from_separate_paths(uint32_t num_threads, const char *index_filepath, - const char *pivots_filepath, const char *compressed_filepath); + const char* pivots_filepath, const char* compressed_filepath, + const char* labels_filepath, const char* labels_to_medoids_filepath, + const char* labels_map_filepath, const char* unv_label_filepath); #endif DISKANN_DLLEXPORT void load_cache_list(std::vector &node_list); @@ -83,6 +86,8 @@ template class PQFlashIndex DISKANN_DLLEXPORT LabelT get_converted_label(const std::string &filter_label); + DISKANN_DLLEXPORT bool is_label_valid(const std::string& filter_label); + DISKANN_DLLEXPORT uint32_t range_search(const T *query1, const double range, const uint64_t min_l_search, const uint64_t max_l_search, std::vector &indices, std::vector &distances, const uint64_t min_beam_width, @@ -116,8 +121,8 @@ template class PQFlashIndex private: DISKANN_DLLEXPORT inline bool point_has_label(uint32_t point_id, LabelT label_id); - std::unordered_map load_label_map(const std::string& map_file); - DISKANN_DLLEXPORT void parse_label_file(const std::string& map_file, size_t &num_pts_labels); + std::unordered_map load_label_map(std::basic_istream& infile); + DISKANN_DLLEXPORT void parse_label_file(std::basic_istream& infile, size_t &num_pts_labels); DISKANN_DLLEXPORT void get_label_file_metadata(const std::string &fileContent, uint32_t &num_pts, uint32_t &num_total_labels); DISKANN_DLLEXPORT void generate_random_labels(std::vector &labels, const uint32_t num_labels, diff --git a/src/filter_utils.cpp b/src/filter_utils.cpp index aa354f662..09d740e35 100644 --- a/src/filter_utils.cpp +++ b/src/filter_utils.cpp @@ -45,7 +45,6 @@ void generate_label_indices(path input_data_path, path final_index_path_prefix, size_t number_of_label_points, dimension; diskann::get_bin_metadata(curr_label_input_data_path, number_of_label_points, dimension); - diskann::Index index(diskann::Metric::L2, dimension, number_of_label_points, false, false); diskann::Index index(diskann::Metric::L2, dimension, number_of_label_points, std::make_shared(label_index_build_parameters), nullptr, diff --git a/src/index.cpp b/src/index.cpp index 171f8f7cc..0a0588bf7 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -805,6 +805,7 @@ std::pair Index::iterate_to_fixed_point( assert(id_scratch.size() == 0); T *aligned_query = scratch->aligned_query(); + std::vector& query_bitmask_buf = scratch->query_label_bitmask(); float *pq_dists = nullptr; @@ -857,9 +858,9 @@ std::pair Index::iterate_to_fixed_point( bitmask_full_val._mask = query_bitmask_buf.data(); } - for (size_t i = 0; i < filter_label.size(); i++) + for (size_t i = 0; i < filter_labels.size(); i++) { - auto bitmask_val = simple_bitmask::get_bitmask_val(filter_label[i]); + auto bitmask_val = simple_bitmask::get_bitmask_val(filter_labels[i]); bitmask_full_val.merge_bitmask_val(bitmask_val); } @@ -1787,10 +1788,11 @@ void Index::build(const std::string &data_file, const size_t nu else { // TODO: this should ideally happen in save() + uint32_t unv_label_as_num = 0; std::string labels_file_to_use = filter_params.save_path_prefix + "_label_formatted.txt"; std::string mem_labels_int_map_file = filter_params.save_path_prefix + "_labels_map.txt"; convert_labels_string_to_int(filter_params.label_file, labels_file_to_use, mem_labels_int_map_file, - filter_params.universal_label); + filter_params.universal_label, unv_label_as_num); if (filter_params.universal_label != "") { LabelT unv_label_as_num = 0; @@ -2045,7 +2047,7 @@ void Index::build_filtered_index(const char *filename, const st num_points_labels); // determines medoid for each label and identifies // the points to label mapping - convert_pts_label_to_bitmask(_pts_to_labels, _bitmask_buf, _labels.size()); + convert_pts_label_to_bitmask(_location_to_labels, _bitmask_buf, _labels.size()); std::unordered_map> label_to_points; std::vector label_bitmask; diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index b83aa5bd1..93d9cd875 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -603,7 +603,7 @@ LabelT PQFlashIndex::get_converted_label(const std::string &filter_la } else if (_use_universal_label) { - return static_cast(_universal_filter_num); + return _universal_filter_label; } else { @@ -789,13 +789,19 @@ template int PQFlashIndex::load(uint32_ #endif std::string pq_table_bin = std::string(index_prefix) + "_pq_pivots.bin"; std::string pq_compressed_vectors = std::string(index_prefix) + "_pq_compressed.bin"; - std::string _disk_index_file = std::string(index_prefix) + "_disk.index"; + std::string disk_index_file = std::string(index_prefix) + "_disk.index"; + std::string labels_file = std::string(index_prefix) + "_labels.txt"; + std::string labels_to_medoids = std::string(index_prefix) + "_labels_to_medoids.txt"; + std::string labels_map_file = std::string(index_prefix) + "_labels_map.txt"; + std::string univ_label_file = std::string(index_prefix) + "_universal_label.txt"; #ifdef EXEC_ENV_OLS - return load_from_separate_paths(files, num_threads, _disk_index_file.c_str(), pq_table_bin.c_str(), - pq_compressed_vectors.c_str()); + return load_from_separate_paths(files, num_threads, disk_index_file.c_str(), pq_table_bin.c_str(), + pq_compressed_vectors.c_str(), labels_file.c_str(), labels_to_medoids.c_str(), + labels_map_file.c_str(), univ_label_file.c_str()); #else - return load_from_separate_paths(num_threads, _disk_index_file.c_str(), pq_table_bin.c_str(), - pq_compressed_vectors.c_str()); + return load_from_separate_paths(num_threads, disk_index_file.c_str(), pq_table_bin.c_str(), + pq_compressed_vectors.c_str(), labels_file.c_str(), labels_to_medoids.c_str(), + labels_map_file.c_str(), univ_label_file.c_str()); #endif } @@ -823,7 +829,7 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons std::string labels_file = (labels_filepath == nullptr ? "" : labels_filepath); std::string labels_to_medoids = (labels_to_medoids_filepath == nullptr ? "" : labels_to_medoids_filepath); - std::string dummy_map_file = std ::string(disk_index_file) + "_dummy_map.txt"; + std::string dummy_map_file = std ::string(_disk_index_file) + "_dummy_map.txt"; std::string labels_map_file = (labels_map_filepath == nullptr ? "" : labels_map_filepath); size_t num_pts_in_label_file = 0; @@ -929,8 +935,15 @@ int PQFlashIndex::load_from_separate_paths(uint32_t num_threads, cons throw FileException(labels_to_medoids, e, __FUNCSIG__, __FILE__, __LINE__); } } - std::string univ_label_file = (unv_label_filepath == nullptr ? "" : unv_label_filepath); + +#ifdef EXEC_ENV_OLS + if (files.fileExists(univ_label_file)) + { + FileContent& content_univ_label = files.getContent(univ_label_file); + std::stringstream universal_label_reader( + std::string((const char*)content_univ_label._content, content_univ_label._size)); +#else if (file_exists(univ_label_file)) { std::ifstream universal_label_reader(univ_label_file); From 4e63bfe855287725ffdf3ea39e8a716dcfe4abb1 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Fri, 12 Apr 2024 18:32:42 +0800 Subject: [PATCH 41/61] add interface --- include/abstract_index.h | 1 + include/index.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/abstract_index.h b/include/abstract_index.h index 059866f7c..7e258c816 100644 --- a/include/abstract_index.h +++ b/include/abstract_index.h @@ -125,5 +125,6 @@ class AbstractIndex const std::string filter_label = "") = 0; virtual void _search_with_optimized_layout(const DataType &query, size_t K, size_t L, uint32_t *indices) = 0; virtual void _set_universal_label(const LabelType universal_label) = 0; + virtual bool is_label_valid(const std::string& raw_label) = 0; }; } // namespace diskann diff --git a/include/index.h b/include/index.h index 67cdfb31f..505a1e30e 100644 --- a/include/index.h +++ b/include/index.h @@ -226,7 +226,7 @@ template clas // Get converted integer label from string to int map (_label_map) DISKANN_DLLEXPORT LabelT get_converted_label(const std::string &raw_label); - DISKANN_DLLEXPORT bool is_label_valid(const std::string& raw_label); + DISKANN_DLLEXPORT bool is_label_valid(const std::string& raw_label) override; // Set starting point of an index before inserting any points incrementally. // The data count should be equal to _num_frozen_pts * _aligned_dim. From 0ad3ec2a3e0e4d8e254f63f33bf353d00b365e30 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Fri, 12 Apr 2024 19:12:33 +0800 Subject: [PATCH 42/61] add interface --- include/abstract_index.h | 3 ++- include/index.h | 6 ++++-- src/index.cpp | 26 ++++++++++++++++++++++---- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/include/abstract_index.h b/include/abstract_index.h index 7e258c816..6bd47b884 100644 --- a/include/abstract_index.h +++ b/include/abstract_index.h @@ -125,6 +125,7 @@ class AbstractIndex const std::string filter_label = "") = 0; virtual void _search_with_optimized_layout(const DataType &query, size_t K, size_t L, uint32_t *indices) = 0; virtual void _set_universal_label(const LabelType universal_label) = 0; - virtual bool is_label_valid(const std::string& raw_label) = 0; + virtual bool is_label_valid(const std::string& raw_label) const = 0; + virtual bool is_universal_label(const std::string& raw_label) const = 0; }; } // namespace diskann diff --git a/include/index.h b/include/index.h index 505a1e30e..8ec125c48 100644 --- a/include/index.h +++ b/include/index.h @@ -224,9 +224,11 @@ template clas DISKANN_DLLEXPORT void set_universal_label(const LabelT &label); // Get converted integer label from string to int map (_label_map) - DISKANN_DLLEXPORT LabelT get_converted_label(const std::string &raw_label); + DISKANN_DLLEXPORT LabelT get_converted_label(const std::string &raw_label) const; - DISKANN_DLLEXPORT bool is_label_valid(const std::string& raw_label) override; + DISKANN_DLLEXPORT bool is_label_valid(const std::string& raw_label) const override; + + DISKANN_DLLEXPORT bool is_universal_label(const std::string& raw_label) const override; // Set starting point of an index before inserting any points incrementally. // The data count should be equal to _num_frozen_pts * _aligned_dim. diff --git a/src/index.cpp b/src/index.cpp index 0a0588bf7..fae4c14f6 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1825,11 +1825,12 @@ std::unordered_map Index::load_label_map(c } template -LabelT Index::get_converted_label(const std::string &raw_label) +LabelT Index::get_converted_label(const std::string &raw_label) const { - if (_label_map.find(raw_label) != _label_map.end()) + auto iter = _label_map.find(raw_label); + if (iter != _label_map.end()) { - return _label_map[raw_label]; + return iter->second; } else if (_use_universal_label) { @@ -1842,7 +1843,24 @@ LabelT Index::get_converted_label(const std::string &raw_label) } template -bool Index::is_label_valid(const std::string& raw_label) +bool Index::is_universal_label(const std::string& raw_label) const +{ + if (!_use_universal_label) + { + return false; + } + + auto internal_label = get_converted_label(raw_label); + if (internal_label == std::numeric_limits::max()) + { + return false; + } + + return internal_label == _universal_label; +} + +template +bool Index::is_label_valid(const std::string& raw_label) const { if (_label_map.find(raw_label) != _label_map.end()) { From bb83da9ad8d2178f2e2829bf455a863222105be9 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Fri, 12 Apr 2024 19:24:18 +0800 Subject: [PATCH 43/61] change inteface --- include/abstract_index.h | 2 +- include/index.h | 2 +- src/index.cpp | 15 ++------------- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/include/abstract_index.h b/include/abstract_index.h index 6bd47b884..ff6a3b4d3 100644 --- a/include/abstract_index.h +++ b/include/abstract_index.h @@ -126,6 +126,6 @@ class AbstractIndex virtual void _search_with_optimized_layout(const DataType &query, size_t K, size_t L, uint32_t *indices) = 0; virtual void _set_universal_label(const LabelType universal_label) = 0; virtual bool is_label_valid(const std::string& raw_label) const = 0; - virtual bool is_universal_label(const std::string& raw_label) const = 0; + virtual bool is_set_universal_label() const = 0; }; } // namespace diskann diff --git a/include/index.h b/include/index.h index 8ec125c48..7961f24cb 100644 --- a/include/index.h +++ b/include/index.h @@ -228,7 +228,7 @@ template clas DISKANN_DLLEXPORT bool is_label_valid(const std::string& raw_label) const override; - DISKANN_DLLEXPORT bool is_universal_label(const std::string& raw_label) const override; + DISKANN_DLLEXPORT bool is_set_universal_label() const override; // Set starting point of an index before inserting any points incrementally. // The data count should be equal to _num_frozen_pts * _aligned_dim. diff --git a/src/index.cpp b/src/index.cpp index fae4c14f6..2509c4288 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1843,20 +1843,9 @@ LabelT Index::get_converted_label(const std::string &raw_label) } template -bool Index::is_universal_label(const std::string& raw_label) const +bool Index::is_set_universal_label() const { - if (!_use_universal_label) - { - return false; - } - - auto internal_label = get_converted_label(raw_label); - if (internal_label == std::numeric_limits::max()) - { - return false; - } - - return internal_label == _universal_label; + return _use_universal_label; } template From 9a87dc160caa68485e7b6dc640039da267f6e21a Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Mon, 15 Apr 2024 10:51:00 +0800 Subject: [PATCH 44/61] move function to public --- include/abstract_index.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/abstract_index.h b/include/abstract_index.h index ff6a3b4d3..520cb3bbe 100644 --- a/include/abstract_index.h +++ b/include/abstract_index.h @@ -106,6 +106,9 @@ class AbstractIndex template void set_universal_label(const label_type universal_label); + virtual bool is_label_valid(const std::string& raw_label) const = 0; + virtual bool is_set_universal_label() const = 0; + private: virtual void _build(const DataType &data, const size_t num_points_to_load, TagVector &tags) = 0; virtual std::pair _search(const DataType &query, const size_t K, const uint32_t L, @@ -125,7 +128,5 @@ class AbstractIndex const std::string filter_label = "") = 0; virtual void _search_with_optimized_layout(const DataType &query, size_t K, size_t L, uint32_t *indices) = 0; virtual void _set_universal_label(const LabelType universal_label) = 0; - virtual bool is_label_valid(const std::string& raw_label) const = 0; - virtual bool is_set_universal_label() const = 0; }; } // namespace diskann From 0e83b893119c1575b5e1ec717d3001347b64109d Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Wed, 17 Apr 2024 22:02:51 +0800 Subject: [PATCH 45/61] remove hard code unv label num --- src/index.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.cpp b/src/index.cpp index 2509c4288..e4e65ab1b 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1795,7 +1795,7 @@ void Index::build(const std::string &data_file, const size_t nu filter_params.universal_label, unv_label_as_num); if (filter_params.universal_label != "") { - LabelT unv_label_as_num = 0; +// LabelT unv_label_as_num = 0; this->set_universal_label(unv_label_as_num); } this->build_filtered_index(data_file.c_str(), labels_file_to_use, points_to_load); From 6c050a19e6306046a03fd4e09398d7fc660ef8d2 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Fri, 19 Apr 2024 11:51:57 +0800 Subject: [PATCH 46/61] fix convert issue --- src/index.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index e4e65ab1b..9b60507e7 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2228,12 +2228,12 @@ std::pair Index::_search_with_filters(const if (typeid(uint64_t *) == indices.type()) { auto ptr = std::any_cast(indices); - return this->search_with_filters(std::any_cast(query), converted_label, K, L, ptr, distances); + return this->search_with_filters(std::any_cast(query), converted_label, K, L, ptr, distances); } else if (typeid(uint32_t *) == indices.type()) { auto ptr = std::any_cast(indices); - return this->search_with_filters(std::any_cast(query), converted_label, K, L, ptr, distances); + return this->search_with_filters(std::any_cast(query), converted_label, K, L, ptr, distances); } else { From 4b4bed532bd20ba86e10ef21ee32e1499e9c3a3a Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Fri, 19 Apr 2024 14:26:38 +0800 Subject: [PATCH 47/61] fix some issue --- src/index.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.cpp b/src/index.cpp index 9b60507e7..6f0bd717e 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1014,7 +1014,8 @@ std::pair Index::iterate_to_fixed_point( } } - assert(dist_scratch.capacity() >= id_scratch.size()); + dist_scratch.resize(id_scratch.size()); + //assert(dist_scratch.capacity() >= id_scratch.size()); compute_dists(id_scratch, dist_scratch); cmps += (uint32_t)id_scratch.size(); From aed8d4b71a3889bda7ab09890e4541b0c9aa1df2 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Mon, 22 Apr 2024 10:50:27 +0800 Subject: [PATCH 48/61] fix issues --- src/pq_flash_index.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/pq_flash_index.cpp b/src/pq_flash_index.cpp index 93d9cd875..7e2bda4e2 100644 --- a/src/pq_flash_index.cpp +++ b/src/pq_flash_index.cpp @@ -211,9 +211,9 @@ template void PQFlashIndex::load_cache_ size_t num_cached_nodes = node_list.size(); // borrow thread data - ScratchStoreManager> manager(this->_thread_data); - auto this_thread_data = manager.scratch_space(); - IOContext &ctx = this_thread_data->ctx; + //ScratchStoreManager> manager(this->_thread_data); + //auto this_thread_data = manager.scratch_space(); + //IOContext &ctx = this_thread_data->ctx; // Allocate space for neighborhood cache _nhood_cache_buf = new uint32_t[num_cached_nodes * (_max_degree + 1)]; @@ -372,9 +372,9 @@ void PQFlashIndex::cache_bfs_levels(uint64_t num_nodes_to_cache, std: diskann::cout << "Caching " << num_nodes_to_cache << "..." << std::endl; // borrow thread data - ScratchStoreManager> manager(this->_thread_data); - auto this_thread_data = manager.scratch_space(); - IOContext &ctx = this_thread_data->ctx; + //ScratchStoreManager> manager(this->_thread_data); + //auto this_thread_data = manager.scratch_space(); + //IOContext &ctx = this_thread_data->ctx; std::unique_ptr> cur_level, prev_level; cur_level = std::make_unique>(); @@ -508,9 +508,9 @@ template void PQFlashIndex::use_medoids std::memset(_centroid_data, 0, _num_medoids * _aligned_dim * sizeof(float)); // borrow ctx - ScratchStoreManager> manager(this->_thread_data); - auto data = manager.scratch_space(); - IOContext &ctx = data->ctx; + //ScratchStoreManager> manager(this->_thread_data); + //auto data = manager.scratch_space(); + //IOContext &ctx = data->ctx; diskann::cout << "Loading centroid data from medoids vector data of " << _num_medoids << " medoid(s)" << std::endl; std::vector nodes_to_read; From 25e3af69d4ab170c895f3766779fd2d4e7a6cf70 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Mon, 22 Apr 2024 14:28:30 +0800 Subject: [PATCH 49/61] fix issues --- src/index.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/index.cpp b/src/index.cpp index 6f0bd717e..533bc5ac9 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2089,6 +2089,8 @@ void Index::build_filtered_index(const char *filename, const st labeled_points.emplace_back(point_id); } } + + label_to_points[x] = labeled_points; } uint32_t num_cands = 25; From abda8bb85d5df28206c40d4dfb067a2d31e35d94 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Wed, 24 Apr 2024 19:43:19 +0800 Subject: [PATCH 50/61] tune perf --- src/index.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 533bc5ac9..7e8e30c2f 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -916,6 +916,7 @@ std::pair Index::iterate_to_fixed_point( uint32_t hops = 0; uint32_t cmps = 0; cmps += static_cast(init_ids.size()); + std::vector tmp_neighbor_list; while (best_L_nodes.has_unexpanded_node()) { @@ -972,10 +973,13 @@ std::pair Index::iterate_to_fixed_point( } else { + tmp_neighbor_list.clear(); _locks[n].lock(); - auto nbrs = _graph_store->get_neighbours(n); + auto& nbrs = _graph_store->get_neighbours(n); + tmp_neighbor_list.resize(nbrs.size()); + memcpy(tmp_neighbor_list.data(), nbrs.data(), nbrs.size() * sizeof(location_t)); _locks[n].unlock(); - for (auto id : nbrs) + for (auto id : tmp_neighbor_list) { assert(id < _max_points + _num_frozen_pts); From 469ec024b1f5e8c08e664ea699f174d03c7585bf Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Wed, 24 Apr 2024 22:16:16 +0800 Subject: [PATCH 51/61] test remove lock --- src/index.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 7e8e30c2f..4e9edd6ee 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -974,11 +974,11 @@ std::pair Index::iterate_to_fixed_point( else { tmp_neighbor_list.clear(); - _locks[n].lock(); + // _locks[n].lock(); auto& nbrs = _graph_store->get_neighbours(n); tmp_neighbor_list.resize(nbrs.size()); memcpy(tmp_neighbor_list.data(), nbrs.data(), nbrs.size() * sizeof(location_t)); - _locks[n].unlock(); + // _locks[n].unlock(); for (auto id : tmp_neighbor_list) { assert(id < _max_points + _num_frozen_pts); From 7c054848686b364e6fa0906aa1ebcf6f8144df5e Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Thu, 25 Apr 2024 11:51:43 +0800 Subject: [PATCH 52/61] try shared lock --- include/windows_slim_lock.h | 10 ++++++++++ src/index.cpp | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/windows_slim_lock.h b/include/windows_slim_lock.h index 5d0d65508..9f8b0329a 100644 --- a/include/windows_slim_lock.h +++ b/include/windows_slim_lock.h @@ -34,6 +34,11 @@ class windows_exclusive_slim_lock return AcquireSRWLockExclusive(&_lock); } + void lock_shared() + { + return AcquireSRWLockShared(&_lock); + } + bool try_lock() { return TryAcquireSRWLockExclusive(&_lock) != FALSE; @@ -44,6 +49,11 @@ class windows_exclusive_slim_lock return ReleaseSRWLockExclusive(&_lock); } + void unlock_shared() + { + return ReleaseSRWLockShared(&_lock); + } + private: SRWLOCK _lock; }; diff --git a/src/index.cpp b/src/index.cpp index 4e9edd6ee..387533f6b 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -974,11 +974,11 @@ std::pair Index::iterate_to_fixed_point( else { tmp_neighbor_list.clear(); - // _locks[n].lock(); + _locks[n].lock_shared(); auto& nbrs = _graph_store->get_neighbours(n); tmp_neighbor_list.resize(nbrs.size()); memcpy(tmp_neighbor_list.data(), nbrs.data(), nbrs.size() * sizeof(location_t)); - // _locks[n].unlock(); + _locks[n].unlock_shared(); for (auto id : tmp_neighbor_list) { assert(id < _max_points + _num_frozen_pts); From 363c59e0822c84f7b06abb6e0efd003975fc914d Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Thu, 25 Apr 2024 14:49:00 +0800 Subject: [PATCH 53/61] change to shared lock --- src/index.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 387533f6b..709b8a867 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1255,28 +1255,40 @@ void Index::inter_insert(uint32_t n, std::vector &pru assert(!src_pool.empty()); + // des_pool contains the neighbors of the neighbors of n + std::vector copy_of_neighbors; + for (auto des : src_pool) { // des.loc is the loc of the neighbors of n assert(des < _max_points + _num_frozen_pts); - // des_pool contains the neighbors of the neighbors of n - std::vector copy_of_neighbors; + bool prune_needed = false; { - LockGuard guard(_locks[des]); + copy_of_neighbors.clear(); + // LockGuard guard(_locks[des]); + _locks[des].lock_shared(); auto &des_pool = _graph_store->get_neighbours(des); - if (std::find(des_pool.begin(), des_pool.end(), n) == des_pool.end()) + copy_of_neighbors.reserve(des_pool.size() + 1); + for (auto& des_n : des_pool) + { + copy_of_neighbors.push_back(des_n); + } + _locks[des].unlock_shared(); + + if (std::find(copy_of_neighbors.begin(), copy_of_neighbors.end(), n) == copy_of_neighbors.end()) { - if (des_pool.size() < (uint64_t)(defaults::GRAPH_SLACK_FACTOR * range)) + if (copy_of_neighbors.size() < (uint64_t)(defaults::GRAPH_SLACK_FACTOR * range)) { + LockGuard guard(_locks[des]); // des_pool.emplace_back(n); _graph_store->add_neighbour(des, n); prune_needed = false; } else { - copy_of_neighbors.reserve(des_pool.size() + 1); - copy_of_neighbors = des_pool; + // copy_of_neighbors.reserve(des_pool.size() + 1); + // copy_of_neighbors = des_pool; copy_of_neighbors.push_back(n); prune_needed = true; } From 286db31615d5dcd8571c17dfff60bdeca467cd73 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Thu, 25 Apr 2024 15:36:48 +0800 Subject: [PATCH 54/61] try perfetch --- src/in_mem_data_store.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/in_mem_data_store.cpp b/src/in_mem_data_store.cpp index cc7acf615..5def2a330 100644 --- a/src/in_mem_data_store.cpp +++ b/src/in_mem_data_store.cpp @@ -207,6 +207,11 @@ void InMemDataStore::get_distance(const data_t *query, const location_t { for (location_t i = 0; i < location_count; i++) { + if (i + 1 < location_count) + { + prefetch_vector(locations[i + 1]); + } + distances[i] = _distance_fn->compare(query, _data + locations[i] * _aligned_dim, (uint32_t)this->_aligned_dim); } } From 7cfa7f6a49cd1feb4dcfb410115cac016540cbe5 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Thu, 25 Apr 2024 16:00:29 +0800 Subject: [PATCH 55/61] fix some issues --- include/abstract_data_store.h | 2 +- include/in_mem_data_store.h | 2 +- include/pq_data_store.h | 2 +- src/pq_data_store.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/abstract_data_store.h b/include/abstract_data_store.h index 89856f1fa..165ada696 100644 --- a/include/abstract_data_store.h +++ b/include/abstract_data_store.h @@ -67,7 +67,7 @@ template class AbstractDataStore // streaming setting virtual void get_vector(const location_t i, data_t *dest) const = 0; virtual void set_vector(const location_t i, const data_t *const vector) = 0; - virtual void prefetch_vector(const location_t loc) = 0; + virtual void prefetch_vector(const location_t loc) const = 0; // internal shuffle operations to move around vectors // will bulk-move all the vectors in [old_start_loc, old_start_loc + diff --git a/include/in_mem_data_store.h b/include/in_mem_data_store.h index d1ad795f6..eaa1562e0 100644 --- a/include/in_mem_data_store.h +++ b/include/in_mem_data_store.h @@ -38,7 +38,7 @@ template class InMemDataStore : public AbstractDataStore class PQDataStore : public AbstractDataStore virtual void get_vector(const location_t i, data_t *target) const override; virtual void set_vector(const location_t i, const data_t *const vector) override; - virtual void prefetch_vector(const location_t loc) override; + virtual void prefetch_vector(const location_t loc) const override; virtual void move_vectors(const location_t old_location_start, const location_t new_location_start, const location_t num_points) override; diff --git a/src/pq_data_store.cpp b/src/pq_data_store.cpp index c47c16705..2136c71e2 100644 --- a/src/pq_data_store.cpp +++ b/src/pq_data_store.cpp @@ -115,7 +115,7 @@ template void PQDataStore::set_vector(const location_t throw std::logic_error("Not implemented yet"); } -template void PQDataStore::prefetch_vector(const location_t loc) +template void PQDataStore::prefetch_vector(const location_t loc) const { const uint8_t *ptr = _quantized_data + ((size_t)loc) * _num_chunks * sizeof(data_t); diskann::prefetch_vector((const char *)ptr, _num_chunks * sizeof(data_t)); From e9c5c4411488446a310a01e3be22c30873163f8c Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Thu, 25 Apr 2024 16:08:10 +0800 Subject: [PATCH 56/61] fix issue --- src/in_mem_data_store.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/in_mem_data_store.cpp b/src/in_mem_data_store.cpp index 5def2a330..919c62139 100644 --- a/src/in_mem_data_store.cpp +++ b/src/in_mem_data_store.cpp @@ -173,7 +173,7 @@ template void InMemDataStore::set_vector(const locatio } } -template void InMemDataStore::prefetch_vector(const location_t loc) +template void InMemDataStore::prefetch_vector(const location_t loc) const { diskann::prefetch_vector((const char *)_data + _aligned_dim * (size_t)loc * sizeof(data_t), sizeof(data_t) * _aligned_dim); From ec577f187cb3a11ff0056574a7a4f414bddcee36 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Sat, 27 Apr 2024 11:14:55 +0800 Subject: [PATCH 57/61] skip unfilter search while Lindex = 1 --- src/in_mem_data_store.cpp | 7 +------ src/index.cpp | 37 ++++++++++++++++++++----------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/in_mem_data_store.cpp b/src/in_mem_data_store.cpp index 919c62139..28bb7ba4c 100644 --- a/src/in_mem_data_store.cpp +++ b/src/in_mem_data_store.cpp @@ -206,12 +206,7 @@ void InMemDataStore::get_distance(const data_t *query, const location_t AbstractScratch *scratch_space) const { for (location_t i = 0; i < location_count; i++) - { - if (i + 1 < location_count) - { - prefetch_vector(locations[i + 1]); - } - + { distances[i] = _distance_fn->compare(query, _data + locations[i] * _aligned_dim, (uint32_t)this->_aligned_dim); } } diff --git a/src/index.cpp b/src/index.cpp index 709b8a867..4ccf4c02b 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1062,30 +1062,33 @@ void Index::search_for_point_and_prune(int location, uint32_t L iterate_to_fixed_point(scratch, filteredLindex, filter_specific_start_nodes, true, _location_to_labels[location], false); - // combine candidate pools obtained with filter and unfiltered criteria. - std::set best_candidate_pool; - for (auto filtered_neighbor : scratch->pool()) + if (Lindex > 0) { - best_candidate_pool.insert(filtered_neighbor); - } + // combine candidate pools obtained with filter and unfiltered criteria. + std::set best_candidate_pool; + for (auto filtered_neighbor : scratch->pool()) + { + best_candidate_pool.insert(filtered_neighbor); + } - // clear scratch for finding unfiltered candidates - scratch->clear(); + // clear scratch for finding unfiltered candidates + scratch->clear(); - _data_store->get_vector(location, scratch->aligned_query()); - iterate_to_fixed_point(scratch, Lindex, init_ids, false, unused_filter_label, false); + _data_store->get_vector(location, scratch->aligned_query()); + iterate_to_fixed_point(scratch, Lindex, init_ids, false, unused_filter_label, false); - for (auto unfiltered_neighbour : scratch->pool()) - { - // insert if this neighbour is not already in best_candidate_pool - if (best_candidate_pool.find(unfiltered_neighbour) == best_candidate_pool.end()) + for (auto unfiltered_neighbour : scratch->pool()) { - best_candidate_pool.insert(unfiltered_neighbour); + // insert if this neighbour is not already in best_candidate_pool + if (best_candidate_pool.find(unfiltered_neighbour) == best_candidate_pool.end()) + { + best_candidate_pool.insert(unfiltered_neighbour); + } } - } - scratch->pool().clear(); - std::copy(best_candidate_pool.begin(), best_candidate_pool.end(), std::back_inserter(scratch->pool())); + scratch->pool().clear(); + std::copy(best_candidate_pool.begin(), best_candidate_pool.end(), std::back_inserter(scratch->pool())); + } } auto &pool = scratch->pool(); From 3fa9d42a65da53f89e40961a4ae270cc4945e049 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Sun, 28 Apr 2024 16:58:17 +0800 Subject: [PATCH 58/61] reserve queue size with max search lsit --- src/index.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/index.cpp b/src/index.cpp index 4ccf4c02b..3d4ae2619 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -106,9 +106,10 @@ Index::Index(const IndexConfig &index_config, std::shared_ptrnum_search_threads + _indexingThreads; initialize_query_scratch(num_scratch_spaces, index_config.index_search_params->initial_search_list_size, - _indexingQueueSize, _indexingRange, _indexingMaxC, _data_store->get_dims()); + default_queue_size, _indexingRange, _indexingMaxC, _data_store->get_dims()); } } } @@ -1602,7 +1603,8 @@ void Index::build_with_data_populated(const std::vector & if (_query_scratch.size() == 0) { - initialize_query_scratch(5 + num_threads_index, index_L, index_L, index_R, maxc, + std::uint32_t default_queue_size = (std::max)(_indexingQueueSize, _filterIndexingQueueSize); + initialize_query_scratch(5 + num_threads_index, default_queue_size, default_queue_size, index_R, maxc, _data_store->get_aligned_dim()); } From e2b3007470c3f28f2dfe8af3ef3790732da765f4 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Tue, 30 Apr 2024 18:45:52 +0800 Subject: [PATCH 59/61] revert change --- scripts/dev/install-dev-deps-ubuntu.bash | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 scripts/dev/install-dev-deps-ubuntu.bash diff --git a/scripts/dev/install-dev-deps-ubuntu.bash b/scripts/dev/install-dev-deps-ubuntu.bash old mode 100644 new mode 100755 From 209a15a156a25f9d5f4e3582c49577f1ef78cd99 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Tue, 30 Apr 2024 18:54:19 +0800 Subject: [PATCH 60/61] revert change --- apps/build_memory_index.cpp | 44 ------------------- apps/test_insert_deletes_consolidate.cpp | 3 -- .../utils/compute_groundtruth_for_filters.cpp | 5 --- 3 files changed, 52 deletions(-) diff --git a/apps/build_memory_index.cpp b/apps/build_memory_index.cpp index bd8344513..544e42dee 100644 --- a/apps/build_memory_index.cpp +++ b/apps/build_memory_index.cpp @@ -22,50 +22,6 @@ namespace po = boost::program_options; -template -int build_in_memory_index(const diskann::Metric &metric, const std::string &data_path, const uint32_t R, - const uint32_t L, const float alpha, const std::string &save_path, const uint32_t num_threads, - const bool use_pq_build, const size_t num_pq_bytes, const bool use_opq, - const std::string &label_file, const std::string &universal_label, const uint32_t Lf) -{ - diskann::IndexWriteParameters paras = diskann::IndexWriteParametersBuilder(L, R) - .with_filter_list_size(Lf) - .with_alpha(alpha) - .with_saturate_graph(false) - .with_num_threads(num_threads) - .build(); - std::string labels_file_to_use = save_path + "_label_formatted.txt"; - std::string mem_labels_int_map_file = save_path + "_labels_map.txt"; - - size_t data_num, data_dim; - diskann::get_bin_metadata(data_path, data_num, data_dim); - - diskann::Index index(metric, data_dim, data_num, false, false, false, use_pq_build, num_pq_bytes, - use_opq); - auto s = std::chrono::high_resolution_clock::now(); - if (label_file == "") - { - index.build(data_path.c_str(), data_num, paras); - } - else - { - convert_labels_string_to_int(label_file, labels_file_to_use, mem_labels_int_map_file, universal_label); - if (universal_label != "") - { - LabelT unv_label_as_num = 0; - index.set_universal_label(unv_label_as_num); - } - index.build_filtered_index(data_path.c_str(), labels_file_to_use, data_num, paras); - } - std::chrono::duration diff = std::chrono::high_resolution_clock::now() - s; - - std::cout << "Indexing time: " << diff.count() << "\n"; - index.save(save_path.c_str()); - if (label_file != "") - std::remove(labels_file_to_use.c_str()); - return 0; -} - int main(int argc, char **argv) { std::string data_type, dist_fn, data_path, index_path_prefix, label_file, universal_label, label_type; diff --git a/apps/test_insert_deletes_consolidate.cpp b/apps/test_insert_deletes_consolidate.cpp index 3d0f0a61f..97aed1864 100644 --- a/apps/test_insert_deletes_consolidate.cpp +++ b/apps/test_insert_deletes_consolidate.cpp @@ -97,7 +97,6 @@ void insert_till_next_checkpoint(diskann::AbstractIndex &index, size_t start, si size_t aligned_dim, std::vector> &location_to_labels) { diskann::Timer insert_timer; - #pragma omp parallel for num_threads(thread_count) schedule(dynamic) for (int64_t j = start; j < (int64_t)end; j++) { @@ -306,8 +305,6 @@ void build_incremental_index(const std::string &data_path, diskann::IndexWritePa delete_task.wait(); std::cout << "Time Elapsed " << timer.elapsed() / 1000 << "ms\n"; - const auto save_path_inc = get_save_filename(save_path + ".after-concurrent-delete-", points_to_skip, - points_to_delete_from_beginning, last_point_threshold); index->save(save_path_inc.c_str(), true); } else diff --git a/apps/utils/compute_groundtruth_for_filters.cpp b/apps/utils/compute_groundtruth_for_filters.cpp index 5be7135e1..52e586475 100644 --- a/apps/utils/compute_groundtruth_for_filters.cpp +++ b/apps/utils/compute_groundtruth_for_filters.cpp @@ -415,11 +415,6 @@ inline void parse_label_file_into_vec(size_t &line_cnt, const std::string &map_f lbls.push_back(token); labels.insert(token); } - if (lbls.size() <= 0) - { - std::cout << "No label found"; - exit(-1); - } std::sort(lbls.begin(), lbls.end()); pts_to_labels.push_back(lbls); } From 6863ba6503e808ed3fa8c6357d4421ce48d7da96 Mon Sep 17 00:00:00 2001 From: Sanhaoji2 Date: Tue, 30 Apr 2024 19:07:26 +0800 Subject: [PATCH 61/61] clean up code --- include/abstract_graph_store.h | 1 - include/abstract_index.h | 2 +- include/index.h | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/include/abstract_graph_store.h b/include/abstract_graph_store.h index 7c22c639e..4d6906ca4 100644 --- a/include/abstract_graph_store.h +++ b/include/abstract_graph_store.h @@ -5,7 +5,6 @@ #include #include - #include "types.h" namespace diskann diff --git a/include/abstract_index.h b/include/abstract_index.h index 520cb3bbe..7c84a8ec9 100644 --- a/include/abstract_index.h +++ b/include/abstract_index.h @@ -106,7 +106,7 @@ class AbstractIndex template void set_universal_label(const label_type universal_label); - virtual bool is_label_valid(const std::string& raw_label) const = 0; + virtual bool is_label_valid(const std::string &raw_label) const = 0; virtual bool is_set_universal_label() const = 0; private: diff --git a/include/index.h b/include/index.h index 7961f24cb..320942013 100644 --- a/include/index.h +++ b/include/index.h @@ -466,7 +466,6 @@ template clas char *_opt_graph = nullptr; - T *_data = nullptr; // coordinates of all base points // Dimensions size_t _dim = 0; size_t _nd = 0; // number of active points i.e. existing in the graph

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 lUTw>1CuTy4ujei3qeEZtp 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¨nh`C39SNe&> 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/Uj={e`{5tp&Tm~<|BhdFI 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%0Aj7%m3)rv0wBRZ_5pUoFw7?$D;QIH0 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

|-zJ1KW4(slM4Ys{h@h#ZbL+}bb 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%0DV*zMP>2U;vLPn70>1;UGwg>xDaNb?vDTwh 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℘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%0D9w>gPe&CleYfH_yeuK9L6n-jdBF@3XPpNtn^ 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