diff options
Diffstat (limited to 'arm_compute/core/ITensorInfo.h')
-rw-r--r-- | arm_compute/core/ITensorInfo.h | 89 |
1 files changed, 77 insertions, 12 deletions
diff --git a/arm_compute/core/ITensorInfo.h b/arm_compute/core/ITensorInfo.h index 9ddafce7c0..c42f4b57a1 100644 --- a/arm_compute/core/ITensorInfo.h +++ b/arm_compute/core/ITensorInfo.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2021 Arm Limited. + * Copyright (c) 2016-2023 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -28,21 +28,46 @@ #include "arm_compute/core/Strides.h" #include "arm_compute/core/TensorShape.h" #include "arm_compute/core/Types.h" -#include "arm_compute/core/Utils.h" #include "arm_compute/core/utils/misc/Utility.h" + #include "support/ICloneable.h" #include <cstddef> namespace arm_compute { +class QuantizationInfo; +// Note: Any changes to the fields of the class below that have setters should be mirrored +// (if possible) in the auto_init_if_empty function in AutoConfiguration.h + /** Store the tensor's metadata */ class ITensorInfo : public misc::ICloneable<ITensorInfo> { public: - using TensorDimsState = Coordinates; - -public: + using TensorDimsState = std::vector<int>; + /** An id that uniquely identifies an ITensorInfo within some domain (e.g. a workload) + */ + using Id = int32_t; + /** An invalid tensor id within a domain */ + static constexpr Id invalid_tensor_id = 0; + /** Get the value representing dynamic dimension state + * + * @return Value representing dynamic dimension state + * + */ + static constexpr int32_t get_dynamic_state_value() + { + return _dynamic_dimension; + } + /** Get the value representing static dimension state + * + * @return Value representing static dimension state + * + */ + static constexpr int32_t get_static_state_value() + { + return _static_dimension; + } /** Default virtual destructor */ virtual ~ITensorInfo() = default; /** Set the data type to the specified value. @@ -121,6 +146,17 @@ public: * @return True if the strides or the offset to the first element have changed. */ virtual bool auto_padding() = 0; + /** Set the lock paddings flag of the tensor. + * It should be set to True, when the tensor could be mapped to camera or frame buffer. + * + * @return Reference to this ITensorInfo object + */ + virtual ITensorInfo &set_lock_paddings(bool flag) = 0; + /** Get the lock paddings flag value + * + * @return lock paddings flag value + */ + virtual bool lock_paddings() const = 0; /** Update the offset to the first element, the strides and the total size. * * @note This function can only increase the offset, strides and total size. @@ -224,6 +260,11 @@ public: * @return True if its dynamic else false */ virtual bool is_dynamic() const = 0; + /** Flag indicating whether the values of the tensor are constant, meaning that they can change on kernel/function execution. + * + * @return True if values are constant else false + */ + virtual bool are_values_constant() const = 0; /** Set the flag whether the tensor size can be changed. * * @param[in] is_resizable Flag that marks the tensor if it can be changed or not. @@ -231,6 +272,13 @@ public: * @return Reference to this ITensorInfo object */ virtual ITensorInfo &set_is_resizable(bool is_resizable) = 0; + /** Set the flag whether the tensor values can change during kernel/function execution. + * + * @param[in] are_values_constant Flag that marks the tensor values if they can be changed or not. + * + * @return Reference to this ITensorInfo object + */ + virtual ITensorInfo &set_are_values_constant(bool are_values_constant) = 0; /** Valid region of the tensor. All elements in the valid region have defined values, i.e. are not undefined. * * @return The valid region. @@ -252,7 +300,20 @@ public: * @return A DataLayout containing the layout data information. */ virtual DataLayout data_layout() const = 0; - + /** Get the workload tensor id of the tensor. + * + * @return Workload tensor id of the tensor + */ + virtual Id id() const = 0; + /** Set the tensor id + */ + virtual ITensorInfo &set_id(ITensorInfo::Id id) = 0; + /** Check if the tensor id is valid + */ + bool has_valid_id() const + { + return id() != invalid_tensor_id; + } /** If infos are broadcast compatible tensor info's, return the broadcasted shape and the intersection of * the broadcasted valid regions of the tensors. * @@ -268,23 +329,23 @@ public: * not broadcast compatible. */ template <typename... Infos> - static std::pair<TensorShape, ValidRegion> broadcast_shape_and_valid_region(const Infos &... infos) + static std::pair<TensorShape, ValidRegion> broadcast_shape_and_valid_region(const Infos &...infos) { TensorShape bc_shape = TensorShape::broadcast_shape(infos.tensor_shape()...); - ValidRegion bc_valid_region{ Coordinates(), bc_shape }; + ValidRegion bc_valid_region{Coordinates(), bc_shape}; - auto broadcast_valid_region = [&bc_valid_region](const ITensorInfo & info) + auto broadcast_valid_region = [&bc_valid_region](const ITensorInfo &info) { - if(info.num_dimensions() != 0) + if (info.num_dimensions() != 0) { - for(size_t d = 0; d < bc_valid_region.shape.num_dimensions(); ++d) + for (size_t d = 0; d < bc_valid_region.shape.num_dimensions(); ++d) { const bool is_broadcast = (info.tensor_shape()[d] == 1); const int anchor_max = std::max(bc_valid_region.anchor[d], info.valid_region().anchor[d]); const size_t valid_min = std::min(bc_valid_region.shape[d], info.valid_region().shape[d]); - if(!is_broadcast || (valid_min == 0)) + if (!is_broadcast || (valid_min == 0)) { bc_valid_region.anchor.set(d, anchor_max); bc_valid_region.shape.set(d, valid_min); @@ -297,6 +358,10 @@ public: return std::pair<TensorShape, ValidRegion>(bc_shape, bc_valid_region); } + +private: + static constexpr int32_t _dynamic_dimension = -1; + static constexpr int32_t _static_dimension = 0; }; } // namespace arm_compute #endif /*ARM_COMPUTE_TENSORINFO_H */ |