Compute Library
 21.11
TensorInfo.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016-2021 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 /** Store the tensor's metadata */
43 class TensorInfo final : public ITensorInfo
44 {
45 public:
46  /** Default constructor */
47  TensorInfo();
48  /** Default destructor */
49  ~TensorInfo() = default;
50  /** Allow instances of this class to be copy constructed */
51  TensorInfo(const ITensorInfo &info);
52  /** Allow instances of this class to be copy constructed */
53  TensorInfo(const TensorInfo &) = default;
54  /** Allow instances of this class to be copied */
55  TensorInfo &operator=(const TensorInfo &) = default;
56  /** Allow instances of this class to be move constructed */
57  TensorInfo(TensorInfo &&) = default;
58  /** Allow instances of this class to be moved */
59  TensorInfo &operator=(TensorInfo &&) = default;
60 
61  /** Construct a tensor info with a format.
62  *
63  * Can be used for automatic derivation of the shape by the function.
64  *
65  * @param[in] format Format of the tensor.
66  */
68 
69  /** 2D tensor constructor
70  *
71  * @param[in] width Width of the 2D tensor
72  * @param[in] height Height of the 2D tensor
73  * @param[in] format Single plane format of the tensor.
74  */
75  TensorInfo(unsigned int width, unsigned int height, Format format);
76  /** Constructor
77  *
78  * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
79  * @param[in] format Single plane format of the tensor.
80  */
81  TensorInfo(const TensorShape &tensor_shape, Format format);
82 
83  /** Construct a tensor info with a data type and number of channels.
84  *
85  * Can be used for automatic derivation of the shape by the function.
86  *
87  * @param[in] num_channels It indicates the number of channels for each tensor element
88  * @param[in] data_type Data type to use for each tensor element
89  */
91 
92  /** Constructor
93  *
94  * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
95  * @param[in] num_channels It indicates the number of channels for each tensor element
96  * @param[in] data_type Data type to use for each tensor element
97  */
98  TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type);
99 
100  /** Constructor
101  *
102  * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
103  * @param[in] num_channels It indicates the number of channels for each tensor element
104  * @param[in] data_type Data type to use for each tensor element
105  * @param[in] data_layout The data layout setting for the tensor data.
106  */
107  TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, DataLayout data_layout);
108 
109  /** Constructor
110  *
111  * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements.
112  * @param[in] num_channels It indicates the number of channels for each tensor element
113  * @param[in] data_type Data type to use for each tensor element
114  * @param[in] quantization_info The quantization settings for the tensor data.
115  */
116  TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, QuantizationInfo quantization_info);
117 
118  /** Initialize the tensor info with just a format.
119  *
120  * Can be used for automatic derivation of the shape by the function.
121  *
122  * @param[in] format Single plane format of the tensor.
123  */
124  void init(Format format);
125 
126  /** Initialize the metadata structure with the given parameters
127  *
128  * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
129  * @param[in] format Single plane format of the tensor.
130  */
131  void init(const TensorShape &tensor_shape, Format format);
132  /** Initialize the metadata structure with the given parameters
133  *
134  * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
135  * @param[in] format Single plane format of the tensor.
136  * @param[in] strides_in_bytes Stride in bytes for accessing each dimension of the tensor.
137  * @param[in] offset_first_element_in_bytes Offset in bytes from the beginning of memory allocation to access the first element.
138  * @param[in] total_size_in_bytes Size in bytes of the memory allocation (including the offset to the first element).
139  */
140  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);
141 
142  /** Initialize the tensor info with just a format.
143  *
144  * Can be used for automatic derivation of the shape by the function.
145  *
146  * @param[in] num_channels Desired number of channels for each tensor element.
147  * @param[in] data_type Data type to use for each tensor element.
148  */
149  void init(size_t num_channels, DataType data_type);
150 
151  /** Initialize the metadata structure with the given parameters
152  *
153  * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
154  * @param[in] num_channels Desired number of channels for each tensor element.
155  * @param[in] data_type Data type to use for each tensor element.
156  */
157  void init(const TensorShape &tensor_shape, size_t num_channels, DataType data_type);
158 
159  /** Initialize the metadata structure with the given parameters
160  *
161  * @param[in] tensor_shape Size for each dimension of the tensor in number of elements.
162  * @param[in] num_channels Desired number of channels for each tensor element.
163  * @param[in] data_type Data type to use for each tensor element.
164  * @param[in] strides_in_bytes Stride in bytes for accessing each dimension of the tensor.
165  * @param[in] offset_first_element_in_bytes Offset in bytes from the beginning of memory allocation to access the first element.
166  * @param[in] total_size_in_bytes Size in bytes of the memory allocation (including the offset to the first element).
167  */
168  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,
169  size_t total_size_in_bytes);
170  /** Initialize the metadata structure for the given tensor shape and single-plane format, (Padding is automatically calculated)
171  *
172  * @note The padding used by this method is really conservative so that the tensor can be used for most functions.
173  *
174  * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements
175  * @param[in] format Single plane format of the image.
176  *
177  * @return Total allocation size including padding in bytes.
178  */
179  size_t init_auto_padding(const TensorShape &tensor_shape, Format format);
180  /** Initialize the metadata structure for the given tensor shape, number of channels and
181  * data type. (Padding is automatically calculated)
182  *
183  * @note The padding used by this method is really conservative so that the tensor can be used for most functions.
184  *
185  * @param[in] tensor_shape It specifies the size for each dimension of the tensor in number of elements
186  * @param[in] num_channels It indicates the number of channels for each tensor element
187  * @param[in] data_type Data type to use for each tensor element
188  *
189  * @return Total allocation size including padding in bytes.
190  */
191  size_t init_auto_padding(const TensorShape &tensor_shape, size_t num_channels, DataType data_type);
192 
193  // Inherited methods overridden:
194  std::unique_ptr<ITensorInfo> clone() const override;
195  ITensorInfo &set_data_type(DataType data_type) override;
196  ITensorInfo &set_num_channels(int num_channels) override;
197  ITensorInfo &set_format(Format format) override;
198  ITensorInfo &set_tensor_shape(const TensorShape &shape) override;
199  ITensorInfo &set_tensor_dims_state(const TensorDimsState &state) override;
200  ITensorInfo &set_quantization_info(const QuantizationInfo &quantization_info) override;
201  ITensorInfo &set_data_layout(const DataLayout &data_layout) override;
202  ITensorInfo &reset_padding() override;
203  bool auto_padding() override;
204  bool extend_padding(const PaddingSize &padding) override;
205  size_t dimension(size_t index) const override
206  {
207  return _tensor_shape[index];
208  }
209  size_t dimension(DataLayoutDimension dimension) const override
210  {
211  return get_data_layout_dimension_index(_data_layout, dimension);
212  }
213  const Strides &strides_in_bytes() const override
214  {
215  return _strides_in_bytes;
216  }
217  size_t offset_first_element_in_bytes() const override
218  {
219  return _offset_first_element_in_bytes;
220  }
221  int32_t offset_element_in_bytes(const Coordinates &pos) const override;
222  size_t element_size() const override
223  {
224  return data_size_from_type(_data_type) * _num_channels;
225  }
226  size_t num_dimensions() const override
227  {
228  return _tensor_shape.num_dimensions();
229  }
230  size_t num_channels() const override
231  {
232  return _num_channels;
233  }
234  const TensorShape &tensor_shape() const override
235  {
236  return _tensor_shape;
237  }
238  const TensorDimsState &tensor_dims_state() const override
239  {
240  return _dims_state;
241  }
242  DataType data_type() const override
243  {
244  return _data_type;
245  }
246  Format format() const override
247  {
248  return _format;
249  }
250  size_t total_size() const override
251  {
252  return _total_size;
253  }
254  PaddingSize padding() const override
255  {
256  return _padding;
257  }
258  bool has_padding() const override
259  {
260  return !_padding.empty();
261  }
262  bool is_resizable() const override
263  {
264  return _is_resizable;
265  }
266  bool is_dynamic() const override
267  {
268  return std::find(std::cbegin(_dims_state), std::cend(_dims_state), get_dynamic_state_value()) != std::cend(_dims_state);
269  }
270  bool are_values_constant() const override
271  {
272  return _are_values_constant;
273  }
275  {
276  _is_resizable = is_resizable;
277  return *this;
278  }
279  ValidRegion valid_region() const override
280  {
281  return _valid_region;
282  }
284  {
285  _valid_region = valid_region;
286  }
288  {
289  return _quantization_info;
290  }
291  DataLayout data_layout() const override
292  {
293  return _data_layout;
294  }
296  {
297  _are_values_constant = are_values_constant;
298  return *this;
299  }
300 
301 private:
302  /** Calculates strides, offset and total size resulting from the specified padding around the XY plane.
303  *
304  * @param[in] padding Padding around the XY plane in elements.
305  */
306  std::tuple<Strides, size_t, size_t> calculate_padding_requirements(const PaddingSize &padding);
307 
308  size_t _total_size;
309  size_t _offset_first_element_in_bytes;
310  Strides _strides_in_bytes;
311  size_t _num_channels;
312  TensorShape _tensor_shape;
313  TensorDimsState _dims_state;
314  DataType _data_type;
315  Format _format;
316  bool _is_resizable;
317  ValidRegion _valid_region;
318  PaddingSize _padding;
319  QuantizationInfo _quantization_info;
320  DataLayout _data_layout;
321  bool _are_values_constant;
322 };
323 } // namespace arm_compute
324 #endif /*ARM_COMPUTE_TENSORINFO_H */
ITensorInfo & set_format(Format format) override
Set the format of an already initialized tensor.
Definition: TensorInfo.cpp:301
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, (Padding is automatically calculated)
Definition: TensorInfo.cpp:163
bool has_padding() const override
Checks if the tensor has been allocated with padding or not.
Definition: TensorInfo.h:258
void set_valid_region(const ValidRegion &valid_region) override
Set the valid region of the tensor.
Definition: TensorInfo.h:283
std::unique_ptr< ITensorInfo > clone() const override
Provide a clone of the current object of class T.
Definition: TensorInfo.cpp:282
bool is_resizable() const override
Flag indicating whether the size of the tensor can be changed.
Definition: TensorInfo.h:262
Container for 2D border size.
Definition: Types.h:269
ValidRegion valid_region() const override
Valid region of the tensor.
Definition: TensorInfo.h:279
size_t num_channels() const override
The number of channels for each tensor element.
Definition: TensorInfo.h:230
ITensorInfo & reset_padding() override
Resets the padding settings of the tensor.
Definition: TensorInfo.cpp:358
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:266
DataLayout data_layout() const override
Get the data layout of the tensor.
Definition: TensorInfo.h:291
DataLayoutDimension
[DataLayout enum definition]
Definition: Types.h:124
size_t dimension(size_t index) const override
Return the size of the requested dimension.
Definition: TensorInfo.h:205
QuantizationInfo quantization_info() const override
Get the quantization settings (scale and offset) of the tensor.
Definition: TensorInfo.h:287
bool extend_padding(const PaddingSize &padding) override
Update the offset to the first element, the strides and the total size.
Definition: TensorInfo.cpp:247
ITensorInfo & set_data_type(DataType data_type) override
Set the data type to the specified value.
Definition: TensorInfo.cpp:287
Store the tensor&#39;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:209
std::vector< int > TensorDimsState
Definition: ITensorInfo.h:43
PaddingSize padding() const override
Padding of tensor.
Definition: TensorInfo.h:254
const Strides & strides_in_bytes() const override
The strides in bytes for accessing each dimension of the tensor.
Definition: TensorInfo.h:213
bool auto_padding() override
Update the offset to the first element and the strides to automatically computed values.
Definition: TensorInfo.cpp:190
Copyright (c) 2017-2021 Arm Limited.
Format format() const override
Colour format of the image.
Definition: TensorInfo.h:246
ITensorInfo & set_quantization_info(const QuantizationInfo &quantization_info) override
Set the quantization settings (scale and offset) of the tensor.
Definition: TensorInfo.cpp:346
DataType data_type() const override
Data type used for each element of the tensor.
Definition: TensorInfo.h:242
Quantization information.
size_t num_dimensions() const override
The number of dimensions of the tensor (rank)
Definition: TensorInfo.h:226
ITensorInfo & set_data_layout(const DataLayout &data_layout) override
Set the data layout of the tensor.
Definition: TensorInfo.cpp:352
Format
Image colour formats.
Definition: Types.h:56
size_t total_size() const override
Returns the total size of the tensor in bytes.
Definition: TensorInfo.h:250
Coordinates of an item.
Definition: Coordinates.h:37
const TensorDimsState & tensor_dims_state() const override
State of each dimension of the tensor shape.
Definition: TensorInfo.h:238
size_t data_size_from_type(DataType data_type)
The size in bytes of the data type.
Definition: Utils.h:106
ITensorInfo & set_is_resizable(bool is_resizable) override
Set the flag whether the tensor size can be changed.
Definition: TensorInfo.h:274
ITensorInfo & set_num_channels(int num_channels) override
Set the number of channels to the specified value.
Definition: TensorInfo.cpp:294
bool are_values_constant() const override
Flag indicating whether the values of the tensor are constant, meaning that they can change on kernel...
Definition: TensorInfo.h:270
void init(Format format)
Initialize the tensor info with just a format.
Definition: TensorInfo.cpp:103
Strides of an item in bytes.
Definition: Strides.h:37
ITensorInfo & set_are_values_constant(bool are_values_constant) override
Set the flag whether the tensor values can change during kernel/function execution.
Definition: TensorInfo.h:295
ScaleKernelInfo info(interpolation_policy, default_border_mode, PixelValue(), sampling_policy, false)
ITensorInfo & set_tensor_dims_state(const TensorDimsState &state) override
Set the state for each dimension of the tensor.
Definition: TensorInfo.cpp:340
constexpr bool empty() const
Check if the entire border is zero.
Definition: Types.h:302
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:193
unsigned int num_dimensions() const
Returns the effective dimensionality of the tensor.
Definition: Dimensions.h:143
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:368
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:217
Store the tensor&#39;s metadata.
Definition: TensorInfo.h:43
ITensorInfo & set_tensor_shape(const TensorShape &shape) override
Set the shape of an already initialized tensor.
Definition: TensorInfo.cpp:318
TensorInfo()
Default constructor.
Definition: TensorInfo.cpp:36
Container for valid region of a window.
Definition: Types.h:184
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:234
DataType
Available data types.
Definition: Types.h:79
static constexpr int32_t get_dynamic_state_value()
Get the value representing dynamic dimension state.
Definition: ITensorInfo.h:49
DataLayout
[DataLayout enum definition]
Definition: Types.h:113
size_t element_size() const override
Element size in bytes calculated as data_size() * num_channels()
Definition: TensorInfo.h:222
~TensorInfo()=default
Default destructor.