2 * Copyright (c) 2016-2018 ARM Limited.
4 * SPDX-License-Identifier: MIT
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:
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
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
24 #ifndef __ARM_COMPUTE_TENSORINFO_H__
25 #define __ARM_COMPUTE_TENSORINFO_H__
27 #include "arm_compute/core/ITensorInfo.h"
29 #include "ITensorInfo.h"
30 #include "arm_compute/core/Coordinates.h"
31 #include "arm_compute/core/Helpers.h"
32 #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"
44 /** Store the tensor's metadata */
45 class TensorInfo final : public ITensorInfo
48 /** Default constructor */
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;
63 /** Construct a tensor info with a format.
65 * Can be used for automatic derivation of the shape by the function.
67 * @param[in] format Format of the tensor.
69 TensorInfo(Format format);
71 /** 2D tensor constructor
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.
77 TensorInfo(unsigned int width, unsigned int height, Format format);
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.
83 TensorInfo(const TensorShape &tensor_shape, Format format);
85 /** Construct a tensor info with a data type and number of channels.
87 * Can be used for automatic derivation of the shape by the function.
89 * @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
91 * @param[in] fixed_point_position (Optional) It specifies the fixed point position when the tensor data type is QS8, QS16 or QS32.
93 TensorInfo(size_t num_channels, DataType data_type, size_t fixed_point_position = 0);
97 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
98 * @param[in] num_channels It indicates the number of channels for each tensor element
99 * @param[in] data_type Data type to use for each tensor element
100 * @param[in] fixed_point_position (Optional) Fixed point position that expresses the number of bits for the fractional part of the number when the tensor's data type is QS8 or QS16.
102 TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, int fixed_point_position = 0);
106 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
107 * @param[in] num_channels It indicates the number of channels for each tensor element
108 * @param[in] data_type Data type to use for each tensor element
109 * @param[in] quantization_info The quantization settings for the tensor data.
111 TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, QuantizationInfo quantization_info);
115 * @param[in] hog_info HOG's metadata used to allocate normalized HOG space
116 * @param[in] width Width of the 2D tensor where the HOG descriptor will be computed on
117 * @param[in] height Height of the 2D tensor where the HOG descriptor will be computed on
119 TensorInfo(const HOGInfo &hog_info, unsigned int width, unsigned int height);
121 /** Initialize the tensor info with just a format.
123 * Can be used for automatic derivation of the shape by the function.
125 * @param[in] format Single plane format of the tensor.
127 void init(Format format);
129 /** Initialize the metadata structure with the given parameters
131 * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
132 * @param[in] format Single plane format of the tensor.
134 void init(const TensorShape &tensor_shape, Format format);
135 /** Initialize the metadata structure with the given parameters
137 * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
138 * @param[in] format Single plane format of the tensor.
139 * @param[in] strides_in_bytes Stride in bytes for accessing each dimension of the tensor.
140 * @param[in] offset_first_element_in_bytes Offset in bytes from the beginning of memory allocation to access the first element.
141 * @param[in] total_size_in_bytes Size in bytes of the memory allocation (including the offset to the first element).
143 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);
145 /** Initialize the tensor info with just a format.
147 * Can be used for automatic derivation of the shape by the function.
149 * @param[in] num_channels Desired number of channels for each tensor element.
150 * @param[in] data_type Data type to use for each tensor element.
151 * @param[in] fixed_point_position (Optional) Fixed point position when the tensor data type is QS8, QS16 or QS32.
153 void init(size_t num_channels, DataType data_type, size_t fixed_point_position = 0);
155 /** Initialize the metadata structure with the given parameters
157 * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
158 * @param[in] num_channels Desired number of channels for each tensor element.
159 * @param[in] data_type Data type to use for each tensor element.
160 * @param[in] fixed_point_position (Optional) Fixed point position that expresses the number of bits for the fractional part of the number when the tensor's data type is QS8 or QS16.
162 void init(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, int fixed_point_position = 0);
164 /** Initialize the metadata structure with the given parameters
166 * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
167 * @param[in] num_channels Desired number of channels for each tensor element.
168 * @param[in] data_type Data type to use for each tensor element.
169 * @param[in] strides_in_bytes Stride in bytes for accessing each dimension of the tensor.
170 * @param[in] offset_first_element_in_bytes Offset in bytes from the beginning of memory allocation to access the first element.
171 * @param[in] total_size_in_bytes Size in bytes of the memory allocation (including the offset to the first element).
172 * @param[in] fixed_point_position (Optional) Fixed point position that expresses the number of bits for the fractional part of the number when the tensor's data type is QS8 or QS16.
174 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,
175 size_t total_size_in_bytes, int fixed_point_position = 0);
176 /** Initialize the metadata structure for the given HOG's metadata
178 * @param[in] hog_info HOG's metadata used to allocate normalized HOG space
179 * @param[in] width Width of the 2D tensor where the HOG descriptor will be computed on
180 * @param[in] height Height of the 2D tensor where the HOG descriptor will be computed on
182 void init(const HOGInfo &hog_info, unsigned int width, unsigned int height);
183 /** Initialize the metadata structure for the given tensor shape and single-plane format, (Padding is automatically calculated)
185 * @note The padding used by this method is really conservative so that the tensor can be used for most functions.
187 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements
188 * @param[in] format Single plane format of the image.
190 * @return Total allocation size including padding in bytes.
192 size_t init_auto_padding(const TensorShape &tensor_shape, Format format);
193 /** Initialize the metadata structure for the given tensor shape, number of channels,
194 * data type and fixed point position. (Padding is automatically calculated)
196 * @note The padding used by this method is really conservative so that the tensor can be used for most functions.
198 * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements
199 * @param[in] num_channels It indicates the number of channels for each tensor element
200 * @param[in] data_type Data type to use for each tensor element
201 * @param[in] fixed_point_position (Optional) Fixed point position that expresses the number of bits for the fractional part of the number when the tensor's data type is QS8 or QS16.
203 * @return Total allocation size including padding in bytes.
205 size_t init_auto_padding(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, int fixed_point_position = 0);
206 /** Initialize the metadata structure for the given HOG's metadata
208 * @note init_auto_padding will be used for the tensor initialization.
210 * @param[in] hog_info HOG's metadata used to allocate normalized HOG space
211 * @param[in] width Width of the 2D tensor where the HOG descriptor will be computed on
212 * @param[in] height Height of the 2D tensor where the HOG descriptor will be computed on
214 * @return Total allocation size including padding in bytes.
216 size_t init_auto_padding(const HOGInfo &hog_info, unsigned int width, unsigned int height);
218 // Inherited methods overridden:
219 std::unique_ptr<ITensorInfo> clone() const override;
220 ITensorInfo &set_data_type(DataType data_type) override;
221 ITensorInfo &set_num_channels(int num_channels) override;
222 ITensorInfo &set_format(Format format) override;
223 ITensorInfo &set_tensor_shape(const TensorShape &shape) override;
224 ITensorInfo &set_fixed_point_position(int fixed_point_position) override;
225 ITensorInfo &set_quantization_info(const QuantizationInfo &quantization_info) override;
226 ITensorInfo &set_data_layout(const DataLayout &data_layout) override;
227 ITensorInfo &reset_padding() override;
228 bool auto_padding() override;
229 bool extend_padding(const PaddingSize &padding) override;
230 size_t dimension(size_t index) const override
232 return _tensor_shape[index];
234 size_t dimension(DataLayoutDimension dimension) const override
236 return get_data_layout_dimension_index(_data_layout, dimension);
238 const Strides &strides_in_bytes() const override
240 return _strides_in_bytes;
242 size_t offset_first_element_in_bytes() const override
244 return _offset_first_element_in_bytes;
246 size_t offset_element_in_bytes(const Coordinates &pos) const override;
247 int fixed_point_position() const override
249 return _fixed_point_position;
251 size_t element_size() const override
253 return data_size_from_type(_data_type) * _num_channels;
255 size_t num_dimensions() const override
257 return _tensor_shape.num_dimensions();
259 size_t num_channels() const override
261 return _num_channels;
263 const TensorShape &tensor_shape() const override
265 return _tensor_shape;
267 DataType data_type() const override
271 Format format() const override
275 size_t total_size() const override
279 PaddingSize padding() const override
283 bool has_padding() const override
285 return !_padding.empty();
287 bool is_resizable() const override
289 return _is_resizable;
291 ITensorInfo &set_is_resizable(bool is_resizable) override
293 _is_resizable = is_resizable;
296 ValidRegion valid_region() const override
298 return _valid_region;
300 void set_valid_region(const ValidRegion &valid_region) override
302 _valid_region = valid_region;
304 QuantizationInfo quantization_info() const override
306 return _quantization_info;
308 DataLayout data_layout() const override
314 /** Calculates strides, offset and total size resulting from the specified padding around the XY plane.
316 * @param[in] padding Padding around the XY plane in elements.
318 std::tuple<Strides, size_t, size_t> calculate_padding_requirements(const PaddingSize &padding);
321 int _fixed_point_position;
322 size_t _offset_first_element_in_bytes;
323 Strides _strides_in_bytes;
324 size_t _num_channels;
325 TensorShape _tensor_shape;
329 ValidRegion _valid_region;
330 PaddingSize _padding;
331 QuantizationInfo _quantization_info;
332 DataLayout _data_layout;
335 #endif /*__ARM_COMPUTE_TENSORINFO_H__ */