Loading [MathJax]/extensions/tex2jax.js
Compute Library
 24.07
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
arm_compute::test::validation::reference Namespace Reference

Enumerations

enum  ArithmeticOperation { ADD, SUB }
 Arithmetic operation types. More...
 
enum  FFTDirection { Forward, Inverse }
 
enum  WinogradTransformType { INPUT, FILTER, OUTPUT }
 Winograd transform type. More...
 

Functions

template<typename T >
SimpleTensor< T > absolute_difference (const SimpleTensor< T > &src1, const SimpleTensor< T > &src2, DataType dst_data_type)
 
template SimpleTensor< uint8_t > absolute_difference (const SimpleTensor< uint8_t > &src1, const SimpleTensor< uint8_t > &src2, DataType dst_data_type)
 
template SimpleTensor< int16_t > absolute_difference (const SimpleTensor< int16_t > &src1, const SimpleTensor< int16_t > &src2, DataType dst_data_type)
 
template SimpleTensor< int8_t > absolute_difference (const SimpleTensor< int8_t > &src1, const SimpleTensor< int8_t > &src2, DataType dst_data_type)
 
template<typename T1 , typename T2 >
SimpleTensor< T2 > accumulate (const SimpleTensor< T1 > &src, DataType output_data_type)
 
template<typename T1 , typename T2 >
SimpleTensor< T2 > accumulate_weighted (const SimpleTensor< T1 > &src, float alpha, DataType output_data_type)
 
template<typename T1 , typename T2 >
SimpleTensor< T2 > accumulate_squared (const SimpleTensor< T1 > &src, uint32_t shift, DataType output_data_type)
 
template SimpleTensor< int16_t > accumulate (const SimpleTensor< uint8_t > &src, DataType output_data_type)
 
template SimpleTensor< uint8_t > accumulate_weighted (const SimpleTensor< uint8_t > &src, float alpha, DataType output_data_type)
 
template SimpleTensor< int16_t > accumulate_squared (const SimpleTensor< uint8_t > &src, uint32_t shift, DataType output_data_type)
 
template<typename T >
SimpleTensor< T > activation_layer (const SimpleTensor< T > &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
 
template<>
SimpleTensor< uint8_t > activation_layer< uint8_t > (const SimpleTensor< uint8_t > &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
 
template<>
SimpleTensor< int8_t > activation_layer< int8_t > (const SimpleTensor< int8_t > &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
 
template<>
SimpleTensor< int16_t > activation_layer< int16_t > (const SimpleTensor< int16_t > &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
 
template SimpleTensor< int32_t > activation_layer (const SimpleTensor< int32_t > &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
 
template SimpleTensor< float > activation_layer (const SimpleTensor< float > &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
 
template SimpleTensor< halfactivation_layer (const SimpleTensor< half > &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
 
template SimpleTensor< bfloat16activation_layer (const SimpleTensor< bfloat16 > &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
 
template<typename T >
activate_float (T x, T a, T b, ActivationLayerInfo::ActivationFunction activation)
 
template<typename T >
SimpleTensor< T > arithmetic_division (const SimpleTensor< T > &src1, const SimpleTensor< T > &src2, DataType data_type)
 
template SimpleTensor< halfarithmetic_division (const SimpleTensor< half > &src1, const SimpleTensor< half > &src2, DataType data_type)
 
template SimpleTensor< float > arithmetic_division (const SimpleTensor< float > &src1, const SimpleTensor< float > &src2, DataType data_type)
 
template<typename T >
SimpleTensor< T > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< T > &src1, const SimpleTensor< T > &src2, SimpleTensor< T > &dst, ConvertPolicy convert_policy)
 
template<>
SimpleTensor< uint8_t > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< uint8_t > &src1, const SimpleTensor< uint8_t > &src2, SimpleTensor< uint8_t > &dst, ConvertPolicy convert_policy)
 
template<>
SimpleTensor< int8_t > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< int8_t > &src1, const SimpleTensor< int8_t > &src2, SimpleTensor< int8_t > &dst, ConvertPolicy convert_policy)
 
template<>
SimpleTensor< int16_t > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< int16_t > &src1, const SimpleTensor< int16_t > &src2, SimpleTensor< int16_t > &dst, ConvertPolicy convert_policy)
 
template SimpleTensor< int32_t > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< int32_t > &src1, const SimpleTensor< int32_t > &src2, SimpleTensor< int32_t > &dst, ConvertPolicy convert_policy)
 
template SimpleTensor< halfarithmetic_operation (ArithmeticOperation op, const SimpleTensor< half > &src1, const SimpleTensor< half > &src2, SimpleTensor< half > &dst, ConvertPolicy convert_policy)
 
template SimpleTensor< float > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< float > &src1, const SimpleTensor< float > &src2, SimpleTensor< float > &dst, ConvertPolicy convert_policy)
 
template<typename T >
SimpleTensor< T > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< T > &src1, const SimpleTensor< T > &src2, DataType dst_data_type, ConvertPolicy convert_policy)
 
template SimpleTensor< int32_t > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< int32_t > &src1, const SimpleTensor< int32_t > &src2, DataType dst_data_type, ConvertPolicy convert_policy)
 
template SimpleTensor< int16_t > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< int16_t > &src1, const SimpleTensor< int16_t > &src2, DataType dst_data_type, ConvertPolicy convert_policy)
 
template SimpleTensor< int8_t > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< int8_t > &src1, const SimpleTensor< int8_t > &src2, DataType dst_data_type, ConvertPolicy convert_policy)
 
template SimpleTensor< halfarithmetic_operation (ArithmeticOperation op, const SimpleTensor< half > &src1, const SimpleTensor< half > &src2, DataType dst_data_type, ConvertPolicy convert_policy)
 
template SimpleTensor< float > arithmetic_operation (ArithmeticOperation op, const SimpleTensor< float > &src1, const SimpleTensor< float > &src2, DataType dst_data_type, ConvertPolicy convert_policy)
 
template<typename T , typename std::enable_if< is_floating_point< T >::value, int >::type * >
SimpleTensor< T > batch_normalization_layer (const SimpleTensor< T > &src, const SimpleTensor< T > &mean, const SimpleTensor< T > &var, const SimpleTensor< T > &beta, const SimpleTensor< T > &gamma, float epsilon, ActivationLayerInfo act_info)
 
template SimpleTensor< float > batch_normalization_layer (const SimpleTensor< float > &src, const SimpleTensor< float > &mean, const SimpleTensor< float > &var, const SimpleTensor< float > &beta, const SimpleTensor< float > &gamma, float epsilon, ActivationLayerInfo act_info)
 
template SimpleTensor< halfbatch_normalization_layer (const SimpleTensor< half > &src, const SimpleTensor< half > &mean, const SimpleTensor< half > &var, const SimpleTensor< half > &beta, const SimpleTensor< half > &gamma, float epsilon, ActivationLayerInfo act_info)
 
template<typename T >
SimpleTensor< T > batch_to_space (const SimpleTensor< T > &src, const std::vector< int32_t > &block_shape, const CropInfo &crop_info, const TensorShape &dst_shape)
 
template SimpleTensor< float > batch_to_space (const SimpleTensor< float > &src, const std::vector< int32_t > &block_shape, const CropInfo &crop_info, const TensorShape &dst_shape)
 
template SimpleTensor< halfbatch_to_space (const SimpleTensor< half > &src, const std::vector< int32_t > &block_shape, const CropInfo &crop_info, const TensorShape &dst_shape)
 
template<typename T >
SimpleTensor< T > bitwise_and (const SimpleTensor< T > &src1, const SimpleTensor< T > &src2)
 
template SimpleTensor< uint8_t > bitwise_and (const SimpleTensor< uint8_t > &src1, const SimpleTensor< uint8_t > &src2)
 
template<typename T >
SimpleTensor< T > bitwise_not (const SimpleTensor< T > &src)
 
template SimpleTensor< uint8_t > bitwise_not (const SimpleTensor< uint8_t > &src)
 
template<typename T >
SimpleTensor< T > bitwise_or (const SimpleTensor< T > &src1, const SimpleTensor< T > &src2)
 
template SimpleTensor< uint8_t > bitwise_or (const SimpleTensor< uint8_t > &src1, const SimpleTensor< uint8_t > &src2)
 
template<typename T >
SimpleTensor< T > bitwise_xor (const SimpleTensor< T > &src1, const SimpleTensor< T > &src2)
 
template SimpleTensor< uint8_t > bitwise_xor (const SimpleTensor< uint8_t > &src1, const SimpleTensor< uint8_t > &src2)
 
template<typename T , typename TDeltas >
SimpleTensor< T > bounding_box_transform (const SimpleTensor< T > &boxes, const SimpleTensor< TDeltas > &deltas, const BoundingBoxTransformInfo &info)
 
template SimpleTensor< float > bounding_box_transform (const SimpleTensor< float > &boxes, const SimpleTensor< float > &deltas, const BoundingBoxTransformInfo &info)
 
template SimpleTensor< halfbounding_box_transform (const SimpleTensor< half > &boxes, const SimpleTensor< half > &deltas, const BoundingBoxTransformInfo &info)
 
template<>
SimpleTensor< uint16_t > bounding_box_transform (const SimpleTensor< uint16_t > &boxes, const SimpleTensor< uint8_t > &deltas, const BoundingBoxTransformInfo &info)
 
template<typename T >
SimpleTensor< T > channel_shuffle (const SimpleTensor< T > &src, int num_groups)
 
template SimpleTensor< uint8_t > channel_shuffle (const SimpleTensor< uint8_t > &src, int num_groups)
 
template SimpleTensor< uint16_t > channel_shuffle (const SimpleTensor< uint16_t > &src, int num_groups)
 
template SimpleTensor< uint32_t > channel_shuffle (const SimpleTensor< uint32_t > &src, int num_groups)
 
template SimpleTensor< halfchannel_shuffle (const SimpleTensor< half > &src, int num_groups)
 
template SimpleTensor< float > channel_shuffle (const SimpleTensor< float > &src, int num_groups)
 
template<typename T >
SimpleTensor< T > col2im (const SimpleTensor< T > &src, const TensorShape &dst_shape, unsigned int num_groups)
 
template SimpleTensor< float > col2im (const SimpleTensor< float > &src, const TensorShape &dst_shape, unsigned int num_groups)
 
template SimpleTensor< halfcol2im (const SimpleTensor< half > &src, const TensorShape &dst_shape, unsigned int num_groups)
 
template SimpleTensor< uint8_t > col2im (const SimpleTensor< uint8_t > &src, const TensorShape &dst_shape, unsigned int num_groups)
 
template<typename T >
SimpleTensor< uint8_t > compare (ComparisonOperation op, const SimpleTensor< T > &src1, const SimpleTensor< T > &src2)
 
template<>
SimpleTensor< uint8_t > compare (ComparisonOperation op, const SimpleTensor< uint8_t > &src1, const SimpleTensor< uint8_t > &src2)
 
template<>
SimpleTensor< uint8_t > compare (ComparisonOperation op, const SimpleTensor< int8_t > &src1, const SimpleTensor< int8_t > &src2)
 
template SimpleTensor< uint8_t > compare (ComparisonOperation op, const SimpleTensor< half > &src1, const SimpleTensor< half > &src2)
 
template SimpleTensor< uint8_t > compare (ComparisonOperation op, const SimpleTensor< float > &src1, const SimpleTensor< float > &src2)
 
template<typename T >
SimpleTensor< T > compute_all_anchors (const SimpleTensor< T > &anchors, const ComputeAnchorsInfo &info)
 
template SimpleTensor< float > compute_all_anchors (const SimpleTensor< float > &anchors, const ComputeAnchorsInfo &info)
 
template SimpleTensor< halfcompute_all_anchors (const SimpleTensor< half > &anchors, const ComputeAnchorsInfo &info)
 
template<>
SimpleTensor< int16_t > compute_all_anchors (const SimpleTensor< int16_t > &anchors, const ComputeAnchorsInfo &info)
 
template<typename T >
SimpleTensor< T > concatenate_layer (std::vector< SimpleTensor< T >> &srcs, SimpleTensor< T > &dst, unsigned int axis)
 
template SimpleTensor< float > concatenate_layer (std::vector< SimpleTensor< float >> &srcs, SimpleTensor< float > &dst, unsigned int axis)
 
template SimpleTensor< halfconcatenate_layer (std::vector< SimpleTensor< half >> &srcs, SimpleTensor< half > &dst, unsigned int axis)
 
template SimpleTensor< uint8_t > concatenate_layer (std::vector< SimpleTensor< uint8_t >> &srcs, SimpleTensor< uint8_t > &dst, unsigned int axis)
 
template SimpleTensor< int8_t > concatenate_layer (std::vector< SimpleTensor< int8_t >> &srcs, SimpleTensor< int8_t > &dst, unsigned int axis)
 
template<typename T , typename TB , typename TACC = T>
SimpleTensor< T > conv3d (const SimpleTensor< T > &src, const SimpleTensor< T > &weights, const SimpleTensor< TB > &bias, SimpleTensor< T > &dst, const Conv3dInfo &conv3d_info)
 
template SimpleTensor< float > conv3d< float, float, float > (const SimpleTensor< float > &src, const SimpleTensor< float > &weights, const SimpleTensor< float > &bias, SimpleTensor< float > &dst, const Conv3dInfo &conv3d_info)
 
template SimpleTensor< halfconv3d< half, half, float > (const SimpleTensor< half > &src, const SimpleTensor< half > &weights, const SimpleTensor< half > &bias, SimpleTensor< half > &dst, const Conv3dInfo &conv3d_info)
 
template SimpleTensor< uint8_t > conv3d< uint8_t, int32_t, int32_t > (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint8_t > &weights, const SimpleTensor< int32_t > &bias, SimpleTensor< uint8_t > &dst, const Conv3dInfo &conv3d_info)
 
template SimpleTensor< int8_t > conv3d< int8_t, int32_t, int32_t > (const SimpleTensor< int8_t > &src, const SimpleTensor< int8_t > &weights, const SimpleTensor< int32_t > &bias, SimpleTensor< int8_t > &dst, const Conv3dInfo &conv3d_info)
 
template<typename T >
SimpleTensor< T > convert_fully_connected_weights (const SimpleTensor< T > &src, const TensorShape &original_input_shape, const DataLayout training_data_layout)
 
template SimpleTensor< uint8_t > convert_fully_connected_weights (const SimpleTensor< uint8_t > &src, const TensorShape &original_input_shape, const DataLayout training_data_layout)
 
template SimpleTensor< halfconvert_fully_connected_weights (const SimpleTensor< half > &src, const TensorShape &original_input_shape, const DataLayout training_data_layout)
 
template SimpleTensor< float > convert_fully_connected_weights (const SimpleTensor< float > &src, const TensorShape &original_input_shape, const DataLayout training_data_layout)
 
template<typename T , typename TW , typename TB >
SimpleTensor< T > convolution_layer_nchw (const SimpleTensor< T > &src, const SimpleTensor< TW > &weights, const SimpleTensor< TB > &bias, SimpleTensor< T > &dst, const PadStrideInfo &info, const Size2D &dilation, unsigned int num_groups)
 
template<typename T , typename TW , typename TB >
SimpleTensor< T > convolution_layer (const SimpleTensor< T > &src, const SimpleTensor< TW > &weights, const SimpleTensor< TB > &bias, const TensorShape &output_shape, const PadStrideInfo &info, const Size2D &dilation, unsigned int num_groups, QuantizationInfo out_quant_info)
 
template SimpleTensor< float > convolution_layer (const SimpleTensor< float > &src, const SimpleTensor< float > &weights, const SimpleTensor< float > &bias, const TensorShape &output_shape, const PadStrideInfo &info, const Size2D &dilation, unsigned int num_groups, QuantizationInfo out_quant_info)
 
template SimpleTensor< halfconvolution_layer (const SimpleTensor< half > &src, const SimpleTensor< half > &weights, const SimpleTensor< half > &bias, const TensorShape &output_shape, const PadStrideInfo &info, const Size2D &dilation, unsigned int num_groups, QuantizationInfo out_quant_info)
 
template SimpleTensor< uint8_t > convolution_layer (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint8_t > &weights, const SimpleTensor< int32_t > &bias, const TensorShape &output_shape, const PadStrideInfo &info, const Size2D &dilation, unsigned int num_groups, QuantizationInfo out_quant_info)
 
template SimpleTensor< uint8_t > convolution_layer (const SimpleTensor< uint8_t > &src, const SimpleTensor< int8_t > &weights, const SimpleTensor< int32_t > &bias, const TensorShape &output_shape, const PadStrideInfo &info, const Size2D &dilation, unsigned int num_groups, QuantizationInfo out_quant_info)
 
template SimpleTensor< int8_t > convolution_layer (const SimpleTensor< int8_t > &src, const SimpleTensor< int8_t > &weights, const SimpleTensor< int32_t > &bias, const TensorShape &output_shape, const PadStrideInfo &info, const Size2D &dilation, unsigned int num_groups, QuantizationInfo out_quant_info)
 
template<typename T >
SimpleTensor< T > copy (const SimpleTensor< T > &src, const TensorShape &output_shape)
 
template SimpleTensor< uint8_t > copy (const SimpleTensor< uint8_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< int8_t > copy (const SimpleTensor< int8_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< uint16_t > copy (const SimpleTensor< uint16_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< int16_t > copy (const SimpleTensor< int16_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< uint32_t > copy (const SimpleTensor< uint32_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< int32_t > copy (const SimpleTensor< int32_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< halfcopy (const SimpleTensor< half > &src, const TensorShape &output_shape)
 
template SimpleTensor< float > copy (const SimpleTensor< float > &src, const TensorShape &output_shape)
 
template<typename T >
SimpleTensor< float > crop_and_resize (const SimpleTensor< T > &src, const SimpleTensor< float > &boxes, SimpleTensor< int32_t > box_ind, Coordinates2D crop_size, InterpolationPolicy method, float extrapolation_value)
 
template SimpleTensor< float > crop_and_resize (const SimpleTensor< float > &src, const SimpleTensor< float > &boxes, SimpleTensor< int32_t > box_ind, Coordinates2D crop_size, InterpolationPolicy method, float extrapolation_value)
 
template SimpleTensor< float > crop_and_resize (const SimpleTensor< uint16_t > &src, const SimpleTensor< float > &boxes, SimpleTensor< int32_t > box_ind, Coordinates2D crop_size, InterpolationPolicy method, float extrapolation_value)
 
template SimpleTensor< float > crop_and_resize (const SimpleTensor< uint32_t > &src, const SimpleTensor< float > &boxes, SimpleTensor< int32_t > box_ind, Coordinates2D crop_size, InterpolationPolicy method, float extrapolation_value)
 
template SimpleTensor< float > crop_and_resize (const SimpleTensor< int16_t > &src, const SimpleTensor< float > &boxes, SimpleTensor< int32_t > box_ind, Coordinates2D crop_size, InterpolationPolicy method, float extrapolation_value)
 
template SimpleTensor< float > crop_and_resize (const SimpleTensor< int32_t > &src, const SimpleTensor< float > &boxes, SimpleTensor< int32_t > box_ind, Coordinates2D crop_size, InterpolationPolicy method, float extrapolation_value)
 
template SimpleTensor< float > crop_and_resize (const SimpleTensor< half > &src, const SimpleTensor< float > &boxes, SimpleTensor< int32_t > box_ind, Coordinates2D crop_size, InterpolationPolicy method, float extrapolation_value)
 
template SimpleTensor< float > crop_and_resize (const SimpleTensor< uint8_t > &src, const SimpleTensor< float > &boxes, SimpleTensor< int32_t > box_ind, Coordinates2D crop_size, InterpolationPolicy method, float extrapolation_value)
 
template<typename T , typename TW , typename TB >
SimpleTensor< T > deconvolution_layer (const SimpleTensor< T > &src, const SimpleTensor< TW > &weights, const SimpleTensor< TB > &bias, const TensorShape &output_shape, const PadStrideInfo &info, QuantizationInfo out_qinfo=QuantizationInfo())
 Deconvolution reference implementation. More...
 
template SimpleTensor< uint8_t > deconvolution_layer (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint8_t > &weights, const SimpleTensor< int32_t > &bias, const TensorShape &output_shape, const PadStrideInfo &info, QuantizationInfo out_quant_info)
 
template SimpleTensor< uint8_t > deconvolution_layer (const SimpleTensor< uint8_t > &src, const SimpleTensor< int8_t > &weights, const SimpleTensor< int32_t > &bias, const TensorShape &output_shape, const PadStrideInfo &info, QuantizationInfo out_quant_info)
 
template SimpleTensor< int8_t > deconvolution_layer (const SimpleTensor< int8_t > &src, const SimpleTensor< int8_t > &weights, const SimpleTensor< int32_t > &bias, const TensorShape &output_shape, const PadStrideInfo &info, QuantizationInfo out_quant_info)
 
template SimpleTensor< float > deconvolution_layer (const SimpleTensor< float > &src, const SimpleTensor< float > &weights, const SimpleTensor< float > &bias, const TensorShape &output_shape, const PadStrideInfo &info, QuantizationInfo out_quant_info)
 
template SimpleTensor< halfdeconvolution_layer (const SimpleTensor< half > &src, const SimpleTensor< half > &weights, const SimpleTensor< half > &bias, const TensorShape &output_shape, const PadStrideInfo &info, QuantizationInfo out_quant_info)
 
template<typename T >
SimpleTensor< T > depthconcatenate_layer (const std::vector< SimpleTensor< T >> &srcs, SimpleTensor< T > &dst)
 
template SimpleTensor< uint8_t > depthconcatenate_layer (const std::vector< SimpleTensor< uint8_t >> &srcs, SimpleTensor< uint8_t > &dst)
 
template SimpleTensor< float > depthconcatenate_layer (const std::vector< SimpleTensor< float >> &srcs, SimpleTensor< float > &dst)
 
template SimpleTensor< halfdepthconcatenate_layer (const std::vector< SimpleTensor< half >> &srcs, SimpleTensor< half > &dst)
 
template<typename T1 , typename T2 , typename std::enable_if< std::is_integral< T1 >::value &&!std::is_same< T1, T2 >::value, int >::type >
SimpleTensor< T2 > depth_convert (const SimpleTensor< T1 > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< int8_t > depth_convert (const SimpleTensor< uint8_t > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< uint8_t > depth_convert (const SimpleTensor< int8_t > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< uint8_t > depth_convert (const SimpleTensor< uint16_t > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< uint8_t > depth_convert (const SimpleTensor< int16_t > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< uint8_t > depth_convert (const SimpleTensor< uint32_t > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< uint8_t > depth_convert (const SimpleTensor< int32_t > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< bfloat16depth_convert (const SimpleTensor< bfloat16 > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< uint8_t > depth_convert (const SimpleTensor< half > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< uint8_t > depth_convert (const SimpleTensor< float > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< uint8_t > depth_convert (const SimpleTensor< int64_t > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template SimpleTensor< uint8_t > depth_convert (const SimpleTensor< uint64_t > &src, DataType dt_out, ConvertPolicy policy, uint32_t shift)
 
template<typename T >
SimpleTensor< T > depth_to_space (const SimpleTensor< T > &src, const TensorShape &dst_shape, int32_t block_shape)
 
template SimpleTensor< float > depth_to_space (const SimpleTensor< float > &src, const TensorShape &dst_shape, int32_t block_shape)
 
template SimpleTensor< halfdepth_to_space (const SimpleTensor< half > &src, const TensorShape &dst_shape, int32_t block_shape)
 
template<>
SimpleTensor< float > depthwise_convolution (const SimpleTensor< float > &src, const SimpleTensor< float > &weights, const SimpleTensor< float > &biases, const TensorShape &dst_shape, const PadStrideInfo &conv_info, unsigned int depth_multiplier, const Size2D &dilation, const QuantizationInfo &out_quant_info)
 
template<>
SimpleTensor< halfdepthwise_convolution (const SimpleTensor< half > &src, const SimpleTensor< half > &weights, const SimpleTensor< half > &biases, const TensorShape &dst_shape, const PadStrideInfo &conv_info, unsigned int depth_multiplier, const Size2D &dilation, const QuantizationInfo &out_quant_info)
 
template<>
SimpleTensor< uint8_t > depthwise_convolution (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint8_t > &weights, const SimpleTensor< int32_t > &biases, const TensorShape &dst_shape, const PadStrideInfo &conv_info, unsigned int depth_multiplier, const Size2D &dilation, const QuantizationInfo &out_quant_info)
 
template<>
SimpleTensor< uint8_t > depthwise_convolution (const SimpleTensor< uint8_t > &src, const SimpleTensor< int8_t > &weights, const SimpleTensor< int32_t > &biases, const TensorShape &dst_shape, const PadStrideInfo &conv_info, unsigned int depth_multiplier, const Size2D &dilation, const QuantizationInfo &out_quant_info)
 
template<>
SimpleTensor< int8_t > depthwise_convolution (const SimpleTensor< int8_t > &src, const SimpleTensor< int8_t > &weights, const SimpleTensor< int32_t > &biases, const TensorShape &dst_shape, const PadStrideInfo &conv_info, unsigned int depth_multiplier, const Size2D &dilation, const QuantizationInfo &out_quant_info)
 
template<typename T , typename TW , typename TB >
SimpleTensor< T > depthwise_convolution (const SimpleTensor< T > &src, const SimpleTensor< TW > &weights, const SimpleTensor< TB > &biases, const TensorShape &dst_shape, const PadStrideInfo &conv_info, unsigned int depth_multiplier, const Size2D &dilation=Size2D(1U, 1U), const QuantizationInfo &out_quant_info=QuantizationInfo(0.0f, 0))
 
template<typename T >
SimpleTensor< T > depthwise_separable_convolution_layer (const SimpleTensor< T > &src, const SimpleTensor< T > &depthwise_weights, const SimpleTensor< T > &depthwise_biases, const TensorShape &depthwise_out_shape, const SimpleTensor< T > &pointwise_weights, const SimpleTensor< T > &pointwise_biases, const TensorShape &dst_shape, const PadStrideInfo &depthwise_conv_info, const PadStrideInfo &pointwise_conv_info)
 
template<typename TOut , typename TIn >
SimpleTensor< TOut > dequantization_layer (const SimpleTensor< TIn > &src)
 
template SimpleTensor< halfdequantization_layer (const SimpleTensor< uint8_t > &src)
 
template SimpleTensor< halfdequantization_layer (const SimpleTensor< int8_t > &src)
 
template SimpleTensor< halfdequantization_layer (const SimpleTensor< int16_t > &src)
 
template SimpleTensor< float > dequantization_layer (const SimpleTensor< int32_t > &src)
 
template<typename T >
SimpleTensor< T > rdft_1d (const SimpleTensor< T > &src)
 Performs an one dimensional DFT on a real input. More...
 
template<typename T >
SimpleTensor< T > ridft_1d (const SimpleTensor< T > &src, bool is_odd=false)
 Performs an one dimensional inverse DFT on a real input. More...
 
template<typename T >
SimpleTensor< T > dft_1d (const SimpleTensor< T > &src, FFTDirection direction)
 Performs an one dimensional DFT on a complex input. More...
 
template<typename T >
SimpleTensor< T > rdft_2d (const SimpleTensor< T > &src)
 Performs a two dimensional DFT on a real input. More...
 
template<typename T >
SimpleTensor< T > ridft_2d (const SimpleTensor< T > &src, bool is_odd=false)
 Performs a two dimensional inverse DFT on a real input. More...
 
template<typename T >
SimpleTensor< T > dft_2d (const SimpleTensor< T > &src, FFTDirection direction)
 Performs a two dimensional DFT on a complex input. More...
 
template<typename T >
SimpleTensor< T > conv2d_dft (const SimpleTensor< T > &src, const SimpleTensor< T > &w, const PadStrideInfo &conv_info)
 Performs and DFT based convolution on a real input. More...
 
template SimpleTensor< float > rdft_1d (const SimpleTensor< float > &src)
 
template SimpleTensor< float > ridft_1d (const SimpleTensor< float > &src, bool is_odd)
 
template SimpleTensor< float > dft_1d (const SimpleTensor< float > &src, FFTDirection direction)
 
template SimpleTensor< float > rdft_2d (const SimpleTensor< float > &src)
 
template SimpleTensor< float > ridft_2d (const SimpleTensor< float > &src, bool is_odd)
 
template SimpleTensor< float > dft_2d (const SimpleTensor< float > &src, FFTDirection direction)
 
template SimpleTensor< float > conv2d_dft (const SimpleTensor< float > &src, const SimpleTensor< float > &w, const PadStrideInfo &conv_info)
 
template SimpleTensor< halfrdft_1d (const SimpleTensor< half > &src)
 
template SimpleTensor< halfridft_1d (const SimpleTensor< half > &src, bool is_odd)
 
template SimpleTensor< halfdft_1d (const SimpleTensor< half > &src, FFTDirection direction)
 
template SimpleTensor< halfrdft_2d (const SimpleTensor< half > &src)
 
template SimpleTensor< halfridft_2d (const SimpleTensor< half > &src, bool is_odd)
 
template SimpleTensor< halfdft_2d (const SimpleTensor< half > &src, FFTDirection direction)
 
template SimpleTensor< halfconv2d_dft (const SimpleTensor< half > &src, const SimpleTensor< half > &w, const PadStrideInfo &conv_info)
 
template<typename T >
SimpleTensor< T > elementwise_unary (const SimpleTensor< T > &src, SimpleTensor< T > &dst, ElementWiseUnary op)
 
template<>
SimpleTensor< int8_t > elementwise_unary (const SimpleTensor< int8_t > &src, SimpleTensor< int8_t > &dst, ElementWiseUnary op)
 
template<>
SimpleTensor< uint8_t > elementwise_unary (const SimpleTensor< uint8_t > &src, SimpleTensor< uint8_t > &dst, ElementWiseUnary op)
 
template SimpleTensor< float > elementwise_unary (const SimpleTensor< float > &src, SimpleTensor< float > &dst, ElementWiseUnary op)
 
template SimpleTensor< halfelementwise_unary (const SimpleTensor< half > &src, SimpleTensor< half > &dst, ElementWiseUnary op)
 
template SimpleTensor< int32_t > elementwise_unary (const SimpleTensor< int32_t > &src, SimpleTensor< int32_t > &dst, ElementWiseUnary op)
 
template<typename T >
SimpleTensor< T > erode (const SimpleTensor< T > &src, BorderMode border_mode, T constant_border_value)
 
template SimpleTensor< uint8_t > erode (const SimpleTensor< uint8_t > &src, BorderMode border_mode, uint8_t constant_border_value)
 
template<typename T >
SimpleTensor< T > flatten_layer (const SimpleTensor< T > &src, const TensorShape &shape_flatten)
 
template SimpleTensor< float > flatten_layer (const SimpleTensor< float > &src, const TensorShape &shape_flatten)
 
template SimpleTensor< halfflatten_layer (const SimpleTensor< half > &src, const TensorShape &shape_flatten)
 
template<typename T >
SimpleTensor< T > floor_layer (const SimpleTensor< T > &src)
 
template SimpleTensor< halffloor_layer (const SimpleTensor< half > &src)
 
template SimpleTensor< float > floor_layer (const SimpleTensor< float > &src)
 
template<typename T , typename TB >
SimpleTensor< T > fully_connected_layer (const SimpleTensor< T > &src, const SimpleTensor< T > &weights, const SimpleTensor< TB > &bias, const TensorShape &dst_shape, QuantizationInfo out_quant_info)
 
template SimpleTensor< float > fully_connected_layer (const SimpleTensor< float > &src, const SimpleTensor< float > &weights, const SimpleTensor< float > &bias, const TensorShape &dst_shape, QuantizationInfo out_quant_info)
 
template SimpleTensor< halffully_connected_layer (const SimpleTensor< half > &src, const SimpleTensor< half > &weights, const SimpleTensor< half > &bias, const TensorShape &dst_shape, QuantizationInfo out_quant_info)
 
template SimpleTensor< uint8_t > fully_connected_layer (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint8_t > &weights, const SimpleTensor< int32_t > &bias, const TensorShape &dst_shape, QuantizationInfo out_quant_info)
 
template SimpleTensor< int8_t > fully_connected_layer (const SimpleTensor< int8_t > &src, const SimpleTensor< int8_t > &weights, const SimpleTensor< int32_t > &bias, const TensorShape &dst_shape, QuantizationInfo out_quant_info)
 
template<typename T >
void fuse_batch_normalization_dwc_layer (const SimpleTensor< T > &w, const SimpleTensor< T > &mean, const SimpleTensor< T > &var, SimpleTensor< T > &w_fused, SimpleTensor< T > &b_fused, const SimpleTensor< T > &b, const SimpleTensor< T > &beta, const SimpleTensor< T > &gamma, float epsilon)
 
template<typename T >
void fuse_batch_normalization_conv_layer (const SimpleTensor< T > &w, const SimpleTensor< T > &mean, const SimpleTensor< T > &var, SimpleTensor< T > &w_fused, SimpleTensor< T > &b_fused, const SimpleTensor< T > &b, const SimpleTensor< T > &beta, const SimpleTensor< T > &gamma, float epsilon)
 
template void fuse_batch_normalization_dwc_layer (const SimpleTensor< float > &w, const SimpleTensor< float > &mean, const SimpleTensor< float > &var, SimpleTensor< float > &w_fused, SimpleTensor< float > &b_fused, const SimpleTensor< float > &b, const SimpleTensor< float > &beta, const SimpleTensor< float > &gamma, float epsilon)
 
template void fuse_batch_normalization_dwc_layer (const SimpleTensor< half > &w, const SimpleTensor< half > &mean, const SimpleTensor< half > &var, SimpleTensor< half > &w_fused, SimpleTensor< half > &b_fused, const SimpleTensor< half > &b, const SimpleTensor< half > &beta, const SimpleTensor< half > &gamma, float epsilon)
 
template void fuse_batch_normalization_conv_layer (const SimpleTensor< float > &w, const SimpleTensor< float > &mean, const SimpleTensor< float > &var, SimpleTensor< float > &w_fused, SimpleTensor< float > &b_fused, const SimpleTensor< float > &b, const SimpleTensor< float > &beta, const SimpleTensor< float > &gamma, float epsilon)
 
template void fuse_batch_normalization_conv_layer (const SimpleTensor< half > &w, const SimpleTensor< half > &mean, const SimpleTensor< half > &var, SimpleTensor< half > &w_fused, SimpleTensor< half > &b_fused, const SimpleTensor< half > &b, const SimpleTensor< half > &beta, const SimpleTensor< half > &gamma, float epsilon)
 
template<typename T >
SimpleTensor< T > gather (const SimpleTensor< T > &src, const SimpleTensor< uint32_t > &indices, uint32_t actual_axis)
 
template SimpleTensor< float > gather (const SimpleTensor< float > &src, const SimpleTensor< uint32_t > &indices, uint32_t actual_axis)
 
template SimpleTensor< halfgather (const SimpleTensor< half > &src, const SimpleTensor< uint32_t > &indices, uint32_t actual_axis)
 
template SimpleTensor< uint16_t > gather (const SimpleTensor< uint16_t > &src, const SimpleTensor< uint32_t > &indices, uint32_t actual_axis)
 
template SimpleTensor< uint8_t > gather (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint32_t > &indices, uint32_t actual_axis)
 
template<typename T , typename std::enable_if< is_floating_point< T >::value, int >::type >
SimpleTensor< T > gemm (const SimpleTensor< T > &a, const SimpleTensor< T > &b, const SimpleTensor< T > &c, float alpha, float beta)
 
template<typename T , typename std::enable_if< is_floating_point< T >::value, int >::type >
SimpleTensor< T > gemm_mixed_precision (const SimpleTensor< T > &a, const SimpleTensor< T > &b, const SimpleTensor< T > &c, float alpha, float beta)
 
template<typename T , typename std::enable_if< is_floating_point< T >::value, int >::type >
void gemm_accumulate (const SimpleTensor< T > &a, const SimpleTensor< T > &b, const SimpleTensor< T > &c, float alpha, float beta, SimpleTensor< T > &dst)
 
template SimpleTensor< bfloat16gemm (const SimpleTensor< bfloat16 > &a, const SimpleTensor< bfloat16 > &b, const SimpleTensor< bfloat16 > &c, float alpha, float beta)
 
template SimpleTensor< float > gemm (const SimpleTensor< float > &a, const SimpleTensor< float > &b, const SimpleTensor< float > &c, float alpha, float beta)
 
template SimpleTensor< halfgemm (const SimpleTensor< half > &a, const SimpleTensor< half > &b, const SimpleTensor< half > &c, float alpha, float beta)
 
template void gemm_accumulate (const SimpleTensor< float > &a, const SimpleTensor< float > &b, const SimpleTensor< float > &c, float alpha, float beta, SimpleTensor< float > &dst)
 
template void gemm_accumulate (const SimpleTensor< half > &a, const SimpleTensor< half > &b, const SimpleTensor< half > &c, float alpha, float beta, SimpleTensor< half > &dst)
 
template SimpleTensor< halfgemm_mixed_precision (const SimpleTensor< half > &a, const SimpleTensor< half > &b, const SimpleTensor< half > &c, float alpha, float beta)
 
template<typename T >
SimpleTensor< T > gemm_interleave_4x4 (const SimpleTensor< T > &in, SimpleTensor< T > &out)
 
template<typename T >
safe_read (const SimpleTensor< T > &t, int y, int x)
 
template<typename T >
SimpleTensor< T > gemm_interleave_blocked (const SimpleTensor< T > &in, SimpleTensor< T > &out, int int_by, int block, bool transposed)
 
template SimpleTensor< uint8_t > gemm_interleave_blocked (const SimpleTensor< uint8_t > &in, SimpleTensor< uint8_t > &out, int int_by, int block, bool transposed)
 
template<typename T_out , typename T_in , typename T_in_1 >
SimpleTensor< T_out > gemmlowp_matrix_multiply_core (const SimpleTensor< T_in > &a, const SimpleTensor< T_in_1 > &b, TensorShape shape_c, int32_t a_offset, int32_t b_offset)
 
template<typename T_out , typename T_in , typename T_in_1 >
void gemmlowp_matrix_multiply_core_accumulate (const SimpleTensor< T_in > &a, const SimpleTensor< T_in_1 > &b, TensorShape shape_c, int32_t a_offset, int32_t b_offset, SimpleTensor< T_out > &dst)
 
template<typename T1 , typename T2 , typename T3 >
SimpleTensor< T1 > gemmlowp (const SimpleTensor< T2 > &a, const SimpleTensor< T3 > &b, TensorShape shape_c)
 
template<typename TIn , typename TOut >
SimpleTensor< TOut > gemmlowp_quantize_down_scale (const SimpleTensor< TIn > &in, int32_t result_offset, std::vector< int32_t > result_mult_int, std::vector< int32_t > result_shift, int32_t min, int32_t max)
 
template<typename TIn , typename TOut >
SimpleTensor< TOut > gemmlowp_quantize_down_scale (const SimpleTensor< TIn > &in, const SimpleTensor< TIn > &bias, int32_t result_offset, std::vector< int32_t > result_mult_int, std::vector< int32_t > result_shift, int32_t min, int32_t max)
 
template<typename TIn , typename TOut >
SimpleTensor< TOut > gemmlowp_quantize_down_scale_by_fixedpoint (const SimpleTensor< TIn > &in, std::vector< int32_t > result_fixedpoint_multiplier, std::vector< int32_t > result_shift, int32_t result_offset_after_shift, int32_t min, int32_t max)
 
template<typename TIn , typename TOut >
SimpleTensor< TOut > gemmlowp_quantize_down_scale_by_fixedpoint (const SimpleTensor< TIn > &in, const SimpleTensor< TIn > &bias, std::vector< int32_t > result_fixedpoint_multiplier, std::vector< int32_t > result_shift, int32_t result_offset_after_shift, int32_t min, int32_t max)
 
template<typename TIn , typename TOut >
SimpleTensor< TOut > gemmlowp_quantize_down_scale_by_float (const SimpleTensor< TIn > &in, const SimpleTensor< TIn > &bias, std::vector< float_t > result_real_multiplier, int32_t result_offset, int32_t min, int32_t max)
 
template<typename TIn , typename TOut >
SimpleTensor< TOut > gemmlowp_quantize_down_scale_by_float (const SimpleTensor< TIn > &in, std::vector< float_t > result_real_multiplier, int32_t result_offset, int32_t min, int32_t max)
 
template SimpleTensor< uint8_t > gemmlowp_quantize_down_scale_by_float (const SimpleTensor< int32_t > &a, const SimpleTensor< int32_t > &b, std::vector< float_t > result_real_multiplier, int32_t result_offset, int32_t min, int32_t max)
 
template SimpleTensor< uint8_t > gemmlowp_quantize_down_scale_by_float (const SimpleTensor< int32_t > &a, std::vector< float_t > result_real_multiplier, int32_t result_offset, int32_t min, int32_t max)
 
template SimpleTensor< uint8_t > gemmlowp_quantize_down_scale_by_fixedpoint (const SimpleTensor< int32_t > &a, std::vector< int32_t > result_fixedpoint_multiplier, std::vector< int32_t > result_shift, int32_t result_offset_after_shift, int32_t min, int32_t max)
 
template SimpleTensor< uint8_t > gemmlowp_quantize_down_scale_by_fixedpoint (const SimpleTensor< int32_t > &a, const SimpleTensor< int32_t > &b, std::vector< int32_t > result_fixedpoint_multiplier, std::vector< int32_t > result_shift, int32_t result_offset_after_shift, int32_t min, int32_t max)
 
template SimpleTensor< uint8_t > gemmlowp_quantize_down_scale (const SimpleTensor< int32_t > &a, int32_t result_offset, std::vector< int32_t > result_mult_int, std::vector< int32_t > result_shift, int32_t min, int32_t max)
 
template SimpleTensor< uint8_t > gemmlowp_quantize_down_scale (const SimpleTensor< int32_t > &a, const SimpleTensor< int32_t > &b, int32_t result_offset, std::vector< int32_t > result_mult_int, std::vector< int32_t > result_shift, int32_t min, int32_t max)
 
template SimpleTensor< int32_t > gemmlowp_matrix_multiply_core (const SimpleTensor< int8_t > &a, const SimpleTensor< int8_t > &b, TensorShape shape_c, int32_t a_offset, int32_t b_offset)
 
template SimpleTensor< int32_t > gemmlowp_matrix_multiply_core (const SimpleTensor< uint8_t > &a, const SimpleTensor< uint8_t > &b, TensorShape shape_c, int32_t a_offset, int32_t b_offset)
 
template void gemmlowp_matrix_multiply_core_accumulate (const SimpleTensor< int8_t > &a, const SimpleTensor< int8_t > &b, TensorShape shape_c, int32_t a_offset, int32_t b_offset, SimpleTensor< int32_t > &dst)
 
template void gemmlowp_matrix_multiply_core_accumulate (const SimpleTensor< uint8_t > &a, const SimpleTensor< uint8_t > &b, TensorShape shape_c, int32_t a_offset, int32_t b_offset, SimpleTensor< int32_t > &dst)
 
template SimpleTensor< int32_t > gemmlowp< int32_t, int8_t, int8_t > (const SimpleTensor< int8_t > &a, const SimpleTensor< int8_t > &b, TensorShape shape_c)
 
template SimpleTensor< int32_t > gemmlowp< int32_t, uint8_t, uint8_t > (const SimpleTensor< uint8_t > &a, const SimpleTensor< uint8_t > &b, TensorShape shape_c)
 
template SimpleTensor< int32_t > gemmlowp< int32_t, uint8_t, int8_t > (const SimpleTensor< uint8_t > &a, const SimpleTensor< int8_t > &b, TensorShape shape_c)
 
template<typename T1 , typename T2 , typename T3 >
SimpleTensor< T1 > gemmlowp_matrix_multiply_core (const SimpleTensor< T2 > &a, const SimpleTensor< T3 > &b, TensorShape shape_c, int32_t a_offset, int32_t b_offset)
 
template<typename T1 , typename T2 , typename T3 >
void gemmlowp_matrix_multiply_core_accumulate (const SimpleTensor< T2 > &a, const SimpleTensor< T3 > &b, TensorShape shape_c, int32_t a_offset, int32_t b_offset, SimpleTensor< T1 > &dst_)
 
template<typename TIn , typename TOut >
SimpleTensor< uint8_t > gemmlowp_quantize_down_scale (const SimpleTensor< TIn > &in, int32_t result_offset, std::vector< int32_t > result_mult_int, std::vector< int32_t > result_shift)
 
template<typename T >
SimpleTensor< T > gemm_reshape_lhs_matrix (const SimpleTensor< T > &in, const TensorShape &output_shape, const GEMMLHSMatrixInfo &lhs_info)
 
template SimpleTensor< int > gemm_reshape_lhs_matrix (const SimpleTensor< int > &in, const TensorShape &output_shape, const GEMMLHSMatrixInfo &lhs_info)
 
template SimpleTensor< short > gemm_reshape_lhs_matrix (const SimpleTensor< short > &in, const TensorShape &output_shape, const GEMMLHSMatrixInfo &lhs_info)
 
template SimpleTensor< char > gemm_reshape_lhs_matrix (const SimpleTensor< char > &in, const TensorShape &output_shape, const GEMMLHSMatrixInfo &lhs_info)
 
template<typename T >
SimpleTensor< T > gemm_reshape_rhs_matrix (const SimpleTensor< T > &in, const TensorShape &output_shape, const GEMMRHSMatrixInfo &rhs_info)
 
template SimpleTensor< int > gemm_reshape_rhs_matrix (const SimpleTensor< int > &in, const TensorShape &output_shape, const GEMMRHSMatrixInfo &rhs_info)
 
template SimpleTensor< short > gemm_reshape_rhs_matrix (const SimpleTensor< short > &in, const TensorShape &output_shape, const GEMMRHSMatrixInfo &rhs_info)
 
template SimpleTensor< char > gemm_reshape_rhs_matrix (const SimpleTensor< char > &in, const TensorShape &output_shape, const GEMMRHSMatrixInfo &rhs_info)
 
template<typename T >
SimpleTensor< T > gemm_transpose_1xW (const SimpleTensor< T > &in)
 
template<typename T >
void im2col_nchw (const SimpleTensor< T > &src, SimpleTensor< T > &dst, const Size2D &kernel_dims, const PadStrideInfo &conv_info, bool has_bias, unsigned int num_groups)
 
template<typename T >
void im2col_nhwc (const SimpleTensor< T > &src, SimpleTensor< T > &dst, const Size2D &kernel_dims, const PadStrideInfo &conv_info, bool has_bias)
 
template<typename T >
void im2col (const SimpleTensor< T > &src, SimpleTensor< T > &dst, const Size2D &kernel_dims, const PadStrideInfo &conv_info, bool has_bias, unsigned int num_groups)
 
template void im2col (const SimpleTensor< uint8_t > &src, SimpleTensor< uint8_t > &dst, const Size2D &kernel_dims, const PadStrideInfo &conv_info, bool has_bias, unsigned int num_groups)
 
template void im2col (const SimpleTensor< half > &src, SimpleTensor< half > &dst, const Size2D &kernel_dims, const PadStrideInfo &conv_info, bool has_bias, unsigned int num_groups)
 
template void im2col (const SimpleTensor< float > &src, SimpleTensor< float > &dst, const Size2D &kernel_dims, const PadStrideInfo &conv_info, bool has_bias, unsigned int num_groups)
 
SimpleTensor< int32_t > indirect_conv2d_addr_precalculation (const TensorShape &shape_conv_src, const TensorShape &shape_conv_wei, const TensorShape &shape_conv_dst, const TensorShape &shape_dst, const PadStrideInfo &conv_info)
 
template<typename T >
SimpleTensor< T > instance_normalization (const SimpleTensor< T > &src, float gamma, float beta, float epsilon)
 
template SimpleTensor< float > instance_normalization (const SimpleTensor< float > &src, float gamma, float beta, float epsilon)
 
template SimpleTensor< halfinstance_normalization (const SimpleTensor< half > &src, float gamma, float beta, float epsilon)
 
template<typename T >
SimpleTensor< T > l2_normalize (const SimpleTensor< T > &src, unsigned int axis, float epsilon)
 
template SimpleTensor< float > l2_normalize (const SimpleTensor< float > &src, unsigned int axis, float epsilon)
 
template SimpleTensor< halfl2_normalize (const SimpleTensor< half > &src, unsigned int axis, float epsilon)
 
template<typename T >
logical_binary_op (arm_compute::LogicalOperation op, T src1, T src2)
 
template<typename T >
SimpleTensor< T > logical_or (const SimpleTensor< T > &src1, const SimpleTensor< T > &src2)
 
template<typename T >
SimpleTensor< T > logical_and (const SimpleTensor< T > &src1, const SimpleTensor< T > &src2)
 
template<typename T >
SimpleTensor< T > logical_not (const SimpleTensor< T > &src)
 
template SimpleTensor< uint8_t > logical_or (const SimpleTensor< uint8_t > &src1, const SimpleTensor< uint8_t > &src2)
 
template SimpleTensor< uint8_t > logical_and (const SimpleTensor< uint8_t > &src1, const SimpleTensor< uint8_t > &src2)
 
template SimpleTensor< uint8_t > logical_not (const SimpleTensor< uint8_t > &src1)
 
template<typename T >
SimpleTensor< T > max_unpooling_layer_internal (const SimpleTensor< T > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > &indices, TensorShape output_shape, DataLayout data_layout)
 
template<>
SimpleTensor< uint8_t > max_unpooling_layer< uint8_t > (const SimpleTensor< uint8_t > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > &indices, TensorShape output_shape, DataLayout data_layout)
 
template<typename T >
SimpleTensor< T > max_unpooling_layer (const SimpleTensor< T > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > &indices, TensorShape output_shape, DataLayout data_layout)
 
template SimpleTensor< float > max_unpooling_layer (const SimpleTensor< float > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > &indices, TensorShape output_shape, DataLayout data_layout)
 
template SimpleTensor< halfmax_unpooling_layer (const SimpleTensor< half > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > &indices, TensorShape output_shape, DataLayout data_layout)
 
template<typename T >
std::pair< float, float > mean_and_standard_deviation (const SimpleTensor< T > &in)
 
template std::pair< float, float > mean_and_standard_deviation (const SimpleTensor< uint8_t > &in)
 
template std::pair< float, float > mean_and_standard_deviation (const SimpleTensor< half > &in)
 
template std::pair< float, float > mean_and_standard_deviation (const SimpleTensor< float > &in)
 
template<typename T >
SimpleTensor< T > mean_std_normalization_layer (const SimpleTensor< T > &src, float epsilon)
 
template<>
SimpleTensor< uint8_t > mean_std_normalization_layer (const SimpleTensor< uint8_t > &src, float epsilon)
 
template SimpleTensor< float > mean_std_normalization_layer (const SimpleTensor< float > &src, float epsilon)
 
template SimpleTensor< halfmean_std_normalization_layer (const SimpleTensor< half > &src, float epsilon)
 
template<typename T >
void compute_min_max (const SimpleTensor< T > &src, T &min, T &max)
 
template<typename T >
MinMaxLocationValues< T > min_max_location (const SimpleTensor< T > &src)
 
template MinMaxLocationValues< uint8_t > min_max_location (const SimpleTensor< uint8_t > &src)
 
template MinMaxLocationValues< int16_t > min_max_location (const SimpleTensor< int16_t > &src)
 
template MinMaxLocationValues< float > min_max_location (const SimpleTensor< float > &src)
 
template<typename T >
SimpleTensor< T > non_maxima_suppression (const SimpleTensor< T > &src, BorderMode border_mode, T constant_border_value)
 
template SimpleTensor< float > non_maxima_suppression (const SimpleTensor< float > &src, BorderMode border_mode, float constant_border_value)
 
template SimpleTensor< uint8_t > non_maxima_suppression (const SimpleTensor< uint8_t > &src, BorderMode border_mode, uint8_t constant_border_value)
 
SimpleTensor< int > non_max_suppression (const SimpleTensor< float > &bboxes, const SimpleTensor< float > &scores, SimpleTensor< int > &indices, unsigned int max_output_size, float score_threshold, float nms_threshold)
 
template<typename T >
SimpleTensor< T > normalization_layer (const SimpleTensor< T > &src, NormalizationLayerInfo info)
 
template SimpleTensor< float > normalization_layer (const SimpleTensor< float > &src, NormalizationLayerInfo info)
 
template SimpleTensor< halfnormalization_layer (const SimpleTensor< half > &src, NormalizationLayerInfo info)
 
template<typename T >
SimpleTensor< T > normalize_planar_yuv_layer (const SimpleTensor< T > &src, const SimpleTensor< T > &mean, const SimpleTensor< T > &std)
 
template<>
SimpleTensor< uint8_t > normalize_planar_yuv_layer< uint8_t > (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint8_t > &mean, const SimpleTensor< uint8_t > &std)
 
template<>
SimpleTensor< int8_t > normalize_planar_yuv_layer< int8_t > (const SimpleTensor< int8_t > &src, const SimpleTensor< int8_t > &mean, const SimpleTensor< int8_t > &std)
 
template SimpleTensor< halfnormalize_planar_yuv_layer (const SimpleTensor< half > &src, const SimpleTensor< half > &mean, const SimpleTensor< half > &std)
 
template SimpleTensor< float > normalize_planar_yuv_layer (const SimpleTensor< float > &src, const SimpleTensor< float > &mean, const SimpleTensor< float > &std)
 
template<typename T >
SimpleTensor< T > pad_layer (const SimpleTensor< T > &src, const PaddingList &paddings, const PixelValue const_value=PixelValue(), const PaddingMode mode=PaddingMode::CONSTANT)
 Reference function to pad an ND tensor. More...
 
template SimpleTensor< float > pad_layer (const SimpleTensor< float > &src, const PaddingList &paddings, const PixelValue const_value=PixelValue(), const PaddingMode mode)
 
template SimpleTensor< halfpad_layer (const SimpleTensor< half > &src, const PaddingList &paddings, const PixelValue const_value=PixelValue(), const PaddingMode mode)
 
template SimpleTensor< uint8_t > pad_layer (const SimpleTensor< uint8_t > &src, const PaddingList &paddings, const PixelValue const_value=PixelValue(), const PaddingMode mode)
 
template SimpleTensor< int8_t > pad_layer (const SimpleTensor< int8_t > &src, const PaddingList &paddings, const PixelValue const_value=PixelValue(), const PaddingMode mode)
 
template SimpleTensor< uint16_t > pad_layer (const SimpleTensor< uint16_t > &src, const PaddingList &paddings, const PixelValue const_value=PixelValue(), const PaddingMode mode)
 
template SimpleTensor< int16_t > pad_layer (const SimpleTensor< int16_t > &src, const PaddingList &paddings, const PixelValue const_value=PixelValue(), const PaddingMode mode)
 
template SimpleTensor< uint32_t > pad_layer (const SimpleTensor< uint32_t > &src, const PaddingList &paddings, const PixelValue const_value=PixelValue(), const PaddingMode mode)
 
template SimpleTensor< int32_t > pad_layer (const SimpleTensor< int32_t > &src, const PaddingList &paddings, const PixelValue const_value=PixelValue(), const PaddingMode mode)
 
template<typename T >
SimpleTensor< T > permute (const SimpleTensor< T > &src, PermutationVector perm)
 
template SimpleTensor< int8_t > permute (const SimpleTensor< int8_t > &src, PermutationVector perm)
 
template SimpleTensor< uint8_t > permute (const SimpleTensor< uint8_t > &src, PermutationVector perm)
 
template SimpleTensor< int16_t > permute (const SimpleTensor< int16_t > &src, PermutationVector perm)
 
template SimpleTensor< uint16_t > permute (const SimpleTensor< uint16_t > &src, PermutationVector perm)
 
template SimpleTensor< uint32_t > permute (const SimpleTensor< uint32_t > &src, PermutationVector perm)
 
template SimpleTensor< float > permute (const SimpleTensor< float > &src, PermutationVector perm)
 
template SimpleTensor< halfpermute (const SimpleTensor< half > &src, PermutationVector perm)
 
template SimpleTensor< bfloat16permute (const SimpleTensor< bfloat16 > &src, PermutationVector perm)
 
template<typename T1 , typename T2 , typename T3 >
SimpleTensor< T3 > pixel_wise_multiplication (const SimpleTensor< T1 > &src1, const SimpleTensor< T2 > &src2, float scale, ConvertPolicy convert_policy, RoundingPolicy rounding_policy, DataType dt_out, const QuantizationInfo &qout)
 
template<>
SimpleTensor< uint8_t > pixel_wise_multiplication (const SimpleTensor< uint8_t > &src1, const SimpleTensor< uint8_t > &src2, float scale, ConvertPolicy convert_policy, RoundingPolicy rounding_policy, DataType dt_out, const QuantizationInfo &qout)
 
template<>
SimpleTensor< int8_t > pixel_wise_multiplication (const SimpleTensor< int8_t > &src1, const SimpleTensor< int8_t > &src2, float scale, ConvertPolicy convert_policy, RoundingPolicy rounding_policy, DataType dt_out, const QuantizationInfo &qout)
 
template<>
SimpleTensor< int16_t > pixel_wise_multiplication (const SimpleTensor< int16_t > &src1, const SimpleTensor< int16_t > &src2, float scale, ConvertPolicy convert_policy, RoundingPolicy rounding_policy, DataType dt_out, const QuantizationInfo &qout)
 
template SimpleTensor< int16_t > pixel_wise_multiplication (const SimpleTensor< uint8_t > &src1, const SimpleTensor< int16_t > &src2, float scale, ConvertPolicy convert_policy, RoundingPolicy rounding_policy, DataType dt_out, const QuantizationInfo &qout)
 
template SimpleTensor< int32_t > pixel_wise_multiplication (const SimpleTensor< int32_t > &src1, const SimpleTensor< int32_t > &src2, float scale, ConvertPolicy convert_policy, RoundingPolicy rounding_policy, DataType dt_out, const QuantizationInfo &qout)
 
template SimpleTensor< float > pixel_wise_multiplication (const SimpleTensor< float > &src1, const SimpleTensor< float > &src2, float scale, ConvertPolicy convert_policy, RoundingPolicy rounding_policy, DataType dt_out, const QuantizationInfo &qout)
 
template SimpleTensor< half_float::half > pixel_wise_multiplication (const SimpleTensor< half_float::half > &src1, const SimpleTensor< half_float::half > &src2, float scale, ConvertPolicy convert_policy, RoundingPolicy rounding_policy, DataType dt_out, const QuantizationInfo &qout)
 
template<typename T >
SimpleTensor< T > pooling_3d_layer_internal (const SimpleTensor< T > &src, const Pooling3dLayerInfo &pool3d_info, SimpleTensor< uint32_t > *indices)
 
template SimpleTensor< float > pooling_3d_layer (const SimpleTensor< float > &src, const Pooling3dLayerInfo &pool3d_info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices)
 
template SimpleTensor< halfpooling_3d_layer (const SimpleTensor< half > &src, const Pooling3dLayerInfo &pool3d_info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices)
 
template<typename T >
SimpleTensor< T > pooling_3d_layer (const SimpleTensor< T > &src, const Pooling3dLayerInfo &pool3d_info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices)
 
template<>
SimpleTensor< int8_t > pooling_3d_layer< int8_t > (const SimpleTensor< int8_t > &src, const Pooling3dLayerInfo &pool3d_info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices)
 
template<>
SimpleTensor< uint8_t > pooling_3d_layer< uint8_t > (const SimpleTensor< uint8_t > &src, const Pooling3dLayerInfo &pool3d_info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices)
 
template<typename T , typename ACC_T , typename std::enable_if< is_floating_point< T >::value, int >::type >
SimpleTensor< T > pooling_layer_internal (const SimpleTensor< T > &src, const PoolingLayerInfo &info, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
 
template SimpleTensor< float > pooling_layer_internal< float > (const SimpleTensor< float > &src, const PoolingLayerInfo &info, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
 
template SimpleTensor< halfpooling_layer_internal< half > (const SimpleTensor< half > &src, const PoolingLayerInfo &info, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
 
template SimpleTensor< halfpooling_layer_internal< half, float > (const SimpleTensor< half > &src, const PoolingLayerInfo &info, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
 
template<typename T >
SimpleTensor< T > pooling_layer (const SimpleTensor< T > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
 
template<>
SimpleTensor< uint8_t > pooling_layer< uint8_t > (const SimpleTensor< uint8_t > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
 
template<>
SimpleTensor< int8_t > pooling_layer< int8_t > (const SimpleTensor< int8_t > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
 
template<>
SimpleTensor< halfpooling_layer (const SimpleTensor< half > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
 
template SimpleTensor< float > pooling_layer (const SimpleTensor< float > &src, const PoolingLayerInfo &info, const QuantizationInfo &output_qinfo, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
 
template<typename T >
SimpleTensor< T > prior_box_layer (const SimpleTensor< T > &src1, const SimpleTensor< T > &src2, const PriorBoxLayerInfo &info, const TensorShape &output_shape)
 
template SimpleTensor< float > prior_box_layer (const SimpleTensor< float > &src1, const SimpleTensor< float > &src2, const PriorBoxLayerInfo &info, const TensorShape &output_shape)
 
SimpleTensor< int16_t > qlstm_layer_normalization (const SimpleTensor< int16_t > &src, const SimpleTensor< int16_t > &weight, const SimpleTensor< int32_t > &bias)
 
template<typename Tin , typename Tout >
SimpleTensor< Tout > quantization_layer (const SimpleTensor< Tin > &src, DataType output_data_type, const QuantizationInfo &quantization_info)
 
template<>
SimpleTensor< uint8_t > quantization_layer (const SimpleTensor< uint8_t > &src, DataType output_data_type, const QuantizationInfo &quantization_info)
 
template<>
SimpleTensor< uint8_t > quantization_layer (const SimpleTensor< int8_t > &src, DataType output_data_type, const QuantizationInfo &quantization_info)
 
template SimpleTensor< int8_t > quantization_layer (const SimpleTensor< half > &src, DataType output_data_type, const QuantizationInfo &quantization_info)
 
template SimpleTensor< int8_t > quantization_layer (const SimpleTensor< float > &src, DataType output_data_type, const QuantizationInfo &quantization_info)
 
template<typename T >
SimpleTensor< T > range (SimpleTensor< T > &dst, float start, const size_t num_of_elements, float step)
 
template<>
SimpleTensor< uint8_t > range (SimpleTensor< uint8_t > &dst, float start, const size_t num_of_elements, float step)
 
template SimpleTensor< float > range (SimpleTensor< float > &dst, float start, const size_t num_of_elements, float step)
 
template SimpleTensor< halfrange (SimpleTensor< half > &dst, float start, const size_t num_of_elements, float step)
 
template SimpleTensor< int8_t > range (SimpleTensor< int8_t > &dst, float start, const size_t num_of_elements, float step)
 
template SimpleTensor< uint16_t > range (SimpleTensor< uint16_t > &dst, float start, const size_t num_of_elements, float step)
 
template SimpleTensor< int16_t > range (SimpleTensor< int16_t > &dst, float start, const size_t num_of_elements, float step)
 
template<typename T , typename OT >
SimpleTensor< OT > compute_reduction_operation (const SimpleTensor< T > &src, const TensorShape &dst_shape, unsigned int axis, ReductionOperation op, DataType output_type, RoundingPolicy policy)
 
template<typename T , typename OT >
SimpleTensor< OT > reduction_operation (const SimpleTensor< T > &src, const TensorShape &dst_shape, unsigned int axis, ReductionOperation op, DataType output_type, QuantizationInfo quantization_info_output, RoundingPolicy policy)
 
template<>
SimpleTensor< uint8_t > reduction_operation (const SimpleTensor< uint8_t > &src, const TensorShape &dst_shape, unsigned int axis, ReductionOperation op, DataType output_type, QuantizationInfo quantization_info_output, RoundingPolicy policy)
 
template<>
SimpleTensor< int8_t > reduction_operation (const SimpleTensor< int8_t > &src, const TensorShape &dst_shape, unsigned int axis, ReductionOperation op, DataType output_type, QuantizationInfo quantization_info_output, RoundingPolicy policy)
 
template SimpleTensor< float > reduction_operation (const SimpleTensor< float > &src, const TensorShape &dst_shape, unsigned int axis, ReductionOperation op, DataType output_type=DataType::S32, QuantizationInfo quantization_info_output=QuantizationInfo(), RoundingPolicy policy=RoundingPolicy::TO_ZERO)
 
template SimpleTensor< halfreduction_operation (const SimpleTensor< half > &src, const TensorShape &dst_shape, unsigned int axis, ReductionOperation op, DataType output_type=DataType::S32, QuantizationInfo quantization_info_output=QuantizationInfo(), RoundingPolicy policy=RoundingPolicy::TO_ZERO)
 
template SimpleTensor< int32_t > reduction_operation (const SimpleTensor< int32_t > &src, const TensorShape &dst_shape, unsigned int axis, ReductionOperation op, DataType output_type=DataType::S32, QuantizationInfo quantization_info_output=QuantizationInfo(), RoundingPolicy policy=RoundingPolicy::TO_ZERO)
 
template<typename T >
SimpleTensor< T > reorder_layer (const SimpleTensor< T > &src, const TensorShape &output_shape, WeightFormat output_wf)
 
template SimpleTensor< float > reorder_layer (const SimpleTensor< float > &src, const TensorShape &output_shape, WeightFormat output_wf)
 
template<typename T >
SimpleTensor< T > reorg_layer (const SimpleTensor< T > &src, int32_t stride)
 
template SimpleTensor< int32_t > reorg_layer (const SimpleTensor< int32_t > &src, int32_t stride)
 
template SimpleTensor< int16_t > reorg_layer (const SimpleTensor< int16_t > &src, int32_t stride)
 
template SimpleTensor< int8_t > reorg_layer (const SimpleTensor< int8_t > &src, int32_t stride)
 
template<typename T >
SimpleTensor< T > reshape_layer (const SimpleTensor< T > &src, const TensorShape &output_shape)
 [ReshapeLayer] More...
 
template SimpleTensor< uint8_t > reshape_layer (const SimpleTensor< uint8_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< int8_t > reshape_layer (const SimpleTensor< int8_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< uint16_t > reshape_layer (const SimpleTensor< uint16_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< int16_t > reshape_layer (const SimpleTensor< int16_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< uint32_t > reshape_layer (const SimpleTensor< uint32_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< int32_t > reshape_layer (const SimpleTensor< int32_t > &src, const TensorShape &output_shape)
 
template SimpleTensor< halfreshape_layer (const SimpleTensor< half > &src, const TensorShape &output_shape)
 
template SimpleTensor< float > reshape_layer (const SimpleTensor< float > &src, const TensorShape &output_shape)
 
template SimpleTensor< bfloat16reshape_layer (const SimpleTensor< bfloat16 > &src, const TensorShape &output_shape)
 
template<typename T >
SimpleTensor< T > reverse (const SimpleTensor< T > &src, const SimpleTensor< int32_t > &axis, bool use_inverted_axis)
 
template SimpleTensor< uint8_t > reverse (const SimpleTensor< uint8_t > &src, const SimpleTensor< int32_t > &axis, bool use_inverted_axis)
 
template SimpleTensor< halfreverse (const SimpleTensor< half > &src, const SimpleTensor< int32_t > &axis, bool use_inverted_axis)
 
template SimpleTensor< float > reverse (const SimpleTensor< float > &src, const SimpleTensor< int32_t > &axis, bool use_inverted_axis)
 
template<>
SimpleTensor< float > roi_align_layer (const SimpleTensor< float > &src, const SimpleTensor< float > &rois, const ROIPoolingLayerInfo &pool_info, const QuantizationInfo &output_qinfo)
 
template<>
SimpleTensor< halfroi_align_layer (const SimpleTensor< half > &src, const SimpleTensor< half > &rois, const ROIPoolingLayerInfo &pool_info, const QuantizationInfo &output_qinfo)
 
template<>
SimpleTensor< uint8_t > roi_align_layer (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint16_t > &rois, const ROIPoolingLayerInfo &pool_info, const QuantizationInfo &output_qinfo)
 
template<>
SimpleTensor< int8_t > roi_align_layer (const SimpleTensor< int8_t > &src, const SimpleTensor< uint16_t > &rois, const ROIPoolingLayerInfo &pool_info, const QuantizationInfo &output_qinfo)
 
template<typename T , typename TRois >
SimpleTensor< T > roi_align_layer (const SimpleTensor< T > &src, const SimpleTensor< TRois > &rois, const ROIPoolingLayerInfo &pool_info, const QuantizationInfo &output_qinfo)
 
template<>
SimpleTensor< float > roi_pool_layer (const SimpleTensor< float > &src, const SimpleTensor< uint16_t > &rois, const ROIPoolingLayerInfo &pool_info, const QuantizationInfo &output_qinfo)
 
template<>
SimpleTensor< uint8_t > roi_pool_layer (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint16_t > &rois, const ROIPoolingLayerInfo &pool_info, const QuantizationInfo &output_qinfo)
 
template<typename T >
SimpleTensor< T > roi_pool_layer (const SimpleTensor< T > &src, const SimpleTensor< uint16_t > &rois, const ROIPoolingLayerInfo &pool_info, const QuantizationInfo &output_qinfo)
 
template<typename T >
SimpleTensor< T > scale_core (const SimpleTensor< T > &in, float scale_x, float scale_y, InterpolationPolicy policy, BorderMode border_mode, T constant_border_value, SamplingPolicy sampling_policy, bool ceil_policy_scale, bool align_corners)
 
template<typename T >
SimpleTensor< T > scale (const SimpleTensor< T > &src, float scale_x, float scale_y, InterpolationPolicy policy, BorderMode border_mode, T constant_border_value, SamplingPolicy sampling_policy, bool ceil_policy_scale, bool align_corners, QuantizationInfo output_quantization_info)
 
template<>
SimpleTensor< uint8_t > scale (const SimpleTensor< uint8_t > &src, float scale_x, float scale_y, InterpolationPolicy policy, BorderMode border_mode, uint8_t constant_border_value, SamplingPolicy sampling_policy, bool ceil_policy_scale, bool align_corners, QuantizationInfo output_quantization_info)
 
template<>
SimpleTensor< int8_t > scale (const SimpleTensor< int8_t > &src, float scale_x, float scale_y, InterpolationPolicy policy, BorderMode border_mode, int8_t constant_border_value, SamplingPolicy sampling_policy, bool ceil_policy_scale, bool align_corners, QuantizationInfo output_quantization_info)
 
template SimpleTensor< int16_t > scale (const SimpleTensor< int16_t > &src, float scale_x, float scale_y, InterpolationPolicy policy, BorderMode border_mode, int16_t constant_border_value, SamplingPolicy sampling_policy, bool ceil_policy_scale, bool align_corners, QuantizationInfo output_quantization_info)
 
template SimpleTensor< halfscale (const SimpleTensor< half > &src, float scale_x, float scale_y, InterpolationPolicy policy, BorderMode border_mode, half constant_border_value, SamplingPolicy sampling_policy, bool ceil_policy_scale, bool align_corners, QuantizationInfo output_quantization_info)
 
template SimpleTensor< float > scale (const SimpleTensor< float > &src, float scale_x, float scale_y, InterpolationPolicy policy, BorderMode border_mode, float constant_border_value, SamplingPolicy sampling_policy, bool ceil_policy_scale, bool align_corners, QuantizationInfo output_quantization_info)
 
template<typename T >
SimpleTensor< T > scatter_layer_internal (const SimpleTensor< T > &src, const SimpleTensor< T > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template<typename T >
SimpleTensor< T > scatter_layer (const SimpleTensor< T > &src, const SimpleTensor< T > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template SimpleTensor< float > scatter_layer (const SimpleTensor< float > &src, const SimpleTensor< float > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template SimpleTensor< halfscatter_layer (const SimpleTensor< half > &src, const SimpleTensor< half > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template SimpleTensor< int32_t > scatter_layer (const SimpleTensor< int32_t > &src, const SimpleTensor< int32_t > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template SimpleTensor< uint32_t > scatter_layer (const SimpleTensor< uint32_t > &src, const SimpleTensor< uint32_t > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template SimpleTensor< int16_t > scatter_layer (const SimpleTensor< int16_t > &src, const SimpleTensor< int16_t > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template SimpleTensor< uint16_t > scatter_layer (const SimpleTensor< uint16_t > &src, const SimpleTensor< uint16_t > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template SimpleTensor< int8_t > scatter_layer (const SimpleTensor< int8_t > &src, const SimpleTensor< int8_t > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template SimpleTensor< uint8_t > scatter_layer (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint8_t > &updates, const SimpleTensor< int32_t > &indices, const TensorShape &out_shape, const ScatterInfo &info)
 
template<typename T >
SimpleTensor< T > select (const SimpleTensor< uint8_t > &c, const SimpleTensor< T > &x, const SimpleTensor< T > &y)
 
template SimpleTensor< uint8_t > select (const SimpleTensor< uint8_t > &c, const SimpleTensor< uint8_t > &x, const SimpleTensor< uint8_t > &y)
 
template SimpleTensor< halfselect (const SimpleTensor< uint8_t > &c, const SimpleTensor< half > &x, const SimpleTensor< half > &y)
 
template SimpleTensor< float > select (const SimpleTensor< uint8_t > &c, const SimpleTensor< float > &x, const SimpleTensor< float > &y)
 
template<typename T >
SimpleTensor< T > slice (const SimpleTensor< T > &src, Coordinates starts, Coordinates ends)
 
template SimpleTensor< float > slice (const SimpleTensor< float > &src, Coordinates starts, Coordinates ends)
 
template SimpleTensor< half_float::half > slice (const SimpleTensor< half_float::half > &src, Coordinates starts, Coordinates ends)
 
template<typename T >
SimpleTensor< T > strided_slice (const SimpleTensor< T > &src, Coordinates starts, Coordinates ends, BiStrides strides, int32_t begin_mask, int32_t end_mask, int32_t shrink_axis_mask)
 
template SimpleTensor< float > strided_slice (const SimpleTensor< float > &src, Coordinates starts, Coordinates ends, BiStrides strides, int32_t begin_mask, int32_t end_mask, int32_t shrink_axis_mask)
 
template SimpleTensor< half_float::half > strided_slice (const SimpleTensor< half_float::half > &src, Coordinates starts, Coordinates ends, BiStrides strides, int32_t begin_mask, int32_t end_mask, int32_t shrink_axis_mask)
 
template<typename T , typename std::enable_if< is_floating_point< T >::value, int >::type >
SimpleTensor< T > softmax_layer_generic (const SimpleTensor< T > &src, float beta, int32_t axis, bool is_log)
 
template SimpleTensor< float > softmax_layer_generic (const SimpleTensor< float > &src, float beta, int32_t axis, bool is_log)
 
template SimpleTensor< halfsoftmax_layer_generic (const SimpleTensor< half > &src, float beta, int32_t axis, bool is_log)
 
template<typename T , typename std::enable_if< is_floating_point< T >::value, int >::type >
SimpleTensor< T > softmax_layer (const SimpleTensor< T > &src, float beta, int32_t axis, bool is_log)
 
template SimpleTensor< float > softmax_layer (const SimpleTensor< float > &src, float beta, int32_t axis, bool is_log)
 
template SimpleTensor< halfsoftmax_layer (const SimpleTensor< half > &src, float beta, int32_t axis, bool is_log)
 
template SimpleTensor< uint8_t > softmax_layer (const SimpleTensor< uint8_t > &src, float beta, int32_t axis, bool is_log)
 
template SimpleTensor< int8_t > softmax_layer (const SimpleTensor< int8_t > &src, float beta, int32_t axis, bool is_log)
 
template<typename T >
SimpleTensor< T > space_to_batch (const SimpleTensor< T > &src, const SimpleTensor< int32_t > &block_shape, const SimpleTensor< int32_t > &paddings, const TensorShape &dst_shape)
 
template SimpleTensor< float > space_to_batch (const SimpleTensor< float > &src, const SimpleTensor< int32_t > &block_shape, const SimpleTensor< int32_t > &paddings, const TensorShape &dst_shape)
 
template SimpleTensor< halfspace_to_batch (const SimpleTensor< half > &src, const SimpleTensor< int32_t > &block_shape, const SimpleTensor< int32_t > &paddings, const TensorShape &dst_shape)
 
template SimpleTensor< uint8_t > space_to_batch (const SimpleTensor< uint8_t > &src, const SimpleTensor< int32_t > &block_shape, const SimpleTensor< int32_t > &paddings, const TensorShape &dst_shape)
 
template<typename T >
SimpleTensor< T > space_to_depth (const SimpleTensor< T > &src, const TensorShape &dst_shape, const int block_shape)
 
template SimpleTensor< float > space_to_depth (const SimpleTensor< float > &src, const TensorShape &dst_shape, const int block_shape)
 
template SimpleTensor< halfspace_to_depth (const SimpleTensor< half > &src, const TensorShape &dst_shape, const int block_shape)
 
template<typename T >
SimpleTensor< T > stack_layer (const std::vector< SimpleTensor< T >> &in, const TensorShape &output_shape, DataType data_type, unsigned int axis)
 
template SimpleTensor< int > stack_layer (const std::vector< SimpleTensor< int >> &in, const TensorShape &output_shape, DataType data_type, unsigned int axis)
 
template SimpleTensor< short > stack_layer (const std::vector< SimpleTensor< short >> &in, const TensorShape &output_shape, DataType data_type, unsigned int axis)
 
template SimpleTensor< char > stack_layer (const std::vector< SimpleTensor< char >> &in, const TensorShape &output_shape, DataType data_type, unsigned int axis)
 
template<typename T >
SimpleTensor< T > table_lookup (const SimpleTensor< T > &src, const std::map< T, T > &rawlut)
 
template SimpleTensor< uint8_t > table_lookup (const SimpleTensor< uint8_t > &src, const std::map< uint8_t, uint8_t > &rawlut)
 
template SimpleTensor< int16_t > table_lookup (const SimpleTensor< int16_t > &src, const std::map< int16_t, int16_t > &rawlut)
 
template<typename T >
SimpleTensor< T > tile (const SimpleTensor< T > &src, const Multiples &multiples)
 
template SimpleTensor< uint8_t > tile (const SimpleTensor< uint8_t > &src, const Multiples &multiples)
 
template SimpleTensor< int8_t > tile (const SimpleTensor< int8_t > &src, const Multiples &multiples)
 
template SimpleTensor< uint16_t > tile (const SimpleTensor< uint16_t > &src, const Multiples &multiples)
 
template SimpleTensor< int16_t > tile (const SimpleTensor< int16_t > &src, const Multiples &multiples)
 
template SimpleTensor< uint32_t > tile (const SimpleTensor< uint32_t > &src, const Multiples &multiples)
 
template SimpleTensor< int32_t > tile (const SimpleTensor< int32_t > &src, const Multiples &multiples)
 
template SimpleTensor< halftile (const SimpleTensor< half > &src, const Multiples &multiples)
 
template SimpleTensor< float > tile (const SimpleTensor< float > &src, const Multiples &multiples)
 
template<typename T >
SimpleTensor< T > transpose (const SimpleTensor< T > &src)
 
template SimpleTensor< uint8_t > transpose (const SimpleTensor< uint8_t > &src)
 
template SimpleTensor< uint16_t > transpose (const SimpleTensor< uint16_t > &src)
 
template SimpleTensor< uint32_t > transpose (const SimpleTensor< uint32_t > &src)
 
template SimpleTensor< halftranspose (const SimpleTensor< half > &src)
 
template SimpleTensor< float > transpose (const SimpleTensor< float > &src)
 
template<typename T >
std::vector< SimpleTensor< T > > unstack (const SimpleTensor< T > &input_tensor, std::vector< SimpleTensor< T >> &output_tensors, int axis)
 
template std::vector< SimpleTensor< float > > unstack (const SimpleTensor< float > &input_tensor, std::vector< SimpleTensor< float >> &output_tensors, int axis)
 
template std::vector< SimpleTensor< half > > unstack (const SimpleTensor< half > &input_tensor, std::vector< SimpleTensor< half >> &output_tensors, int axis)
 
template std::vector< SimpleTensor< uint8_t > > unstack (const SimpleTensor< uint8_t > &input_tensor, std::vector< SimpleTensor< uint8_t >> &output_tensors, int axis)
 
template<typename T >
SimpleTensor< T > weights_reshape (const SimpleTensor< T > &src, const SimpleTensor< T > &biases, const TensorShape &dst_shape, const unsigned int num_groups)
 
template SimpleTensor< float > weights_reshape (const SimpleTensor< float > &src, const SimpleTensor< float > &biases, const TensorShape &dst_shape, const unsigned int num_groups)
 
template SimpleTensor< halfweights_reshape (const SimpleTensor< half > &src, const SimpleTensor< half > &biases, const TensorShape &dst_shape, const unsigned int num_groups)
 
template SimpleTensor< uint8_t > weights_reshape (const SimpleTensor< uint8_t > &src, const SimpleTensor< uint8_t > &biases, const TensorShape &dst_shape, const unsigned int num_groups)
 
template<typename T >
SimpleTensor< T > winograd_input_transform (const SimpleTensor< T > &in, const TensorShape &output_shape, const WinogradInfo &winograd_info)
 
template<typename T >
SimpleTensor< T > winograd_filter_transform (const SimpleTensor< T > &in, const TensorShape &output_shape, const WinogradInfo &winograd_info)
 
template<typename T >
SimpleTensor< T > winograd_output_transform (const SimpleTensor< T > &in, const SimpleTensor< T > &b, const TensorShape &output_shape, const WinogradInfo &winograd_info)
 
template SimpleTensor< float > winograd_filter_transform (const SimpleTensor< float > &in, const TensorShape &output_shape, const WinogradInfo &winograd_info)
 
template SimpleTensor< float > winograd_input_transform (const SimpleTensor< float > &in, const TensorShape &output_shape, const WinogradInfo &winograd_info)
 
template SimpleTensor< float > winograd_output_transform (const SimpleTensor< float > &in, const SimpleTensor< float > &b, const TensorShape &output_shape, const WinogradInfo &winograd_info)
 
template SimpleTensor< halfwinograd_filter_transform (const SimpleTensor< half > &in, const TensorShape &output_shape, const WinogradInfo &winograd_info)
 
template SimpleTensor< halfwinograd_input_transform (const SimpleTensor< half > &in, const TensorShape &output_shape, const WinogradInfo &winograd_info)
 
template SimpleTensor< halfwinograd_output_transform (const SimpleTensor< half > &in, const SimpleTensor< half > &b, const TensorShape &output_shape, const WinogradInfo &winograd_info)
 

Enumeration Type Documentation

◆ ArithmeticOperation

enum ArithmeticOperation
strong

Arithmetic operation types.

Enumerator
ADD 
SUB 

Definition at line 39 of file ArithmeticOperations.h.

40 {
41  ADD,
42  SUB
43 };

◆ FFTDirection

enum FFTDirection
strong
Enumerator
Forward 
Inverse 

Definition at line 38 of file DFT.h.

39 {
40  Forward,
41  Inverse
42 };

◆ WinogradTransformType

enum WinogradTransformType
strong

Winograd transform type.

Enumerator
INPUT 

Winograd input transform.

FILTER 

Winograd filter transform.

OUTPUT 

Winograd output transform.

Definition at line 40 of file Winograd.h.

41 {
42  INPUT, /**< Winograd input transform */
43  FILTER, /**< Winograd filter transform */
44  OUTPUT /**< Winograd output transform */
45 };

Function Documentation

◆ absolute_difference() [1/4]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::absolute_difference ( const SimpleTensor< int16_t > &  src1,
const SimpleTensor< int16_t > &  src2,
DataType  dst_data_type 
)

◆ absolute_difference() [2/4]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::absolute_difference ( const SimpleTensor< int8_t > &  src1,
const SimpleTensor< int8_t > &  src2,
DataType  dst_data_type 
)

◆ absolute_difference() [3/4]

SimpleTensor< T > absolute_difference ( const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2,
DataType  dst_data_type 
)

Definition at line 38 of file AbsoluteDifference.cpp.

39 {
40  SimpleTensor<T> result(src1.shape(), dst_data_type);
41 
42  using intermediate_type = typename common_promoted_signed_type<T>::intermediate_type;
43 #if defined(_OPENMP)
44  #pragma omp parallel for
45 #endif /* _OPENMP */
46  for(int i = 0; i < src1.num_elements(); ++i)
47  {
48  intermediate_type val = std::abs(static_cast<intermediate_type>(src1[i]) - static_cast<intermediate_type>(src2[i]));
49  result[i] = saturate_cast<T>(val);
50  }
51 
52  return result;
53 }

References SimpleTensor< T >::num_elements(), and SimpleTensor< T >::shape().

◆ absolute_difference() [4/4]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::absolute_difference ( const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< uint8_t > &  src2,
DataType  dst_data_type 
)

◆ accumulate() [1/2]

SimpleTensor< T2 > accumulate ( const SimpleTensor< T1 > &  src,
DataType  output_data_type 
)

Definition at line 38 of file Accumulate.cpp.

39 {
40  SimpleTensor<T2> dst{ src.shape(), output_data_type };
41 
42  library->fill_tensor_uniform(dst, 1, static_cast<T2>(0), static_cast<T2>(std::numeric_limits<T1>::max()));
43 
44  using intermediate_type = typename common_promoted_signed_type<T1, T2>::intermediate_type;
45 #if defined(_OPENMP)
46  #pragma omp parallel for
47 #endif /* _OPENMP */
48  for(int i = 0; i < src.num_elements(); ++i)
49  {
50  intermediate_type val = static_cast<intermediate_type>(src[i]) + static_cast<intermediate_type>(dst[i]);
51  dst[i] = saturate_cast<T2>(val);
52  }
53 
54  return dst;
55 }

References arm_compute::test::validation::dst, arm_compute::test::library, and arm_compute::test::validation::src.

Referenced by Dimensions< size_t >::collapse(), arm_compute::detail::convolve_3x3(), arm_compute::helpers::fft::digit_reverse_indices(), InstrumentsStats::InstrumentsStats(), arm_compute::join(), arm_compute::test::join(), mean_and_standard_deviation(), arm_compute::scale_helpers::pixel_area_c1u8_clamp(), SimpleTensor< uint8_t >::size(), OpenCLMemoryUsage::test_measurements(), TensorShape::total_size(), TensorShape::total_size_lower(), and TensorShape::total_size_upper().

◆ accumulate() [2/2]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::accumulate ( const SimpleTensor< uint8_t > &  src,
DataType  output_data_type 
)

◆ accumulate_squared() [1/2]

SimpleTensor< T2 > accumulate_squared ( const SimpleTensor< T1 > &  src,
uint32_t  shift,
DataType  output_data_type 
)

Definition at line 80 of file Accumulate.cpp.

81 {
82  ARM_COMPUTE_ERROR_ON_MSG(shift > 15, "Shift in accumulate_squared must be within the range [0, 15]");
83 
84  SimpleTensor<T2> dst{ src.shape(), output_data_type };
85 
86  library->fill_tensor_uniform(dst, 1, static_cast<T2>(0), static_cast<T2>(std::numeric_limits<T1>::max()));
87 
88  using intermediate_type = typename common_promoted_signed_type<T1, T2>::intermediate_type;
89  intermediate_type denom = 1 << shift;
90 #if defined(_OPENMP)
91  #pragma omp parallel for
92 #endif /* _OPENMP */
93  for(int i = 0; i < src.num_elements(); ++i)
94  {
95  intermediate_type val = static_cast<intermediate_type>(dst[i]) + (static_cast<intermediate_type>(src[i]) * static_cast<intermediate_type>(src[i]) / denom);
96  dst[i] = saturate_cast<T2>(val);
97  }
98 
99  return dst;
100 }

References ARM_COMPUTE_ERROR_ON_MSG, arm_compute::test::validation::dst, arm_compute::test::library, and arm_compute::test::validation::src.

◆ accumulate_squared() [2/2]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::accumulate_squared ( const SimpleTensor< uint8_t > &  src,
uint32_t  shift,
DataType  output_data_type 
)

◆ accumulate_weighted() [1/2]

SimpleTensor< T2 > accumulate_weighted ( const SimpleTensor< T1 > &  src,
float  alpha,
DataType  output_data_type 
)

Definition at line 58 of file Accumulate.cpp.

59 {
60  ARM_COMPUTE_ERROR_ON_MSG(alpha < 0.f || alpha > 1.f, "Weight (alpha) specified in accumulate_weighted must be within the range [0, 1]");
61 
62  SimpleTensor<T2> dst{ src.shape(), output_data_type };
63 
64  library->fill_tensor_uniform(dst, 1, static_cast<T2>(0), static_cast<T2>(std::numeric_limits<T1>::max()));
65 
66  using intermediate_type = typename common_promoted_signed_type<T1, T2>::intermediate_type;
67 #if defined(_OPENMP)
68  #pragma omp parallel for
69 #endif /* _OPENMP */
70  for(int i = 0; i < src.num_elements(); ++i)
71  {
72  double val = (1. - static_cast<double>(alpha)) * static_cast<intermediate_type>(dst[i]) + static_cast<double>(alpha) * static_cast<intermediate_type>(src[i]);
73  dst[i] = static_cast<T2>(val);
74  }
75 
76  return dst;
77 }

References ARM_COMPUTE_ERROR_ON_MSG, arm_compute::test::validation::dst, arm_compute::test::library, and arm_compute::test::validation::src.

◆ accumulate_weighted() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::accumulate_weighted ( const SimpleTensor< uint8_t > &  src,
float  alpha,
DataType  output_data_type 
)

◆ activate_float()

T arm_compute::test::validation::reference::activate_float ( x,
a,
b,
ActivationLayerInfo::ActivationFunction  activation 
)
inline

Definition at line 39 of file ActivationLayer.h.

40 {
41  T ret;
42 
43  switch (activation)
44  {
45  case ActivationLayerInfo::ActivationFunction::ABS:
46  ret = std::abs(x);
47  break;
48  case ActivationLayerInfo::ActivationFunction::LINEAR:
49  ret = a * x + b;
50  break;
51  case ActivationLayerInfo::ActivationFunction::LOGISTIC:
52  ret = static_cast<T>(1) / (static_cast<T>(1) + std::exp(-x));
53  break;
54  case ActivationLayerInfo::ActivationFunction::RELU:
55  ret = std::max<T>(static_cast<T>(0), x);
56  break;
57  case ActivationLayerInfo::ActivationFunction::BOUNDED_RELU:
58  ret = std::min<T>(a, std::max(static_cast<T>(0), x));
59  break;
60  case ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU:
61  ret = std::min<T>(a, std::max<T>(b, x));
62  break;
63  case ActivationLayerInfo::ActivationFunction::LEAKY_RELU:
64  ret = x > static_cast<T>(0) ? x : static_cast<T>(a * x);
65  break;
66  case ActivationLayerInfo::ActivationFunction::SOFT_RELU:
67  ret = std::log(static_cast<T>(1) + std::exp(static_cast<double>(x)));
68  break;
69  case ActivationLayerInfo::ActivationFunction::ELU:
70  ret = x > static_cast<T>(0) ? x : static_cast<T>(a * (std::exp(x) - static_cast<T>(1)));
71  break;
72  case ActivationLayerInfo::ActivationFunction::SQRT:
73  ret = std::sqrt(x);
74  break;
75  case ActivationLayerInfo::ActivationFunction::SQUARE:
76  ret = x * x;
77  break;
78  case ActivationLayerInfo::ActivationFunction::TANH:
79  ret = a * std::tanh(b * x);
80  break;
81  case ActivationLayerInfo::ActivationFunction::IDENTITY:
82  ret = x;
83  break;
84  case ActivationLayerInfo::ActivationFunction::HARD_SWISH:
85  ret = x * ((std::min(std::max(static_cast<T>(x + 3), static_cast<T>(0.0f)), static_cast<T>(6.0f))) *
86  0.166666667f);
87  break;
88  case ActivationLayerInfo::ActivationFunction::SWISH:
89  ret = static_cast<T>(x) / (static_cast<T>(1) + std::exp(-a * x));
90  break;
91  case ActivationLayerInfo::ActivationFunction::GELU:
92  ret = x * 0.5f * (1 + erf(x / std::sqrt(2.0f)));
93  break;
94  default:
95  ARM_COMPUTE_ERROR("Unsupported activation function");
96  break;
97  }
98 
99  return ret;
100 }

References ARM_COMPUTE_ERROR, and arm_compute::test::validation::b.

◆ activation_layer() [1/5]

template SimpleTensor<bfloat16> arm_compute::test::validation::reference::activation_layer ( const SimpleTensor< bfloat16 > &  src,
ActivationLayerInfo  info,
const QuantizationInfo oq_info 
)

◆ activation_layer() [2/5]

template SimpleTensor<float> arm_compute::test::validation::reference::activation_layer ( const SimpleTensor< float > &  src,
ActivationLayerInfo  info,
const QuantizationInfo oq_info 
)

◆ activation_layer() [3/5]

template SimpleTensor<half> arm_compute::test::validation::reference::activation_layer ( const SimpleTensor< half > &  src,
ActivationLayerInfo  info,
const QuantizationInfo oq_info 
)

◆ activation_layer() [4/5]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::activation_layer ( const SimpleTensor< int32_t > &  src,
ActivationLayerInfo  info,
const QuantizationInfo oq_info 
)

◆ activation_layer() [5/5]

SimpleTensor< T > activation_layer ( const SimpleTensor< T > &  src,
ActivationLayerInfo  info,
const QuantizationInfo oq_info 
)

Definition at line 39 of file ActivationLayer.cpp.

40 {
41  ARM_COMPUTE_UNUSED(oq_info);
42 
43  // Create reference
44  SimpleTensor<T> dst{src.shape(), src.data_type(), 1};
45 
46  // Compute reference
47  const T a(info.a());
48  const T b(info.b());
49 #if defined(_OPENMP)
50  #pragma omp parallel for
51 #endif /* _OPENMP */
52  for (int i = 0; i < src.num_elements(); ++i)
53  {
54  dst[i] = activate_float<T>(src[i], a, b, info.activation());
55  }
56 
57  return dst;
58 }

References ARM_COMPUTE_UNUSED, arm_compute::test::validation::b, arm_compute::test::validation::dst, arm_compute::test::validation::info, and arm_compute::test::validation::src.

Referenced by batch_normalization_layer(), and arm_compute::test::validation::TEST_CASE().

◆ activation_layer< int16_t >()

SimpleTensor<int16_t> arm_compute::test::validation::reference::activation_layer< int16_t > ( const SimpleTensor< int16_t > &  src,
ActivationLayerInfo  info,
const QuantizationInfo oq_info 
)

Definition at line 86 of file ActivationLayer.cpp.

87 {
88  const QuantizationInfo dst_qinfo = oq_info.empty() ? src.quantization_info() : oq_info;
89 
90  SimpleTensor<float> src_tmp = convert_from_symmetric(src);
91  SimpleTensor<float> dst_tmp = activation_layer<float>(src_tmp, info);
92  SimpleTensor<int16_t> dst = convert_to_symmetric<int16_t>(dst_tmp, dst_qinfo);
93  return dst;
94 }

References arm_compute::test::validation::convert_from_symmetric(), arm_compute::test::validation::dst, QuantizationInfo::empty(), arm_compute::test::validation::info, and arm_compute::test::validation::src.

◆ activation_layer< int8_t >()

SimpleTensor<int8_t> arm_compute::test::validation::reference::activation_layer< int8_t > ( const SimpleTensor< int8_t > &  src,
ActivationLayerInfo  info,
const QuantizationInfo oq_info 
)

Definition at line 74 of file ActivationLayer.cpp.

75 {
76  const QuantizationInfo dst_qinfo = oq_info.empty() ? src.quantization_info() : oq_info;
77 
78  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
79  SimpleTensor<float> dst_tmp = activation_layer<float>(src_tmp, info);
80  SimpleTensor<int8_t> dst = convert_to_asymmetric<int8_t>(dst_tmp, dst_qinfo);
81  return dst;
82 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, QuantizationInfo::empty(), arm_compute::test::validation::info, and arm_compute::test::validation::src.

◆ activation_layer< uint8_t >()

SimpleTensor<uint8_t> arm_compute::test::validation::reference::activation_layer< uint8_t > ( const SimpleTensor< uint8_t > &  src,
ActivationLayerInfo  info,
const QuantizationInfo oq_info 
)

Definition at line 62 of file ActivationLayer.cpp.

63 {
64  const QuantizationInfo dst_qinfo = oq_info.empty() ? src.quantization_info() : oq_info;
65 
66  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
67  SimpleTensor<float> dst_tmp = activation_layer<float>(src_tmp, info);
68  SimpleTensor<uint8_t> dst = convert_to_asymmetric<uint8_t>(dst_tmp, dst_qinfo);
69  return dst;
70 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, QuantizationInfo::empty(), arm_compute::test::validation::info, and arm_compute::test::validation::src.

◆ arithmetic_division() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::arithmetic_division ( const SimpleTensor< float > &  src1,
const SimpleTensor< float > &  src2,
DataType  data_type 
)

◆ arithmetic_division() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::arithmetic_division ( const SimpleTensor< half > &  src1,
const SimpleTensor< half > &  src2,
DataType  data_type 
)

◆ arithmetic_division() [3/3]

SimpleTensor< T > arithmetic_division ( const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2,
DataType  data_type 
)

Definition at line 79 of file ArithmeticDivision.cpp.

80 {
81  SimpleTensor<T> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), data_type);
82 
83  Coordinates id_src1{};
84  Coordinates id_src2{};
85  Coordinates id_dst{};
86 
87  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(src1, src2, dst, id_src1, id_src2, id_dst);
88 
89  return dst;
90 }

References TensorShape::broadcast_shape(), arm_compute::test::validation::data_type, arm_compute::test::validation::dst, and SimpleTensor< T >::shape().

◆ arithmetic_operation() [1/13]

template SimpleTensor< float > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< float > &  src1,
const SimpleTensor< float > &  src2,
DataType  dst_data_type,
ConvertPolicy  convert_policy 
)

◆ arithmetic_operation() [2/13]

template SimpleTensor< float > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< float > &  src1,
const SimpleTensor< float > &  src2,
SimpleTensor< float > &  dst,
ConvertPolicy  convert_policy 
)

◆ arithmetic_operation() [3/13]

template SimpleTensor< half > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< half > &  src1,
const SimpleTensor< half > &  src2,
DataType  dst_data_type,
ConvertPolicy  convert_policy 
)

◆ arithmetic_operation() [4/13]

template SimpleTensor< half > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< half > &  src1,
const SimpleTensor< half > &  src2,
SimpleTensor< half > &  dst,
ConvertPolicy  convert_policy 
)

◆ arithmetic_operation() [5/13]

template SimpleTensor< int16_t > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< int16_t > &  src1,
const SimpleTensor< int16_t > &  src2,
DataType  dst_data_type,
ConvertPolicy  convert_policy 
)

◆ arithmetic_operation() [6/13]

SimpleTensor< int16_t > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< int16_t > &  src1,
const SimpleTensor< int16_t > &  src2,
SimpleTensor< int16_t > &  dst,
ConvertPolicy  convert_policy 
)

Definition at line 158 of file ArithmeticOperations.cpp.

159 {
160  Coordinates id_src1{};
161  Coordinates id_src2{};
162  Coordinates id_dst{};
163 
164  if(dst.data_type() == DataType::QSYMM16)
165  {
166  SimpleTensor<float> src1_tmp = convert_from_symmetric<int16_t>(src1);
167  SimpleTensor<float> src2_tmp = convert_from_symmetric<int16_t>(src2);
168  SimpleTensor<float> dst_tmp(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dst.data_type());
169 
170  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1_tmp, src2_tmp, dst_tmp, convert_policy, id_src1, id_src2, id_dst);
171 
172  dst = convert_to_symmetric<int16_t>(dst_tmp, dst.quantization_info());
173  return dst;
174  }
175  else
176  {
177  // DataType::S16
178  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1, src2, dst, convert_policy, id_src1, id_src2, id_dst);
179  return dst;
180  }
181 }

References TensorShape::broadcast_shape(), arm_compute::test::validation::dst, arm_compute::QSYMM16, and SimpleTensor< T >::shape().

◆ arithmetic_operation() [7/13]

template SimpleTensor< int32_t > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< int32_t > &  src1,
const SimpleTensor< int32_t > &  src2,
DataType  dst_data_type,
ConvertPolicy  convert_policy 
)

◆ arithmetic_operation() [8/13]

template SimpleTensor< int32_t > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< int32_t > &  src1,
const SimpleTensor< int32_t > &  src2,
SimpleTensor< int32_t > &  dst,
ConvertPolicy  convert_policy 
)

◆ arithmetic_operation() [9/13]

template SimpleTensor< int8_t > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< int8_t > &  src1,
const SimpleTensor< int8_t > &  src2,
DataType  dst_data_type,
ConvertPolicy  convert_policy 
)

◆ arithmetic_operation() [10/13]

SimpleTensor< int8_t > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< int8_t > &  src1,
const SimpleTensor< int8_t > &  src2,
SimpleTensor< int8_t > &  dst,
ConvertPolicy  convert_policy 
)

Definition at line 131 of file ArithmeticOperations.cpp.

132 {
133  Coordinates id_src1{};
134  Coordinates id_src2{};
135  Coordinates id_dst{};
136 
137  if(dst.data_type() == DataType::QASYMM8_SIGNED)
138  {
139  SimpleTensor<float> src1_tmp = convert_from_asymmetric(src1);
140  SimpleTensor<float> src2_tmp = convert_from_asymmetric(src2);
141  SimpleTensor<float> dst_tmp(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dst.data_type());
142 
143  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1_tmp, src2_tmp, dst_tmp, convert_policy, id_src1, id_src2, id_dst);
144 
145  dst = convert_to_asymmetric<int8_t>(dst_tmp, dst.quantization_info());
146  return dst;
147  }
148  else
149  {
150  // DataType::S8
151  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1, src2, dst, convert_policy, id_src1, id_src2, id_dst);
152 
153  return dst;
154  }
155 }

References TensorShape::broadcast_shape(), arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, arm_compute::QASYMM8_SIGNED, and SimpleTensor< T >::shape().

◆ arithmetic_operation() [11/13]

SimpleTensor< T > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2,
DataType  dst_data_type,
ConvertPolicy  convert_policy 
)

Definition at line 188 of file ArithmeticOperations.cpp.

189 {
190  ARM_COMPUTE_ERROR_ON_MSG(is_data_type_quantized(dst_data_type), "For quantized input data types, the quantized output tensor should be passed directly.");
191 
192  SimpleTensor<T> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dst_data_type);
193  arithmetic_operation<T>(op, src1, src2, dst, convert_policy);
194  return dst;
195 }

References ARM_COMPUTE_ERROR_ON_MSG, TensorShape::broadcast_shape(), arm_compute::test::validation::dst, arm_compute::is_data_type_quantized(), and SimpleTensor< T >::shape().

◆ arithmetic_operation() [12/13]

SimpleTensor< T > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2,
SimpleTensor< T > &  dst,
ConvertPolicy  convert_policy 
)

Definition at line 92 of file ArithmeticOperations.cpp.

93 {
94  Coordinates id_src1{};
95  Coordinates id_src2{};
96  Coordinates id_dst{};
97 
98  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1, src2, dst, convert_policy, id_src1, id_src2, id_dst);
99 
100  return dst;
101 }

References arm_compute::test::validation::dst.

Referenced by arm_compute::test::validation::TEST_CASE().

◆ arithmetic_operation() [13/13]

SimpleTensor< uint8_t > arithmetic_operation ( ArithmeticOperation  op,
const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< uint8_t > &  src2,
SimpleTensor< uint8_t > &  dst,
ConvertPolicy  convert_policy 
)

Definition at line 104 of file ArithmeticOperations.cpp.

105 {
106  Coordinates id_src1{};
107  Coordinates id_src2{};
108  Coordinates id_dst{};
109 
110  if(dst.data_type() == DataType::QASYMM8)
111  {
112  SimpleTensor<float> src1_tmp = convert_from_asymmetric(src1);
113  SimpleTensor<float> src2_tmp = convert_from_asymmetric(src2);
114  SimpleTensor<float> dst_tmp(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dst.data_type());
115 
116  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1_tmp, src2_tmp, dst_tmp, convert_policy, id_src1, id_src2, id_dst);
117 
118  dst = convert_to_asymmetric<uint8_t>(dst_tmp, dst.quantization_info());
119  return dst;
120  }
121  else
122  {
123  // DataType::U8
124  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1, src2, dst, convert_policy, id_src1, id_src2, id_dst);
125 
126  return dst;
127  }
128 }

References TensorShape::broadcast_shape(), arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, arm_compute::QASYMM8, and SimpleTensor< T >::shape().

◆ batch_normalization_layer() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::batch_normalization_layer ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  mean,
const SimpleTensor< float > &  var,
const SimpleTensor< float > &  beta,
const SimpleTensor< float > &  gamma,
float  epsilon,
ActivationLayerInfo  act_info 
)

◆ batch_normalization_layer() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::batch_normalization_layer ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  mean,
const SimpleTensor< half > &  var,
const SimpleTensor< half > &  beta,
const SimpleTensor< half > &  gamma,
float  epsilon,
ActivationLayerInfo  act_info 
)

◆ batch_normalization_layer() [3/3]

SimpleTensor< T > batch_normalization_layer ( const SimpleTensor< T > &  src,
const SimpleTensor< T > &  mean,
const SimpleTensor< T > &  var,
const SimpleTensor< T > &  beta,
const SimpleTensor< T > &  gamma,
float  epsilon,
ActivationLayerInfo  act_info 
)

Definition at line 40 of file BatchNormalizationLayer.cpp.

42 {
43  SimpleTensor<T> result(src.shape(), src.data_type());
44 
45  const auto cols = static_cast<int>(src.shape()[0]);
46  const auto rows = static_cast<int>(src.shape()[1]);
47  const auto depth = static_cast<int>(src.shape()[2]);
48  const int upper_dims = src.shape().total_size() / (cols * rows * depth);
49 #if defined(_OPENMP)
50  #pragma omp parallel for schedule(dynamic, 1) collapse(4)
51 #endif /* _OPENMP */
52  for(int r = 0; r < upper_dims; ++r)
53  {
54  for(int i = 0; i < depth; ++i)
55  {
56  for(int k = 0; k < rows; ++k)
57  {
58  for(int l = 0; l < cols; ++l)
59  {
60  const int pos = l + k * cols + i * rows * cols + r * cols * rows * depth;
61  const float denominator = sqrt(var[i] + epsilon);
62  const float numerator = src[pos] - mean[i];
63  const float x_bar = numerator / denominator;
64  result[pos] = beta[i] + x_bar * gamma[i];
65  }
66  }
67  }
68  }
69 
70  if(act_info.enabled())
71  {
72  result = activation_layer(result, act_info);
73  }
74 
75  return result;
76 }

References arm_compute::test::validation::act_info, activation_layer(), caffe_mnist_image_extractor::cols, arm_compute::quantization::epsilon, caffe_mnist_image_extractor::rows, and arm_compute::test::validation::src.

◆ batch_to_space() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::batch_to_space ( const SimpleTensor< float > &  src,
const std::vector< int32_t > &  block_shape,
const CropInfo crop_info,
const TensorShape dst_shape 
)

◆ batch_to_space() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::batch_to_space ( const SimpleTensor< half > &  src,
const std::vector< int32_t > &  block_shape,
const CropInfo crop_info,
const TensorShape dst_shape 
)

◆ batch_to_space() [3/3]

SimpleTensor< T > batch_to_space ( const SimpleTensor< T > &  src,
const std::vector< int32_t > &  block_shape,
const CropInfo crop_info,
const TensorShape dst_shape 
)

Definition at line 40 of file BatchToSpaceLayer.cpp.

41 {
42  ARM_COMPUTE_ERROR_ON(block_shape[0] < 1);
43  ARM_COMPUTE_ERROR_ON(block_shape[1] < 1);
44  const auto expected_dst_shape = misc::shape_calculator::compute_batch_to_space_shape(DataLayout::NCHW, src.shape(), block_shape[0], block_shape[1], crop_info);
46  ARM_COMPUTE_UNUSED(expected_dst_shape);
47 
48  SimpleTensor<T> result(dst_shape, src.data_type());
49  int out_pos = 0;
50  const auto width_out = static_cast<int>(dst_shape[0]);
51  const auto height_out = static_cast<int>(dst_shape[1]);
52  const auto z_out = static_cast<int>(dst_shape[2]);
53  const auto batch_out = static_cast<int>(dst_shape[3]);
54 
55  for(int batch = 0; batch < batch_out; ++batch)
56  {
57  for(int z = 0; z < z_out; ++z)
58  {
59  for(int y = 0; y < height_out; ++y)
60  {
61  for(int x = 0; x < width_out; ++x)
62  {
63  const int x_c = x + crop_info.left;
64  const int y_c = y + crop_info.top;
65  const int in_batch = batch + ((x_c % block_shape[0]) + (y_c % block_shape[1]) * (block_shape[0])) * dst_shape[3];
66  const int in_x = x_c / block_shape[0];
67  const int in_y = y_c / block_shape[1];
68  const int in_pos = in_x + src.shape()[0] * in_y + z * src.shape()[0] * src.shape()[1] + in_batch * src.shape()[0] * src.shape()[1] * src.shape()[2];
69  result[out_pos] = src[in_pos];
70  ++out_pos;
71  }
72  }
73  }
74  }
75 
76  return result;
77 }

References ARM_COMPUTE_ERROR_ON, ARM_COMPUTE_UNUSED, arm_compute::misc::shape_calculator::compute_batch_to_space_shape(), arm_compute::test::validation::dst_shape, arm_compute::detail::have_different_dimensions(), Padding2D::left, arm_compute::NCHW, arm_compute::test::validation::src, and Padding2D::top.

◆ bitwise_and() [1/2]

SimpleTensor< T > bitwise_and ( const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2 
)

Definition at line 35 of file BitwiseAnd.cpp.

36 {
37  SimpleTensor<T> dst(src1.shape(), src1.data_type());
38 #if defined(_OPENMP)
39  #pragma omp parallel for
40 #endif /* _OPENMP */
41  for(int i = 0; i < src1.num_elements(); ++i)
42  {
43  dst[i] = src1[i] & src2[i];
44  }
45 
46  return dst;
47 }

References SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, SimpleTensor< T >::num_elements(), and SimpleTensor< T >::shape().

◆ bitwise_and() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::bitwise_and ( const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< uint8_t > &  src2 
)

◆ bitwise_not() [1/2]

SimpleTensor< T > bitwise_not ( const SimpleTensor< T > &  src)

Definition at line 35 of file BitwiseNot.cpp.

36 {
37  SimpleTensor<T> dst(src.shape(), src.data_type());
38 #if defined(_OPENMP)
39  #pragma omp parallel for
40 #endif /* _OPENMP */
41  for(int i = 0; i < src.num_elements(); ++i)
42  {
43  dst[i] = ~src[i];
44  }
45 
46  return dst;
47 }

References arm_compute::test::validation::dst, and arm_compute::test::validation::src.

◆ bitwise_not() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::bitwise_not ( const SimpleTensor< uint8_t > &  src)

◆ bitwise_or() [1/2]

SimpleTensor< T > bitwise_or ( const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2 
)

Definition at line 35 of file BitwiseOr.cpp.

36 {
37  SimpleTensor<T> dst(src1.shape(), src1.data_type());
38 #if defined(_OPENMP)
39  #pragma omp parallel for
40 #endif /* _OPENMP */
41  for(int i = 0; i < src1.num_elements(); ++i)
42  {
43  dst[i] = src1[i] | src2[i];
44  }
45 
46  return dst;
47 }

References SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, SimpleTensor< T >::num_elements(), and SimpleTensor< T >::shape().

◆ bitwise_or() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::bitwise_or ( const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< uint8_t > &  src2 
)

◆ bitwise_xor() [1/2]

SimpleTensor< T > bitwise_xor ( const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2 
)

Definition at line 35 of file BitwiseXor.cpp.

36 {
37  SimpleTensor<T> dst(src1.shape(), src1.data_type());
38 #if defined(_OPENMP)
39  #pragma omp parallel for
40 #endif /* _OPENMP */
41  for(int i = 0; i < src1.num_elements(); ++i)
42  {
43  dst[i] = src1[i] ^ src2[i];
44  }
45 
46  return dst;
47 }

References SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, SimpleTensor< T >::num_elements(), and SimpleTensor< T >::shape().

◆ bitwise_xor() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::bitwise_xor ( const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< uint8_t > &  src2 
)

◆ bounding_box_transform() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::bounding_box_transform ( const SimpleTensor< float > &  boxes,
const SimpleTensor< float > &  deltas,
const BoundingBoxTransformInfo info 
)

◆ bounding_box_transform() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::bounding_box_transform ( const SimpleTensor< half > &  boxes,
const SimpleTensor< half > &  deltas,
const BoundingBoxTransformInfo info 
)

◆ bounding_box_transform() [3/4]

SimpleTensor< T > bounding_box_transform ( const SimpleTensor< T > &  boxes,
const SimpleTensor< TDeltas > &  deltas,
const BoundingBoxTransformInfo info 
)

Definition at line 40 of file BoundingBoxTransform.cpp.

41 {
42  const DataType boxes_data_type = boxes.data_type();
43  SimpleTensor<T> pred_boxes(deltas.shape(), boxes_data_type);
44 
45  const size_t num_classes = deltas.shape()[0] / 4;
46  const size_t num_boxes = deltas.shape()[1];
47  const TDeltas *deltas_ptr = deltas.data();
48  T *pred_boxes_ptr = pred_boxes.data();
49 
50  const int img_h = floor(info.img_height() / info.scale() + 0.5f);
51  const int img_w = floor(info.img_width() / info.scale() + 0.5f);
52 
53  const auto scale_after = (info.apply_scale() ? T(info.scale()) : T(1));
54  const auto scale_before = T(info.scale());
55  ARM_COMPUTE_ERROR_ON(scale_before <= 0);
56  const auto offset = (info.correct_transform_coords() ? T(1.f) : T(0.f));
57 
58  const size_t box_fields = 4;
59  const size_t class_fields = 4;
60 #if defined(_OPENMP)
61  #pragma omp parallel for
62 #endif /* _OPENMP */
63  for(size_t i = 0; i < num_boxes; ++i)
64  {
65  // Extract ROI information
66  const size_t start_box = box_fields * i;
67  const T width = (boxes[start_box + 2] / scale_before) - (boxes[start_box] / scale_before) + T(1.f);
68  const T height = (boxes[start_box + 3] / scale_before) - (boxes[start_box + 1] / scale_before) + T(1.f);
69  const T ctr_x = (boxes[start_box] / scale_before) + T(0.5f) * width;
70  const T ctr_y = (boxes[start_box + 1] / scale_before) + T(0.5f) * height;
71 
72  for(size_t j = 0; j < num_classes; ++j)
73  {
74  // Extract deltas
75  const size_t start_delta = i * num_classes * class_fields + class_fields * j;
76  const TDeltas dx = deltas_ptr[start_delta] / TDeltas(info.weights()[0]);
77  const TDeltas dy = deltas_ptr[start_delta + 1] / TDeltas(info.weights()[1]);
78  TDeltas dw = deltas_ptr[start_delta + 2] / TDeltas(info.weights()[2]);
79  TDeltas dh = deltas_ptr[start_delta + 3] / TDeltas(info.weights()[3]);
80 
81  // Clip dw and dh
82  dw = std::min(dw, TDeltas(info.bbox_xform_clip()));
83  dh = std::min(dh, TDeltas(info.bbox_xform_clip()));
84 
85  // Determine the predictions
86  const T pred_ctr_x = dx * width + ctr_x;
87  const T pred_ctr_y = dy * height + ctr_y;
88  const T pred_w = T(std::exp(dw)) * width;
89  const T pred_h = T(std::exp(dh)) * height;
90 
91  // Store the prediction into the output tensor
92  pred_boxes_ptr[start_delta] = scale_after * utility::clamp<T>(pred_ctr_x - T(0.5f) * pred_w, T(0), T(img_w - 1));
93  pred_boxes_ptr[start_delta + 1] = scale_after * utility::clamp<T>(pred_ctr_y - T(0.5f) * pred_h, T(0), T(img_h - 1));
94  pred_boxes_ptr[start_delta + 2] = scale_after * utility::clamp<T>(pred_ctr_x + T(0.5f) * pred_w - offset, T(0), T(img_w - 1));
95  pred_boxes_ptr[start_delta + 3] = scale_after * utility::clamp<T>(pred_ctr_y + T(0.5f) * pred_h - offset, T(0), T(img_h - 1));
96  }
97  }
98  return pred_boxes;
99 }

References ARM_COMPUTE_ERROR_ON, SimpleTensor< T >::data(), SimpleTensor< T >::data_type(), arm_compute::test::validation::info, offset(), and SimpleTensor< T >::shape().

◆ bounding_box_transform() [4/4]

SimpleTensor<uint16_t> arm_compute::test::validation::reference::bounding_box_transform ( const SimpleTensor< uint16_t > &  boxes,
const SimpleTensor< uint8_t > &  deltas,
const BoundingBoxTransformInfo info 
)

Definition at line 105 of file BoundingBoxTransform.cpp.

106 {
107  SimpleTensor<float> boxes_tmp = convert_from_asymmetric(boxes);
108  SimpleTensor<float> deltas_tmp = convert_from_asymmetric(deltas);
109  SimpleTensor<float> pred_boxes_tmp = bounding_box_transform<float, float>(boxes_tmp, deltas_tmp, info);
110  SimpleTensor<uint16_t> pred_boxes = convert_to_asymmetric<uint16_t>(pred_boxes_tmp, boxes.quantization_info());
111  return pred_boxes;
112 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::info, and SimpleTensor< T >::quantization_info().

◆ channel_shuffle() [1/6]

template SimpleTensor<float> arm_compute::test::validation::reference::channel_shuffle ( const SimpleTensor< float > &  src,
int  num_groups 
)

◆ channel_shuffle() [2/6]

template SimpleTensor<half> arm_compute::test::validation::reference::channel_shuffle ( const SimpleTensor< half > &  src,
int  num_groups 
)

◆ channel_shuffle() [3/6]

SimpleTensor< T > channel_shuffle ( const SimpleTensor< T > &  src,
int  num_groups 
)

Definition at line 39 of file ChannelShuffle.cpp.

40 {
41  // Create reference
42  SimpleTensor<T> dst{ src.shape(), src.data_type(), src.num_channels(), src.quantization_info() };
43 
44  const int M = src.shape()[0];
45  const int N = src.shape()[1];
46  const int num_channels = src.shape()[2];
47  const int batches = src.shape()[3];
48  const int MxN = M * N;
49  const int channels_in_group = num_channels / num_groups;
50 
51  const T *src_ref = src.data();
52  T *dst_ref = dst.data();
53 #if defined(_OPENMP)
54  #pragma omp parallel for collapse(2)
55 #endif /* _OPENMP */
56  for(int n = 0; n < batches; ++n)
57  {
58  for(int g = 0; g < num_groups; ++g)
59  {
60  // Gather the group g block (of size channels_in_group * MxN) from output channels
61  // g + 0 * G, g + 1 * G, g + 2 * G, g + G * (K - 1) etc.
62  const T *src_ptr = src_ref + g * channels_in_group * MxN + n * num_channels * MxN;
63  T *dst_ptr = dst_ref + g * MxN + n * num_channels * MxN;
64  for(int i = 0; i < channels_in_group; ++i)
65  {
66  std::copy(src_ptr + i * MxN,
67  src_ptr + (i + 1) * MxN,
68  dst_ptr + i * num_groups * MxN);
69  }
70  }
71  }
72 
73  return dst;
74 }

References batches, copy(), arm_compute::test::validation::dst, arm_compute::test::validation::dst_ref, M, N, arm_compute::test::validation::num_groups, arm_compute::test::validation::src, and arm_compute::test::validation::src_ref.

◆ channel_shuffle() [4/6]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::channel_shuffle ( const SimpleTensor< uint16_t > &  src,
int  num_groups 
)

◆ channel_shuffle() [5/6]

template SimpleTensor<uint32_t> arm_compute::test::validation::reference::channel_shuffle ( const SimpleTensor< uint32_t > &  src,
int  num_groups 
)

◆ channel_shuffle() [6/6]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::channel_shuffle ( const SimpleTensor< uint8_t > &  src,
int  num_groups 
)

◆ col2im() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::col2im ( const SimpleTensor< float > &  src,
const TensorShape dst_shape,
unsigned int  num_groups 
)

◆ col2im() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::col2im ( const SimpleTensor< half > &  src,
const TensorShape dst_shape,
unsigned int  num_groups 
)

◆ col2im() [3/4]

SimpleTensor< T > col2im ( const SimpleTensor< T > &  src,
const TensorShape dst_shape,
unsigned int  num_groups 
)

Definition at line 38 of file Col2Im.cpp.

39 {
40  SimpleTensor<T> dst{ dst_shape, src.data_type(), 1 };
41 
42  // Compute reference
43  const size_t batches = dst_shape.total_size() / (dst_shape.x() * dst_shape.y() * dst_shape.z());
44  const size_t src_width = src.shape().x();
45  const size_t src_height = src.shape().y();
46 
47  if(num_groups == 1)
48  {
49  // Batches are on the 3rd dimension of the input tensor
50 #if defined(_OPENMP)
51  #pragma omp parallel for collapse(3)
52 #endif /* _OPENMP */
53  for(size_t b = 0; b < batches; ++b)
54  {
55  for(size_t x = 0; x < src_width; ++x)
56  {
57  for(size_t y = 0; y < src_height; ++y)
58  {
59  const int dst_idx = y + x * src_height + b * src_height * src_width;
60  dst[dst_idx] = src[coord2index(src.shape(), Coordinates(x, y, b))];
61  }
62  }
63  }
64  }
65  else
66  {
67 #if defined(_OPENMP)
68  #pragma omp parallel for collapse(4)
69 #endif /* _OPENMP */
70  for(size_t b = 0; b < batches; ++b)
71  {
72  for(size_t g = 0; g < num_groups; ++g)
73  {
74  for(size_t x = 0; x < src_width; ++x)
75  {
76  for(size_t y = 0; y < src_height; ++y)
77  {
78  const int dst_idx = y + x * src_height + g * src_height * src_width + b * src_height * src_width * num_groups;
79  dst[dst_idx] = src[coord2index(src.shape(), Coordinates(x, y, g, b))];
80  }
81  }
82  }
83  }
84  }
85  return dst;
86 }

References arm_compute::test::validation::b, batches, arm_compute::test::coord2index(), arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, arm_compute::test::validation::num_groups, arm_compute::test::validation::src, TensorShape::total_size(), Dimensions< T >::x(), Dimensions< T >::y(), and Dimensions< T >::z().

◆ col2im() [4/4]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::col2im ( const SimpleTensor< uint8_t > &  src,
const TensorShape dst_shape,
unsigned int  num_groups 
)

◆ compare() [1/5]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::compare ( ComparisonOperation  op,
const SimpleTensor< float > &  src1,
const SimpleTensor< float > &  src2 
)

◆ compare() [2/5]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::compare ( ComparisonOperation  op,
const SimpleTensor< half > &  src1,
const SimpleTensor< half > &  src2 
)

◆ compare() [3/5]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::compare ( ComparisonOperation  op,
const SimpleTensor< int8_t > &  src1,
const SimpleTensor< int8_t > &  src2 
)

Definition at line 146 of file Comparisons.cpp.

147 {
148  SimpleTensor<uint8_t> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), DataType::U8);
149 
150  Coordinates id_src1{};
151  Coordinates id_src2{};
152  Coordinates id_dst{};
153 
154  if(src1.data_type() == DataType::QASYMM8_SIGNED)
155  {
156  SimpleTensor<float> src1_tmp = convert_from_asymmetric(src1);
157  SimpleTensor<float> src2_tmp = convert_from_asymmetric(src2);
158  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1_tmp, src2_tmp, dst, id_src1, id_src2, id_dst);
159  }
160  else
161  {
162  // DataType::U8
163  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1, src2, dst, id_src1, id_src2, id_dst);
164  }
165  return dst;
166 }

References TensorShape::broadcast_shape(), arm_compute::test::validation::convert_from_asymmetric(), SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, arm_compute::QASYMM8_SIGNED, SimpleTensor< T >::shape(), and arm_compute::U8.

◆ compare() [4/5]

SimpleTensor< uint8_t > compare ( ComparisonOperation  op,
const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2 
)

Definition at line 111 of file Comparisons.cpp.

112 {
113  SimpleTensor<uint8_t> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), DataType::U8);
114 
115  Coordinates id_src1{};
116  Coordinates id_src2{};
117  Coordinates id_dst{};
118  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1, src2, dst, id_src1, id_src2, id_dst);
119  return dst;
120 }

References TensorShape::broadcast_shape(), arm_compute::test::validation::dst, SimpleTensor< T >::shape(), and arm_compute::U8.

◆ compare() [5/5]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::compare ( ComparisonOperation  op,
const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< uint8_t > &  src2 
)

Definition at line 123 of file Comparisons.cpp.

124 {
125  SimpleTensor<uint8_t> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), DataType::U8);
126 
127  Coordinates id_src1{};
128  Coordinates id_src2{};
129  Coordinates id_dst{};
130 
131  if(src1.data_type() == DataType::QASYMM8)
132  {
133  SimpleTensor<float> src1_tmp = convert_from_asymmetric(src1);
134  SimpleTensor<float> src2_tmp = convert_from_asymmetric(src2);
135  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1_tmp, src2_tmp, dst, id_src1, id_src2, id_dst);
136  }
137  else
138  {
139  // DataType::U8
140  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(op, src1, src2, dst, id_src1, id_src2, id_dst);
141  }
142  return dst;
143 }

References TensorShape::broadcast_shape(), arm_compute::test::validation::convert_from_asymmetric(), SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, arm_compute::QASYMM8, SimpleTensor< T >::shape(), and arm_compute::U8.

◆ compute_all_anchors() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::compute_all_anchors ( const SimpleTensor< float > &  anchors,
const ComputeAnchorsInfo info 
)

◆ compute_all_anchors() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::compute_all_anchors ( const SimpleTensor< half > &  anchors,
const ComputeAnchorsInfo info 
)

◆ compute_all_anchors() [3/4]

SimpleTensor<int16_t> arm_compute::test::validation::reference::compute_all_anchors ( const SimpleTensor< int16_t > &  anchors,
const ComputeAnchorsInfo info 
)

Definition at line 81 of file ComputeAllAnchors.cpp.

82 {
83  SimpleTensor<float> anchors_tmp = convert_from_symmetric(anchors);
84  SimpleTensor<float> all_anchors_tmp = compute_all_anchors(anchors_tmp, info);
85  SimpleTensor<int16_t> all_anchors = convert_to_symmetric<int16_t>(all_anchors_tmp, anchors.quantization_info());
86  return all_anchors;
87 }

References compute_all_anchors(), arm_compute::test::validation::convert_from_symmetric(), arm_compute::test::validation::info, and SimpleTensor< T >::quantization_info().

◆ compute_all_anchors() [4/4]

SimpleTensor< T > compute_all_anchors ( const SimpleTensor< T > &  anchors,
const ComputeAnchorsInfo info 
)

Definition at line 40 of file ComputeAllAnchors.cpp.

41 {
42  const int num_anchors = anchors.shape()[1];
43  const auto width = int(info.feat_width());
44  const auto height = int(info.feat_height());
45  const float stride = 1. / info.spatial_scale();
46 
47  SimpleTensor<T> all_anchors(TensorShape(4, width * height * num_anchors), anchors.data_type());
48  const T *anchors_ptr = anchors.data();
49  T *all_anchors_ptr = all_anchors.data();
50 
51  // Iterate over the input grid and anchors
52 #if defined(_OPENMP)
53  #pragma omp parallel for schedule(dynamic, 1) collapse(3)
54 #endif /* _OPENMP */
55  for(int y = 0; y < height; y++)
56  {
57  for(int x = 0; x < width; x++)
58  {
59  for(int a = 0; a < num_anchors; a++)
60  {
61  const T shift_x = T(x) * T(stride);
62  const T shift_y = T(y) * T(stride);
63  const size_t anchor_id = a + x * num_anchors + y * width * num_anchors;
64  // x1
65  all_anchors_ptr[anchor_id * 4] = anchors_ptr[4 * a] + shift_x;
66  // y1
67  all_anchors_ptr[anchor_id * 4 + 1] = anchors_ptr[4 * a + 1] + shift_y;
68  // x2
69  all_anchors_ptr[anchor_id * 4 + 2] = anchors_ptr[4 * a + 2] + shift_x;
70  // y2
71  all_anchors_ptr[anchor_id * 4 + 3] = anchors_ptr[4 * a + 3] + shift_y;
72  }
73  }
74  }
75  return all_anchors;
76 }

References SimpleTensor< T >::data(), SimpleTensor< T >::data_type(), arm_compute::test::validation::info, and SimpleTensor< T >::shape().

Referenced by compute_all_anchors().

◆ compute_min_max()

void arm_compute::test::validation::reference::compute_min_max ( const SimpleTensor< T > &  src,
T &  min,
T &  max 
)

Definition at line 35 of file MinMaxLocation.cpp.

36 {
37  // Set min and max to first pixel
38  min = src[0];
39  max = src[0];
40 
41  ARM_COMPUTE_ERROR_ON(src.num_elements() == 0);
42 
43  // Look for min and max values
44  for(int i = 1; i < src.num_elements(); ++i)
45  {
46  if(src[i] < min)
47  {
48  min = src[i];
49  }
50  if(src[i] > max)
51  {
52  max = src[i];
53  }
54  }
55 }

References ARM_COMPUTE_ERROR_ON, and arm_compute::test::validation::src.

◆ compute_reduction_operation()

SimpleTensor<OT> arm_compute::test::validation::reference::compute_reduction_operation ( const SimpleTensor< T > &  src,
const TensorShape dst_shape,
unsigned int  axis,
ReductionOperation  op,
DataType  output_type,
RoundingPolicy  policy 
)

Definition at line 184 of file ReductionOperation.cpp.

186 {
187  // Create reference
188  const bool is_arg_min_max = (op == ReductionOperation::ARG_IDX_MIN || op == ReductionOperation::ARG_IDX_MAX);
189  SimpleTensor<OT> dst{ dst_shape, output_type, 1, src.quantization_info() };
190  const unsigned int src_width = src.shape().x();
191  const unsigned int src_height = src.shape().y();
192  const unsigned int src_depth = src.shape().z();
193  const unsigned int src_batch = src.shape()[3];
194  const int reduce_elems = src.shape()[axis];
195 
196  switch(axis)
197  {
198  case 0:
199  {
200  const unsigned int upper_dims = src.shape().total_size_upper(1);
201  for(unsigned int du = 0; du < upper_dims; ++du)
202  {
203  const T *src_row_ptr = src.data() + du * reduce_elems;
204  dst[du] = is_arg_min_max ?
205  reduce_operation_arg_min_max<T, OT>(src_row_ptr, reduce_elems, op, 1) :
206  reduce_operation<T, OT>(src_row_ptr, reduce_elems, op, 1, policy);
207  }
208  }
209  break;
210  case 1:
211  {
212  const unsigned int upper_dims = src.shape().total_size_upper(2);
213  for(unsigned int du = 0; du < upper_dims; ++du)
214  {
215  for(unsigned int x = 0; x < src_width; ++x)
216  {
217  const int in_offset = du * src_height * src_width + x;
218  const int out_offset = du * src_width + x;
219  const T *src_row_ptr = src.data() + in_offset;
220  dst[out_offset] = is_arg_min_max ?
221  reduce_operation_arg_min_max<T, OT>(src_row_ptr, reduce_elems, op, src_width) :
222  reduce_operation<T, OT>(src_row_ptr, reduce_elems, op, src_width, policy);
223  }
224  }
225  }
226  break;
227  case 2:
228  {
229  const unsigned int upper_dims = src.shape().total_size_upper(3);
230  for(unsigned int du = 0; du < upper_dims; ++du)
231  {
232  for(unsigned int x = 0; x < src_width; ++x)
233  {
234  for(unsigned int y = 0; y < src_height; ++y)
235  {
236  const int in_offset = du * src_depth * src_height * src_width + y * src_width + x;
237  const int out_offset = du * src_width * src_height + y * src_width + x;
238  const T *src_row_ptr = src.data() + in_offset;
239  dst[out_offset] = is_arg_min_max ?
240  reduce_operation_arg_min_max<T, OT>(src_row_ptr, reduce_elems, op, src_width * src_height) :
241  reduce_operation<T, OT>(src_row_ptr, reduce_elems, op, src_width * src_height, policy);
242  }
243  }
244  }
245  }
246  break;
247  case 3:
248  {
249  const unsigned int upper_dims = src.shape().total_size_upper(4);
250  for(unsigned int du = 0; du < upper_dims; ++du)
251  {
252  for(unsigned int z = 0; z < src_depth; ++z)
253  {
254  for(unsigned int y = 0; y < src_height; ++y)
255  {
256  for(unsigned int x = 0; x < src_width; ++x)
257  {
258  const int in_offset = du * src_batch * src_depth * src_height * src_width + z * src_width * src_height + y * src_width + x;
259  const int out_offset = du * src_depth * src_height * src_width + z * src_width * src_height + y * src_width + x;
260  const T *src_row_ptr = src.data() + in_offset;
261  dst[out_offset] = is_arg_min_max ?
262  reduce_operation_arg_min_max<T, OT>(src_row_ptr, reduce_elems, op, src_width * src_height * src_depth) :
263  reduce_operation<T, OT>(src_row_ptr, reduce_elems, op, src_width * src_height * src_depth, policy);
264  }
265  }
266  }
267  }
268  }
269  break;
270  default:
271  ARM_COMPUTE_ERROR("Unsupported reduction axis");
272  }
273 
274  return dst;
275 }

References arm_compute::ARG_IDX_MAX, arm_compute::ARG_IDX_MIN, ARM_COMPUTE_ERROR, arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, and arm_compute::test::validation::src.

◆ concatenate_layer() [1/5]

template SimpleTensor<float> arm_compute::test::validation::reference::concatenate_layer ( std::vector< SimpleTensor< float >> &  srcs,
SimpleTensor< float > &  dst,
unsigned int  axis 
)

◆ concatenate_layer() [2/5]

template SimpleTensor<half> arm_compute::test::validation::reference::concatenate_layer ( std::vector< SimpleTensor< half >> &  srcs,
SimpleTensor< half > &  dst,
unsigned int  axis 
)

◆ concatenate_layer() [3/5]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::concatenate_layer ( std::vector< SimpleTensor< int8_t >> &  srcs,
SimpleTensor< int8_t > &  dst,
unsigned int  axis 
)

◆ concatenate_layer() [4/5]

SimpleTensor< T > concatenate_layer ( std::vector< SimpleTensor< T >> &  srcs,
SimpleTensor< T > &  dst,
unsigned int  axis 
)

Definition at line 116 of file ConcatenateLayer.cpp.

117 {
118  switch(axis)
119  {
120  case Window::DimX:
121  {
122  return widthconcatenate_layer(srcs, dst);
123  }
124  case Window::DimY:
125  {
126  for(auto &t : srcs)
127  {
128  t = reference::permute<T>(t, PermutationVector(1U, 0U));
129  }
130  dst = reference::permute<T>(dst, PermutationVector(1U, 0U));
131  return reference::permute<T>(widthconcatenate_layer(srcs, dst), PermutationVector(1U, 0U));
132  }
133  case Window::DimZ:
134  {
135  for(auto &t : srcs)
136  {
137  t = reference::permute<T>(t, PermutationVector(2U, 1U, 0U));
138  }
139  dst = reference::permute<T>(dst, PermutationVector(2U, 1U, 0U));
140  return reference::permute<T>(widthconcatenate_layer(srcs, dst), PermutationVector(2U, 1U, 0U));
141  }
142  case 3:
143  {
144  for(auto &t : srcs)
145  {
146  t = reference::permute<T>(t, PermutationVector(3U, 2U, 1U, 0U));
147  }
148  dst = reference::permute<T>(dst, PermutationVector(3U, 2U, 1U, 0U));
149  auto ret = reference::permute<T>(widthconcatenate_layer(srcs, dst), PermutationVector(3U, 2U, 1U, 0U));
150  return ret;
151  }
152  default:
153  {
154  ARM_COMPUTE_ERROR("Not supported");
155  return dst;
156  }
157  }
158 }

References ARM_COMPUTE_ERROR, Window::DimX, Window::DimY, Window::DimZ, arm_compute::test::validation::dst, tf_frozen_model_extractor::t, and arm_compute::utils::cast::U.

◆ concatenate_layer() [5/5]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::concatenate_layer ( std::vector< SimpleTensor< uint8_t >> &  srcs,
SimpleTensor< uint8_t > &  dst,
unsigned int  axis 
)

◆ conv2d_dft() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::conv2d_dft ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  w,
const PadStrideInfo conv_info 
)

◆ conv2d_dft() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::conv2d_dft ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  w,
const PadStrideInfo conv_info 
)

◆ conv2d_dft() [3/3]

SimpleTensor< T > conv2d_dft ( const SimpleTensor< T > &  src,
const SimpleTensor< T > &  w,
const PadStrideInfo conv_info 
)

Performs and DFT based convolution on a real input.

Parameters
[in]srcSource tensor.
[in]wWeights tensor.
[in]conv_infoConvolution related metadata.
Returns
The output tensor.

Definition at line 396 of file DFT.cpp.

397 {
398  // Pad input to full padding
399  const PaddingList padding_in = { { 0, w.shape()[0] - 1 }, { 0, w.shape()[1] - 1 } };
400  auto padded_src = pad_layer(src, padding_in);
401 
402  // Flip weights
403  std::vector<uint32_t> axis_v = { 0, 1 };
404  SimpleTensor<int32_t> axis{ TensorShape(2U), DataType::S32 };
405  std::copy(axis_v.begin(), axis_v.begin() + axis.shape().x(), axis.data());
406  auto flipped_w = reverse(w, axis, /* use_inverted_axis */ false);
407 
408  // Pad weights to have the same size as input
409  const PaddingList paddings_w = { { 0, src.shape()[0] - 1 }, { 0, src.shape()[1] - 1 } };
410  auto padded_w = pad_layer(flipped_w, paddings_w);
411 
412  // Transform input and weights to frequency domain
413  auto Fsrc = rdft_2d(padded_src);
414  auto Fw = rdft_2d(padded_w);
415 
416  // Perform dot product
417  auto Fdst = complex_mul_and_reduce(Fsrc, Fw);
418 
419  // Transform output back to frequency domain
420  auto conv_res = ridft_2d(Fdst);
421 
422  // Slice output
423  const int start_left = w.shape().x() - conv_info.pad_left() - 1;
424  const int start_top = w.shape().y() - conv_info.pad_top() - 1;
425  const int end_right = conv_res.shape().x() - (w.shape().x() - conv_info.pad_right() - 1);
426  const int end_botton = conv_res.shape().y() - (w.shape().y() - conv_info.pad_bottom() - 1);
427  return slice(conv_res, Coordinates(start_left, start_top), Coordinates(end_right, end_botton));
428 }

References arm_compute::test::validation::conv_info, copy(), pad_layer(), rdft_2d(), reverse(), ridft_2d(), arm_compute::S32, slice(), arm_compute::test::validation::src, arm_compute::utils::cast::U, and arm_compute::test::validation::w.

◆ conv3d()

SimpleTensor< T > conv3d ( const SimpleTensor< T > &  src,
const SimpleTensor< T > &  weights,
const SimpleTensor< TB > &  bias,
SimpleTensor< T > &  dst,
const Conv3dInfo conv3d_info 
)

Definition at line 193 of file Conv3D.cpp.

194 {
195  // Compute reference
196  const unsigned int batch_size = src.shape()[batch_dim];
197  const unsigned int dst_width = dst.shape()[width_dim];
198  const unsigned int dst_height = dst.shape()[height_dim];
199  const unsigned int dst_depth = dst.shape()[depth_dim];
200  const unsigned int src_channels = src.shape()[channel_dim];
201  const unsigned int weights_out_ch = weights.shape()[weights_CHout_dim];
202  const unsigned int dst_channels = dst.shape()[channel_dim];
203  const size_t pad_left = conv3d_info.padding.left;
204  const size_t pad_top = conv3d_info.padding.top;
205  const size_t pad_front = conv3d_info.padding.front;
206  const size_t stride_x = conv3d_info.stride.x();
207  const size_t stride_y = conv3d_info.stride.y();
208  const size_t stride_z = conv3d_info.stride.z();
209 
210  const TensorShape dst_shape = arm_compute::misc::shape_calculator::compute_conv3d_shape(src.shape(), weights.shape(), conv3d_info);
211 
212  ARM_COMPUTE_UNUSED(src_channels, weights_out_ch, dst_channels, dst_shape, weights_CHin_dim);
213  // Number of batches of source and destination tensors must match.
214  ARM_COMPUTE_ERROR_ON(src.shape()[batch_dim] != dst.shape()[batch_dim]);
215  // Input channels in the source and weights must match.
216  ARM_COMPUTE_ERROR_ON(src_channels != weights.shape()[weights_CHin_dim]);
217  // Weight channels in the destination and weights must match.
218  ARM_COMPUTE_ERROR_ON(weights_out_ch != dst_channels);
219  // Bias must match the number of destination channels.
220  ARM_COMPUTE_ERROR_ON(bias.shape()[0] != dst_channels);
221  // Compare given dst tensor shape with expected shape.
222  ARM_COMPUTE_ERROR_ON(dst.shape() != dst_shape);
223 
224  for(unsigned int batch = 0; batch < batch_size; ++batch)
225  {
226  for(unsigned int z_out = 0; z_out < dst_depth; ++z_out)
227  {
228  const int z_start = (z_out * stride_z) - pad_front;
229  for(unsigned int y_out = 0; y_out < dst_height; ++y_out)
230  {
231  const int y_start = (y_out * stride_y) - pad_top;
232  for(unsigned int x_out = 0; x_out < dst_width; ++x_out)
233  {
234  const int x_start = (x_out * stride_x) - pad_left;
235  for(unsigned int ch_out = 0; ch_out < dst_channels; ++ch_out)
236  {
237  T *out_ptr = dst.data();
238 
239  const int out_offset = coord2index(dst.shape(), Coordinates{ ch_out, x_out, y_out, z_out, batch });
240  out_ptr[out_offset] = calculate_conv3d<T, TB, TACC>(src, weights, bias, conv3d_info.dilation, batch, z_start, y_start, x_start, ch_out, dst.quantization_info().uniform());
241  }
242  }
243  }
244  }
245  }
246  return dst;
247 }

References ARM_COMPUTE_ERROR_ON, ARM_COMPUTE_UNUSED, batch_dim, bias, channel_dim, arm_compute::misc::shape_calculator::compute_conv3d_shape(), arm_compute::test::coord2index(), depth_dim, Conv3dInfo::dilation, arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, Padding3D::front, height_dim, Padding3D::left, Conv3dInfo::padding, SimpleTensor< T >::shape(), arm_compute::test::validation::src, Conv3dInfo::stride, Padding3D::top, weights_CHin_dim, weights_CHout_dim, width_dim, Size3D::x(), Size3D::y(), and Size3D::z().

◆ conv3d< float, float, float >()

template SimpleTensor<float> arm_compute::test::validation::reference::conv3d< float, float, float > ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  weights,
const SimpleTensor< float > &  bias,
SimpleTensor< float > &  dst,
const Conv3dInfo conv3d_info 
)

◆ conv3d< half, half, float >()

template SimpleTensor<half> arm_compute::test::validation::reference::conv3d< half, half, float > ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  weights,
const SimpleTensor< half > &  bias,
SimpleTensor< half > &  dst,
const Conv3dInfo conv3d_info 
)

◆ conv3d< int8_t, int32_t, int32_t >()

template SimpleTensor<int8_t> arm_compute::test::validation::reference::conv3d< int8_t, int32_t, int32_t > ( const SimpleTensor< int8_t > &  src,
const SimpleTensor< int8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
SimpleTensor< int8_t > &  dst,
const Conv3dInfo conv3d_info 
)

◆ conv3d< uint8_t, int32_t, int32_t >()

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::conv3d< uint8_t, int32_t, int32_t > ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
SimpleTensor< uint8_t > &  dst,
const Conv3dInfo conv3d_info 
)

◆ convert_fully_connected_weights() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::convert_fully_connected_weights ( const SimpleTensor< float > &  src,
const TensorShape original_input_shape,
const DataLayout  training_data_layout 
)

◆ convert_fully_connected_weights() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::convert_fully_connected_weights ( const SimpleTensor< half > &  src,
const TensorShape original_input_shape,
const DataLayout  training_data_layout 
)

◆ convert_fully_connected_weights() [3/4]

SimpleTensor< T > convert_fully_connected_weights ( const SimpleTensor< T > &  src,
const TensorShape original_input_shape,
const DataLayout  training_data_layout 
)

Definition at line 35 of file ConvertFullyConnectedWeights.cpp.

36 {
37  SimpleTensor<T> dst(src.shape(), src.data_type());
38 
39  const DataLayout original_input_data_layout = (training_data_layout == DataLayout::NCHW) ? DataLayout::NHWC : DataLayout::NCHW;
40 
41  const int width_idx = get_data_layout_dimension_index(original_input_data_layout, DataLayoutDimension::WIDTH);
42  const int height_idx = get_data_layout_dimension_index(original_input_data_layout, DataLayoutDimension::HEIGHT);
43  const int channel_idx = get_data_layout_dimension_index(original_input_data_layout, DataLayoutDimension::CHANNEL);
44 
45  const bool is_nchw_to_nhwc = training_data_layout == DataLayout::NCHW;
46  const unsigned int num_elems_per_input_plane = original_input_shape[width_idx] * original_input_shape[height_idx];
47  const unsigned int num_channels = original_input_shape[channel_idx];
48  const unsigned int factor_1 = is_nchw_to_nhwc ? num_elems_per_input_plane : num_channels;
49  const unsigned int factor_2 = is_nchw_to_nhwc ? num_channels : num_elems_per_input_plane;
50 
51  const uint32_t num_elements = src.num_elements();
52 #if defined(_OPENMP)
53  #pragma omp parallel for
54 #endif /* _OPENMP */
55  for(uint32_t i = 0; i < num_elements; ++i)
56  {
57  const Coordinates coords_in = index2coords(src.shape(), i);
58  const Coordinates coords_out(coords_in.x(), coords_in.y() % factor_1 * factor_2 + coords_in.y() / factor_1);
59 
60  dst[coords2index(dst.shape(), coords_out)] = src[i];
61  }
62 
63  return dst;
64 }

References arm_compute::CHANNEL, arm_compute::cpu::channel_idx, arm_compute::coords2index(), arm_compute::test::validation::dst, arm_compute::get_data_layout_dimension_index(), arm_compute::HEIGHT, arm_compute::cpu::height_idx, arm_compute::index2coords(), arm_compute::NCHW, arm_compute::NHWC, arm_compute::test::validation::src, arm_compute::WIDTH, arm_compute::cpu::width_idx, Dimensions< T >::x(), and Dimensions< T >::y().

◆ convert_fully_connected_weights() [4/4]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::convert_fully_connected_weights ( const SimpleTensor< uint8_t > &  src,
const TensorShape original_input_shape,
const DataLayout  training_data_layout 
)

◆ convolution_layer() [1/6]

template SimpleTensor<float> arm_compute::test::validation::reference::convolution_layer ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  weights,
const SimpleTensor< float > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
const Size2D dilation,
unsigned int  num_groups,
QuantizationInfo  out_quant_info 
)

◆ convolution_layer() [2/6]

template SimpleTensor<half> arm_compute::test::validation::reference::convolution_layer ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  weights,
const SimpleTensor< half > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
const Size2D dilation,
unsigned int  num_groups,
QuantizationInfo  out_quant_info 
)

◆ convolution_layer() [3/6]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::convolution_layer ( const SimpleTensor< int8_t > &  src,
const SimpleTensor< int8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
const Size2D dilation,
unsigned int  num_groups,
QuantizationInfo  out_quant_info 
)

◆ convolution_layer() [4/6]

SimpleTensor< T > convolution_layer ( const SimpleTensor< T > &  src,
const SimpleTensor< TW > &  weights,
const SimpleTensor< TB > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
const Size2D dilation,
unsigned int  num_groups,
QuantizationInfo  out_quant_info 
)

Definition at line 111 of file ConvolutionLayer.cpp.

113 {
114  // if no explicit quantization has been set you the same as src
115  if(out_quant_info == QuantizationInfo())
116  {
117  out_quant_info = src.quantization_info();
118  }
119  // Create reference
120  SimpleTensor<T> dst{ output_shape, src.data_type(), 1, out_quant_info };
121 
122  return convolution_layer_nchw(src, weights, bias, dst, info, dilation, num_groups);
123 }

References bias, convolution_layer_nchw(), arm_compute::test::validation::dst, arm_compute::test::validation::info, arm_compute::test::validation::num_groups, arm_compute::test::validation::output_shape, and arm_compute::test::validation::src.

Referenced by deconvolution_layer(), and arm_compute::test::validation::TEST_CASE().

◆ convolution_layer() [5/6]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::convolution_layer ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< int8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
const Size2D dilation,
unsigned int  num_groups,
QuantizationInfo  out_quant_info 
)

◆ convolution_layer() [6/6]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::convolution_layer ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
const Size2D dilation,
unsigned int  num_groups,
QuantizationInfo  out_quant_info 
)

◆ convolution_layer_nchw()

SimpleTensor<T> arm_compute::test::validation::reference::convolution_layer_nchw ( const SimpleTensor< T > &  src,
const SimpleTensor< TW > &  weights,
const SimpleTensor< TB > &  bias,
SimpleTensor< T > &  dst,
const PadStrideInfo info,
const Size2D dilation,
unsigned int  num_groups 
)

Definition at line 45 of file ConvolutionLayer.cpp.

47 {
48  ARM_COMPUTE_ERROR_ON((src.shape()[2] / num_groups) != weights.shape()[2]);
49 
50  // Compute reference
51  const int width_in = src.shape().x();
52  const int height_in = src.shape().y();
53  const int depth_in = src.shape().z();
54  const int width_out = dst.shape().x();
55  const int height_out = dst.shape().y();
56  const int depth_out = dst.shape().z();
57  const int width_weights = weights.shape().x();
58  const int height_weights = weights.shape().y();
59  const int depth_weights = weights.shape().z();
60  const int pad_left = info.pad_left();
61  const int pad_top = info.pad_top();
62  const int stride_xi = info.stride().first;
63  const int stride_yi = info.stride().second;
64 
65  auto output_wh = scaled_dimensions(width_in, height_in, width_weights, height_weights, info, dilation);
66 
67  const int start_xi = (dilation.x() * (width_weights - 1) + 1) / 2 - pad_left;
68  const int start_yi = (dilation.y() * (height_weights - 1) + 1) / 2 - pad_top;
69  const int end_xi = output_wh.first * stride_xi;
70  const int end_yi = output_wh.second * stride_yi;
71  const int num_batches = src.shape().total_size() / (width_in * height_in * depth_in);
72 
73 #if defined(_OPENMP) && !( defined(__arm__) && defined(__ANDROID__))
74  #pragma omp parallel for collapse(5)
75 #endif /* _OPENMP */
76  for(int r = 0; r < num_batches; ++r)
77  {
78  for(int yi = start_yi; yi < start_yi + end_yi; yi += stride_yi)
79  {
80  for(int xi = start_xi; xi < start_xi + end_xi; xi += stride_xi)
81  {
82  for(int group = 0; group < static_cast<int>(num_groups); ++group)
83  {
84  for(int ofm = 0; ofm < static_cast<int>(depth_out / num_groups); ++ofm)
85  {
86  // Compute input and output offsets
87  const int offset_in = r * width_in * height_in * depth_in + (group * (depth_in / num_groups) * width_in * height_in);
88  const int xo = (xi - start_xi) / stride_xi;
89  const int yo = (yi - start_yi) / stride_yi;
90  const int offset_out = xo + yo * width_out + ((ofm + group * (depth_out / num_groups)) * width_out * height_out) + (r * width_out * height_out * depth_out);
91  const int offset_w = (ofm + group * (depth_out / num_groups)) * width_weights * height_weights * depth_weights;
92  const int offset_b = (ofm + group * (depth_out / num_groups));
93 
94  ARM_COMPUTE_ASSERT(xo < width_out);
95  ARM_COMPUTE_ASSERT(yo < height_out);
96 
97  // Compute 3D convolution
99  offset_in, offset_w, offset_b, offset_out,
100  xi, yi,
101  width_in, height_in, (depth_in / num_groups),
102  width_weights, height_weights, dilation.x(), dilation.y(), ofm);
103  }
104  }
105  }
106  }
107  }
108  return dst;
109 }

References ARM_COMPUTE_ASSERT, ARM_COMPUTE_ERROR_ON, bias, arm_compute::test::convolution_3d::detail::convolution3d(), arm_compute::test::validation::dst, arm_compute::test::validation::info, arm_compute::test::validation::num_groups, arm_compute::test::validation::output_wh, arm_compute::scaled_dimensions(), SimpleTensor< T >::shape(), arm_compute::test::validation::src, Size2D::x(), and Size2D::y().

Referenced by convolution_layer().

◆ copy() [1/9]

template SimpleTensor<float> arm_compute::test::validation::reference::copy ( const SimpleTensor< float > &  src,
const TensorShape output_shape 
)

◆ copy() [2/9]

template SimpleTensor<half> arm_compute::test::validation::reference::copy ( const SimpleTensor< half > &  src,
const TensorShape output_shape 
)

◆ copy() [3/9]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::copy ( const SimpleTensor< int16_t > &  src,
const TensorShape output_shape 
)

◆ copy() [4/9]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::copy ( const SimpleTensor< int32_t > &  src,
const TensorShape output_shape 
)

◆ copy() [5/9]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::copy ( const SimpleTensor< int8_t > &  src,
const TensorShape output_shape 
)

◆ copy() [6/9]

◆ copy() [7/9]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::copy ( const SimpleTensor< uint16_t > &  src,
const TensorShape output_shape 
)

◆ copy() [8/9]

template SimpleTensor<uint32_t> arm_compute::test::validation::reference::copy ( const SimpleTensor< uint32_t > &  src,
const TensorShape output_shape 
)

◆ copy() [9/9]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::copy ( const SimpleTensor< uint8_t > &  src,
const TensorShape output_shape 
)

◆ crop_and_resize() [1/8]

template SimpleTensor<float> arm_compute::test::validation::reference::crop_and_resize ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  boxes,
SimpleTensor< int32_t >  box_ind,
Coordinates2D  crop_size,
InterpolationPolicy  method,
float  extrapolation_value 
)

◆ crop_and_resize() [2/8]

template SimpleTensor<float> arm_compute::test::validation::reference::crop_and_resize ( const SimpleTensor< half > &  src,
const SimpleTensor< float > &  boxes,
SimpleTensor< int32_t >  box_ind,
Coordinates2D  crop_size,
InterpolationPolicy  method,
float  extrapolation_value 
)

◆ crop_and_resize() [3/8]

template SimpleTensor<float> arm_compute::test::validation::reference::crop_and_resize ( const SimpleTensor< int16_t > &  src,
const SimpleTensor< float > &  boxes,
SimpleTensor< int32_t >  box_ind,
Coordinates2D  crop_size,
InterpolationPolicy  method,
float  extrapolation_value 
)

◆ crop_and_resize() [4/8]

template SimpleTensor<float> arm_compute::test::validation::reference::crop_and_resize ( const SimpleTensor< int32_t > &  src,
const SimpleTensor< float > &  boxes,
SimpleTensor< int32_t >  box_ind,
Coordinates2D  crop_size,
InterpolationPolicy  method,
float  extrapolation_value 
)

◆ crop_and_resize() [5/8]

SimpleTensor< float > crop_and_resize ( const SimpleTensor< T > &  src,
const SimpleTensor< float > &  boxes,
SimpleTensor< int32_t >  box_ind,
Coordinates2D  crop_size,
InterpolationPolicy  method,
float  extrapolation_value 
)

Definition at line 160 of file CropResize.cpp.

162 {
163  ARM_COMPUTE_ERROR_ON(src.shape().num_dimensions() > 4);
164  ARM_COMPUTE_ERROR_ON(src.data_layout() != DataLayout::NHWC);
165 
166  const TensorShape out_shape(src.shape()[0], crop_size.x, crop_size.y, boxes.shape()[1]);
167  SimpleTensor<float> out{ out_shape, DataType::F32, 1, QuantizationInfo(), DataLayout::NHWC };
168 
169  const TensorShape scaled_image_shape(src.shape()[0], crop_size.x, crop_size.y);
170 
171  for(uint32_t i = 0; i < boxes.shape()[1]; ++i)
172  {
173  Coordinates start = Coordinates(std::floor((*reinterpret_cast<const float *>(boxes(Coordinates(1, i)))) * (src.shape()[1] - 1) + 0.5f),
174  std::floor((*reinterpret_cast<const float *>(boxes(Coordinates(0, i)))) * (src.shape()[2] - 1) + 0.5f));
175  Coordinates end = Coordinates(std::floor((*reinterpret_cast<const float *>(boxes(Coordinates(3, i)))) * (src.shape()[1] - 1) + 0.5f),
176  std::floor((*reinterpret_cast<const float *>(boxes(Coordinates(2, i)))) * (src.shape()[2] - 1) + 0.5f));
177  SimpleTensor<float> cropped = crop_image(src, start, end, box_ind[i], extrapolation_value);
178  SimpleTensor<float> scaled = scale_image(cropped, scaled_image_shape, method, extrapolation_value);
179  std::copy_n(reinterpret_cast<float *>(scaled.data()), scaled.num_elements(), reinterpret_cast<float *>(out(Coordinates(0, 0, 0, i))));
180  }
181  return out;
182 }

References ARM_COMPUTE_ERROR_ON, SimpleTensor< T >::data(), arm_compute::mlgo::parser::end(), arm_compute::F32, arm_compute::NHWC, SimpleTensor< T >::num_elements(), SimpleTensor< T >::shape(), arm_compute::test::validation::src, Coordinates2D::x, and Coordinates2D::y.

◆ crop_and_resize() [6/8]

template SimpleTensor<float> arm_compute::test::validation::reference::crop_and_resize ( const SimpleTensor< uint16_t > &  src,
const SimpleTensor< float > &  boxes,
SimpleTensor< int32_t >  box_ind,
Coordinates2D  crop_size,
InterpolationPolicy  method,
float  extrapolation_value 
)

◆ crop_and_resize() [7/8]

template SimpleTensor<float> arm_compute::test::validation::reference::crop_and_resize ( const SimpleTensor< uint32_t > &  src,
const SimpleTensor< float > &  boxes,
SimpleTensor< int32_t >  box_ind,
Coordinates2D  crop_size,
InterpolationPolicy  method,
float  extrapolation_value 
)

◆ crop_and_resize() [8/8]

template SimpleTensor<float> arm_compute::test::validation::reference::crop_and_resize ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< float > &  boxes,
SimpleTensor< int32_t >  box_ind,
Coordinates2D  crop_size,
InterpolationPolicy  method,
float  extrapolation_value 
)

◆ deconvolution_layer() [1/6]

template SimpleTensor<float> arm_compute::test::validation::reference::deconvolution_layer ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  weights,
const SimpleTensor< float > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
QuantizationInfo  out_quant_info 
)

◆ deconvolution_layer() [2/6]

template SimpleTensor<half> arm_compute::test::validation::reference::deconvolution_layer ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  weights,
const SimpleTensor< half > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
QuantizationInfo  out_quant_info 
)

◆ deconvolution_layer() [3/6]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::deconvolution_layer ( const SimpleTensor< int8_t > &  src,
const SimpleTensor< int8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
QuantizationInfo  out_quant_info 
)

◆ deconvolution_layer() [4/6]

SimpleTensor< T > deconvolution_layer ( const SimpleTensor< T > &  src,
const SimpleTensor< TW > &  weights,
const SimpleTensor< TB > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
QuantizationInfo  out_qinfo = QuantizationInfo() 
)

Deconvolution reference implementation.

src Input tensor. 3 lower dimensions represent a single input, and an optional 4th dimension for batch of inputs. Data types supported: QASYMM8/QASYMM8_SIGNED/F32/F16. weights The 4d weights with dimensions [width, height, OFM, IFM]. Data type supported: Same as input, also could be QSYMM8_PER_CHANNEL if input is QASYMM8/QASYMM8_SIGNED. bias Optional, ignored if NULL. The biases have one dimension. Data type supported: Same as input, except for input of QASYMM8/QASYMM8_SIGNED types where biases should be of S32 type output_shape Output tensor shape. The output has the same number of dimensions as the input. info Contains padding and policies to be used in the deconvolution, this is decribed in PadStrideInfo. a The number of zeros added to right and top edges of the input.

Definition at line 37 of file DeconvolutionLayer.cpp.

39 {
40  // Create reference
41  const unsigned int pad_left = info.pad_left();
42  const unsigned int pad_right = info.pad_right();
43  const unsigned int pad_top = info.pad_top();
44  const unsigned int pad_bottom = info.pad_bottom();
45  const int stride_x = info.stride().first;
46  const int stride_y = info.stride().second;
47  const int weights_width = weights.shape().x();
48  const int weights_height = weights.shape().y();
49  const int weights_upper_dims = weights.shape().total_size() / (weights_width * weights_height);
50 
51  ARM_COMPUTE_ERROR_ON(pad_left > (weights.shape().x() - 1));
52  ARM_COMPUTE_ERROR_ON(pad_right > (weights.shape().x() - 1));
53  ARM_COMPUTE_ERROR_ON(pad_top > (weights.shape().y() - 1));
54  ARM_COMPUTE_ERROR_ON(pad_bottom > (weights.shape().y() - 1));
55 
56  // Find the upsampled dimensions
57  unsigned int out_x = (src.shape().x() - 1) * stride_x + 1;
58  unsigned int out_y = (src.shape().y() - 1) * stride_y + 1;
59 
60  // Find the padding needed for the convolution with stride 1 in order to match output shape
61  unsigned int deconv_pad_x = output_shape.x() - (out_x - weights_width + 1);
62  unsigned int deconv_pad_y = output_shape.y() - (out_y - weights_height + 1);
63  out_x += deconv_pad_x;
64  out_y += deconv_pad_y;
65 
66  unsigned int deconv_pad_left = pad_right > pad_left ? pad_right - pad_left : 0;
67  unsigned int deconv_pad_right = pad_left > pad_right ? pad_left - pad_right : 0;
68  deconv_pad_x -= deconv_pad_left + deconv_pad_right;
69  ARM_COMPUTE_ERROR_ON((deconv_pad_x % 2) != 0);
70  deconv_pad_left += deconv_pad_x / 2;
71  deconv_pad_right += deconv_pad_x / 2;
72 
73  unsigned int deconv_pad_top = pad_bottom > pad_top ? pad_bottom - pad_top : 0;
74  unsigned int deconv_pad_bottom = pad_top > pad_bottom ? pad_top - pad_bottom : 0;
75  deconv_pad_y -= deconv_pad_top + deconv_pad_bottom;
76  ARM_COMPUTE_ERROR_ON((deconv_pad_y % 2) != 0);
77  deconv_pad_top += deconv_pad_y / 2;
78  deconv_pad_bottom += deconv_pad_y / 2;
79 
80  TensorShape scaled_shape = src.shape();
81  scaled_shape.set(0, out_x);
82  scaled_shape.set(1, out_y);
83  SimpleTensor<T> scaled{ scaled_shape, src.data_type(), 1, src.quantization_info() };
84 
85  const int width_in = src.shape().x();
86  const int height_in = src.shape().y();
87  const int width_scaled = scaled.shape().x();
88  const int height_scaled = scaled.shape().y();
89  const int num_2d_slices = src.shape().total_size() / (width_in * height_in);
90 
91  if(src.data_type() == DataType::QASYMM8 || src.data_type() == DataType::QASYMM8_SIGNED)
92  {
93  const auto quantized_zero = static_cast<T>(src.quantization_info().uniform().offset);
94  std::fill_n(scaled.data(), scaled.num_elements(), quantized_zero);
95  }
96  else
97  {
98  std::fill_n(scaled.data(), scaled.num_elements(), T(0));
99  }
100 
101  // Flip weights by 180 degrees
102  SimpleTensor<TW> weights_flipped{ weights.shape(), weights.data_type(), 1, weights.quantization_info(), weights.data_layout() };
103 #if defined(_OPENMP)
104  #pragma omp parallel for
105 #endif /* _OPENMP */
106  for(int ud = 0; ud < weights_upper_dims; ++ud)
107  {
108  const int offset = ud * weights_width * weights_height;
109  for(int y = 0; y < weights_height; ++y)
110  {
111  for(int x = 0; x < weights_width; ++x)
112  {
113  weights_flipped[offset + (weights_height - 1 - y) * weights_width + (weights_width - 1 - x)] = weights[offset + y * weights_width + x];
114  }
115  }
116  }
117 #if defined(_OPENMP)
118  #pragma omp parallel for
119 #endif /* _OPENMP */
120  for(int slice = 0; slice < num_2d_slices; ++slice)
121  {
122  const int offset_slice_in = slice * width_in * height_in;
123  const int offset_slice_out = slice * width_scaled * height_scaled;
124  const int start_x = deconv_pad_left;
125  const int start_y = deconv_pad_top;
126  const int end_x = width_scaled - deconv_pad_right;
127  const int end_y = height_scaled - deconv_pad_bottom;
128 
129  for(int yi = start_y, in_y = 0; yi < end_y; yi += stride_y, in_y++)
130  {
131  for(int xi = start_x, in_x = 0; xi < end_x; xi += stride_x, in_x++)
132  {
133  const T *in = src.data() + offset_slice_in + in_y * width_in + in_x;
134  T *out = scaled.data() + offset_slice_out + xi + yi * width_scaled;
135  *out = *in;
136  }
137  }
138  }
139 
140  const PadStrideInfo conv_info(1, 1, 0, 0, 0, 0, DimensionRoundingType::CEIL);
141  return convolution_layer(scaled, weights_flipped, bias, output_shape, conv_info, Size2D(1U, 1U), 1, out_qinfo);
142 }

References ARM_COMPUTE_ERROR_ON, bias, arm_compute::CEIL, arm_compute::test::validation::conv_info, convolution_layer(), SimpleTensor< T >::data_layout(), SimpleTensor< T >::data_type(), arm_compute::test::validation::info, offset(), arm_compute::test::validation::output_shape, arm_compute::QASYMM8, arm_compute::QASYMM8_SIGNED, SimpleTensor< T >::quantization_info(), TensorShape::set(), SimpleTensor< T >::shape(), slice(), arm_compute::test::validation::src, arm_compute::utils::cast::U, Dimensions< T >::x(), and Dimensions< T >::y().

◆ deconvolution_layer() [5/6]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::deconvolution_layer ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< int8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
QuantizationInfo  out_quant_info 
)

◆ deconvolution_layer() [6/6]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::deconvolution_layer ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
const TensorShape output_shape,
const PadStrideInfo info,
QuantizationInfo  out_quant_info 
)

◆ depth_convert() [1/12]

template SimpleTensor<bfloat16> arm_compute::test::validation::reference::depth_convert ( const SimpleTensor< bfloat16 > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [2/12]

template SimpleTensor< bfloat16 > depth_convert ( const SimpleTensor< float > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [3/12]

template SimpleTensor< float > depth_convert ( const SimpleTensor< half > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [4/12]

template SimpleTensor< float > depth_convert ( const SimpleTensor< int16_t > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [5/12]

template SimpleTensor< float > depth_convert ( const SimpleTensor< int32_t > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [6/12]

template SimpleTensor< float > depth_convert ( const SimpleTensor< int64_t > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [7/12]

template SimpleTensor< float > depth_convert ( const SimpleTensor< int8_t > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [8/12]

SimpleTensor< T2 > depth_convert ( const SimpleTensor< T1 > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

Definition at line 42 of file DepthConvertLayer.cpp.

43 {
44  SimpleTensor<T2> result(src.shape(), dt_out);
45 
46  // Up-casting
48  {
49 #if defined(_OPENMP)
50  #pragma omp parallel for
51 #endif /* _OPENMP */
52  for(int i = 0; i < src.num_elements(); ++i)
53  {
54  result[i] = src[i] << shift;
55  }
56  }
57  // Down-casting
58  else
59  {
60 #if defined(_OPENMP)
61  #pragma omp parallel for
62 #endif /* _OPENMP */
63  for(int i = 0; i < src.num_elements(); ++i)
64  {
65  T1 val = src[i] >> shift;
66  result[i] = (policy == ConvertPolicy::SATURATE) ? utils::cast::saturate_cast<T2>(val) : static_cast<T2>(val);
67  }
68  }
69  return result;
70 }

References arm_compute::element_size_from_data_type(), arm_compute::SATURATE, and arm_compute::test::validation::src.

◆ depth_convert() [9/12]

template SimpleTensor< float > depth_convert ( const SimpleTensor< uint16_t > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [10/12]

template SimpleTensor< float > depth_convert ( const SimpleTensor< uint32_t > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [11/12]

template SimpleTensor< float > depth_convert ( const SimpleTensor< uint64_t > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_convert() [12/12]

template SimpleTensor< float > depth_convert ( const SimpleTensor< uint8_t > &  src,
DataType  dt_out,
ConvertPolicy  policy,
uint32_t  shift 
)

◆ depth_to_space() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::depth_to_space ( const SimpleTensor< float > &  src,
const TensorShape dst_shape,
int32_t  block_shape 
)

◆ depth_to_space() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::depth_to_space ( const SimpleTensor< half > &  src,
const TensorShape dst_shape,
int32_t  block_shape 
)

◆ depth_to_space() [3/3]

SimpleTensor< T > depth_to_space ( const SimpleTensor< T > &  src,
const TensorShape dst_shape,
int32_t  block_shape 
)

Definition at line 38 of file DepthToSpaceLayer.cpp.

39 {
40  ARM_COMPUTE_ERROR_ON(block_shape <= 0);
41  SimpleTensor<T> result(dst_shape, src.data_type());
42 
43  const auto width_in = static_cast<int>(src.shape()[0]);
44  const auto height_in = static_cast<int>(src.shape()[1]);
45  const auto channel_in = static_cast<int>(src.shape()[2]);
46  const auto batch_in = static_cast<int>(src.shape()[3]);
47  const int r = channel_in / (block_shape * block_shape);
48 #if defined(_OPENMP)
49  #pragma omp parallel for collapse(4)
50 #endif /* _OPENMP */
51  for(int b = 0; b < batch_in; ++b)
52  {
53  for(int z = 0; z < channel_in; ++z)
54  {
55  for(int y = 0; y < height_in; ++y)
56  {
57  for(int x = 0; x < width_in; ++x)
58  {
59  const int out_x = (block_shape * x + (z / r) % block_shape);
60  const int out_y = (block_shape * y + (z / r) / block_shape);
61  const int out_pos = out_x + dst_shape[0] * out_y + (z % r) * dst_shape[0] * dst_shape[1] + b * dst_shape[0] * dst_shape[1] * dst_shape[2];
62  const int in_pos = x + width_in * y + z * width_in * height_in + b * width_in * height_in * channel_in;
63  result[out_pos] = src[in_pos];
64  }
65  }
66  }
67  }
68 
69  return result;
70 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::b, arm_compute::test::validation::dst_shape, and arm_compute::test::validation::src.

◆ depthconcatenate_layer() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::depthconcatenate_layer ( const std::vector< SimpleTensor< float >> &  srcs,
SimpleTensor< float > &  dst 
)

◆ depthconcatenate_layer() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::depthconcatenate_layer ( const std::vector< SimpleTensor< half >> &  srcs,
SimpleTensor< half > &  dst 
)

◆ depthconcatenate_layer() [3/4]

SimpleTensor< T > depthconcatenate_layer ( const std::vector< SimpleTensor< T >> &  srcs,
SimpleTensor< T > &  dst 
)

Definition at line 37 of file DepthConcatenateLayer.cpp.

38 {
39  // Create reference
40  std::vector<TensorShape> shapes;
41  shapes.reserve(srcs.size());
42  for(const auto &src : srcs)
43  {
44  shapes.emplace_back(src.shape());
45  }
46 
47  // Compute reference
48  int depth_offset = 0;
49  const int width_out = dst.shape().x();
50  const int height_out = dst.shape().y();
51  const int depth_out = dst.shape().z();
52  const int out_stride_z = width_out * height_out;
53  const int batches = dst.shape().total_size_upper(3);
54  auto have_different_quantization_info = [&](const SimpleTensor<T> &tensor)
55  {
56  return tensor.quantization_info() != dst.quantization_info();
57  };
58 
59  if(srcs[0].data_type() == DataType::QASYMM8 && std::any_of(srcs.cbegin(), srcs.cend(), have_different_quantization_info))
60  {
61 #if defined(_OPENMP)
62  #pragma omp parallel for
63 #endif /* _OPENMP */
64  for(int b = 0; b < batches; ++b)
65  {
66  // input tensors can have smaller width and height than the output, so for each output's slice we need to requantize 0 (as this is the value
67  // used in NEFillBorderKernel by NEDepthConcatenateLayer) using the corresponding quantization info for that particular slice/input tensor.
68  int slice = 0;
69  for(const auto &src : srcs)
70  {
71  auto ptr_slice = static_cast<T *>(dst(Coordinates(0, 0, slice, b)));
72  const auto num_elems_in_slice((dst.num_elements() / depth_out) * src.shape().z());
73  const UniformQuantizationInfo iq_info = src.quantization_info().uniform();
74  const UniformQuantizationInfo oq_info = dst.quantization_info().uniform();
75 
76  std::transform(ptr_slice, ptr_slice + num_elems_in_slice, ptr_slice, [&](T)
77  {
78  return quantize_qasymm8(dequantize_qasymm8(0, iq_info), oq_info);
79  });
80  slice += src.shape().z();
81  }
82  }
83  }
84  else
85  {
86  std::fill_n(dst.data(), dst.num_elements(), 0);
87  }
88 
89  for(const auto &src : srcs)
90  {
91  ARM_COMPUTE_ERROR_ON(depth_offset >= depth_out);
92  ARM_COMPUTE_ERROR_ON(batches != static_cast<int>(src.shape().total_size_upper(3)));
93 
94  const int width = src.shape().x();
95  const int height = src.shape().y();
96  const int depth = src.shape().z();
97  const int x_diff = (width_out - width) / 2;
98  const int y_diff = (height_out - height) / 2;
99 
100  const T *src_ptr = src.data();
101 
102  for(int b = 0; b < batches; ++b)
103  {
104  const size_t offset_to_first_element = b * out_stride_z * depth_out + depth_offset * out_stride_z + y_diff * width_out + x_diff;
105 
106  for(int d = 0; d < depth; ++d)
107  {
108  for(int r = 0; r < height; ++r)
109  {
110  if(src.data_type() == DataType::QASYMM8 && src.quantization_info() != dst.quantization_info())
111  {
112  const UniformQuantizationInfo iq_info = src.quantization_info().uniform();
113  const UniformQuantizationInfo oq_info = dst.quantization_info().uniform();
114  std::transform(src_ptr, src_ptr + width, dst.data() + offset_to_first_element + d * out_stride_z + r * width_out, [&](T t)
115  {
116  const float dequantized_input = dequantize_qasymm8(t, iq_info);
117  return quantize_qasymm8(dequantized_input, oq_info);
118  });
119  src_ptr += width;
120  }
121  else
122  {
123  std::copy(src_ptr, src_ptr + width, dst.data() + offset_to_first_element + d * out_stride_z + r * width_out);
124  src_ptr += width;
125  }
126  }
127  }
128  }
129 
130  depth_offset += depth;
131  }
132 
133  return dst;
134 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::b, batches, copy(), arm_compute::test::validation::data_type, arm_compute::dequantize_qasymm8(), arm_compute::test::validation::dst, arm_compute::QASYMM8, arm_compute::quantize_qasymm8(), slice(), arm_compute::test::validation::src, tf_frozen_model_extractor::t, and tensor.

◆ depthconcatenate_layer() [4/4]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::depthconcatenate_layer ( const std::vector< SimpleTensor< uint8_t >> &  srcs,
SimpleTensor< uint8_t > &  dst 
)

◆ depthwise_convolution() [1/6]

SimpleTensor<float> arm_compute::test::validation::reference::depthwise_convolution ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  weights,
const SimpleTensor< float > &  biases,
const TensorShape dst_shape,
const PadStrideInfo conv_info,
unsigned int  depth_multiplier,
const Size2D dilation,
const QuantizationInfo out_quant_info 
)

Definition at line 238 of file DepthwiseConvolutionLayer.cpp.

240 {
241  return depthwise_convolution_fp(src, weights, biases, dst_shape, conv_info, depth_multiplier, dilation, out_quant_info);
242 }

References arm_compute::test::validation::conv_info, arm_compute::test::validation::dst_shape, and arm_compute::test::validation::src.

Referenced by arm_compute::test::validation::TEST_CASE().

◆ depthwise_convolution() [2/6]

SimpleTensor<half> arm_compute::test::validation::reference::depthwise_convolution ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  weights,
const SimpleTensor< half > &  biases,
const TensorShape dst_shape,
const PadStrideInfo conv_info,
unsigned int  depth_multiplier,
const Size2D dilation,
const QuantizationInfo out_quant_info 
)

Definition at line 245 of file DepthwiseConvolutionLayer.cpp.

247 {
248  return depthwise_convolution_fp(src, weights, biases, dst_shape, conv_info, depth_multiplier, dilation, out_quant_info);
249 }

References arm_compute::test::validation::conv_info, arm_compute::test::validation::dst_shape, and arm_compute::test::validation::src.

◆ depthwise_convolution() [3/6]

SimpleTensor<int8_t> arm_compute::test::validation::reference::depthwise_convolution ( const SimpleTensor< int8_t > &  src,
const SimpleTensor< int8_t > &  weights,
const SimpleTensor< int32_t > &  biases,
const TensorShape dst_shape,
const PadStrideInfo conv_info,
unsigned int  depth_multiplier,
const Size2D dilation,
const QuantizationInfo out_quant_info 
)

Definition at line 266 of file DepthwiseConvolutionLayer.cpp.

268 {
269  return depthwise_convolution_quantized<int8_t, int8_t, int32_t>(src, weights, biases, dst_shape, conv_info, depth_multiplier, dilation, out_quant_info);
270 }

References arm_compute::test::validation::conv_info, arm_compute::test::validation::dst_shape, and arm_compute::test::validation::src.

◆ depthwise_convolution() [4/6]

SimpleTensor<T> arm_compute::test::validation::reference::depthwise_convolution ( const SimpleTensor< T > &  src,
const SimpleTensor< TW > &  weights,
const SimpleTensor< TB > &  biases,
const TensorShape dst_shape,
const PadStrideInfo conv_info,
unsigned int  depth_multiplier,
const Size2D dilation = Size2D(1U, 1U),
const QuantizationInfo out_quant_info = QuantizationInfo(0.0f, 0) 
)

◆ depthwise_convolution() [5/6]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::depthwise_convolution ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< int8_t > &  weights,
const SimpleTensor< int32_t > &  biases,
const TensorShape dst_shape,
const PadStrideInfo conv_info,
unsigned int  depth_multiplier,
const Size2D dilation,
const QuantizationInfo out_quant_info 
)

Definition at line 259 of file DepthwiseConvolutionLayer.cpp.

261 {
262  return depthwise_convolution_quantized<uint8_t, int8_t, int32_t>(src, weights, biases, dst_shape, conv_info, depth_multiplier, dilation, out_quant_info);
263 }

References arm_compute::test::validation::conv_info, arm_compute::test::validation::dst_shape, and arm_compute::test::validation::src.

◆ depthwise_convolution() [6/6]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::depthwise_convolution ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint8_t > &  weights,
const SimpleTensor< int32_t > &  biases,
const TensorShape dst_shape,
const PadStrideInfo conv_info,
unsigned int  depth_multiplier,
const Size2D dilation,
const QuantizationInfo out_quant_info 
)

Definition at line 252 of file DepthwiseConvolutionLayer.cpp.

254 {
255  return depthwise_convolution_quantized<uint8_t, uint8_t, int32_t>(src, weights, biases, dst_shape, conv_info, depth_multiplier, dilation, out_quant_info);
256 }

References arm_compute::test::validation::conv_info, arm_compute::test::validation::dst_shape, and arm_compute::test::validation::src.

◆ depthwise_separable_convolution_layer()

SimpleTensor<T> arm_compute::test::validation::reference::depthwise_separable_convolution_layer ( const SimpleTensor< T > &  src,
const SimpleTensor< T > &  depthwise_weights,
const SimpleTensor< T > &  depthwise_biases,
const TensorShape depthwise_out_shape,
const SimpleTensor< T > &  pointwise_weights,
const SimpleTensor< T > &  pointwise_biases,
const TensorShape dst_shape,
const PadStrideInfo depthwise_conv_info,
const PadStrideInfo pointwise_conv_info 
)

◆ dequantization_layer() [1/5]

template SimpleTensor< float > dequantization_layer ( const SimpleTensor< int16_t > &  src)

◆ dequantization_layer() [2/5]

template SimpleTensor<float> arm_compute::test::validation::reference::dequantization_layer ( const SimpleTensor< int32_t > &  src)

◆ dequantization_layer() [3/5]

template SimpleTensor< float > dequantization_layer ( const SimpleTensor< int8_t > &  src)

◆ dequantization_layer() [4/5]

SimpleTensor< TOut > dequantization_layer ( const SimpleTensor< TIn > &  src)

Definition at line 70 of file DequantizationLayer.cpp.

71 {
72  const DataType src_data_type = src.data_type();
73  const DataType dst_data_type = std::is_same<TOut, float>::value ? DataType::F32 : DataType::F16;
74 
75  SimpleTensor<TOut> dst{ src.shape(), dst_data_type };
76 
77  if(is_data_type_quantized_per_channel(src_data_type))
78  {
79  const int WH = src.shape().x() * src.shape().y();
80  const int C = src.shape().z();
81  const int N = src.shape().total_size() / (WH * C);
82 
83  const std::vector<float> qscales = src.quantization_info().scale();
84 #if defined(_OPENMP)
85  #pragma omp parallel for collapse(2)
86 #endif /* _OPENMP */
87  for(int n = 0; n < N; ++n)
88  {
89  for(int c = 0; c < C; ++c)
90  {
91  const size_t idx = n * C * WH + c * WH;
92  const UniformQuantizationInfo channel_qinfo = { qscales[c], 0 };
93 
94  // Dequantize slice
95  for(int s = 0; s < WH; ++s)
96  {
97  dst[idx + s] = dequantize<TOut>(static_cast<TIn>(src[idx + s]), channel_qinfo, src_data_type);
98  }
99  }
100  }
101  }
102  else
103  {
104  const UniformQuantizationInfo &quantization_info = src.quantization_info().uniform();
105  ARM_COMPUTE_ERROR_ON(quantization_info.offset != 0 && src_data_type == DataType::QSYMM8);
106 #if defined(_OPENMP)
107  #pragma omp parallel for
108 #endif /* _OPENMP */
109  for(int i = 0; i < src.num_elements(); ++i)
110  {
111  dst[i] = static_cast<TOut>(dequantize<TOut>(static_cast<TIn>(src[i]), quantization_info, src_data_type));
112  }
113  }
114 
115  return dst;
116 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::dst, arm_compute::F16, arm_compute::F32, arm_compute::is_data_type_quantized_per_channel(), N, UniformQuantizationInfo::offset, arm_compute::QSYMM8, and arm_compute::test::validation::src.

◆ dequantization_layer() [5/5]

template SimpleTensor< float > dequantization_layer ( const SimpleTensor< uint8_t > &  src)

◆ dft_1d() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::dft_1d ( const SimpleTensor< float > &  src,
FFTDirection  direction 
)

◆ dft_1d() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::dft_1d ( const SimpleTensor< half > &  src,
FFTDirection  direction 
)

◆ dft_1d() [3/3]

SimpleTensor< T > dft_1d ( const SimpleTensor< T > &  src,
FFTDirection  direction 
)

Performs an one dimensional DFT on a complex input.

Parameters
[in]srcSource tensor.
[in]directionDirection of the DFT.
Returns
Complex output of same length as input.

Definition at line 330 of file DFT.cpp.

331 {
332  auto dst = dft_1d_core(src, direction);
333  if(direction == FFTDirection::Inverse)
334  {
335  const T scaling_factor = T(dst.shape()[0]);
336  scale(dst, scaling_factor);
337  }
338  return dst;
339 }

References arm_compute::test::validation::dst, Inverse, scale(), and arm_compute::test::validation::src.

Referenced by arm_compute::test::validation::DATA_TEST_CASE().

◆ dft_2d() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::dft_2d ( const SimpleTensor< float > &  src,
FFTDirection  direction 
)

◆ dft_2d() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::dft_2d ( const SimpleTensor< half > &  src,
FFTDirection  direction 
)

◆ dft_2d() [3/3]

SimpleTensor< T > dft_2d ( const SimpleTensor< T > &  src,
FFTDirection  direction 
)

Performs a two dimensional DFT on a complex input.

Parameters
[in]srcSource tensor.
[in]directionDirection of the DFT.
Returns
Complex output of same length as input.

Definition at line 370 of file DFT.cpp.

371 {
372  ARM_COMPUTE_ERROR_ON(src.num_channels() != 2);
373 
374  if(direction == FFTDirection::Forward)
375  {
376  auto first_pass = dft_1d_core(src, direction);
377  auto transposed = permute(first_pass, PermutationVector(1U, 0U));
378  auto second_pass = dft_1d_core(transposed, direction);
379  return permute(second_pass, PermutationVector(1U, 0U));
380  }
381  else
382  {
383  auto transposed = permute(src, PermutationVector(1U, 0U));
384  auto first_pass = dft_1d_core(transposed, direction);
385  auto transposed_2 = permute(first_pass, PermutationVector(1U, 0U));
386  auto dst = dft_1d_core(transposed_2, direction);
387 
388  const T scaling_factor = T(dst.shape()[0] * dst.shape()[1]);
389  scale(dst, scaling_factor);
390 
391  return dst;
392  }
393 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::dst, Forward, permute(), scale(), arm_compute::test::validation::src, and arm_compute::utils::cast::U.

Referenced by arm_compute::test::validation::DATA_TEST_CASE().

◆ elementwise_unary() [1/6]

template SimpleTensor<float> arm_compute::test::validation::reference::elementwise_unary ( const SimpleTensor< float > &  src,
SimpleTensor< float > &  dst,
ElementWiseUnary  op 
)

◆ elementwise_unary() [2/6]

template SimpleTensor<half> arm_compute::test::validation::reference::elementwise_unary ( const SimpleTensor< half > &  src,
SimpleTensor< half > &  dst,
ElementWiseUnary  op 
)

◆ elementwise_unary() [3/6]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::elementwise_unary ( const SimpleTensor< int32_t > &  src,
SimpleTensor< int32_t > &  dst,
ElementWiseUnary  op 
)

◆ elementwise_unary() [4/6]

SimpleTensor<int8_t> arm_compute::test::validation::reference::elementwise_unary ( const SimpleTensor< int8_t > &  src,
SimpleTensor< int8_t > &  dst,
ElementWiseUnary  op 
)

Definition at line 70 of file ElementwiseUnary.cpp.

71 {
72  if(dst.data_type() == DataType::QASYMM8_SIGNED)
73  {
74  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
75  SimpleTensor<float> dst_tmp(src.shape(), DataType::F32);
76  for(int i = 0; i < src.num_elements(); ++i)
77  {
78  switch(op)
79  {
80  case ElementWiseUnary::RSQRT:
81  if(src_tmp[i] != 0)
82  {
83  dst_tmp[i] = 1.f / std::sqrt(src_tmp[i]);
84  }
85  else
86  {
87  // rsqrt(0) give 'inf' so set to the maximum in int8: 127
88  dst_tmp[i] = (127.0f - dst.quantization_info().uniform().offset) * dst.quantization_info().uniform().scale ;
89  }
90  break;
91 
92  case ElementWiseUnary::LOG:
93  if(src_tmp[i] != 0)
94  {
95  dst_tmp[i] = std::log(src_tmp[i]);
96  }
97  else
98  {
99  dst_tmp[i] = (-128.0f - dst.quantization_info().uniform().offset) * dst.quantization_info().uniform().scale ;
100  }
101  break;
102 
103  default:
104  elementwise_unary(src_tmp, dst_tmp, op);
105  break;
106  }
107  }
108  dst = convert_to_asymmetric<int8_t>(dst_tmp, dst.quantization_info());
109  }
110  else
111  {
112  ARM_COMPUTE_ERROR("Not implemented");
113  }
114  return dst;
115 }

References ARM_COMPUTE_ERROR, arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, elementwise_unary(), arm_compute::F32, arm_compute::LOG, arm_compute::QASYMM8_SIGNED, arm_compute::RSQRT, and arm_compute::test::validation::src.

◆ elementwise_unary() [5/6]

SimpleTensor< T > elementwise_unary ( const SimpleTensor< T > &  src,
SimpleTensor< T > &  dst,
ElementWiseUnary  op 
)

Definition at line 36 of file ElementwiseUnary.cpp.

37 {
38  for(int i = 0; i < src.num_elements(); ++i)
39  {
40  switch(op)
41  {
42  case ElementWiseUnary::RSQRT:
43  dst[i] = 1.f / std::sqrt(src[i]);
44  break;
45  case ElementWiseUnary::EXP:
46  dst[i] = std::exp(src[i]);
47  break;
48  case ElementWiseUnary::NEG:
49  dst[i] = -src[i];
50  break;
51  case ElementWiseUnary::LOG:
52  dst[i] = std::log(src[i]);
53  break;
54  case ElementWiseUnary::ABS:
55  dst[i] = std::abs(src[i]);
56  break;
57  case ElementWiseUnary::SIN:
58  dst[i] = std::sin(src[i]);
59  break;
60  case ElementWiseUnary::ROUND:
62  break;
63  default:
64  ARM_COMPUTE_ERROR("Not implemented");
65  }
66  }
67  return dst;
68 }

References arm_compute::ABS, ARM_COMPUTE_ERROR, arm_compute::test::validation::dst, arm_compute::EXP, arm_compute::LOG, arm_compute::support::cpp11::nearbyint(), arm_compute::NEG, arm_compute::ROUND, arm_compute::RSQRT, arm_compute::SIN, and arm_compute::test::validation::src.

Referenced by elementwise_unary().

◆ elementwise_unary() [6/6]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::elementwise_unary ( const SimpleTensor< uint8_t > &  src,
SimpleTensor< uint8_t > &  dst,
ElementWiseUnary  op 
)

Definition at line 117 of file ElementwiseUnary.cpp.

118 {
119  if(dst.data_type() == DataType::QASYMM8)
120  {
121  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
122  SimpleTensor<float> dst_tmp(src.shape(), DataType::F32);
123  for(int i = 0; i < src.num_elements(); ++i)
124  {
125  switch(op)
126  {
127  case ElementWiseUnary::RSQRT:
128  if(src_tmp[i] != 0)
129  {
130  dst_tmp[i] = 1.f / std::sqrt(src_tmp[i]);
131  }
132  else
133  {
134  // rsqrt(0) give 'inf' so set to the maximum in uint8: 255
135  dst_tmp[i] = (255.0f - dst.quantization_info().uniform().offset)* dst.quantization_info().uniform().scale;
136  }
137  break;
138 
139  case ElementWiseUnary::LOG:
140  if(src_tmp[i] != 0)
141  {
142  dst_tmp[i] = std::log(src_tmp[i]);
143  }
144  else
145  {
146  dst_tmp[i] = -dst.quantization_info().uniform().offset * dst.quantization_info().uniform().scale;
147  }
148  break;
149 
150  default:
151  elementwise_unary(src_tmp, dst_tmp, op);
152  break;
153  }
154  }
155  dst = convert_to_asymmetric<uint8_t>(dst_tmp, dst.quantization_info());
156  }
157  else
158  {
159  ARM_COMPUTE_ERROR("Not implemented");
160  }
161  return dst;
162 }

References ARM_COMPUTE_ERROR, arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, elementwise_unary(), arm_compute::F32, arm_compute::LOG, arm_compute::QASYMM8, arm_compute::RSQRT, and arm_compute::test::validation::src.

◆ erode() [1/2]

SimpleTensor< T > erode ( const SimpleTensor< T > &  src,
BorderMode  border_mode,
constant_border_value 
)

Definition at line 41 of file Erode.cpp.

42 {
43  /*
44  -1 x +1
45  -1 [tl][tc][tr] -1
46  y [ml][xy][mr] y
47  +1 [bl][bc][br] +1
48  -1 x +1
49  erode:
50  dst(x, y) = min[ src(x', y') for x-1<=x'<=x+1, y-1<=y'<=y+1 ] = min({tl, tc, tr, ml, xy, mr, bl, bc, br})
51  */
52  SimpleTensor<T> dst(src.shape(), src.data_type());
53 
54  const uint32_t num_elements = src.num_elements();
55 #if defined(_OPENMP)
56  #pragma omp parallel for
57 #endif /* _OPENMP */
58  for(uint32_t i = 0; i < num_elements; ++i)
59  {
60  Coordinates coord = index2coord(src.shape(), i);
61  const int x = coord.x();
62  const int y = coord.y();
63 
64  std::array<T, 9> neighbours = { { 0 } };
65  for(int row = y - 1, j = 0; row <= y + 1; ++row)
66  {
67  for(int col = x - 1; col <= x + 1; ++col, ++j)
68  {
69  coord.set(0, col);
70  coord.set(1, row);
71  neighbours[j] = tensor_elem_at(src, coord, border_mode, constant_border_value);
72  }
73  }
74 
75  dst[i] = *std::min_element(neighbours.cbegin(), neighbours.cend());
76  }
77 
78  return dst;
79 }

References arm_compute::test::validation::dst, arm_compute::test::index2coord(), Dimensions< T >::set(), arm_compute::test::validation::src, arm_compute::test::validation::tensor_elem_at(), Dimensions< T >::x(), and Dimensions< T >::y().

◆ erode() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::erode ( const SimpleTensor< uint8_t > &  src,
BorderMode  border_mode,
uint8_t  constant_border_value 
)

◆ flatten_layer() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::flatten_layer ( const SimpleTensor< float > &  src,
const TensorShape shape_flatten 
)

◆ flatten_layer() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::flatten_layer ( const SimpleTensor< half > &  src,
const TensorShape shape_flatten 
)

◆ flatten_layer() [3/3]

SimpleTensor< T > flatten_layer ( const SimpleTensor< T > &  src,
const TensorShape shape_flatten 
)

Definition at line 35 of file FlattenLayer.cpp.

36 {
37  SimpleTensor<T> dst(shape_flatten, src.data_type(), 1);
38 
39  // Note: Since the reference implementation does not use padding bytes, we can copy directly the content of the source tensor
40  std::copy(src.data(), src.data() + src.num_elements(), dst.data());
41 
42  return dst;
43 }

References copy(), arm_compute::test::validation::dst, and arm_compute::test::validation::src.

◆ floor_layer() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::floor_layer ( const SimpleTensor< float > &  src)

◆ floor_layer() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::floor_layer ( const SimpleTensor< half > &  src)

◆ floor_layer() [3/3]

SimpleTensor< T > floor_layer ( const SimpleTensor< T > &  src)

Definition at line 39 of file Floor.cpp.

40 {
41  // Create reference
42  SimpleTensor<T> dst{ src.shape(), src.data_type() };
43 
44  // Compute reference
45 #if defined(_OPENMP)
46  #pragma omp parallel for
47 #endif /* _OPENMP */
48  for(int i = 0; i < src.num_elements(); ++i)
49  {
50  dst[i] = std::floor(src[i]);
51  }
52 
53  return dst;
54 }

References arm_compute::test::validation::dst, and arm_compute::test::validation::src.

◆ fully_connected_layer() [1/5]

template SimpleTensor<float> arm_compute::test::validation::reference::fully_connected_layer ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  weights,
const SimpleTensor< float > &  bias,
const TensorShape dst_shape,
QuantizationInfo  out_quant_info 
)

◆ fully_connected_layer() [2/5]

template SimpleTensor<half> arm_compute::test::validation::reference::fully_connected_layer ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  weights,
const SimpleTensor< half > &  bias,
const TensorShape dst_shape,
QuantizationInfo  out_quant_info 
)

◆ fully_connected_layer() [3/5]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::fully_connected_layer ( const SimpleTensor< int8_t > &  src,
const SimpleTensor< int8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
const TensorShape dst_shape,
QuantizationInfo  out_quant_info 
)

◆ fully_connected_layer() [4/5]

SimpleTensor< T > fully_connected_layer ( const SimpleTensor< T > &  src,
const SimpleTensor< T > &  weights,
const SimpleTensor< TB > &  bias,
const TensorShape dst_shape,
QuantizationInfo  out_quant_info 
)

Definition at line 115 of file FullyConnectedLayer.cpp.

116 {
117  // if no explicit quantization has been set you the same as src
118  if(out_quant_info == QuantizationInfo())
119  {
120  out_quant_info = src.quantization_info();
121  }
122 
123  // Create reference
124  SimpleTensor<T> dst{ TensorShape{ dst_shape }, src.data_type(), 1, out_quant_info };
125 
126  // Health checks
127  const int num_batch_dimensions = std::max(0, static_cast<int>(dst_shape.num_dimensions()) - 1);
128  const int num_input_dimensions = src.shape().num_dimensions() - num_batch_dimensions;
129  const unsigned int linear_input_size = src.shape().total_size_lower(num_input_dimensions);
130 
131  ARM_COMPUTE_UNUSED(num_batch_dimensions);
132  ARM_COMPUTE_UNUSED(num_input_dimensions);
133  ARM_COMPUTE_UNUSED(linear_input_size);
134  ARM_COMPUTE_ERROR_ON(weights.shape().x() != linear_input_size);
135  ARM_COMPUTE_ERROR_ON(weights.shape().y() != bias.shape().x());
136  ARM_COMPUTE_ERROR_ON(weights.shape().y() != dst.shape().x());
137 
138  // Compute reference
139  const int cols_weights = weights.shape().x();
140  const int rows_weights = weights.shape().y();
141  const int num_batches = dst_shape.total_size_upper(1);
142 
143  for(int k = 0; k < num_batches; ++k)
144  {
145  const int offset_in = k * cols_weights;
146  const int offset_out = k * rows_weights;
147 
148  vector_matrix_multiply<T>(src,
149  weights,
150  bias,
151  dst,
152  offset_in,
153  offset_out,
154  cols_weights,
155  rows_weights);
156  }
157 
158  return dst;
159 }

References ARM_COMPUTE_ERROR_ON, ARM_COMPUTE_UNUSED, bias, arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, Dimensions< T >::num_dimensions(), SimpleTensor< T >::shape(), arm_compute::test::validation::src, and TensorShape::total_size_upper().

◆ fully_connected_layer() [5/5]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::fully_connected_layer ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint8_t > &  weights,
const SimpleTensor< int32_t > &  bias,
const TensorShape dst_shape,
QuantizationInfo  out_quant_info 
)

◆ fuse_batch_normalization_conv_layer() [1/3]

template void arm_compute::test::validation::reference::fuse_batch_normalization_conv_layer ( const SimpleTensor< float > &  w,
const SimpleTensor< float > &  mean,
const SimpleTensor< float > &  var,
SimpleTensor< float > &  w_fused,
SimpleTensor< float > &  b_fused,
const SimpleTensor< float > &  b,
const SimpleTensor< float > &  beta,
const SimpleTensor< float > &  gamma,
float  epsilon 
)

◆ fuse_batch_normalization_conv_layer() [2/3]

template void arm_compute::test::validation::reference::fuse_batch_normalization_conv_layer ( const SimpleTensor< half > &  w,
const SimpleTensor< half > &  mean,
const SimpleTensor< half > &  var,
SimpleTensor< half > &  w_fused,
SimpleTensor< half > &  b_fused,
const SimpleTensor< half > &  b,
const SimpleTensor< half > &  beta,
const SimpleTensor< half > &  gamma,
float  epsilon 
)

◆ fuse_batch_normalization_conv_layer() [3/3]

void fuse_batch_normalization_conv_layer ( const SimpleTensor< T > &  w,
const SimpleTensor< T > &  mean,
const SimpleTensor< T > &  var,
SimpleTensor< T > &  w_fused,
SimpleTensor< T > &  b_fused,
const SimpleTensor< T > &  b,
const SimpleTensor< T > &  beta,
const SimpleTensor< T > &  gamma,
float  epsilon 
)

Definition at line 71 of file FuseBatchNormalization.cpp.

74 {
75  const auto *w_data = w.data();
76  const auto *b_data = b.data();
77 
78  auto *w_fused_data = w_fused.data();
79  auto *b_fused_data = b_fused.data();
80 
81  const unsigned int width = w.shape()[0];
82  const unsigned int height = w.shape()[1];
83  const unsigned int dim2 = w.shape()[2];
84  const unsigned int dim3 = w.shape()[3];
85 
86  for(unsigned int b = 0; b < dim3; ++b)
87  {
88  const auto mean_val = mean.data()[b];
89  const auto var_val = var.data()[b];
90  const auto beta_val = beta.data()[b];
91  const auto gamma_val = gamma.data()[b];
92 
93  for(unsigned int i = 0; i < width * height * dim2; ++i)
94  {
95  unsigned int index = i + b * width * height * dim2;
96 
97  w_fused_data[index] = (gamma_val * (w_data[index])) / sqrt(var_val + epsilon);
98  }
99 
100  b_fused_data[b] = (b_data[b] - mean_val) / sqrt(var_val + epsilon) * gamma_val + beta_val;
101  }
102 }

References arm_compute::test::validation::b, SimpleTensor< T >::data(), arm_compute::quantization::epsilon, and arm_compute::test::validation::w.

◆ fuse_batch_normalization_dwc_layer() [1/3]

template void arm_compute::test::validation::reference::fuse_batch_normalization_dwc_layer ( const SimpleTensor< float > &  w,
const SimpleTensor< float > &  mean,
const SimpleTensor< float > &  var,
SimpleTensor< float > &  w_fused,
SimpleTensor< float > &  b_fused,
const SimpleTensor< float > &  b,
const SimpleTensor< float > &  beta,
const SimpleTensor< float > &  gamma,
float  epsilon 
)

◆ fuse_batch_normalization_dwc_layer() [2/3]

template void arm_compute::test::validation::reference::fuse_batch_normalization_dwc_layer ( const SimpleTensor< half > &  w,
const SimpleTensor< half > &  mean,
const SimpleTensor< half > &  var,
SimpleTensor< half > &  w_fused,
SimpleTensor< half > &  b_fused,
const SimpleTensor< half > &  b,
const SimpleTensor< half > &  beta,
const SimpleTensor< half > &  gamma,
float  epsilon 
)

◆ fuse_batch_normalization_dwc_layer() [3/3]

void fuse_batch_normalization_dwc_layer ( const SimpleTensor< T > &  w,
const SimpleTensor< T > &  mean,
const SimpleTensor< T > &  var,
SimpleTensor< T > &  w_fused,
SimpleTensor< T > &  b_fused,
const SimpleTensor< T > &  b,
const SimpleTensor< T > &  beta,
const SimpleTensor< T > &  gamma,
float  epsilon 
)

Definition at line 36 of file FuseBatchNormalization.cpp.

38 {
39  const auto *w_data = w.data();
40  const auto *b_data = b.data();
41 
42  auto *w_fused_data = w_fused.data();
43  auto *b_fused_data = b_fused.data();
44 
45  const unsigned int width = w.shape()[0];
46  const unsigned int height = w.shape()[1];
47  const unsigned int dim2 = w.shape()[2];
48 
49 #if defined(_OPENMP)
50  #pragma omp parallel for
51 #endif /* _OPENMP */
52  for(unsigned int b = 0; b < dim2; ++b)
53  {
54  const auto mean_val = mean.data()[b];
55  const auto var_val = var.data()[b];
56  const auto beta_val = beta.data()[b];
57  const auto gamma_val = gamma.data()[b];
58 
59  for(unsigned int i = 0; i < width * height; ++i)
60  {
61  unsigned int index = i + b * width * height;
62 
63  w_fused_data[index] = (gamma_val * (w_data[index])) / sqrt(var_val + epsilon);
64  }
65 
66  b_fused_data[b] = (b_data[b] - mean_val) / sqrt(var_val + epsilon) * gamma_val + beta_val;
67  }
68 }

References arm_compute::test::validation::b, SimpleTensor< T >::data(), arm_compute::quantization::epsilon, and arm_compute::test::validation::w.

◆ gather() [1/5]

template SimpleTensor<float> arm_compute::test::validation::reference::gather ( const SimpleTensor< float > &  src,
const SimpleTensor< uint32_t > &  indices,
uint32_t  actual_axis 
)

◆ gather() [2/5]

template SimpleTensor<half> arm_compute::test::validation::reference::gather ( const SimpleTensor< half > &  src,
const SimpleTensor< uint32_t > &  indices,
uint32_t  actual_axis 
)

◆ gather() [3/5]

SimpleTensor< T > gather ( const SimpleTensor< T > &  src,
const SimpleTensor< uint32_t > &  indices,
uint32_t  actual_axis 
)

Definition at line 40 of file Gather.cpp.

41 {
42  const TensorShape dst_shape = arm_compute::misc::shape_calculator::compute_gather_shape(src.shape(), indices.shape(), actual_axis);
43  SimpleTensor<T> dst(dst_shape, src.data_type());
44 
45  const auto src_ptr = static_cast<const T *>(src.data());
46  const auto indices_ptr = static_cast<const uint32_t *>(indices.data());
47  const auto dst_ptr = static_cast<T *>(dst.data());
48 
49  const uint32_t index_limit = src.shape()[actual_axis];
50 
51  Window win;
52  win.use_tensor_dimensions(dst_shape);
53 
54  execute_window_loop(win, [&](const Coordinates &dst_coords) {
55  const auto dst_addr = coords2index(dst.shape(), dst_coords);
56 
57  // Calculate the coordinates of the index value.
58  Coordinates idx_coords;
59 
60  for(size_t i = 0; i < indices.shape().num_dimensions(); ++i)
61  {
62  idx_coords.set(i, dst_coords[i + actual_axis]);
63  }
64 
65  const auto index = indices_ptr[coords2index(indices.shape(), idx_coords)];
66 
67  if(index < index_limit)
68  {
69  // Calculate the coordinates of the source data.
70  Coordinates src_coords;
71 
72  for(size_t i = 0; i < actual_axis; ++i)
73  {
74  src_coords.set(i, dst_coords[i]);
75  }
76 
77  src_coords.set(actual_axis, index);
78 
79  for(size_t i = actual_axis + 1; i < src.shape().num_dimensions(); ++i)
80  {
81  src_coords.set(i, dst_coords[i + indices.shape().num_dimensions() - 1]);
82  }
83 
84  // Copy the data.
85  const auto src_addr = coords2index(src.shape(), src_coords);
86  dst_ptr[dst_addr] = src_ptr[src_addr];
87  }
88  else
89  {
90  dst_ptr[dst_addr] = 0;
91  }
92  });
93 
94  return dst;
95 }

References arm_compute::misc::shape_calculator::compute_gather_shape(), arm_compute::coords2index(), SimpleTensor< T >::data(), arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, arm_compute::execute_window_loop(), Dimensions< T >::set(), SimpleTensor< T >::shape(), arm_compute::test::validation::src, and Window::use_tensor_dimensions().

◆ gather() [4/5]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::gather ( const SimpleTensor< uint16_t > &  src,
const SimpleTensor< uint32_t > &  indices,
uint32_t  actual_axis 
)

◆ gather() [5/5]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::gather ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint32_t > &  indices,
uint32_t  actual_axis 
)

◆ gemm() [1/4]

template SimpleTensor<bfloat16> arm_compute::test::validation::reference::gemm ( const SimpleTensor< bfloat16 > &  a,
const SimpleTensor< bfloat16 > &  b,
const SimpleTensor< bfloat16 > &  c,
float  alpha,
float  beta 
)

◆ gemm() [2/4]

template SimpleTensor<float> arm_compute::test::validation::reference::gemm ( const SimpleTensor< float > &  a,
const SimpleTensor< float > &  b,
const SimpleTensor< float > &  c,
float  alpha,
float  beta 
)

◆ gemm() [3/4]

template SimpleTensor<half> arm_compute::test::validation::reference::gemm ( const SimpleTensor< half > &  a,
const SimpleTensor< half > &  b,
const SimpleTensor< half > &  c,
float  alpha,
float  beta 
)

◆ gemm() [4/4]

SimpleTensor< T > gemm ( const SimpleTensor< T > &  a,
const SimpleTensor< T > &  b,
const SimpleTensor< T > &  c,
float  alpha,
float  beta 
)

Definition at line 40 of file GEMM.cpp.

41 {
42  // Create reference
43  SimpleTensor<T> dst{c.shape(), c.data_type(), 1};
44 
45  // Compute reference
46  const int M = a.shape().y();
47  const int N = b.shape().x();
48  const int K = a.shape().x();
49  const int D = a.shape().z(); // Number of matrices in a batch
50  const int W = a.shape()[3]; // Number of batched-gemm (Winograd case)
51 
52  const int a_stride_z = K * M;
53  const int a_stride_w = K * M * D;
54 
55  const int b_stride_z =
56  b.shape().num_dimensions() > 2
57  ? N * K
58  : 0; // Do not slide the matrix B along the 3th dimension in case matrix B has less than 3 dimensions
59  int b_stride_w =
60  b.shape().num_dimensions() > 3
61  ? K * N * D
62  : 0; // Do not slide the matrix B along the 4th dimension in case matrix B has less than 4 dimensions
63 
64  // Note: There are 3 gemm types: batched-gemm, multi-gemm, and batched of multi-gemms. The third dimension of tensor b is overloaded when tensor b has exactly 3 dimensions:
65  // it can be either number of batches or multis. Batched-GEMM computation is detected only when the third dimension of "a" and "c" tensors is 1 and the number of dimensions is 4
66  const bool is_batched_gemm = b.shape().num_dimensions() == 3 && a.shape().num_dimensions() == 4 &&
67  c.shape().num_dimensions() == 4 && a.shape()[2] == 1 && c.shape()[2] == 1;
68 
69  // Batched-GEMM
70  if (is_batched_gemm)
71  {
72  b_stride_w = b_stride_z;
73  }
74 
75  const int c_stride_z = N * M;
76  const int c_stride_w = N * M * D;
77 
78 #if defined(_OPENMP) && !(defined(__arm__) && defined(__ANDROID__))
79  #pragma omp parallel for collapse(2)
80 #endif /* _OPENMP */
81  for (int w = 0; w < W; ++w)
82  {
83  for (int depth = 0; depth < D; ++depth)
84  {
85  const int base_addr_a = depth * a_stride_z + w * a_stride_w;
86  const int base_addr_b = depth * b_stride_z + w * b_stride_w;
87  const int base_addr_c = depth * c_stride_z + w * c_stride_w;
88 
89  for (int row = 0; row < M; ++row)
90  {
91  for (int col = 0; col < N; ++col)
92  {
93  T acc(0);
94 
95  for (int k = 0; k < K; ++k)
96  {
97  acc += a[base_addr_a + k + row * K] * b[base_addr_b + col + k * N];
98  }
99 
100  // Finalize the result: alpha * A * B + beta * C
101  dst[base_addr_c + col + row * N] = alpha * acc + beta * c[base_addr_c + col + row * N];
102  }
103  }
104  }
105  }
106 
107  return dst;
108 }

References arm_compute::test::validation::b, SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, K, M, N, SimpleTensor< T >::shape(), and arm_compute::test::validation::w.

Referenced by gemm_accumulate().

◆ gemm_accumulate() [1/3]

template void arm_compute::test::validation::reference::gemm_accumulate ( const SimpleTensor< float > &  a,
const SimpleTensor< float > &  b,
const SimpleTensor< float > &  c,
float  alpha,
float  beta,
SimpleTensor< float > &  dst 
)

◆ gemm_accumulate() [2/3]

template void arm_compute::test::validation::reference::gemm_accumulate ( const SimpleTensor< half > &  a,
const SimpleTensor< half > &  b,
const SimpleTensor< half > &  c,
float  alpha,
float  beta,
SimpleTensor< half > &  dst 
)

◆ gemm_accumulate() [3/3]

void gemm_accumulate ( const SimpleTensor< T > &  a,
const SimpleTensor< T > &  b,
const SimpleTensor< T > &  c,
float  alpha,
float  beta,
SimpleTensor< T > &  dst 
)

Definition at line 185 of file GEMM.cpp.

186 {
187  // Compute reference
188  SimpleTensor<T> dst_gemm = gemm(a, b, c, alpha, beta);
189  reference::arithmetic_operation<T>(reference::ArithmeticOperation::ADD, dst, dst_gemm, dst, ConvertPolicy::SATURATE);
190 }

References ADD, arm_compute::test::validation::b, arm_compute::test::validation::dst, gemm(), and arm_compute::SATURATE.

◆ gemm_interleave_4x4()

SimpleTensor<T> arm_compute::test::validation::reference::gemm_interleave_4x4 ( const SimpleTensor< T > &  in,
SimpleTensor< T > &  out 
)

Definition at line 37 of file GEMMInterleave4x4.h.

38 {
39  const T *mtx_in = reinterpret_cast<const T *>(in.data());
40  T *mtx_ref = reinterpret_cast<T *>(out.data());
41  const int32_t in_rows = in.shape().y();
42  const int32_t in_cols = in.shape().x();
43  const int32_t out_stride = out.shape().x();
44  int32_t y = 0;
45  for(; y <= (in_rows - 4); y += 4)
46  {
47  const T *in_ptr = &mtx_in[y * in_cols];
48 
49  for(int32_t x = 0; x < in_cols; x++)
50  {
51  const T tmp[4] = { in_ptr[x + 0 * in_cols],
52  in_ptr[x + 1 * in_cols],
53  in_ptr[x + 2 * in_cols],
54  in_ptr[x + 3 * in_cols]
55  };
56 
57  T *dst = &mtx_ref[static_cast<size_t>(x * 4.f) + static_cast<size_t>(std::ceil(y / 4.f)) * out_stride];
58  memcpy(dst, tmp, sizeof(T) * 4);
59  }
60  }
61 
62  // Leftover along the Y direction
63  const int32_t leftover_y = in_rows - y;
64 
65  if(leftover_y != 0)
66  {
67  const T *in_ptr = &mtx_in[y * in_cols];
68 
69  for(int32_t x = 0; x < in_cols; x++)
70  {
71  T tmp[4] = { 0, 0, 0, 0 };
72 
73  for(int32_t k = 0; k < leftover_y; k++)
74  {
75  tmp[k] = in_ptr[k * in_cols + x];
76  }
77  T *dst = &mtx_ref[static_cast<size_t>(x * 4.f) + static_cast<size_t>(std::ceil(y / 4.f)) * out_stride];
78  memcpy(dst, tmp, sizeof(T) * 4);
79  }
80  }
81 
82  return out;
83 }

References SimpleTensor< T >::data(), arm_compute::test::validation::dst, and SimpleTensor< T >::shape().

◆ gemm_interleave_blocked() [1/2]

SimpleTensor<T> arm_compute::test::validation::reference::gemm_interleave_blocked ( const SimpleTensor< T > &  in,
SimpleTensor< T > &  out,
int  int_by,
int  block,
bool  transposed 
)

Definition at line 50 of file GEMMInterleaveBlocked.h.

51 {
52  const int M = out.shape().y();
53  const int N = out.shape().x();
54  for(int y = 0; y < M; y++)
55  {
56  T *out_ptr = &out[y * N];
57  for(int x = 0; x < (N / int_by); x += block)
58  {
59  for(int z = 0; z < int_by; z++)
60  {
61  for(int a = 0; (out_ptr <= &out[y * N + (N - 1)]) && a < block; a++)
62  {
63  if(!transposed)
64  *out_ptr++ = safe_read(in, (y * int_by) + z, x + a);
65  else
66  {
67  const T value = safe_read(in, x + a, (y * int_by) + z);
68  *out_ptr++ = value;
69  }
70  }
71  }
72  }
73  }
74  return out;
75 }

References M, N, safe_read(), and SimpleTensor< T >::shape().

◆ gemm_interleave_blocked() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::gemm_interleave_blocked ( const SimpleTensor< uint8_t > &  in,
SimpleTensor< uint8_t > &  out,
int  int_by,
int  block,
bool  transposed 
)

◆ gemm_mixed_precision() [1/2]

template SimpleTensor<half> arm_compute::test::validation::reference::gemm_mixed_precision ( const SimpleTensor< half > &  a,
const SimpleTensor< half > &  b,
const SimpleTensor< half > &  c,
float  alpha,
float  beta 
)

◆ gemm_mixed_precision() [2/2]

SimpleTensor< T > gemm_mixed_precision ( const SimpleTensor< T > &  a,
const SimpleTensor< T > &  b,
const SimpleTensor< T > &  c,
float  alpha,
float  beta 
)

Definition at line 111 of file GEMM.cpp.

113 {
114  // GEMM mixed-precision combines F32 accumulators with F16 multiplications
115  // Create reference
116  SimpleTensor<T> dst{c.shape(), c.data_type(), 1};
117 
118  // Compute reference
119  const int M = a.shape().y();
120  const int N = b.shape().x();
121  const int K = a.shape().x();
122  const int D = a.shape().z(); // Number of matrices in a batch
123  const int W = a.shape()[3]; // Number of batched-gemm (Winograd case)
124 
125  const int a_stride_z = K * M;
126  const int a_stride_w = K * M * D;
127 
128  const int b_stride_z =
129  b.shape().num_dimensions() > 2
130  ? N * K
131  : 0; // Do not slide the matrix B along the 3th dimension in case matrix B has less than 3 dimensions
132  int b_stride_w =
133  b.shape().num_dimensions() > 3
134  ? K * N * D
135  : 0; // Do not slide the matrix B along the 4th dimension in case matrix B has less than 4 dimensions
136 
137  // Note: There are 3 gemm types: batched-gemm, multi-gemm, and batched of multi-gemms. The third dimension of tensor b is overloaded when tensor b has exactly 3 dimensions:
138  // it can be either number of batches or multis. Batched-GEMM computation is detected only when the third dimension of "a" and "c" tensors is 1 and the number of dimensions is 4
139  const bool is_batched_gemm = b.shape().num_dimensions() == 3 && a.shape().num_dimensions() == 4 &&
140  c.shape().num_dimensions() == 4 && a.shape()[2] == 1 && c.shape()[2] == 1;
141 
142  // Batched-GEMM
143  if (is_batched_gemm)
144  {
145  b_stride_w = b_stride_z;
146  }
147 
148  const int c_stride_z = N * M;
149  const int c_stride_w = N * M * D;
150 
151 #if defined(_OPENMP) && !(defined(__arm__) && defined(__ANDROID__))
152  #pragma omp parallel for collapse(2)
153 #endif /* _OPENMP */
154  for (int w = 0; w < W; ++w)
155  {
156  for (int depth = 0; depth < D; ++depth)
157  {
158  const int base_addr_a = depth * a_stride_z + w * a_stride_w;
159  const int base_addr_b = depth * b_stride_z + w * b_stride_w;
160  const int base_addr_c = depth * c_stride_z + w * c_stride_w;
161 
162  for (int row = 0; row < M; ++row)
163  {
164  for (int col = 0; col < N; ++col)
165  {
166  float acc(0);
167 
168  for (int k = 0; k < K; ++k)
169  {
170  acc += static_cast<float>(a[base_addr_a + k + row * K] * b[base_addr_b + col + k * N]);
171  }
172 
173  // Finalize the result: alpha * A * B + beta * C
174  dst[base_addr_c + col + row * N] =
175  static_cast<T>(alpha * acc + beta * c[base_addr_c + col + row * N]);
176  }
177  }
178  }
179  }
180 
181  return dst;
182 }

References arm_compute::test::validation::b, SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, K, M, N, SimpleTensor< T >::shape(), and arm_compute::test::validation::w.

◆ gemm_reshape_lhs_matrix() [1/4]

template SimpleTensor<char> arm_compute::test::validation::reference::gemm_reshape_lhs_matrix ( const SimpleTensor< char > &  in,
const TensorShape output_shape,
const GEMMLHSMatrixInfo lhs_info 
)

◆ gemm_reshape_lhs_matrix() [2/4]

template SimpleTensor<int> arm_compute::test::validation::reference::gemm_reshape_lhs_matrix ( const SimpleTensor< int > &  in,
const TensorShape output_shape,
const GEMMLHSMatrixInfo lhs_info 
)

◆ gemm_reshape_lhs_matrix() [3/4]

template SimpleTensor<short> arm_compute::test::validation::reference::gemm_reshape_lhs_matrix ( const SimpleTensor< short > &  in,
const TensorShape output_shape,
const GEMMLHSMatrixInfo lhs_info 
)

◆ gemm_reshape_lhs_matrix() [4/4]

SimpleTensor< T > gemm_reshape_lhs_matrix ( const SimpleTensor< T > &  in,
const TensorShape output_shape,
const GEMMLHSMatrixInfo lhs_info 
)

Definition at line 43 of file GEMMReshapeLHSMatrix.cpp.

44 {
45  ARM_COMPUTE_ERROR_ON(in.shape().num_dimensions() > 3);
46 
47  SimpleTensor<T> out{ output_shape, in.data_type() };
48 
49  // Initialize the output tensor with zero
50  std::memset(&out[0], 0, out.num_elements() * sizeof(T));
51 
52  const unsigned int K = in.shape()[0];
53  const unsigned int M = in.shape()[1];
54  const unsigned int B = in.shape()[2];
55 
56  const unsigned int num_tiles_x = std::ceil(K / static_cast<float>(lhs_info.k0));
57  const unsigned int num_tiles_y = std::ceil(M / static_cast<float>(lhs_info.m0));
58 
59  const TensorShape tile_dims(lhs_info.k0, lhs_info.m0);
60  const TensorShape tile_dims_transposed(lhs_info.m0, lhs_info.k0);
61 
62  // Simple tensor for the input tile
63  SimpleTensor<T> src_tile{ tile_dims, in.data_type() };
64 
65  // Simple tensor for the input tile
66  SimpleTensor<T> src_tile_transposed{ tile_dims_transposed, in.data_type() };
67 
68  // Simple tensor to use when storing the values
69  SimpleTensor<T> *tile_to_use = lhs_info.transpose ? &src_tile_transposed : &src_tile;
70 
71  const unsigned int offset_output_x = lhs_info.interleave ? tile_to_use->shape()[0] : tile_to_use->shape()[0] * tile_to_use->shape()[1];
72  const unsigned int step_output_x = lhs_info.interleave ? tile_to_use->shape()[0] * lhs_info.v0 : tile_to_use->shape()[0];
73 
74  for(unsigned int z = 0; z < B; ++z)
75  {
76  for(unsigned int y = 0; y < num_tiles_y; ++y)
77  {
78  for(unsigned int x = 0; x < num_tiles_x; ++x)
79  {
80  // Get the tile from the input tensor
81  get_tile<T>(in, src_tile, Coordinates(x * lhs_info.k0, y * lhs_info.m0, z, 0));
82 
83  if(lhs_info.transpose)
84  {
85  // Transpose matrix
86  transpose_matrix<T>(src_tile, src_tile_transposed);
87  }
88 
89  // Store
90  const unsigned int offset_output = (x * lhs_info.k0 * lhs_info.m0 * lhs_info.v0) + ((y % lhs_info.v0) * offset_output_x) + ((y / lhs_info.v0) * out.shape()[0]) + (z * out.shape()[0] * out.shape()[1]);
91 
92  for(unsigned int i = 0; i < tile_to_use->shape()[1]; ++i)
93  {
94  const unsigned int offset_tile = i * tile_to_use->shape()[0];
95 
96  // Copy per row
97  std::copy(&(*tile_to_use)[offset_tile], &(*tile_to_use)[offset_tile + tile_to_use->shape()[0]], &out[offset_output + i * step_output_x]);
98  }
99  }
100  }
101  }
102 
103  return out;
104 }

References ARM_COMPUTE_ERROR_ON, arm_compute::B, copy(), SimpleTensor< T >::data_type(), GEMMLHSMatrixInfo::interleave, K, GEMMLHSMatrixInfo::k0, M, GEMMLHSMatrixInfo::m0, arm_compute::test::validation::output_shape, SimpleTensor< T >::shape(), GEMMLHSMatrixInfo::transpose, and GEMMLHSMatrixInfo::v0.

◆ gemm_reshape_rhs_matrix() [1/4]

template SimpleTensor<char> arm_compute::test::validation::reference::gemm_reshape_rhs_matrix ( const SimpleTensor< char > &  in,
const TensorShape output_shape,
const GEMMRHSMatrixInfo rhs_info 
)

◆ gemm_reshape_rhs_matrix() [2/4]

template SimpleTensor<int> arm_compute::test::validation::reference::gemm_reshape_rhs_matrix ( const SimpleTensor< int > &  in,
const TensorShape output_shape,
const GEMMRHSMatrixInfo rhs_info 
)

◆ gemm_reshape_rhs_matrix() [3/4]

template SimpleTensor<short> arm_compute::test::validation::reference::gemm_reshape_rhs_matrix ( const SimpleTensor< short > &  in,
const TensorShape output_shape,
const GEMMRHSMatrixInfo rhs_info 
)

◆ gemm_reshape_rhs_matrix() [4/4]

SimpleTensor< T > gemm_reshape_rhs_matrix ( const SimpleTensor< T > &  in,
const TensorShape output_shape,
const GEMMRHSMatrixInfo rhs_info 
)

Definition at line 43 of file GEMMReshapeRHSMatrix.cpp.

44 {
45  ARM_COMPUTE_ERROR_ON(in.shape().num_dimensions() > 3);
46 
47  SimpleTensor<T> out{ output_shape, in.data_type() };
48 
49  // Initialize the output tensor with zero
50  std::memset(&out[0], 0, out.num_elements() * sizeof(T));
51 
52  const unsigned int N = in.shape()[0];
53  const unsigned int K = in.shape()[1];
54  const unsigned int B = in.shape()[2];
55 
56  const unsigned int num_tiles_x = std::ceil(N / static_cast<float>(rhs_info.n0));
57  const unsigned int num_tiles_y = std::ceil(K / static_cast<float>(rhs_info.k0));
58 
59  const TensorShape tile_dims(rhs_info.n0, rhs_info.k0);
60  const TensorShape tile_dims_transposed(rhs_info.k0, rhs_info.n0);
61 
62  // Simple tensor for the input tile
63  SimpleTensor<T> src_tile{ tile_dims, in.data_type() };
64 
65  // Simple tensor for the input tile
66  SimpleTensor<T> src_tile_transposed{ tile_dims_transposed, in.data_type() };
67 
68  // Simple tensor to use when storing the values
69  SimpleTensor<T> *tile_to_use = rhs_info.transpose ? &src_tile_transposed : &src_tile;
70 
71  const unsigned int offset_output_x = rhs_info.interleave ? tile_to_use->shape()[0] : tile_to_use->shape()[0] * tile_to_use->shape()[1];
72  const unsigned int step_output_x = rhs_info.interleave ? tile_to_use->shape()[0] * rhs_info.h0 : tile_to_use->shape()[0];
73 #ifdef ARM_COMPUTE_OPENMP
74  #pragma omp parallel for schedule(dynamic, 1) collapse(3)
75 #endif /* _OPENMP */
76  for(unsigned int z = 0; z < B; ++z)
77  {
78  for(unsigned int y = 0; y < num_tiles_y; ++y)
79  {
80  for(unsigned int x = 0; x < num_tiles_x; ++x)
81  {
82  // Get the tile from the input tensor
83  get_tile<T>(in, src_tile, Coordinates(x * rhs_info.n0, y * rhs_info.k0, z, 0));
84 
85  if(rhs_info.transpose)
86  {
87  // Transpose matrix
88  transpose_matrix<T>(src_tile, src_tile_transposed);
89  }
90 
91  // Store
92  const unsigned int offset_output = (y * rhs_info.k0 * rhs_info.n0 * rhs_info.h0) + ((x % rhs_info.h0) * offset_output_x) + ((x / rhs_info.h0) * out.shape()[0]) + (z * out.shape()[0] * out.shape()[1]);
93 
94  for(unsigned int i = 0; i < tile_to_use->shape()[1]; ++i)
95  {
96  const unsigned int offset_tile = i * tile_to_use->shape()[0];
97 
98  // Copy per row
99  std::copy(&(*tile_to_use)[offset_tile], &(*tile_to_use)[offset_tile + tile_to_use->shape()[0]], &out[offset_output + i * step_output_x]);
100  }
101  }
102  }
103  }
104 
105  return out;
106 }

References ARM_COMPUTE_ERROR_ON, arm_compute::B, copy(), SimpleTensor< T >::data_type(), GEMMRHSMatrixInfo::h0, GEMMRHSMatrixInfo::interleave, K, GEMMRHSMatrixInfo::k0, N, GEMMRHSMatrixInfo::n0, arm_compute::test::validation::output_shape, SimpleTensor< T >::shape(), and GEMMRHSMatrixInfo::transpose.

◆ gemm_transpose_1xW()

SimpleTensor<T> arm_compute::test::validation::reference::gemm_transpose_1xW ( const SimpleTensor< T > &  in)

Definition at line 37 of file GEMMTranspose1xW.h.

38 {
39  const int W = 16 / sizeof(T);
40  const TensorShape shape_out(static_cast<size_t>(in.shape().y() * W), static_cast<size_t>(std::ceil(in.shape().x() / static_cast<float>(W))));
41  SimpleTensor<T> out(shape_out, in.data_type());
42  const int32_t in_height = in.shape().y();
43  const int32_t in_width = in.shape().x();
44  const int32_t out_width = out.shape().x();
45  const T *in_base_addr = reinterpret_cast<const T *>(in.data());
46  T *out_base_addr = reinterpret_cast<T *>(out.data());
47  int x = 0;
48  for(; x < in_width; x += W)
49  {
50  for(int y = 0; y < in_height; y++)
51  {
52  const T *in_addr = (in_base_addr + x + y * in_width);
53  T *out_addr = (out_base_addr + y * W + (x / W) * out_width);
54 
55  for(int k = 0; k < W; ++k)
56  {
57  // If the input width is not multiple of W, we fill the reference with 0s
58  if((x + k) >= in_width)
59  {
60  out_addr[k] = T(0);
61  }
62  else
63  {
64  out_addr[k] = in_addr[k];
65  }
66  }
67  }
68  }
69  return out;
70 }

References SimpleTensor< T >::data(), SimpleTensor< T >::data_type(), and SimpleTensor< T >::shape().

◆ gemmlowp()

SimpleTensor< T1 > gemmlowp ( const SimpleTensor< T2 > &  a,
const SimpleTensor< T3 > &  b,
TensorShape  shape_c 
)

Definition at line 243 of file GEMMLowp.cpp.

244 {
245  return gemmlowp_matrix_multiply_core<T1, T2, T3>(a, b, shape_c, 0, 0);
246 }

References arm_compute::test::validation::b.

◆ gemmlowp< int32_t, int8_t, int8_t >()

template SimpleTensor<int32_t> arm_compute::test::validation::reference::gemmlowp< int32_t, int8_t, int8_t > ( const SimpleTensor< int8_t > &  a,
const SimpleTensor< int8_t > &  b,
TensorShape  shape_c 
)

◆ gemmlowp< int32_t, uint8_t, int8_t >()

template SimpleTensor<int32_t> arm_compute::test::validation::reference::gemmlowp< int32_t, uint8_t, int8_t > ( const SimpleTensor< uint8_t > &  a,
const SimpleTensor< int8_t > &  b,
TensorShape  shape_c 
)

◆ gemmlowp< int32_t, uint8_t, uint8_t >()

template SimpleTensor<int32_t> arm_compute::test::validation::reference::gemmlowp< int32_t, uint8_t, uint8_t > ( const SimpleTensor< uint8_t > &  a,
const SimpleTensor< uint8_t > &  b,
TensorShape  shape_c 
)

◆ gemmlowp_matrix_multiply_core() [1/4]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::gemmlowp_matrix_multiply_core ( const SimpleTensor< int8_t > &  a,
const SimpleTensor< int8_t > &  b,
TensorShape  shape_c,
int32_t  a_offset,
int32_t  b_offset 
)

◆ gemmlowp_matrix_multiply_core() [2/4]

SimpleTensor<T1> arm_compute::test::validation::reference::gemmlowp_matrix_multiply_core ( const SimpleTensor< T2 > &  a,
const SimpleTensor< T3 > &  b,
TensorShape  shape_c,
int32_t  a_offset,
int32_t  b_offset 
)

◆ gemmlowp_matrix_multiply_core() [3/4]

SimpleTensor<T_out> arm_compute::test::validation::reference::gemmlowp_matrix_multiply_core ( const SimpleTensor< T_in > &  a,
const SimpleTensor< T_in_1 > &  b,
TensorShape  shape_c,
int32_t  a_offset,
int32_t  b_offset 
)

Definition at line 182 of file GEMMLowp.cpp.

183 {
184  static_assert(std::is_same<typename std::decay<T_out>::type, int32_t>::value, "Only int32_t is allowed for the output");
185 
186  DataType dt = std::is_same<T_out, int32_t>::value ? DataType::S32 : DataType::U32;
187  SimpleTensor<T_out> c(shape_c, dt);
188 
189  const int K = a.shape().x();
190  const int M = a.shape().y();
191  const int N = b.shape().x();
192  const int D = a.shape().z(); // Number of matrices in a batch
193 
194  const int a_stride_z = K * M;
195  // Do not slide the matrix B along the 3rd dimension in case matrix B has less than 3 dimensions
196  const int b_stride_z = b.shape().num_dimensions() > 2 ? N * K : 0;
197  const int c_stride_z = N * M;
198 
199  std::vector<T_out> acc;
200  acc.resize(N);
201 
202  for(int depth = 0; depth < D; ++depth)
203  {
204  const int base_addr_a = depth * a_stride_z;
205  const int base_addr_b = depth * b_stride_z;
206  const int base_addr_c = depth * c_stride_z;
207 
208  for(int i = 0; i < M; ++i)
209  {
210  for(int j = 0; j < N; ++j)
211  {
212  acc[j] = 0;
213  }
214  for(int k = 0; k < K; ++k)
215  {
216  const T_out tmp_a = a_offset + static_cast<T_out>(a[base_addr_a + k + i * K]);
217  for(int j = 0; j < N; ++j)
218  {
219  const T_out tmp_b = b_offset + static_cast<T_out>(b[base_addr_b + j + k * N]);
220  const T_out mult_as_int = tmp_a * tmp_b;
221  acc[j] += mult_as_int;
222  }
223  }
224  for(int j = 0; j < N; ++j)
225  {
226  c[base_addr_c + j + i * N] = acc[j];
227  }
228  }
229  }
230 
231  return c;
232 }

References arm_compute::test::validation::b, dt, K, M, N, arm_compute::S32, SimpleTensor< T >::shape(), type, and arm_compute::U32.

◆ gemmlowp_matrix_multiply_core() [4/4]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::gemmlowp_matrix_multiply_core ( const SimpleTensor< uint8_t > &  a,
const SimpleTensor< uint8_t > &  b,
TensorShape  shape_c,
int32_t  a_offset,
int32_t  b_offset 
)

◆ gemmlowp_matrix_multiply_core_accumulate() [1/4]

template void arm_compute::test::validation::reference::gemmlowp_matrix_multiply_core_accumulate ( const SimpleTensor< int8_t > &  a,
const SimpleTensor< int8_t > &  b,
TensorShape  shape_c,
int32_t  a_offset,
int32_t  b_offset,
SimpleTensor< int32_t > &  dst 
)

◆ gemmlowp_matrix_multiply_core_accumulate() [2/4]

void arm_compute::test::validation::reference::gemmlowp_matrix_multiply_core_accumulate ( const SimpleTensor< T2 > &  a,
const SimpleTensor< T3 > &  b,
TensorShape  shape_c,
int32_t  a_offset,
int32_t  b_offset,
SimpleTensor< T1 > &  dst_ 
)

◆ gemmlowp_matrix_multiply_core_accumulate() [3/4]

void arm_compute::test::validation::reference::gemmlowp_matrix_multiply_core_accumulate ( const SimpleTensor< T_in > &  a,
const SimpleTensor< T_in_1 > &  b,
TensorShape  shape_c,
int32_t  a_offset,
int32_t  b_offset,
SimpleTensor< T_out > &  dst 
)

Definition at line 235 of file GEMMLowp.cpp.

236 {
237  SimpleTensor<T_out> dst_gemm = gemmlowp_matrix_multiply_core<T_out, T_in, T_in_1>(a, b, shape_c, a_offset, b_offset);
238  reference::arithmetic_operation<T_out>(reference::ArithmeticOperation::ADD, dst, dst_gemm, dst, ConvertPolicy::SATURATE);
239 }

References ADD, arm_compute::test::validation::b, arm_compute::test::validation::dst, and arm_compute::SATURATE.

◆ gemmlowp_matrix_multiply_core_accumulate() [4/4]

template void arm_compute::test::validation::reference::gemmlowp_matrix_multiply_core_accumulate ( const SimpleTensor< uint8_t > &  a,
const SimpleTensor< uint8_t > &  b,
TensorShape  shape_c,
int32_t  a_offset,
int32_t  b_offset,
SimpleTensor< int32_t > &  dst 
)

◆ gemmlowp_quantize_down_scale() [1/5]

template SimpleTensor< int8_t > gemmlowp_quantize_down_scale ( const SimpleTensor< int32_t > &  a,
const SimpleTensor< int32_t > &  b,
int32_t  result_offset,
std::vector< int32_t >  result_mult_int,
std::vector< int32_t >  result_shift,
int32_t  min,
int32_t  max 
)

◆ gemmlowp_quantize_down_scale() [2/5]

template SimpleTensor< int8_t > gemmlowp_quantize_down_scale ( const SimpleTensor< int32_t > &  a,
int32_t  result_offset,
std::vector< int32_t >  result_mult_int,
std::vector< int32_t >  result_shift,
int32_t  min,
int32_t  max 
)

◆ gemmlowp_quantize_down_scale() [3/5]

SimpleTensor< TOut > gemmlowp_quantize_down_scale ( const SimpleTensor< TIn > &  in,
const SimpleTensor< TIn > &  bias,
int32_t  result_offset,
std::vector< int32_t >  result_mult_int,
std::vector< int32_t >  result_shift,
int32_t  min,
int32_t  max 
)

Definition at line 260 of file GEMMLowp.cpp.

262 {
263  SimpleTensor<TOut> dst(in.shape(), DataTypeExtractor<TOut>::data_type());
264 
265  quantize_down_scale<TIn, TOut>(&in, &bias, &dst, result_offset, result_mult_int, result_shift, min, max);
266 
267  return dst;
268 }

References bias, arm_compute::test::validation::data_type, arm_compute::test::validation::dst, and SimpleTensor< T >::shape().

◆ gemmlowp_quantize_down_scale() [4/5]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::gemmlowp_quantize_down_scale ( const SimpleTensor< TIn > &  in,
int32_t  result_offset,
std::vector< int32_t >  result_mult_int,
std::vector< int32_t >  result_shift 
)

◆ gemmlowp_quantize_down_scale() [5/5]

SimpleTensor< TOut > gemmlowp_quantize_down_scale ( const SimpleTensor< TIn > &  in,
int32_t  result_offset,
std::vector< int32_t >  result_mult_int,
std::vector< int32_t >  result_shift,
int32_t  min,
int32_t  max 
)

Definition at line 249 of file GEMMLowp.cpp.

251 {
252  SimpleTensor<TOut> dst(in.shape(), DataTypeExtractor<TOut>::data_type());
253 
254  quantize_down_scale<TIn, TOut>(&in, nullptr, &dst, result_offset, result_mult_int, result_shift, min, max);
255 
256  return dst;
257 }

References arm_compute::test::validation::data_type, arm_compute::test::validation::dst, and SimpleTensor< T >::shape().

◆ gemmlowp_quantize_down_scale_by_fixedpoint() [1/4]

template SimpleTensor< int16_t > gemmlowp_quantize_down_scale_by_fixedpoint ( const SimpleTensor< int32_t > &  a,
const SimpleTensor< int32_t > &  b,
std::vector< int32_t >  result_fixedpoint_multiplier,
std::vector< int32_t >  result_shift,
int32_t  result_offset_after_shift,
int32_t  min,
int32_t  max 
)

◆ gemmlowp_quantize_down_scale_by_fixedpoint() [2/4]

template SimpleTensor< int16_t > gemmlowp_quantize_down_scale_by_fixedpoint ( const SimpleTensor< int32_t > &  a,
std::vector< int32_t >  result_fixedpoint_multiplier,
std::vector< int32_t >  result_shift,
int32_t  result_offset_after_shift,
int32_t  min,
int32_t  max 
)

◆ gemmlowp_quantize_down_scale_by_fixedpoint() [3/4]

SimpleTensor< TOut > gemmlowp_quantize_down_scale_by_fixedpoint ( const SimpleTensor< TIn > &  in,
const SimpleTensor< TIn > &  bias,
std::vector< int32_t >  result_fixedpoint_multiplier,
std::vector< int32_t >  result_shift,
int32_t  result_offset_after_shift,
int32_t  min,
int32_t  max 
)

Definition at line 282 of file GEMMLowp.cpp.

284 {
285  SimpleTensor<TOut> dst(in.shape(), DataTypeExtractor<TOut>::data_type());
286 
287  quantize_down_scale_by_fixedpoint<TIn, TOut>(&in, &bias, &dst, result_fixedpoint_multiplier, result_shift, result_offset_after_shift, min, max);
288 
289  return dst;
290 }

References bias, arm_compute::test::validation::data_type, arm_compute::test::validation::dst, and SimpleTensor< T >::shape().

◆ gemmlowp_quantize_down_scale_by_fixedpoint() [4/4]

SimpleTensor< TOut > gemmlowp_quantize_down_scale_by_fixedpoint ( const SimpleTensor< TIn > &  in,
std::vector< int32_t >  result_fixedpoint_multiplier,
std::vector< int32_t >  result_shift,
int32_t  result_offset_after_shift,
int32_t  min,
int32_t  max 
)

Definition at line 271 of file GEMMLowp.cpp.

273 {
274  SimpleTensor<TOut> dst(in.shape(), DataTypeExtractor<TOut>::data_type());
275 
276  quantize_down_scale_by_fixedpoint<TIn, TOut>(&in, nullptr, &dst, result_fixedpoint_multiplier, result_shift, result_offset_after_shift, min, max);
277 
278  return dst;
279 }

References arm_compute::test::validation::data_type, arm_compute::test::validation::dst, and SimpleTensor< T >::shape().

◆ gemmlowp_quantize_down_scale_by_float() [1/4]

template SimpleTensor< int8_t > gemmlowp_quantize_down_scale_by_float ( const SimpleTensor< int32_t > &  a,
const SimpleTensor< int32_t > &  b,
std::vector< float_t >  result_real_multiplier,
int32_t  result_offset,
int32_t  min,
int32_t  max 
)

◆ gemmlowp_quantize_down_scale_by_float() [2/4]

template SimpleTensor< int8_t > gemmlowp_quantize_down_scale_by_float ( const SimpleTensor< int32_t > &  a,
std::vector< float_t >  result_real_multiplier,
int32_t  result_offset,
int32_t  min,
int32_t  max 
)

◆ gemmlowp_quantize_down_scale_by_float() [3/4]

SimpleTensor< TOut > gemmlowp_quantize_down_scale_by_float ( const SimpleTensor< TIn > &  in,
const SimpleTensor< TIn > &  bias,
std::vector< float_t >  result_real_multiplier,
int32_t  result_offset,
int32_t  min,
int32_t  max 
)

Definition at line 293 of file GEMMLowp.cpp.

295 {
296  SimpleTensor<TOut> dst(in.shape(), DataTypeExtractor<TOut>::data_type());
297 
298  quantize_down_scale_by_float<TIn, TOut>(&in, &bias, &dst, result_real_multiplier, result_offset, min, max);
299 
300  return dst;
301 }

References bias, arm_compute::test::validation::data_type, arm_compute::test::validation::dst, and SimpleTensor< T >::shape().

◆ gemmlowp_quantize_down_scale_by_float() [4/4]

SimpleTensor< TOut > gemmlowp_quantize_down_scale_by_float ( const SimpleTensor< TIn > &  in,
std::vector< float_t >  result_real_multiplier,
int32_t  result_offset,
int32_t  min,
int32_t  max 
)

Definition at line 304 of file GEMMLowp.cpp.

306 {
307  SimpleTensor<TOut> dst(in.shape(), DataTypeExtractor<TOut>::data_type());
308 
309  quantize_down_scale_by_float<TIn, TOut>(&in, nullptr, &dst, result_real_multiplier, result_offset, min, max);
310 
311  return dst;
312 }

References arm_compute::test::validation::data_type, arm_compute::test::validation::dst, and SimpleTensor< T >::shape().

◆ im2col() [1/4]

template void arm_compute::test::validation::reference::im2col ( const SimpleTensor< float > &  src,
SimpleTensor< float > &  dst,
const Size2D kernel_dims,
const PadStrideInfo conv_info,
bool  has_bias,
unsigned int  num_groups 
)

◆ im2col() [2/4]

template void arm_compute::test::validation::reference::im2col ( const SimpleTensor< half > &  src,
SimpleTensor< half > &  dst,
const Size2D kernel_dims,
const PadStrideInfo conv_info,
bool  has_bias,
unsigned int  num_groups 
)

◆ im2col() [3/4]

void im2col ( const SimpleTensor< T > &  src,
SimpleTensor< T > &  dst,
const Size2D kernel_dims,
const PadStrideInfo conv_info,
bool  has_bias,
unsigned int  num_groups 
)

Definition at line 144 of file Im2Col.cpp.

145 {
146  switch(src.data_layout())
147  {
148  case DataLayout::NCHW:
149  {
150  im2col_nchw(src, dst, kernel_dims, conv_info, has_bias, num_groups);
151  break;
152  }
153  case DataLayout::NHWC:
154  {
155  im2col_nhwc(src, dst, kernel_dims, conv_info, has_bias);
156  break;
157  }
158  default:
159  {
160  ARM_COMPUTE_ERROR("Not supported.");
161  break;
162  }
163  }
164 }

References ARM_COMPUTE_ERROR, arm_compute::test::validation::conv_info, arm_compute::test::validation::dst, arm_compute::test::validation::has_bias, im2col_nchw(), im2col_nhwc(), arm_compute::NCHW, arm_compute::NHWC, arm_compute::test::validation::num_groups, and arm_compute::test::validation::src.

◆ im2col() [4/4]

template void arm_compute::test::validation::reference::im2col ( const SimpleTensor< uint8_t > &  src,
SimpleTensor< uint8_t > &  dst,
const Size2D kernel_dims,
const PadStrideInfo conv_info,
bool  has_bias,
unsigned int  num_groups 
)

◆ im2col_nchw()

void arm_compute::test::validation::reference::im2col_nchw ( const SimpleTensor< T > &  src,
SimpleTensor< T > &  dst,
const Size2D kernel_dims,
const PadStrideInfo conv_info,
bool  has_bias,
unsigned int  num_groups 
)

Definition at line 39 of file Im2Col.cpp.

40 {
41  ARM_COMPUTE_ERROR_ON(src.data_layout() != DataLayout::NCHW);
42  const int stride_x = conv_info.stride().first;
43  const int stride_y = conv_info.stride().second;
44  const int kernel_width = kernel_dims.width;
45  const int kernel_height = kernel_dims.height;
46  const int pad_x = conv_info.pad().first;
47  const int pad_y = conv_info.pad().second;
48  const int src_width = src.shape().x();
49  const int src_height = src.shape().y();
50  const int src_channels = src.shape().z();
51  const int batches = src.shape().total_size_upper(3);
52  const int dst_height = dst.shape().y();
53  const int pad_val = is_data_type_quantized_asymmetric(src.data_type()) ? src.quantization_info().uniform().offset : 0;
54  int dst_idx = 0;
55 
56  // Compute width and height of the convolved tensors
57  std::pair<unsigned int, unsigned int> convolved_dims = scaled_dimensions(src_width, src_height, kernel_dims.width, kernel_dims.height, conv_info);
58 
59  for(int b = 0; b < batches; ++b)
60  {
61  for(int g = 0; g < static_cast<int>(num_groups); ++g)
62  {
63  const int first_group_ch = g * (src_channels / num_groups);
64  const int last_group_ch = (g + 1) * (src_channels / num_groups);
65 
66  for(int yo = 0; yo < dst_height; ++yo)
67  {
68  // Compute input spatial coordinates
69  const int xi = (yo % convolved_dims.first) * stride_x;
70  const int yi = (yo / convolved_dims.first) * stride_y;
71 
72  for(int ci = first_group_ch; ci < last_group_ch; ++ci)
73  {
74  for(int yk = 0; yk < kernel_height; ++yk)
75  {
76  for(int xk = 0; xk < kernel_width; ++xk)
77  {
78  dst[dst_idx++] = tensor_elem_at(src, Coordinates(xi + xk - pad_x, yi + yk - pad_y, ci, b), BorderMode::CONSTANT, static_cast<T>(pad_val));
79  }
80  }
81  }
82 
83  if(has_bias)
84  {
85  dst[dst_idx++] = static_cast<T>(1);
86  }
87  }
88  }
89  }
90 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::b, batches, ci, arm_compute::CONSTANT, arm_compute::test::validation::conv_info, arm_compute::test::validation::dst, arm_compute::test::validation::has_bias, Size2D::height, arm_compute::is_data_type_quantized_asymmetric(), arm_compute::NCHW, arm_compute::test::validation::num_groups, arm_compute::scaled_dimensions(), arm_compute::test::validation::src, arm_compute::test::validation::tensor_elem_at(), and Size2D::width.

Referenced by im2col().

◆ im2col_nhwc()

void arm_compute::test::validation::reference::im2col_nhwc ( const SimpleTensor< T > &  src,
SimpleTensor< T > &  dst,
const Size2D kernel_dims,
const PadStrideInfo conv_info,
bool  has_bias 
)

Definition at line 93 of file Im2Col.cpp.

94 {
95  ARM_COMPUTE_ERROR_ON(src.data_layout() != DataLayout::NHWC);
96  const int stride_x = conv_info.stride().first;
97  const int stride_y = conv_info.stride().second;
98  const int kernel_width = kernel_dims.width;
99  const int kernel_height = kernel_dims.height;
100  const int pad_x = conv_info.pad().first;
101  const int pad_y = conv_info.pad().second;
102  const int src_width = src.shape().y();
103  const int src_height = src.shape().z();
104  const int src_channels = src.shape().x();
105  const int batches = src.shape().total_size_upper(3);
106  const int dst_width = has_bias ? dst.shape().x() - 1 : dst.shape().x();
107  const int dst_height = dst.shape().y();
108  const int pad_val = is_data_type_quantized_asymmetric(src.data_type()) ? src.quantization_info().uniform().offset : 0;
109 
110  // Compute width and height of the convolved tensors
111  std::pair<unsigned int, unsigned int> convolved_dims = scaled_dimensions(src_width, src_height, kernel_dims.width, kernel_dims.height, conv_info);
112 #if defined(_OPENMP)
113  #pragma omp parallel for schedule(dynamic, 1) collapse(2)
114 #endif /* _OPENMP */
115  for(int b = 0; b < batches; ++b)
116  {
117  for(int yo = 0; yo < dst_height; ++yo)
118  {
119  // Compute input spatial coordinates
120  const int xi = (yo % convolved_dims.first) * stride_x;
121  const int yi = (yo / convolved_dims.first) * stride_y;
122 
123  for(int ci = 0; ci < src_channels; ++ci)
124  {
125  for(int yk = 0; yk < kernel_height; ++yk)
126  {
127  for(int xk = 0; xk < kernel_width; ++xk)
128  {
129  dst[ci + (xk + yk * kernel_width) * src_channels + yo * dst.shape().x() + b * dst.shape().x() * dst.shape().y()] = tensor_elem_at(src, Coordinates(ci, xi + xk - pad_x, yi + yk - pad_y, b),
130  BorderMode::CONSTANT, static_cast<T>(pad_val));
131  }
132  }
133  }
134 
135  if(has_bias)
136  {
137  dst[dst_width + yo * dst.shape().x() + b * dst.shape().x() * dst.shape().y()] = static_cast<T>(1);
138  }
139  }
140  }
141 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::b, batches, ci, arm_compute::CONSTANT, arm_compute::test::validation::conv_info, arm_compute::test::validation::dst, arm_compute::test::validation::has_bias, Size2D::height, arm_compute::is_data_type_quantized_asymmetric(), arm_compute::NHWC, arm_compute::scaled_dimensions(), arm_compute::test::validation::src, arm_compute::test::validation::tensor_elem_at(), and Size2D::width.

Referenced by im2col().

◆ indirect_conv2d_addr_precalculation()

SimpleTensor< int32_t > indirect_conv2d_addr_precalculation ( const TensorShape shape_conv_src,
const TensorShape shape_conv_wei,
const TensorShape shape_conv_dst,
const TensorShape shape_dst,
const PadStrideInfo conv_info 
)

Definition at line 38 of file IndirectConv2dAddressPrecalculation.cpp.

40 {
41  SimpleTensor<int32_t> out{ shape_dst, DataType::S32 };
42 
43  constexpr unsigned int width_idx = 1;
44  constexpr unsigned int heigh_idx = 2;
45 
46  const int src_conv_width = static_cast<int32_t>(shape_conv_src[width_idx]); // NHWC
47  const int src_conv_height = static_cast<int32_t>(shape_conv_src[heigh_idx]); // NHWC
48  const int dst_conv_width = static_cast<int32_t>(shape_conv_dst[width_idx]); // NHWC
49  const int wei_conv_width = static_cast<int32_t>(shape_conv_wei[width_idx]); // NHWC
50  const int wei_conv_height = static_cast<int32_t>(shape_conv_wei[heigh_idx]); // NHWC
51  const int dst_width = static_cast<int32_t>(shape_dst[0]);
52  const int dst_height = static_cast<int32_t>(shape_dst[1]);
53  const int dst_batch = static_cast<int32_t>(shape_dst[2]);
54  const int ks = wei_conv_width * wei_conv_height;
55  const int stride_x = static_cast<int32_t>(conv_info.stride().first);
56  const int stride_y = static_cast<int32_t>(conv_info.stride().second);
57  const int pad_left = static_cast<int32_t>(conv_info.pad_left());
58  const int pad_top = static_cast<int32_t>(conv_info.pad_top());
59 
60  const int m0 = dst_width / ks;
61 
62  for(int z = 0; z < dst_batch; ++z)
63  {
64  for(int y = 0; y < dst_height; ++y)
65  {
66  const int mout = y * m0;
67  for(int ki = 0; ki < ks; ++ki)
68  {
69  const int xk = ki % wei_conv_width;
70  const int yk = ki / wei_conv_width;
71  for(int mi = 0; mi < m0; ++mi)
72  {
73  int xi = ((mout + mi) % dst_conv_width) * stride_x;
74  int yi = ((mout + mi) / dst_conv_width) * stride_y;
75  xi -= pad_left;
76  yi -= pad_top;
77  const int x_s = xi + xk;
78  const int y_s = yi + yk;
79  int my = x_s + y_s * src_conv_width;
80  my = my + z * src_conv_width * src_conv_height;
81  my = x_s >= 0 ? my : -1;
82  my = x_s < src_conv_width ? my : -1;
83  my = y_s >= 0 ? my : -1;
84  my = y_s < src_conv_height ? my : -1;
85 
86  const unsigned int addr_out = mi + ki * m0 + y * (dst_width) + z * (dst_width * dst_height);
87  out[addr_out] = my;
88  }
89  }
90  }
91  }
92 
93  return out;
94 }

References arm_compute::test::validation::conv_info, arm_compute::S32, and arm_compute::cpu::width_idx.

◆ instance_normalization() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::instance_normalization ( const SimpleTensor< float > &  src,
float  gamma,
float  beta,
float  epsilon 
)

◆ instance_normalization() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::instance_normalization ( const SimpleTensor< half > &  src,
float  gamma,
float  beta,
float  epsilon 
)

◆ instance_normalization() [3/3]

SimpleTensor< T > instance_normalization ( const SimpleTensor< T > &  src,
float  gamma,
float  beta,
float  epsilon 
)

Definition at line 40 of file InstanceNormalizationLayer.cpp.

41 {
42  SimpleTensor<T> dst{ src.shape(), src.data_type() };
43 
44  //NCHW
45  const size_t w_size = src.shape()[0];
46  const size_t h_size = src.shape()[1];
47  const size_t c_size = src.shape()[2];
48  const size_t n_size = src.shape()[3];
49 #if defined(_OPENMP)
50  #pragma omp parallel for collapse(2)
51 #endif /* _OPENMP */
52  for(size_t n_i = 0; n_i < n_size; ++n_i)
53  {
54  for(size_t c_i = 0; c_i < c_size; ++c_i)
55  {
56  float sum_h_w = 0;
57  float sum_sq_h_w = 0;
58 
59  for(size_t h_i = 0; h_i < h_size; ++h_i)
60  {
61  for(size_t w_i = 0; w_i < w_size; ++w_i)
62  {
63  float val = src[coord2index(src.shape(), Coordinates(w_i, h_i, c_i, n_i))];
64  sum_h_w += val;
65  sum_sq_h_w += val * val;
66  }
67  }
68  //Compute mean
69  const float mean_h_w = sum_h_w / (h_size * w_size);
70  //Compute variance
71  const float var_h_w = sum_sq_h_w / (h_size * w_size) - mean_h_w * mean_h_w;
72  ;
73 
74  //Apply mean
75  for(size_t h_i = 0; h_i < h_size; ++h_i)
76  {
77  for(size_t w_i = 0; w_i < w_size; ++w_i)
78  {
79  //Compute output
80  size_t index = coord2index(src.shape(), Coordinates(w_i, h_i, c_i, n_i));
81  dst[index] = (src[index] - mean_h_w) * gamma / std::sqrt(var_h_w + epsilon) + beta;
82  }
83  }
84  }
85  }
86  return dst;
87 }

References arm_compute::test::coord2index(), arm_compute::test::validation::dst, arm_compute::quantization::epsilon, and arm_compute::test::validation::src.

◆ l2_normalize() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::l2_normalize ( const SimpleTensor< float > &  src,
unsigned int  axis,
float  epsilon 
)

◆ l2_normalize() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::l2_normalize ( const SimpleTensor< half > &  src,
unsigned int  axis,
float  epsilon 
)

◆ l2_normalize() [3/3]

SimpleTensor< T > l2_normalize ( const SimpleTensor< T > &  src,
unsigned int  axis,
float  epsilon 
)

Definition at line 51 of file L2NormalizeLayer.cpp.

52 {
53  // Create reference
54  SimpleTensor<T> dst{ src.shape(), src.data_type() };
55 
56  // Reduce across given axis
57  SimpleTensor<T> sum = reduction_operation<T, T>(src, get_output_shape(src.shape(), axis), axis, ReductionOperation::SUM_SQUARE);
58 
59  // Compute reference
60  const int upper_dims = src.shape().total_size_upper(axis + 1);
61  const int lower_dims = src.shape().total_size_lower(axis + 1);
62  const int lower_dims_sum = sum.shape().total_size_lower(axis + 1);
63 
64  for(int du = 0; du < upper_dims; ++du)
65  {
66  const T *src_row_ptr = src.data() + du * lower_dims;
67  T *dst_row_ptr = dst.data() + du * lower_dims;
68  switch(axis)
69  {
70  case 0:
71  {
72  const int elems = src.shape()[0];
73  const T normalization_value = sqrt(std::max(sum[du], static_cast<T>(epsilon)));
74  std::transform(src_row_ptr, src_row_ptr + elems, dst_row_ptr, [normalization_value](T val)
75  {
76  return val / normalization_value;
77  });
78  }
79  break;
80  case 1:
81  case 2:
82  {
83  for(int ld = 0; ld < lower_dims; ++ld)
84  {
85  const T normalization_value = sqrt(std::max(sum[ld % lower_dims_sum + du * lower_dims_sum], static_cast<T>(epsilon)));
86  dst_row_ptr[ld] = src_row_ptr[ld] / normalization_value;
87  }
88  }
89  break;
90  default:
91  ARM_COMPUTE_ERROR("Axis not supported");
92  }
93  }
94 
95  return dst;
96 }

References ARM_COMPUTE_ERROR, arm_compute::test::validation::dst, arm_compute::quantization::epsilon, SimpleTensor< T >::shape(), arm_compute::test::validation::src, and arm_compute::SUM_SQUARE.

◆ logical_and() [1/2]

SimpleTensor< T > logical_and ( const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2 
)

Definition at line 108 of file Logical.cpp.

109 {
110  Coordinates id_src1{};
111  Coordinates id_src2{};
112  Coordinates id_dst{};
113  SimpleTensor<T> dst{ TensorShape::broadcast_shape(src1.shape(), src2.shape()), src1.data_type() };
114 
115  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(arm_compute::LogicalOperation::And, src1, src2, dst, id_src1, id_src2, id_dst);
116 
117  return dst;
118 }

References arm_compute::And, TensorShape::broadcast_shape(), SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, and SimpleTensor< T >::shape().

◆ logical_and() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::logical_and ( const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< uint8_t > &  src2 
)

◆ logical_binary_op()

T arm_compute::test::validation::reference::logical_binary_op ( arm_compute::LogicalOperation  op,
src1,
src2 
)

Definition at line 37 of file Logical.cpp.

38 {
39  switch(op)
40  {
42  return src1 && src2;
44  return src1 || src2;
45  // The following operators are either invalid or not binary operator
47  // fall through
49  // fall through
50  default:
51  ARM_COMPUTE_ASSERT(true);
52  }
53  return T{};
54 }

References arm_compute::And, ARM_COMPUTE_ASSERT, arm_compute::Not, arm_compute::Or, and arm_compute::Unknown.

◆ logical_not() [1/2]

SimpleTensor< T > logical_not ( const SimpleTensor< T > &  src)

Definition at line 121 of file Logical.cpp.

122 {
123  SimpleTensor<T> dst(src.shape(), src.data_type());
124 #if defined(_OPENMP)
125  #pragma omp parallel for
126 #endif /* _OPENMP */
127  for(int i = 0; i < src.num_elements(); ++i)
128  {
129  dst[i] = !src[i];
130  }
131 
132  return dst;
133 }

References arm_compute::test::validation::dst, and arm_compute::test::validation::src.

◆ logical_not() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::logical_not ( const SimpleTensor< uint8_t > &  src1)

◆ logical_or() [1/2]

SimpleTensor< T > logical_or ( const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2 
)

Definition at line 95 of file Logical.cpp.

96 {
97  Coordinates id_src1{};
98  Coordinates id_src2{};
99  Coordinates id_dst{};
100  SimpleTensor<T> dst{ TensorShape::broadcast_shape(src1.shape(), src2.shape()), src1.data_type() };
101 
102  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(arm_compute::LogicalOperation::Or, src1, src2, dst, id_src1, id_src2, id_dst);
103 
104  return dst;
105 }

References TensorShape::broadcast_shape(), SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, arm_compute::Or, and SimpleTensor< T >::shape().

◆ logical_or() [2/2]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::logical_or ( const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< uint8_t > &  src2 
)

◆ max_unpooling_layer() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::max_unpooling_layer ( const SimpleTensor< float > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > &  indices,
TensorShape  output_shape,
DataLayout  data_layout 
)

◆ max_unpooling_layer() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::max_unpooling_layer ( const SimpleTensor< half > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > &  indices,
TensorShape  output_shape,
DataLayout  data_layout 
)

◆ max_unpooling_layer() [3/3]

SimpleTensor< T > max_unpooling_layer ( const SimpleTensor< T > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > &  indices,
TensorShape  output_shape,
DataLayout  data_layout 
)

Definition at line 92 of file MaxUnpoolingLayer.cpp.

95 {
96  return max_unpooling_layer_internal<T>(src, info, output_qinfo, indices, output_shape, data_layout);
97 }

References arm_compute::test::validation::data_layout, arm_compute::test::validation::info, arm_compute::test::validation::output_shape, and arm_compute::test::validation::src.

◆ max_unpooling_layer< uint8_t >()

SimpleTensor<uint8_t> arm_compute::test::validation::reference::max_unpooling_layer< uint8_t > ( const SimpleTensor< uint8_t > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > &  indices,
TensorShape  output_shape,
DataLayout  data_layout 
)

Definition at line 79 of file MaxUnpoolingLayer.cpp.

84 {
85  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
86  SimpleTensor<float> dst_tmp = max_unpooling_layer_internal<float>(src_tmp, info, output_qinfo, indices, output_shape, data_layout);
87  SimpleTensor<uint8_t> dst = convert_to_asymmetric<uint8_t>(dst_tmp, output_qinfo);
88  return dst;
89 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::data_layout, arm_compute::test::validation::dst, arm_compute::test::validation::info, arm_compute::test::validation::output_shape, and arm_compute::test::validation::src.

◆ max_unpooling_layer_internal()

SimpleTensor<T> arm_compute::test::validation::reference::max_unpooling_layer_internal ( const SimpleTensor< T > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > &  indices,
TensorShape  output_shape,
DataLayout  data_layout 
)

Definition at line 41 of file MaxUnpoolingLayer.cpp.

44 {
46  ARM_COMPUTE_UNUSED(output_qinfo);
48  // Create reference
49  SimpleTensor<T> dst{ output_shape, src.data_type(), 1 };
50  ARM_COMPUTE_ERROR_ON(indices.shape().total_size() == 0);
51  std::fill_n(dst.data(), dst.num_elements(), 0);
52  const auto w_indices = static_cast<int>(indices.shape()[0]);
53  const auto h_indices = static_cast<int>(indices.shape()[1]);
54  const auto z_indices = static_cast<int>(indices.shape()[2]);
55  const auto b_indices = static_cast<int>(indices.shape()[3]);
56  const auto w_dst = static_cast<int>(dst.shape()[0]);
57  const auto h_dst = static_cast<int>(dst.shape()[1]);
58  const auto z_dst = static_cast<int>(dst.shape()[2]);
59  for(int b = 0; b < b_indices; ++b)
60  {
61  for(int r = 0; r < z_indices; ++r)
62  {
63  for(int h = 0; h < h_indices; ++h)
64  {
65  for(int w = 0; w < w_indices; ++w)
66  {
67  const uint32_t index_into_dst = indices[b * z_indices * h_indices * w_indices + r * h_indices * w_indices + h * w_indices + w];
68  const auto input_val = src[b * z_indices * h_indices * w_indices + r * h_indices * w_indices + h * w_indices + w];
69  auto *ptr = &dst[b * z_dst * h_dst * w_dst];
70  ptr[index_into_dst] = input_val;
71  }
72  }
73  }
74  }
75  return dst;
76 }

References ARM_COMPUTE_ERROR_ON, ARM_COMPUTE_UNUSED, arm_compute::test::validation::b, arm_compute::test::validation::data_layout, arm_compute::test::validation::dst, arm_compute::test::validation::info, arm_compute::test::validation::output_shape, SimpleTensor< T >::shape(), arm_compute::test::validation::src, and arm_compute::test::validation::w.

◆ mean_and_standard_deviation() [1/4]

template std::pair<float, float> arm_compute::test::validation::reference::mean_and_standard_deviation ( const SimpleTensor< float > &  in)

◆ mean_and_standard_deviation() [2/4]

template std::pair<float, float> arm_compute::test::validation::reference::mean_and_standard_deviation ( const SimpleTensor< half > &  in)

◆ mean_and_standard_deviation() [3/4]

std::pair< float, float > mean_and_standard_deviation ( const SimpleTensor< T > &  in)

Definition at line 35 of file MeanStdDev.cpp.

36 {
37  const int num_elements = in.num_elements();
38 
39  // Calculate mean
40  float mean = std::accumulate(in.data(), in.data() + num_elements, 0.f) / num_elements;
41 
42  // Calculate standard deviation
43  float std_dev = std::accumulate(in.data(), in.data() + num_elements, 0.f, [&mean](float a, float b)
44  {
45  return a + (mean - b) * (mean - b);
46  });
47 
48  std_dev = std::sqrt(std_dev / num_elements);
49 
50  return std::make_pair(mean, std_dev);
51 }

References accumulate(), arm_compute::test::validation::b, SimpleTensor< T >::data(), and SimpleTensor< T >::num_elements().

◆ mean_and_standard_deviation() [4/4]

template std::pair<float, float> arm_compute::test::validation::reference::mean_and_standard_deviation ( const SimpleTensor< uint8_t > &  in)

◆ mean_std_normalization_layer() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::mean_std_normalization_layer ( const SimpleTensor< float > &  src,
float  epsilon 
)

◆ mean_std_normalization_layer() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::mean_std_normalization_layer ( const SimpleTensor< half > &  src,
float  epsilon 
)

◆ mean_std_normalization_layer() [3/4]

SimpleTensor< T > mean_std_normalization_layer ( const SimpleTensor< T > &  src,
float  epsilon 
)

Definition at line 37 of file MeanStdDevNormalizationLayer.cpp.

38 {
39  SimpleTensor<T> dst{ src.shape(), src.data_type(), 1 };
40  const int cols = src.shape()[0];
41  const int batch_size = src.shape()[1];
42  for(int i = 0; i < batch_size; ++i)
43  {
44  float sum = static_cast<T>(0.f);
45  float sum_sq = static_cast<T>(0.f);
46  for(int j = 0; j < cols; ++j)
47  {
48  const T value = src[j + i * cols];
49  sum += value;
50  sum_sq += value * value;
51  }
52  const float mean = sum / cols;
53  const float var = (((sum_sq / cols) - (mean * mean)) + epsilon);
54  const float stddev_inv = 1.f / std::sqrt(var);
55  for(int j = 0; j < cols; ++j)
56  {
57  const float res = (src[j + i * cols] - mean) * stddev_inv;
58  dst[j + i * cols] = static_cast<T>(res);
59  }
60  }
61  return dst;
62 }

References caffe_mnist_image_extractor::cols, arm_compute::test::validation::dst, arm_compute::quantization::epsilon, and arm_compute::test::validation::src.

◆ mean_std_normalization_layer() [4/4]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::mean_std_normalization_layer ( const SimpleTensor< uint8_t > &  src,
float  epsilon 
)

Definition at line 65 of file MeanStdDevNormalizationLayer.cpp.

66 {
67  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
68  SimpleTensor<float> dst_tmp = mean_std_normalization_layer<float>(src_tmp, epsilon);
69  SimpleTensor<uint8_t> dst = convert_to_asymmetric<uint8_t>(dst_tmp, src.quantization_info());
70  return dst;
71 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, arm_compute::quantization::epsilon, and arm_compute::test::validation::src.

◆ min_max_location() [1/4]

template MinMaxLocationValues<float> arm_compute::test::validation::reference::min_max_location ( const SimpleTensor< float > &  src)

◆ min_max_location() [2/4]

template MinMaxLocationValues<int16_t> arm_compute::test::validation::reference::min_max_location ( const SimpleTensor< int16_t > &  src)

◆ min_max_location() [3/4]

MinMaxLocationValues< T > min_max_location ( const SimpleTensor< T > &  src)

Definition at line 58 of file MinMaxLocation.cpp.

59 {
60  MinMaxLocationValues<T> dst;
61 
62  const size_t width = src.shape().x();
63 
64  compute_min_max<T>(src, dst.min, dst.max);
65 
66  Coordinates2D coord{ 0, 0 };
67 
68  for(int i = 0; i < src.num_elements(); ++i)
69  {
70  coord.x = static_cast<int32_t>(i % width);
71  coord.y = static_cast<int32_t>(i / width);
72 
73  if(src[i] == dst.min)
74  {
75  dst.min_loc.push_back(coord);
76  }
77  if(src[i] == dst.max)
78  {
79  dst.max_loc.push_back(coord);
80  }
81  }
82 
83  return dst;
84 }

References arm_compute::test::validation::dst, arm_compute::test::validation::src, and Coordinates2D::x.

◆ min_max_location() [4/4]

template MinMaxLocationValues<uint8_t> arm_compute::test::validation::reference::min_max_location ( const SimpleTensor< uint8_t > &  src)

◆ non_max_suppression()

SimpleTensor< int > non_max_suppression ( const SimpleTensor< float > &  bboxes,
const SimpleTensor< float > &  scores,
SimpleTensor< int > &  indices,
unsigned int  max_output_size,
float  score_threshold,
float  nms_threshold 
)

Definition at line 139 of file NonMaxSuppression.cpp.

141 {
142  const size_t num_boxes = bboxes.shape().y();
143  const size_t output_size = std::min(static_cast<size_t>(max_output_size), num_boxes);
144  const std::vector<CandidateBox> candidates_vector = get_candidates(scores, score_threshold);
145  std::vector<int> selected;
146  for(const auto &c : candidates_vector)
147  {
148  if(selected.size() == output_size)
149  {
150  break;
151  }
152  if(is_box_selected(c, bboxes, selected, nms_threshold))
153  {
154  selected.push_back(c.first);
155  }
156  }
157  std::copy_n(selected.begin(), selected.size(), indices.data());
158 
159  for(unsigned int i = selected.size(); i < max_output_size; ++i)
160  {
161  indices[i] = -1;
162  }
163 
164  return indices;
165 }

References SimpleTensor< T >::data(), arm_compute::test::validation::output_size, and SimpleTensor< T >::shape().

◆ non_maxima_suppression() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::non_maxima_suppression ( const SimpleTensor< float > &  src,
BorderMode  border_mode,
float  constant_border_value 
)

◆ non_maxima_suppression() [2/3]

SimpleTensor< T > non_maxima_suppression ( const SimpleTensor< T > &  src,
BorderMode  border_mode,
constant_border_value 
)

Definition at line 38 of file NonMaximaSuppression.cpp.

39 {
40  constexpr int block_size = 3;
41  SimpleTensor<T> dst(src.shape(), src.data_type(), src.num_channels());
42  ValidRegion valid_region = shape_to_valid_region(src.shape(), border_mode == BorderMode::UNDEFINED, BorderSize(block_size / 2));
43 
44  const uint32_t num_elements = src.num_elements();
45  for(uint32_t i = 0; i < num_elements; ++i)
46  {
47  Coordinates coord = index2coord(src.shape(), i);
48  int x = coord.x();
49  int y = coord.y();
50 
51  if(!is_in_valid_region(valid_region, coord))
52  {
53  continue;
54  }
55 
56  if(src[i] >= tensor_elem_at(src, Coordinates(x - 1, y - 1), border_mode, constant_border_value) && src[i] >= tensor_elem_at(src, Coordinates(x, y - 1), border_mode, constant_border_value)
57  && src[i] >= tensor_elem_at(src, Coordinates(x + 1, y - 1), border_mode, constant_border_value) && src[i] >= tensor_elem_at(src, Coordinates(x - 1, y), border_mode, constant_border_value)
58  && src[i] > tensor_elem_at(src, Coordinates(x + 1, y), border_mode, constant_border_value) && src[i] > tensor_elem_at(src, Coordinates(x - 1, y + 1), border_mode, constant_border_value)
59  && src[i] > tensor_elem_at(src, Coordinates(x, y + 1), border_mode, constant_border_value) && src[i] > tensor_elem_at(src, Coordinates(x + 1, y + 1), border_mode, constant_border_value))
60  {
61  dst[i] = src[i];
62  }
63  else
64  {
65  dst[i] = T(0);
66  }
67  }
68 
69  return dst;
70 }

References arm_compute::test::validation::dst, arm_compute::test::index2coord(), arm_compute::test::is_in_valid_region(), arm_compute::test::shape_to_valid_region(), arm_compute::test::validation::src, arm_compute::test::validation::tensor_elem_at(), arm_compute::UNDEFINED, arm_compute::test::validation::valid_region, Dimensions< T >::x(), and Dimensions< T >::y().

◆ non_maxima_suppression() [3/3]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::non_maxima_suppression ( const SimpleTensor< uint8_t > &  src,
BorderMode  border_mode,
uint8_t  constant_border_value 
)

◆ normalization_layer() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::normalization_layer ( const SimpleTensor< float > &  src,
NormalizationLayerInfo  info 
)

◆ normalization_layer() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::normalization_layer ( const SimpleTensor< half > &  src,
NormalizationLayerInfo  info 
)

◆ normalization_layer() [3/3]

SimpleTensor< T > normalization_layer ( const SimpleTensor< T > &  src,
NormalizationLayerInfo  info 
)

Definition at line 37 of file NormalizationLayer.cpp.

38 {
39  // Create reference
40  SimpleTensor<T> dst{ src.shape(), src.data_type(), 1 };
41 
42  // Compute reference
43  const uint32_t norm_size = info.norm_size();
44  NormType type = info.type();
45  float beta = info.beta();
46  uint32_t kappa = info.kappa();
47 
48  const int cols = src.shape()[0];
49  const int rows = src.shape()[1];
50  const int depth = src.shape()[2];
51  int upper_dims = src.shape().total_size() / (cols * rows);
52 
53  float coeff = info.scale_coeff();
54  int radius_cols = norm_size / 2;
55 
56  // IN_MAP_1D and CROSS_MAP normalize over a single axis only
57  int radius_rows = (NormType::IN_MAP_2D == type) ? norm_size / 2 : 0;
58 
59  if(info.is_cross_map())
60  {
61  // Remove also depth from upper dimensions since it is the dimension we
62  // want to use for normalization
63  upper_dims /= depth;
64 
65  for(int r = 0; r < upper_dims; ++r)
66  {
67  for(int i = 0; i < rows; ++i)
68  {
69  for(int k = 0; k < cols; ++k)
70  {
71  for(int l = 0; l < depth; ++l)
72  {
73  float accumulated_scale = 0.f;
74 
75  for(int j = -radius_cols; j <= radius_cols; ++j)
76  {
77  const int z = l + j;
78 
79  if(z >= 0 && z < depth)
80  {
81  const T value = src[k + i * cols + z * rows * cols + r * cols * rows * depth];
82  accumulated_scale += value * value;
83  }
84  }
85 
86  dst[k + i * cols + l * rows * cols + r * cols * rows * depth] = kappa + accumulated_scale * coeff;
87  }
88  }
89  }
90  }
91  }
92  else
93  {
94  for(int r = 0; r < upper_dims; ++r)
95  {
96  for(int i = 0; i < rows; ++i)
97  {
98  for(int k = 0; k < cols; ++k)
99  {
100  float accumulated_scale = 0.f;
101 
102  for(int j = -radius_rows; j <= radius_rows; ++j)
103  {
104  const int y = i + j;
105  for(int l = -radius_cols; l <= radius_cols; ++l)
106  {
107  const int x = k + l;
108 
109  if((x >= 0 && y >= 0) && (x < cols && y < rows))
110  {
111  const T value = src[x + y * cols + r * cols * rows];
112  accumulated_scale += value * value;
113  }
114  }
115  }
116 
117  dst[k + i * cols + r * cols * rows] = kappa + accumulated_scale * coeff;
118  }
119  }
120  }
121  }
122 
123  if(beta == 1.f)
124  {
125  for(int i = 0; i < dst.num_elements(); ++i)
126  {
127  dst[i] = src[i] / dst[i];
128  }
129  }
130  else if(beta == 0.5f)
131  {
132  for(int i = 0; i < dst.num_elements(); ++i)
133  {
134  dst[i] = src[i] / std::sqrt(dst[i]);
135  }
136  }
137  else
138  {
139  for(int i = 0; i < dst.num_elements(); ++i)
140  {
141  dst[i] = src[i] * std::exp(std::log(dst[i]) * -beta);
142  }
143  }
144 
145  return dst;
146 }

References caffe_mnist_image_extractor::cols, arm_compute::test::validation::dst, arm_compute::IN_MAP_2D, arm_compute::test::validation::info, caffe_mnist_image_extractor::rows, arm_compute::test::validation::src, and type.

◆ normalize_planar_yuv_layer() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::normalize_planar_yuv_layer ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  mean,
const SimpleTensor< float > &  std 
)

◆ normalize_planar_yuv_layer() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::normalize_planar_yuv_layer ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  mean,
const SimpleTensor< half > &  std 
)

◆ normalize_planar_yuv_layer() [3/3]

SimpleTensor< T > normalize_planar_yuv_layer ( const SimpleTensor< T > &  src,
const SimpleTensor< T > &  mean,
const SimpleTensor< T > &  std 
)

Definition at line 38 of file NormalizePlanarYUVLayer.cpp.

39 {
40  SimpleTensor<T> result(src.shape(), src.data_type());
41 
42  const auto cols = static_cast<int>(src.shape()[0]);
43  const auto rows = static_cast<int>(src.shape()[1]);
44  const auto depth = static_cast<int>(src.shape()[2]);
45  const int upper_dims = src.shape().total_size() / (cols * rows * depth);
46 
47  for(int r = 0; r < upper_dims; ++r)
48  {
49  for(int i = 0; i < depth; ++i)
50  {
51  for(int k = 0; k < rows; ++k)
52  {
53  for(int l = 0; l < cols; ++l)
54  {
55  const int pos = l + k * cols + i * rows * cols + r * cols * rows * depth;
56  result[pos] = (src[pos] - mean[i]) / std[i];
57  }
58  }
59  }
60  }
61  return result;
62 }

References caffe_mnist_image_extractor::cols, caffe_mnist_image_extractor::rows, and arm_compute::test::validation::src.

◆ normalize_planar_yuv_layer< int8_t >()

SimpleTensor<int8_t> arm_compute::test::validation::reference::normalize_planar_yuv_layer< int8_t > ( const SimpleTensor< int8_t > &  src,
const SimpleTensor< int8_t > &  mean,
const SimpleTensor< int8_t > &  std 
)

Definition at line 76 of file NormalizePlanarYUVLayer.cpp.

77 {
78  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
79  SimpleTensor<float> mean_tmp = convert_from_asymmetric(mean);
80  SimpleTensor<float> std_tmp = convert_from_asymmetric(std);
81  SimpleTensor<float> dst_tmp = normalize_planar_yuv_layer<float>(src_tmp, mean_tmp, std_tmp);
82  SimpleTensor<int8_t> dst = convert_to_asymmetric<int8_t>(dst_tmp, src.quantization_info());
83  return dst;
84 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, and arm_compute::test::validation::src.

◆ normalize_planar_yuv_layer< uint8_t >()

SimpleTensor<uint8_t> arm_compute::test::validation::reference::normalize_planar_yuv_layer< uint8_t > ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint8_t > &  mean,
const SimpleTensor< uint8_t > &  std 
)

Definition at line 65 of file NormalizePlanarYUVLayer.cpp.

66 {
67  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
68  SimpleTensor<float> mean_tmp = convert_from_asymmetric(mean);
69  SimpleTensor<float> std_tmp = convert_from_asymmetric(std);
70  SimpleTensor<float> dst_tmp = normalize_planar_yuv_layer<float>(src_tmp, mean_tmp, std_tmp);
71  SimpleTensor<uint8_t> dst = convert_to_asymmetric<uint8_t>(dst_tmp, src.quantization_info());
72  return dst;
73 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, and arm_compute::test::validation::src.

◆ pad_layer() [1/9]

template SimpleTensor<float> arm_compute::test::validation::reference::pad_layer ( const SimpleTensor< float > &  src,
const PaddingList paddings,
const PixelValue  const_value = PixelValue(),
const PaddingMode  mode 
)

◆ pad_layer() [2/9]

template SimpleTensor<half> arm_compute::test::validation::reference::pad_layer ( const SimpleTensor< half > &  src,
const PaddingList paddings,
const PixelValue  const_value = PixelValue(),
const PaddingMode  mode 
)

◆ pad_layer() [3/9]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::pad_layer ( const SimpleTensor< int16_t > &  src,
const PaddingList paddings,
const PixelValue  const_value = PixelValue(),
const PaddingMode  mode 
)

◆ pad_layer() [4/9]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::pad_layer ( const SimpleTensor< int32_t > &  src,
const PaddingList paddings,
const PixelValue  const_value = PixelValue(),
const PaddingMode  mode 
)

◆ pad_layer() [5/9]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::pad_layer ( const SimpleTensor< int8_t > &  src,
const PaddingList paddings,
const PixelValue  const_value = PixelValue(),
const PaddingMode  mode 
)

◆ pad_layer() [6/9]

SimpleTensor< T > pad_layer ( const SimpleTensor< T > &  src,
const PaddingList paddings,
const PixelValue  const_value = PixelValue(),
const PaddingMode  mode = PaddingMode::CONSTANT 
)

Reference function to pad an ND tensor.

This function is not supposed to be optimized, but to clearly and naively execute the padding of a tensor

Parameters
[in]srcTensor to pad
[in]paddingsPadding size in each dimension
[in]const_valueConstant value to fill padding with
[in]mode[optional] Padding mode to use
Returns
The padded Tensor

Definition at line 39 of file PadLayer.cpp.

40 {
41  const DataType dst_data_type = src.data_type();
42 
43  const TensorShape orig_shape = src.shape();
44 
45  std::vector<PaddingInfo> paddings_extended = paddings;
46 
47  for(size_t i = paddings.size(); i < TensorShape::num_max_dimensions; ++i)
48  {
49  paddings_extended.emplace_back(PaddingInfo{ 0, 0 });
50  }
51 
52  const TensorShape padded_shape = misc::shape_calculator::compute_padded_shape(orig_shape, paddings);
53 
54  SimpleTensor<T> dst(padded_shape, dst_data_type);
55 
56  // Reference algorithm: loop over the different dimension of the input.
57  const uint32_t num_elements = dst.num_elements();
58  for(uint32_t idx = 0; idx < num_elements; ++idx)
59  {
60  const Coordinates coord = index2coord(padded_shape, idx);
61 
62  const size_t i = coord.x();
63  const size_t j = coord.y();
64  const size_t k = coord.z();
65  const size_t l = coord[3];
66  const size_t m = coord[4];
67  const size_t n = coord[5];
68 
69  const std::array<size_t, TensorShape::num_max_dimensions> dims = { { 0, 1, 2, 3, 4, 5 } };
70  const std::array<size_t, TensorShape::num_max_dimensions> coords = { { i, j, k, l, m, n } };
71  auto is_padding_area = [&](size_t i)
72  {
73  return (coords[i] < paddings_extended[i].first || coords[i] > orig_shape[i] + paddings_extended[i].first - 1);
74  };
75 
76  auto orig_coord_reflect = [&](size_t i)
77  {
78  if(is_padding_area(i))
79  {
80  if(coords[i] < paddings_extended[i].first)
81  {
82  return paddings_extended[i].first - coords[i];
83  }
84  else
85  {
86  return 2 * orig_shape[i] + paddings_extended[i].first - 2 - coords[i];
87  }
88  }
89  return coords[i] - paddings_extended[i].first;
90  };
91 
92  auto orig_coord_symm = [&](size_t i)
93  {
94  if(is_padding_area(i))
95  {
96  if(coords[i] < paddings_extended[i].first)
97  {
98  return paddings_extended[i].first - coords[i] - 1;
99  }
100  else
101  {
102  return 2 * orig_shape[i] + paddings_extended[i].first - 1 - coords[i];
103  }
104  }
105  return coords[i] - paddings_extended[i].first;
106  };
107 
108  // If the tuple [i,j,k,l,m] is in the padding area, then simply set the value
109  if(std::any_of(dims.begin(), dims.end(), is_padding_area))
110  {
111  switch(mode)
112  {
113  case PaddingMode::CONSTANT:
114  const_value.get(dst[idx]);
115  break;
116  case PaddingMode::REFLECT:
117  {
118  const Coordinates orig_coords{ orig_coord_reflect(0),
119  orig_coord_reflect(1),
120  orig_coord_reflect(2),
121  orig_coord_reflect(3),
122  orig_coord_reflect(4),
123  orig_coord_reflect(5) };
124 
125  const size_t idx_src = coord2index(orig_shape, orig_coords);
126  dst[idx] = src[idx_src];
127  break;
128  }
129  case PaddingMode::SYMMETRIC:
130  {
131  const Coordinates orig_coords{ orig_coord_symm(0),
132  orig_coord_symm(1),
133  orig_coord_symm(2),
134  orig_coord_symm(3),
135  orig_coord_symm(4),
136  orig_coord_symm(5) };
137 
138  const size_t idx_src = coord2index(orig_shape, orig_coords);
139  dst[idx] = src[idx_src];
140  break;
141  }
142  default:
143  ARM_COMPUTE_ERROR("Padding mode not supported.");
144  break;
145  }
146  }
147  else
148  {
149  // If the tuple[i,j,k,l,m] is not in the padding area, then copy the input into the output
150 
151  const Coordinates orig_coords
152  {
153  i - paddings_extended[0].first,
154  j - paddings_extended[1].first,
155  k - paddings_extended[2].first,
156  l - paddings_extended[3].first,
157  m - paddings_extended[4].first,
158  n - paddings_extended[5].first
159  };
160 
161  const size_t idx_src = coord2index(orig_shape, orig_coords);
162  dst[idx] = src[idx_src];
163  }
164  }
165 
166  return dst;
167 }

References ARM_COMPUTE_ERROR, arm_compute::misc::shape_calculator::compute_padded_shape(), arm_compute::CONSTANT, arm_compute::test::coord2index(), arm_compute::test::validation::dst, PixelValue::get(), arm_compute::test::index2coord(), clang_tidy_rules::mode, Dimensions< size_t >::num_max_dimensions, arm_compute::REFLECT, arm_compute::test::validation::src, arm_compute::SYMMETRIC, Dimensions< T >::x(), Dimensions< T >::y(), and Dimensions< T >::z().

Referenced by conv2d_dft().

◆ pad_layer() [7/9]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::pad_layer ( const SimpleTensor< uint16_t > &  src,
const PaddingList paddings,
const PixelValue  const_value = PixelValue(),
const PaddingMode  mode 
)

◆ pad_layer() [8/9]

template SimpleTensor<uint32_t> arm_compute::test::validation::reference::pad_layer ( const SimpleTensor< uint32_t > &  src,
const PaddingList paddings,
const PixelValue  const_value = PixelValue(),
const PaddingMode  mode 
)

◆ pad_layer() [9/9]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::pad_layer ( const SimpleTensor< uint8_t > &  src,
const PaddingList paddings,
const PixelValue  const_value = PixelValue(),
const PaddingMode  mode 
)

◆ permute() [1/9]

template SimpleTensor<bfloat16> arm_compute::test::validation::reference::permute ( const SimpleTensor< bfloat16 > &  src,
PermutationVector  perm 
)

◆ permute() [2/9]

template SimpleTensor<float> arm_compute::test::validation::reference::permute ( const SimpleTensor< float > &  src,
PermutationVector  perm 
)

◆ permute() [3/9]

template SimpleTensor<half> arm_compute::test::validation::reference::permute ( const SimpleTensor< half > &  src,
PermutationVector  perm 
)

◆ permute() [4/9]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::permute ( const SimpleTensor< int16_t > &  src,
PermutationVector  perm 
)

◆ permute() [5/9]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::permute ( const SimpleTensor< int8_t > &  src,
PermutationVector  perm 
)

◆ permute() [6/9]

SimpleTensor< T > permute ( const SimpleTensor< T > &  src,
PermutationVector  perm 
)

Definition at line 39 of file Permute.cpp.

40 {
41  // Permute shapes
42  TensorShape dst_shape = src.shape();
43  permute(dst_shape, perm);
44 
45  // Create reference
46  SimpleTensor<T> dst{dst_shape, src.data_type(), src.num_channels(), src.quantization_info()};
47 
48  // Compute reference
49  const uint32_t num_elements = src.num_elements();
50  for (uint32_t i = 0; i < num_elements; ++i)
51  {
52  const Coordinates src_coords = index2coord(src.shape(), i);
53  Coordinates dst_coords = src_coords;
54  permute(dst_coords, perm);
55 
56  std::copy_n(static_cast<const T *>(src(src_coords)), src.num_channels(), static_cast<T *>(dst(dst_coords)));
57  }
58 
59  return dst;
60 }

References arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, arm_compute::test::index2coord(), and arm_compute::test::validation::src.

Referenced by dft_2d(), pooling_layer_internal(), rdft_2d(), and ridft_2d().

◆ permute() [7/9]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::permute ( const SimpleTensor< uint16_t > &  src,
PermutationVector  perm 
)

◆ permute() [8/9]

template SimpleTensor<uint32_t> arm_compute::test::validation::reference::permute ( const SimpleTensor< uint32_t > &  src,
PermutationVector  perm 
)

◆ permute() [9/9]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::permute ( const SimpleTensor< uint8_t > &  src,
PermutationVector  perm 
)

◆ pixel_wise_multiplication() [1/8]

template SimpleTensor<float> arm_compute::test::validation::reference::pixel_wise_multiplication ( const SimpleTensor< float > &  src1,
const SimpleTensor< float > &  src2,
float  scale,
ConvertPolicy  convert_policy,
RoundingPolicy  rounding_policy,
DataType  dt_out,
const QuantizationInfo qout 
)

◆ pixel_wise_multiplication() [2/8]

template SimpleTensor<half_float::half> arm_compute::test::validation::reference::pixel_wise_multiplication ( const SimpleTensor< half_float::half > &  src1,
const SimpleTensor< half_float::half > &  src2,
float  scale,
ConvertPolicy  convert_policy,
RoundingPolicy  rounding_policy,
DataType  dt_out,
const QuantizationInfo qout 
)

◆ pixel_wise_multiplication() [3/8]

template SimpleTensor< int32_t > pixel_wise_multiplication ( const SimpleTensor< int16_t > &  src1,
const SimpleTensor< int16_t > &  src2,
float  scale,
ConvertPolicy  convert_policy,
RoundingPolicy  rounding_policy,
DataType  dt_out,
const QuantizationInfo qout 
)

Definition at line 323 of file PixelWiseMultiplication.cpp.

325 {
326  SimpleTensor<int16_t> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dt_out, 1, qout);
327 
328  if(src1.data_type() == DataType::QSYMM16 && src2.data_type() == DataType::QSYMM16)
329  {
330  SimpleTensor<float> src1_tmp = convert_from_symmetric<int16_t>(src1);
331  SimpleTensor<float> src2_tmp = convert_from_symmetric<int16_t>(src2);
332  SimpleTensor<float> dst_tmp = pixel_wise_multiplication<float, float, float>(src1_tmp, src2_tmp, scale, convert_policy, rounding_policy, DataType::F32, qout);
333  dst = convert_to_symmetric<int16_t>(dst_tmp, qout);
334  }
335  else
336  {
337  if(scale < 0)
338  {
339  ARM_COMPUTE_ERROR("Scale of pixel-wise multiplication must be non-negative");
340  }
341 
342  Coordinates id_src1{};
343  Coordinates id_src2{};
344  Coordinates id_dst{};
345  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(src1, src2, dst, scale, convert_policy, rounding_policy, id_src1, id_src2, id_dst);
346  }
347  return dst;
348 }

References ARM_COMPUTE_ERROR, TensorShape::broadcast_shape(), SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, arm_compute::F32, arm_compute::QSYMM16, scale(), and SimpleTensor< T >::shape().

◆ pixel_wise_multiplication() [4/8]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::pixel_wise_multiplication ( const SimpleTensor< int32_t > &  src1,
const SimpleTensor< int32_t > &  src2,
float  scale,
ConvertPolicy  convert_policy,
RoundingPolicy  rounding_policy,
DataType  dt_out,
const QuantizationInfo qout 
)

◆ pixel_wise_multiplication() [5/8]

SimpleTensor<int8_t> arm_compute::test::validation::reference::pixel_wise_multiplication ( const SimpleTensor< int8_t > &  src1,
const SimpleTensor< int8_t > &  src2,
float  scale,
ConvertPolicy  convert_policy,
RoundingPolicy  rounding_policy,
DataType  dt_out,
const QuantizationInfo qout 
)

Definition at line 295 of file PixelWiseMultiplication.cpp.

297 {
298  SimpleTensor<int8_t> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dt_out, 1, qout);
299 
300  if(src1.data_type() == DataType::QASYMM8_SIGNED && src2.data_type() == DataType::QASYMM8_SIGNED)
301  {
302  SimpleTensor<float> src1_tmp = convert_from_asymmetric(src1);
303  SimpleTensor<float> src2_tmp = convert_from_asymmetric(src2);
304  SimpleTensor<float> dst_tmp = pixel_wise_multiplication<float, float, float>(src1_tmp, src2_tmp, scale, convert_policy, rounding_policy, DataType::F32, qout);
305  dst = convert_to_asymmetric<int8_t>(dst_tmp, qout);
306  }
307  else
308  {
309  if(scale < 0)
310  {
311  ARM_COMPUTE_ERROR("Scale of pixel-wise multiplication must be non-negative");
312  }
313 
314  Coordinates id_src1{};
315  Coordinates id_src2{};
316  Coordinates id_dst{};
317  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(src1, src2, dst, scale, convert_policy, rounding_policy, id_src1, id_src2, id_dst);
318  }
319  return dst;
320 }

References ARM_COMPUTE_ERROR, TensorShape::broadcast_shape(), arm_compute::test::validation::convert_from_asymmetric(), SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, arm_compute::F32, arm_compute::QASYMM8_SIGNED, scale(), and SimpleTensor< T >::shape().

◆ pixel_wise_multiplication() [6/8]

SimpleTensor< T3 > pixel_wise_multiplication ( const SimpleTensor< T1 > &  src1,
const SimpleTensor< T2 > &  src2,
float  scale,
ConvertPolicy  convert_policy,
RoundingPolicy  rounding_policy,
DataType  dt_out,
const QuantizationInfo qout 
)

Definition at line 217 of file PixelWiseMultiplication.cpp.

219 {
220  ARM_COMPUTE_UNUSED(qout);
221 
222  SimpleTensor<T3> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dt_out);
223 
224  if(scale < 0)
225  {
226  ARM_COMPUTE_ERROR("Scale of pixel-wise multiplication must be non-negative");
227  }
228 
229  Coordinates id_src1{};
230  Coordinates id_src2{};
231  Coordinates id_dst{};
232 
233  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(src1, src2, dst, scale, convert_policy, rounding_policy, id_src1, id_src2, id_dst);
234 
235  return dst;
236 }

References ARM_COMPUTE_ERROR, ARM_COMPUTE_UNUSED, TensorShape::broadcast_shape(), arm_compute::test::validation::dst, scale(), and SimpleTensor< T >::shape().

◆ pixel_wise_multiplication() [7/8]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::pixel_wise_multiplication ( const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< int16_t > &  src2,
float  scale,
ConvertPolicy  convert_policy,
RoundingPolicy  rounding_policy,
DataType  dt_out,
const QuantizationInfo qout 
)

◆ pixel_wise_multiplication() [8/8]

SimpleTensor< int16_t > pixel_wise_multiplication ( const SimpleTensor< uint8_t > &  src1,
const SimpleTensor< uint8_t > &  src2,
float  scale,
ConvertPolicy  convert_policy,
RoundingPolicy  rounding_policy,
DataType  dt_out,
const QuantizationInfo qout 
)

Definition at line 239 of file PixelWiseMultiplication.cpp.

241 {
242  SimpleTensor<uint8_t> dst(TensorShape::broadcast_shape(src1.shape(), src2.shape()), dt_out, 1, qout);
243 
244  if(src1.data_type() == DataType::QASYMM8 && src2.data_type() == DataType::QASYMM8)
245  {
246  SimpleTensor<float> src1_tmp = convert_from_asymmetric(src1);
247  SimpleTensor<float> src2_tmp = convert_from_asymmetric(src2);
248  SimpleTensor<float> dst_tmp = pixel_wise_multiplication<float, float, float>(src1_tmp, src2_tmp, scale, convert_policy, rounding_policy, DataType::F32, qout);
249  dst = convert_to_asymmetric<uint8_t>(dst_tmp, qout);
250  }
251  else
252  {
253  if(scale < 0)
254  {
255  ARM_COMPUTE_ERROR("Scale of pixel-wise multiplication must be non-negative");
256  }
257 
258  Coordinates id_src1{};
259  Coordinates id_src2{};
260  Coordinates id_dst{};
261  BroadcastUnroll<Coordinates::num_max_dimensions>::unroll(src1, src2, dst, scale, convert_policy, rounding_policy, id_src1, id_src2, id_dst);
262  }
263  return dst;
264 }

References ARM_COMPUTE_ERROR, TensorShape::broadcast_shape(), arm_compute::test::validation::convert_from_asymmetric(), SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, arm_compute::F32, arm_compute::QASYMM8, scale(), and SimpleTensor< T >::shape().

◆ pooling_3d_layer() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::pooling_3d_layer ( const SimpleTensor< float > &  src,
const Pooling3dLayerInfo pool3d_info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices 
)

◆ pooling_3d_layer() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::pooling_3d_layer ( const SimpleTensor< half > &  src,
const Pooling3dLayerInfo pool3d_info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices 
)

◆ pooling_3d_layer() [3/3]

SimpleTensor< T > pooling_3d_layer ( const SimpleTensor< T > &  src,
const Pooling3dLayerInfo pool3d_info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices 
)

Definition at line 195 of file Pooling3dLayer.cpp.

196 {
197  ARM_COMPUTE_UNUSED(output_qinfo);
198  return pooling_3d_layer_internal<T>(src, pool3d_info, indices);
199 }

References ARM_COMPUTE_UNUSED, and arm_compute::test::validation::src.

◆ pooling_3d_layer< int8_t >()

SimpleTensor<int8_t> arm_compute::test::validation::reference::pooling_3d_layer< int8_t > ( const SimpleTensor< int8_t > &  src,
const Pooling3dLayerInfo pool3d_info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices 
)

Definition at line 202 of file Pooling3dLayer.cpp.

203 {
204  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
205  SimpleTensor<float> dst_tmp = pooling_3d_layer_internal<float>(src_tmp, pool3d_info, indices);
206  return convert_to_asymmetric<int8_t>(dst_tmp, output_qinfo);
207 }

References arm_compute::test::validation::convert_from_asymmetric(), and arm_compute::test::validation::src.

◆ pooling_3d_layer< uint8_t >()

SimpleTensor<uint8_t> arm_compute::test::validation::reference::pooling_3d_layer< uint8_t > ( const SimpleTensor< uint8_t > &  src,
const Pooling3dLayerInfo pool3d_info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices 
)

Definition at line 210 of file Pooling3dLayer.cpp.

211 {
212  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
213  SimpleTensor<float> dst_tmp = pooling_3d_layer_internal<float>(src_tmp, pool3d_info, indices);
214  return convert_to_asymmetric<uint8_t>(dst_tmp, output_qinfo);
215 }

References arm_compute::test::validation::convert_from_asymmetric(), and arm_compute::test::validation::src.

◆ pooling_3d_layer_internal()

SimpleTensor< T > pooling_3d_layer_internal ( const SimpleTensor< T > &  src,
const Pooling3dLayerInfo pool3d_info,
SimpleTensor< uint32_t > *  indices 
)

Definition at line 40 of file Pooling3dLayer.cpp.

41 {
42  TensorShape pooled_shape = compute_pool3d_shape(src.shape(), pool3d_info);
43  SimpleTensor<T> dst{ pooled_shape, src.data_type(), 1 };
44 
45  if(indices != nullptr)
46  {
47  *indices = SimpleTensor<uint32_t> { pooled_shape, DataType::U32, 1 };
48  }
49 
50  const int idx_channel = 0;
51  const int idx_width = 1;
52  const int idx_height = 2;
53  const int idx_depth = 3;
54  const int idx_batch = 4;
55 
56  const int pool_size_width = pool3d_info.is_global_pooling ? src.shape()[idx_width] : pool3d_info.pool_size.width;
57  const int pool_size_height = pool3d_info.is_global_pooling ? src.shape()[idx_height] : pool3d_info.pool_size.height;
58  const int pool_size_depth = pool3d_info.is_global_pooling ? src.shape()[idx_depth] : pool3d_info.pool_size.depth;
59 
60  const int pool_stride_width = static_cast<int>(pool3d_info.stride.width);
61  const int pool_stride_height = static_cast<int>(pool3d_info.stride.height);
62  const int pool_stride_depth = static_cast<int>(pool3d_info.stride.depth);
63 
64  const int pad_left = static_cast<int>(pool3d_info.padding.left);
65  const int pad_top = static_cast<int>(pool3d_info.padding.top);
66  const int pad_front = static_cast<int>(pool3d_info.padding.front);
67 
68  const int pad_right = static_cast<int>(pool3d_info.padding.right);
69  const int pad_bottom = static_cast<int>(pool3d_info.padding.bottom);
70  const int pad_back = static_cast<int>(pool3d_info.padding.back);
71 
72  const int num_channels = static_cast<int>(src.shape()[idx_channel]);
73  const int num_batches = static_cast<int>(src.shape()[idx_batch]);
74 
75  ARM_COMPUTE_ERROR_ON(num_channels != static_cast<int>(dst.shape()[idx_channel]));
76  ARM_COMPUTE_ERROR_ON(num_batches != static_cast<int>(dst.shape()[idx_batch]));
77 
78  const int w_src = static_cast<int>(src.shape()[idx_width]);
79  const int h_src = static_cast<int>(src.shape()[idx_height]);
80  const int d_src = static_cast<int>(src.shape()[idx_depth]);
81  const int w_dst = static_cast<int>(dst.shape()[idx_width]);
82  const int h_dst = static_cast<int>(dst.shape()[idx_height]);
83  const int d_dst = static_cast<int>(dst.shape()[idx_depth]);
84 
85  const bool exclude_padding = pool3d_info.exclude_padding;
86 
87  const int height_stride_src = num_channels * w_src;
88  const int depth_stride_src = height_stride_src * h_src;
89  const int batch_stride_src = depth_stride_src * d_src;
90  const int height_stride_dst = num_channels * w_dst;
91  const int depth_stride_dst = height_stride_dst * h_dst;
92  const int batch_stride_dst = depth_stride_dst * d_dst;
93 
94  for(int b = 0; b < num_batches; ++b)
95  {
96  const int batch_offset_dst = b * batch_stride_dst;
97  const int batch_offset_src = b * batch_stride_src;
98  for(int c = 0; c < num_channels; ++c)
99  {
100  for(int d = 0; d < d_dst; ++d)
101  {
102  const int depth_offset_dst = d * depth_stride_dst;
103  for(int h = 0; h < h_dst; ++h)
104  {
105  const int height_offset_dst = h * height_stride_dst;
106  for(int w = 0; w < w_dst; ++w)
107  {
108  int wstart = w * pool_stride_width - pad_left;
109  int hstart = h * pool_stride_height - pad_top;
110  int dstart = d * pool_stride_depth - pad_front;
111  int wend = std::min(wstart + pool_size_width, w_src + pad_right);
112  int hend = std::min(hstart + pool_size_height, h_src + pad_bottom);
113  int dend = std::min(dstart + pool_size_depth, d_src + pad_back);
114 
115  // this may not be equal to pool_w * pool_h * pool_d because of
116  // DimensionRoundingType choice (CEIL)
117  int pool_size = (dend - dstart) * (hend - hstart) * (wend - wstart);
118 
119  // limit [start, end) to [0, w_src)
120  wstart = std::max(wstart, 0);
121  hstart = std::max(hstart, 0);
122  dstart = std::max(dstart, 0);
123  wend = std::min(wend, w_src);
124  hend = std::min(hend, h_src);
125  dend = std::min(dend, d_src);
126 
127  auto max_val = -std::numeric_limits<T>::infinity();
128  int max_index{ 0 };
129  T avg_val = static_cast<T>(0.f);
130  T l2_val = static_cast<T>(0.f);
131 
132  if(exclude_padding)
133  {
134  pool_size = (dend - dstart) * (hend - hstart) * (wend - wstart);
135  }
136 
137  for(int z = dstart; z < dend; ++z)
138  {
139  const int depth_offset_src = z * depth_stride_src;
140  for(int y = hstart; y < hend; ++y)
141  {
142  const int height_offset_src = y * height_stride_src;
143  for(int x = wstart; x < wend; ++x)
144  {
145  const auto val = static_cast<T>(
146  src[batch_offset_src + depth_offset_src + height_offset_src + x * num_channels + c]);
147  if(val > max_val)
148  {
149  max_val = val;
150  max_index = coord2index(src.shape(), Coordinates(c, x, y, z, 0));
151  }
152 
153  avg_val += val;
154  l2_val += val * val;
155  }
156  }
157  }
158 
159  avg_val /= pool_size;
160  l2_val = static_cast<T>(std::sqrt(l2_val / pool_size));
161 
162  int dst_index = batch_offset_dst + depth_offset_dst + height_offset_dst + w * num_channels + c;
163  switch(pool3d_info.pool_type)
164  {
165  case PoolingType::MAX:
166  dst[dst_index] = static_cast<T>(max_val);
167  break;
168  case PoolingType::AVG:
169  dst[dst_index] = static_cast<T>(avg_val);
170  break;
171  case PoolingType::L2:
172  dst[dst_index] = static_cast<T>(l2_val);
173  break;
174  default:
175  ARM_COMPUTE_ERROR("Pooling Type should be either MAX, AVG or L2");
176  }
177 
178  if(indices != nullptr)
179  {
180  (*indices)[dst_index] = max_index;
181  }
182  }
183  }
184  }
185  }
186  }
187 
188  return dst;
189 }

References ARM_COMPUTE_ERROR, ARM_COMPUTE_ERROR_ON, arm_compute::AVG, arm_compute::test::validation::b, Padding3D::back, Padding3D::bottom, arm_compute::misc::shape_calculator::compute_pool3d_shape(), arm_compute::test::coord2index(), Size3D::depth, arm_compute::test::validation::dst, Pooling3dLayerInfo::exclude_padding, Padding3D::front, Size3D::height, arm_compute::test::validation::idx_height, arm_compute::test::validation::idx_width, Pooling3dLayerInfo::is_global_pooling, arm_compute::L2, Padding3D::left, arm_compute::MAX, Pooling3dLayerInfo::padding, Pooling3dLayerInfo::pool_size, Pooling3dLayerInfo::pool_type, Padding3D::right, arm_compute::test::validation::src, Pooling3dLayerInfo::stride, Padding3D::top, arm_compute::U32, arm_compute::test::validation::w, and Size3D::width.

◆ pooling_layer() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::pooling_layer ( const SimpleTensor< float > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices,
DataLayout  data_layout 
)

◆ pooling_layer() [2/3]

SimpleTensor<half> arm_compute::test::validation::reference::pooling_layer ( const SimpleTensor< half > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices,
DataLayout  data_layout 
)

Definition at line 217 of file PoolingLayer.cpp.

218 {
219  ARM_COMPUTE_UNUSED(output_qinfo);
220  if(src.data_type() == DataType::F16 && info.fp_mixed_precision)
221  {
223  }
224 
226 }

References ARM_COMPUTE_UNUSED, arm_compute::test::validation::data_layout, arm_compute::F16, arm_compute::test::validation::info, pooling_layer_internal< half >(), pooling_layer_internal< half, float >(), and arm_compute::test::validation::src.

◆ pooling_layer() [3/3]

SimpleTensor< T > pooling_layer ( const SimpleTensor< T > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices,
DataLayout  data_layout 
)

Definition at line 191 of file PoolingLayer.cpp.

192 {
193  ARM_COMPUTE_UNUSED(output_qinfo);
194  return pooling_layer_internal<T, T>(src, info, indices, data_layout);
195 }

References ARM_COMPUTE_UNUSED, arm_compute::test::validation::data_layout, arm_compute::test::validation::info, and arm_compute::test::validation::src.

◆ pooling_layer< int8_t >()

SimpleTensor<int8_t> arm_compute::test::validation::reference::pooling_layer< int8_t > ( const SimpleTensor< int8_t > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices,
DataLayout  data_layout 
)

Definition at line 208 of file PoolingLayer.cpp.

209 {
210  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
211  SimpleTensor<float> dst_tmp = pooling_layer_internal<float>(src_tmp, info, indices, data_layout);
212  SimpleTensor<int8_t> dst = convert_to_asymmetric<int8_t>(dst_tmp, output_qinfo);
213  return dst;
214 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::data_layout, arm_compute::test::validation::dst, arm_compute::test::validation::info, pooling_layer_internal< float >(), and arm_compute::test::validation::src.

◆ pooling_layer< uint8_t >()

SimpleTensor<uint8_t> arm_compute::test::validation::reference::pooling_layer< uint8_t > ( const SimpleTensor< uint8_t > &  src,
const PoolingLayerInfo info,
const QuantizationInfo output_qinfo,
SimpleTensor< uint32_t > *  indices,
DataLayout  data_layout 
)

Definition at line 198 of file PoolingLayer.cpp.

200 {
201  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
202  SimpleTensor<float> dst_tmp = pooling_layer_internal<float>(src_tmp, info, indices, data_layout);
203  SimpleTensor<uint8_t> dst = convert_to_asymmetric<uint8_t>(dst_tmp, output_qinfo);
204  return dst;
205 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::data_layout, arm_compute::test::validation::dst, arm_compute::test::validation::info, pooling_layer_internal< float >(), and arm_compute::test::validation::src.

◆ pooling_layer_internal()

SimpleTensor< T > pooling_layer_internal ( const SimpleTensor< T > &  src,
const PoolingLayerInfo info,
SimpleTensor< uint32_t > *  indices,
DataLayout  data_layout 
)

Definition at line 41 of file PoolingLayer.cpp.

42 {
43  // Create reference
44  SimpleTensor<T> dst{ compute_pool_shape(TensorInfo(src.shape(), 1, src.data_type()), info), src.data_type(), 1 };
45  auto pooled_shape = compute_pool_shape(TensorInfo(src.shape(), 1, src.data_type()), info);
46  if(indices)
47  {
48  *indices = SimpleTensor<uint32_t> { pooled_shape, DataType::U32, 1 };
49  }
50  const int pool_size_x = info.is_global_pooling ? src.shape().x() : info.pool_size.width;
51  const int pool_size_y = info.is_global_pooling ? src.shape().y() : info.pool_size.height;
52  PoolingType type = info.pool_type;
53  int pool_stride_x = info.pad_stride_info.stride().first;
54  int pool_stride_y = info.pad_stride_info.stride().second;
55  int pad_left = info.pad_stride_info.pad_left();
56  int pad_top = info.pad_stride_info.pad_top();
57  int pad_right = info.pad_stride_info.pad_right();
58  int pad_bottom = info.pad_stride_info.pad_bottom();
59  bool exclude_padding = info.exclude_padding;
60 
61  const auto w_src = static_cast<int>(src.shape()[0]);
62  const auto h_src = static_cast<int>(src.shape()[1]);
63  const auto z_src = static_cast<int>(src.shape()[2]);
64  const auto b_src = static_cast<int>(src.shape()[3]);
65 
66  const int upper_dims = src.shape().total_size() / (w_src * h_src);
67 
68  const auto w_dst = static_cast<int>(dst.shape()[0]);
69  const auto h_dst = static_cast<int>(dst.shape()[1]);
70  const auto z_dst = static_cast<int>(dst.shape()[2]);
71 
72  TensorShape shape_nhwc(src.shape());
73  permute(shape_nhwc, PermutationVector(2U, 0U, 1U));
74  if(type == PoolingType::MAX)
75  {
76  for(int b = 0; b < b_src; ++b)
77  {
78  for(int r = 0; r < z_src; ++r)
79  {
80  for(int h = 0; h < h_dst; ++h)
81  {
82  for(int w = 0; w < w_dst; ++w)
83  {
84  int wstart = w * pool_stride_x - pad_left;
85  int hstart = h * pool_stride_y - pad_top;
86 
87  // Used to calculate kernel indices
88  int kh_start = std::max(0, -hstart);
89  int kw_start = std::max(0, -wstart);
90  int max_ker_index{ 0 };
91 
92  int wend = std::min(wstart + pool_size_x, w_src);
93  int hend = std::min(hstart + pool_size_y, h_src);
94  wstart = std::max(wstart, 0);
95  hstart = std::max(hstart, 0);
96  auto max_val = info.use_inf_as_limit ? -std::numeric_limits<ACC_T>::infinity() : std::numeric_limits<ACC_T>::lowest();
97  int max_index{ 0 };
98 
99  for(int y = hstart, kh = kh_start; y < hend; ++y, ++kh)
100  {
101  for(int x = wstart, kw = kw_start; x < wend; ++x, ++kw)
102  {
103  const auto val = static_cast<ACC_T>(src[b * z_src * h_src * w_src + r * h_src * w_src + y * w_src + x]);
104  if(val > max_val)
105  {
106  max_val = val;
107  max_ker_index = pool_size_x * (kh) + (kw);
108  if(data_layout == DataLayout::NCHW)
109  {
110  max_index = coord2index(src.shape(), Coordinates(x, y, r, 0));
111  }
112  else
113  {
114  max_index = coord2index(shape_nhwc, Coordinates(r, x, y, 0));
115  }
116  }
117  }
118  }
119 
120  dst[b * z_dst * h_dst * w_dst + r * h_dst * w_dst + h * w_dst + w] = static_cast<T>(max_val);
121  if(indices)
122  {
123  (*indices)[b * z_dst * h_dst * w_dst + r * h_dst * w_dst + h * w_dst + w] = (info.use_kernel_indices) ? max_ker_index : max_index;
124  }
125  }
126  }
127  }
128  }
129  }
130  else // Average or l2 pooling
131  {
132  for(int r = 0; r < upper_dims; ++r)
133  {
134  for(int h = 0; h < h_dst; ++h)
135  {
136  for(int w = 0; w < w_dst; ++w)
137  {
138  ACC_T avg_val(0);
139  int wstart = w * pool_stride_x - pad_left;
140  int hstart = h * pool_stride_y - pad_top;
141  int wend = std::min(wstart + pool_size_x, w_src + pad_right);
142  int hend = std::min(hstart + pool_size_y, h_src + pad_bottom);
143  int pool = (hend - hstart) * (wend - wstart);
144  wstart = std::max(wstart, 0);
145  hstart = std::max(hstart, 0);
146  wend = std::min(wend, w_src);
147  hend = std::min(hend, h_src);
148  // Exclude padding pixels from the average
149  if(exclude_padding)
150  {
151  pool = (hend - hstart) * (wend - wstart);
152  }
153 
154  if(type == PoolingType::AVG)
155  {
156  for(int y = hstart; y < hend; ++y)
157  {
158  for(int x = wstart; x < wend; ++x)
159  {
160  avg_val += static_cast<ACC_T>(src[r * h_src * w_src + y * w_src + x]);
161  }
162  }
163  dst[r * h_dst * w_dst + h * w_dst + w] = avg_val / pool;
164  }
165  else
166  {
167  for(int y = hstart; y < hend; ++y)
168  {
169  for(int x = wstart; x < wend; ++x)
170  {
171  const auto val = static_cast<ACC_T>(src[r * h_src * w_src + y * w_src + x]);
172  avg_val += val * val;
173  }
174  }
175  dst[r * h_dst * w_dst + h * w_dst + w] = static_cast<T>(std::sqrt(avg_val / pool));
176  }
177  }
178  }
179  }
180  }
181  return dst;
182 }

References arm_compute::AVG, arm_compute::test::validation::b, arm_compute::misc::shape_calculator::compute_pool_shape(), arm_compute::test::coord2index(), arm_compute::test::validation::data_layout, arm_compute::test::validation::dst, arm_compute::test::validation::info, arm_compute::support::cpp11::lowest(), arm_compute::MAX, arm_compute::NCHW, permute(), arm_compute::test::validation::src, type, arm_compute::utils::cast::U, arm_compute::U32, and arm_compute::test::validation::w.

◆ pooling_layer_internal< float >()

template SimpleTensor<float> arm_compute::test::validation::reference::pooling_layer_internal< float > ( const SimpleTensor< float > &  src,
const PoolingLayerInfo info,
SimpleTensor< uint32_t > *  indices,
DataLayout  data_layout 
)

◆ pooling_layer_internal< half >()

template SimpleTensor<half> arm_compute::test::validation::reference::pooling_layer_internal< half > ( const SimpleTensor< half > &  src,
const PoolingLayerInfo info,
SimpleTensor< uint32_t > *  indices,
DataLayout  data_layout 
)

Referenced by pooling_layer().

◆ pooling_layer_internal< half, float >()

template SimpleTensor<half> arm_compute::test::validation::reference::pooling_layer_internal< half, float > ( const SimpleTensor< half > &  src,
const PoolingLayerInfo info,
SimpleTensor< uint32_t > *  indices,
DataLayout  data_layout 
)

Referenced by pooling_layer().

◆ prior_box_layer() [1/2]

template SimpleTensor<float> arm_compute::test::validation::reference::prior_box_layer ( const SimpleTensor< float > &  src1,
const SimpleTensor< float > &  src2,
const PriorBoxLayerInfo info,
const TensorShape output_shape 
)

◆ prior_box_layer() [2/2]

SimpleTensor< T > prior_box_layer ( const SimpleTensor< T > &  src1,
const SimpleTensor< T > &  src2,
const PriorBoxLayerInfo info,
const TensorShape output_shape 
)

Definition at line 39 of file PriorBoxLayer.cpp.

40 {
41  const auto layer_width = static_cast<int>(src1.shape()[0]);
42  const auto layer_height = static_cast<int>(src1.shape()[1]);
43 
44  int img_width = info.img_size().x;
45  int img_height = info.img_size().y;
46  if(img_width == 0 || img_height == 0)
47  {
48  img_width = static_cast<int>(src2.shape()[0]);
49  img_height = static_cast<int>(src2.shape()[1]);
50  }
51 
52  float step_x = info.steps()[0];
53  float step_y = info.steps()[1];
54  if(step_x == 0.f || step_y == 0.f)
55  {
56  step_x = static_cast<float>(img_width) / layer_width;
57  step_x = static_cast<float>(img_height) / layer_height;
58  }
59 
60  // Calculate number of aspect ratios
61  const int num_priors = info.aspect_ratios().size() * info.min_sizes().size() + info.max_sizes().size();
62  const int total_elements = layer_width * layer_height * num_priors * 4;
63 
64  SimpleTensor<T> result(output_shape, src1.data_type());
65 
66  int idx = 0;
67  for(int y = 0; y < layer_height; ++y)
68  {
69  for(int x = 0; x < layer_width; ++x)
70  {
71  const float center_x = (x + info.offset()) * step_x;
72  const float center_y = (y + info.offset()) * step_y;
73  float box_width;
74  float box_height;
75  for(unsigned int i = 0; i < info.min_sizes().size(); ++i)
76  {
77  const float min_size = info.min_sizes().at(i);
78  box_width = min_size;
79  box_height = min_size;
80  // (xmin, ymin, xmax, ymax)
81  result[idx++] = (center_x - box_width / 2.f) / img_width;
82  result[idx++] = (center_y - box_height / 2.f) / img_height;
83  result[idx++] = (center_x + box_width / 2.f) / img_width;
84  result[idx++] = (center_y + box_height / 2.f) / img_height;
85 
86  if(!info.max_sizes().empty())
87  {
88  const float max_size = info.max_sizes().at(i);
89  box_width = sqrt(min_size * max_size);
90  box_height = box_width;
91 
92  // (xmin, ymin, xmax, ymax)
93  result[idx++] = (center_x - box_width / 2.f) / img_width;
94  result[idx++] = (center_y - box_height / 2.f) / img_height;
95  result[idx++] = (center_x + box_width / 2.f) / img_width;
96  result[idx++] = (center_y + box_height / 2.f) / img_height;
97  }
98 
99  // rest of priors
100  for(auto ar : info.aspect_ratios())
101  {
102  if(fabs(ar - 1.) < 1e-6)
103  {
104  continue;
105  }
106 
107  box_width = min_size * sqrt(ar);
108  box_height = min_size / sqrt(ar);
109 
110  // (xmin, ymin, xmax, ymax)
111  result[idx++] = (center_x - box_width / 2.f) / img_width;
112  result[idx++] = (center_y - box_height / 2.f) / img_height;
113  result[idx++] = (center_x + box_width / 2.f) / img_width;
114  result[idx++] = (center_y + box_height / 2.f) / img_height;
115  }
116  }
117  }
118  }
119 
120  // clip the coordinates
121  if(info.clip())
122  {
123  for(int i = 0; i < total_elements; ++i)
124  {
125  result[i] = std::min<T>(std::max<T>(result[i], 0.f), 1.f);
126  }
127  }
128 
129  // set the variance.
130  if(info.variances().size() == 1)
131  {
132  std::fill_n(result.data() + idx, total_elements, info.variances().at(0));
133  }
134  else
135  {
136  for(int h = 0; h < layer_height; ++h)
137  {
138  for(int w = 0; w < layer_width; ++w)
139  {
140  for(int i = 0; i < num_priors; ++i)
141  {
142  for(int j = 0; j < 4; ++j)
143  {
144  result[idx++] = info.variances().at(j);
145  }
146  }
147  }
148  }
149  }
150 
151  return result;
152 }

References SimpleTensor< T >::data(), SimpleTensor< T >::data_type(), arm_compute::test::validation::info, arm_compute::test::validation::output_shape, SimpleTensor< T >::shape(), and arm_compute::test::validation::w.

◆ qlstm_layer_normalization()

SimpleTensor< int16_t > qlstm_layer_normalization ( const SimpleTensor< int16_t > &  src,
const SimpleTensor< int16_t > &  weight,
const SimpleTensor< int32_t > &  bias 
)

Definition at line 40 of file QLSTMLayerNormalization.cpp.

41 {
42  ARM_COMPUTE_ERROR_ON(src.shape().num_dimensions() > 2);
43  SimpleTensor<int16_t> output{ src.shape(), DataType::QSYMM16 };
44 
45  const auto wq_info = weight.quantization_info().uniform();
46  int output_multiplier{};
47  int output_shift{};
48  const auto s = quantization::calculate_quantized_multiplier(wq_info.scale, &output_multiplier, &output_shift);
49  output_shift *= -1;
50 
51  if(!bool(s))
52  {
53  output_multiplier = 0;
54  output_shift = 0;
55  }
56 
57  const uint32_t num_batch = src.shape()[1];
58  const uint32_t num_input = src.shape()[0];
59 
60  for(uint32_t batch_idx = 0; batch_idx < num_batch; ++batch_idx)
61  {
62  int64_t sum{};
63  int64_t sum_sq{};
64 
65  for(uint32_t input_idx = 0; input_idx < num_input; ++input_idx)
66  {
67  const auto index = batch_idx * num_input + input_idx;
68  const auto val = static_cast<int32_t>(src[index]);
69  sum += val;
70  sum_sq += val * val;
71  }
72 
73  const auto temp = static_cast<int64_t>(0x100000) / num_input;
74  const auto mean = sum * 1024 / static_cast<int64_t>(num_input);
75  const auto variance = ((sum_sq * temp) - (mean * mean)) / 0x100000;
76 
77  int32_t stddev_invsqrt_mul{};
78  int32_t stddev_invsqrt_shift{};
79  quantization::get_invsqrt_quantized_multiplier_exp(variance, -1, stddev_invsqrt_mul, stddev_invsqrt_shift);
80 
81  for(uint32_t input_idx = 0; input_idx < num_input; ++input_idx)
82  {
83  const auto index = batch_idx * num_input + input_idx;
84  const auto val = static_cast<int32_t>(src[index]);
85  const auto shifted = (val << 10) - mean;
86  const auto rescaled = quantization::multiply_by_quantized_multiplier(shifted, stddev_invsqrt_mul, stddev_invsqrt_shift);
87  const int64_t weighted = rescaled * weight[input_idx] + bias[input_idx];
88  const auto reverse_shifted = static_cast<int32_t>((weighted + 512) >> 10);
89  auto out_val = quantization::multiply_by_quantized_multiplier(reverse_shifted, output_multiplier, output_shift + 12);
90  out_val = arm_compute::utility::clamp<decltype(out_val), int16_t>(out_val, std::numeric_limits<int16_t>::min());
91  output[index] = static_cast<int16_t>(out_val);
92  }
93  }
94  return output;
95 }

References ARM_COMPUTE_ERROR_ON, bias, arm_compute::quantization::calculate_quantized_multiplier(), arm_compute::quantization::get_invsqrt_quantized_multiplier_exp(), arm_compute::quantization::multiply_by_quantized_multiplier(), arm_compute::QSYMM16, SimpleTensor< T >::quantization_info(), and arm_compute::test::validation::src.

◆ quantization_layer() [1/5]

template SimpleTensor< uint16_t > quantization_layer ( const SimpleTensor< float > &  src,
DataType  output_data_type,
const QuantizationInfo quantization_info 
)

◆ quantization_layer() [2/5]

template SimpleTensor< uint16_t > quantization_layer ( const SimpleTensor< half > &  src,
DataType  output_data_type,
const QuantizationInfo quantization_info 
)

◆ quantization_layer() [3/5]

SimpleTensor< int8_t > quantization_layer ( const SimpleTensor< int8_t > &  src,
DataType  output_data_type,
const QuantizationInfo quantization_info 
)

Definition at line 104 of file QuantizationLayer.cpp.

105 {
106  SimpleTensor<float> src_tmp = convert_from_asymmetric<int8_t>(src);
107  return quantization_layer<float, uint8_t>(src_tmp, output_data_type, quantization_info);
108 }

References arm_compute::test::validation::src.

◆ quantization_layer() [4/5]

SimpleTensor< Tout > quantization_layer ( const SimpleTensor< Tin > &  src,
DataType  output_data_type,
const QuantizationInfo quantization_info 
)

Definition at line 37 of file QuantizationLayer.cpp.

38 {
39  // Create reference
40  SimpleTensor<Tout> dst{ src.shape(), output_data_type, 1, quantization_info };
41 
42  const UniformQuantizationInfo qinfo = quantization_info.uniform();
43 
44 #ifdef __aarch64__
45  constexpr auto rounding_policy = RoundingPolicy::TO_NEAREST_EVEN;
46 #else // __aarch64__
47  constexpr auto rounding_policy = RoundingPolicy::TO_ZERO;
48 #endif // __aarch64__
49 
50  switch(output_data_type)
51  {
52  case DataType::QASYMM8:
53 #if defined(_OPENMP)
54  #pragma omp parallel for
55 #endif /* _OPENMP */
56  for(int i = 0; i < src.num_elements(); ++i)
57  {
58  dst[i] = quantize_qasymm8((src[i]), qinfo, rounding_policy);
59  }
60  break;
61  case DataType::QASYMM8_SIGNED:
62 #if defined(_OPENMP)
63  #pragma omp parallel for
64 #endif /* _OPENMP */
65  for(int i = 0; i < src.num_elements(); ++i)
66  {
67 #ifdef __aarch64__
68  dst[i] = quantize_qasymm8_signed((src[i]), qinfo, RoundingPolicy::TO_NEAREST_EVEN);
69 #else // __aarch64__
70  dst[i] = quantize_qasymm8_signed((src[i]), qinfo, RoundingPolicy::TO_ZERO);
71 #endif // __aarch64__
72  }
73  break;
74  case DataType::QASYMM16:
75 #if defined(_OPENMP)
76  #pragma omp parallel for
77 #endif /* _OPENMP */
78  for(int i = 0; i < src.num_elements(); ++i)
79  {
80  dst[i] = quantize_qasymm16((src[i]), qinfo, rounding_policy);
81  }
82  break;
83  default:
84  ARM_COMPUTE_ERROR("Unsupported output data type");
85  }
86  return dst;
87 }

References ARM_COMPUTE_ERROR, arm_compute::test::validation::dst, arm_compute::QASYMM16, arm_compute::QASYMM8, arm_compute::QASYMM8_SIGNED, arm_compute::test::validation::qinfo, arm_compute::quantize_qasymm16(), arm_compute::quantize_qasymm8(), arm_compute::quantize_qasymm8_signed(), arm_compute::test::validation::src, arm_compute::TO_NEAREST_EVEN, arm_compute::TO_ZERO, and QuantizationInfo::uniform().

◆ quantization_layer() [5/5]

SimpleTensor< uint16_t > quantization_layer ( const SimpleTensor< uint8_t > &  src,
DataType  output_data_type,
const QuantizationInfo quantization_info 
)

Definition at line 90 of file QuantizationLayer.cpp.

91 {
92  SimpleTensor<float> src_tmp = convert_from_asymmetric<uint8_t>(src);
93  return quantization_layer<float, uint8_t>(src_tmp, output_data_type, quantization_info);
94 }

References arm_compute::test::validation::src.

◆ range() [1/7]

template SimpleTensor<float> arm_compute::test::validation::reference::range ( SimpleTensor< float > &  dst,
float  start,
const size_t  num_of_elements,
float  step 
)

◆ range() [2/7]

template SimpleTensor<half> arm_compute::test::validation::reference::range ( SimpleTensor< half > &  dst,
float  start,
const size_t  num_of_elements,
float  step 
)

◆ range() [3/7]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::range ( SimpleTensor< int16_t > &  dst,
float  start,
const size_t  num_of_elements,
float  step 
)

◆ range() [4/7]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::range ( SimpleTensor< int8_t > &  dst,
float  start,
const size_t  num_of_elements,
float  step 
)

◆ range() [5/7]

SimpleTensor< T > range ( SimpleTensor< T > &  dst,
float  start,
const size_t  num_of_elements,
float  step 
)

◆ range() [6/7]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::range ( SimpleTensor< uint16_t > &  dst,
float  start,
const size_t  num_of_elements,
float  step 
)

◆ range() [7/7]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::range ( SimpleTensor< uint8_t > &  dst,
float  start,
const size_t  num_of_elements,
float  step 
)

Definition at line 57 of file Range.cpp.

58 {
59  if(dst.data_type() == DataType::QASYMM8)
60  {
61  SimpleTensor<float> dst_tmp{ dst.shape(), DataType::F32, 1 };
62  generate_range(dst_tmp, start, num_of_elements, step);
63  return convert_to_asymmetric<uint8_t>(dst_tmp, dst.quantization_info());
64  }
65  generate_range(dst, start, num_of_elements, step);
66  return dst;
67 }

References arm_compute::test::validation::dst, arm_compute::F32, arm_compute::QASYMM8, and arm_compute::cpu::step.

◆ rdft_1d() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::rdft_1d ( const SimpleTensor< float > &  src)

◆ rdft_1d() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::rdft_1d ( const SimpleTensor< half > &  src)

◆ rdft_1d() [3/3]

SimpleTensor< T > rdft_1d ( const SimpleTensor< T > &  src)

Performs an one dimensional DFT on a real input.

Parameters
[in]srcSource tensor.
Returns
Complex output of length n/2 + 1 due to symmetry.

Definition at line 313 of file DFT.cpp.

314 {
315  return rdft_1d_core(src, FFTDirection::Forward, false);
316 }

References Forward, and arm_compute::test::validation::src.

Referenced by arm_compute::test::validation::DATA_TEST_CASE().

◆ rdft_2d() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::rdft_2d ( const SimpleTensor< float > &  src)

◆ rdft_2d() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::rdft_2d ( const SimpleTensor< half > &  src)

◆ rdft_2d() [3/3]

SimpleTensor< T > rdft_2d ( const SimpleTensor< T > &  src)

Performs a two dimensional DFT on a real input.

Parameters
[in]srcSource tensor.
Returns
Complex output of length n/2 + 1 across width due to symmetry and height of same size as the input.

Definition at line 342 of file DFT.cpp.

343 {
344  ARM_COMPUTE_ERROR_ON(src.num_channels() != 1);
345  constexpr FFTDirection direction = FFTDirection::Forward;
346 
347  auto first_pass = rdft_1d_core(src, direction, false);
348  auto transposed = permute(first_pass, PermutationVector(1U, 0U));
349  auto second_pass = dft_1d_core(transposed, direction);
350  return permute(second_pass, PermutationVector(1U, 0U));
351 }

References ARM_COMPUTE_ERROR_ON, Forward, permute(), arm_compute::test::validation::src, and arm_compute::utils::cast::U.

Referenced by conv2d_dft().

◆ reduction_operation() [1/6]

template SimpleTensor< int64_t > reduction_operation ( const SimpleTensor< float > &  src,
const TensorShape dst_shape,
unsigned int  axis,
ReductionOperation  op,
DataType  output_type = DataType::S32,
QuantizationInfo  quantization_info_output = QuantizationInfo(),
RoundingPolicy  policy = RoundingPolicy::TO_ZERO 
)

◆ reduction_operation() [2/6]

template SimpleTensor< int32_t > reduction_operation ( const SimpleTensor< half > &  src,
const TensorShape dst_shape,
unsigned int  axis,
ReductionOperation  op,
DataType  output_type = DataType::S32,
QuantizationInfo  quantization_info_output = QuantizationInfo(),
RoundingPolicy  policy = RoundingPolicy::TO_ZERO 
)

◆ reduction_operation() [3/6]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::reduction_operation ( const SimpleTensor< int32_t > &  src,
const TensorShape dst_shape,
unsigned int  axis,
ReductionOperation  op,
DataType  output_type = DataType::S32,
QuantizationInfo  quantization_info_output = QuantizationInfo(),
RoundingPolicy  policy = RoundingPolicy::TO_ZERO 
)

◆ reduction_operation() [4/6]

template SimpleTensor< int32_t > reduction_operation ( const SimpleTensor< int8_t > &  src,
const TensorShape dst_shape,
unsigned int  axis,
ReductionOperation  op,
DataType  output_type,
QuantizationInfo  quantization_info_output,
RoundingPolicy  policy 
)

Definition at line 310 of file ReductionOperation.cpp.

312 {
313  if(src.data_type() == DataType::QASYMM8_SIGNED)
314  {
315  // If the operation is MEAN_SUM, we can directly use the int8 implementation without taking into account scale and offset
316  if(op == ReductionOperation::MEAN_SUM && src.quantization_info() == quantization_info_output)
317  {
318  return compute_reduction_operation<int8_t, int8_t>(src, dst_shape, axis, op, output_type, policy);
319  }
320  else
321  {
322  SimpleTensor<float> src_f = convert_from_asymmetric(src);
323  SimpleTensor<float> dst_f = reference::reduction_operation<float, float>(src_f, dst_shape, axis, op, output_type);
324  return convert_to_asymmetric<int8_t>(dst_f, quantization_info_output);
325  }
326  }
327  else
328  {
329  return compute_reduction_operation<int8_t, int8_t>(src, dst_shape, axis, op, output_type, policy);
330  }
331 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst_shape, arm_compute::MEAN_SUM, arm_compute::QASYMM8_SIGNED, and arm_compute::test::validation::src.

◆ reduction_operation() [5/6]

SimpleTensor< OT > reduction_operation ( const SimpleTensor< T > &  src,
const TensorShape dst_shape,
unsigned int  axis,
ReductionOperation  op,
DataType  output_type,
QuantizationInfo  quantization_info_output,
RoundingPolicy  policy 
)

Definition at line 278 of file ReductionOperation.cpp.

280 {
281  ARM_COMPUTE_UNUSED(quantization_info_output);
282  return compute_reduction_operation<T, OT>(src, dst_shape, axis, op, output_type, policy);
283 }

References ARM_COMPUTE_UNUSED, arm_compute::test::validation::dst_shape, and arm_compute::test::validation::src.

◆ reduction_operation() [6/6]

template SimpleTensor< int32_t > reduction_operation ( const SimpleTensor< uint8_t > &  src,
const TensorShape dst_shape,
unsigned int  axis,
ReductionOperation  op,
DataType  output_type,
QuantizationInfo  quantization_info_output,
RoundingPolicy  policy 
)

Definition at line 286 of file ReductionOperation.cpp.

288 {
289  if(src.data_type() == DataType::QASYMM8)
290  {
291  // If the operation is MEAN_SUM, we can directly use the uint8 implementation without taking into account scale and offset
292  if(op == ReductionOperation::MEAN_SUM && src.quantization_info() == quantization_info_output)
293  {
294  return compute_reduction_operation<uint8_t, uint8_t>(src, dst_shape, axis, op, output_type, policy);
295  }
296  else
297  {
298  SimpleTensor<float> src_f = convert_from_asymmetric(src);
299  SimpleTensor<float> dst_f = reference::reduction_operation<float, float>(src_f, dst_shape, axis, op, output_type);
300  return convert_to_asymmetric<uint8_t>(dst_f, quantization_info_output);
301  }
302  }
303  else
304  {
305  return compute_reduction_operation<uint8_t, uint8_t>(src, dst_shape, axis, op, output_type, policy);
306  }
307 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst_shape, arm_compute::MEAN_SUM, arm_compute::QASYMM8, and arm_compute::test::validation::src.

◆ reorder_layer() [1/2]

template SimpleTensor<float> arm_compute::test::validation::reference::reorder_layer ( const SimpleTensor< float > &  src,
const TensorShape output_shape,
WeightFormat  output_wf 
)

◆ reorder_layer() [2/2]

SimpleTensor< T > reorder_layer ( const SimpleTensor< T > &  src,
const TensorShape output_shape,
WeightFormat  output_wf 
)

Definition at line 126 of file Reorder.cpp.

127 {
128  SimpleTensor<T> dst{ output_shape, src.data_type() };
129  const int cols = src.shape()[0];
130  const int rows = src.shape()[1];
131 
132  switch(output_wf)
133  {
134  case WeightFormat::OHWIo4:
135  {
136  Transform_ref<4, 1, true, sizeof(float), sizeof(float), float, arm_gemm::VLType::None>::Transform<SimpleTensor<T> &, SimpleTensor<T>>(dst, src, rows, 0, rows, 0, cols);
137  break;
138  }
139  case WeightFormat::OHWIo8:
140  {
141  Transform_ref<8, 1, true, sizeof(float), sizeof(float), float, arm_gemm::VLType::None>::Transform<SimpleTensor<T> &, SimpleTensor<T>>(dst, src, rows, 0, rows, 0, cols);
142  break;
143  }
144  default:
145  break;
146  }
147 
148  return dst;
149 }

References caffe_mnist_image_extractor::cols, arm_compute::test::validation::dst, arm_gemm::None, arm_compute::OHWIo4, arm_compute::OHWIo8, arm_compute::test::validation::output_shape, caffe_mnist_image_extractor::rows, and arm_compute::test::validation::src.

◆ reorg_layer() [1/4]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::reorg_layer ( const SimpleTensor< int16_t > &  src,
int32_t  stride 
)

◆ reorg_layer() [2/4]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::reorg_layer ( const SimpleTensor< int32_t > &  src,
int32_t  stride 
)

◆ reorg_layer() [3/4]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::reorg_layer ( const SimpleTensor< int8_t > &  src,
int32_t  stride 
)

◆ reorg_layer() [4/4]

SimpleTensor< T > reorg_layer ( const SimpleTensor< T > &  src,
int32_t  stride 
)

Definition at line 38 of file ReorgLayer.cpp.

39 {
40  ARM_COMPUTE_ERROR_ON(src.shape().num_dimensions() > 4);
41  ARM_COMPUTE_ERROR_ON(src.data_layout() != DataLayout::NCHW);
42 
43  TensorInfo input_info(src.shape(), 1, src.data_type());
45 
46  // Create destination tensor
47  SimpleTensor<T> dst{ output_shape, src.data_type() };
48 
49  const unsigned int W = dst.shape().x();
50  const unsigned int H = dst.shape().y();
51  const unsigned int C = dst.shape().z();
52  const unsigned int out_c = C / (stride * stride);
53  const unsigned int outer_dims = dst.shape().total_size() / (W * H * C);
54 
55  // Calculate layer reorg in NCHW
56  Coordinates map_coords;
57 
58 #if defined(_OPENMP)
59  #pragma omp parallel for private(map_coords)
60 #endif /* _OPENMP */
61  for(unsigned int b = 0; b < outer_dims; ++b)
62  {
63  map_coords.set(3, b);
64  for(unsigned int c = 0; c < C; ++c)
65  {
66  map_coords.set(2, c % out_c);
67  const unsigned int offset = c / out_c;
68  for(unsigned int h = 0; h < H; ++h)
69  {
70  map_coords.set(1, h * stride + offset / stride);
71  for(unsigned int w = 0; w < W; ++w)
72  {
73  const unsigned int dst_idx = w + W * (h + H * (c + C * b));
74  map_coords.set(0, w * stride + offset % stride);
75  dst[dst_idx] = *reinterpret_cast<const T *>(src(map_coords));
76  }
77  }
78  }
79  }
80 
81  return dst;
82 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::b, arm_compute::misc::shape_calculator::compute_reorg_output_shape(), arm_compute::test::validation::dst, arm_compute::test::validation::input_info, arm_compute::NCHW, offset(), arm_compute::test::validation::output_shape, Dimensions< T >::set(), arm_compute::test::validation::src, and arm_compute::test::validation::w.

◆ reshape_layer() [1/10]

template SimpleTensor<bfloat16> arm_compute::test::validation::reference::reshape_layer ( const SimpleTensor< bfloat16 > &  src,
const TensorShape output_shape 
)

◆ reshape_layer() [2/10]

template SimpleTensor<float> arm_compute::test::validation::reference::reshape_layer ( const SimpleTensor< float > &  src,
const TensorShape output_shape 
)

◆ reshape_layer() [3/10]

template SimpleTensor<half> arm_compute::test::validation::reference::reshape_layer ( const SimpleTensor< half > &  src,
const TensorShape output_shape 
)

◆ reshape_layer() [4/10]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::reshape_layer ( const SimpleTensor< int16_t > &  src,
const TensorShape output_shape 
)

◆ reshape_layer() [5/10]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::reshape_layer ( const SimpleTensor< int32_t > &  src,
const TensorShape output_shape 
)

◆ reshape_layer() [6/10]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::reshape_layer ( const SimpleTensor< int8_t > &  src,
const TensorShape output_shape 
)

◆ reshape_layer() [7/10]

SimpleTensor< T > reshape_layer ( const SimpleTensor< T > &  src,
const TensorShape output_shape 
)

[ReshapeLayer]

Definition at line 38 of file ReshapeLayer.cpp.

39 {
40  ARM_COMPUTE_ERROR_ON(src.shape().total_size() != output_shape.total_size());
41 
42  SimpleTensor<T> dst(output_shape, src.data_type());
43  std::copy_n(src.data(), src.num_elements(), dst.data());
44  return dst;
45 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::dst, arm_compute::test::validation::output_shape, arm_compute::test::validation::src, and TensorShape::total_size().

◆ reshape_layer() [8/10]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::reshape_layer ( const SimpleTensor< uint16_t > &  src,
const TensorShape output_shape 
)

◆ reshape_layer() [9/10]

template SimpleTensor<uint32_t> arm_compute::test::validation::reference::reshape_layer ( const SimpleTensor< uint32_t > &  src,
const TensorShape output_shape 
)

◆ reshape_layer() [10/10]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::reshape_layer ( const SimpleTensor< uint8_t > &  src,
const TensorShape output_shape 
)

◆ reverse() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::reverse ( const SimpleTensor< float > &  src,
const SimpleTensor< int32_t > &  axis,
bool  use_inverted_axis 
)

◆ reverse() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::reverse ( const SimpleTensor< half > &  src,
const SimpleTensor< int32_t > &  axis,
bool  use_inverted_axis 
)

◆ reverse() [3/4]

SimpleTensor< T > reverse ( const SimpleTensor< T > &  src,
const SimpleTensor< int32_t > &  axis,
bool  use_inverted_axis 
)

Definition at line 38 of file Reverse.cpp.

39 {
40  ARM_COMPUTE_ERROR_ON(src.shape().num_dimensions() > 4);
41  ARM_COMPUTE_ERROR_ON(axis.shape().num_dimensions() > 1);
42  ARM_COMPUTE_ERROR_ON(axis.shape().x() > 4);
43 
44  // Create reference
45  SimpleTensor<T> dst{ src.shape(), src.data_type(), src.num_channels(), src.quantization_info() };
46 
47  const unsigned int width = src.shape()[0];
48  const unsigned int height = src.shape()[1];
49  const unsigned int depth = src.shape()[2];
50  const unsigned int batches = src.shape()[3];
51 
52  const int rank = src.shape().num_dimensions();
53 
54  std::array<bool, 4> to_reverse = { { false, false, false, false } };
55  for(int i = 0; i < axis.num_elements(); ++i)
56  {
57  int axis_i = axis[i];
58 
59  // The values of axis tensor must be between [-rank, rank-1].
60  if((axis_i < -rank) || (axis_i >= rank))
61  {
62  ARM_COMPUTE_ERROR("the values of the axis tensor must be within [-rank, rank-1].");
63  }
64 
65  // In case of negative axis value i.e targeted axis(i) = rank + axis(i)
66  if(axis_i < 0)
67  {
68  axis_i = rank + axis_i;
69  }
70 
71  // Reverse ACL axis indices convention i.e. (inverted)axis = (tensor_rank - 1) - axis
72  if(use_inverted_axis)
73  {
74  axis_i = (rank - 1) - axis_i;
75  }
76 
77  to_reverse[axis_i] = true;
78  }
79 
80  const uint32_t num_elements = src.num_elements();
81 
82 #if defined(_OPENMP)
83  #pragma omp parallel for
84 #endif /* _OPENMP */
85  for(uint32_t i = 0; i < num_elements; ++i)
86  {
87  const Coordinates src_coord = index2coord(src.shape(), i);
88  const unsigned int dst_x = to_reverse[0] ? width - src_coord[0] - 1 : src_coord[0];
89  const unsigned int dst_y = to_reverse[1] ? height - src_coord[1] - 1 : src_coord[1];
90  const unsigned int dst_z = to_reverse[2] ? depth - src_coord[2] - 1 : src_coord[2];
91  const unsigned int dst_w = to_reverse[3] ? batches - src_coord[3] - 1 : src_coord[3];
92 
93  dst[coord2index(src.shape(), Coordinates(dst_x, dst_y, dst_z, dst_w))] = src[i];
94  }
95 
96  return dst;
97 }

References ARM_COMPUTE_ERROR, ARM_COMPUTE_ERROR_ON, batches, arm_compute::test::coord2index(), arm_compute::test::validation::dst, arm_compute::test::index2coord(), SimpleTensor< T >::num_elements(), SimpleTensor< T >::shape(), and arm_compute::test::validation::src.

Referenced by conv2d_dft(), and arm_compute::utils::parse_npy_header().

◆ reverse() [4/4]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::reverse ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< int32_t > &  axis,
bool  use_inverted_axis 
)

◆ ridft_1d() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::ridft_1d ( const SimpleTensor< float > &  src,
bool  is_odd 
)

◆ ridft_1d() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::ridft_1d ( const SimpleTensor< half > &  src,
bool  is_odd 
)

◆ ridft_1d() [3/3]

SimpleTensor< T > ridft_1d ( const SimpleTensor< T > &  src,
bool  is_odd = false 
)

Performs an one dimensional inverse DFT on a real input.

Parameters
[in]srcSource tensor.
[in]is_odd(Optional) Specifies if the output has odd dimensions. Is used by the inverse variant to reconstruct odd sequences.
Returns
Complex output of length n/2 + 1 due to symmetry.

Definition at line 319 of file DFT.cpp.

320 {
321  auto dst = rdft_1d_core(src, FFTDirection::Inverse, is_odd);
322 
323  const T scaling_factor = T(dst.shape()[0]);
324  scale(dst, scaling_factor);
325 
326  return dst;
327 }

References arm_compute::test::validation::dst, Inverse, arm_compute::test::validation::is_odd, scale(), and arm_compute::test::validation::src.

Referenced by arm_compute::test::validation::DATA_TEST_CASE().

◆ ridft_2d() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::ridft_2d ( const SimpleTensor< float > &  src,
bool  is_odd 
)

◆ ridft_2d() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::ridft_2d ( const SimpleTensor< half > &  src,
bool  is_odd 
)

◆ ridft_2d() [3/3]

SimpleTensor< T > ridft_2d ( const SimpleTensor< T > &  src,
bool  is_odd = false 
)

Performs a two dimensional inverse DFT on a real input.

Parameters
[in]srcSource tensor.
[in]is_odd(Optional) Specifies if the output has odd dimensions across width. Is used by the inverse variant to reconstruct odd sequences.
Returns
Complex output of length n/2 + 1 across width due to symmetry and height of same size as the input.

Definition at line 354 of file DFT.cpp.

355 {
356  ARM_COMPUTE_ERROR_ON(src.num_channels() != 2);
357  constexpr FFTDirection direction = FFTDirection::Inverse;
358 
359  auto transposed = permute(src, PermutationVector(1U, 0U));
360  auto first_pass = dft_1d_core(transposed, direction);
361  auto transposed_2 = permute(first_pass, PermutationVector(1U, 0U));
362  auto dst = rdft_1d_core(transposed_2, direction, is_odd);
363 
364  const T scaling_factor = T(dst.shape()[0] * dst.shape()[1]);
365  scale(dst, scaling_factor);
366  return dst;
367 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::dst, Inverse, arm_compute::test::validation::is_odd, permute(), scale(), arm_compute::test::validation::src, and arm_compute::utils::cast::U.

Referenced by conv2d_dft().

◆ roi_align_layer() [1/5]

SimpleTensor<float> arm_compute::test::validation::reference::roi_align_layer ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  rois,
const ROIPoolingLayerInfo pool_info,
const QuantizationInfo output_qinfo 
)

Definition at line 140 of file ROIAlignLayer.cpp.

141 {
142  ARM_COMPUTE_UNUSED(output_qinfo);
143 
144  const size_t values_per_roi = rois.shape()[0];
145  const size_t num_rois = rois.shape()[1];
146  DataType dst_data_type = src.data_type();
147 
148  const auto *rois_ptr = static_cast<const float *>(rois.data());
149 
150  TensorShape input_shape = src.shape();
151  TensorShape output_shape(pool_info.pooled_width(), pool_info.pooled_height(), src.shape()[2], num_rois);
152  SimpleTensor<float> dst(output_shape, dst_data_type);
153 
154  // Iterate over every pixel of the input image
155  for(size_t px = 0; px < pool_info.pooled_width(); ++px)
156  {
157  for(size_t py = 0; py < pool_info.pooled_height(); ++py)
158  {
159  for(size_t pw = 0; pw < num_rois; ++pw)
160  {
161  const unsigned int roi_batch = rois_ptr[values_per_roi * pw];
162  const auto x1 = float(rois_ptr[values_per_roi * pw + 1]);
163  const auto y1 = float(rois_ptr[values_per_roi * pw + 2]);
164  const auto x2 = float(rois_ptr[values_per_roi * pw + 3]);
165  const auto y2 = float(rois_ptr[values_per_roi * pw + 4]);
166 
167  const float roi_anchor_x = x1 * pool_info.spatial_scale();
168  const float roi_anchor_y = y1 * pool_info.spatial_scale();
169  const float roi_dims_x = std::max((x2 - x1) * pool_info.spatial_scale(), 1.0f);
170  const float roi_dims_y = std::max((y2 - y1) * pool_info.spatial_scale(), 1.0f);
171 
172  float bin_size_x = roi_dims_x / pool_info.pooled_width();
173  float bin_size_y = roi_dims_y / pool_info.pooled_height();
174  float region_start_x = px * bin_size_x + roi_anchor_x;
175  float region_start_y = py * bin_size_y + roi_anchor_y;
176  float region_end_x = (px + 1) * bin_size_x + roi_anchor_x;
177  float region_end_y = (py + 1) * bin_size_y + roi_anchor_y;
178 
179  region_start_x = utility::clamp(region_start_x, 0.0f, float(input_shape[0]));
180  region_start_y = utility::clamp(region_start_y, 0.0f, float(input_shape[1]));
181  region_end_x = utility::clamp(region_end_x, 0.0f, float(input_shape[0]));
182  region_end_y = utility::clamp(region_end_y, 0.0f, float(input_shape[1]));
183 
184  const int roi_bin_grid_x = (pool_info.sampling_ratio() > 0) ? pool_info.sampling_ratio() : int(ceil(bin_size_x));
185  const int roi_bin_grid_y = (pool_info.sampling_ratio() > 0) ? pool_info.sampling_ratio() : int(ceil(bin_size_y));
186 
187  // Move input and output pointer across the fourth dimension
188  const size_t input_stride_w = input_shape[0] * input_shape[1] * input_shape[2];
189  const size_t output_stride_w = output_shape[0] * output_shape[1] * output_shape[2];
190  const float *input_ptr = src.data() + roi_batch * input_stride_w;
191  float *output_ptr = dst.data() + px + py * output_shape[0] + pw * output_stride_w;
192 
193  for(int pz = 0; pz < int(input_shape[2]); ++pz)
194  {
195  // For every pixel pool over an aligned region
196  *(output_ptr + pz * output_shape[0] * output_shape[1]) = roi_align_1x1(input_ptr, input_shape,
197  region_start_x,
198  bin_size_x,
199  roi_bin_grid_x,
200  region_end_x,
201  region_start_y,
202  bin_size_y,
203  roi_bin_grid_y,
204  region_end_y, pz);
205  }
206  }
207  }
208  }
209  return dst;
210 }

References ARM_COMPUTE_UNUSED, arm_compute::utility::clamp(), SimpleTensor< T >::data(), arm_compute::test::validation::dst, arm_compute::test::validation::input_shape, arm_compute::test::validation::output_shape, ROIPoolingLayerInfo::pooled_height(), ROIPoolingLayerInfo::pooled_width(), arm_compute::cpu::roi_align_1x1(), ROIPoolingLayerInfo::sampling_ratio(), SimpleTensor< T >::shape(), ROIPoolingLayerInfo::spatial_scale(), and arm_compute::test::validation::src.

◆ roi_align_layer() [2/5]

SimpleTensor<half> arm_compute::test::validation::reference::roi_align_layer ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  rois,
const ROIPoolingLayerInfo pool_info,
const QuantizationInfo output_qinfo 
)

Definition at line 213 of file ROIAlignLayer.cpp.

214 {
215  SimpleTensor<float> src_tmp = float_converter<half, float>(src, DataType::F32);
216  SimpleTensor<float> rois_tmp = float_converter<half, float>(rois, DataType::F32);
217  SimpleTensor<float> dst_tmp = roi_align_layer<float, float>(src_tmp, rois_tmp, pool_info, output_qinfo);
218  SimpleTensor<half> dst = float_converter<float, half>(dst_tmp, DataType::F16);
219  return dst;
220 }

References arm_compute::test::validation::dst, arm_compute::F16, arm_compute::F32, and arm_compute::test::validation::src.

◆ roi_align_layer() [3/5]

SimpleTensor<int8_t> arm_compute::test::validation::reference::roi_align_layer ( const SimpleTensor< int8_t > &  src,
const SimpleTensor< uint16_t > &  rois,
const ROIPoolingLayerInfo pool_info,
const QuantizationInfo output_qinfo 
)

Definition at line 232 of file ROIAlignLayer.cpp.

233 {
234  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
235  SimpleTensor<float> rois_tmp = convert_rois_from_asymmetric(rois);
236  SimpleTensor<float> dst_tmp = roi_align_layer<float, float>(src_tmp, rois_tmp, pool_info, output_qinfo);
237  SimpleTensor<int8_t> dst = convert_to_asymmetric<int8_t>(dst_tmp, output_qinfo);
238  return dst;
239 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, and arm_compute::test::validation::src.

◆ roi_align_layer() [4/5]

SimpleTensor<T> arm_compute::test::validation::reference::roi_align_layer ( const SimpleTensor< T > &  src,
const SimpleTensor< TRois > &  rois,
const ROIPoolingLayerInfo pool_info,
const QuantizationInfo output_qinfo 
)

◆ roi_align_layer() [5/5]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::roi_align_layer ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint16_t > &  rois,
const ROIPoolingLayerInfo pool_info,
const QuantizationInfo output_qinfo 
)

Definition at line 223 of file ROIAlignLayer.cpp.

224 {
225  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
226  SimpleTensor<float> rois_tmp = convert_rois_from_asymmetric(rois);
227  SimpleTensor<float> dst_tmp = roi_align_layer<float, float>(src_tmp, rois_tmp, pool_info, output_qinfo);
228  SimpleTensor<uint8_t> dst = convert_to_asymmetric<uint8_t>(dst_tmp, output_qinfo);
229  return dst;
230 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, and arm_compute::test::validation::src.

◆ roi_pool_layer() [1/3]

SimpleTensor<float> arm_compute::test::validation::reference::roi_pool_layer ( const SimpleTensor< float > &  src,
const SimpleTensor< uint16_t > &  rois,
const ROIPoolingLayerInfo pool_info,
const QuantizationInfo output_qinfo 
)

Definition at line 40 of file ROIPoolingLayer.cpp.

41 {
42  ARM_COMPUTE_UNUSED(output_qinfo);
43 
44  const size_t num_rois = rois.shape()[1];
45  const size_t values_per_roi = rois.shape()[0];
46  DataType output_data_type = src.data_type();
47 
48  TensorShape input_shape = src.shape();
49  TensorShape output_shape(pool_info.pooled_width(), pool_info.pooled_height(), src.shape()[2], num_rois);
50  SimpleTensor<float> output(output_shape, output_data_type);
51 
52  const int pooled_w = pool_info.pooled_width();
53  const int pooled_h = pool_info.pooled_height();
54  const float spatial_scale = pool_info.spatial_scale();
55 
56  // get sizes of x and y dimensions in src tensor
57  const int width = src.shape()[0];
58  const int height = src.shape()[1];
59 
60  // Move pointer across the fourth dimension
61  const size_t input_stride_w = input_shape[0] * input_shape[1] * input_shape[2];
62  const size_t output_stride_w = output_shape[0] * output_shape[1] * output_shape[2];
63 
64  const auto *rois_ptr = reinterpret_cast<const uint16_t *>(rois.data());
65 
66  // Iterate through pixel width (X-Axis)
67  for(size_t pw = 0; pw < num_rois; ++pw)
68  {
69  const unsigned int roi_batch = rois_ptr[values_per_roi * pw];
70  const auto x1 = rois_ptr[values_per_roi * pw + 1];
71  const auto y1 = rois_ptr[values_per_roi * pw + 2];
72  const auto x2 = rois_ptr[values_per_roi * pw + 3];
73  const auto y2 = rois_ptr[values_per_roi * pw + 4];
74 
75  //Iterate through pixel height (Y-Axis)
76  for(size_t fm = 0; fm < input_shape[2]; ++fm)
77  {
78  // Iterate through regions of interest index
79  for(size_t py = 0; py < pool_info.pooled_height(); ++py)
80  {
81  // Scale ROI
82  const int roi_anchor_x = support::cpp11::round(x1 * spatial_scale);
83  const int roi_anchor_y = support::cpp11::round(y1 * spatial_scale);
84  const int roi_width = std::max(support::cpp11::round((x2 - x1) * spatial_scale), 1.f);
85  const int roi_height = std::max(support::cpp11::round((y2 - y1) * spatial_scale), 1.f);
86 
87  // Iterate over feature map (Z axis)
88  for(size_t px = 0; px < pool_info.pooled_width(); ++px)
89  {
90  auto region_start_x = static_cast<int>(std::floor((static_cast<float>(px) / pooled_w) * roi_width));
91  auto region_end_x = static_cast<int>(std::floor((static_cast<float>(px + 1) / pooled_w) * roi_width));
92  auto region_start_y = static_cast<int>(std::floor((static_cast<float>(py) / pooled_h) * roi_height));
93  auto region_end_y = static_cast<int>(std::floor((static_cast<float>(py + 1) / pooled_h) * roi_height));
94 
95  region_start_x = std::min(std::max(region_start_x + roi_anchor_x, 0), width);
96  region_end_x = std::min(std::max(region_end_x + roi_anchor_x, 0), width);
97  region_start_y = std::min(std::max(region_start_y + roi_anchor_y, 0), height);
98  region_end_y = std::min(std::max(region_end_y + roi_anchor_y, 0), height);
99 
100  // Iterate through the pooling region
101  if((region_end_x <= region_start_x) || (region_end_y <= region_start_y))
102  {
103  /* Assign element in tensor 'output' at coordinates px, py, fm, roi_indx, to 0 */
104  auto out_ptr = output.data() + px + py * output_shape[0] + fm * output_shape[0] * output_shape[1] + pw * output_stride_w;
105  *out_ptr = 0;
106  }
107  else
108  {
109  float curr_max = -std::numeric_limits<float>::max();
110  for(int j = region_start_y; j < region_end_y; ++j)
111  {
112  for(int i = region_start_x; i < region_end_x; ++i)
113  {
114  /* Retrieve element from input tensor at coordinates(i, j, fm, roi_batch) */
115  float in_element = *(src.data() + i + j * input_shape[0] + fm * input_shape[0] * input_shape[1] + roi_batch * input_stride_w);
116  curr_max = std::max(in_element, curr_max);
117  }
118  }
119 
120  /* Assign element in tensor 'output' at coordinates px, py, fm, roi_indx, to curr_max */
121  auto out_ptr = output.data() + px + py * output_shape[0] + fm * output_shape[0] * output_shape[1] + pw * output_stride_w;
122  *out_ptr = curr_max;
123  }
124  }
125  }
126  }
127  }
128 
129  return output;
130 }

References ARM_COMPUTE_UNUSED, SimpleTensor< T >::data(), arm_compute::test::validation::input_shape, arm_compute::test::validation::output_shape, ROIPoolingLayerInfo::pooled_height(), ROIPoolingLayerInfo::pooled_width(), arm_compute::support::cpp11::round(), SimpleTensor< T >::shape(), ROIPoolingLayerInfo::spatial_scale(), and arm_compute::test::validation::src.

◆ roi_pool_layer() [2/3]

SimpleTensor<T> arm_compute::test::validation::reference::roi_pool_layer ( const SimpleTensor< T > &  src,
const SimpleTensor< uint16_t > &  rois,
const ROIPoolingLayerInfo pool_info,
const QuantizationInfo output_qinfo 
)

◆ roi_pool_layer() [3/3]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::roi_pool_layer ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint16_t > &  rois,
const ROIPoolingLayerInfo pool_info,
const QuantizationInfo output_qinfo 
)

Definition at line 136 of file ROIPoolingLayer.cpp.

137 {
138  const SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
139  SimpleTensor<float> dst_tmp = roi_pool_layer<float>(src_tmp, rois, pool_info, output_qinfo);
140  SimpleTensor<uint8_t> dst = convert_to_asymmetric<uint8_t>(dst_tmp, output_qinfo);
141  return dst;
142 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::test::validation::dst, and arm_compute::test::validation::src.

◆ safe_read()

T arm_compute::test::validation::reference::safe_read ( const SimpleTensor< T > &  t,
int  y,
int  x 
)

Definition at line 37 of file GEMMInterleaveBlocked.h.

38 {
39  const int stride = t.shape().x();
40  const int M = t.shape().y();
41  const int N = t.shape().x();
42  if((y < M) && (x < N))
43  {
44  return t[y * stride + x];
45  }
46  return 0;
47 }

References M, N, and tf_frozen_model_extractor::t.

Referenced by gemm_interleave_blocked().

◆ scale() [1/6]

template SimpleTensor<float> arm_compute::test::validation::reference::scale ( const SimpleTensor< float > &  src,
float  scale_x,
float  scale_y,
InterpolationPolicy  policy,
BorderMode  border_mode,
float  constant_border_value,
SamplingPolicy  sampling_policy,
bool  ceil_policy_scale,
bool  align_corners,
QuantizationInfo  output_quantization_info 
)

◆ scale() [2/6]

template SimpleTensor<half> arm_compute::test::validation::reference::scale ( const SimpleTensor< half > &  src,
float  scale_x,
float  scale_y,
InterpolationPolicy  policy,
BorderMode  border_mode,
half  constant_border_value,
SamplingPolicy  sampling_policy,
bool  ceil_policy_scale,
bool  align_corners,
QuantizationInfo  output_quantization_info 
)

◆ scale() [3/6]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::scale ( const SimpleTensor< int16_t > &  src,
float  scale_x,
float  scale_y,
InterpolationPolicy  policy,
BorderMode  border_mode,
int16_t  constant_border_value,
SamplingPolicy  sampling_policy,
bool  ceil_policy_scale,
bool  align_corners,
QuantizationInfo  output_quantization_info 
)

◆ scale() [4/6]

SimpleTensor<int8_t> arm_compute::test::validation::reference::scale ( const SimpleTensor< int8_t > &  src,
float  scale_x,
float  scale_y,
InterpolationPolicy  policy,
BorderMode  border_mode,
int8_t  constant_border_value,
SamplingPolicy  sampling_policy,
bool  ceil_policy_scale,
bool  align_corners,
QuantizationInfo  output_quantization_info 
)

Definition at line 211 of file Scale.cpp.

213 {
214  SimpleTensor<int8_t> dst;
215  if(src.quantization_info().uniform().scale != 0.f)
216  {
217  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
218  float constant_border_value_f = dequantize_qasymm8_signed(constant_border_value, src.quantization_info());
219  SimpleTensor<float> dst_tmp = scale_core<float>(src_tmp, scale_x, scale_y, policy, border_mode, constant_border_value_f, sampling_policy, ceil_policy_scale, align_corners);
220  dst = convert_to_asymmetric<int8_t>(dst_tmp, output_quantization_info);
221  }
222  else
223  {
224  dst = scale_core<int8_t>(src, scale_x, scale_y, policy, border_mode, constant_border_value, sampling_policy, ceil_policy_scale, align_corners);
225  }
226  return dst;
227 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::dequantize_qasymm8_signed(), arm_compute::test::validation::dst, arm_compute::test::validation::sampling_policy, arm_compute::test::validation::scale_x, arm_compute::test::validation::scale_y, and arm_compute::test::validation::src.

◆ scale() [5/6]

SimpleTensor< T > scale ( const SimpleTensor< T > &  src,
float  scale_x,
float  scale_y,
InterpolationPolicy  policy,
BorderMode  border_mode,
constant_border_value,
SamplingPolicy  sampling_policy,
bool  ceil_policy_scale,
bool  align_corners,
QuantizationInfo  output_quantization_info 
)

Definition at line 184 of file Scale.cpp.

186 {
187  ARM_COMPUTE_UNUSED(output_quantization_info);
188  return scale_core<T>(src, scale_x, scale_y, policy, border_mode, constant_border_value, sampling_policy, ceil_policy_scale, align_corners);
189 }

References ARM_COMPUTE_UNUSED, arm_compute::test::validation::sampling_policy, arm_compute::test::validation::scale_x, arm_compute::test::validation::scale_y, and arm_compute::test::validation::src.

Referenced by dft_1d(), dft_2d(), pixel_wise_multiplication(), ridft_1d(), and ridft_2d().

◆ scale() [6/6]

SimpleTensor<uint8_t> arm_compute::test::validation::reference::scale ( const SimpleTensor< uint8_t > &  src,
float  scale_x,
float  scale_y,
InterpolationPolicy  policy,
BorderMode  border_mode,
uint8_t  constant_border_value,
SamplingPolicy  sampling_policy,
bool  ceil_policy_scale,
bool  align_corners,
QuantizationInfo  output_quantization_info 
)

Definition at line 192 of file Scale.cpp.

194 {
195  SimpleTensor<uint8_t> dst;
196  if(src.quantization_info().uniform().scale != 0.f)
197  {
198  SimpleTensor<float> src_tmp = convert_from_asymmetric(src);
199  float constant_border_value_f = dequantize_qasymm8(constant_border_value, src.quantization_info());
200  SimpleTensor<float> dst_tmp = scale_core<float>(src_tmp, scale_x, scale_y, policy, border_mode, constant_border_value_f, sampling_policy, ceil_policy_scale, align_corners);
201  dst = convert_to_asymmetric<uint8_t>(dst_tmp, output_quantization_info);
202  }
203  else
204  {
205  dst = scale_core<uint8_t>(src, scale_x, scale_y, policy, border_mode, constant_border_value, sampling_policy, ceil_policy_scale, align_corners);
206  }
207  return dst;
208 }

References arm_compute::test::validation::convert_from_asymmetric(), arm_compute::dequantize_qasymm8(), arm_compute::test::validation::dst, arm_compute::test::validation::sampling_policy, arm_compute::test::validation::scale_x, arm_compute::test::validation::scale_y, and arm_compute::test::validation::src.

◆ scale_core()

SimpleTensor<T> arm_compute::test::validation::reference::scale_core ( const SimpleTensor< T > &  in,
float  scale_x,
float  scale_y,
InterpolationPolicy  policy,
BorderMode  border_mode,
constant_border_value,
SamplingPolicy  sampling_policy,
bool  ceil_policy_scale,
bool  align_corners 
)

Definition at line 40 of file Scale.cpp.

42 {
43  // Add 1 if ceil_policy_scale is true
44  const size_t round_value = ceil_policy_scale ? 1U : 0U;
45  TensorShape shape_scaled(in.shape());
46  shape_scaled.set(0, (in.shape()[0] + round_value) * scale_x, /* apply_dim_correction = */ false);
47  shape_scaled.set(1, (in.shape()[1] + round_value) * scale_y, /* apply_dim_correction = */ false);
48  SimpleTensor<T> out(shape_scaled, in.data_type());
49 
50  // Compute the ratio between source width/height and destination width/height
51  const auto wr = arm_compute::scale_utils::calculate_resize_ratio(in.shape()[0], out.shape()[0], align_corners);
52  const auto hr = arm_compute::scale_utils::calculate_resize_ratio(in.shape()[1], out.shape()[1], align_corners);
53 
54  const auto width = static_cast<int>(in.shape().x());
55  const auto height = static_cast<int>(in.shape().y());
56 
57  // Determine border size
58  const int border_size = (border_mode == BorderMode::UNDEFINED) ? 0 : 1;
59 
60  // Area interpolation behaves as Nearest Neighbour in case of up-sampling
61  if(policy == InterpolationPolicy::AREA && wr <= 1.f && hr <= 1.f)
62  {
63  policy = InterpolationPolicy::NEAREST_NEIGHBOR;
64  }
65 
66  const uint32_t num_elements = out.num_elements();
67  for(uint32_t element_idx = 0, count = 0; element_idx < num_elements; ++element_idx, ++count)
68  {
69  Coordinates id = index2coord(out.shape(), element_idx);
70  int idx = id.x();
71  int idy = id.y();
72  float x_src = 0;
73  float y_src = 0;
74 
75  switch(policy)
76  {
77  case InterpolationPolicy::NEAREST_NEIGHBOR:
78  {
79  switch(sampling_policy)
80  {
81  case SamplingPolicy::TOP_LEFT:
82  x_src = align_corners ? arm_compute::utils::rounding::round_half_away_from_zero(idx * wr) : std::floor(idx * wr);
83  y_src = align_corners ? arm_compute::utils::rounding::round_half_away_from_zero(idy * hr) : std::floor(idy * hr);
84  break;
85  case SamplingPolicy::CENTER:
86  //Calculate the source coords without -0.5f is equivalent to round the x_scr/y_src coords
87  x_src = (idx + 0.5f) * wr;
88  y_src = (idy + 0.5f) * hr;
89  break;
90  default:
91  ARM_COMPUTE_ERROR("Unsupported sampling policy.");
92  }
93 
94  id.set(0, x_src);
95  id.set(1, y_src);
96 
97  // If coordinates in range of tensor's width or height
98  if(is_valid_pixel_index(x_src, y_src, width, height, border_size))
99  {
100  out[element_idx] = tensor_elem_at(in, id, border_mode, constant_border_value);
101  }
102  break;
103  }
104  case InterpolationPolicy::BILINEAR:
105  {
106  switch(sampling_policy)
107  {
108  case SamplingPolicy::TOP_LEFT:
109  x_src = idx * wr;
110  y_src = idy * hr;
111  break;
112  case SamplingPolicy::CENTER:
113  x_src = (idx + 0.5f) * wr - 0.5f;
114  y_src = (idy + 0.5f) * hr - 0.5f;
115  break;
116  default:
117  ARM_COMPUTE_ERROR("Unsupported sampling policy.");
118  }
119 
120  id.set(0, std::floor(x_src));
121  id.set(1, std::floor(y_src));
122  if(is_valid_pixel_index(x_src, y_src, width, height, border_size))
123  {
124  out[element_idx] = bilinear_policy(in, id, x_src, y_src, border_mode, constant_border_value);
125  }
126  else
127  {
128  if(border_mode == BorderMode::CONSTANT)
129  {
130  out[element_idx] = constant_border_value;
131  }
132  else if(border_mode == BorderMode::REPLICATE)
133  {
134  id.set(0, utility::clamp<int>(x_src, 0, width - 1));
135  id.set(1, utility::clamp<int>(y_src, 0, height - 1));
136  out[element_idx] = in[coord2index(in.shape(), id)];
137  }
138  }
139  break;
140  }
141  case InterpolationPolicy::AREA:
142  {
143  int x_from = std::floor(idx * wr - 0.5f - x_src);
144  int y_from = std::floor(idy * hr - 0.5f - y_src);
145  int x_to = std::ceil((idx + 1) * wr - 0.5f - x_src);
146  int y_to = std::ceil((idy + 1) * hr - 0.5f - y_src);
147  const int xi = std::floor(x_src);
148  const int yi = std::floor(y_src);
149 
150  // Clamp position to borders
151  x_src = std::max(-static_cast<float>(border_size), std::min(x_src, static_cast<float>(width - 1 + border_size)));
152  y_src = std::max(-static_cast<float>(border_size), std::min(y_src, static_cast<float>(height - 1 + border_size)));
153 
154  // Clamp bounding box offsets to borders
155  x_from = ((x_src + x_from) < -border_size) ? -border_size : x_from;
156  y_from = ((y_src + y_from) < -border_size) ? -border_size : y_from;
157  x_to = ((x_src + x_to) >= (width + border_size)) ? (width - 1 + border_size) : x_to;
158  y_to = ((y_src + y_to) >= (height + border_size)) ? (height - 1 + border_size) : y_to;
159  ARM_COMPUTE_ERROR_ON((x_to - x_from + 1) == 0 || (y_to - y_from + 1) == 0);
160 
161  float sum = 0;
162  for(int j = yi + y_from, je = yi + y_to; j <= je; ++j)
163  {
164  for(int i = xi + x_from, ie = xi + x_to; i <= ie; ++i)
165  {
166  id.set(0, static_cast<int>(i));
167  id.set(1, static_cast<int>(j));
168  sum += tensor_elem_at(in, id, border_mode, constant_border_value);
169  }
170  }
171  out[element_idx] = sum / ((x_to - x_from + 1) * (y_to - y_from + 1));
172 
173  break;
174  }
175  default:
176  ARM_COMPUTE_ERROR("Unsupported interpolation mode");
177  }
178  }
179 
180  return out;
181 }

References arm_compute::AREA, ARM_COMPUTE_ERROR, ARM_COMPUTE_ERROR_ON, arm_compute::BILINEAR, arm_compute::test::validation::bilinear_policy(), arm_compute::scale_utils::calculate_resize_ratio(), arm_compute::CENTER, arm_compute::CONSTANT, arm_compute::test::coord2index(), SimpleTensor< T >::data_type(), arm_compute::test::index2coord(), arm_compute::test::validation::is_valid_pixel_index(), arm_compute::NEAREST_NEIGHBOR, SimpleTensor< T >::num_elements(), arm_compute::REPLICATE, arm_compute::utils::rounding::round_half_away_from_zero(), arm_compute::test::validation::sampling_policy, arm_compute::test::validation::scale_x, arm_compute::test::validation::scale_y, TensorShape::set(), SimpleTensor< T >::shape(), arm_compute::test::validation::shape_scaled, arm_compute::test::validation::tensor_elem_at(), arm_compute::TOP_LEFT, arm_compute::utils::cast::U, and arm_compute::UNDEFINED.

◆ scatter_layer() [1/9]

template SimpleTensor<float> arm_compute::test::validation::reference::scatter_layer ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

◆ scatter_layer() [2/9]

template SimpleTensor<half> arm_compute::test::validation::reference::scatter_layer ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

◆ scatter_layer() [3/9]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::scatter_layer ( const SimpleTensor< int16_t > &  src,
const SimpleTensor< int16_t > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

◆ scatter_layer() [4/9]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::scatter_layer ( const SimpleTensor< int32_t > &  src,
const SimpleTensor< int32_t > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

◆ scatter_layer() [5/9]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::scatter_layer ( const SimpleTensor< int8_t > &  src,
const SimpleTensor< int8_t > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

◆ scatter_layer() [6/9]

SimpleTensor< T > scatter_layer ( const SimpleTensor< T > &  src,
const SimpleTensor< T > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

Definition at line 136 of file ScatterLayer.cpp.

137 {
138  return scatter_layer_internal<T>(src, updates, indices, out_shape, info);
139 }

References arm_compute::test::validation::info, and arm_compute::test::validation::src.

◆ scatter_layer() [7/9]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::scatter_layer ( const SimpleTensor< uint16_t > &  src,
const SimpleTensor< uint16_t > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

◆ scatter_layer() [8/9]

template SimpleTensor<uint32_t> arm_compute::test::validation::reference::scatter_layer ( const SimpleTensor< uint32_t > &  src,
const SimpleTensor< uint32_t > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

◆ scatter_layer() [9/9]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::scatter_layer ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint8_t > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

◆ scatter_layer_internal()

SimpleTensor< T > scatter_layer_internal ( const SimpleTensor< T > &  src,
const SimpleTensor< T > &  updates,
const SimpleTensor< int32_t > &  indices,
const TensorShape out_shape,
const ScatterInfo info 
)

Definition at line 73 of file ScatterLayer.cpp.

74 {
75  // 1. If zero initialization variable is false, copy src data to dst.
76  SimpleTensor<T> dst{ out_shape, src.data_type(), 1 };
77  if(!info.zero_initialization)
78  {
79  std::copy_n(src.data(), src.num_elements(), dst.data());
80  }
81 
82  // Number of elements between each value of the dim being iterated through
83  const unsigned int data_stride = updates.shape().total_size_lower(updates.shape().num_dimensions() - 1);
84  const unsigned int no_output_dims = out_shape.num_dimensions();
85 
86  // Calculate output stride at given index for all output dims.
87  std::vector<unsigned int> out_stride_at_idx(no_output_dims);
88  for (unsigned int i = 0 ; i < no_output_dims; i++)
89  {
90  out_stride_at_idx[i] = out_shape.total_size_lower(i);
91  }
92 
93  const unsigned int indices_x_dim = static_cast<unsigned int>(indices.shape()[0]);
94  const unsigned int indices_y_dim = static_cast<unsigned int>(indices.shape()[1]);
95 
96  // 2. Iterate over indices tensor y-dim and replace sections of dst tensor with relevant areas of update tensor.
97  for(unsigned int i = 0; i < indices_y_dim; i++)
98  {
99  // NOTE : Currently, indices.shape() == [X, Y, 1, 1], where X is the indices dim and Y is the batch dim
100  // Starting index for both the update and indices tensors.
101  const unsigned int update_dim_start = i * data_stride;
102  const unsigned int indices_dim_start = i * indices_x_dim;
103  bool out_of_bounds = false;
104  unsigned int out_offset_acc = 0;
105 
106  // Iterate over each indices value for the relevant batch and accumulate the offset.
107  for(unsigned int j = 0; j < indices_x_dim; j++)
108  {
109  // Get first index value with i * indices_x_dim (iterating through y-dim/batch idx), then iterate through x dim by adding k
110  const int index_value = indices[indices_dim_start + j];
111  const unsigned int out_dim = no_output_dims - (j+1); // Calculate corresponding output dim to current index value.
112  if(index_value < static_cast<int>(out_shape[out_dim]) && index_value >= 0)
113  {
114  out_offset_acc += (index_value * out_stride_at_idx[out_dim]); // offset accumulation
115  }
116  else
117  {
118  out_of_bounds = true;
119  break;
120  }
121  }
122 
123  // If not out of bounds, copy update tensor elements to output
124  if(!out_of_bounds)
125  {
126  for (unsigned int j = 0 ; j < data_stride; j++)
127  {
128  dst[out_offset_acc + j] = reduce_op(dst[out_offset_acc + j], updates[update_dim_start + j], info.func);
129  }
130  }
131  }
132  return dst;
133 }

References arm_compute::test::validation::dst, arm_compute::test::validation::info, Dimensions< T >::num_dimensions(), SimpleTensor< T >::shape(), arm_compute::test::validation::src, and TensorShape::total_size_lower().

◆ select() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::select ( const SimpleTensor< uint8_t > &  c,
const SimpleTensor< float > &  x,
const SimpleTensor< float > &  y 
)

◆ select() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::select ( const SimpleTensor< uint8_t > &  c,
const SimpleTensor< half > &  x,
const SimpleTensor< half > &  y 
)

◆ select() [3/4]

SimpleTensor< T > select ( const SimpleTensor< uint8_t > &  c,
const SimpleTensor< T > &  x,
const SimpleTensor< T > &  y 
)

Definition at line 38 of file Select.cpp.

39 {
40  // Check if condition has the same rank as c
41  const bool is_same_rank = (c.shape().num_dimensions() == x.shape().num_dimensions());
42 
43  // Check shapes
44  ARM_COMPUTE_ERROR_ON(x.shape() != y.shape());
45  ARM_COMPUTE_ERROR_ON(is_same_rank && (x.shape() != c.shape()));
46  ARM_COMPUTE_ERROR_ON(!is_same_rank && (c.shape().num_dimensions() > 1) && (c.shape().x() != x.shape()[x.shape().num_dimensions() - 1]));
47 
48  // Create reference
49  SimpleTensor<T> dst{ x.shape(), x.data_type(), 1 };
50 
51  // Run select core
52  if(is_same_rank)
53  {
54  for(int i = 0; i < x.num_elements(); ++i)
55  {
56  dst[i] = c[i] > 0 ? x[i] : y[i];
57  }
58  }
59  else
60  {
61  T *output_ptr = dst.data();
62 
63  const int outer_size = c.num_elements();
64  const int inner_size = x.num_elements() / outer_size;
65  size_t offset = 0;
66 
67  for(int i = 0; i < outer_size; ++i)
68  {
69  const T *input_ptr = c[i] > 0 ? x.data() : y.data();
70  memcpy(output_ptr + offset, input_ptr + offset, inner_size * sizeof(T));
71  offset += inner_size;
72  }
73  }
74 
75  return dst;
76 }

References ARM_COMPUTE_ERROR_ON, SimpleTensor< T >::data(), SimpleTensor< T >::data_type(), arm_compute::test::validation::dst, is_same_rank, Dimensions< T >::num_dimensions(), SimpleTensor< T >::num_elements(), offset(), SimpleTensor< T >::shape(), and Dimensions< T >::x().

Referenced by direct_convolution_nhwc(), non_max_suppression(), pooling_layer_2_nchw_indices(), scale_bilinear_nchw(), scale_nearest_neighbour_nchw(), and transposed_convolution_nhwc().

◆ select() [4/4]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::select ( const SimpleTensor< uint8_t > &  c,
const SimpleTensor< uint8_t > &  x,
const SimpleTensor< uint8_t > &  y 
)

◆ slice() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::slice ( const SimpleTensor< float > &  src,
Coordinates  starts,
Coordinates  ends 
)

◆ slice() [2/3]

template SimpleTensor<half_float::half> arm_compute::test::validation::reference::slice ( const SimpleTensor< half_float::half > &  src,
Coordinates  starts,
Coordinates  ends 
)

◆ slice() [3/3]

SimpleTensor< T > slice ( const SimpleTensor< T > &  src,
Coordinates  starts,
Coordinates  ends 
)

Definition at line 38 of file SliceOperations.cpp.

39 {
41 
42  // Validation checks
43  ARM_COMPUTE_ERROR_ON(src.shape().num_dimensions() > 4);
44  ARM_COMPUTE_ERROR_ON(starts.num_dimensions() > src.shape().num_dimensions());
45  ARM_COMPUTE_ERROR_ON(std::any_of(starts.cbegin(), starts.cbegin() + starts.num_dimensions(), [](int i)
46  {
47  return i < 0;
48  }));
49  ARM_COMPUTE_ERROR_ON(ends.num_dimensions() > src.shape().num_dimensions());
50 
51  // Get source shape
52  const TensorShape &src_shape = src.shape();
53 
54  // Get destination shape
55  TensorShape dst_shape = arm_compute::misc::shape_calculator::compute_slice_shape(src_shape, starts, ends);
56 
57  // Create destination tensor
58  SimpleTensor<T> dst{ dst_shape, src.data_type(), 1 };
59 
60  // Perform slice
61  Window win;
62  win.use_tensor_dimensions(dst_shape);
63  execute_window_loop(win, [&](const Coordinates & id)
64  {
65  Coordinates offset;
66  for(unsigned int i = 0; i < id.num_dimensions(); ++i)
67  {
68  offset.set(i, starts[i] + id[i]);
69  }
70  *reinterpret_cast<T *>(dst(id)) = *reinterpret_cast<const T *>(src(offset));
71  });
72 
73  return dst;
74 }

References ARM_COMPUTE_ERROR_ON, Dimensions< T >::cbegin(), arm_compute::misc::shape_calculator::compute_slice_shape(), arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, arm_compute::execute_window_loop(), Dimensions< T >::num_dimensions(), offset(), arm_compute::test::validation::src, and Window::use_tensor_dimensions().

Referenced by arm_compute::cpu::batch_normalization_nchw(), NEUnstack::configure(), CLUnstack::configure(), conv2d_dft(), deconvolution_layer(), depthconcatenate_layer(), ICLSimple2DKernel::run(), ICLSimple3DKernel::run(), CLBitwiseKernel::run(), CLSelectKernel::run(), CLFFTScaleKernel::run(), CLNormalizationLayerKernel::run(), CLQLSTMLayerNormalizationKernel::run(), CLReorgLayerKernel::run(), CLTileKernel::run(), CLMeanStdDevNormalizationKernel::run(), CLMaxUnpoolingLayerKernel::run(), CLROIPoolingLayerKernel::run(), CLComparisonKernel::run(), CLFFTDigitReverseKernel::run(), CLNormalizePlanarYUVLayerKernel::run(), CLReverseKernel::run(), CLFFTRadixStageKernel::run(), CLPadLayerKernel::run(), CLBoundingBoxTransformKernel::run(), CLFillBorderKernel::run(), CLPriorBoxLayerKernel::run(), CLROIAlignLayerKernel::run(), CLDepthwiseConvolutionLayerNativeKernel::run(), CLBatchNormalizationLayerKernel::run(), ClElementwiseKernel::run_op(), ClKernelRuntime::run_op(), ClReshapeKernel::run_op(), ClTransposeKernel::run_op(), ClDequantizeKernel::run_op(), ClFloorKernel::run_op(), ClWidthConcatenate2TensorsKernel::run_op(), ClCopyKernel::run_op(), ClElementWiseUnaryKernel::run_op(), ClFillKernel::run_op(), ClQuantizeKernel::run_op(), ClScaleKernel::run_op(), ClDepthConcatenateKernel::run_op(), ClTransposedConvolutionKernel::run_op(), ClBatchConcatenateKernel::run_op(), ClActivationKernel::run_op(), ClPool2dKernel::run_op(), ClWidthConcatenate4TensorsKernel::run_op(), ClWinogradInputTransformKernel::run_op(), ClGemmReshapeLhsMatrixKernel::run_op(), ClCastKernel::run_op(), ClGemmLowpMatrixMultiplyNativeKernel::run_op(), ClGemmLowpQuantizeDownInt32ScaleByFixedPointKernel::run_op(), ClGemmLowpQuantizeDownInt32ScaleByFloatKernel::run_op(), ClGemmLowpQuantizeDownInt32ScaleKernel::run_op(), ClGemmReshapeRhsMatrixKernel::run_op(), ClIndirectConv2dAddressPrecalculationKernel::run_op(), ClWinogradOutputTransformKernel::run_op(), ClCol2ImKernel::run_op(), ClGemmLowpMatrixMultiplyReshapedKernel::run_op(), ClGemmMatrixMultiplyNativeKernel::run_op(), ClIndirectConv2dKernel::run_op(), ClGemmMatrixMultiplyReshapedOnlyRhsMMULKernel::run_op(), CLStridedSliceKernel::run_op(), ClGemmLowpOffsetContributionKernel::run_op(), ClDirectConv3dKernel::run_op(), ClDirectConv2dKernel::run_op(), ClGemmLowpMatrixMultiplyReshapedOnlyRhsMMULKernel::run_op(), ClMulKernel::run_op(), ClGemmLowpOffsetContributionOutputStageKernel::run_op(), CLFillBorderKernel::run_op(), ClGemmLowpMatrixMultiplyReshapedOnlyRhsKernel::run_op(), ClIm2ColKernel::run_op(), ClGemmMatrixMultiplyReshapedOnlyRhsKernel::run_op(), ClGemmMatrixMultiplyReshapedKernel::run_op(), ClComplexMulKernel::run_op(), Window::slide_window_slice_1D(), Window::slide_window_slice_2D(), Window::slide_window_slice_3D(), and Window::slide_window_slice_4D().

◆ softmax_layer() [1/5]

template SimpleTensor<float> arm_compute::test::validation::reference::softmax_layer ( const SimpleTensor< float > &  src,
float  beta,
int32_t  axis,
bool  is_log 
)

◆ softmax_layer() [2/5]

template SimpleTensor<half> arm_compute::test::validation::reference::softmax_layer ( const SimpleTensor< half > &  src,
float  beta,
int32_t  axis,
bool  is_log 
)

◆ softmax_layer() [3/5]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::softmax_layer ( const SimpleTensor< int8_t > &  src,
float  beta,
int32_t  axis,
bool  is_log 
)

◆ softmax_layer() [4/5]

SimpleTensor< T > softmax_layer ( const SimpleTensor< T > &  src,
float  beta,
int32_t  axis,
bool  is_log 
)

Definition at line 110 of file SoftmaxLayer.cpp.

111 {
112  return softmax_layer_generic<T>(src, beta, axis, is_log);
113 }

References arm_compute::test::validation::src.

◆ softmax_layer() [5/5]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::softmax_layer ( const SimpleTensor< uint8_t > &  src,
float  beta,
int32_t  axis,
bool  is_log 
)

◆ softmax_layer_generic() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::softmax_layer_generic ( const SimpleTensor< float > &  src,
float  beta,
int32_t  axis,
bool  is_log 
)

◆ softmax_layer_generic() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::softmax_layer_generic ( const SimpleTensor< half > &  src,
float  beta,
int32_t  axis,
bool  is_log 
)

◆ softmax_layer_generic() [3/3]

SimpleTensor< T > softmax_layer_generic ( const SimpleTensor< T > &  src,
float  beta,
int32_t  axis,
bool  is_log 
)

Definition at line 39 of file SoftmaxLayer.cpp.

40 {
41  // Create reference
42  SimpleTensor<T> dst{ src.shape(), src.data_type(), 1 };
43 
44  const int32_t n_dims = static_cast<int32_t>(src.shape().num_dimensions());
45  ARM_COMPUTE_ERROR_ON(axis < -n_dims || axis >= n_dims);
46 
47  const unsigned int actual_axis = static_cast<unsigned int>(wrap_around(axis, n_dims));
48  Window window;
49  window.use_tensor_dimensions(src.shape());
50  const unsigned int axis_dimension = src.shape()[actual_axis];
51  window.set(actual_axis, Window::Dimension(0, 1, 1));
52 
53  execute_window_loop(window, [&](const Coordinates & id)
54  {
55  // Find max along axis
56  Coordinates offset(id);
57  offset.set(actual_axis, 0);
58  T max = *reinterpret_cast<const T *>(src(offset));
59  for(unsigned int axis_id = 1; axis_id < axis_dimension; ++axis_id)
60  {
61  offset.set(actual_axis, axis_id);
62  const T val = *reinterpret_cast<const T *>(src(offset));
63  if(val > max)
64  {
65  max = val;
66  }
67  }
68 
69  // Regularize
70  T sum(0.f);
71  for(unsigned int axis_id = 0; axis_id < axis_dimension; ++axis_id)
72  {
73  offset.set(actual_axis, axis_id);
74  const T val = *reinterpret_cast<const T *>(src(offset));
75  T res{ (val - max) *beta };
76  if(is_log)
77  {
78  sum += std::exp(res);
79  }
80  else
81  {
82  res = std::exp(res);
83  sum += res;
84  }
85  *reinterpret_cast<T *>(dst(offset)) = res;
86  }
87 
88  // Normalize
89  for(unsigned int axis_id = 0; axis_id < axis_dimension; ++axis_id)
90  {
91  offset.set(actual_axis, axis_id);
92  const T val = *reinterpret_cast<const T *>(dst(offset));
93  if(is_log)
94  {
95  *reinterpret_cast<T *>(dst(offset)) = val - static_cast<T>(std::log(sum));
96  }
97  else
98  {
99  *reinterpret_cast<T *>(dst(offset)) = val / sum;
100  }
101  }
102  });
103  return dst;
104 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::dst, arm_compute::execute_window_loop(), offset(), Window::set(), arm_compute::test::validation::src, Window::use_tensor_dimensions(), and arm_compute::wrap_around().

◆ space_to_batch() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::space_to_batch ( const SimpleTensor< float > &  src,
const SimpleTensor< int32_t > &  block_shape,
const SimpleTensor< int32_t > &  paddings,
const TensorShape dst_shape 
)

◆ space_to_batch() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::space_to_batch ( const SimpleTensor< half > &  src,
const SimpleTensor< int32_t > &  block_shape,
const SimpleTensor< int32_t > &  paddings,
const TensorShape dst_shape 
)

◆ space_to_batch() [3/4]

SimpleTensor< T > space_to_batch ( const SimpleTensor< T > &  src,
const SimpleTensor< int32_t > &  block_shape,
const SimpleTensor< int32_t > &  paddings,
const TensorShape dst_shape 
)

Definition at line 38 of file SpaceToBatch.cpp.

39 {
40  SimpleTensor<T> result(dst_shape, src.data_type(), 1, src.quantization_info());
41 
42  const auto width_out = static_cast<int>(dst_shape[0]);
43  const auto height_out = static_cast<int>(dst_shape[1]);
44  const auto batch_out = static_cast<int>(dst_shape[3]);
45 
46  const auto width_in = static_cast<int>(src.shape()[0]);
47  const auto height_in = static_cast<int>(src.shape()[1]);
48  const auto batch_in = static_cast<int>(src.shape()[3]);
49 
50  const auto channel = static_cast<int>(src.shape()[2]);
51 
52  const auto block_width = block_shape[0];
53  const auto block_height = block_shape[1];
54 
55  const auto padding_left = paddings[0];
56  const auto padding_top = paddings[2];
57 
58  // Pad value must be logic zero
59  const auto pad_value = is_data_type_quantized(src.data_type()) ? src.quantization_info().uniform().offset : 0;
60 
61  int out_pos = 0;
62  for(int outB = 0; outB < batch_out; ++outB)
63  {
64  unsigned int inB = outB % batch_in;
65 
66  int shift_w = (outB / batch_in) % block_width;
67  int shift_h = (outB / batch_in) / block_width;
68 
69  for(int c = 0; c < channel; ++c)
70  {
71  for(int outH = 0; outH < height_out; ++outH)
72  {
73  for(int outW = 0; outW < width_out; ++outW)
74  {
75  const auto in_pos = ((inB * channel + c) * height_in + ((outH * block_height + shift_h) - padding_top)) * width_in + (outW * block_width + shift_w) - padding_left;
76 
77  if(outH * block_height + shift_h < padding_top || outH * block_height + shift_h >= padding_top + height_in || outW * block_width + shift_w < padding_left
78  || outW * block_width + shift_w >= padding_left + width_in)
79  {
80  result[out_pos] = pad_value;
81  }
82  else
83  {
84  result[out_pos] = src[in_pos];
85  }
86  ++out_pos;
87  }
88  }
89  }
90  }
91  return result;
92 }

References arm_compute::test::validation::dst_shape, arm_compute::is_data_type_quantized(), and arm_compute::test::validation::src.

◆ space_to_batch() [4/4]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::space_to_batch ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< int32_t > &  block_shape,
const SimpleTensor< int32_t > &  paddings,
const TensorShape dst_shape 
)

◆ space_to_depth() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::space_to_depth ( const SimpleTensor< float > &  src,
const TensorShape dst_shape,
const int  block_shape 
)

◆ space_to_depth() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::space_to_depth ( const SimpleTensor< half > &  src,
const TensorShape dst_shape,
const int  block_shape 
)

◆ space_to_depth() [3/3]

SimpleTensor< T > space_to_depth ( const SimpleTensor< T > &  src,
const TensorShape dst_shape,
const int  block_shape 
)

Definition at line 38 of file SpaceToDepth.cpp.

39 {
40  SimpleTensor<T> result(dst_shape, src.data_type());
41 
42  const auto width_out = static_cast<int>(dst_shape[0]);
43  const auto height_out = static_cast<int>(dst_shape[1]);
44  const auto channel_out = static_cast<int>(dst_shape[2]);
45 
46  const auto width_in = static_cast<int>(src.shape()[0]);
47  const auto height_in = static_cast<int>(src.shape()[1]);
48  const auto channel_in = static_cast<int>(src.shape()[2]);
49 
50  const auto batch = static_cast<int>(src.shape()[3]);
51 
52  const auto block_width = block_shape;
53  const auto block_height = block_shape;
54 
55  int out_pos = 0;
56  for(int ba = 0; ba < batch; ++ba)
57  {
58  for(int outC = 0; outC < channel_out; ++outC)
59  {
60  unsigned int inC = outC % channel_in;
61 
62  int shift_w = (outC / channel_in) % block_width;
63  int shift_h = (outC / channel_in) / block_width;
64 
65  for(int outH = 0; outH < height_out; ++outH)
66  {
67  for(int outW = 0; outW < width_out; ++outW)
68  {
69  const auto in_pos = ((ba * channel_in + inC) * height_in + ((outH * block_height + shift_h))) * width_in + (outW * block_width + shift_w);
70  result[out_pos] = src[in_pos];
71  ++out_pos;
72  }
73  }
74  }
75  }
76  return result;
77 }

References arm_compute::test::validation::dst_shape, and arm_compute::test::validation::src.

◆ stack_layer() [1/4]

template SimpleTensor<char> arm_compute::test::validation::reference::stack_layer ( const std::vector< SimpleTensor< char >> &  in,
const TensorShape output_shape,
DataType  data_type,
unsigned int  axis 
)

◆ stack_layer() [2/4]

template SimpleTensor<int> arm_compute::test::validation::reference::stack_layer ( const std::vector< SimpleTensor< int >> &  in,
const TensorShape output_shape,
DataType  data_type,
unsigned int  axis 
)

◆ stack_layer() [3/4]

template SimpleTensor<short> arm_compute::test::validation::reference::stack_layer ( const std::vector< SimpleTensor< short >> &  in,
const TensorShape output_shape,
DataType  data_type,
unsigned int  axis 
)

◆ stack_layer() [4/4]

SimpleTensor< T > stack_layer ( const std::vector< SimpleTensor< T >> &  in,
const TensorShape output_shape,
DataType  data_type,
unsigned int  axis 
)

Definition at line 41 of file StackLayer.cpp.

42 {
44  ARM_COMPUTE_ERROR_ON(in.size() < 2);
45  ARM_COMPUTE_ERROR_ON(axis > in[0].shape().num_dimensions());
46 
47  SimpleTensor<T> out{ output_shape, data_type };
48 
49  const int width = in[0].shape()[0];
50  const int height = in[0].shape()[1];
51  const int depth = in[0].shape()[2];
52  const int batch_size = in[0].shape()[3];
53  const int num_tensors = in.size();
54 
55  // Array to store the input coordinates
56  // i_coordinates[0] = xi, i_coordinates[1] = yi, i_coordinates[2] = zi
57  // i_coordinates[3] = bi, i_coordinates[4] = i, i_coordinates[5] = 0
58  // i_coordinates[5] will be always zero and used for not incrementing the output when the input has less than 4 dimensions
59  std::array<int, 6> i_coordinates{ 0 };
60 
61  // Array of pointers used to map the output coordinates to the input ones accordingly with the axis
62  // This array is initialized with &i_coordinates[5] since this will be always zero
63  std::array<int *, 5> o_coordinates = { &i_coordinates[5], &i_coordinates[5], &i_coordinates[5], &i_coordinates[5], &i_coordinates[5] };
64 
65  // Set the axis coordinate
66  o_coordinates[axis] = &i_coordinates[4];
67 
68  unsigned int k_shift = 0;
69 
70  // Map the output coordinates
71  for(unsigned int k = 0; k < in[0].shape().num_dimensions(); ++k)
72  {
73  if(k == axis)
74  {
75  k_shift++;
76  }
77 
78  o_coordinates[k + k_shift] = &i_coordinates[k];
79  }
80 
81  // Use alias for the input coordinates
82  int &xi = i_coordinates[0];
83  int &yi = i_coordinates[1];
84  int &zi = i_coordinates[2];
85  int &bi = i_coordinates[3];
86  int &i = i_coordinates[4];
87 
88  // Use alias for the output coordinates
89  int &xo = *(o_coordinates[0]);
90  int &yo = *(o_coordinates[1]);
91  int &zo = *(o_coordinates[2]);
92  int &bo = *(o_coordinates[3]);
93  int &wo = *(o_coordinates[4]);
94 
95  // Stack tensors
96  for(; i < num_tensors; ++(i))
97  {
98  bi = 0;
99  for(; bi < batch_size; ++(bi))
100  {
101  zi = 0;
102  for(; zi < depth; ++(zi))
103  {
104  yi = 0;
105  for(; yi < height; ++(yi))
106  {
107  xi = 0;
108  for(; xi < width; ++(xi))
109  {
110  *(reinterpret_cast<T *>(out(Coordinates(xo, yo, zo, bo, wo)))) = *(reinterpret_cast<const T *>(in[i](Coordinates(xi, yi, zi, bi))));
111  }
112  }
113  }
114  }
115  }
116 
117  return out;
118 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::data_type, Dimensions< T >::num_dimensions(), arm_compute::test::validation::output_shape, and arm_compute::test::validation::shape.

◆ strided_slice() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::strided_slice ( const SimpleTensor< float > &  src,
Coordinates  starts,
Coordinates  ends,
BiStrides  strides,
int32_t  begin_mask,
int32_t  end_mask,
int32_t  shrink_axis_mask 
)

◆ strided_slice() [2/3]

template SimpleTensor<half_float::half> arm_compute::test::validation::reference::strided_slice ( const SimpleTensor< half_float::half > &  src,
Coordinates  starts,
Coordinates  ends,
BiStrides  strides,
int32_t  begin_mask,
int32_t  end_mask,
int32_t  shrink_axis_mask 
)

◆ strided_slice() [3/3]

SimpleTensor< T > strided_slice ( const SimpleTensor< T > &  src,
Coordinates  starts,
Coordinates  ends,
BiStrides  strides,
int32_t  begin_mask,
int32_t  end_mask,
int32_t  shrink_axis_mask 
)

Definition at line 80 of file SliceOperations.cpp.

83 {
85 
86  // Validation checks
87  ARM_COMPUTE_ERROR_ON(src.shape().num_dimensions() > 4);
88  ARM_COMPUTE_ERROR_ON(starts.num_dimensions() > src.shape().num_dimensions());
89  ARM_COMPUTE_ERROR_ON(ends.num_dimensions() > src.shape().num_dimensions());
90  ARM_COMPUTE_ERROR_ON(strides.num_dimensions() > src.shape().num_dimensions());
91  ARM_COMPUTE_ERROR_ON(std::any_of(strides.cbegin(), strides.cbegin() + strides.num_dimensions(), [](int i)
92  {
93  return i == 0;
94  }));
95 
96  // Get source shape
97  const TensorShape &src_shape = src.shape();
98 
99  // Get destination shape
100  const TensorShape dst_shape = compute_strided_slice_output_shape(src_shape, starts, ends, strides, begin_mask, end_mask, shrink_axis_mask);
101 
102  // Create destination tensor
103  SimpleTensor<T> dst{ dst_shape, src.data_type(), 1 };
104 
105  // Get coordinates
106  Coordinates starts_abs{};
107  Coordinates ends_abs{};
108  Coordinates final_strides{};
109  std::tie(starts_abs, ends_abs, final_strides) = calculate_strided_slice_coords(src_shape,
110  starts, ends, strides,
111  begin_mask, end_mask, shrink_axis_mask);
112 
113  // Perform strided slice
114  unsigned int idx = 0;
115  Window win;
116  win.use_tensor_dimensions(compute_strided_slice_output_shape(src_shape,
117  starts, ends, strides,
118  begin_mask, end_mask, shrink_axis_mask, true));
119  execute_window_loop(win, [&](const Coordinates & id)
120  {
121  Coordinates offset;
122  for(unsigned int i = 0; i < id.num_dimensions(); ++i)
123  {
124  offset.set(i, starts_abs[i] + id[i] * final_strides[i]);
125  }
126  dst.data()[idx++] = *reinterpret_cast<const T *>(src(offset));
127  });
128 
129  return dst;
130 }

References ARM_COMPUTE_ERROR_ON, arm_compute::helpers::tensor_transform::calculate_strided_slice_coords(), Dimensions< T >::cbegin(), arm_compute::helpers::tensor_transform::compute_strided_slice_output_shape(), arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, arm_compute::execute_window_loop(), Dimensions< T >::num_dimensions(), offset(), arm_compute::test::validation::src, and Window::use_tensor_dimensions().

◆ table_lookup() [1/3]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::table_lookup ( const SimpleTensor< int16_t > &  src,
const std::map< int16_t, int16_t > &  rawlut 
)

◆ table_lookup() [2/3]

SimpleTensor< T > table_lookup ( const SimpleTensor< T > &  src,
const std::map< T, T > &  rawlut 
)

Definition at line 37 of file TableLookup.cpp.

38 {
39  SimpleTensor<T> result(src.shape(), src.data_type());
40 
41  for(int i = 0; i < src.num_elements(); ++i)
42  {
43  result[i] = rawlut.at(src[i]);
44  }
45 
46  return result;
47 }

References arm_compute::test::validation::src.

◆ table_lookup() [3/3]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::table_lookup ( const SimpleTensor< uint8_t > &  src,
const std::map< uint8_t, uint8_t > &  rawlut 
)

◆ tile() [1/9]

template SimpleTensor<float> arm_compute::test::validation::reference::tile ( const SimpleTensor< float > &  src,
const Multiples multiples 
)

◆ tile() [2/9]

template SimpleTensor<half> arm_compute::test::validation::reference::tile ( const SimpleTensor< half > &  src,
const Multiples multiples 
)

◆ tile() [3/9]

template SimpleTensor<int16_t> arm_compute::test::validation::reference::tile ( const SimpleTensor< int16_t > &  src,
const Multiples multiples 
)

◆ tile() [4/9]

template SimpleTensor<int32_t> arm_compute::test::validation::reference::tile ( const SimpleTensor< int32_t > &  src,
const Multiples multiples 
)

◆ tile() [5/9]

template SimpleTensor<int8_t> arm_compute::test::validation::reference::tile ( const SimpleTensor< int8_t > &  src,
const Multiples multiples 
)

◆ tile() [6/9]

SimpleTensor< T > tile ( const SimpleTensor< T > &  src,
const Multiples multiples 
)

Definition at line 38 of file Tile.cpp.

39 {
40  // Create reference
41  const auto src_shape = src.shape();
42  const auto tiled_shape = misc::shape_calculator::compute_tiled_shape(src.shape(), multiples);
43 
44  SimpleTensor<T> dst{ tiled_shape, src.data_type() };
45 
46  const uint32_t num_elements = dst.num_elements();
47  for(uint32_t idx = 0; idx < num_elements; idx++)
48  {
49  Coordinates coord = index2coord(tiled_shape, idx);
50 
51  const size_t x = coord.x();
52  const size_t y = coord.y();
53  const size_t z = coord.z();
54  const size_t w = coord[3];
55 
56  Coordinates src_coords{ x % src_shape[0], y % src_shape[1], z % src_shape[2], w % src_shape[3] };
57  int src_idx = coord2index(src_shape, src_coords);
58 
59  dst[idx] = src[src_idx];
60  }
61 
62  return dst;
63 }

References arm_compute::misc::shape_calculator::compute_tiled_shape(), arm_compute::test::coord2index(), arm_compute::test::validation::dst, arm_compute::test::index2coord(), arm_compute::test::validation::src, arm_compute::test::validation::w, Dimensions< T >::x(), Dimensions< T >::y(), and Dimensions< T >::z().

Referenced by arm_compute::test::validation::get_tile().

◆ tile() [7/9]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::tile ( const SimpleTensor< uint16_t > &  src,
const Multiples multiples 
)

◆ tile() [8/9]

template SimpleTensor<uint32_t> arm_compute::test::validation::reference::tile ( const SimpleTensor< uint32_t > &  src,
const Multiples multiples 
)

◆ tile() [9/9]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::tile ( const SimpleTensor< uint8_t > &  src,
const Multiples multiples 
)

◆ transpose() [1/6]

template SimpleTensor<float> arm_compute::test::validation::reference::transpose ( const SimpleTensor< float > &  src)

◆ transpose() [2/6]

template SimpleTensor<half> arm_compute::test::validation::reference::transpose ( const SimpleTensor< half > &  src)

◆ transpose() [3/6]

SimpleTensor< T > transpose ( const SimpleTensor< T > &  src)

Definition at line 38 of file Transpose.cpp.

39 {
40  // Make rows the columns of the original shape
41  TensorShape dst_shape{ src.shape().y(), src.shape().x() };
42 
43  // Create reference
44  SimpleTensor<T> dst{ dst_shape, src.data_type() };
45 
46  // Compute reference
47  const uint32_t num_elements = src.num_elements();
48  for(uint32_t i = 0; i < num_elements; ++i)
49  {
50  const Coordinates coord = index2coord(src.shape(), i);
51  const Coordinates dst_coord{ coord.y(), coord.x() };
52  const size_t dst_index = coord2index(dst.shape(), dst_coord);
53 
54  dst[dst_index] = src[i];
55  }
56 
57  return dst;
58 }

References arm_compute::test::coord2index(), arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, arm_compute::test::index2coord(), arm_compute::test::validation::src, Dimensions< T >::x(), and Dimensions< T >::y().

◆ transpose() [4/6]

template SimpleTensor<uint16_t> arm_compute::test::validation::reference::transpose ( const SimpleTensor< uint16_t > &  src)

◆ transpose() [5/6]

template SimpleTensor<uint32_t> arm_compute::test::validation::reference::transpose ( const SimpleTensor< uint32_t > &  src)

◆ transpose() [6/6]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::transpose ( const SimpleTensor< uint8_t > &  src)

◆ unstack() [1/4]

template std::vector<SimpleTensor<float> > arm_compute::test::validation::reference::unstack ( const SimpleTensor< float > &  input_tensor,
std::vector< SimpleTensor< float >> &  output_tensors,
int  axis 
)

◆ unstack() [2/4]

template std::vector<SimpleTensor<half> > arm_compute::test::validation::reference::unstack ( const SimpleTensor< half > &  input_tensor,
std::vector< SimpleTensor< half >> &  output_tensors,
int  axis 
)

◆ unstack() [3/4]

std::vector< SimpleTensor< T > > unstack ( const SimpleTensor< T > &  input_tensor,
std::vector< SimpleTensor< T >> &  output_tensors,
int  axis 
)

Definition at line 87 of file Unstack.cpp.

88 {
89  // Wrap around negative values
90  const unsigned int axis_u = wrap_around(axis, static_cast<int>(input_tensor.shape().num_dimensions()));
91  ARM_COMPUTE_ERROR_ON(axis_u >= input_tensor.shape().num_dimensions());
92  for(size_t k = 0; k < output_tensors.size(); ++k)
93  {
94  SimpleTensor<T> &output = output_tensors[k];
95  const SimpleTensor<T> kth_slice = get_slice(input_tensor, axis_u, k);
96  output = copy_tensor<T>(kth_slice);
97  }
98  return output_tensors;
99 }

References ARM_COMPUTE_ERROR_ON, SimpleTensor< T >::shape(), and arm_compute::wrap_around().

◆ unstack() [4/4]

template std::vector<SimpleTensor<uint8_t> > arm_compute::test::validation::reference::unstack ( const SimpleTensor< uint8_t > &  input_tensor,
std::vector< SimpleTensor< uint8_t >> &  output_tensors,
int  axis 
)

◆ weights_reshape() [1/4]

template SimpleTensor<float> arm_compute::test::validation::reference::weights_reshape ( const SimpleTensor< float > &  src,
const SimpleTensor< float > &  biases,
const TensorShape dst_shape,
const unsigned int  num_groups 
)

◆ weights_reshape() [2/4]

template SimpleTensor<half> arm_compute::test::validation::reference::weights_reshape ( const SimpleTensor< half > &  src,
const SimpleTensor< half > &  biases,
const TensorShape dst_shape,
const unsigned int  num_groups 
)

◆ weights_reshape() [3/4]

SimpleTensor< T > weights_reshape ( const SimpleTensor< T > &  src,
const SimpleTensor< T > &  biases,
const TensorShape dst_shape,
const unsigned int  num_groups 
)

Definition at line 38 of file WeightsReshape.cpp.

39 {
40  SimpleTensor<T> dst{ dst_shape, src.data_type(), 1 };
41 
42  // Compute reference
43  const bool has_bias = biases.size() > 0;
44  const size_t linear_sz = src.shape().total_size_lower(3);
45  const size_t group_sz = src.shape()[3] / num_groups;
46 
47  for(size_t g = 0; g < num_groups; ++g)
48  {
49  for(size_t w = 0; w < group_sz; ++w)
50  {
51  const size_t curr_weight = g * group_sz + w;
52 
53  size_t i = 0;
54  for(; i < linear_sz; ++i)
55  {
56  dst[coord2index(dst.shape(), Coordinates(w, i, g))] = src[curr_weight * linear_sz + i];
57  }
58  if(has_bias)
59  {
60  dst[coord2index(dst.shape(), Coordinates(w, i, g))] = static_cast<T>(biases[curr_weight]);
61  }
62  }
63  }
64 
65  return dst;
66 }

References arm_compute::test::coord2index(), arm_compute::test::validation::dst, arm_compute::test::validation::dst_shape, arm_compute::test::validation::has_bias, arm_compute::test::validation::num_groups, SimpleTensor< T >::size(), arm_compute::test::validation::src, and arm_compute::test::validation::w.

◆ weights_reshape() [4/4]

template SimpleTensor<uint8_t> arm_compute::test::validation::reference::weights_reshape ( const SimpleTensor< uint8_t > &  src,
const SimpleTensor< uint8_t > &  biases,
const TensorShape dst_shape,
const unsigned int  num_groups 
)

◆ winograd_filter_transform() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::winograd_filter_transform ( const SimpleTensor< float > &  in,
const TensorShape output_shape,
const WinogradInfo winograd_info 
)

◆ winograd_filter_transform() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::winograd_filter_transform ( const SimpleTensor< half > &  in,
const TensorShape output_shape,
const WinogradInfo winograd_info 
)

◆ winograd_filter_transform() [3/3]

SimpleTensor< T > winograd_filter_transform ( const SimpleTensor< T > &  in,
const TensorShape output_shape,
const WinogradInfo winograd_info 
)

Definition at line 360 of file Winograd.cpp.

361 {
362  ARM_COMPUTE_ERROR_ON_MSG(in.data_layout() != DataLayout::NCHW, "Only supported NCHW data format");
363 
364  // Create reference
365  SimpleTensor<T> out{ output_shape, in.data_type(), 1 };
366 
367  const Size2D output_tile_size = winograd_info.output_tile_size;
368  const Size2D kernel_size = winograd_info.kernel_size;
369 
370  // Calculate dimensions for the tile
371  const unsigned int input_tile_w = output_tile_size.width + kernel_size.width - 1;
372  const unsigned int input_tile_h = output_tile_size.height + kernel_size.height - 1;
373  const unsigned int input_tile_area = input_tile_w * input_tile_h;
374 
375  // Get the maximum dimension from the filter size
376  const unsigned int kernel_max_dim = std::max(kernel_size.width, kernel_size.height);
377 
378  // Get the maximum dimension from the input tile
379  const unsigned int input_tile_max_dim = std::max(input_tile_w, input_tile_h);
380 
381  // Simple tensor for the input tile
382  SimpleTensor<T> input_tile{ TensorShape(kernel_max_dim, kernel_max_dim), in.data_type(), 1 };
383 
384  // Simple tensor for the transformation matrix
385  SimpleTensor<T> trans_matrix{ TensorShape(kernel_max_dim, input_tile_max_dim), in.data_type(), 1 };
386 
387  // Simple tensor for the transformation matrix transpose
388  SimpleTensor<T> trans_matrix_transposed{ TensorShape(input_tile_max_dim, kernel_max_dim), in.data_type(), 1 };
389 
390  // Simple tensor for the temporary tile
391  SimpleTensor<T> tmp_tile{ TensorShape(kernel_max_dim, input_tile_max_dim), in.data_type(), 1 };
392 
393  // Simple tensor for the output tile
394  SimpleTensor<T> transf_tile{ TensorShape(input_tile_max_dim, input_tile_max_dim), in.data_type(), 1 };
395 
396  // Initialize matrix for the filter transform
397  initialize_matrix_transform(trans_matrix, output_tile_size, kernel_size, WinogradTransformType::FILTER);
398 
399  // Transpose the transformation matrix
400  transpose_matrix<T>(trans_matrix, trans_matrix_transposed);
401 
402  const int num_channels = in.shape()[2];
403  const int num_filters = in.shape()[3];
404  const int num_batches = in.shape().total_size() / (kernel_size.area() * num_channels * num_filters);
405 
406  // If we have a vertical filter (i.e. 1x3, 1x5,..), we need to take the elements along the y direction (step_y_transf_tile = width of the output tile)
407  const int step_y_transf_tile = kernel_size.width == 1 ? input_tile_max_dim : 1;
408 
409  for(int n = 0; n < num_batches; ++n)
410  {
411  for(int w = 0; w < num_filters; ++w)
412  {
413  for(int z = 0; z < num_channels; ++z)
414  {
415  // Load the tile from the input tensor
416  get_tile<T>(in, input_tile, Coordinates(0, 0, z, w, n));
417 
418  // First transformation
419  matrix_multiply<T>(trans_matrix, input_tile, tmp_tile);
420 
421  // Second transformation
422  matrix_multiply<T>(tmp_tile, trans_matrix_transposed, transf_tile);
423 
424  // Store the output tile across the channels
425  const int output_offset = w + z * num_filters;
426 
427  // Store the values across the channels
428  for(unsigned int i = 0; i < input_tile_area; ++i)
429  {
430  out[output_offset + i * num_filters * num_channels] = transf_tile[i * step_y_transf_tile];
431  }
432  }
433  }
434  }
435 
436  return out;
437 }

References Size2D::area(), ARM_COMPUTE_ERROR_ON_MSG, SimpleTensor< T >::data_layout(), SimpleTensor< T >::data_type(), FILTER, Size2D::height, WinogradInfo::kernel_size, arm_compute::NCHW, arm_compute::test::validation::output_shape, WinogradInfo::output_tile_size, SimpleTensor< T >::shape(), arm_compute::test::validation::w, and Size2D::width.

◆ winograd_input_transform() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::winograd_input_transform ( const SimpleTensor< float > &  in,
const TensorShape output_shape,
const WinogradInfo winograd_info 
)

◆ winograd_input_transform() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::winograd_input_transform ( const SimpleTensor< half > &  in,
const TensorShape output_shape,
const WinogradInfo winograd_info 
)

◆ winograd_input_transform() [3/3]

SimpleTensor< T > winograd_input_transform ( const SimpleTensor< T > &  in,
const TensorShape output_shape,
const WinogradInfo winograd_info 
)

Definition at line 236 of file Winograd.cpp.

237 {
238  ARM_COMPUTE_ERROR_ON(in.data_layout() != DataLayout::NCHW);
239 
240  const PadStrideInfo conv_info = winograd_info.convolution_info;
241  const Size2D output_tile_size = winograd_info.output_tile_size;
242  const Size2D kernel_size = winograd_info.kernel_size;
243 
244  SimpleTensor<T> out{ output_shape, in.data_type() };
245 
246  // Calculate dimensions for the tile
247  const unsigned int tile_w = output_tile_size.width + kernel_size.width - 1;
248  const unsigned int tile_h = output_tile_size.height + kernel_size.height - 1;
249 
250  // Get the maximum dimension from the tile size
251  const unsigned int tile_max_dim = std::max(tile_w, tile_h);
252 
253  TensorShape tile_dims(tile_max_dim, tile_max_dim);
254 
255  // Simple tensor for the input tile
256  SimpleTensor<T> src_tile{ tile_dims, in.data_type() };
257 
258  // Simple tensor for the temporary tile
259  SimpleTensor<T> tmp_tile{ tile_dims, in.data_type() };
260 
261  // Simple tensor for the output tile
262  SimpleTensor<T> dst_tile{ tile_dims, in.data_type() };
263 
264  // Simple tensor for the transformation matrix
265  SimpleTensor<T> matrix{ tile_dims, in.data_type() };
266 
267  // Simple tensor for the transformation matrix transposed
268  SimpleTensor<T> matrix_transposed{ tile_dims, in.data_type() };
269 
270  // Initialize matrix for the input transform
271  initialize_matrix_transform(matrix, output_tile_size, kernel_size, WinogradTransformType::INPUT);
272 
273  // Transpose matrix
274  transpose_matrix<T>(matrix, matrix_transposed);
275 
276  const int in_w = in.shape().x();
277  const int in_h = in.shape().y();
278  const int in_d = in.shape().z();
279  const int out_d = out.shape().z();
280  const int num_batches = in.shape().total_size() / (in_w * in_h * in_d);
281  const int step_x = output_tile_size.width;
282  const int step_y = output_tile_size.height;
283 
284  // Compute the number of output tiles along the x and y direction of size "output_tile_size"
285  const Size2D num_tiles = compute_winograd_convolution_tiles(Size2D(in_w, in_h),
286  kernel_size,
287  output_tile_size,
288  conv_info);
289 
290  const int num_tiles_x = num_tiles.width;
291  const int num_tiles_y = num_tiles.height;
292 
293  // In case of 1D convolution, the input tile has to be partially filled with zeros
294  int start_x_zero = 0;
295  int start_y_zero = 0;
296  int end_x_zero = 0;
297  int end_y_zero = 0;
298 
299  if(output_tile_size.width == 1)
300  {
301  start_x_zero = 1;
302  start_y_zero = 0;
303  end_x_zero = tile_max_dim - 1;
304  end_y_zero = tile_max_dim;
305  }
306  else if(output_tile_size.height == 1)
307  {
308  start_x_zero = 0;
309  start_y_zero = 1;
310  end_x_zero = tile_max_dim;
311  end_y_zero = tile_max_dim - 1;
312  }
313 
314  // Set the anchor and shape of the zeros area
315  const Coordinates anchor_zeros(start_x_zero, start_y_zero);
316  const TensorShape shape_zeros(end_x_zero, end_y_zero);
317 
318  // If we have a vertical filter (i.e. 1x3, 1x5,..), we need to take the elements along the y direction (step = width of the output tile)
319  const int step_y_transf_tile = kernel_size.width == 1 ? tile_max_dim : 1;
320 
321  ARM_COMPUTE_ERROR_ON((num_tiles_x * num_tiles_y) != static_cast<int>(out.shape().y()));
322 
323  for(int b = 0; b < num_batches; ++b)
324  {
325  for(int z = 0; z < in_d; ++z)
326  {
327  for(int y = 0; y < num_tiles_y; ++y)
328  {
329  for(int x = 0; x < num_tiles_x; ++x)
330  {
331  int xi = x * step_x - conv_info.pad_left();
332  int yi = y * step_y - conv_info.pad_top();
333 
334  // Get the tile from the input tensor
335  get_tile<T>(in, src_tile, Coordinates(xi, yi, z, b));
336 
337  // Fill partially with zeros in case of 1D convolution
338  zeros<T>(src_tile, anchor_zeros, shape_zeros);
339 
340  // Compute the transformation
341  matrix_multiply<T>(matrix, src_tile, tmp_tile);
342  matrix_multiply<T>(tmp_tile, matrix_transposed, dst_tile);
343 
344  // Store the output tile across the channels
345  for(int i = 0; i < out_d; ++i)
346  {
347  int xo = z;
348  int yo = x + y * num_tiles_x;
349  out[coords2index(out.shape(), Coordinates(xo, yo, i, b))] = dst_tile[i * step_y_transf_tile];
350  }
351  }
352  }
353  }
354  }
355 
356  return out;
357 }

References ARM_COMPUTE_ERROR_ON, arm_compute::test::validation::b, arm_compute::compute_winograd_convolution_tiles(), arm_compute::test::validation::conv_info, WinogradInfo::convolution_info, arm_compute::coords2index(), SimpleTensor< T >::data_layout(), SimpleTensor< T >::data_type(), Size2D::height, INPUT, WinogradInfo::kernel_size, arm_compute::NCHW, arm_compute::test::validation::output_shape, WinogradInfo::output_tile_size, SimpleTensor< T >::shape(), and Size2D::width.

Referenced by CpuWinogradConv2dTransformInputKernel::run_op().

◆ winograd_output_transform() [1/3]

template SimpleTensor<float> arm_compute::test::validation::reference::winograd_output_transform ( const SimpleTensor< float > &  in,
const SimpleTensor< float > &  b,
const TensorShape output_shape,
const WinogradInfo winograd_info 
)

◆ winograd_output_transform() [2/3]

template SimpleTensor<half> arm_compute::test::validation::reference::winograd_output_transform ( const SimpleTensor< half > &  in,
const SimpleTensor< half > &  b,
const TensorShape output_shape,
const WinogradInfo winograd_info 
)

◆ winograd_output_transform() [3/3]

SimpleTensor< T > winograd_output_transform ( const SimpleTensor< T > &  in,
const SimpleTensor< T > &  b,
const TensorShape output_shape,
const WinogradInfo winograd_info 
)

Definition at line 440 of file Winograd.cpp.

441 {
442  const PadStrideInfo conv_info = winograd_info.convolution_info;
443  const Size2D input_dimensions = winograd_info.input_dimensions;
444  const Size2D output_tile_size = winograd_info.output_tile_size;
445  const Size2D kernel_size = winograd_info.kernel_size;
446 
447  // Create reference
448  SimpleTensor<T> out{ output_shape, in.data_type(), 1 };
449 
450  // Calculate dimensions for the tiles
451  const unsigned int in_tile_w = output_tile_size.width + kernel_size.width - 1;
452  const unsigned int in_tile_h = output_tile_size.height + kernel_size.height - 1;
453  const unsigned int out_tile_w = output_tile_size.width;
454  const unsigned int out_tile_h = output_tile_size.height;
455 
456  ARM_COMPUTE_ERROR_ON(in.shape()[2] != (in_tile_w * in_tile_h));
457  ARM_COMPUTE_ERROR_ON(in.shape()[0] != out.shape()[get_data_layout_dimension_index(winograd_info.output_data_layout, DataLayoutDimension::CHANNEL)]);
458 
459  // Get the maximum dimension from the tile size
460  const unsigned int in_tile_max_dim = std::max(in_tile_w, in_tile_h);
461  const unsigned int out_tile_max_dim = std::max(output_tile_size.width, output_tile_size.height);
462 
463  // Compute tile dimensions
464  // Input tile dimensions
465  TensorShape in_tile_dims(in_tile_max_dim, in_tile_max_dim);
466 
467  // Output tile dimensions
468  TensorShape out_tile_dims(out_tile_max_dim, out_tile_max_dim);
469 
470  // Transformation matrix dimensions
471  TensorShape tr_tile_dims(in_tile_max_dim, out_tile_max_dim);
472 
473  // Create tensors
474  // Simple tensor for the input tile
475  SimpleTensor<T> input_tile{ in_tile_dims, in.data_type(), 1 };
476 
477  // Simple tensor for the transformation matrix
478  SimpleTensor<T> trans_matrix{ tr_tile_dims, in.data_type(), 1 };
479 
480  // Simple tensor for the transformation matrix transpose
481  SimpleTensor<T> trans_matrix_transposed{ TensorShape(tr_tile_dims[1], tr_tile_dims[0]), in.data_type(), 1 };
482 
483  // Simple tensor for the temporary tile
484  SimpleTensor<T> tmp_tile{ tr_tile_dims, in.data_type(), 1 };
485 
486  // Simple tensor for the output tile
487  SimpleTensor<T> output_tile{ out_tile_dims, in.data_type(), 1 };
488 
489  // Initialize matrix for the output transform
490  initialize_matrix_transform(trans_matrix, output_tile_size, kernel_size, WinogradTransformType::OUTPUT);
491 
492  // Transpose the transformation matrix
493  transpose_matrix<T>(trans_matrix, trans_matrix_transposed);
494 
495  const int w_in = in.shape()[0];
496  const int h_in = in.shape()[1];
497  const int c_in = in.shape()[2];
498  const int w_out = out.shape()[0];
499  const int h_out = out.shape()[1];
500  const int c_out = out.shape()[2];
501  const int num_batches = in.shape().total_size() / (w_in * h_in * c_in);
502 
503  // Input strides
504  const int stridey_in = w_in;
505  const int stridez_in = stridey_in * h_in;
506  const int stridew_in = stridez_in * c_in;
507 
508  // Output strides
509  const int stridey_out = w_out;
510  const int stridez_out = stridey_out * h_out;
511  const int stridew_out = stridez_out * c_out;
512 
513  // Compute the number of output tiles along the x and y direction of size "output_tile_size"
514  const Size2D num_tiles = compute_winograd_convolution_tiles(Size2D(input_dimensions.width, input_dimensions.height),
515  kernel_size,
516  output_tile_size,
517  conv_info);
518 
519  const int num_tiles_x = num_tiles.width;
520  const int num_tiles_y = num_tiles.height;
521 
522  ARM_COMPUTE_UNUSED(num_tiles_y);
523  ARM_COMPUTE_ERROR_ON(in.shape()[1] != static_cast<unsigned int>(num_tiles_x * num_tiles_y));
524 
525  // If we have a vertical filter (i.e. 1x3, 1x5,..), we still need to take the elements along the x direction (step_y_transf_tile = 1)
526  const int step_y_transf_tile = kernel_size.width == 1 ? 1 : output_tile.shape()[0];
527 
528  // Initialize with zeros the input tile
529  zeros<T>(input_tile, Coordinates(0, 0), input_tile.shape());
530 
531  for(int n = 0; n < num_batches; ++n)
532  {
533  for(int y = 0; y < h_in; ++y)
534  {
535  for(int x = 0; x < w_in; ++x)
536  {
537  // Load the input tile tile across the channels of the input tensor
538  for(int z = 0; z < c_in; ++z)
539  {
540  input_tile[z] = in[x + (y * stridey_in) + (z * stridez_in) + (n * stridew_in)];
541  }
542 
543  // First transformation
544  matrix_multiply<T>(trans_matrix, input_tile, tmp_tile);
545 
546  // Second transformation
547  matrix_multiply<T>(tmp_tile, trans_matrix_transposed, output_tile);
548 
549  // Store the output tile
550  const int xo = (y % num_tiles_x) * out_tile_w;
551  const int yo = (y / num_tiles_x) * out_tile_h;
552  const int zo = x;
553 
554  const int output_offset = xo + (yo * stridey_out) + (zo * stridez_out) + (n * stridew_out);
555 
556  for(int yi = 0; yi < static_cast<int>(out_tile_h); ++yi)
557  {
558  for(int xi = 0; xi < static_cast<int>(out_tile_w); ++xi)
559  {
560  // Check out-of-bound writes
561  if((xo + xi < w_out) && (yo + yi < h_out))
562  {
563  out[output_offset + yi * stridey_out + xi] = output_tile[xi + yi * step_y_transf_tile];
564 
565  // Add bias
566  out[output_offset + yi * stridey_out + xi] += b[zo];
567  }
568  }
569  }
570  }
571  }
572  }
573 
574  return out;
575 }

References ARM_COMPUTE_ERROR_ON, ARM_COMPUTE_UNUSED, arm_compute::test::validation::b, arm_compute::CHANNEL, arm_compute::compute_winograd_convolution_tiles(), arm_compute::test::validation::conv_info, WinogradInfo::convolution_info, SimpleTensor< T >::data_type(), arm_compute::get_data_layout_dimension_index(), Size2D::height, WinogradInfo::input_dimensions, WinogradInfo::kernel_size, OUTPUT, WinogradInfo::output_data_layout, arm_compute::test::validation::output_shape, WinogradInfo::output_tile_size, SimpleTensor< T >::shape(), and Size2D::width.

Referenced by CpuWinogradConv2dTransformOutputKernel::run_op().

arm_compute::test::validation::tensor_elem_at
T tensor_elem_at(const SimpleTensor< T > &src, Coordinates coord, BorderMode border_mode, T constant_border_value)
Definition: Utils.h:63
arm_compute::misc::shape_calculator::compute_pool3d_shape
TensorShape compute_pool3d_shape(const TensorShape &src, Pooling3dLayerInfo pool3d_info)
Calculate the output pool3d shape of a tensor.
Definition: ShapeCalculator.h:1662
arm_compute::test::validation::dst_shape
TensorShape dst_shape
Definition: DFT.cpp:164
arm_compute::test::validation::input_info
input_info
Definition: DirectConvolutionLayer.cpp:547
weights_CHout_dim
constexpr unsigned int weights_CHout_dim
Definition: Conv3D.cpp:43
arm_compute::test::validation::src
SimpleTensor< float > src
Definition: DFT.cpp:155
N
unsigned int N
Definition: CpuGemmAssemblyDispatch.cpp:105
type
decltype(strategy::transforms) typedef type
Definition: gemm_interleaved.hpp:347
arm_compute::test::validation::idx_height
const int idx_height
Definition: Scale.cpp:263
arm_compute::PaddingList
std::vector< PaddingInfo > PaddingList
List of padding information.
Definition: Types.h:402
arm_compute::DataLayout
DataLayout
[DataLayout enum definition]
Definition: CoreTypes.h:110
arm_compute::test::validation::reference::reverse
SimpleTensor< T > reverse(const SimpleTensor< T > &src, const SimpleTensor< int32_t > &axis, bool use_inverted_axis)
Definition: Reverse.cpp:38
arm_compute::test::validation::output_shape
TensorShape output_shape
Definition: LSTMLayerQuantized.cpp:469
arm_compute::helpers::tensor_transform
Definition: tensor_transform.h:33
arm_compute::compute_winograd_convolution_tiles
Size2D compute_winograd_convolution_tiles(const Size2D &in_dims, const Size2D &kernel_size, const Size2D &output_tile_size, const PadStrideInfo &conv_info)
Calculate the number of output tiles required by Winograd Convolution layer.
Definition: Helpers.h:250
arm_compute::FFTDirection::Inverse
@ Inverse
arm_compute::misc::shape_calculator::compute_pool_shape
TensorShape compute_pool_shape(const ITensorInfo &input, PoolingLayerInfo pool_info)
Calculate the output pool shape of a tensor.
Definition: ShapeCalculator.h:881
arm_compute::test::coord2index
int coord2index(const TensorShape &shape, const Coordinates &coord)
Linearise the given coordinate.
Definition: Utils.h:388
arm_compute::test::validation::src_ref
SimpleTensor< float > src_ref
Definition: Im2Col.cpp:213
caffe_mnist_image_extractor.rows
rows
Definition: caffe_mnist_image_extractor.py:30
arm_compute::test::validation::dst
auto dst
Definition: DFT.cpp:170
arm_compute::support::cpp11::lowest
T lowest()
Definition: ToolchainSupport.h:278
arm_compute::PadStrideInfo::pad
std::pair< unsigned int, unsigned int > pad() const
Get the padding.
Definition: CoreTypes.h:210
arm_compute::test::validation::reference::safe_read
T safe_read(const SimpleTensor< T > &t, int y, int x)
Definition: GEMMInterleaveBlocked.h:37
ARM_COMPUTE_ERROR_ON_MISMATCHING_DIMENSIONS
#define ARM_COMPUTE_ERROR_ON_MISMATCHING_DIMENSIONS(...)
Definition: Validate.h:291
arm_compute::test::validation::reference::ridft_2d
template SimpleTensor< half > ridft_2d(const SimpleTensor< half > &src, bool is_odd)
arm_compute::test::validation::convert_from_symmetric
SimpleTensor< float > convert_from_symmetric(const SimpleTensor< int16_t > &src)
Definition: Helpers.cpp:150
arm_compute::test::validation::sampling_policy
sampling_policy
Definition: Scale.cpp:250
ARM_COMPUTE_ERROR
#define ARM_COMPUTE_ERROR(msg)
Print the given message then throw an std::runtime_error.
Definition: Error.h:354
caffe_mnist_image_extractor.cols
cols
Definition: caffe_mnist_image_extractor.py:30
arm_compute::misc::shape_calculator::compute_slice_shape
TensorShape compute_slice_shape(const TensorShape &input_shape, const Coordinates &starts, const Coordinates &ends)
Calculate the slice output shape of a tensor.
Definition: ShapeCalculator.h:1190
arm_compute::scaled_dimensions
std::pair< unsigned int, unsigned int > scaled_dimensions(int width, int height, int kernel_width, int kernel_height, const PadStrideInfo &pad_stride_info, const Size2D &dilation=Size2D(1U, 1U))
Returns expected width and height of output scaled tensor depending on dimensions rounding mode.
Definition: Utils.cpp:288
arm_compute::test::SimpleTensor::shape
TensorShape shape() const override
Shape of the tensor.
Definition: SimpleTensor.h:329
arm_compute::test::validation::convert_from_asymmetric
SimpleTensor< float > convert_from_asymmetric(const SimpleTensor< uint8_t > &src)
Definition: Helpers.cpp:39
arm_compute::LogicalOperation::Unknown
@ Unknown
Unknown.
arm_compute::index2coords
Coordinates index2coords(const TensorShape &shape, int index)
Convert a linear index into n-dimensional coordinates.
Definition: Helpers.inl:164
arm_compute::element_size_from_data_type
size_t element_size_from_data_type(DataType dt)
The size in bytes of the data type.
Definition: DataTypeUtils.h:78
arm_compute::permute
void permute(Dimensions< T > &dimensions, const PermutationVector &perm)
Permutes given Dimensions according to a permutation vector.
Definition: Helpers.h:144
arm_compute::test::SimpleTensor::data_type
DataType data_type() const override
Data type of the tensor.
Definition: SimpleTensor.h:373
arm_compute::test::validation::reference::gemm
template SimpleTensor< half > gemm(const SimpleTensor< half > &a, const SimpleTensor< half > &b, const SimpleTensor< half > &c, float alpha, float beta)
arm_compute::test::is_in_valid_region
bool is_in_valid_region(const ValidRegion &valid_region, Coordinates coord)
Check if a coordinate is within a valid region.
Definition: Utils.h:406
arm_compute::test::validation::idx_width
const int idx_width
Definition: Scale.cpp:262
arm_compute::misc::shape_calculator::compute_gather_shape
TensorShape compute_gather_shape(const TensorShape &input_shape, const TensorShape &indices_shape, uint32_t actual_axis)
Calculate the gather output shape of a tensor.
Definition: ShapeCalculator.h:1704
arm_compute::test::validation::reference::elementwise_unary
template SimpleTensor< int32_t > elementwise_unary(const SimpleTensor< int32_t > &src, SimpleTensor< int32_t > &dst, ElementWiseUnary op)
arm_compute::wrap_around
T wrap_around(T x, T m)
Wrap-around a number within the range 0 <= x < m.
Definition: Helpers.h:277
get_invsqrt_quantized_multiplier_exp
int2 get_invsqrt_quantized_multiplier_exp(int in, int reverse_shift)
Compute quantized multiplier and shift for the inverse square root of input.
Definition: qlstm_layer_normalization.cl:84
acl::DataType
DataType
Definition: Acl.hpp:482
arm_compute::utils::rounding::round_half_away_from_zero
T round_half_away_from_zero(T value)
Round floating-point value with half value rounding away from zero.
Definition: Rounding.h:107
batches
unsigned int batches
Definition: CpuGemmAssemblyDispatch.cpp:107
arm_compute::cpu::data_layout
constexpr auto data_layout
Definition: impl.h:36
arm_compute::misc::shape_calculator::compute_reorg_output_shape
TensorShape compute_reorg_output_shape(const ITensorInfo &input, int32_t stride)
Calculate the output shape of the reorg layer given a stride.
Definition: ShapeCalculator.h:133
arm_compute::test::validation::reference::pooling_layer_internal< half, float >
template SimpleTensor< half > pooling_layer_internal< half, float >(const SimpleTensor< half > &src, const PoolingLayerInfo &info, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
arm_compute::test::validation::is_valid_pixel_index
bool is_valid_pixel_index(int x, int y, int width, int height, int border_size)
Checks if a pixel has valid coordinates.
Definition: Utils.h:53
arm_compute::test::validation::valid_region
const ValidRegion valid_region
Definition: Scale.cpp:214
arm_compute::Dimensions::z
T z() const
Alias to access the size of the third dimension.
Definition: Dimensions.h:96
arm_compute::test::validation::bilinear_policy
T bilinear_policy(const SimpleTensor< T > &in, Coordinates id, float xn, float yn, BorderMode border_mode, T constant_border_value)
Definition: Utils.cpp:36
arm_compute::FFTDirection::Forward
@ Forward
height_dim
constexpr unsigned int height_dim
Definition: Conv3D.cpp:34
arm_compute::TensorShape::total_size_upper
size_t total_size_upper(size_t dimension) const
Collapses given dimension and above.
Definition: TensorShape.h:185
arm_compute::test::validation::act_info
act_info
Definition: DirectConvolutionLayer.cpp:547
arm_compute::test::validation::reference::pad_layer
SimpleTensor< T > pad_layer(const SimpleTensor< T > &src, const PaddingList &paddings, const PixelValue const_value, const PaddingMode mode)
Reference function to pad an ND tensor.
Definition: PadLayer.cpp:39
arm_compute::test::validation::has_bias
const bool has_bias
Definition: Im2Col.cpp:168
arm_compute::utils::cast::U
U
Definition: SaturateCast.h:65
arm_compute::utility::clamp
DataType clamp(const DataType &n, const DataType &lower=std::numeric_limits< RangeType >::lowest(), const DataType &upper=std::numeric_limits< RangeType >::max())
Performs clamping among a lower and upper value.
Definition: Utility.h:102
arm_compute::PermutationVector
Strides PermutationVector
Permutation vector.
Definition: CoreTypes.h:38
arm_compute::test::validation::shape
shape
Definition: DFT.cpp:115
depth_dim
constexpr unsigned int depth_dim
Definition: Conv3D.cpp:33
ARM_COMPUTE_ERROR_ON
#define ARM_COMPUTE_ERROR_ON(cond)
If the condition is true then an error message is printed and an exception thrown.
Definition: Error.h:466
quantize_qasymm8
uchar quantize_qasymm8(float input, float offset, float scale)
Quantize a floating-point scalar value to 8-bit asymmetric.
Definition: helpers_asymm.h:47
arm_compute::test::index2coord
Coordinates index2coord(const TensorShape &shape, int index)
Convert a linear index into n-dimensional coordinates.
Definition: Utils.h:359
Coordinates2D::x
int x
The x coordinate.
Definition: types.h:30
arm_compute::Channel::B
@ B
Blue channel.
arm_compute::execute_window_loop
void execute_window_loop(const Window &w, L &&lambda_function, Ts &&...iterators)
Iterate through the passed window, automatically adjusting the iterators and calling the lambda_funct...
Definition: Helpers.inl:74
is_same_rank
bool is_same_rank
Definition: NESelectKernel.cpp:52
arm_compute::test::validation::reference::convolution_layer_nchw
SimpleTensor< T > convolution_layer_nchw(const SimpleTensor< T > &src, const SimpleTensor< TW > &weights, const SimpleTensor< TB > &bias, SimpleTensor< T > &dst, const PadStrideInfo &info, const Size2D &dilation, unsigned int num_groups)
Definition: ConvolutionLayer.cpp:45
arm_compute::quantize_qasymm8_signed
int8_t quantize_qasymm8_signed(float value, const INFO_TYPE &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a signed 8-bit asymmetric quantization scheme.
Definition: QuantizationInfo.h:323
ARM_COMPUTE_ERROR_ON_MSG
#define ARM_COMPUTE_ERROR_ON_MSG(cond, msg)
Definition: Error.h:456
arm_compute::FFTDirection
FFTDirection
FFT direction to use.
Definition: FunctionDescriptors.h:35
dequantize_qasymm8
float dequantize_qasymm8(uchar input, float offset, float scale)
Dequantize a scalar value from 8-bit asymmetric to floating-point.
Definition: helpers_asymm.h:62
width_dim
constexpr unsigned int width_dim
Definition: Conv3D.cpp:35
arm_compute::TensorShape::total_size
size_t total_size() const
Collapses all dimensions to a single linear total size.
Definition: TensorShape.h:175
arm_compute::test::validation::w
SimpleTensor< float > w
Definition: DFT.cpp:156
arm_compute::detail::have_different_dimensions
bool have_different_dimensions(const Dimensions< T > &dim1, const Dimensions< T > &dim2, unsigned int upper_dim)
Definition: Validate.h:51
arm_compute::round
int round(float x, RoundingPolicy rounding_policy)
Return a rounded value of x.
Definition: Rounding.cpp:36
arm_compute::test::validation::scale_y
const float scale_y
Definition: Scale.cpp:260
arm_compute::PoolingType
PoolingType
Available pooling types.
Definition: Types.h:480
arm_compute::is_data_type_quantized_per_channel
bool is_data_type_quantized_per_channel(DataType dt)
Check if a given data type is of per channel type.
Definition: DataTypeUtils.h:419
ARM_COMPUTE_ASSERT
#define ARM_COMPUTE_ASSERT(cond)
Definition: Validate.h:37
arm_compute::support::cpp11::nearbyint
T nearbyint(T value)
Rounds the floating-point argument arg to an integer value in floating-point format,...
Definition: ToolchainSupport.h:170
arm_compute::test::validation::shape_scaled
TensorShape shape_scaled(shape)
arm_compute::test::validation::reference::WinogradTransformType::OUTPUT
@ OUTPUT
Winograd output transform.
offset
__global uchar * offset(const Image *img, int x, int y)
Get the pointer position of a Image.
Definition: helpers.h:1142
arm_compute::Dimensions::x
T x() const
Alias to access the size of the first dimension.
Definition: Dimensions.h:86
arm_compute::test::validation::reference::copy
SimpleTensor< T > copy(const SimpleTensor< T > &src, const TensorShape &output_shape)
Definition: Copy.cpp:37
bias
const int32_t * bias
Definition: working_space.hpp:322
K
unsigned int K
Definition: CpuGemmAssemblyDispatch.cpp:106
arm_compute::misc::shape_calculator::compute_tiled_shape
TensorShape compute_tiled_shape(const TensorShape &input_shape, const Multiples &multiples)
Calculate the tiled shape of a tensor.
Definition: ShapeCalculator.h:1392
arm_compute::test::validation::reference::accumulate
SimpleTensor< T2 > accumulate(const SimpleTensor< T1 > &src, DataType output_data_type)
Definition: Accumulate.cpp:38
multiply_by_quantized_multiplier
#define multiply_by_quantized_multiplier(input, qmul, shift)
Definition: qlstm_layer_normalization.cl:55
arm_compute::QuantizationInfo::uniform
UniformQuantizationInfo uniform() const
Return per layer quantization info.
Definition: QuantizationInfo.h:152
ADD
#define ADD(x, y)
Definition: elementwise_operation_quantized.cl:27
ci
const CPUInfo & ci
Definition: NEBatchNormalizationLayerKernel.cpp:51
ARM_COMPUTE_UNUSED
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
Definition: Error.h:151
dt
DataType dt
Definition: NEBatchNormalizationLayerKernel.cpp:50
arm_compute::test::validation::reference::pooling_layer_internal< float >
template SimpleTensor< float > pooling_layer_internal< float >(const SimpleTensor< float > &src, const PoolingLayerInfo &info, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
tensor
CLTensor * tensor
Pointer to the auxiliary tensor.
Definition: ClWorkloadRuntime.cpp:67
arm_compute::test::SimpleTensor::num_elements
int num_elements() const override
Number of elements of the tensor.
Definition: SimpleTensor.h:424
arm_compute::test::validation::scale_x
const float scale_x
Definition: Scale.cpp:259
channel_dim
constexpr unsigned int channel_dim
Definition: Conv3D.cpp:36
MAX
#define MAX(x, y)
Definition: elementwise_operation_quantized.cl:28
arm_compute::test::validation::reference::pooling_layer_internal< half >
template SimpleTensor< half > pooling_layer_internal< half >(const SimpleTensor< half > &src, const PoolingLayerInfo &info, SimpleTensor< uint32_t > *indices, DataLayout data_layout)
arm_compute::test::validation::data_type
data_type
Definition: Cast.cpp:230
arm_compute::test::validation::reference::WinogradTransformType::INPUT
@ INPUT
Winograd input transform.
arm_compute::misc::shape_calculator::compute_padded_shape
TensorShape compute_padded_shape(const TensorShape &input_shape, const PaddingList &padding)
Calculate the padded shape of a tensor.
Definition: ShapeCalculator.h:1373
arm_compute::helpers::tensor_transform::compute_strided_slice_output_shape
TensorShape compute_strided_slice_output_shape(TensorShape input_shape, Coordinates starts, Coordinates ends, Coordinates strides, int32_t begin_mask=0, int32_t end_mask=0, int32_t shrink_axis_mask=0, bool return_unshrinked=false)
Computes output shape of strided slice.
Definition: tensor_transform.cpp:151
arm_compute::test::validation::reference::compute_all_anchors
SimpleTensor< int16_t > compute_all_anchors(const SimpleTensor< int16_t > &anchors, const ComputeAnchorsInfo &info)
Definition: ComputeAllAnchors.cpp:81
arm_compute::test::validation::input_shape
TensorShape input_shape
Validate test suite is to test ARM_COMPUTE_RETURN_ON_* macros we use to check the validity of given a...
Definition: LSTMLayerQuantized.cpp:466
arm_compute::test::library
std::unique_ptr< AssetsLibrary > library
Definition: main.cpp:77
dequantize_qasymm8_signed
float dequantize_qasymm8_signed(char input, float offset, float scale)
Dequantize a scalar value from signed 8-bit asymmetric to floating-point.
Definition: helpers_asymm.h:75
arm_compute::LogicalOperation::Or
@ Or
Logical Or ||.
arm_compute::get_data_layout_dimension_index
size_t get_data_layout_dimension_index(const DataLayout &data_layout, const DataLayoutDimension &data_layout_dimension)
Get the index of the given dimension.
Definition: Helpers.inl:201
arm_compute::test::validation::reference::convolution_layer
SimpleTensor< T > convolution_layer(const SimpleTensor< T > &src, const SimpleTensor< TW > &weights, const SimpleTensor< TB > &bias, const TensorShape &output_shape, const PadStrideInfo &info, const Size2D &dilation, unsigned int num_groups, QuantizationInfo out_quant_info)
Definition: ConvolutionLayer.cpp:111
arm_gemm::VLType::None
@ None
arm_compute::coords2index
int coords2index(const TensorShape &shape, const Coordinates &coord)
Convert n-dimensional coordinates into a linear index.
Definition: Helpers.inl:183
arm_compute::test::validation::reference::permute
template SimpleTensor< bfloat16 > permute(const SimpleTensor< bfloat16 > &src, PermutationVector perm)
arm_compute::test::validation::num_groups
const unsigned int num_groups
Definition: Im2Col.cpp:169
arm_compute::misc::shape_calculator::compute_conv3d_shape
TensorShape compute_conv3d_shape(const TensorShape &src, const TensorShape &weights, const Conv3dInfo &conv3d_info)
Calculate the output shape of 3d Convolution.
Definition: ShapeCalculator.h:1574
arm_compute::test::convolution_3d::detail::convolution3d
void convolution3d(const SimpleTensor< T > &in, const SimpleTensor< TW > &weights, const SimpleTensor< TB > &bias, SimpleTensor< T > &out, int i_offset, int w_offset, int b_offset, int o_offset, int xi, int yi, int width_in, int height_in, int depth_in, int width_weights, int height_weights, int dilation_x=1, int dilation_y=1, int filter_id=0)
Definition: Convolution3d.h:49
M
unsigned int M
Definition: CpuGemmAssemblyDispatch.cpp:104
weights_CHin_dim
constexpr unsigned int weights_CHin_dim
Definition: Conv3D.cpp:42
arm_compute::test::validation::b
SimpleTensor< float > b
Definition: DFT.cpp:157
arm_compute::test::validation::conv_info
const PadStrideInfo conv_info(1U, 1U, 0U, 0U)
arm_compute::test::validation::scale
NEScale scale
Definition: Scale.cpp:272
arm_compute::misc::shape_calculator::compute_batch_to_space_shape
TensorShape compute_batch_to_space_shape(DataLayout data_layout, const TensorShape &input, int block_x, int block_y, const CropInfo &crop_info=CropInfo{})
Calculate the batch to space output shape of a tensor.
Definition: ShapeCalculator.h:1208
arm_compute::test::SimpleTensor::data
const T * data() const
Constant pointer to the underlying buffer.
Definition: SimpleTensor.h:436
arm_compute::test::validation::conv_info
conv_info
Definition: DirectConvolutionLayer.cpp:547
arm_compute::test::validation::reference::activation_layer
SimpleTensor< T > activation_layer(const SimpleTensor< T > &src, ActivationLayerInfo info, const QuantizationInfo &oq_info)
Definition: ActivationLayer.cpp:39
clang_tidy_rules.mode
mode
Definition: clang_tidy_rules.py:194
arm_compute::test::validation::reference::rdft_2d
template SimpleTensor< half > rdft_2d(const SimpleTensor< half > &src)
arm_compute::PaddingInfo
std::pair< uint32_t, uint32_t > PaddingInfo
Padding information as a pair of unsigned int start/end.
Definition: Types.h:399
arm_compute::scale_utils::calculate_resize_ratio
float calculate_resize_ratio(size_t input_size, size_t output_size, bool align_corners=false)
Returns resize ratio between input and output with consideration of aligned corners.
Definition: ScaleUtils.cpp:32
arm_compute::helpers::tensor_transform::calculate_strided_slice_coords
std::tuple< Coordinates, Coordinates, Coordinates > calculate_strided_slice_coords(TensorShape input_shape, Coordinates starts, Coordinates ends, Coordinates strides, int32_t begin_mask=0, int32_t end_mask=0, int32_t shrink_axis_mask=0)
Calculate start, end and stride coordinates for a strided slice.
Definition: tensor_transform.cpp:128
arm_compute::mlgo::parser::end
void end(TokenStream &in, bool &valid)
Definition: MLGOParser.cpp:283
arm_compute::test::validation::is_odd
const bool is_odd
Definition: DFT.cpp:120
arm_compute::is_data_type_quantized_asymmetric
bool is_data_type_quantized_asymmetric(DataType dt)
Check if a given data type is of asymmetric quantized type.
Definition: DataTypeUtils.h:346
arm_compute::quantize_qasymm16
uint16_t quantize_qasymm16(float value, const UniformQuantizationInfo &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a 16-bit asymmetric quantization scheme.
Definition: QuantizationInfo.h:521
arm_compute::quantization::calculate_quantized_multiplier
Status calculate_quantized_multiplier(float multiplier, int32_t *quant_multiplier, int32_t *shift, bool ignore_epsilon=false)
Calculate quantized representation of multiplier.
Definition: AsymmHelpers.cpp:43
arm_compute::is_data_type_quantized
bool is_data_type_quantized(DataType dt)
Check if a given data type is of quantized type.
Definition: DataTypeUtils.h:324
arm_compute::cpu::channel_idx
const size_t channel_idx
Definition: impl.h:39
arm_compute::NormType
NormType
The normalization type used for the normalization layer.
Definition: Types.h:456
arm_compute::cpu::width_idx
const size_t width_idx
Definition: impl.h:37
arm_compute::test::validation::info
ScaleKernelInfo info(interpolation_policy, default_border_mode, PixelValue(), sampling_policy, false)
arm_compute::test::validation::reference::im2col_nchw
void im2col_nchw(const SimpleTensor< T > &src, SimpleTensor< T > &dst, const Size2D &kernel_dims, const PadStrideInfo &conv_info, bool has_bias, unsigned int num_groups)
Definition: Im2Col.cpp:39
arm_compute::cpu::step
constexpr int step
Definition: fp32.cpp:35
arm_compute::test::validation::output_size
const int output_size
Definition: LSTMLayerQuantized.cpp:459
arm_compute::TensorShape::set
TensorShape & set(size_t dimension, size_t value, bool apply_dim_correction=true, bool increase_dim_unit=true)
Accessor to set the value of one of the dimensions.
Definition: TensorShape.h:78
batch_dim
constexpr unsigned int batch_dim
Definition: Conv3D.cpp:32
arm_compute::test::validation::reference::WinogradTransformType::FILTER
@ FILTER
Winograd filter transform.
Coordinates2D::y
int y
The y coordinate.
Definition: types.h:31
tf_frozen_model_extractor.t
t
Definition: tf_frozen_model_extractor.py:49
arm_compute::Dimensions::y
T y() const
Alias to access the size of the second dimension.
Definition: Dimensions.h:91
arm_compute::LogicalOperation::Not
@ Not
Logical Not !
arm_compute::cpu::roi_align_1x1
input_data_type roi_align_1x1(const ITensor *input, unsigned int roi_batch, float region_start_x, float bin_size_x, int grid_size_x, float region_end_x, float region_start_y, float bin_size_y, int grid_size_y, float region_end_y, int pz)
Average pooling over an aligned window.
Definition: impl.h:37
arm_compute::LogicalOperation::And
@ And
Logical And &&.
arm_compute::Dimensions::num_dimensions
unsigned int num_dimensions() const
Returns the effective dimensionality of the tensor.
Definition: Dimensions.h:142
arm_compute::test::validation::reference::im2col_nhwc
void im2col_nhwc(const SimpleTensor< T > &src, SimpleTensor< T > &dst, const Size2D &kernel_dims, const PadStrideInfo &conv_info, bool has_bias)
Definition: Im2Col.cpp:93
arm_compute::test::validation::dst_ref
auto dst_ref
Definition: DFT.cpp:172
arm_compute::test::validation::reference::slice
SimpleTensor< T > slice(const SimpleTensor< T > &src, Coordinates starts, Coordinates ends)
Definition: SliceOperations.cpp:38
arm_compute::test::validation::output_wh
const auto output_wh
Definition: DFT.cpp:163
arm_compute::test::validation::qinfo
const QuantizationInfo qinfo
Definition: Im2Col.cpp:171
SUB
#define SUB(x, y)
Definition: elementwise_operation_quantized.cl:26
arm_compute::PadStrideInfo::stride
std::pair< unsigned int, unsigned int > stride() const
Get the stride.
Definition: CoreTypes.h:192
arm_compute::test::shape_to_valid_region
ValidRegion shape_to_valid_region(const TensorShape &a_shape, bool border_undefined=false, BorderSize border_size=BorderSize(0))
Create a valid region based on tensor shape, border mode and border size.
Definition: Utils.h:219
Coordinates2D
2D Coordinates structure
Definition: types.h:28
arm_compute::cpu::height_idx
const size_t height_idx
Definition: impl.h:38
arm_compute::quantization::epsilon
constexpr float epsilon
Definition: AsymmHelpers.cpp:41