diff --git a/src/graph/GraphView.cpp b/src/graph/GraphView.cpp index df2177cf6910a3c40ef269d18bf148d60b5faa66..5b37e0e8a622464f01243e1f03fd9c8f6d744cb0 100644 --- a/src/graph/GraphView.cpp +++ b/src/graph/GraphView.cpp @@ -83,6 +83,7 @@ void Aidge::GraphView::save(const std::string& path, bool verbose, bool showProd } fmt::print(fp.get(), + "```mermaid\n" "%%{{init: {{'flowchart': {{ 'curve': 'monotoneY'}}, " "'fontFamily': 'Verdana' }} }}%%\nflowchart TB\n\n"); @@ -204,6 +205,7 @@ void Aidge::GraphView::save(const std::string& path, bool verbose, bool showProd fmt::print(fp.get(), "classDef producerCls_rootCls stroke:#f00,fill:#ccf\n"); fmt::print(fp.get(), "classDef genericCls_rootCls stroke:#f00,fill:#f9f9ff,stroke-width:1px,stroke-dasharray: 5 5\n"); fmt::print(fp.get(), "classDef metaCls_rootCls stroke:#f00,stroke-width:5px\n"); + fmt::print(fp.get(), "```\n"); fmt::print(fp.get(), "\n"); } @@ -414,9 +416,10 @@ bool Aidge::GraphView::forwardDims(const std::vector<std::vector<Aidge::DimSize_ i, nodePtr->name(), nodePtr->type(), inputI.second, inputI.first->name(), inputI.first->type()); } else { // Input is missing - AIDGE_ASSERT(nodePtr->getOperator()->getRawInput(i) - && !std::static_pointer_cast<Tensor>(nodePtr->getOperator()->getRawInput(i))->empty(), + AIDGE_ASSERT(nodePtr->getOperator()->getRawInput(i), "Missing input#{} for node {} ({})", i, nodePtr->name(), nodePtr->type()); + AIDGE_ASSERT(!std::static_pointer_cast<Tensor>(nodePtr->getOperator()->getRawInput(i))->empty(), + "Empty input#{} for node {} ({})", i, nodePtr->name(), nodePtr->type()); } } diff --git a/src/scheduler/Scheduler.cpp b/src/scheduler/Scheduler.cpp index 4e3f9978837120bd01a3de2cfe2d22e33f9d7828..1c41afd4a2765d364b0ce6035bf50d732179fe1c 100644 --- a/src/scheduler/Scheduler.cpp +++ b/src/scheduler/Scheduler.cpp @@ -280,7 +280,12 @@ std::vector<std::shared_ptr<Aidge::Scheduler::StaticSchedulingElement>> Aidge::S mPriorCache.clear(); if (!consumers.empty()) { - Log::warn("Remaining consumers: possible dead-lock"); + std::vector<std::string> consumersName; + std::transform(consumers.begin(), consumers.end(), + std::back_inserter(consumersName), + [&namePtrTable](auto val){ return namePtrTable.at(val); }); + + Log::warn("Remaining consumers: {}. Possible dead-lock.", consumersName); } return schedule; @@ -518,7 +523,18 @@ void Aidge::Scheduler::connectInputs(std::vector<std::shared_ptr<Aidge::Tensor>> auto inputNodes = mGraphView->getOrderedInputs(); // Assert that the number of input data producers corresponds to the number of data input - assert(data.size() == inputNodes.size() && "Scheduler connectInput error - Inconsistent number of graph inputs and inputs passed to the graph"); + if (data.size() != inputNodes.size()) { + const std::map<std::shared_ptr<Node>, std::string> namePtrTable + = mGraphView->getRankedNodesName("{0} ({1}#{3})"); + + std::vector<std::pair<std::string, IOIndex_t>> inputNodesName; + std::transform(inputNodes.begin(), inputNodes.end(), + std::back_inserter(inputNodesName), + [&namePtrTable](auto val){ return std::make_pair(namePtrTable.at(val.first), val.second); }); + + AIDGE_THROW_OR_ABORT(std::runtime_error, "Provided {} inputs to the scheduler, but graph has {} inputs (required inputs in order: )", + data.size(), inputNodes.size(), inputNodesName); + } for (std::size_t i = 0; i < data.size(); ++i){ // TODO : maybe shallow copy instead of deepcopy