/*
 * Copyright (c) 2020 Arm Limited.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#ifndef ARM_COMPUTE_GRAPH_EDSR_H
#define ARM_COMPUTE_GRAPH_EDSR_H

#include "arm_compute/graph.h"

#include "utils/GraphUtils.h"

class GraphEdsr
{
public:
    GraphEdsr() : _graph(0, "EDSR")
    {
    }

    bool setup(const arm_compute::utils::CommonGraphParams         &common_params,
               const arm_compute::utils::SimpleOption<std::string> &expected_output_filename)
    {
        using namespace arm_compute;
        using namespace arm_compute::graph;
        using namespace arm_compute::utils;
        using namespace arm_compute::graph_utils;

        const auto &data_path = common_params.data_path;
        const auto &target    = common_params.target;

        NodeID id_upscale_net_FakeQuantWithMinMaxVars_transposed = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{12, 2, 2, 3}, DataType::QASYMM8, QuantizationInfo(0.00393533194437623, 1), DataLayout::NHWC});
        INode *node_upscale_net_FakeQuantWithMinMaxVars_transposed =
            _graph.node(id_upscale_net_FakeQuantWithMinMaxVars_transposed);
        node_upscale_net_FakeQuantWithMinMaxVars_transposed->set_common_node_parameters(
            NodeParams{"upscale_net_FakeQuantWithMinMaxVars_transposed", target});
        node_upscale_net_FakeQuantWithMinMaxVars_transposed->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/upscale_net_FakeQuantWithMinMaxVars_transposed.npy", DataLayout::NHWC));

        NodeID id_pre_upscale_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{12}, DataType::S32, QuantizationInfo(2.9644968435604824e-06), DataLayout::NHWC});
        INode *node_pre_upscale_Conv2D_bias = _graph.node(id_pre_upscale_Conv2D_bias);
        node_pre_upscale_Conv2D_bias->set_common_node_parameters(NodeParams{"pre_upscale_Conv2D_bias", target});
        node_pre_upscale_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/pre_upscale_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_pre_upscale_FakeQuantWithMinMaxVars =
            _graph.add_node<ConstNode>(TensorDescriptor{TensorShape{256, 3, 3, 12}, DataType::QASYMM8,
                                                        QuantizationInfo(0.000455576169770211, 128), DataLayout::NHWC});
        INode *node_pre_upscale_FakeQuantWithMinMaxVars = _graph.node(id_pre_upscale_FakeQuantWithMinMaxVars);
        node_pre_upscale_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"pre_upscale_FakeQuantWithMinMaxVars", target});
        node_pre_upscale_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/pre_upscale_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_post_residual_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.2760000345224398e-06), DataLayout::NHWC});
        INode *node_post_residual_Conv2D_bias = _graph.node(id_post_residual_Conv2D_bias);
        node_post_residual_Conv2D_bias->set_common_node_parameters(NodeParams{"post_residual_Conv2D_bias", target});
        node_post_residual_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/post_residual_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_post_residual_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00036424631252884865, 129), DataLayout::NHWC});
        INode *node_post_residual_FakeQuantWithMinMaxVars = _graph.node(id_post_residual_FakeQuantWithMinMaxVars);
        node_post_residual_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"post_residual_FakeQuantWithMinMaxVars", target});
        node_post_residual_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/post_residual_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_15_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_15_y = _graph.node(id_mul_15_y);
        node_mul_15_y->set_common_node_parameters(NodeParams{"mul_15_y", target});
        node_mul_15_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_15_y.npy", DataLayout::NHWC));

        NodeID id_block_15_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.2441644230420934e-06), DataLayout::NHWC});
        INode *node_block_15_1_Conv2D_bias = _graph.node(id_block_15_1_Conv2D_bias);
        node_block_15_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_15_1_Conv2D_bias", target});
        node_block_15_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_15_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_15_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00037038681330159307, 125), DataLayout::NHWC});
        INode *node_block_15_1_FakeQuantWithMinMaxVars = _graph.node(id_block_15_1_FakeQuantWithMinMaxVars);
        node_block_15_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_15_1_FakeQuantWithMinMaxVars", target});
        node_block_15_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_15_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_14_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_14_y = _graph.node(id_mul_14_y);
        node_mul_14_y->set_common_node_parameters(NodeParams{"mul_14_y", target});
        node_mul_14_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_14_y.npy", DataLayout::NHWC));

        NodeID id_block_14_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.3417260333881131e-06), DataLayout::NHWC});
        INode *node_block_14_1_Conv2D_bias = _graph.node(id_block_14_1_Conv2D_bias);
        node_block_14_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_14_1_Conv2D_bias", target});
        node_block_14_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_14_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_14_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00040307495510205626, 127), DataLayout::NHWC});
        INode *node_block_14_1_FakeQuantWithMinMaxVars = _graph.node(id_block_14_1_FakeQuantWithMinMaxVars);
        node_block_14_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_14_1_FakeQuantWithMinMaxVars", target});
        node_block_14_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_14_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_13_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_13_y = _graph.node(id_mul_13_y);
        node_mul_13_y->set_common_node_parameters(NodeParams{"mul_13_y", target});
        node_mul_13_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_13_y.npy", DataLayout::NHWC));

        NodeID id_block_13_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.2636977544389083e-06), DataLayout::NHWC});
        INode *node_block_13_1_Conv2D_bias = _graph.node(id_block_13_1_Conv2D_bias);
        node_block_13_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_13_1_Conv2D_bias", target});
        node_block_13_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_13_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_13_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.0003858553245663643, 131), DataLayout::NHWC});
        INode *node_block_13_1_FakeQuantWithMinMaxVars = _graph.node(id_block_13_1_FakeQuantWithMinMaxVars);
        node_block_13_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_13_1_FakeQuantWithMinMaxVars", target});
        node_block_13_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_13_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_12_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_12_y = _graph.node(id_mul_12_y);
        node_mul_12_y->set_common_node_parameters(NodeParams{"mul_12_y", target});
        node_mul_12_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_12_y.npy", DataLayout::NHWC));

        NodeID id_block_12_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.3479783547154511e-06), DataLayout::NHWC});
        INode *node_block_12_1_Conv2D_bias = _graph.node(id_block_12_1_Conv2D_bias);
        node_block_12_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_12_1_Conv2D_bias", target});
        node_block_12_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_12_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_12_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00041212860378436744, 130), DataLayout::NHWC});
        INode *node_block_12_1_FakeQuantWithMinMaxVars = _graph.node(id_block_12_1_FakeQuantWithMinMaxVars);
        node_block_12_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_12_1_FakeQuantWithMinMaxVars", target});
        node_block_12_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_12_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_11_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_11_y = _graph.node(id_mul_11_y);
        node_mul_11_y->set_common_node_parameters(NodeParams{"mul_11_y", target});
        node_mul_11_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_11_y.npy", DataLayout::NHWC));

        NodeID id_block_11_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.2847248171965475e-06), DataLayout::NHWC});
        INode *node_block_11_1_Conv2D_bias = _graph.node(id_block_11_1_Conv2D_bias);
        node_block_11_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_11_1_Conv2D_bias", target});
        node_block_11_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_11_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_11_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00040296532097272575, 131), DataLayout::NHWC});
        INode *node_block_11_1_FakeQuantWithMinMaxVars = _graph.node(id_block_11_1_FakeQuantWithMinMaxVars);
        node_block_11_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_11_1_FakeQuantWithMinMaxVars", target});
        node_block_11_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_11_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_10_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_10_y = _graph.node(id_mul_10_y);
        node_mul_10_y->set_common_node_parameters(NodeParams{"mul_10_y", target});
        node_mul_10_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_10_y.npy", DataLayout::NHWC));

        NodeID id_block_10_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.1997129831797793e-06), DataLayout::NHWC});
        INode *node_block_10_1_Conv2D_bias = _graph.node(id_block_10_1_Conv2D_bias);
        node_block_10_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_10_1_Conv2D_bias", target});
        node_block_10_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_10_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_10_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00036640543839894235, 129), DataLayout::NHWC});
        INode *node_block_10_1_FakeQuantWithMinMaxVars = _graph.node(id_block_10_1_FakeQuantWithMinMaxVars);
        node_block_10_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_10_1_FakeQuantWithMinMaxVars", target});
        node_block_10_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_10_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_9_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_9_y = _graph.node(id_mul_9_y);
        node_mul_9_y->set_common_node_parameters(NodeParams{"mul_9_y", target});
        node_mul_9_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_9_y.npy", DataLayout::NHWC));

        NodeID id_block_9_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.1920226370421005e-06), DataLayout::NHWC});
        INode *node_block_9_1_Conv2D_bias = _graph.node(id_block_9_1_Conv2D_bias);
        node_block_9_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_9_1_Conv2D_bias", target});
        node_block_9_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_9_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_9_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.0003706997958943248, 129), DataLayout::NHWC});
        INode *node_block_9_1_FakeQuantWithMinMaxVars = _graph.node(id_block_9_1_FakeQuantWithMinMaxVars);
        node_block_9_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_9_1_FakeQuantWithMinMaxVars", target});
        node_block_9_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_9_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_8_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_8_y = _graph.node(id_mul_8_y);
        node_mul_8_y->set_common_node_parameters(NodeParams{"mul_8_y", target});
        node_mul_8_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_8_y.npy", DataLayout::NHWC));

        NodeID id_block_8_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.218903321387188e-06), DataLayout::NHWC});
        INode *node_block_8_1_Conv2D_bias = _graph.node(id_block_8_1_Conv2D_bias);
        node_block_8_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_8_1_Conv2D_bias", target});
        node_block_8_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_8_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_8_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00038377835880964994, 127), DataLayout::NHWC});
        INode *node_block_8_1_FakeQuantWithMinMaxVars = _graph.node(id_block_8_1_FakeQuantWithMinMaxVars);
        node_block_8_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_8_1_FakeQuantWithMinMaxVars", target});
        node_block_8_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_8_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_7_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_7_y = _graph.node(id_mul_7_y);
        node_mul_7_y->set_common_node_parameters(NodeParams{"mul_7_y", target});
        node_mul_7_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_7_y.npy", DataLayout::NHWC));

        NodeID id_block_7_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.257252392861119e-06), DataLayout::NHWC});
        INode *node_block_7_1_Conv2D_bias = _graph.node(id_block_7_1_Conv2D_bias);
        node_block_7_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_7_1_Conv2D_bias", target});
        node_block_7_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_7_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_7_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00039844686398282647, 129), DataLayout::NHWC});
        INode *node_block_7_1_FakeQuantWithMinMaxVars = _graph.node(id_block_7_1_FakeQuantWithMinMaxVars);
        node_block_7_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_7_1_FakeQuantWithMinMaxVars", target});
        node_block_7_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_7_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_6_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_6_y = _graph.node(id_mul_6_y);
        node_mul_6_y->set_common_node_parameters(NodeParams{"mul_6_y", target});
        node_mul_6_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_6_y.npy", DataLayout::NHWC));

        NodeID id_block_6_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.244850636794581e-06), DataLayout::NHWC});
        INode *node_block_6_1_Conv2D_bias = _graph.node(id_block_6_1_Conv2D_bias);
        node_block_6_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_6_1_Conv2D_bias", target});
        node_block_6_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_6_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_6_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00040187727427110076, 132), DataLayout::NHWC});
        INode *node_block_6_1_FakeQuantWithMinMaxVars = _graph.node(id_block_6_1_FakeQuantWithMinMaxVars);
        node_block_6_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_6_1_FakeQuantWithMinMaxVars", target});
        node_block_6_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_6_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_5_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_5_y = _graph.node(id_mul_5_y);
        node_mul_5_y->set_common_node_parameters(NodeParams{"mul_5_y", target});
        node_mul_5_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_5_y.npy", DataLayout::NHWC));

        NodeID id_block_5_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.241092718373693e-06), DataLayout::NHWC});
        INode *node_block_5_1_Conv2D_bias = _graph.node(id_block_5_1_Conv2D_bias);
        node_block_5_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_5_1_Conv2D_bias", target});
        node_block_5_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_5_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_5_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.0003938926674891263, 129), DataLayout::NHWC});
        INode *node_block_5_1_FakeQuantWithMinMaxVars = _graph.node(id_block_5_1_FakeQuantWithMinMaxVars);
        node_block_5_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_5_1_FakeQuantWithMinMaxVars", target});
        node_block_5_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_5_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_4_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_4_y = _graph.node(id_mul_4_y);
        node_mul_4_y->set_common_node_parameters(NodeParams{"mul_4_y", target});
        node_mul_4_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_4_y.npy", DataLayout::NHWC));

        NodeID id_block_4_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.1748390988941537e-06), DataLayout::NHWC});
        INode *node_block_4_1_Conv2D_bias = _graph.node(id_block_4_1_Conv2D_bias);
        node_block_4_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_4_1_Conv2D_bias", target});
        node_block_4_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_4_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_4_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.0003788181929849088, 129), DataLayout::NHWC});
        INode *node_block_4_1_FakeQuantWithMinMaxVars = _graph.node(id_block_4_1_FakeQuantWithMinMaxVars);
        node_block_4_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_4_1_FakeQuantWithMinMaxVars", target});
        node_block_4_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_4_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_3_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_3_y = _graph.node(id_mul_3_y);
        node_mul_3_y->set_common_node_parameters(NodeParams{"mul_3_y", target});
        node_mul_3_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_3_y.npy", DataLayout::NHWC));

        NodeID id_block_3_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.1937011095142225e-06), DataLayout::NHWC});
        INode *node_block_3_1_Conv2D_bias = _graph.node(id_block_3_1_Conv2D_bias);
        node_block_3_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_3_1_Conv2D_bias", target});
        node_block_3_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_3_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_3_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.0003944312920793891, 129), DataLayout::NHWC});
        INode *node_block_3_1_FakeQuantWithMinMaxVars = _graph.node(id_block_3_1_FakeQuantWithMinMaxVars);
        node_block_3_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_3_1_FakeQuantWithMinMaxVars", target});
        node_block_3_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_3_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_2_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_2_y = _graph.node(id_mul_2_y);
        node_mul_2_y->set_common_node_parameters(NodeParams{"mul_2_y", target});
        node_mul_2_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_2_y.npy", DataLayout::NHWC));

        NodeID id_block_2_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.1634580232566805e-06), DataLayout::NHWC});
        INode *node_block_2_1_Conv2D_bias = _graph.node(id_block_2_1_Conv2D_bias);
        node_block_2_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_2_1_Conv2D_bias", target});
        node_block_2_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_2_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_2_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.0003789655165746808, 132), DataLayout::NHWC});
        INode *node_block_2_1_FakeQuantWithMinMaxVars = _graph.node(id_block_2_1_FakeQuantWithMinMaxVars);
        node_block_2_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_2_1_FakeQuantWithMinMaxVars", target});
        node_block_2_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_2_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_1_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_1_y = _graph.node(id_mul_1_y);
        node_mul_1_y->set_common_node_parameters(NodeParams{"mul_1_y", target});
        node_mul_1_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_1_y.npy", DataLayout::NHWC));

        NodeID id_block_1_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.197920255435747e-06), DataLayout::NHWC});
        INode *node_block_1_1_Conv2D_bias = _graph.node(id_block_1_1_Conv2D_bias);
        node_block_1_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_1_1_Conv2D_bias", target});
        node_block_1_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_1_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_1_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00038527738070115447, 132), DataLayout::NHWC});
        INode *node_block_1_1_FakeQuantWithMinMaxVars = _graph.node(id_block_1_1_FakeQuantWithMinMaxVars);
        node_block_1_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_1_1_FakeQuantWithMinMaxVars", target});
        node_block_1_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_1_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_mul_y   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{1}, DataType::QASYMM8, QuantizationInfo(0.0003921568568330258), DataLayout::NHWC});
        INode *node_mul_y = _graph.node(id_mul_y);
        node_mul_y->set_common_node_parameters(NodeParams{"mul_y", target});
        node_mul_y->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/mul_y.npy", DataLayout::NHWC));

        NodeID id_block_0_1_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.315485519626236e-06), DataLayout::NHWC});
        INode *node_block_0_1_Conv2D_bias = _graph.node(id_block_0_1_Conv2D_bias);
        node_block_0_1_Conv2D_bias->set_common_node_parameters(NodeParams{"block_0_1_Conv2D_bias", target});
        node_block_0_1_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/block_0_1_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_block_0_1_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{256, 3, 3, 256}, DataType::QASYMM8,
                             QuantizationInfo(0.00039420535904355347, 129), DataLayout::NHWC});
        INode *node_block_0_1_FakeQuantWithMinMaxVars = _graph.node(id_block_0_1_FakeQuantWithMinMaxVars);
        node_block_0_1_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"block_0_1_FakeQuantWithMinMaxVars", target});
        node_block_0_1_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/block_0_1_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        NodeID id_pre_residual_Conv2D_bias   = _graph.add_node<ConstNode>(TensorDescriptor{
            TensorShape{256}, DataType::S32, QuantizationInfo(1.7214160834555514e-06), DataLayout::NHWC});
        INode *node_pre_residual_Conv2D_bias = _graph.node(id_pre_residual_Conv2D_bias);
        node_pre_residual_Conv2D_bias->set_common_node_parameters(NodeParams{"pre_residual_Conv2D_bias", target});
        node_pre_residual_Conv2D_bias->output(0)->set_accessor(
            get_weights_accessor(data_path, "/cnn_data/edsr_model/pre_residual_Conv2D_bias.npy", DataLayout::NHWC));

        NodeID id_pre_residual_FakeQuantWithMinMaxVars = _graph.add_node<ConstNode>(
            TensorDescriptor{TensorShape{3, 3, 3, 256}, DataType::QASYMM8, QuantizationInfo(0.0004389610840007663, 127),
                             DataLayout::NHWC});
        INode *node_pre_residual_FakeQuantWithMinMaxVars = _graph.node(id_pre_residual_FakeQuantWithMinMaxVars);
        node_pre_residual_FakeQuantWithMinMaxVars->set_common_node_parameters(
            NodeParams{"pre_residual_FakeQuantWithMinMaxVars", target});
        node_pre_residual_FakeQuantWithMinMaxVars->output(0)->set_accessor(get_weights_accessor(
            data_path, "/cnn_data/edsr_model/pre_residual_FakeQuantWithMinMaxVars.npy", DataLayout::NHWC));

        TensorShape input_shape{};
        input_shape.set(0, 3, false).set(1, 360, false).set(2, 640, false).set(3, 1, false);

        NodeID id_input = _graph.add_node<InputNode>(
            TensorDescriptor{input_shape, DataType::QASYMM8, QuantizationInfo(0.003921568859368563), DataLayout::NHWC});
        INode *node_input = _graph.node(id_input);
        node_input->set_common_node_parameters(NodeParams{"input", target});
        node_input->output(0)->set_accessor(get_input_accessor(common_params));

        NodeID id_pre_residual_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.0033370566088706255, 96));
        INode *node_pre_residual_BiasAdd = _graph.node(id_pre_residual_BiasAdd);
        node_pre_residual_BiasAdd->set_common_node_parameters(NodeParams{"pre_residual_BiasAdd", target});
        _graph.add_connection(id_input, 0, id_pre_residual_BiasAdd, 0);
        _graph.add_connection(id_pre_residual_FakeQuantWithMinMaxVars, 0, id_pre_residual_BiasAdd, 1);
        _graph.add_connection(id_pre_residual_Conv2D_bias, 0, id_pre_residual_BiasAdd, 2);

        NodeID id_block_0_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.007344874087721109, 185));
        INode *node_block_0_1_BiasAdd = _graph.node(id_block_0_1_BiasAdd);
        node_block_0_1_BiasAdd->set_common_node_parameters(NodeParams{"block_0_1_BiasAdd", target});
        _graph.add_connection(id_pre_residual_BiasAdd, 0, id_block_0_1_BiasAdd, 0);
        _graph.add_connection(id_block_0_1_FakeQuantWithMinMaxVars, 0, id_block_0_1_BiasAdd, 1);
        _graph.add_connection(id_block_0_1_Conv2D_bias, 0, id_block_0_1_BiasAdd, 2);

        NodeID id_mul = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0006341293919831514, 174}});
        INode *node_mul = _graph.node(id_mul);
        node_mul->set_common_node_parameters(NodeParams{"mul", target});
        _graph.add_connection(id_block_0_1_BiasAdd, 0, id_mul, 0);
        _graph.add_connection(id_mul_y, 0, id_mul, 1);

        NodeID id_add = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0031092411372810602, 95}});
        INode *node_add = _graph.node(id_add);
        node_add->set_common_node_parameters(NodeParams{"add", target});
        _graph.add_connection(id_pre_residual_BiasAdd, 0, id_add, 0);
        _graph.add_connection(id_mul, 0, id_add, 1);

        NodeID id_block_1_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.005333727691322565, 117));
        INode *node_block_1_1_BiasAdd = _graph.node(id_block_1_1_BiasAdd);
        node_block_1_1_BiasAdd->set_common_node_parameters(NodeParams{"block_1_1_BiasAdd", target});
        _graph.add_connection(id_add, 0, id_block_1_1_BiasAdd, 0);
        _graph.add_connection(id_block_1_1_FakeQuantWithMinMaxVars, 0, id_block_1_1_BiasAdd, 1);
        _graph.add_connection(id_block_1_1_Conv2D_bias, 0, id_block_1_1_BiasAdd, 2);

        NodeID id_mul_1 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0004965941770933568, 122}});
        INode *node_mul_1 = _graph.node(id_mul_1);
        node_mul_1->set_common_node_parameters(NodeParams{"mul_1", target});
        _graph.add_connection(id_block_1_1_BiasAdd, 0, id_mul_1, 0);
        _graph.add_connection(id_mul_1_y, 0, id_mul_1, 1);

        NodeID id_add_1 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0030700892675668, 96}});
        INode *node_add_1 = _graph.node(id_add_1);
        node_add_1->set_common_node_parameters(NodeParams{"add_1", target});
        _graph.add_connection(id_add, 0, id_add_1, 0);
        _graph.add_connection(id_mul_1, 0, id_add_1, 1);

        NodeID id_block_2_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.004199742339551449, 132));
        INode *node_block_2_1_BiasAdd = _graph.node(id_block_2_1_BiasAdd);
        node_block_2_1_BiasAdd->set_common_node_parameters(NodeParams{"block_2_1_BiasAdd", target});
        _graph.add_connection(id_add_1, 0, id_block_2_1_BiasAdd, 0);
        _graph.add_connection(id_block_2_1_FakeQuantWithMinMaxVars, 0, id_block_2_1_BiasAdd, 1);
        _graph.add_connection(id_block_2_1_Conv2D_bias, 0, id_block_2_1_BiasAdd, 2);

        NodeID id_mul_2 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0004133903712499887, 130}});
        INode *node_mul_2 = _graph.node(id_mul_2);
        node_mul_2->set_common_node_parameters(NodeParams{"mul_2", target});
        _graph.add_connection(id_block_2_1_BiasAdd, 0, id_mul_2, 0);
        _graph.add_connection(id_mul_2_y, 0, id_mul_2, 1);

        NodeID id_add_2 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.003026385325938463, 94}});
        INode *node_add_2 = _graph.node(id_add_2);
        node_add_2->set_common_node_parameters(NodeParams{"add_2", target});
        _graph.add_connection(id_add_1, 0, id_add_2, 0);
        _graph.add_connection(id_mul_2, 0, id_add_2, 1);

        NodeID id_block_3_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.003977528307586908, 142));
        INode *node_block_3_1_BiasAdd = _graph.node(id_block_3_1_BiasAdd);
        node_block_3_1_BiasAdd->set_common_node_parameters(NodeParams{"block_3_1_BiasAdd", target});
        _graph.add_connection(id_add_2, 0, id_block_3_1_BiasAdd, 0);
        _graph.add_connection(id_block_3_1_FakeQuantWithMinMaxVars, 0, id_block_3_1_BiasAdd, 1);
        _graph.add_connection(id_block_3_1_Conv2D_bias, 0, id_block_3_1_BiasAdd, 2);

        NodeID id_mul_3 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0003943995980080217, 141}});
        INode *node_mul_3 = _graph.node(id_mul_3);
        node_mul_3->set_common_node_parameters(NodeParams{"mul_3", target});
        _graph.add_connection(id_block_3_1_BiasAdd, 0, id_mul_3, 0);
        _graph.add_connection(id_mul_3_y, 0, id_mul_3, 1);

        NodeID id_add_3 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.003101327223703265, 98}});
        INode *node_add_3 = _graph.node(id_add_3);
        node_add_3->set_common_node_parameters(NodeParams{"add_3", target});
        _graph.add_connection(id_add_2, 0, id_add_3, 0);
        _graph.add_connection(id_mul_3, 0, id_add_3, 1);

        NodeID id_block_4_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.0045388080179691315, 146));
        INode *node_block_4_1_BiasAdd = _graph.node(id_block_4_1_BiasAdd);
        node_block_4_1_BiasAdd->set_common_node_parameters(NodeParams{"block_4_1_BiasAdd", target});
        _graph.add_connection(id_add_3, 0, id_block_4_1_BiasAdd, 0);
        _graph.add_connection(id_block_4_1_FakeQuantWithMinMaxVars, 0, id_block_4_1_BiasAdd, 1);
        _graph.add_connection(id_block_4_1_Conv2D_bias, 0, id_block_4_1_BiasAdd, 2);

        NodeID id_mul_4 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.00044342130422592163, 143}});
        INode *node_mul_4 = _graph.node(id_mul_4);
        node_mul_4->set_common_node_parameters(NodeParams{"mul_4", target});
        _graph.add_connection(id_block_4_1_BiasAdd, 0, id_mul_4, 0);
        _graph.add_connection(id_mul_4_y, 0, id_mul_4, 1);

        NodeID id_add_4 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.003150839824229479, 98}});
        INode *node_add_4 = _graph.node(id_add_4);
        node_add_4->set_common_node_parameters(NodeParams{"add_4", target});
        _graph.add_connection(id_add_3, 0, id_add_4, 0);
        _graph.add_connection(id_mul_4, 0, id_add_4, 1);

        NodeID id_block_5_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.00402890844270587, 132));
        INode *node_block_5_1_BiasAdd = _graph.node(id_block_5_1_BiasAdd);
        node_block_5_1_BiasAdd->set_common_node_parameters(NodeParams{"block_5_1_BiasAdd", target});
        _graph.add_connection(id_add_4, 0, id_block_5_1_BiasAdd, 0);
        _graph.add_connection(id_block_5_1_FakeQuantWithMinMaxVars, 0, id_block_5_1_BiasAdd, 1);
        _graph.add_connection(id_block_5_1_Conv2D_bias, 0, id_block_5_1_BiasAdd, 2);

        NodeID id_mul_5 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0004023382789455354, 132}});
        INode *node_mul_5 = _graph.node(id_mul_5);
        node_mul_5->set_common_node_parameters(NodeParams{"mul_5", target});
        _graph.add_connection(id_block_5_1_BiasAdd, 0, id_mul_5, 0);
        _graph.add_connection(id_mul_5_y, 0, id_mul_5, 1);

        NodeID id_add_5 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0030975888948887587, 94}});
        INode *node_add_5 = _graph.node(id_add_5);
        node_add_5->set_common_node_parameters(NodeParams{"add_5", target});
        _graph.add_connection(id_add_4, 0, id_add_5, 0);
        _graph.add_connection(id_mul_5, 0, id_add_5, 1);

        NodeID id_block_6_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.00421866774559021, 125));
        INode *node_block_6_1_BiasAdd = _graph.node(id_block_6_1_BiasAdd);
        node_block_6_1_BiasAdd->set_common_node_parameters(NodeParams{"block_6_1_BiasAdd", target});
        _graph.add_connection(id_add_5, 0, id_block_6_1_BiasAdd, 0);
        _graph.add_connection(id_block_6_1_FakeQuantWithMinMaxVars, 0, id_block_6_1_BiasAdd, 1);
        _graph.add_connection(id_block_6_1_Conv2D_bias, 0, id_block_6_1_BiasAdd, 2);

        NodeID id_mul_6 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.00041950203012675047, 125}});
        INode *node_mul_6 = _graph.node(id_mul_6);
        node_mul_6->set_common_node_parameters(NodeParams{"mul_6", target});
        _graph.add_connection(id_block_6_1_BiasAdd, 0, id_mul_6, 0);
        _graph.add_connection(id_mul_6_y, 0, id_mul_6, 1);

        NodeID id_add_6 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.003155382815748453, 92}});
        INode *node_add_6 = _graph.node(id_add_6);
        node_add_6->set_common_node_parameters(NodeParams{"add_6", target});
        _graph.add_connection(id_add_5, 0, id_add_6, 0);
        _graph.add_connection(id_mul_6, 0, id_add_6, 1);

        NodeID id_block_7_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.004250136204063892, 143));
        INode *node_block_7_1_BiasAdd = _graph.node(id_block_7_1_BiasAdd);
        node_block_7_1_BiasAdd->set_common_node_parameters(NodeParams{"block_7_1_BiasAdd", target});
        _graph.add_connection(id_add_6, 0, id_block_7_1_BiasAdd, 0);
        _graph.add_connection(id_block_7_1_FakeQuantWithMinMaxVars, 0, id_block_7_1_BiasAdd, 1);
        _graph.add_connection(id_block_7_1_Conv2D_bias, 0, id_block_7_1_BiasAdd, 2);

        NodeID id_mul_7 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.00042401350219734013, 142}});
        INode *node_mul_7 = _graph.node(id_mul_7);
        node_mul_7->set_common_node_parameters(NodeParams{"mul_7", target});
        _graph.add_connection(id_block_7_1_BiasAdd, 0, id_mul_7, 0);
        _graph.add_connection(id_mul_7_y, 0, id_mul_7, 1);

        NodeID id_add_7 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0031760605052113533, 86}});
        INode *node_add_7 = _graph.node(id_add_7);
        node_add_7->set_common_node_parameters(NodeParams{"add_7", target});
        _graph.add_connection(id_add_6, 0, id_add_7, 0);
        _graph.add_connection(id_mul_7, 0, id_add_7, 1);

        NodeID id_block_8_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.004277155734598637, 123));
        INode *node_block_8_1_BiasAdd = _graph.node(id_block_8_1_BiasAdd);
        node_block_8_1_BiasAdd->set_common_node_parameters(NodeParams{"block_8_1_BiasAdd", target});
        _graph.add_connection(id_add_7, 0, id_block_8_1_BiasAdd, 0);
        _graph.add_connection(id_block_8_1_FakeQuantWithMinMaxVars, 0, id_block_8_1_BiasAdd, 1);
        _graph.add_connection(id_block_8_1_Conv2D_bias, 0, id_block_8_1_BiasAdd, 2);

        NodeID id_mul_8 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.00042673019925132394, 123}});
        INode *node_mul_8 = _graph.node(id_mul_8);
        node_mul_8->set_common_node_parameters(NodeParams{"mul_8", target});
        _graph.add_connection(id_block_8_1_BiasAdd, 0, id_mul_8, 0);
        _graph.add_connection(id_mul_8_y, 0, id_mul_8, 1);

        NodeID id_add_8 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0032156009692698717, 86}});
        INode *node_add_8 = _graph.node(id_add_8);
        node_add_8->set_common_node_parameters(NodeParams{"add_8", target});
        _graph.add_connection(id_add_7, 0, id_add_8, 0);
        _graph.add_connection(id_mul_8, 0, id_add_8, 1);

        NodeID id_block_9_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.00445037754252553, 129));
        INode *node_block_9_1_BiasAdd = _graph.node(id_block_9_1_BiasAdd);
        node_block_9_1_BiasAdd->set_common_node_parameters(NodeParams{"block_9_1_BiasAdd", target});
        _graph.add_connection(id_add_8, 0, id_block_9_1_BiasAdd, 0);
        _graph.add_connection(id_block_9_1_FakeQuantWithMinMaxVars, 0, id_block_9_1_BiasAdd, 1);
        _graph.add_connection(id_block_9_1_Conv2D_bias, 0, id_block_9_1_BiasAdd, 2);

        NodeID id_mul_9 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0004448975087143481, 129}});
        INode *node_mul_9 = _graph.node(id_mul_9);
        node_mul_9->set_common_node_parameters(NodeParams{"mul_9", target});
        _graph.add_connection(id_block_9_1_BiasAdd, 0, id_mul_9, 0);
        _graph.add_connection(id_mul_9_y, 0, id_mul_9, 1);

        NodeID id_add_9 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0032742770854383707, 80}});
        INode *node_add_9 = _graph.node(id_add_9);
        node_add_9->set_common_node_parameters(NodeParams{"add_9", target});
        _graph.add_connection(id_add_8, 0, id_add_9, 0);
        _graph.add_connection(id_mul_9, 0, id_add_9, 1);

        NodeID id_block_10_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.003614710411056876, 131));
        INode *node_block_10_1_BiasAdd = _graph.node(id_block_10_1_BiasAdd);
        node_block_10_1_BiasAdd->set_common_node_parameters(NodeParams{"block_10_1_BiasAdd", target});
        _graph.add_connection(id_add_9, 0, id_block_10_1_BiasAdd, 0);
        _graph.add_connection(id_block_10_1_FakeQuantWithMinMaxVars, 0, id_block_10_1_BiasAdd, 1);
        _graph.add_connection(id_block_10_1_Conv2D_bias, 0, id_block_10_1_BiasAdd, 2);

        NodeID id_mul_10 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.00036083892337046564, 130}});
        INode *node_mul_10 = _graph.node(id_mul_10);
        node_mul_10->set_common_node_parameters(NodeParams{"mul_10", target});
        _graph.add_connection(id_block_10_1_BiasAdd, 0, id_mul_10, 0);
        _graph.add_connection(id_mul_10_y, 0, id_mul_10, 1);

        NodeID id_add_10 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0031881770119071007, 81}});
        INode *node_add_10 = _graph.node(id_add_10);
        node_add_10->set_common_node_parameters(NodeParams{"add_10", target});
        _graph.add_connection(id_add_9, 0, id_add_10, 0);
        _graph.add_connection(id_mul_10, 0, id_add_10, 1);

        NodeID id_block_11_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.003969002980738878, 133));
        INode *node_block_11_1_BiasAdd = _graph.node(id_block_11_1_BiasAdd);
        node_block_11_1_BiasAdd->set_common_node_parameters(NodeParams{"block_11_1_BiasAdd", target});
        _graph.add_connection(id_add_10, 0, id_block_11_1_BiasAdd, 0);
        _graph.add_connection(id_block_11_1_FakeQuantWithMinMaxVars, 0, id_block_11_1_BiasAdd, 1);
        _graph.add_connection(id_block_11_1_Conv2D_bias, 0, id_block_11_1_BiasAdd, 2);

        NodeID id_mul_11 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0003968806122429669, 133}});
        INode *node_mul_11 = _graph.node(id_mul_11);
        node_mul_11->set_common_node_parameters(NodeParams{"mul_11", target});
        _graph.add_connection(id_block_11_1_BiasAdd, 0, id_mul_11, 0);
        _graph.add_connection(id_mul_11_y, 0, id_mul_11, 1);

        NodeID id_add_11 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0032707711216062307, 80}});
        INode *node_add_11 = _graph.node(id_add_11);
        node_add_11->set_common_node_parameters(NodeParams{"add_11", target});
        _graph.add_connection(id_add_10, 0, id_add_11, 0);
        _graph.add_connection(id_mul_11, 0, id_add_11, 1);

        NodeID id_block_12_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.004366801120340824, 110));
        INode *node_block_12_1_BiasAdd = _graph.node(id_block_12_1_BiasAdd);
        node_block_12_1_BiasAdd->set_common_node_parameters(NodeParams{"block_12_1_BiasAdd", target});
        _graph.add_connection(id_add_11, 0, id_block_12_1_BiasAdd, 0);
        _graph.add_connection(id_block_12_1_FakeQuantWithMinMaxVars, 0, id_block_12_1_BiasAdd, 1);
        _graph.add_connection(id_block_12_1_Conv2D_bias, 0, id_block_12_1_BiasAdd, 2);

        NodeID id_mul_12 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0004365936329122633, 110}});
        INode *node_mul_12 = _graph.node(id_mul_12);
        node_mul_12->set_common_node_parameters(NodeParams{"mul_12", target});
        _graph.add_connection(id_block_12_1_BiasAdd, 0, id_mul_12, 0);
        _graph.add_connection(id_mul_12_y, 0, id_mul_12, 1);

        NodeID id_add_12 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.003275055903941393, 79}});
        INode *node_add_12 = _graph.node(id_add_12);
        node_add_12->set_common_node_parameters(NodeParams{"add_12", target});
        _graph.add_connection(id_add_11, 0, id_add_12, 0);
        _graph.add_connection(id_mul_12, 0, id_add_12, 1);

        NodeID id_block_13_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.004386766813695431, 139));
        INode *node_block_13_1_BiasAdd = _graph.node(id_block_13_1_BiasAdd);
        node_block_13_1_BiasAdd->set_common_node_parameters(NodeParams{"block_13_1_BiasAdd", target});
        _graph.add_connection(id_add_12, 0, id_block_13_1_BiasAdd, 0);
        _graph.add_connection(id_block_13_1_FakeQuantWithMinMaxVars, 0, id_block_13_1_BiasAdd, 1);
        _graph.add_connection(id_block_13_1_Conv2D_bias, 0, id_block_13_1_BiasAdd, 2);

        NodeID id_mul_13 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0004385628562886268, 139}});
        INode *node_mul_13 = _graph.node(id_mul_13);
        node_mul_13->set_common_node_parameters(NodeParams{"mul_13", target});
        _graph.add_connection(id_block_13_1_BiasAdd, 0, id_mul_13, 0);
        _graph.add_connection(id_mul_13_y, 0, id_mul_13, 1);

        NodeID id_add_13 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0033287261612713337, 78}});
        INode *node_add_13 = _graph.node(id_add_13);
        node_add_13->set_common_node_parameters(NodeParams{"add_13", target});
        _graph.add_connection(id_add_12, 0, id_add_13, 0);
        _graph.add_connection(id_mul_13, 0, id_add_13, 1);

        NodeID id_block_14_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.0038069337606430054, 130));
        INode *node_block_14_1_BiasAdd = _graph.node(id_block_14_1_BiasAdd);
        node_block_14_1_BiasAdd->set_common_node_parameters(NodeParams{"block_14_1_BiasAdd", target});
        _graph.add_connection(id_add_13, 0, id_block_14_1_BiasAdd, 0);
        _graph.add_connection(id_block_14_1_FakeQuantWithMinMaxVars, 0, id_block_14_1_BiasAdd, 1);
        _graph.add_connection(id_block_14_1_Conv2D_bias, 0, id_block_14_1_BiasAdd, 2);

        NodeID id_mul_14 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.00037829321809113026, 130}});
        INode *node_mul_14 = _graph.node(id_mul_14);
        node_mul_14->set_common_node_parameters(NodeParams{"mul_14", target});
        _graph.add_connection(id_block_14_1_BiasAdd, 0, id_mul_14, 0);
        _graph.add_connection(id_mul_14_y, 0, id_mul_14, 1);

        NodeID id_add_14 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0033590947277843952, 77}});
        INode *node_add_14 = _graph.node(id_add_14);
        node_add_14->set_common_node_parameters(NodeParams{"add_14", target});
        _graph.add_connection(id_add_13, 0, id_add_14, 0);
        _graph.add_connection(id_mul_14, 0, id_add_14, 1);

        NodeID id_block_15_1_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.004009159281849861, 130));
        INode *node_block_15_1_BiasAdd = _graph.node(id_block_15_1_BiasAdd);
        node_block_15_1_BiasAdd->set_common_node_parameters(NodeParams{"block_15_1_BiasAdd", target});
        _graph.add_connection(id_add_14, 0, id_block_15_1_BiasAdd, 0);
        _graph.add_connection(id_block_15_1_FakeQuantWithMinMaxVars, 0, id_block_15_1_BiasAdd, 1);
        _graph.add_connection(id_block_15_1_Conv2D_bias, 0, id_block_15_1_BiasAdd, 2);

        NodeID id_mul_15 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Mul, QuantizationInfo{0.0004008286341559142, 130}});
        INode *node_mul_15 = _graph.node(id_mul_15);
        node_mul_15->set_common_node_parameters(NodeParams{"mul_15", target});
        _graph.add_connection(id_block_15_1_BiasAdd, 0, id_mul_15, 0);
        _graph.add_connection(id_mul_15_y, 0, id_mul_15, 1);

        NodeID id_add_15 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0035031239967793226, 78}});
        INode *node_add_15 = _graph.node(id_add_15);
        node_add_15->set_common_node_parameters(NodeParams{"add_15", target});
        _graph.add_connection(id_add_14, 0, id_add_15, 0);
        _graph.add_connection(id_mul_15, 0, id_add_15, 1);

        NodeID id_post_residual_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.005167999770492315, 112));
        INode *node_post_residual_BiasAdd = _graph.node(id_post_residual_BiasAdd);
        node_post_residual_BiasAdd->set_common_node_parameters(NodeParams{"post_residual_BiasAdd", target});
        _graph.add_connection(id_add_15, 0, id_post_residual_BiasAdd, 0);
        _graph.add_connection(id_post_residual_FakeQuantWithMinMaxVars, 0, id_post_residual_BiasAdd, 1);
        _graph.add_connection(id_post_residual_Conv2D_bias, 0, id_post_residual_BiasAdd, 2);

        NodeID id_add_16 = _graph.add_node<EltwiseLayerNode>(
            descriptors::EltwiseLayerDescriptor{EltwiseOperation::Add, QuantizationInfo{0.0065071373246610165, 89}});
        INode *node_add_16 = _graph.node(id_add_16);
        node_add_16->set_common_node_parameters(NodeParams{"add_16", target});
        _graph.add_connection(id_post_residual_BiasAdd, 0, id_add_16, 0);
        _graph.add_connection(id_pre_residual_BiasAdd, 0, id_add_16, 1);

        NodeID id_pre_upscale_BiasAdd =
            _graph.add_node<ConvolutionLayerNode>(PadStrideInfo{1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR}, 1,
                                                  arm_compute::graph::ConvolutionMethod::Default,
                                                  FastMathHint::Disabled, QuantizationInfo(0.005013593938201666, 26));
        INode *node_pre_upscale_BiasAdd = _graph.node(id_pre_upscale_BiasAdd);
        node_pre_upscale_BiasAdd->set_common_node_parameters(NodeParams{"pre_upscale_BiasAdd", target});
        _graph.add_connection(id_add_16, 0, id_pre_upscale_BiasAdd, 0);
        _graph.add_connection(id_pre_upscale_FakeQuantWithMinMaxVars, 0, id_pre_upscale_BiasAdd, 1);
        _graph.add_connection(id_pre_upscale_Conv2D_bias, 0, id_pre_upscale_BiasAdd, 2);

        NodeID id_upscale_net_FakeQuantWithMinMaxVars_1 = _graph.add_node<DeconvolutionLayerNode>(
            descriptors::DeconvolutionLayerDescriptor{PadStrideInfo{2, 2, 0, 0, 0, 0, DimensionRoundingType::FLOOR},
                                                      QuantizationInfo{0.004990961868315935, 26}});
        INode *node_upscale_net_FakeQuantWithMinMaxVars_1 = _graph.node(id_upscale_net_FakeQuantWithMinMaxVars_1);
        node_upscale_net_FakeQuantWithMinMaxVars_1->set_common_node_parameters(
            NodeParams{"upscale_net_FakeQuantWithMinMaxVars_1", target});
        _graph.add_connection(id_pre_upscale_BiasAdd, 0, id_upscale_net_FakeQuantWithMinMaxVars_1, 0);
        _graph.add_connection(id_upscale_net_FakeQuantWithMinMaxVars_transposed, 0,
                              id_upscale_net_FakeQuantWithMinMaxVars_1, 1);
        TensorShape output_shape;
        output_shape.set(0, 3, false).set(1, 720, false).set(2, 1280, false).set(3, 1, false);

        NodeID id_output_140211982446376   = _graph.add_node<OutputNode>();
        INode *node_output_140211982446376 = _graph.node(id_output_140211982446376);
        node_output_140211982446376->set_common_node_parameters(NodeParams{"output_140211982446376", target});
        _graph.add_connection(id_upscale_net_FakeQuantWithMinMaxVars_1, 0, id_output_140211982446376, 0);
        node_output_140211982446376->input(0)->set_accessor(get_npy_output_accessor(
            expected_output_filename.value(), output_shape, common_params.data_type, common_params.data_layout));

        return true;
    }

    arm_compute::graph::Graph &graph()
    {
        return _graph;
    }

private:
    arm_compute::graph::Graph _graph;
};

#endif /* ARM_COMPUTE_GRAPH_EDSR_H */
