aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@online.no>2023-05-24 13:51:46 +0200
committerTor Egge <Tor.Egge@online.no>2023-05-24 13:51:46 +0200
commiteeaf3d15e2d32aba16496d2406990489ff2c259a (patch)
treeb748872ddd212a6c6a072e7f159499694af49f70
parentca478cb618bfd8517dcb3b1a01f12b83077d7d30 (diff)
Factor out conversion between strings and distance metric to
DistanceMetricUtils.
-rw-r--r--searchlib/src/vespa/searchlib/attribute/CMakeLists.txt1
-rw-r--r--searchlib/src/vespa/searchlib/attribute/attribute_header.cpp54
-rw-r--r--searchlib/src/vespa/searchlib/attribute/distance_metric_utils.cpp57
-rw-r--r--searchlib/src/vespa/searchlib/attribute/distance_metric_utils.h16
4 files changed, 77 insertions, 51 deletions
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 <vespa/vespalib/data/fileheader.h>
#include <vespa/vespalib/data/databuffer.h>
-#include <vespa/vespalib/util/exceptions.h>
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<int>(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 <vespa/vespalib/util/exceptions.h>
+
+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<int>(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 <vespa/searchcommon/attribute/distance_metric.h>
+#include <vespa/vespalib/stllike/string.h>
+
+namespace search::attribute {
+
+class DistanceMetricUtils {
+public:
+ static vespalib::string to_string(DistanceMetric metric);
+ static DistanceMetric to_distance_metric(const vespalib::string& metric);
+};
+
+}