Files
2026-07-13 12:47:42 +08:00

121 lines
4.4 KiB
C++

// Copyright 2025-present the zvec project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once
#include <iostream>
#include <string>
#include "zvec/core/framework/index_meta.h"
namespace zvec {
namespace core {
class IndexMetaHelper {
public:
static std::string to_string(IndexMeta::DataType type) {
switch (type) {
case IndexMeta::DataType::DT_FP32:
return std::string("FP32");
case IndexMeta::DataType::DT_FP64:
return std::string("FP64");
case IndexMeta::DataType::DT_INT16:
return std::string("INT16");
case IndexMeta::DataType::DT_INT8:
return std::string("INT8");
case IndexMeta::DataType::DT_BINARY32:
return std::string("Binary");
case IndexMeta::DataType::DT_BINARY64:
return std::string("Binary64");
case IndexMeta::DataType::DT_FP16:
return std::string("FP16");
default:
return std::string("NotSupportedType");
}
}
static std::string to_string(IndexMeta meta) {
char buffer[1024];
snprintf(buffer, 1024,
"IndexMeta: type[%s] method[%s] dimension[%u] element_size[%u]",
to_string(meta.data_type()).c_str(), meta.metric_name().c_str(),
meta.dimension(), meta.element_size());
return std::string(buffer);
}
static bool parse_from(const std::string &type, const std::string &method,
const std::string &vector_type, IndexMeta &meta) {
return parse_from(type, method, 0, vector_type, meta);
}
static bool parse_from(const std::string &type, const std::string &method,
const size_t dimension, const std::string &vector_type,
IndexMeta &meta) {
if (vector_type != "dense" && vector_type != "sparse") {
std::cerr << "vector type should be dense or sparse!!!" << std::endl;
return false;
}
auto feature_type = IndexMeta::DataType::DT_UNDEFINED;
if (type == std::string("float")) {
feature_type = IndexMeta::DataType::DT_FP32;
} else if (type == std::string("double")) {
feature_type = IndexMeta::DataType::DT_FP64;
} else if (type == std::string("int16")) {
feature_type = IndexMeta::DataType::DT_INT16;
} else if (type == std::string("int8")) {
feature_type = IndexMeta::DataType::DT_INT8;
} else if (type == std::string("binary")) {
feature_type = IndexMeta::DataType::DT_BINARY32;
} else if (type == std::string("binary64")) {
feature_type = IndexMeta::DataType::DT_BINARY64;
} else {
std::cerr << "Not supported type: " << type << std::endl;
return false;
}
meta.set_meta(feature_type, dimension);
ailego::Params params;
if (method == std::string("L2")) {
if (feature_type == IndexMeta::DataType::DT_FP32) {
meta.set_metric("SquaredEuclidean", 0, std::move(params));
} else if (feature_type == IndexMeta::DataType::DT_INT8) {
meta.set_metric("SquaredEuclidean", 0, std::move(params));
} else if (feature_type == IndexMeta::DataType::DT_FP16) {
meta.set_metric("SquaredEuclidean", 0, std::move(params));
} else {
std::cerr << "Not supported type(" << type << ") for L2" << std::endl;
return false;
}
} else if (method == std::string("IP")) {
if (feature_type == IndexMeta::DataType::DT_FP32) {
meta.set_metric("InnerProduct", 0, std::move(params));
} else if (feature_type == IndexMeta::DataType::DT_INT8) {
meta.set_metric("InnerProduct", 0, std::move(params));
} else if (feature_type == IndexMeta::DataType::DT_FP16) {
meta.set_metric("InnerProduct", 0, std::move(params));
} else {
std::cerr << "Not supported type(" << type << ") for IP" << std::endl;
return false;
}
} else {
std::cerr << "Not supported method: " << method << std::endl;
return false;
}
return true;
}
};
} // namespace core
} // namespace zvec