15 #include <fmt/format.h> 27 fmt::format(
"The number of mappings ({0}) cannot be greater " 28 "than the maximum number of dimensions supported ({1})",
33 if ((dimMappings ==
nullptr) && (numDimMappings != 0))
38 for (
SizeType i = 0; i < numDimMappings; ++i)
40 const ValueType dstIndex = dimMappings[i];
41 if (dstIndex >= numDimMappings)
44 fmt::format(
"Dimension mapping at index {0} is invalid: " 45 "{1} is outside of the valid range [0,{2}]",
48 (numDimMappings - 1)));
54 std::array<bool, MaxNumOfTensorDimensions> observedDims;
55 observedDims.fill(
false);
57 for (
SizeType i = 0; i < numDimMappings; ++i)
59 const ValueType dstIndex = dimMappings[i];
60 if (observedDims[dstIndex])
63 "to the same output dimension");
65 observedDims[dstIndex] =
true;
70 for (
SizeType i = 0; i < numDimMappings; ++i)
72 m_DimMappings[i] = dimMappings[i];
74 m_NumDimMappings = numDimMappings;
86 , m_ViewOrigins(nullptr)
91 , m_NumViews(numViews)
92 , m_NumDimensions(numDimensions)
93 , m_ViewOrigins(numViews && numDimensions > 0 ? new uint32_t *[numViews]() : nullptr)
95 for (uint32_t i = 0; m_NumDimensions > 0 && i < m_NumViews; ++i)
97 m_ViewOrigins[i] =
new uint32_t[m_NumDimensions]();
102 : m_ConcatAxis(other.m_ConcatAxis)
103 , m_NumViews(other.m_NumViews)
104 , m_NumDimensions(other.m_NumDimensions)
105 , m_ViewOrigins(other.m_NumViews && other.m_NumDimensions > 0 ? new uint32_t *[other.m_NumViews]() : nullptr)
107 for (uint32_t i = 0; m_NumDimensions > 0 && i < m_NumViews; ++i)
109 m_ViewOrigins[i] =
new uint32_t[m_NumDimensions]();
110 memcpy(m_ViewOrigins[i], other.m_ViewOrigins[i], m_NumDimensions *
sizeof(uint32_t));
122 for (uint32_t i = 0; m_NumDimensions > 0 && i < m_NumViews; ++i)
124 delete[] m_ViewOrigins[i];
126 delete[] m_ViewOrigins;
160 m_ConcatAxis = concatAxis;
169 if (view >= m_NumViews)
171 ARMNN_LOG(
error) <<
"OriginsDescriptor::SetViewOriginCoord: view argument:" << view <<
175 if (coord >= m_NumDimensions)
177 ARMNN_LOG(
error) <<
"OriginsDescriptor::SetViewOriginCoord: coord argument:" << coord <<
182 m_ViewOrigins[view][coord] = value;
194 return m_NumDimensions;
199 return m_ViewOrigins ? m_ViewOrigins[idx] :
nullptr;
206 ARMNN_ASSERT_MSG(m_NumViews == numNewOrdering,
"number of views must match number of " 207 "elements in the new ordering array");
208 std::vector<uint32_t*> viewOrigins(&m_ViewOrigins[0], &m_ViewOrigins[m_NumViews]);
210 for (
unsigned int i = 0; i < numNewOrdering; ++i)
212 m_ViewOrigins[i] = viewOrigins[newOrdering[i]];
218 , m_ViewSizes(nullptr)
222 : m_Origins(numViews, numDimensions)
223 , m_ViewSizes(numViews > 0 && numDimensions > 0 ?
224 new uint32_t *[numViews]() : nullptr)
236 : m_Origins(other.m_Origins)
245 memcpy(m_ViewSizes[i], other.m_ViewSizes[i],
GetNumDimensions() *
sizeof(uint32_t));
262 delete[] m_ViewSizes[i];
264 delete[] m_ViewSizes;
319 ARMNN_LOG(
error) <<
"ViewsDescriptor::SetViewSize: invalid view sizes";
325 ARMNN_LOG(
error) <<
"ViewsDescriptor::SetViewSize: view argument:" << view <<
331 ARMNN_LOG(
error) <<
"ViewsDescriptor::SetViewSize: coord argument:" << coord <<
336 m_ViewSizes[view][coord] = value;
342 return m_ViewSizes ? m_ViewSizes[idx] :
nullptr;
353 swap(first.m_NumViews, second.m_NumViews);
354 swap(first.m_NumDimensions, second.m_NumDimensions);
355 swap(first.m_ViewOrigins, second.m_ViewOrigins);
356 swap(first.m_ConcatAxis, second.m_ConcatAxis);
362 swap(first.m_Origins, second.m_Origins);
363 swap(first.m_ViewSizes, second.m_ViewSizes);
367 unsigned int axis)
const 369 int start = m_Begin[axis];
371 if (m_BeginMask & (1 << axis))
373 if (m_Stride[axis] > 0)
375 start = std::numeric_limits<int>::min();
379 start = std::numeric_limits<int>::max();
389 return std::max(0, std::min(start, axisSize - 1));
395 int startForAxis)
const 398 if (m_ShrinkAxisMask & (1 << axis))
400 return startForAxis + 1;
403 int stop = m_End[axis];
405 if (m_EndMask & (1 << axis))
407 if (m_Stride[axis] > 0)
409 stop = std::numeric_limits<int>::max();
413 stop = std::numeric_limits<int>::min();
423 return m_Stride[axis] > 0 ? std::max(0, std::min(stop, axisSize)) :
424 std::max(-1, std::min(stop, axisSize - 1));
430 unsigned int numInputs = 2;
458 std::pair<std::pair<unsigned int, unsigned int>, std::pair<unsigned int, unsigned int>>
470 std::pair<unsigned int, unsigned int> xAxes = { xNumDims-2, xNumDims-1 };
471 std::pair<unsigned int, unsigned int> yAxes = { yNumDims-2, yNumDims-1 };
505 return { xAxes, yAxes};
517 std::vector<unsigned int> axesXNotMul;
518 std::vector<unsigned int> axesYNotMul;
522 if(i == axesToMul.first.first || i == axesToMul.first.second)
526 axesXNotMul.push_back(i);
530 if(i == axesToMul.second.first || i == axesToMul.second.second)
534 axesYNotMul.push_back(i);
537 return { axesXNotMul, axesYNotMul };
friend void swap(OriginsDescriptor &first, OriginsDescriptor &second)
Swap the ViewsDescriptor values first and second.
A ViewsDescriptor for the SplitterLayer.
OriginsDescriptor & operator=(OriginsDescriptor rhs)
uint32_t GetNumInputs() const
int GetStartForAxis(const TensorShape &inputShape, unsigned int axis) const
void swap(ViewsDescriptor &first, ViewsDescriptor &second)
uint32_t GetNumDimensions() const
Get the number of dimensions.
uint32_t GetNumInputs() const
Get the number of views/inputs.
friend void swap(ViewsDescriptor &first, ViewsDescriptor &second)
Swap the ViewsDescriptor value first and second.
Optional< DataLayout > m_DataLayoutX
Data layout of each input tensor, such as NHWC/NDHWC (or leave as EmptyOptional for arbitrary layout)...
#define ARMNN_LOG(severity)
bool operator==(const ViewsDescriptor &rhs) const
uint32_t GetNumViews() const
Get the number of views.
Copyright (c) 2021 ARM Limited and Contributors.
const uint32_t * GetViewOrigin(uint32_t idx) const
Return the view origin at the int value idx.
void ReorderOrigins(unsigned int *newOrdering, unsigned int numNewOrdering)
Reorders the viewOrigins in accordance with the indices presented in newOrdering array.
uint32_t GetNumInputs(bool biasEnabled)
Status SetViewSize(uint32_t view, uint32_t coord, uint32_t value)
Set the size of the views.
#define ARMNN_ASSERT_MSG(COND, MSG)
static std::pair< std::vector< unsigned int >, std::vector< unsigned int > > GetAxesNotMul(const BatchMatMulDescriptor &desc, const TensorShape &inputXShape, const TensorShape &inputYShape)
Static helper to get the axes (for each input) that will not be multiplied together.
PermutationVector(const ValueType *dimMappings, SizeType numDimMappings)
An OriginsDescriptor for the ConcatLayer.
bool has_value() const noexcept
static std::pair< std::pair< unsigned int, unsigned int >, std::pair< unsigned int, unsigned int > > GetAxesToMul(const BatchMatMulDescriptor &desc, const TensorShape &tensorXShape, const TensorShape &tensorYShape)
Static helper to get the two axes (for each input) for multiplication.
A BatchMatMulDescriptor for the BatchMatMul operator.
const uint32_t * GetViewOrigin(uint32_t idx) const
Get the view origin at the int value idx.
const uint32_t * GetViewSizes(uint32_t idx) const
Get the view sizes at the int value idx.
uint32_t GetNumInputs() const
Get the number of inputs.
unsigned int GetNumDimensions() const
Function that returns the tensor rank.
ConstIterator begin() const
void SetConcatAxis(unsigned int concatAxis)
Set the concatenation axis value.
uint32_t GetNumDimensions() const
Get the number of dimensions.
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
uint32_t GetNumInputs() const
Get the number of views/inputs.
int GetStopForAxis(const TensorShape &inputShape, unsigned int axis, int startForAxis) const
uint32_t GetNumViews() const
Get the number of views.
bool operator==(const OriginsDescriptor &rhs) const
unsigned int GetConcatAxis() const
Get the concatenation axis value.
ViewsDescriptor & operator=(ViewsDescriptor rhs)
Optional< DataLayout > m_DataLayoutY
const OriginsDescriptor & GetOrigins() const
Get the View Origins.
Status SetViewOriginCoord(uint32_t view, uint32_t coord, uint32_t value)
Set the view origin coordinates.
constexpr unsigned int MaxNumOfTensorDimensions
Status SetViewOriginCoord(uint32_t view, uint32_t coord, uint32_t value)
Set the view origin coordinates.