From eeaf3d15e2d32aba16496d2406990489ff2c259a Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Wed, 24 May 2023 13:51:46 +0200 Subject: Factor out conversion between strings and distance metric to DistanceMetricUtils. --- .../src/vespa/searchlib/attribute/CMakeLists.txt | 1 + .../vespa/searchlib/attribute/attribute_header.cpp | 54 ++------------------ .../searchlib/attribute/distance_metric_utils.cpp | 57 ++++++++++++++++++++++ .../searchlib/attribute/distance_metric_utils.h | 16 ++++++ 4 files changed, 77 insertions(+), 51 deletions(-) create mode 100644 searchlib/src/vespa/searchlib/attribute/distance_metric_utils.cpp create mode 100644 searchlib/src/vespa/searchlib/attribute/distance_metric_utils.h diff --git a/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt b/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt index 350beca930e..6c1f4871161 100644 --- a/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt +++ b/searchlib/src/vespa/searchlib/attribute/CMakeLists.txt @@ -36,6 +36,7 @@ vespa_add_library(searchlib_attribute OBJECT createsinglefastsearch.cpp createsinglestd.cpp defines.cpp + distance_metric_utils.cpp diversity.cpp dociditerator.cpp document_weight_or_filter_search.cpp diff --git a/searchlib/src/vespa/searchlib/attribute/attribute_header.cpp b/searchlib/src/vespa/searchlib/attribute/attribute_header.cpp index cde1686828f..f7736ffed0a 100644 --- a/searchlib/src/vespa/searchlib/attribute/attribute_header.cpp +++ b/searchlib/src/vespa/searchlib/attribute/attribute_header.cpp @@ -1,9 +1,9 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "attribute_header.h" +#include "distance_metric_utils.h" #include #include -#include using vespalib::GenericHeader; @@ -26,13 +26,6 @@ const vespalib::string hnsw_index_value = "hnsw"; const vespalib::string hnsw_max_links_tag = "hnsw.max_links_per_node"; const vespalib::string hnsw_neighbors_to_explore_tag = "hnsw.neighbors_to_explore_at_insert"; const vespalib::string hnsw_distance_metric = "hnsw.distance_metric"; -const vespalib::string euclidean = "euclidean"; -const vespalib::string angular = "angular"; -const vespalib::string geodegrees = "geodegrees"; -const vespalib::string innerproduct = "innerproduct"; -const vespalib::string prenormalized_angular = "prenormalized_angular"; -const vespalib::string dotproduct = "dotproduct"; -const vespalib::string hamming = "hamming"; const vespalib::string doc_id_limit_tag = "docIdLimit"; const vespalib::string enumerated_tag = "enumerated"; const vespalib::string unique_value_count_tag = "uniqueValueCount"; @@ -95,47 +88,6 @@ AttributeHeader::AttributeHeader(const vespalib::string &fileName, AttributeHeader::~AttributeHeader() = default; -namespace { - -vespalib::string -to_string(DistanceMetric metric) -{ - switch (metric) { - case DistanceMetric::Euclidean: return euclidean; - case DistanceMetric::Angular: return angular; - case DistanceMetric::GeoDegrees: return geodegrees; - case DistanceMetric::InnerProduct: return innerproduct; - case DistanceMetric::Hamming: return hamming; - case DistanceMetric::PrenormalizedAngular: return prenormalized_angular; - case DistanceMetric::Dotproduct: return dotproduct; - } - throw vespalib::IllegalArgumentException("Unknown distance metric " + std::to_string(static_cast(metric))); -} - -DistanceMetric -to_distance_metric(const vespalib::string& metric) -{ - if (metric == euclidean) { - return DistanceMetric::Euclidean; - } else if (metric == angular) { - return DistanceMetric::Angular; - } else if (metric == geodegrees) { - return DistanceMetric::GeoDegrees; - } else if (metric == innerproduct) { - return DistanceMetric::InnerProduct; - } else if (metric == prenormalized_angular) { - return DistanceMetric::PrenormalizedAngular; - } else if (metric == dotproduct) { - return DistanceMetric::Dotproduct; - } else if (metric == hamming) { - return DistanceMetric::Hamming; - } else { - throw vespalib::IllegalStateException("Unknown distance metric '" + metric + "'"); - } -} - -} - void AttributeHeader::internalExtractTags(const vespalib::GenericHeader &header) { @@ -167,7 +119,7 @@ AttributeHeader::internalExtractTags(const vespalib::GenericHeader &header) uint32_t max_links = header.getTag(hnsw_max_links_tag).asInteger(); uint32_t neighbors_to_explore = header.getTag(hnsw_neighbors_to_explore_tag).asInteger(); - DistanceMetric distance_metric = to_distance_metric(header.getTag(hnsw_distance_metric).asString()); + DistanceMetric distance_metric = DistanceMetricUtils::to_distance_metric(header.getTag(hnsw_distance_metric).asString()); _hnsw_index_params.emplace(max_links, neighbors_to_explore, distance_metric); } } @@ -238,7 +190,7 @@ AttributeHeader::addTags(vespalib::GenericHeader &header) const const auto& params = *_hnsw_index_params; header.putTag(Tag(hnsw_max_links_tag, params.max_links_per_node())); header.putTag(Tag(hnsw_neighbors_to_explore_tag, params.neighbors_to_explore_at_insert())); - header.putTag(Tag(hnsw_distance_metric, to_string(params.distance_metric()))); + header.putTag(Tag(hnsw_distance_metric, DistanceMetricUtils::to_string(params.distance_metric()))); } } if (_basicType.type() == attribute::BasicType::Type::PREDICATE) { diff --git a/searchlib/src/vespa/searchlib/attribute/distance_metric_utils.cpp b/searchlib/src/vespa/searchlib/attribute/distance_metric_utils.cpp new file mode 100644 index 00000000000..8044f6aee3f --- /dev/null +++ b/searchlib/src/vespa/searchlib/attribute/distance_metric_utils.cpp @@ -0,0 +1,57 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "distance_metric_utils.h" +#include + +namespace search::attribute { + +namespace { + +const vespalib::string euclidean = "euclidean"; +const vespalib::string angular = "angular"; +const vespalib::string geodegrees = "geodegrees"; +const vespalib::string innerproduct = "innerproduct"; +const vespalib::string prenormalized_angular = "prenormalized_angular"; +const vespalib::string dotproduct = "dotproduct"; +const vespalib::string hamming = "hamming"; + +} + +vespalib::string +DistanceMetricUtils::to_string(DistanceMetric metric) +{ + switch (metric) { + case DistanceMetric::Euclidean: return euclidean; + case DistanceMetric::Angular: return angular; + case DistanceMetric::GeoDegrees: return geodegrees; + case DistanceMetric::InnerProduct: return innerproduct; + case DistanceMetric::Hamming: return hamming; + case DistanceMetric::PrenormalizedAngular: return prenormalized_angular; + case DistanceMetric::Dotproduct: return dotproduct; + } + throw vespalib::IllegalArgumentException("Unknown distance metric " + std::to_string(static_cast(metric))); +} + +DistanceMetric +DistanceMetricUtils::to_distance_metric(const vespalib::string& metric) +{ + if (metric == euclidean) { + return DistanceMetric::Euclidean; + } else if (metric == angular) { + return DistanceMetric::Angular; + } else if (metric == geodegrees) { + return DistanceMetric::GeoDegrees; + } else if (metric == innerproduct) { + return DistanceMetric::InnerProduct; + } else if (metric == prenormalized_angular) { + return DistanceMetric::PrenormalizedAngular; + } else if (metric == dotproduct) { + return DistanceMetric::Dotproduct; + } else if (metric == hamming) { + return DistanceMetric::Hamming; + } else { + throw vespalib::IllegalStateException("Unknown distance metric '" + metric + "'"); + } +} + +} diff --git a/searchlib/src/vespa/searchlib/attribute/distance_metric_utils.h b/searchlib/src/vespa/searchlib/attribute/distance_metric_utils.h new file mode 100644 index 00000000000..68ba5aa6c23 --- /dev/null +++ b/searchlib/src/vespa/searchlib/attribute/distance_metric_utils.h @@ -0,0 +1,16 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include +#include + +namespace search::attribute { + +class DistanceMetricUtils { +public: + static vespalib::string to_string(DistanceMetric metric); + static DistanceMetric to_distance_metric(const vespalib::string& metric); +}; + +} -- cgit v1.2.3