docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
rpc_optimization.h
Go to the documentation of this file.
1#pragma once
2
3#include <cmath>
4#include <optional>
5#include <stdexcept>
6
7#include <nlohmann/json.hpp>
8
9#include "sdfg/element.h"
10
11namespace sdfg::metadata {
12
13inline constexpr const char* RPC_OPTIMIZATION_METADATA_KEY = "docc.rpc_optimization.v1";
14
16 std::optional<nlohmann::json> expected_performance;
17 std::optional<double> vector_distance;
18};
19
20inline std::optional<RpcOptimizationMetadata> rpc_optimization(const Element& element) {
21 const auto* serialized = element.metadata_if_exists(RPC_OPTIMIZATION_METADATA_KEY);
22 if (serialized == nullptr) {
23 return std::nullopt;
24 }
25 const auto json = nlohmann::json::parse(*serialized);
26 if (!json.is_object() || (json.contains("expected_performance") && !json["expected_performance"].is_object()) ||
27 (!json.contains("expected_performance") && !json.contains("vector_distance"))) {
28 throw std::runtime_error("Invalid RPC optimization element metadata");
29 }
31 json.contains("expected_performance") ? std::optional<nlohmann::json>(json["expected_performance"])
32 : std::nullopt,
33 std::nullopt
34 };
35 if (json.contains("vector_distance")) {
36 if (!json["vector_distance"].is_number() || !std::isfinite(json["vector_distance"].get<double>())) {
37 throw std::runtime_error("Invalid RPC vector distance element metadata");
38 }
39 result.vector_distance = json["vector_distance"].get<double>();
40 }
41 return result;
42}
43
45 Element& element,
46 std::optional<nlohmann::json> expected_performance,
47 std::optional<double> vector_distance = std::nullopt
48) {
49 if (!expected_performance.has_value() && !vector_distance.has_value()) {
51 return;
52 }
53 if ((expected_performance.has_value() && !expected_performance->is_object()) ||
54 (vector_distance.has_value() && !std::isfinite(vector_distance.value()))) {
55 throw std::invalid_argument("RPC expected performance must be an object and vector distance finite");
56 }
57 nlohmann::json json = nlohmann::json::object();
58 if (expected_performance.has_value()) {
59 json["expected_performance"] = expected_performance.value();
60 }
61 if (vector_distance.has_value()) {
62 json["vector_distance"] = vector_distance.value();
63 }
65}
66
67} // namespace sdfg::metadata
Definition element.h:159
void remove_metadata(const std::string &key)
const std::string * metadata_if_exists(const std::string &key) const
void add_metadata(const std::string &key, const std::string &value)
nlohmann::json json
Definition interstate_edge.h:14
Definition loop_provenance.h:10
void set_rpc_optimization(Element &element, std::optional< nlohmann::json > expected_performance, std::optional< double > vector_distance=std::nullopt)
Definition rpc_optimization.h:44
std::optional< RpcOptimizationMetadata > rpc_optimization(const Element &element)
Definition rpc_optimization.h:20
constexpr const char * RPC_OPTIMIZATION_METADATA_KEY
Definition rpc_optimization.h:13
Definition rpc_optimization.h:15
std::optional< nlohmann::json > expected_performance
Definition rpc_optimization.h:16
std::optional< double > vector_distance
Definition rpc_optimization.h:17