blob: 68570d58dbeece981fcdd5a29f803d6ae2cfbe6b [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
Georgios Pinitas49be2e32019-09-02 13:18:55 +01002 * Copyright (c) 2016-2019 ARM Limited.
Anthony Barbier6ff3b192017-09-04 18:44:23 +01003 *
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 */
Michalis Spyrouf4643372019-11-29 16:17:13 +000024#ifndef ARM_COMPUTE_TENSORINFO_H
25#define ARM_COMPUTE_TENSORINFO_H
Anthony Barbier6ff3b192017-09-04 18:44:23 +010026
27#include "arm_compute/core/ITensorInfo.h"
28
Michel Iwaniec00633802017-10-12 14:14:15 +010029#include "ITensorInfo.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010030#include "arm_compute/core/Coordinates.h"
Isabella Gottardid56e7702018-02-28 14:29:36 +000031#include "arm_compute/core/Helpers.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010032#include "arm_compute/core/Strides.h"
33#include "arm_compute/core/TensorShape.h"
34#include "arm_compute/core/Types.h"
35#include "arm_compute/core/Utils.h"
36
37#include <cstddef>
Georgios Pinitas283c1792017-11-10 18:14:06 +000038#include <memory>
Anthony Barbier6ff3b192017-09-04 18:44:23 +010039
40namespace arm_compute
41{
42class HOGInfo;
43
44/** Store the tensor's metadata */
45class TensorInfo final : public ITensorInfo
46{
47public:
48 /** Default constructor */
49 TensorInfo();
50 /** Default destructor */
51 ~TensorInfo() = default;
52 /** Allow instances of this class to be copy constructed */
53 TensorInfo(const ITensorInfo &info);
54 /** Allow instances of this class to be copy constructed */
55 TensorInfo(const TensorInfo &) = default;
56 /** Allow instances of this class to be copied */
57 TensorInfo &operator=(const TensorInfo &) = default;
58 /** Allow instances of this class to be move constructed */
59 TensorInfo(TensorInfo &&) = default;
60 /** Allow instances of this class to be moved */
61 TensorInfo &operator=(TensorInfo &&) = default;
62
63 /** Construct a tensor info with a format.
64 *
65 * Can be used for automatic derivation of the shape by the function.
66 *
67 * @param[in] format Format of the tensor.
68 */
69 TensorInfo(Format format);
70
71 /** 2D tensor constructor
72 *
73 * @param[in] width Width of the 2D tensor
74 * @param[in] height Height of the 2D tensor
75 * @param[in] format Single plane format of the tensor.
76 */
77 TensorInfo(unsigned int width, unsigned int height, Format format);
78 /** Constructor
79 *
80 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
81 * @param[in] format Single plane format of the tensor.
82 */
83 TensorInfo(const TensorShape &tensor_shape, Format format);
84
85 /** Construct a tensor info with a data type and number of channels.
86 *
87 * Can be used for automatic derivation of the shape by the function.
88 *
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010089 * @param[in] num_channels It indicates the number of channels for each tensor element
90 * @param[in] data_type Data type to use for each tensor element
Anthony Barbier6ff3b192017-09-04 18:44:23 +010091 */
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010092 TensorInfo(size_t num_channels, DataType data_type);
Anthony Barbier6ff3b192017-09-04 18:44:23 +010093
94 /** Constructor
95 *
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010096 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
97 * @param[in] num_channels It indicates the number of channels for each tensor element
98 * @param[in] data_type Data type to use for each tensor element
Anthony Barbier6ff3b192017-09-04 18:44:23 +010099 */
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100100 TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type);
Michel Iwaniec00633802017-10-12 14:14:15 +0100101
102 /** Constructor
103 *
Manuel Bottini581f1782019-11-13 17:24:43 +0000104 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
105 * @param[in] num_channels It indicates the number of channels for each tensor element
106 * @param[in] data_type Data type to use for each tensor element
107 * @param[in] data_layout The data layout setting for the tensor data.
108 */
109 TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, DataLayout data_layout);
110
111 /** Constructor
112 *
Michel Iwaniec00633802017-10-12 14:14:15 +0100113 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
114 * @param[in] num_channels It indicates the number of channels for each tensor element
115 * @param[in] data_type Data type to use for each tensor element
116 * @param[in] quantization_info The quantization settings for the tensor data.
117 */
118 TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, QuantizationInfo quantization_info);
119
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100120 /** Constructor
121 *
122 * @param[in] hog_info HOG's metadata used to allocate normalized HOG space
123 * @param[in] width Width of the 2D tensor where the HOG descriptor will be computed on
124 * @param[in] height Height of the 2D tensor where the HOG descriptor will be computed on
125 */
126 TensorInfo(const HOGInfo &hog_info, unsigned int width, unsigned int height);
127
128 /** Initialize the tensor info with just a format.
129 *
130 * Can be used for automatic derivation of the shape by the function.
131 *
132 * @param[in] format Single plane format of the tensor.
133 */
134 void init(Format format);
135
136 /** Initialize the metadata structure with the given parameters
137 *
138 * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
139 * @param[in] format Single plane format of the tensor.
140 */
141 void init(const TensorShape &tensor_shape, Format format);
142 /** Initialize the metadata structure with the given parameters
143 *
144 * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
145 * @param[in] format Single plane format of the tensor.
146 * @param[in] strides_in_bytes Stride in bytes for accessing each dimension of the tensor.
147 * @param[in] offset_first_element_in_bytes Offset in bytes from the beginning of memory allocation to access the first element.
148 * @param[in] total_size_in_bytes Size in bytes of the memory allocation (including the offset to the first element).
149 */
150 void init(const TensorShape &tensor_shape, Format format, const Strides &strides_in_bytes, size_t offset_first_element_in_bytes, size_t total_size_in_bytes);
151
152 /** Initialize the tensor info with just a format.
153 *
154 * Can be used for automatic derivation of the shape by the function.
155 *
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100156 * @param[in] num_channels Desired number of channels for each tensor element.
157 * @param[in] data_type Data type to use for each tensor element.
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100158 */
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100159 void init(size_t num_channels, DataType data_type);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100160
161 /** Initialize the metadata structure with the given parameters
162 *
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100163 * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
164 * @param[in] num_channels Desired number of channels for each tensor element.
165 * @param[in] data_type Data type to use for each tensor element.
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100166 */
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100167 void init(const TensorShape &tensor_shape, size_t num_channels, DataType data_type);
Michel Iwaniec00633802017-10-12 14:14:15 +0100168
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100169 /** Initialize the metadata structure with the given parameters
170 *
171 * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
172 * @param[in] num_channels Desired number of channels for each tensor element.
173 * @param[in] data_type Data type to use for each tensor element.
174 * @param[in] strides_in_bytes Stride in bytes for accessing each dimension of the tensor.
175 * @param[in] offset_first_element_in_bytes Offset in bytes from the beginning of memory allocation to access the first element.
176 * @param[in] total_size_in_bytes Size in bytes of the memory allocation (including the offset to the first element).
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100177 */
178 void init(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, const Strides &strides_in_bytes, size_t offset_first_element_in_bytes,
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100179 size_t total_size_in_bytes);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100180 /** Initialize the metadata structure for the given HOG's metadata
181 *
182 * @param[in] hog_info HOG's metadata used to allocate normalized HOG space
183 * @param[in] width Width of the 2D tensor where the HOG descriptor will be computed on
184 * @param[in] height Height of the 2D tensor where the HOG descriptor will be computed on
185 */
186 void init(const HOGInfo &hog_info, unsigned int width, unsigned int height);
187 /** Initialize the metadata structure for the given tensor shape and single-plane format, (Padding is automatically calculated)
188 *
189 * @note The padding used by this method is really conservative so that the tensor can be used for most functions.
190 *
191 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements
192 * @param[in] format Single plane format of the image.
193 *
194 * @return Total allocation size including padding in bytes.
195 */
196 size_t init_auto_padding(const TensorShape &tensor_shape, Format format);
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100197 /** Initialize the metadata structure for the given tensor shape, number of channels and
198 * data type. (Padding is automatically calculated)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100199 *
200 * @note The padding used by this method is really conservative so that the tensor can be used for most functions.
201 *
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100202 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements
203 * @param[in] num_channels It indicates the number of channels for each tensor element
204 * @param[in] data_type Data type to use for each tensor element
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100205 *
206 * @return Total allocation size including padding in bytes.
207 */
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100208 size_t init_auto_padding(const TensorShape &tensor_shape, size_t num_channels, DataType data_type);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100209 /** Initialize the metadata structure for the given HOG's metadata
210 *
211 * @note init_auto_padding will be used for the tensor initialization.
212 *
213 * @param[in] hog_info HOG's metadata used to allocate normalized HOG space
214 * @param[in] width Width of the 2D tensor where the HOG descriptor will be computed on
215 * @param[in] height Height of the 2D tensor where the HOG descriptor will be computed on
Alex Gildayc357c472018-03-21 13:54:09 +0000216 *
217 * @return Total allocation size including padding in bytes.
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100218 */
219 size_t init_auto_padding(const HOGInfo &hog_info, unsigned int width, unsigned int height);
220
221 // Inherited methods overridden:
Georgios Pinitas283c1792017-11-10 18:14:06 +0000222 std::unique_ptr<ITensorInfo> clone() const override;
223 ITensorInfo &set_data_type(DataType data_type) override;
224 ITensorInfo &set_num_channels(int num_channels) override;
225 ITensorInfo &set_format(Format format) override;
Diego Lopez Recas35ceeb22017-12-04 18:56:10 +0000226 ITensorInfo &set_tensor_shape(const TensorShape &shape) override;
Diego Lopez Recas35ceeb22017-12-04 18:56:10 +0000227 ITensorInfo &set_quantization_info(const QuantizationInfo &quantization_info) override;
Isabella Gottardid17a6772018-02-27 17:41:55 +0000228 ITensorInfo &set_data_layout(const DataLayout &data_layout) override;
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000229 ITensorInfo &reset_padding() override;
230 bool auto_padding() override;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100231 bool extend_padding(const PaddingSize &padding) override;
232 size_t dimension(size_t index) const override
233 {
234 return _tensor_shape[index];
235 }
Isabella Gottardid56e7702018-02-28 14:29:36 +0000236 size_t dimension(DataLayoutDimension dimension) const override
237 {
238 return get_data_layout_dimension_index(_data_layout, dimension);
239 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100240 const Strides &strides_in_bytes() const override
241 {
242 return _strides_in_bytes;
243 }
244 size_t offset_first_element_in_bytes() const override
245 {
246 return _offset_first_element_in_bytes;
247 }
Michalis Spyrou7c60c992019-10-10 14:33:47 +0100248 int32_t offset_element_in_bytes(const Coordinates &pos) const override;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100249 size_t element_size() const override
250 {
251 return data_size_from_type(_data_type) * _num_channels;
252 }
253 size_t num_dimensions() const override
254 {
255 return _tensor_shape.num_dimensions();
256 }
257 size_t num_channels() const override
258 {
259 return _num_channels;
260 }
261 const TensorShape &tensor_shape() const override
262 {
263 return _tensor_shape;
264 }
265 DataType data_type() const override
266 {
267 return _data_type;
268 }
269 Format format() const override
270 {
271 return _format;
272 }
273 size_t total_size() const override
274 {
275 return _total_size;
276 }
277 PaddingSize padding() const override
278 {
279 return _padding;
280 }
281 bool has_padding() const override
282 {
283 return !_padding.empty();
284 }
285 bool is_resizable() const override
286 {
287 return _is_resizable;
288 }
Georgios Pinitas49be2e32019-09-02 13:18:55 +0100289 bool is_dynamic() const override
290 {
291 return _is_dynamic;
292 }
Georgios Pinitasa3b1b462017-11-16 19:24:39 +0000293 ITensorInfo &set_is_resizable(bool is_resizable) override
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100294 {
295 _is_resizable = is_resizable;
Georgios Pinitasa3b1b462017-11-16 19:24:39 +0000296 return *this;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100297 }
Georgios Pinitas49be2e32019-09-02 13:18:55 +0100298 ITensorInfo &set_is_dynamic(bool is_dynamic) override
299 {
300 _is_dynamic = is_dynamic;
301 return *this;
302 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100303 ValidRegion valid_region() const override
304 {
305 return _valid_region;
306 }
Diego Lopez Recas35ceeb22017-12-04 18:56:10 +0000307 void set_valid_region(const ValidRegion &valid_region) override
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100308 {
Diego Lopez Recas35ceeb22017-12-04 18:56:10 +0000309 _valid_region = valid_region;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100310 }
Michel Iwaniec00633802017-10-12 14:14:15 +0100311 QuantizationInfo quantization_info() const override
312 {
313 return _quantization_info;
314 }
Isabella Gottardid17a6772018-02-27 17:41:55 +0000315 DataLayout data_layout() const override
316 {
317 return _data_layout;
318 }
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100319
320private:
321 /** Calculates strides, offset and total size resulting from the specified padding around the XY plane.
322 *
323 * @param[in] padding Padding around the XY plane in elements.
324 */
325 std::tuple<Strides, size_t, size_t> calculate_padding_requirements(const PaddingSize &padding);
326
Michel Iwaniec00633802017-10-12 14:14:15 +0100327 size_t _total_size;
Michel Iwaniec00633802017-10-12 14:14:15 +0100328 size_t _offset_first_element_in_bytes;
329 Strides _strides_in_bytes;
330 size_t _num_channels;
331 TensorShape _tensor_shape;
332 DataType _data_type;
333 Format _format;
334 bool _is_resizable;
Georgios Pinitas49be2e32019-09-02 13:18:55 +0100335 bool _is_dynamic;
Michel Iwaniec00633802017-10-12 14:14:15 +0100336 ValidRegion _valid_region;
337 PaddingSize _padding;
338 QuantizationInfo _quantization_info;
Isabella Gottardid17a6772018-02-27 17:41:55 +0000339 DataLayout _data_layout;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100340};
Georgios Pinitas49be2e32019-09-02 13:18:55 +0100341} // namespace arm_compute
Michalis Spyrouf4643372019-11-29 16:17:13 +0000342#endif /*ARM_COMPUTE_TENSORINFO_H */