13 #include <boost/numeric/conversion/cast.hpp> 34 CheckValidNumDimensions(numDimensions);
36 std::fill(m_Dimensions.begin(), m_Dimensions.begin() + m_NumDimensions, 0);
37 std::fill(m_DimensionsSpecificity.begin(), m_DimensionsSpecificity.begin() + m_NumDimensions,
38 initDimensionsSpecificity);
44 CheckValidNumDimensions(numDimensions);
46 if (dimensionSizes ==
nullptr)
51 std::copy(dimensionSizes, dimensionSizes + numDimensions, m_Dimensions.begin());
52 std::fill(m_DimensionsSpecificity.begin(), m_DimensionsSpecificity.begin() + m_NumDimensions,
true);
61 const unsigned int*
const dimensionSizes,
62 const bool*
const dimensionsSpecificity)
65 CheckValidNumDimensions(numDimensions);
67 if (dimensionSizes ==
nullptr)
72 if (dimensionsSpecificity ==
nullptr)
77 std::copy(dimensionSizes, dimensionSizes + numDimensions, m_Dimensions.begin());
78 std::copy(dimensionsSpecificity, dimensionsSpecificity + numDimensions, m_DimensionsSpecificity.begin());
82 std::initializer_list<bool> dimensionsSpecificityList)
84 auto numDimensions =
static_cast<unsigned int>(dimensionSizeList.size());
85 if (dimensionsSpecificityList.size() != numDimensions)
90 *
this =
TensorShape(numDimensions, dimensionSizeList.begin(), dimensionsSpecificityList.begin());
94 : m_Dimensionality(dimensionality)
96 switch (dimensionality)
100 "for tensors that have an unknown number of dimensions or that are scalar");
105 m_DimensionsSpecificity = {
false};
110 m_DimensionsSpecificity = {
true};
118 : m_NumDimensions(other.m_NumDimensions), m_Dimensionality(other.m_Dimensionality)
120 std::copy(other.m_Dimensions.cbegin(), other.m_Dimensions.cbegin() + other.m_NumDimensions, m_Dimensions.begin());
121 std::copy(other.m_DimensionsSpecificity.cbegin(), other.m_DimensionsSpecificity.cbegin() + other.m_NumDimensions,
122 m_DimensionsSpecificity.begin());
127 m_NumDimensions = other.m_NumDimensions;
128 m_Dimensionality = other.m_Dimensionality;
129 std::copy(other.m_Dimensions.cbegin(), other.m_Dimensions.cbegin() + other.m_NumDimensions, m_Dimensions.begin());
130 std::copy(other.m_DimensionsSpecificity.cbegin(), other.m_DimensionsSpecificity.cbegin() + other.m_NumDimensions,
131 m_DimensionsSpecificity.begin());
138 CheckUnspecifiedNumDimensions();
139 CheckDimensionIndex(i);
140 CheckDimensionSpecified(i);
142 return m_Dimensions.at(i);
150 std::stringstream errorMessage;
151 errorMessage <<
"TensorShape with Dimensionality::Scalar must be const to use operator[]";
154 CheckUnspecifiedNumDimensions();
155 CheckDimensionIndex(i);
156 CheckDimensionSpecified(i);
158 return m_Dimensions.at(i);
163 return ((m_NumDimensions == other.m_NumDimensions) &&
164 (m_Dimensionality == other.m_Dimensionality) &&
165 std::equal(m_Dimensions.cbegin(), m_Dimensions.cbegin() + m_NumDimensions, other.m_Dimensions.cbegin()) &&
166 std::equal(m_DimensionsSpecificity.cbegin(), m_DimensionsSpecificity.cbegin() + m_NumDimensions,
167 other.m_DimensionsSpecificity.cbegin()));
172 return !(*
this == other);
177 CheckUnspecifiedNumDimensions();
179 return m_NumDimensions;
184 CheckUnspecifiedNumDimensions();
186 if (m_NumDimensions == 0)
191 unsigned int count = 1;
192 bool atLeastOneDimensionSpecified =
false;
193 for (
unsigned int i = 0; i < m_NumDimensions; ++i)
195 if (m_DimensionsSpecificity[i])
197 atLeastOneDimensionSpecified =
true;
198 count *= m_Dimensions[i];
202 if (atLeastOneDimensionSpecified)
214 CheckUnspecifiedNumDimensions();
215 CheckDimensionIndex(i);
217 return m_DimensionsSpecificity[i];
223 CheckSpecifiedNumDimensions();
224 CheckValidNumDimensions(numDimensions);
226 m_NumDimensions = numDimensions;
228 std::fill(m_Dimensions.begin(), m_Dimensions.begin() + m_NumDimensions, 0);
229 std::fill(m_DimensionsSpecificity.begin(), m_DimensionsSpecificity.begin() + m_NumDimensions,
230 initDimensionsSpecificity);
236 CheckDimensionIndex(i);
238 m_Dimensions[i] = dimensionSize;
239 m_DimensionsSpecificity[i] =
true;
244 CheckUnspecifiedNumDimensions();
246 bool areAllDimensionsSpecified =
true;
247 for (
unsigned int i = 0; i < m_NumDimensions; ++i)
249 if (!m_DimensionsSpecificity[i])
251 areAllDimensionsSpecified =
false;
255 return areAllDimensionsSpecified;
260 CheckUnspecifiedNumDimensions();
262 bool isAtLeastOneDimensionSpecified =
false;
263 for (
unsigned int i = 0; i < m_NumDimensions; ++i)
265 if (m_DimensionsSpecificity[i])
267 isAtLeastOneDimensionSpecified =
true;
271 return isAtLeastOneDimensionSpecified;
274 void TensorShape::CheckDimensionIndex(
unsigned int i)
const 276 if (i >= m_NumDimensions)
278 std::stringstream errorMessage;
279 errorMessage <<
"Invalid dimension index: " << i <<
" (number of dimensions is " << m_NumDimensions <<
")";
284 void TensorShape::CheckValidNumDimensions(
unsigned int numDimensions)
286 if (numDimensions < 1)
298 void TensorShape::CheckDimensionSpecified(
unsigned int i)
const 300 if (!m_DimensionsSpecificity[i])
302 std::stringstream errorMessage;
303 errorMessage <<
"Dimension index: " << i <<
" not specified. Tensor shape not inferred yet.";
308 void TensorShape::CheckScalar()
const 312 std::stringstream errorMessage;
313 errorMessage <<
"Invalid action on a tensor shape that holds a scalar value.";
318 void TensorShape::CheckUnspecifiedNumDimensions()
const 322 std::stringstream errorMessage;
323 errorMessage <<
"Invalid action on a tensor shape that has unknown number of dimensions.";
328 void TensorShape::CheckSpecifiedNumDimensions()
const 332 std::stringstream errorMessage;
333 errorMessage <<
"Invalid action on a tensor shape that has known number of dimensions.";
349 float quantizationScale,
350 int32_t quantizationOffset)
352 , m_DataType(dataType)
359 const unsigned int* dimensionSizes,
361 float quantizationScale,
362 int32_t quantizationOffset)
363 : m_Shape(numDimensions, dimensionSizes)
364 , m_DataType(dataType)
372 const std::vector<float>& quantizationScales,
373 unsigned int quantizationDim)
375 , m_DataType(dataType)
382 const unsigned int* dimensionSizes,
384 const std::vector<float>& quantizationScales,
385 unsigned int quantizationDim)
386 : m_Shape(numDimensions, dimensionSizes)
387 , m_DataType(dataType)
394 : m_Shape(other.m_Shape)
395 , m_DataType(other.m_DataType)
396 , m_Quantization(other.m_Quantization)
401 m_Shape = other.m_Shape;
402 m_DataType = other.m_DataType;
403 m_Quantization = other.m_Quantization;
409 return ((m_Shape == other.m_Shape) &&
410 (m_DataType == other.m_DataType) &&
411 (m_Quantization == other.m_Quantization));
416 return !(*
this == other);
428 match &= m_DataType == other.m_DataType;
445 return m_Quantization.m_Scales;
450 m_Quantization.m_Scales = scales;
455 if (m_Quantization.m_Scales.empty())
462 return m_Quantization.m_Scales[0];
467 m_Quantization.m_Scales = { scale };
472 if (!m_Quantization.m_Offset.has_value())
478 return m_Quantization.m_Offset.value();
483 m_Quantization.m_Offset = MakeOptional<int32_t>(offset);
488 return m_Quantization.m_QuantizationDim;
493 m_Quantization.m_QuantizationDim = quantizationDim;
505 template<
typename MemoryType>
507 : m_MemoryArea(nullptr)
511 template<
typename MemoryType>
513 : m_MemoryArea(memoryArea)
518 template<
typename MemoryType>
525 template<
typename MemoryType>
528 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) 2020 ARM Limited.
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)
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
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...
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)