14 #include <boost/format.hpp> 15 #include <boost/numeric/conversion/cast.hpp> 26 boost::format fmt(
"The number of mappings (%1%) cannot be greater " 27 "than the maximum number of dimensions supported (%2%)");
31 if ((dimMappings ==
nullptr) && (numDimMappings != 0))
36 for (
SizeType i = 0; i < numDimMappings; ++i)
38 const ValueType dstIndex = dimMappings[i];
39 if (dstIndex >= numDimMappings)
41 boost::format fmt(
"Dimension mapping at index %1% is invalid: %2% is outside of the valid range [0,%3%]");
48 std::array<bool, MaxNumOfTensorDimensions> observedDims;
49 observedDims.fill(
false);
51 for (
SizeType i = 0; i < numDimMappings; ++i)
53 const ValueType dstIndex = dimMappings[i];
54 if (observedDims[dstIndex])
57 "to the same output dimension");
59 observedDims[dstIndex] =
true;
64 for (
SizeType i = 0; i < numDimMappings; ++i)
66 m_DimMappings[i] = dimMappings[i];
68 m_NumDimMappings = numDimMappings;
80 , m_ViewOrigins(nullptr)
85 , m_NumViews(numViews)
86 , m_NumDimensions(numDimensions)
87 , m_ViewOrigins(numViews && numDimensions > 0 ? new uint32_t *[numViews]() : nullptr)
89 for (uint32_t i = 0; m_NumDimensions > 0 && i < m_NumViews; ++i)
91 m_ViewOrigins[i] =
new uint32_t[m_NumDimensions]();
96 : m_ConcatAxis(other.m_ConcatAxis)
97 , m_NumViews(other.m_NumViews)
98 , m_NumDimensions(other.m_NumDimensions)
99 , m_ViewOrigins(other.m_NumViews && other.m_NumDimensions > 0 ? new uint32_t *[other.m_NumViews]() : nullptr)
101 for (uint32_t i = 0; m_NumDimensions > 0 && i < m_NumViews; ++i)
103 m_ViewOrigins[i] =
new uint32_t[m_NumDimensions]();
104 memcpy(m_ViewOrigins[i], other.m_ViewOrigins[i], m_NumDimensions *
sizeof(uint32_t));
116 for (uint32_t i = 0; m_NumDimensions > 0 && i < m_NumViews; ++i)
118 delete[] m_ViewOrigins[i];
120 delete[] m_ViewOrigins;
154 m_ConcatAxis = concatAxis;
163 if (view >= m_NumViews)
165 ARMNN_LOG(
error) <<
"OriginsDescriptor::SetViewOriginCoord: view argument:" << view <<
169 if (coord >= m_NumDimensions)
171 ARMNN_LOG(
error) <<
"OriginsDescriptor::SetViewOriginCoord: coord argument:" << coord <<
176 m_ViewOrigins[view][coord] = value;
188 return m_NumDimensions;
193 return m_ViewOrigins ? m_ViewOrigins[idx] :
nullptr;
200 ARMNN_ASSERT_MSG(m_NumViews == numNewOrdering,
"number of views must match number of " 201 "elements in the new ordering array");
202 std::vector<uint32_t*> viewOrigins(&m_ViewOrigins[0], &m_ViewOrigins[m_NumViews]);
204 for (
unsigned int i = 0; i < numNewOrdering; ++i)
206 m_ViewOrigins[i] = viewOrigins[newOrdering[i]];
212 , m_ViewSizes(nullptr)
216 : m_Origins(numViews, numDimensions)
217 , m_ViewSizes(numViews > 0 && numDimensions > 0 ?
218 new uint32_t *[numViews]() : nullptr)
230 : m_Origins(other.m_Origins)
239 memcpy(m_ViewSizes[i], other.m_ViewSizes[i],
GetNumDimensions() *
sizeof(uint32_t));
256 delete[] m_ViewSizes[i];
258 delete[] m_ViewSizes;
313 ARMNN_LOG(
error) <<
"ViewsDescriptor::SetViewSize: invalid view sizes";
319 ARMNN_LOG(
error) <<
"ViewsDescriptor::SetViewSize: view argument:" << view <<
325 ARMNN_LOG(
error) <<
"ViewsDescriptor::SetViewSize: coord argument:" << coord <<
330 m_ViewSizes[view][coord] = value;
336 return m_ViewSizes ? m_ViewSizes[idx] :
nullptr;
347 swap(first.m_NumViews, second.m_NumViews);
348 swap(first.m_NumDimensions, second.m_NumDimensions);
349 swap(first.m_ViewOrigins, second.m_ViewOrigins);
350 swap(first.m_ConcatAxis, second.m_ConcatAxis);
356 swap(first.m_Origins, second.m_Origins);
357 swap(first.m_ViewSizes, second.m_ViewSizes);
361 unsigned int axis)
const 363 int start = m_Begin[axis];
365 if (m_BeginMask & (1 << axis))
367 if (m_Stride[axis] > 0)
369 start = std::numeric_limits<int>::min();
373 start = std::numeric_limits<int>::max();
383 return std::max(0, std::min(start, axisSize - 1));
389 int startForAxis)
const 392 if (m_ShrinkAxisMask & (1 << axis))
394 return startForAxis + 1;
397 int stop = m_End[axis];
399 if (m_EndMask & (1 << axis))
401 if (m_Stride[axis] > 0)
403 stop = std::numeric_limits<int>::max();
407 stop = std::numeric_limits<int>::min();
417 return m_Stride[axis] > 0 ? std::max(0, std::min(stop, axisSize)) :
418 std::max(-1, std::min(stop, axisSize - 1));
friend void swap(OriginsDescriptor &first, OriginsDescriptor &second)
Swap the ViewsDescriptor values first and second.
A ViewsDescriptor for the SplitterLayer.
OriginsDescriptor & operator=(OriginsDescriptor rhs)
int GetStartForAxis(const TensorShape &inputShape, unsigned int axis) const
void swap(ViewsDescriptor &first, ViewsDescriptor &second)
uint32_t GetNumDimensions() const
Get the number of dimensions.
friend void swap(ViewsDescriptor &first, ViewsDescriptor &second)
Swap the ViewsDescriptor value first and second.
#define ARMNN_LOG(severity)
bool operator==(const ViewsDescriptor &rhs) const
uint32_t GetNumViews() const
Get the number of views.
Copyright (c) 2020 ARM Limited.
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.
Status SetViewSize(uint32_t view, uint32_t coord, uint32_t value)
Set the size of the views.
#define ARMNN_ASSERT_MSG(COND, MSG)
PermutationVector(const ValueType *dimMappings, SizeType numDimMappings)
An OriginsDescriptor for the ConcatLayer.
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
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.
ConstIterator begin() const
void SetConcatAxis(unsigned int concatAxis)
Set the concatenation axis value.
uint32_t GetNumDimensions() const
Get the number of dimensions.
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)
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.