Compute Library
 20.02.1
TensorInfo.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016-2019 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 #ifndef ARM_COMPUTE_TENSORINFO_H
25 #define ARM_COMPUTE_TENSORINFO_H
26 
28 
29 #include "ITensorInfo.h"
34 #include "arm_compute/core/Types.h"
35 #include "arm_compute/core/Utils.h"
36 
37 #include <cstddef>
38 #include <memory>
39 
40 namespace arm_compute
41 {
42 class HOGInfo;
43 
44 /** Store the tensor's metadata */
45 class TensorInfo final : public ITensorInfo
46 {
47 public:
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  */
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  */
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  *
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  */
93 
94  /** Constructor
95  *
96  * @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
99  */
101 
102  /** Constructor
103  *
104  * @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  */
110 
111  /** Constructor
112  *
113  * @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  */
119 
120  /** 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  *
156  * @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.
158  */
159  void init(size_t num_channels, DataType data_type);
160 
161  /** Initialize the metadata structure with the given parameters
162  *
163  * @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.
166  */
168 
169  /** 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).
177  */
179  size_t total_size_in_bytes);
180  /** 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  */
197  /** Initialize the metadata structure for the given tensor shape, number of channels and
198  * data type. (Padding is automatically calculated)
199  *
200  * @note The padding used by this method is really conservative so that the tensor can be used for most functions.
201  *
202  * @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
205  *
206  * @return Total allocation size including padding in bytes.
207  */
209  /** 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
216  *
217  * @return Total allocation size including padding in bytes.
218  */
219  size_t init_auto_padding(const HOGInfo &hog_info, unsigned int width, unsigned int height);
220 
221  // Inherited methods overridden:
222  std::unique_ptr<ITensorInfo> clone() const override;
225  ITensorInfo &set_format(Format format) override;
226  ITensorInfo &set_tensor_shape(const TensorShape &shape) override;
229  ITensorInfo &reset_padding() override;
230  bool auto_padding() override;
231  bool extend_padding(const PaddingSize &padding) override;
232  size_t dimension(size_t index) const override
233  {
234  return _tensor_shape[index];
235  }
236  size_t dimension(DataLayoutDimension dimension) const override
237  {
238  return get_data_layout_dimension_index(_data_layout, dimension);
239  }
240  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  }
248  int32_t offset_element_in_bytes(const Coordinates &pos) const override;
249  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  }
289  bool is_dynamic() const override
290  {
291  return _is_dynamic;
292  }
294  {
295  _is_resizable = is_resizable;
296  return *this;
297  }
299  {
300  _is_dynamic = is_dynamic;
301  return *this;
302  }
303  ValidRegion valid_region() const override
304  {
305  return _valid_region;
306  }
308  {
309  _valid_region = valid_region;
310  }
312  {
313  return _quantization_info;
314  }
315  DataLayout data_layout() const override
316  {
317  return _data_layout;
318  }
319 
320 private:
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 
327  size_t _total_size;
328  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;
335  bool _is_dynamic;
336  ValidRegion _valid_region;
337  PaddingSize _padding;
338  QuantizationInfo _quantization_info;
339  DataLayout _data_layout;
340 };
341 } // namespace arm_compute
342 #endif /*ARM_COMPUTE_TENSORINFO_H */
ITensorInfo & set_format(Format format) override
Set the format of an already initialized tensor.
Definition: TensorInfo.cpp:333
Shape of a tensor.
Definition: TensorShape.h:39
size_t init_auto_padding(const TensorShape &tensor_shape, Format format)
Initialize the metadata structure for the given tensor shape and single-plane format,...
Definition: TensorInfo.cpp:181
bool has_padding() const override
Checks if the tensor has been allocated with padding or not.
Definition: TensorInfo.h:281
void set_valid_region(const ValidRegion &valid_region) override
Set the valid region of the tensor.
Definition: TensorInfo.h:307
std::unique_ptr< ITensorInfo > clone() const override
Provide a clone of the current object of class T.
Definition: TensorInfo.cpp:314
bool is_resizable() const override
Flag indicating whether the size of the tensor can be changed.
Definition: TensorInfo.h:285
Container for 2D border size.
Definition: Types.h:269
ValidRegion valid_region() const override
Valid region of the tensor.
Definition: TensorInfo.h:303
size_t num_channels() const override
The number of channels for each tensor element.
Definition: TensorInfo.h:257
ITensorInfo & reset_padding() override
Resets the padding settings of the tensor.
Definition: TensorInfo.cpp:384
bool is_dynamic() const override
Flag indicating whether the shape of the tensor is dynamic, meaning that it can change on kernel/func...
Definition: TensorInfo.h:289
DataLayout data_layout() const override
Get the data layout of the tensor.
Definition: TensorInfo.h:315
DataLayoutDimension
[DataLayout enum definition]
Definition: Types.h:126
size_t dimension(size_t index) const override
Return the size of the requested dimension.
Definition: TensorInfo.h:232
Store the HOG's metadata.
Definition: HOGInfo.h:35
QuantizationInfo quantization_info() const override
Get the quantization settings (scale and offset) of the tensor.
Definition: TensorInfo.h:311
bool extend_padding(const PaddingSize &padding) override
Update the offset to the first element, the strides and the total size.
Definition: TensorInfo.cpp:279
ITensorInfo & set_data_type(DataType data_type) override
Set the data type to the specified value.
Definition: TensorInfo.cpp:319
Store the tensor's metadata.
Definition: ITensorInfo.h:40
size_t dimension(DataLayoutDimension dimension) const override
Return the size of the requested data layout dimension.
Definition: TensorInfo.h:236
PaddingSize padding() const override
Padding of tensor.
Definition: TensorInfo.h:277
const Strides & strides_in_bytes() const override
The strides in bytes for accessing each dimension of the tensor.
Definition: TensorInfo.h:240
bool auto_padding() override
Update the offset to the first element and the strides to automatically computed values.
Definition: TensorInfo.cpp:222
Copyright (c) 2017-2020 ARM Limited.
Format format() const override
Colour format of the image.
Definition: TensorInfo.h:269
ITensorInfo & set_quantization_info(const QuantizationInfo &quantization_info) override
Set the quantization settings (scale and offset) of the tensor.
Definition: TensorInfo.cpp:372
DataType data_type() const override
Data type used for each element of the tensor.
Definition: TensorInfo.h:265
Quantization information.
size_t num_dimensions() const override
The number of dimensions of the tensor (rank)
Definition: TensorInfo.h:253
ITensorInfo & set_data_layout(const DataLayout &data_layout) override
Set the data layout of the tensor.
Definition: TensorInfo.cpp:378
Format
Image colour formats.
Definition: Types.h:53
size_t total_size() const override
Returns the total size of the tensor in bytes.
Definition: TensorInfo.h:273
Coordinates of an item.
Definition: Coordinates.h:37
size_t data_size_from_type(DataType data_type)
The size in bytes of the data type.
Definition: Utils.h:109
ITensorInfo & set_is_resizable(bool is_resizable) override
Set the flag whether the tensor size can be changed.
Definition: TensorInfo.h:293
ITensorInfo & set_num_channels(int num_channels) override
Set the number of channels to the specified value.
Definition: TensorInfo.cpp:326
void init(Format format)
Initialize the tensor info with just a format.
Definition: TensorInfo.cpp:107
Strides of an item in bytes.
Definition: Strides.h:37
ITensorInfo & set_is_dynamic(bool is_dynamic) override
Set the flag whether the tensor size is dynamic.
Definition: TensorInfo.h:298
constexpr bool empty() const
Check if the entire border is zero.
Definition: Types.h:296
unsigned int num_dimensions() const
Returns the effective dimensionality of the tensor.
Definition: Dimensions.h:122
int32_t offset_element_in_bytes(const Coordinates &pos) const override
The offset in bytes from the beginning of the memory allocation to access the element at position (x,...
Definition: TensorInfo.cpp:394
size_t offset_first_element_in_bytes() const override
The offset from the beginning of the memory allocation to the first element of the tensor.
Definition: TensorInfo.h:244
Store the tensor's metadata.
Definition: TensorInfo.h:45
ITensorInfo & set_tensor_shape(const TensorShape &shape) override
Set the shape of an already initialized tensor.
Definition: TensorInfo.cpp:350
TensorInfo()
Default constructor.
Definition: TensorInfo.cpp:35
Container for valid region of a window.
Definition: Types.h:184
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:327
TensorInfo & operator=(const TensorInfo &)=default
Allow instances of this class to be copied.
const TensorShape & tensor_shape() const override
Size for each dimension of the tensor.
Definition: TensorInfo.h:261
DataType
Available data types.
Definition: Types.h:75
DataLayout
[DataLayout enum definition]
Definition: Types.h:117
size_t element_size() const override
Element size in bytes calculated as data_size() * num_channels()
Definition: TensorInfo.h:249
~TensorInfo()=default
Default destructor.