• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2018-2020 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #include "arm_compute/core/TensorShape.h"
25 #include "arm_compute/core/Types.h"
26 #include "tests/AssetsLibrary.h"
27 #include "tests/Globals.h"
28 #include "tests/IAccessor.h"
29 #include "tests/framework/Asserts.h"
30 #include "tests/framework/Fixture.h"
31 #include "tests/validation/Helpers.h"
32 #include "tests/validation/reference/UpsampleLayer.h"
33 
34 #include <random>
35 
36 namespace arm_compute
37 {
38 namespace test
39 {
40 namespace validation
41 {
42 template <typename TensorType, typename AccessorType, typename FunctionType, typename T>
43 class UpsampleLayerFixtureBase : public framework::Fixture
44 {
45 public:
46     template <typename...>
setup(TensorShape input_shape,DataType data_type,DataLayout data_layout,Size2D info,const InterpolationPolicy & policy,QuantizationInfo quantization_info)47     void setup(TensorShape input_shape, DataType data_type, DataLayout data_layout,
48                Size2D info, const InterpolationPolicy &policy, QuantizationInfo quantization_info)
49     {
50         _data_type = data_type;
51 
52         _target    = compute_target(input_shape, info, policy, data_type, data_layout, quantization_info);
53         _reference = compute_reference(input_shape, info, policy, data_type, quantization_info);
54     }
55 
56 protected:
57     template <typename U>
fill(U && tensor,int i)58     void fill(U &&tensor, int i)
59     {
60         library->fill_tensor_uniform(tensor, i);
61     }
62 
compute_target(TensorShape input_shape,const Size2D & info,const InterpolationPolicy & policy,DataType data_type,DataLayout data_layout,QuantizationInfo quantization_info)63     TensorType compute_target(TensorShape input_shape, const Size2D &info, const InterpolationPolicy &policy,
64                               DataType data_type, DataLayout data_layout, QuantizationInfo quantization_info)
65     {
66         TensorShape output_shape(input_shape);
67         output_shape.set(0, info.x() * input_shape[0]);
68         output_shape.set(1, info.y() * input_shape[1]);
69 
70         if(data_layout == DataLayout::NHWC)
71         {
72             permute(input_shape, PermutationVector(2U, 0U, 1U));
73             permute(output_shape, PermutationVector(2U, 0U, 1U));
74         }
75 
76         // Create tensors
77         TensorType src = create_tensor<TensorType>(input_shape, data_type, 1, quantization_info, data_layout);
78         TensorType dst = create_tensor<TensorType>(output_shape, data_type, 1, quantization_info, data_layout);
79 
80         // Create and configure function
81         FunctionType upsample;
82         upsample.configure(&src, &dst, info, policy);
83 
84         ARM_COMPUTE_EXPECT(src.info()->is_resizable(), framework::LogLevel::ERRORS);
85         ARM_COMPUTE_EXPECT(dst.info()->is_resizable(), framework::LogLevel::ERRORS);
86 
87         // Allocate tensors
88         src.allocator()->allocate();
89         dst.allocator()->allocate();
90 
91         ARM_COMPUTE_EXPECT(!src.info()->is_resizable(), framework::LogLevel::ERRORS);
92         ARM_COMPUTE_EXPECT(!dst.info()->is_resizable(), framework::LogLevel::ERRORS);
93 
94         // Fill tensors
95         fill(AccessorType(src), 0);
96 
97         // Compute DeconvolutionLayer function
98         upsample.run();
99 
100         return dst;
101     }
102 
compute_reference(const TensorShape & input_shape,const Size2D & info,const InterpolationPolicy & policy,DataType data_type,QuantizationInfo quantization_info)103     SimpleTensor<T> compute_reference(const TensorShape &input_shape, const Size2D &info, const InterpolationPolicy &policy,
104                                       DataType data_type, QuantizationInfo quantization_info)
105     {
106         // Create reference
107         SimpleTensor<T> src{ input_shape, data_type, 1, quantization_info };
108 
109         // Fill reference
110         fill(src, 0);
111 
112         return reference::upsample_layer<T>(src, info, policy);
113     }
114 
115     TensorType      _target{};
116     SimpleTensor<T> _reference{};
117     DataType        _data_type{};
118 };
119 
120 template <typename TensorType, typename AccessorType, typename FunctionType, typename T>
121 class UpsampleLayerFixture : public UpsampleLayerFixtureBase<TensorType, AccessorType, FunctionType, T>
122 {
123 public:
124     template <typename...>
setup(TensorShape input_shape,DataType data_type,DataLayout data_layout,Size2D info,const InterpolationPolicy & policy)125     void setup(TensorShape input_shape, DataType data_type, DataLayout data_layout,
126                Size2D info, const InterpolationPolicy &policy)
127     {
128         UpsampleLayerFixtureBase<TensorType, AccessorType, FunctionType, T>::setup(input_shape, data_type, data_layout,
129                                                                                    info, policy, QuantizationInfo());
130     }
131 };
132 
133 template <typename TensorType, typename AccessorType, typename FunctionType, typename T>
134 class UpsampleLayerQuantizedFixture : public UpsampleLayerFixtureBase<TensorType, AccessorType, FunctionType, T>
135 {
136 public:
137     template <typename...>
setup(TensorShape input_shape,DataType data_type,DataLayout data_layout,Size2D info,const InterpolationPolicy & policy,QuantizationInfo quantization_info)138     void setup(TensorShape input_shape, DataType data_type, DataLayout data_layout,
139                Size2D info, const InterpolationPolicy &policy, QuantizationInfo quantization_info)
140     {
141         UpsampleLayerFixtureBase<TensorType, AccessorType, FunctionType, T>::setup(input_shape, data_type, data_layout,
142                                                                                    info, policy, quantization_info);
143     }
144 };
145 
146 } // namespace validation
147 } // namespace test
148 } // namespace arm_compute
149