10 #include <boost/assert.hpp> 11 #include <boost/numeric/conversion/cast.hpp> 21 void PadParams(StridedSliceDescriptor& p,
unsigned int dimCount)
23 BOOST_ASSERT_MSG(dimCount <= 4,
"Expected input with at most 4 dimensions");
25 const unsigned int beginIndicesCount =
28 BOOST_ASSERT(dimCount >= beginIndicesCount);
29 const unsigned int padCount = dimCount - beginIndicesCount;
31 p.m_Begin.resize(dimCount);
32 p.m_End.resize(dimCount);
33 p.m_Stride.resize(dimCount);
35 for (
unsigned int i = beginIndicesCount; i > 0; --i)
37 p.m_Stride[i + padCount - 1] = p.m_Stride[i - 1];
38 p.m_Begin[i + padCount - 1] = p.m_Begin[i - 1];
39 p.m_End[i + padCount - 1] = p.m_End[i - 1];
42 for (
unsigned int i = 0; i < padCount; ++i)
49 p.m_ShrinkAxisMask <<= padCount;
50 p.m_EllipsisMask <<= padCount;
51 p.m_NewAxisMask <<= padCount;
52 p.m_BeginMask <<= padCount;
53 p.m_EndMask <<= padCount;
54 p.m_BeginMask |= (1 << padCount) - 1;
55 p.m_EndMask |= (1 << padCount) - 1;
58 bool LoopCondition(
int index,
int stop,
int stride)
60 return stride > 0 ? index >= stop : index <= stop;
63 TensorShape ExtendShape(
const TensorShape& inputShape,
64 unsigned int newNumDimensions)
66 if (inputShape.GetNumDimensions() >= newNumDimensions)
71 std::vector<unsigned int> newSizes(newNumDimensions, 0);
73 unsigned int diff = newNumDimensions - inputShape.GetNumDimensions();
75 for (
unsigned int i = 0; i < diff; i++)
80 for (
unsigned int i = diff; i < newNumDimensions; i++)
82 newSizes[i] = inputShape[i - diff];
85 return TensorShape(newNumDimensions, newSizes.data());
92 const void* inputData,
94 unsigned int dataTypeSize)
96 const unsigned char* input =
reinterpret_cast<const unsigned char*
>(inputData);
97 unsigned char* output =
reinterpret_cast<unsigned char*
>(outputData);
104 PadParams(paddedParams, 4);
106 const int start0 = paddedParams.GetStartForAxis(inputShape, 0);
107 const int stop0 = paddedParams.GetStopForAxis (inputShape, 0, start0);
109 const int start1 = paddedParams.GetStartForAxis(inputShape, 1);
110 const int stop1 = paddedParams.GetStopForAxis (inputShape, 1, start1);
112 const int start2 = paddedParams.GetStartForAxis(inputShape, 2);
113 const int stop2 = paddedParams.GetStopForAxis (inputShape, 2, start2);
115 const int start3 = paddedParams.GetStartForAxis(inputShape, 3);
116 const int stop3 = paddedParams.GetStopForAxis (inputShape, 3, start3);
120 for (
int in0 = start0;
121 !LoopCondition(in0, stop0, paddedParams.m_Stride[0]);
122 in0 += paddedParams.m_Stride[0])
124 for (
int in1 = start1;
125 !LoopCondition(in1, stop1, paddedParams.m_Stride[1]);
126 in1 += paddedParams.m_Stride[1])
128 for (
int in2 = start2;
129 !LoopCondition(in2, stop2, paddedParams.m_Stride[2]);
130 in2 += paddedParams.m_Stride[2])
132 for (
int in3 = start3;
133 !LoopCondition(in3, stop3, paddedParams.m_Stride[3]);
134 in3 += paddedParams.m_Stride[3])
140 int inputOffset = (((in0 * dim1 + in1) * dim2 + in2) * dim3 + in3) * step;
141 ::memcpy(output, input + inputOffset, dataTypeSize);
const TensorShape & GetShape() const
Copyright (c) 2020 ARM Limited.
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
void StridedSlice(const TensorInfo &inputInfo, const StridedSliceDescriptor ¶ms, const void *inputData, void *outputData, unsigned int dataTypeSize)
A StridedSliceDescriptor for the StridedSliceLayer.