From: Inki Dae Date: Thu, 23 May 2024 01:49:17 +0000 (+0900) Subject: task_manager: drop getters from nodes X-Git-Tag: accepted/tizen/unified/20240903.110722~41 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F42%2F311642%2F2;p=platform%2Fcore%2Fapi%2Fsingleo.git task_manager: drop getters from nodes Drop getters from nodes by delegating what the getters do to specific nodes. Change-Id: Id191f62a2153820a136c500fd29271eecd4f7603 Signed-off-by: Inki Dae --- diff --git a/services/task_manager/include/BridgeNode.h b/services/task_manager/include/BridgeNode.h index ca9c095..32fdd40 100644 --- a/services/task_manager/include/BridgeNode.h +++ b/services/task_manager/include/BridgeNode.h @@ -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); + } }; } diff --git a/services/task_manager/include/CallbackNode.h b/services/task_manager/include/CallbackNode.h index e15db15..ea3e5dc 100644 --- a/services/task_manager/include/CallbackNode.h +++ b/services/task_manager/include/CallbackNode.h @@ -58,9 +58,9 @@ public: std::shared_ptr &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 > &getResults(); void addResult(std::shared_ptr result); void clearResults(); diff --git a/services/task_manager/include/EndpointNode.h b/services/task_manager/include/EndpointNode.h index e53882d..3070029 100644 --- a/services/task_manager/include/EndpointNode.h +++ b/services/task_manager/include/EndpointNode.h @@ -17,11 +17,7 @@ #ifndef __ENDPOINT_NODE_H__ #define __ENDPOINT_NODE_H__ -#include -#include - #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); + } }; } diff --git a/services/task_manager/include/INode.h b/services/task_manager/include/INode.h index 0cd68ca..d436e99 100644 --- a/services/task_manager/include/INode.h +++ b/services/task_manager/include/INode.h @@ -43,11 +43,13 @@ public: virtual std::vector > &getDependencies() = 0; virtual void setOutput(std::shared_ptr output) = 0; virtual std::shared_ptr &getOutput() = 0; + virtual void configure() = 0; + virtual void invoke() = 0; virtual void wait() = 0; virtual void wakeup() = 0; }; -using NodeCb = std::function &node)>; +using NodeCb = std::function; } } diff --git a/services/task_manager/include/InferenceNode.h b/services/task_manager/include/InferenceNode.h index 51748af..f758e0e 100644 --- a/services/task_manager/include/InferenceNode.h +++ b/services/task_manager/include/InferenceNode.h @@ -43,9 +43,11 @@ public: virtual ~InferenceNode() = default; void setInferenceTask(std::unique_ptr &&task); - inference::IInferenceTaskInterface *getInferenceTask(); void lockResult(); void unlockResult(); + void configure() final; + void invoke() final; + BaseResultType &getTaskResult() final; }; } diff --git a/services/task_manager/include/TaskNode.h b/services/task_manager/include/TaskNode.h index 3a48ab2..21d8b1b 100644 --- a/services/task_manager/include/TaskNode.h +++ b/services/task_manager/include/TaskNode.h @@ -56,6 +56,9 @@ public: std::shared_ptr &getOutput() override; void wait() override; void wakeup() override; + virtual void configure() = 0; + virtual void invoke() = 0; + virtual BaseResultType &getTaskResult() = 0; }; } diff --git a/services/task_manager/include/TrainingNode.h b/services/task_manager/include/TrainingNode.h index 1dc8960..0f8fe51 100644 --- a/services/task_manager/include/TrainingNode.h +++ b/services/task_manager/include/TrainingNode.h @@ -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. + } }; } diff --git a/services/task_manager/src/CallbackNode.cpp b/services/task_manager/src/CallbackNode.cpp index 8b44ac5..655e559 100644 --- a/services/task_manager/src/CallbackNode.cpp +++ b/services/task_manager/src/CallbackNode.cpp @@ -15,9 +15,12 @@ */ #include +#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 node) { _dependencies.push_back(node); diff --git a/services/task_manager/src/InferenceNode.cpp b/services/task_manager/src/InferenceNode.cpp index 877cacf..ed158ad 100644 --- a/services/task_manager/src/InferenceNode.cpp +++ b/services/task_manager/src/InferenceNode.cpp @@ -28,11 +28,6 @@ void InferenceNode::setInferenceTask(unique_ptrconfigure(); + _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 diff --git a/services/task_manager/src/TaskManager.cpp b/services/task_manager/src/TaskManager.cpp index d110e6c..874f680 100644 --- a/services/task_manager/src/TaskManager.cpp +++ b/services/task_manager/src/TaskManager.cpp @@ -42,8 +42,6 @@ void TaskManager::threadCb(shared_ptr &node) throw InvalidOperation("Invalid input data type"); } - auto inferenceNode = dynamic_pointer_cast(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 &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(inferenceNode->getInputs()[0]); - inferenceNode->getInferenceTask()->invoke(*input); + node->invoke(); + + auto input = dynamic_pointer_cast(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 &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(n); inferenceNode->lockResult(); - auto &result = inferenceNode->getInferenceTask()->result(); + auto &result = inferenceNode->getTaskResult(); if (result._type == ResultType::FACE_DETECTION) - callbackNode->addResult(make_shared( - dynamic_cast(inferenceNode->getInferenceTask()->result()))); + callbackNode->addResult(make_shared(dynamic_cast(result))); else if (result._type == ResultType::FACE_LANDMARK) - callbackNode->addResult(make_shared( - dynamic_cast(inferenceNode->getInferenceTask()->result()))); + callbackNode->addResult(make_shared(dynamic_cast(result))); else if (result._type == ResultType::OBJECT_DETECTION) - callbackNode->addResult(make_shared( - dynamic_cast(inferenceNode->getInferenceTask()->result()))); + callbackNode->addResult(make_shared(dynamic_cast(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 > &TaskManager::getInputs() void TaskManager::addNode(std::shared_ptr node) { _nodes.push_back(node); - - // Initialize inference service. - if (node->getType() == NodeType::INFERENCE) { - auto inferenceNode = dynamic_pointer_cast(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(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]++; diff --git a/test/services/test_task_manager.cpp b/test/services/test_task_manager.cpp index 3b12442..53b9725 100644 --- a/test/services/test_task_manager.cpp +++ b/test/services/test_task_manager.cpp @@ -35,9 +35,9 @@ using namespace singleo; using namespace singleo::inference; using namespace singleo::services; -void BridgeNodeCallback(shared_ptr &node) +void BridgeNodeCallback(INode *node) { - auto callbackNode = dynamic_pointer_cast(node); + auto callbackNode = dynamic_cast(node); shared_ptr imageData = dynamic_pointer_cast(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 &node) +void LastNodeCallback(INode *node) { - auto callbackNode = dynamic_pointer_cast(node); + auto callbackNode = dynamic_cast(node); auto &results = callbackNode->getResults(); ASSERT_EQ(results.size(), 2);