task_manager: drop getters from nodes 42/311642/2
authorInki Dae <inki.dae@samsung.com>
Thu, 23 May 2024 01:49:17 +0000 (10:49 +0900)
committerInki Dae <inki.dae@samsung.com>
Thu, 23 May 2024 04:30:59 +0000 (13:30 +0900)
Drop getters from nodes by delegating what the getters do to
specific nodes.

Change-Id: Id191f62a2153820a136c500fd29271eecd4f7603
Signed-off-by: Inki Dae <inki.dae@samsung.com>
services/task_manager/include/BridgeNode.h
services/task_manager/include/CallbackNode.h
services/task_manager/include/EndpointNode.h
services/task_manager/include/INode.h
services/task_manager/include/InferenceNode.h
services/task_manager/include/TaskNode.h
services/task_manager/include/TrainingNode.h
services/task_manager/src/CallbackNode.cpp
services/task_manager/src/InferenceNode.cpp
services/task_manager/src/TaskManager.cpp
test/services/test_task_manager.cpp

index ca9c095fb6dbb112c23cc1f86b1b3ad42b2c3284..32fdd40dbbc66740703418b249a21ad802cc1f54 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef __BRIDGE_NODE_H__
 #define __BRIDGE_NODE_H__
 
+#include "SingleoException.h"
 #include "CallbackNode.h"
 
 namespace singleo
@@ -32,6 +33,19 @@ public:
                _type = NodeType::BRIDGE;
        }
        virtual ~BridgeNode() = default;
+
+       void configure() final
+       {
+               // To be updated.
+       }
+
+       void invoke() final
+       {
+               if (!_cb)
+                       throw singleo::exception::InvalidOperation("Bridge node callback is not set");
+
+               _cb(this);
+       }
 };
 
 }
index e15db159dd005a3a077dcd3a2c4e6fd5802120c1..ea3e5dcc18aa937ae662d9edd34f249544633279 100644 (file)
@@ -58,9 +58,9 @@ public:
        std::shared_ptr<BaseDataType> &getOutput() override;
        void wait() override;
        void wakeup() override;
-
+       virtual void configure() = 0;
+       virtual void invoke() = 0;
        void setCb(const NodeCb &cb);
-       NodeCb getCb();
        std::vector<std::shared_ptr<BaseResultType> > &getResults();
        void addResult(std::shared_ptr<BaseResultType> result);
        void clearResults();
index e53882dabf58a830d438348be9bc6f0ceee6c620..3070029c3deffeddfafc91b2dae2fc51692b5bb5 100644 (file)
 #ifndef __ENDPOINT_NODE_H__
 #define __ENDPOINT_NODE_H__
 
-#include <mutex>
-#include <condition_variable>
-
 #include "CallbackNode.h"
-#include "SingleoException.h"
 
 namespace singleo
 {
@@ -36,6 +32,17 @@ public:
                _type = NodeType::ENDPOINT;
        }
        virtual ~EndpointNode() = default;
+
+       void configure() final
+       {
+               // To be updated.
+       }
+
+       void invoke() final
+       {
+               if (_cb)
+                       _cb(this);
+       }
 };
 
 }
index 0cd68caffe07841431a9961b102fdb46c60421a8..d436e99fe6bc0a475acd02c6d303ebe944b17305 100644 (file)
@@ -43,11 +43,13 @@ public:
        virtual std::vector<std::shared_ptr<INode> > &getDependencies() = 0;
        virtual void setOutput(std::shared_ptr<BaseDataType> output) = 0;
        virtual std::shared_ptr<BaseDataType> &getOutput() = 0;
+       virtual void configure() = 0;
+       virtual void invoke() = 0;
        virtual void wait() = 0;
        virtual void wakeup() = 0;
 };
 
-using NodeCb = std::function<void(std::shared_ptr<INode> &node)>;
+using NodeCb = std::function<void(INode *node)>;
 
 }
 }
index 51748af72a0cd443394bee7d38c1e4d187f50b12..f758e0ea1166fba34cdc308fcf17e2667eb80112 100644 (file)
@@ -43,9 +43,11 @@ public:
        virtual ~InferenceNode() = default;
 
        void setInferenceTask(std::unique_ptr<inference::IInferenceTaskInterface> &&task);
-       inference::IInferenceTaskInterface *getInferenceTask();
        void lockResult();
        void unlockResult();
+       void configure() final;
+       void invoke() final;
+       BaseResultType &getTaskResult() final;
 };
 
 }
index 3a48ab2e818030cb52a2b88bddbcf0f998083378..21d8b1be6ec929db473c6d3eab8f2ba95c503f12 100644 (file)
@@ -56,6 +56,9 @@ public:
        std::shared_ptr<BaseDataType> &getOutput() override;
        void wait() override;
        void wakeup() override;
