COMPMID-997: Add support for node's name in GraphAPI.

Change-Id: I0ca02e42807c1ad9afeffb7202a3556feb11442f
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/129701
Tested-by: Jenkins <bsgcomp@arm.com>
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
diff --git a/arm_compute/graph/Workload.h b/arm_compute/graph/Workload.h
index 11bb22e..5ca9fd6 100644
--- a/arm_compute/graph/Workload.h
+++ b/arm_compute/graph/Workload.h
@@ -39,6 +39,27 @@
 class Tensor;
 class Graph;
 
+struct ExecutionTask;
+
+void execute_task(ExecutionTask &task);
+
+/** Task executor */
+class TaskExecutor final
+{
+private:
+    /** Default constructor **/
+    TaskExecutor();
+
+public:
+    /** Task executor accessor
+     *
+     * @return Task executor instance
+     */
+    static TaskExecutor &get();
+    /** Function that is responsible for executing tasks */
+    std::function<decltype(execute_task)> execute_function;
+};
+
 /** Execution task
  *
  * Contains all the information required to execute a given task
diff --git a/arm_compute/graph/frontend/ILayer.h b/arm_compute/graph/frontend/ILayer.h
index 5add8ab..f7caaea 100644
--- a/arm_compute/graph/frontend/ILayer.h
+++ b/arm_compute/graph/frontend/ILayer.h
@@ -46,6 +46,28 @@
      * @return ID of the created node.
      */
     virtual NodeID create_layer(IStream &s) = 0;
+    /** Sets the name of the layer
+     *
+     * @param[in] name Name of the layer
+     *
+     * @return The layer object
+     */
+    ILayer &set_name(std::string name)
+    {
+        _name = name;
+        return *this;
+    }
+    /** Layer name accessor
+     *
+     * @return Returns the name of the layer
+     */
+    const std::string &name() const
+    {
+        return _name;
+    }
+
+private:
+    std::string _name = {};
 };
 } // namespace frontend
 } // namespace graph
diff --git a/arm_compute/graph/frontend/IStreamOperators.h b/arm_compute/graph/frontend/IStreamOperators.h
index 1eb6522..350d78f 100644
--- a/arm_compute/graph/frontend/IStreamOperators.h
+++ b/arm_compute/graph/frontend/IStreamOperators.h
@@ -48,6 +48,18 @@
     s.add_layer(layer);
     return s;
 }
+/** Overloaded stream operator to add a node to the graph
+ *
+ * @param[in, out] s     Stream to add the tensor
+ * @param[in]      layer Layer to be added
+ *
+ * @return Updated stream
+ */
+inline IStream &operator<<(IStream &s, ILayer &layer)
+{
+    s.add_layer(layer);
+    return s;
+}
 /** Overloaded stream operator to provide a target hint to the graph
  *
  * @param[in, out] s           Stream to provide the hint to
diff --git a/arm_compute/graph/frontend/Layers.h b/arm_compute/graph/frontend/Layers.h
index 2e7c50e..54cf515 100644
--- a/arm_compute/graph/frontend/Layers.h
+++ b/arm_compute/graph/frontend/Layers.h
@@ -57,7 +57,7 @@
 
     NodeID create_layer(IStream &s) override
     {
-        NodeParams common_params = { "", s.hints().target_hint };
+        NodeParams common_params = { name(), s.hints().target_hint };
         return GraphBuilder::add_input_node(s.graph(), common_params, _desc, std::move(_accessor));
     }
 
@@ -81,7 +81,7 @@
 
     NodeID create_layer(IStream &s) override
     {
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
         return GraphBuilder::add_output_node(s.graph(), common_params, input, std::move(_accessor));
     }
@@ -105,7 +105,7 @@
 
     NodeID create_layer(IStream &s) override
     {
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
         return GraphBuilder::add_activation_node(s.graph(), common_params, input, _act_info);
     }
@@ -140,7 +140,7 @@
         ARM_COMPUTE_ERROR_ON(_mean == nullptr);
         ARM_COMPUTE_ERROR_ON(_var == nullptr);
 
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
         return GraphBuilder::add_batch_normalization_node(s.graph(), common_params, input, _epsilon,
                                                           std::move(_mean), std::move(_var), std::move(_beta), std::move(_gamma));
@@ -194,7 +194,7 @@
     NodeID create_layer(IStream &s) override
     {
         NodeIdxPair input         = { s.tail_node(), 0 };
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         return GraphBuilder::add_convolution_node(s.graph(), common_params, input,
                                                   Size2D(_conv_width, _conv_height), _ofm, _conv_info, _num_groups,
                                                   s.hints().convolution_method_hint,
@@ -244,7 +244,7 @@
     NodeID create_layer(IStream &s) override
     {
         NodeIdxPair input         = { s.tail_node(), 0 };
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         return GraphBuilder::add_depthwise_convolution_node(s.graph(), common_params,
                                                             input, Size2D(_conv_width, _conv_height), _conv_info,
                                                             s.hints().depthwise_convolution_method_hint,
@@ -271,7 +271,7 @@
 
     NodeID create_layer(IStream &s) override
     {
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
         return GraphBuilder::add_flatten_node(s.graph(), common_params, input);
     }
@@ -296,7 +296,7 @@
 
     NodeID create_layer(IStream &s) override
     {
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
         return GraphBuilder::add_fully_connected_layer(s.graph(), common_params, input, _num_outputs,
                                                        std::move(_weights), std::move(_bias));
@@ -323,7 +323,7 @@
 
     NodeID create_layer(IStream &s) override
     {
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
         return GraphBuilder::add_normalization_node(s.graph(), common_params, input, _norm_info);
     }
@@ -347,7 +347,7 @@
 
     NodeID create_layer(IStream &s) override
     {
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
         return GraphBuilder::add_pooling_node(s.graph(), common_params, input, _pool_info);
     }
@@ -371,7 +371,7 @@
 
     NodeID create_layer(IStream &s) override
     {
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
         return GraphBuilder::add_reshape_node(s.graph(), common_params, input, _shape);
     }
@@ -395,7 +395,7 @@
 
     NodeID create_layer(IStream &s) override
     {
-        NodeParams  common_params = { "", s.hints().target_hint };
+        NodeParams  common_params = { name(), s.hints().target_hint };
         NodeIdxPair input         = { s.tail_node(), 0 };
         return GraphBuilder::add_softmax_node(s.graph(), common_params, input, _beta);
     }
@@ -441,7 +441,7 @@
     NodeID create_layer(IStream &s) override
     {
         NodeID     nid           = EmptyNodeID;
-        NodeParams common_params = { "", s.hints().target_hint };
+        NodeParams common_params = { name(), s.hints().target_hint };
         if(_sub_streams.size() == 1 && _sub_streams.at(0) != nullptr)
         {
             nid = _sub_streams[0]->tail_node();