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