ArmNN
 20.02
PermutationVector Class Reference

#include <Types.hpp>

Public Types

using ValueType = unsigned int
 
using SizeType = unsigned int
 
using ArrayType = std::array< ValueType, MaxNumOfTensorDimensions >
 
using ConstIterator = typename ArrayType::const_iterator
 

Public Member Functions

 PermutationVector (const ValueType *dimMappings, SizeType numDimMappings)
 
 PermutationVector (std::initializer_list< ValueType > dimMappings)
 
ValueType operator[] (SizeType i) const
 
SizeType GetSize () const
 
ConstIterator begin () const
 
ConstIterator end () const
 
bool IsEqual (const PermutationVector &other) const
 
bool IsInverse (const PermutationVector &other) const
 

Detailed Description

Definition at line 173 of file Types.hpp.

Member Typedef Documentation

◆ ArrayType

Definition at line 178 of file Types.hpp.

◆ ConstIterator

using ConstIterator = typename ArrayType::const_iterator

Definition at line 179 of file Types.hpp.

◆ SizeType

using SizeType = unsigned int

Definition at line 177 of file Types.hpp.

◆ ValueType

using ValueType = unsigned int

Definition at line 176 of file Types.hpp.

Constructor & Destructor Documentation

◆ PermutationVector() [1/2]

PermutationVector ( const ValueType dimMappings,
SizeType  numDimMappings 
)
Parameters
dimMappings- Indicates how to translate tensor elements from a given source into the target destination, when source and target potentially have different memory layouts.

E.g. For a 4-d tensor laid out in a memory with the format (Batch Element, Height, Width, Channels), which is to be passed as an input to ArmNN, each source dimension is mapped to the corresponding ArmNN dimension. The Batch dimension remains the same (0 -> 0). The source Height dimension is mapped to the location of the ArmNN Height dimension (1 -> 2). Similar arguments are made for the Width and Channels (2 -> 3 and 3 -> 1). This will lead to m_DimMappings pointing to the following array: [ 0, 2, 3, 1 ].

Note that the mapping should be reversed if considering the case of ArmNN 4-d outputs (Batch Element, Channels, Height, Width) being written to a destination with the format mentioned above. We now have 0 -> 0, 2 -> 1, 3 -> 2, 1 -> 3, which, when reordered, lead to the following m_DimMappings contents: [ 0, 3, 1, 2 ].

Definition at line 18 of file Descriptors.cpp.

References armnn::MaxNumOfTensorDimensions.

19 {
20  // Validation
21 
22  if (numDimMappings > MaxNumOfTensorDimensions)
23  {
24  boost::format fmt("The number of mappings (%1%) cannot be greater "
25  "than the maximum number of dimensions supported (%2%)");
26  throw InvalidArgumentException(boost::str(fmt % numDimMappings % MaxNumOfTensorDimensions));
27  }
28 
29  if ((dimMappings == nullptr) && (numDimMappings != 0))
30  {
31  throw InvalidArgumentException("Dimension mappings must not be NULL if the number of mappings is positive");
32  }
33 
34  for (SizeType i = 0; i < numDimMappings; ++i)
35  {
36  const ValueType dstIndex = dimMappings[i];
37  if (dstIndex >= numDimMappings)
38  {
39  boost::format fmt("Dimension mapping at index %1% is invalid: %2% is outside of the valid range [0,%3%]");
40  throw InvalidArgumentException(boost::str(fmt % i % dstIndex % (numDimMappings - 1)));
41  }
42  }
43 
44  // Validation: Detect duplicates
45  {
46  std::array<bool, MaxNumOfTensorDimensions> observedDims;
47  observedDims.fill(false);
48 
49  for (SizeType i = 0; i < numDimMappings; ++i)
50  {
51  const ValueType dstIndex = dimMappings[i];
52  if (observedDims[dstIndex])
53  {
54  throw InvalidArgumentException("Invalid dimension mappings: Two or more source dimensions are mapped "
55  "to the same output dimension");
56  }
57  observedDims[dstIndex] = true;
58  }
59  }
60 
61  // Initialize
62  for (SizeType i = 0; i < numDimMappings; ++i)
63  {
64  m_DimMappings[i] = dimMappings[i];
65  }
66  m_NumDimMappings = numDimMappings;
67 }
unsigned int ValueType
Definition: Types.hpp:176
unsigned int SizeType
Definition: Types.hpp:177
constexpr unsigned int MaxNumOfTensorDimensions
Definition: Types.hpp:18

◆ PermutationVector() [2/2]

PermutationVector ( std::initializer_list< ValueType dimMappings)

Definition at line 69 of file Descriptors.cpp.

70  : PermutationVector(dimMappings.begin(), boost::numeric_cast<SizeType>(dimMappings.size()))
71 {
72 }
PermutationVector(const ValueType *dimMappings, SizeType numDimMappings)
Definition: Descriptors.cpp:18
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
Definition: NumericCast.hpp:33
unsigned int SizeType
Definition: Types.hpp:177

Member Function Documentation

◆ begin()

ConstIterator begin ( ) const
inline

Definition at line 204 of file Types.hpp.

204 { return m_DimMappings.begin(); }

◆ end()

ConstIterator end ( ) const
inline

Definition at line 205 of file Types.hpp.

205 { return m_DimMappings.end(); }

◆ GetSize()

◆ IsEqual()

bool IsEqual ( const PermutationVector other) const
inline

Definition at line 207 of file Types.hpp.

Referenced by TransposeLayer::IsEqual(), PermuteLayer::IsEqual(), and PermuteInputsForConcat().

208  {
209  if (m_NumDimMappings != other.m_NumDimMappings) return false;
210  for (unsigned int i = 0; i < m_NumDimMappings; ++i)
211  {
212  if (m_DimMappings[i] != other.m_DimMappings[i]) return false;
213  }
214  return true;
215  }

◆ IsInverse()

bool IsInverse ( const PermutationVector other) const
inline

Definition at line 217 of file Types.hpp.

References PermutationVector::GetSize().

Referenced by TransposeLayer::IsInverse(), and PermuteLayer::IsInverse().

218  {
219  bool isInverse = (GetSize() == other.GetSize());
220  for (SizeType i = 0; isInverse && (i < GetSize()); ++i)
221  {
222  isInverse = (m_DimMappings[other.m_DimMappings[i]] == i);
223  }
224  return isInverse;
225  }
SizeType GetSize() const
Definition: Types.hpp:202
unsigned int SizeType
Definition: Types.hpp:177

◆ operator[]()

ValueType operator[] ( SizeType  i) const
inline

Definition at line 200 of file Types.hpp.

200 { return m_DimMappings.at(i); }

The documentation for this class was generated from the following files: