From c55cf4a4ab0f003a4b8ab7d5737151c3bfc71d2d 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 e014b041f..ab3950b94 100644 --- a/include/aidge/graph/Node.hpp +++ b/include/aidge/graph/Node.hpp @@ -225,10 +225,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 c19eab12a..aa1af3558 100644 --- a/src/graph/Node.cpp +++ b/src/graph/Node.cpp @@ -149,7 +149,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; } } @@ -289,10 +291,17 @@ void Aidge::Node::addChild(std::shared_ptr<Node> otherNode, const IOIndex_t outI 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