11 #include "spdlog/fmt/fmt.h"
34 for(
const auto& kv :
impl()->nodeMap) {
35 const auto&
id = kv.first;
51 return pimpl->globalProperties;
72 std::vector<std::shared_ptr<const Node>> nodes;
74 nodes.push_back(kv.second);
79 std::vector<std::shared_ptr<Node>> nodes;
81 nodes.push_back(kv.second);
97 kv.second->getAssetManager().serialize(mutableAssets, assetStorage, fmt::format(
"/node/{}/", kv.second->id));
100 assets = mutableAssets;
106 std::vector<uint8_t> assetStorage;
110 j[
"pipeline"] = schema;
111 for(
auto& node : j[
"pipeline"][
"nodes"]) {
112 node[1][
"properties"] = nlohmann::json::parse(node[1][
"properties"].
get<std::vector<uint8_t>>());
115 j[
"assets"] = assets;
116 j[
"assetStorage"] = assetStorage;
124 std::uint32_t latestIoId = 0;
127 for(
const auto& kv :
nodeMap) {
128 const auto& node = kv.second;
132 info.name = node->getName();
133 node->getProperties().serialize(
info.properties,
type);
136 auto inputs = node->getInputs();
137 auto outputs = node->getOutputs();
139 info.ioInfo.reserve(inputs.size() + outputs.size());
142 for(
const auto& input : inputs) {
144 io.
id = ++latestIoId;
147 io.
name = input.name;
148 io.
group = input.group;
149 auto ioKey = std::make_tuple(io.
group, io.
name);
151 io.
waitForMessage = input.waitForMessage.value_or(input.defaultWaitForMessage);
161 if(
info.ioInfo.count(ioKey) > 0) {
163 throw std::invalid_argument(fmt::format(
"'{}.{}' redefined. Inputs and outputs must have unique names",
info.name, io.
name));
165 throw std::invalid_argument(
166 fmt::format(
"'{}.{}[\"{}\"]' redefined. Inputs and outputs must have unique names",
info.name, io.
group, io.
name));
169 info.ioInfo[ioKey] = io;
173 for(
const auto& output : outputs) {
175 io.
id = ++latestIoId;
177 io.
name = output.name;
178 io.
group = output.group;
179 auto ioKey = std::make_tuple(io.
group, io.
name);
181 switch(output.type) {
190 if(
info.ioInfo.count(ioKey) > 0) {
192 throw std::invalid_argument(fmt::format(
"'{}.{}' redefined. Inputs and outputs must have unique names",
info.name, io.
name));
194 throw std::invalid_argument(
195 fmt::format(
"'{}.{}[\"{}\"]' redefined. Inputs and outputs must have unique names",
info.name, io.
group, io.
name));
198 info.ioInfo[ioKey] = io;
208 const auto& connections = kv.second;
210 for(
const auto& conn : connections) {
237 std::string lastNodeNameWithRequiredVersion =
"";
238 Node::Id lastNodeIdWithRequiredVersion = -1;
240 for(
const auto& kv :
nodeMap) {
241 const auto& node = kv.second;
244 auto requiredVersion = node->getRequiredOpenVINOVersion();
245 if(requiredVersion) {
249 std::string err = fmt::format(
"Pipeline - '{}' node with id: {}, isn't compatible with forced OpenVINO version", node->getName(), node->id);
250 throw std::logic_error(err.c_str());
255 version = *requiredVersion;
256 lastNodeIdWithRequiredVersion = node->id;
257 lastNodeNameWithRequiredVersion = node->getName();
262 std::string err = fmt::format(
"Pipeline - OpenVINO version required by '{}' node (id: {}), isn't compatible with '{}' node (id: {})",
263 lastNodeNameWithRequiredVersion,
264 lastNodeIdWithRequiredVersion,
267 throw std::logic_error(err.c_str());
295 std::string assetKey =
"camTuning";
329 if(
nodeMap.count(toRemove->id) > 0) {
330 if(
nodeMap.at(toRemove->id) == toRemove) {
340 for(
auto it = kv.second.begin(); it != kv.second.end();) {
342 if(it->outputId == toRemove->id) {
344 it = kv.second.erase(it);
364 if(outputPipeline !=
nullptr) {
384 if(outHierarchy.datatype == inHierarchy.datatype)
return true;
387 if(outHierarchy.descendants &&
isDatatypeSubclassOf(outHierarchy.datatype, inHierarchy.datatype))
return true;
390 if(inHierarchy.descendants &&
isDatatypeSubclassOf(inHierarchy.datatype, outHierarchy.datatype))
return true;
399 std::vector<Node::Connection> connections;
401 for(
const auto& conn : kv.second) {
402 connections.push_back(conn);
411 throw std::logic_error(fmt::format(
"Nodes are not on same pipeline or one of nodes parent pipeline doesn't exists anymore"));
416 throw std::runtime_error(
426 throw std::logic_error(
437 throw std::logic_error(fmt::format(
"Nodes are not on same pipeline or one of nodes parent pipeline doesn't exists anymore"));
446 throw std::logic_error(