src/graph/backends/GLES/GCFunctionsFactory.cpp
std::unique_ptr<IFunction> create_convolution_layer(ConvolutionLayerNode &node, GraphContext &ctx)
{
    ARM_COMPUTE_LOG_GRAPH_VERBOSE("Creating GC ConvolutionLayer node with ID : " << node.id() << " and Name: " << node.name() << std::endl);
    ARM_COMPUTE_ERROR_ON(node.num_inputs() != 3);
    ARM_COMPUTE_ERROR_ON(node.num_outputs() != 1);

    // Extract IO and info
    IGCTensor *input   = get_backing_tensor(node.input(0));
    IGCTensor *weights = get_backing_tensor(node.input(1));
    IGCTensor *biases  = get_backing_tensor(node.input(2));
    IGCTensor *output  = get_backing_tensor(node.output(0));

    if(is_data_type_quantized_asymmetric(input->info()->data_type()))
    {
        biases->info()->set_data_type(DataType::S32);
    }

    const PadStrideInfo     conv_info      = node.convolution_info();
    const ConvolutionMethod conv_algorithm = node.convolution_method();

    // Create and configure function (we assume that functions have been validated before creation)
    std::shared_ptr<IMemoryManager> mm = get_memory_manager(ctx, Target::GC);
    std::unique_ptr<IFunction>      func;
    std::string                     func_name;

    if(conv_algorithm == ConvolutionMethod::DIRECT)
    {
        std::tie(func, func_name) = create_named_function<GCDirectConvolutionLayer>(
                                        std::string("GCDirectConvolutionLayer"), input, weights, biases, output, conv_info);
    }
    else
    {
        std::tie(func, func_name) = create_named_memory_managed_function<GCConvolutionLayer>(std::string("GCConvolutionLayer"), mm,
                                                                                             input, weights, biases, output, conv_info);
    }

    // Log info
    ARM_COMPUTE_LOG_GRAPH_INFO("Instantiated " << func_name
                               << " Data Type: " << input->info()->data_type()
                               << " Input QuantInfo: " << input->info()->quantization_info()
                               << " Weights QuantInfo: " << weights->info()->quantization_info()
                               << " Input shape: " << input->info()->tensor_shape()
                               << " Weights shape: " << weights->info()->tensor_shape()
                               << " Output shape: " << output->info()->tensor_shape()
                               << std::endl);
    return func;
}
/** Create a backend convolution layer function
 *
 * @param[in] node Node to create the backend function for
 *
 * @return Backend convolution layer function
 */
Create a backend convolution layer function
@param[in] node Node to create the backend function for

@return Backend convolution layer function
Create a backend convolution layer function @param [ in ] node Node to create the backend function for @return Backend convolution layer function
std::unique_ptr<IFunction> create_convolution_layer(ConvolutionLayerNode &node, GraphContext &ctx)
{
    ARM_COMPUTE_LOG_GRAPH_VERBOSE("Creating GC ConvolutionLayer node with ID : " << node.id() << " and Name: " << node.name() << std::endl);
    ARM_COMPUTE_ERROR_ON(node.num_inputs() != 3);
    ARM_COMPUTE_ERROR_ON(node.num_outputs() != 1);
    IGCTensor *input   = get_backing_tensor(node.input(0));
    IGCTensor *weights = get_backing_tensor(node.input(1));
    IGCTensor *biases  = get_backing_tensor(node.input(2));
    IGCTensor *output  = get_backing_tensor(node.output(0));
    if(is_data_type_quantized_asymmetric(input->info()->data_type()))
    {
        biases->info()->set_data_type(DataType::S32);
    }
    const PadStrideInfo     conv_info      = node.convolution_info();
    const ConvolutionMethod conv_algorithm = node.convolution_method();
    std::shared_ptr<IMemoryManager> mm = get_memory_manager(ctx, Target::GC);
    std::unique_ptr<IFunction>      func;
    std::string                     func_name;
    if(conv_algorithm == ConvolutionMethod::DIRECT)
    {
        std::tie(func, func_name) = create_named_function<GCDirectConvolutionLayer>(
                                        std::string("GCDirectConvolutionLayer"), input, weights, biases, output, conv_info);
    }
    else
    {
        std::tie(func, func_name) = create_named_memory_managed_function<GCConvolutionLayer>(std::string("GCConvolutionLayer"), mm,
                                                                                             input, weights, biases, output, conv_info);
    }
    ARM_COMPUTE_LOG_GRAPH_INFO("Instantiated " << func_name
                               << " Data Type: " << input->info()->data_type()
                               << " Input QuantInfo: " << input->info()->quantization_info()
                               << " Weights QuantInfo: " << weights->info()->quantization_info()
                               << " Input shape: " << input->info()->tensor_shape()
                               << " Weights shape: " << weights->info()->tensor_shape()
                               << " Output shape: " << output->info()->tensor_shape()
                               << std::endl);
    return func;
}
std :: unique_ptr < IFunction > create_convolution_layer ( ConvolutionLayerNode & node , GraphContext & ctx ) { ARM_COMPUTE_LOG_GRAPH_VERBOSE ( " " << node . id ( ) << " " << node . name ( ) << std :: endl ) ; ARM_COMPUTE_ERROR_ON ( node . num_inputs ( ) != 3 ) ; ARM_COMPUTE_ERROR_ON ( node . num_outputs ( ) != 1 ) ; IGCTensor * input = get_backing_tensor ( node . input ( 0 ) ) ; IGCTensor * weights = get_backing_tensor ( node . input ( 1 ) ) ; IGCTensor * biases = get_backing_tensor ( node . input ( 2 ) ) ; IGCTensor * output = get_backing_tensor ( node . output ( 0 ) ) ; if ( is_data_type_quantized_asymmetric ( input -> info ( ) -> data_type ( ) ) ) { biases -> info ( ) -> set_data_type ( DataType :: S32 ) ; } const PadStrideInfo conv_info = node . convolution_info ( ) ; const ConvolutionMethod conv_algorithm = node . convolution_method ( ) ; std :: shared_ptr < IMemoryManager > mm = get_memory_manager ( ctx , Target :: GC ) ; std :: unique_ptr < IFunction > func ; std :: string func_name ; if ( conv_algorithm == ConvolutionMethod :: DIRECT ) { std :: tie ( func , func_name ) = create_named_function < GCDirectConvolutionLayer > ( std :: string ( " " ) , input , weights , biases , output , conv_info ) ; } else { std :: tie ( func , func_name ) = create_named_memory_managed_function < GCConvolutionLayer > ( std :: string ( " " ) , mm , input , weights , biases , output , conv_info ) ; } ARM_COMPUTE_LOG_GRAPH_INFO ( " " << func_name << " " << input -> info ( ) -> data_type ( ) << " " << input -> info ( ) -> quantization_info ( ) << " " << weights -> info ( ) -> quantization_info ( ) << " " << input -> info ( ) -> tensor_shape ( ) << " " << weights -> info ( ) -> tensor_shape ( ) << " " << output -> info ( ) -> tensor_shape ( ) << std :: endl ) ; return func ; }
Create a backend convolution layer function
 @param[in] node Node to create the backend function for
Create a backend convolution layer function @param [ in ] node Node to create the backend function for
// Extract IO and info // Create and configure function (we assume that functions have been validated before creation) // Log info