From e3d14f155cd8edccd3ee72d5b38acede7213b078 Mon Sep 17 00:00:00 2001
From: Olivier BICHLER <olivier.bichler@cea.fr>
Date: Sun, 29 Sep 2024 19:01:37 +0200
Subject: [PATCH] Scheduling should start from outputs, not inputs

---
 src/scheduler/Scheduler.cpp | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/src/scheduler/Scheduler.cpp b/src/scheduler/Scheduler.cpp
index 161345050..958b25432 100644
--- a/src/scheduler/Scheduler.cpp
+++ b/src/scheduler/Scheduler.cpp
@@ -63,22 +63,15 @@ std::vector<std::shared_ptr<Aidge::Scheduler::StaticSchedulingElement>> Aidge::S
     std::vector<std::shared_ptr<StaticSchedulingElement>> schedule;
 
 
-    // 1) Initialize consumers list:
-    // 1.1) List of the GraphView's input nodes
-    std::set<std::shared_ptr<Node>> consumers = mGraphView->inputNodes();
-
-    // 1.2) List of nodes inside the GraphView connected to an inner Producer
+    // 1) Initialize consumers list: start from the output nodes and
+    // find the required prior producers/consumers at step 2).
+    // Beware that generateBaseScheduling() can be called multiple time
+    // with some node having already produced some data. In this case,
+    // we should always consume available data first. This is ensured
+    // by setting the consumers list to the output nodes and then recursively
+    // find the dependencies.
+    std::set<std::shared_ptr<Node>> consumers = mGraphView->outputNodes();
     std::set<std::shared_ptr<Node>> producers;
-    for (const std::shared_ptr<Node>& nodePtr : mGraphView->getNodes()) {
-        if (nodePtr->type() == Producer_Op::Type) {
-            for (const auto& child : nodePtr->getChildren()) {
-                // Do not schedule childs outside current graph!
-                if (mGraphView->inView(child)) {
-                    consumers.insert(child);
-                }
-            }
-        }
-    }
 
     do {
         // 2) From the current consumers list, check if any prior consumer node
-- 
GitLab