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
//
// 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;
}
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();
}
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()
// 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]++;
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;
}
}
-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);