+       virtual void configure() = 0;
+       virtual void invoke() = 0;
+       virtual BaseResultType &getTaskResult() = 0;
 };
 
 }
index 1dc896083b775c7eed2003436967db534de99650..0f8fe511fc7a0a4e3128d84a2cf6f9da92515a3c 100644 (file)
@@ -41,7 +41,20 @@ public:
        }
        virtual ~TrainingNode() = default;
 
-       // TODO. define setTrainingTask and getTrainingTask here.
+       void configure() final
+       {
+               // TODO. implement configure here.
+       }
+
+       void invoke() final
+       {
+               // TODO. implement invoke here.
+       }
+
+       BaseResultType &getTaskResult()
+       {
+               // TODO. implement getTaskresult here.
+       }
 };
 
 }
index 8b44ac588a43782eeff7cc1b6fc04097cf06801b..655e5592c57ebfaedb0ce17cb52e8b11473ed61e 100644 (file)
  */
 
 #include <cstring>
+#include "SingleoLog.h"
+#include "SingleoException.h"
 #include "CallbackNode.h"
 
 using namespace std;
+using namespace singleo::exception;
 
 namespace singleo
 {
@@ -43,11 +46,6 @@ void CallbackNode::setCb(const NodeCb &cb)
        _cb = cb;
 }
 
-NodeCb CallbackNode::getCb()
-{
-       return _cb;
-}
-
 void CallbackNode::addDependency(std::shared_ptr<INode> node)
 {
        _dependencies.push_back(node);
index 877cacfe3b74fc1eb4ea6363b45bbbf64309f068..ed158adca63b2a554a6b5aec73a11cc286822b9f 100644 (file)
@@ -28,11 +28,6 @@ void InferenceNode::setInferenceTask(unique_ptr<inference::IInferenceTaskInterfa
        _task = move(task);
 }
 
-IInferenceTaskInterface *InferenceNode::getInferenceTask()
-{
-       return _task.get();
-}
-
 void InferenceNode::lockResult()
 {
        _resultMutex.lock();
@@ -43,5 +38,22 @@ void InferenceNode::unlockResult()
        _resultMutex.unlock();
 }
 
+void InferenceNode::configure()
+{
+       _task->configure();
+       _task->prepare();
+}
+
+void InferenceNode::invoke()
+{
+       // TODO. consider for multiple inputs later.
+       _task->invoke(*_inputs[0]);
+}
+
+BaseResultType &InferenceNode::getTaskResult()
+{
+       return _task->result();
+}
+
 }
 }
\ No newline at end of file
index d110e6c5d238c98754e90120e4d21c7c22f70ff2..874f680b669959d39d3fdcfdb22026a842327a69 100644 (file)
@@ -42,8 +42,6 @@ void TaskManager::threadCb(shared_ptr<INode> &node)
                        throw InvalidOperation("Invalid input data type");
                }
 
-               auto inferenceNode = dynamic_pointer_cast<InferenceNode>(node);
-
                // If no dependency then use input of current node as input source.
                // Ps. In case of inference node, one of both - input from task manager
                //     (inference_node_a or inference_node_b) or input from dependency node
@@ -55,25 +53,25 @@ void TaskManager::threadCb(shared_ptr<INode> &node)
                //
                // If InferenceNode has dependency node then the dependency node must be BridgeNode like above graph.
                // Add output from the BridgeNode to InferenceNode as input.
-               if (!inferenceNode->getDependencies().empty()) {
+               if (!node->getDependencies().empty()) {
                        // TODO. consider for multiple dependencies later.
-                       auto &callbackNode = inferenceNode->getDependencies()[0];
+                       auto &callbackNode = node->getDependencies()[0];
 
-                       inferenceNode->addInput(callbackNode->getOutput());
+                       node->addInput(callbackNode->getOutput());
                }
 
-               auto input = dynamic_pointer_cast<ImageDataType>(inferenceNode->getInputs()[0]);
-               inferenceNode->getInferenceTask()->invoke(*input);
+               node->invoke();
+
+               auto input = dynamic_pointer_cast<ImageDataType>(node->getInputs()[0]);
 
                // Inference request has been completed so release input data if the data was internally allocated by callback node.
                if (input->custom)
                        delete input->ptr;
 
                // Service request to 'input' has been completed so clean up it.
-               inferenceNode->getInputs().clear();
-
-               // Wake up.
+               node->getInputs().clear();
                node->wakeup();
+
                return;
        }
 
