From 0970bc4520e97b78493054cbbf79111862194c5f Mon Sep 17 00:00:00 2001 From: Charles Villard <charles.villard@cea.fr> Date: Thu, 17 Oct 2024 11:47:31 +0200 Subject: [PATCH] edit: Node: fix optional inputs in node treated as input graph --- include/aidge/graph/Node.hpp | 4 ++-- src/graph/Node.cpp | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/include/aidge/graph/Node.hpp b/include/aidge/graph/Node.hpp index c6ac9c651..9841555e8 100644 --- a/include/aidge/graph/Node.hpp +++ b/include/aidge/graph/Node.hpp @@ -252,10 +252,10 @@ public: if ((inputCategory(i) == InputCategory::Data || inputCategory(i) == InputCategory::OptionalData) && input(i).second == gk_IODefaultIndex) { - break; + return i; } } - return (i < nbInputs()) ? i : gk_IODefaultIndex; + return gk_IODefaultIndex; } diff --git a/src/graph/Node.cpp b/src/graph/Node.cpp index 33c336a84..37bc77b70 100644 --- a/src/graph/Node.cpp +++ b/src/graph/Node.cpp @@ -147,7 +147,9 @@ bool Aidge::Node::valid() const { Aidge::IOIndex_t Aidge::Node::getNbFreeDataInputs() const { IOIndex_t nbFreeDataIn = 0; for (IOIndex_t i = 0; i < nbInputs(); ++i) { - if (input(i).second == gk_IODefaultIndex) { + if ((inputCategory(i) == InputCategory::Data + || inputCategory(i) == InputCategory::OptionalData) + && input(i).second == gk_IODefaultIndex) { ++nbFreeDataIn; } } @@ -387,10 +389,17 @@ void Aidge::Node::addChild(const std::shared_ptr<Node>& otherNode, const IOIndex void Aidge::Node::addChild(std::shared_ptr<GraphView> otherView, const IOIndex_t outId, std::pair<std::shared_ptr<Node>, IOIndex_t> otherInId) { if (!otherInId.first) { - AIDGE_ASSERT(otherView->inputNodes().size() == 1U, + AIDGE_ASSERT(otherView->getNbFreeDataInputs() == 1U, "Input node of GraphView {} need to be specified, because it has more than one input ({} inputs), when trying to add it as a child of node {} (of type {})", otherView->name(), otherView->inputNodes().size(), name(), type()); - otherInId.first = *(otherView->inputNodes().begin()); + + otherInId.first = *(std::find_if( + otherView->inputNodes().begin(), + otherView->inputNodes().end(), + [](const auto &node) { + return node->getFirstFreeDataInput() != gk_IODefaultIndex; + } + )); } otherInId.second = (otherInId.second != gk_IODefaultIndex) ? otherInId.second -- GitLab