• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
27 #include "arm_compute/core/ITensorInfo.h"
28 
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"
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      */
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      *
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      */
92     TensorInfo(size_t num_channels, DataType data_type);
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      */
100     TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type);
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      */
109     TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, DataLayout data_layout);
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      */
118     TensorInfo(const TensorShape &tensor_shape, size_t num_channels, DataType data_type, QuantizationInfo quantization_info);
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      */
167     void init(const TensorShape &tensor_shape, size_t num_channels, DataType data_type);
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      */
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,
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      */
196     size_t init_auto_padding(const TensorShape &tensor_shape, Format format);
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      */
208     size_t init_auto_padding(const TensorShape &tensor_shape, size_t num_channels, DataType data_type);
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;
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;
226     ITensorInfo &set_tensor_shape(const TensorShape &shape) override;
227     ITensorInfo &set_quantization_info(const QuantizationInfo &quantization_info) override;
228     ITensorInfo &set_data_layout(const DataLayout &data_layout) override;
229     ITensorInfo &reset_padding() override;
230     bool         auto_padding() override;
231     bool extend_padding(const PaddingSize &padding) override;
dimension(size_t index)232     size_t dimension(size_t index) const override
233     {
234         return _tensor_shape[index];
235     }
dimension(DataLayoutDimension dimension)236     size_t dimension(DataLayoutDimension dimension) const override
237     {
238         return get_data_layout_dimension_index(_data_layout, dimension);
239     }
strides_in_bytes()240     const Strides &strides_in_bytes() const override
241     {
242         return _strides_in_bytes;
243     }
offset_first_element_in_bytes()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;
element_size()249     size_t element_size() const override
250     {
251         return data_size_from_type(_data_type) * _num_channels;
252     }
num_dimensions()253     size_t num_dimensions() const override
254     {
255         return _tensor_shape.num_dimensions();
256     }
num_channels()257     size_t num_channels() const override
258     {
259         return _num_channels;
260     }
tensor_shape()261     const TensorShape &tensor_shape() const override
262     {
263         return _tensor_shape;
264     }
data_type()265     DataType data_type() const override
266     {
267         return _data_type;
268     }
format()269     Format format() const override
270     {
271         return _format;
272     }
total_size()273     size_t total_size() const override
274     {
275         return _total_size;
276     }
padding()277     PaddingSize padding() const override
278     {
279         return _padding;
280     }
has_padding()281     bool has_padding() const override
282     {
283         return !_padding.empty();
284     }
is_resizable()285     bool is_resizable() const override
286     {
287         return _is_resizable;
288     }
is_dynamic()289     bool is_dynamic() const override
290     {
291         return _is_dynamic;
292     }
set_is_resizable(bool is_resizable)293     ITensorInfo &set_is_resizable(bool is_resizable) override
294     {
295         _is_resizable = is_resizable;
296         return *this;
297     }
set_is_dynamic(bool is_dynamic)298     ITensorInfo &set_is_dynamic(bool is_dynamic) override
299     {
300         _is_dynamic = is_dynamic;
301         return *this;
302     }
valid_region()303     ValidRegion valid_region() const override
304     {
305         return _valid_region;
306     }
set_valid_region(const ValidRegion & valid_region)307     void set_valid_region(const ValidRegion &valid_region) override
308     {
309         _valid_region = valid_region;
310     }
quantization_info()311     QuantizationInfo quantization_info() const override
312     {
313         return _quantization_info;
314     }
data_layout()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 */
343