40 inline void check_nodeidx_pair(
const NodeIdxPair &pair,
const Graph &g)
44 ARM_COMPUTE_ERROR_ON((pair.node_id >= g.nodes().size()) || (g.node((pair).node_id) ==
nullptr) ||
45 (pair.index >= g.node(pair.node_id)->num_outputs()));
48 Status set_node_params(Graph &g,
NodeID nid, NodeParams ¶ms)
50 INode *node = g.node(nid);
53 node->set_common_node_parameters(params);
60 INode *node = g.node(nid);
63 Tensor *
tensor = is_output ? node->output(idx) : node->input(idx);
66 tensor->set_accessor(std::move(accessor));
71 NodeID add_const_node_with_name(
72 Graph &g, NodeParams params,
const std::string &
name,
const TensorDescriptor &desc,
ITensorAccessorUPtr accessor)
74 params.name = params.name.empty() ?
"" : params.name +
name;
76 set_node_params(g, nid, params);
80 template <
typename NT,
typename... Args>
81 NodeID create_simple_single_input_output_node(Graph &g, NodeParams ¶ms, NodeIdxPair
input, Args &&...
args)
83 check_nodeidx_pair(
input, g);
85 NodeID nid = g.add_node<NT>(std::forward<Args>(
args)...);
86 g.add_connection(
input.node_id,
input.index, nid, 0);
87 set_node_params(g, nid, params);
92 template <
typename NT,
typename... Args>
93 NodeID create_simple_multiple_input_single_output_node(Graph &g,
95 const std::vector<NodeIdxPair> &inputs,
100 NodeID nid = g.add_node<NT>(std::forward<Args>(
args)...);
103 for (
const auto &
input : inputs)
105 check_nodeidx_pair(
input, g);
106 g.add_connection(
input.node_id,
input.index, nid, i++);
108 set_node_params(g, nid, params);
118 set_node_params(g, nid, params);
119 set_accessor_on_node(g, nid,
true, 0, std::move(accessor));
127 set_node_params(g, nid, params);
128 set_accessor_on_node(g, nid,
true, 0, std::move(accessor));
134 check_nodeidx_pair(
input, g);
138 set_node_params(g, nid, params);
139 set_accessor_on_node(g, nid,
false, 0, std::move(accessor));
150 return create_simple_single_input_output_node<ActivationLayerNode>(g, params,
input,
act_info, out_quant_info);
161 return create_simple_single_input_output_node<ArgMinMaxLayerNode>(g, params,
input, op, axis, out_data_type,
174 check_nodeidx_pair(
input, g);
176 bool has_beta = (beta_accessor !=
nullptr);
177 bool has_gamma = (gamma_accessor !=
nullptr);
187 auto mean_nid = add_const_node_with_name(g, params,
"Mean", common_desc, std::move(mean_accessor));
188 auto var_nid = add_const_node_with_name(g, params,
"Variance", common_desc, std::move(var_accessor));
194 beta_nid = add_const_node_with_name(g, params,
"Beta", common_desc, std::move(beta_accessor));
201 gamma_nid = add_const_node_with_name(g, params,
"Gamma", common_desc, std::move(gamma_accessor));
217 set_node_params(g, batch_norm_nid, params);
219 return batch_norm_nid;
225 check_nodeidx_pair(
input, g);
226 check_nodeidx_pair(deltas, g);
233 set_node_params(g, nid, params);
239 return create_simple_single_input_output_node<ChannelShuffleLayerNode>(g, params,
input,
num_groups);
245 Size2D kernel_spatial_extend,
256 check_nodeidx_pair(
input, g);
260 bool has_bias = (bias_accessor !=
nullptr);
273 if (!weights_quant_info.
empty())
278 NodeID w_nid = add_const_node_with_name(g, params,
"Weights", w_desc, std::move(weights_accessor));
290 b_nid = add_const_node_with_name(g, params,
"Bias", b_desc, std::move(bias_accessor));
301 set_node_params(g, conv_nid, params);
309 Size2D kernel_spatial_extend,
315 check_nodeidx_pair(
input, g);
319 bool has_bias = (bias_accessor !=
nullptr);
333 NodeID w_nid = add_const_node_with_name(g, params,
"Weights", w_desc, std::move(weights_accessor));
345 b_nid = add_const_node_with_name(g, params,
"Bias", b_desc, std::move(bias_accessor));
356 set_node_params(g, deconv_nid, params);
363 const std::vector<NodeIdxPair> &inputs,
366 return create_simple_multiple_input_single_output_node<ConcatenateLayerNode>(g, params, inputs, inputs.size(),
373 Size2D kernel_spatial_extend,
375 int depth_multiplier,
382 check_nodeidx_pair(
input, g);
385 bool has_bias = (bias_accessor !=
nullptr);
397 if (!quant_info.
empty())
402 NodeID w_nid = add_const_node_with_name(g, params,
"Weights", w_desc, std::move(weights_accessor));
417 b_nid = add_const_node_with_name(g, params,
"Bias", b_desc, std::move(bias_accessor));
428 set_node_params(g, conv_nid, params);
435 return create_simple_single_input_output_node<DepthToSpaceLayerNode>(g, params,
input, block_shape);
440 return create_simple_single_input_output_node<DequantizationLayerNode>(g, params,
input);
450 check_nodeidx_pair(input_loc, g);
451 check_nodeidx_pair(input_conf, g);
452 check_nodeidx_pair(input_priorbox, g);
460 set_node_params(g, detect_nid, params);
473 check_nodeidx_pair(input_box_encoding, g);
474 check_nodeidx_pair(input_class_prediction, g);
482 if (!anchor_quant_info.
empty())
488 auto anchors_nid = add_const_node_with_name(g, params,
"Anchors", anchor_desc, std::move(anchors_accessor));
496 set_node_params(g, detect_nid, params);
503 return create_simple_single_input_output_node<DummyNode>(g, params,
input,
shape);
509 check_nodeidx_pair(input0, g);
510 check_nodeidx_pair(input1, g);
517 set_node_params(g, nid, params);
524 return create_simple_single_input_output_node<FlattenLayerNode>(g, params,
input);
530 unsigned int num_outputs,
537 check_nodeidx_pair(
input, g);
555 set_node_params(g, fc_nid, params);
563 unsigned int num_outputs,
571 check_nodeidx_pair(
input, g);
574 bool has_bias = (bias_accessor !=
nullptr);
581 fc_info, weights_quant_info);
582 NodeID w_nid = add_const_node_with_name(g, params,
"Weights", w_desc, std::move(weights_accessor));
594 b_nid = add_const_node_with_name(g, params,
"Bias", b_desc, std::move(bias_accessor));
606 set_node_params(g, fc_nid, params);
618 check_nodeidx_pair(scores, g);
619 check_nodeidx_pair(deltas, g);
620 check_nodeidx_pair(anchors, g);
628 set_node_params(g, nid, params);
634 return create_simple_single_input_output_node<L2NormalizeLayerNode>(g, params,
input, axis,
epsilon);
640 return create_simple_single_input_output_node<NormalizationLayerNode>(g, params,
input, norm_info);
646 check_nodeidx_pair(
input, g);
656 auto mean_nid = add_const_node_with_name(g, params,
"Mean", common_desc, std::move(mean_accessor));
657 auto std_nid = add_const_node_with_name(g, params,
"Std", common_desc, std::move(std_accessor));
664 set_node_params(g, norm_planar_yuv_nid, params);
666 return norm_planar_yuv_nid;
672 return create_simple_single_input_output_node<PadLayerNode>(g, params,
input, paddings, pad_value);
678 return create_simple_single_input_output_node<PermuteLayerNode>(g, params,
input, perm, layout);
683 check_nodeidx_pair(
input, g);
684 check_nodeidx_pair(alpha, g);
690 set_node_params(g, prelu_nid, params);
697 return create_simple_single_input_output_node<PoolingLayerNode>(g, params,
input, pool_info);
703 std::ostream &stream,
707 return create_simple_single_input_output_node<PrintLayerNode>(g, params,
input, stream, format_info, transform);
713 check_nodeidx_pair(input0, g);
714 check_nodeidx_pair(input1, g);
721 set_node_params(g, prior_nid, params);
731 return create_simple_single_input_output_node<QuantizationLayerNode>(g, params,
input, out_quant_info);
737 return create_simple_single_input_output_node<ReductionLayerNode>(g, params,
input, op, axis, keep_dims);
742 return create_simple_single_input_output_node<ReorgLayerNode>(g, params,
input, stride);
747 return create_simple_single_input_output_node<ReshapeLayerNode>(g, params,
input,
shape);
753 return create_simple_single_input_output_node<ResizeLayerNode>(g, params,
input, policy, width_scale, height_scale);
759 check_nodeidx_pair(
input, g);
760 check_nodeidx_pair(rois, g);
767 set_node_params(g, nid, params);
777 check_nodeidx_pair(
input, g);
789 NodeID mul_const_nid = add_const_node_with_name(g, params,
"Mul", mul_desc, std::move(mul_accessor));
794 NodeID add_const_nid = add_const_node_with_name(g, params,
"Add", add_desc, std::move(add_accessor));
808 return create_simple_single_input_output_node<SoftmaxLayerNode>(g, params,
input, beta);
814 return create_simple_single_input_output_node<SliceLayerNode>(g, params,
input, starts, ends);
820 return create_simple_single_input_output_node<SplitLayerNode>(g, params,
input, num_splits, axis);
831 return create_simple_single_input_output_node<StridedSliceLayerNode>(g, params,
input, starts, ends, strides,
info);
836 return create_simple_multiple_input_single_output_node<StackLayerNode>(g, params, inputs, inputs.size(), axis);
841 check_nodeidx_pair(
input, g);
854 set_node_params(g, box, params);
855 set_node_params(g, act_box, params);
863 set_node_params(g, imm, params);
871 set_node_params(g, cls, params);
872 set_node_params(g, cls_act, params);
878 set_node_params(g,
concat, params);