@@ -84,41 +82,25 @@ void TaskManager::threadCb(shared_ptr<INode> &node)
        callbackNode->clearResults();
 
        for (auto &n : node->getDependencies()) {
-               if (n->getType() != NodeType::INFERENCE) {
-                       SINGLEO_LOGE("Dependency node should be Inference node.");
-                       throw InvalidOperation("Dependency node should be Inference node.");
-               }
-
                auto inferenceNode = dynamic_pointer_cast<InferenceNode>(n);
 
                inferenceNode->lockResult();
 
-               auto &result = inferenceNode->getInferenceTask()->result();
+               auto &result = inferenceNode->getTaskResult();
 
                if (result._type == ResultType::FACE_DETECTION)
-                       callbackNode->addResult(make_shared<FdResultType>(
-                                       dynamic_cast<FdResultType &>(inferenceNode->getInferenceTask()->result())));
+                       callbackNode->addResult(make_shared<FdResultType>(dynamic_cast<FdResultType &>(result)));
                else if (result._type == ResultType::FACE_LANDMARK)
-                       callbackNode->addResult(make_shared<FldResultType>(
-                                       dynamic_cast<FldResultType &>(inferenceNode->getInferenceTask()->result())));
+                       callbackNode->addResult(make_shared<FldResultType>(dynamic_cast<FldResultType &>(result)));
                else if (result._type == ResultType::OBJECT_DETECTION)
-                       callbackNode->addResult(make_shared<OdResultType>(
-                                       dynamic_cast<OdResultType &>(inferenceNode->getInferenceTask()->result())));
+                       callbackNode->addResult(make_shared<OdResultType>(dynamic_cast<OdResultType &>(result)));
 
                inferenceNode->unlockResult();
        }
 
        // TODO. consider for mulitple inputs later.
        node->addInput(_inputs[0]);
-
-       // Call the callback function registered in this callback node.
-       // In this callback, new data should be set by calling node->setOutput()
-       // if new data is made. TODO. consider for multiple inputs later.
-       auto cb = callbackNode->getCb();
-       if (cb)
-               cb(node);
-
-       // Wake up.
+       node->invoke();
        node->wakeup();
 }
 
@@ -137,13 +119,7 @@ vector<shared_ptr<BaseDataType> > &TaskManager::getInputs()
 void TaskManager::addNode(std::shared_ptr<INode> node)
 {
        _nodes.push_back(node);
-
-       // Initialize inference service.
-       if (node->getType() == NodeType::INFERENCE) {
-               auto inferenceNode = dynamic_pointer_cast<InferenceNode>(node);
-               inferenceNode->getInferenceTask()->configure();
-               inferenceNode->getInferenceTask()->prepare();
-       }
+       node->configure();
 }
 
 void TaskManager::verifyGraph()
@@ -164,13 +140,7 @@ void TaskManager::verifyGraph()
 
        // Verify if _nodes is DAG(Directed Acyclic Graph) or not.
        for (auto &node : _nodes) {
-               // BridgeNode should have a callback but it's optional for other types of callback nodes.
                if (node->getType() == NodeType::BRIDGE) {
-                       if (!dynamic_pointer_cast<BridgeNode>(node)->getCb()) {
-                               SINGLEO_LOGE("The bridge node should have a callback.");
-                               throw InvalidOperation("The bridge node should have a callback.");
-                       }
-
                        // Verify if BridgeNode is located bewteen two task nodes such as InferenceNode and TrainingNode.
                        for (auto &d_node : node->getDependencies()) {
                                degreeMap[d_node]++;
index 3b12442c44c90930ca620e586a12e0d981f6d3a5..53b972520d38b8dca81daf75fde6c1252c54aeb1 100644 (file)
@@ -35,9 +35,9 @@ using namespace singleo;
 using namespace singleo::inference;
 using namespace singleo::services;
 
-void BridgeNodeCallback(shared_ptr<INode> &node)
+void BridgeNodeCallback(INode *node)
 {
-       auto callbackNode = dynamic_pointer_cast<CallbackNode>(node);
+       auto callbackNode = dynamic_cast<CallbackNode *>(node);
        shared_ptr<ImageDataType> imageData = dynamic_pointer_cast<ImageDataType>(callbackNode->getInputs()[0]);
        size_t buffer_size = imageData->width * imageData->height * imageData->byte_per_pixel;
        ImageDataType newImage;
@@ -196,9 +196,9 @@ TEST(SingloTaskManager, MultipleNodesBasedGraphBShouldWork)
        }
 }
 
-void LastNodeCallback(shared_ptr<INode> &node)
+void LastNodeCallback(INode *node)
 {
-       auto callbackNode = dynamic_pointer_cast<CallbackNode>(node);
+       auto callbackNode = dynamic_cast<CallbackNode *>(node);
        auto &results = callbackNode->getResults();
 
        ASSERT_EQ(results.size(), 2);