33 CheckValidNumDimensions(numDimensions);
35 std::fill(m_Dimensions.begin(), m_Dimensions.begin() + m_NumDimensions, 0);
36 std::fill(m_DimensionsSpecificity.begin(), m_DimensionsSpecificity.begin() + m_NumDimensions,
37 initDimensionsSpecificity);
43 CheckValidNumDimensions(numDimensions);
45 if (dimensionSizes ==
nullptr)
50 std::copy(dimensionSizes, dimensionSizes + numDimensions, m_Dimensions.begin());
51 std::fill(m_DimensionsSpecificity.begin(), m_DimensionsSpecificity.begin() + m_NumDimensions,
true);
60 const unsigned int*
const dimensionSizes,
61 const bool*
const dimensionsSpecificity)
64 CheckValidNumDimensions(numDimensions);
66 if (dimensionSizes ==
nullptr)
71 if (dimensionsSpecificity ==
nullptr)
76 std::copy(dimensionSizes, dimensionSizes + numDimensions, m_Dimensions.begin());
77 std::copy(dimensionsSpecificity, dimensionsSpecificity + numDimensions, m_DimensionsSpecificity.begin());
81 std::initializer_list<bool> dimensionsSpecificityList)
83 auto numDimensions =
static_cast<unsigned int>(dimensionSizeList.size());
84 if (dimensionsSpecificityList.size() != numDimensions)
89 *
this =
TensorShape(numDimensions, dimensionSizeList.begin(), dimensionsSpecificityList.begin());
93 : m_Dimensionality(dimensionality)
95 switch (dimensionality)
99 "for tensors that have an unknown number of dimensions or that are scalar");
104 m_DimensionsSpecificity = {
false};
109 m_DimensionsSpecificity = {
true};
117 : m_NumDimensions(other.m_NumDimensions), m_Dimensionality(other.m_Dimensionality)
119 std::copy(other.m_Dimensions.cbegin(), other.m_Dimensions.cbegin() + other.m_NumDimensions, m_Dimensions.begin());
120 std::copy(other.m_DimensionsSpecificity.cbegin(), other.m_DimensionsSpecificity.cbegin() + other.m_NumDimensions,
121 m_DimensionsSpecificity.begin());
126 m_NumDimensions = other.m_NumDimensions;
127 m_Dimensionality = other.m_Dimensionality;
128 std::copy(other.m_Dimensions.cbegin(), other.m_Dimensions.cbegin() + other.m_NumDimensions, m_Dimensions.begin());
129 std::copy(other.m_DimensionsSpecificity.cbegin(), other.m_DimensionsSpecificity.cbegin() + other.m_NumDimensions,
130 m_DimensionsSpecificity.begin());
137 CheckUnspecifiedNumDimensions();
138 CheckDimensionIndex(i);
139 CheckDimensionSpecified(i);
141 return m_Dimensions.at(i);
149 std::stringstream errorMessage;
150 errorMessage <<
"TensorShape with Dimensionality::Scalar must be const to use operator[]";
153 CheckUnspecifiedNumDimensions();
154 CheckDimensionIndex(i);
155 CheckDimensionSpecified(i);
157 return m_Dimensions.at(i);
162 return ((m_NumDimensions == other.m_NumDimensions) &&
163 (m_Dimensionality == other.m_Dimensionality) &&
164 std::equal(m_Dimensions.cbegin(), m_Dimensions.cbegin() + m_NumDimensions, other.m_Dimensions.cbegin()) &&
165 std::equal(m_DimensionsSpecificity.cbegin(), m_DimensionsSpecificity.cbegin() + m_NumDimensions,
166 other.m_DimensionsSpecificity.cbegin()));
171 return !(*
this == other);
176 CheckUnspecifiedNumDimensions();
178 return m_NumDimensions;
183 CheckUnspecifiedNumDimensions();
185 if (m_NumDimensions == 0)
190 unsigned int count = 1;
191 bool atLeastOneDimensionSpecified =
false;
192 for (
unsigned int i = 0; i < m_NumDimensions; ++i)
194 if (m_DimensionsSpecificity[i])
196 atLeastOneDimensionSpecified =
true;
197 count *= m_Dimensions[i];
201 if (atLeastOneDimensionSpecified)
213 CheckUnspecifiedNumDimensions();
214 CheckDimensionIndex(i);
216 return m_DimensionsSpecificity[i];
222 CheckSpecifiedNumDimensions();
223 CheckValidNumDimensions(numDimensions);
225 m_NumDimensions = numDimensions;
227 std::fill(m_Dimensions.begin(), m_Dimensions.begin() + m_NumDimensions, 0);
228 std::fill(m_DimensionsSpecificity.begin(), m_DimensionsSpecificity.begin() + m_NumDimensions,
229 initDimensionsSpecificity);
235 CheckDimensionIndex(i);
237 m_Dimensions[i] = dimensionSize;
238 m_DimensionsSpecificity[i] =
true;
243 CheckUnspecifiedNumDimensions();
245 bool areAllDimensionsSpecified =
true;
246 for (
unsigned int i = 0; i < m_NumDimensions; ++i)
248 if (!m_DimensionsSpecificity[i])
250 areAllDimensionsSpecified =
false;
254 return areAllDimensionsSpecified;
259 CheckUnspecifiedNumDimensions();
261 bool isAtLeastOneDimensionSpecified =
false;
262 for (
unsigned int i = 0; i < m_NumDimensions; ++i)
264 if (m_DimensionsSpecificity[i])
266 isAtLeastOneDimensionSpecified =
true;
270 return isAtLeastOneDimensionSpecified;
273 void TensorShape::CheckDimensionIndex(
unsigned int i)
const 275 if (i >= m_NumDimensions)
277 std::stringstream errorMessage;
278 errorMessage <<
"Invalid dimension index: " << i <<
" (number of dimensions is " << m_NumDimensions <<
")";
283 void TensorShape::CheckValidNumDimensions(
unsigned int numDimensions)
285 if (numDimensions < 1)
297 void TensorShape::CheckDimensionSpecified(
unsigned int i)
const 299 if (!m_DimensionsSpecificity[i])
301 std::stringstream errorMessage;
302 errorMessage <<
"Dimension index: " << i <<
" not specified. Tensor shape not inferred yet.";
307 void TensorShape::CheckScalar()
const 311 std::stringstream errorMessage;
312 errorMessage <<
"Invalid action on a tensor shape that holds a scalar value.";
317 void TensorShape::CheckUnspecifiedNumDimensions()
const 321 std::stringstream errorMessage;
322 errorMessage <<
"Invalid action on a tensor shape that has unknown number of dimensions.";
327 void TensorShape::CheckSpecifiedNumDimensions()
const 331 std::stringstream errorMessage;
332 errorMessage <<
"Invalid action on a tensor shape that has known number of dimensions.";
348 float quantizationScale,
349 int32_t quantizationOffset)
351 , m_DataType(dataType)
358 const unsigned int* dimensionSizes,
360 float quantizationScale,
361 int32_t quantizationOffset)
362 : m_Shape(numDimensions, dimensionSizes)
363 , m_DataType(dataType)
371 const std::vector<float>& quantizationScales,
372 unsigned int quantizationDim)
374 , m_DataType(dataType)
381 const unsigned int* dimensionSizes,
383 const std::vector<float>& quantizationScales,
384 unsigned int quantizationDim)
385 : m_Shape(numDimensions, dimensionSizes)
386 , m_DataType(dataType)
393 : m_Shape(other.m_Shape)
394 , m_DataType(other.m_DataType)
395 , m_Quantization(other.m_Quantization)
400 m_Shape = other.m_Shape;
401 m_DataType = other.m_DataType;
402 m_Quantization = other.m_Quantization;
408 return ((m_Shape == other.m_Shape) &&
409 (m_DataType == other.m_DataType) &&
410 (m_Quantization == other.m_Quantization));
415 return !(*
this == other);
427 match &= m_DataType == other.m_DataType;
444 return m_Quantization.m_Scales;
449 m_Quantization.m_Scales = scales;
454 if (m_Quantization.m_Scales.empty())
461 return m_Quantization.m_Scales[0];
466 m_Quantization.m_Scales = { scale };
471 if (!m_Quantization.m_Offset.has_value())
477 return m_Quantization.m_Offset.value();
482 m_Quantization.m_Offset = MakeOptional<int32_t>(offset);
487 return m_Quantization.m_QuantizationDim;
492 m_Quantization.m_QuantizationDim = quantizationDim;
504 template<
typename MemoryType>
506 : m_MemoryArea(nullptr)
510 template<
typename MemoryType>
512 : m_MemoryArea(memoryArea)
517 template<
typename MemoryType>
524 template<
typename MemoryType>
527 m_Info = other.m_Info;
unsigned int GetNumElements() const
Function that calculates the tensor elements by multiplying all dimension size which are Specified...
bool operator!=(const TensorShape &other) const
Inequality comparison operator.
unsigned int operator[](unsigned int i) const
Read only operator.
bool IsTypeSpaceMatch(const TensorInfo &other) const
Check that the types are the same and, if quantize, that the quantization parameters are the same...
TensorShape & operator=(const TensorShape &other)
Assignation function.
bool AreAllDimensionsSpecified() const
Checks if there is at least one dimension not specified.
constexpr bool IsQuantizedType()
bool HasPerAxisQuantization() const
Optional< unsigned int > GetQuantizationDim() const
unsigned int GetNumBytes() const
Copyright (c) 2021 ARM Limited and Contributors.
std::vector< float > GetQuantizationScales() const
bool HasMultipleQuantizationScales() const
bool GetDimensionSpecificity(unsigned int i) const
Gets information about if the dimension size has been specified or not.
bool operator==(const TensorShape &other) const
Equality comparison operator.
TensorShape()
Empty (invalid) constructor.
TensorInfo()
Empty (invalid) constructor.
int32_t GetQuantizationOffset() const
float GetQuantizationScale() const
void SetNumDimensions(unsigned int numDimensions, bool initDimensionsSpecificity=false)
Sets the tensor rank and therefore the Dimensionality is set to Specified if it was not...
void SetQuantizationScale(float scale)
#define ARMNN_ASSERT(COND)
const TensorInfo & GetInfo() const
TensorInfo & operator=(const TensorInfo &other)
void SetQuantizationDim(const Optional< unsigned int > &quantizationDim)
bool operator==(const TensorInfo &other) const
bool operator!=(const TensorInfo &other) const
BaseTensor()
Empty (invalid) constructor.
unsigned int GetNumDimensions() const
Function that returns the tensor rank.
void SetDimensionSize(unsigned int i, unsigned int dimensionSize)
Sets the size of the indicated dimension and Specificity for that dimension is set to true...
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
void SetQuantizationOffset(int32_t offset)
void SetQuantizationScales(const std::vector< float > &scales)
bool IsAtLeastOneDimensionSpecified() const
Checks if there is at least one dimension specified.
constexpr unsigned int MaxNumOfTensorDimensions
unsigned int GetNumElements() const
constexpr unsigned int GetDataTypeSize(DataType dataType)