22 unsigned int carry = 1;
24 for (
unsigned int idx = numDims; idx-- > 0; )
26 unsigned int current_val = current[idx] + carry;
27 if (dims[idx] == current_val)
33 current[idx] = current_val;
43 std::vector<unsigned int>& index,
44 const unsigned int numAxis,
45 const std::vector<unsigned int>& axis)
47 unsigned int offset = 0;
48 for (
unsigned int idx = 0; idx < numDims; ++idx)
53 for (
unsigned int axisIdx = 0; axisIdx < numAxis; ++axisIdx)
55 if (idx == axis[axisIdx])
64 offset = offset * dims[idx] + index[idx];
75 const std::vector<uint32_t> axis,
83 std::vector<float> tempOut(numOutputs);
84 switch(reduceOperation)
88 std::fill(tempOut.begin(), tempOut.end(), 0.0);
91 std::fill(tempOut.begin(), tempOut.end(), -1 * std::numeric_limits<float>::max());
94 std::fill(tempOut.begin(), tempOut.end(), std::numeric_limits<float>::max());
98 std::to_string(static_cast<int>(reduceOperation)));
102 std::vector<unsigned int> tempIndex(inputNumDims, 0);
104 std::vector<unsigned int> resolvedAxis = axis;
105 if (resolvedAxis.empty())
107 for (
unsigned int idx = 0; idx < inputNumDims; ++idx)
109 resolvedAxis.push_back(idx);
115 for (
bool hasNext =
true; hasNext; hasNext =
NextIndex(inputNumDims, inputDims, tempIndex))
119 numResolvedAxis, resolvedAxis);
121 auto inputValue = input.
Get();
124 if (inputValue > tempOut[outputOffset])
126 tempOut[outputOffset] = inputValue;
131 if (inputValue < tempOut[outputOffset])
133 tempOut[outputOffset] = inputValue;
138 tempOut[outputOffset] += inputValue;
143 size_t numElementsInAxis = 1;
144 for (
unsigned int idx = 0; idx < numResolvedAxis; ++idx)
146 unsigned int current = inputDims[resolvedAxis[idx]];
148 (std::numeric_limits<float>::max() / armnn::numeric_cast<float>(numElementsInAxis)));
149 numElementsInAxis *= current;
152 for (
unsigned int idx = 0; idx < numOutputs; ++idx)
157 if (numElementsInAxis > 0)
159 output.
Set(tempOut[idx] / armnn::numeric_cast<float>(numElementsInAxis));
164 output.
Set(tempOut[idx]);
bool NextIndex(const unsigned int numDims, const armnn::TensorShape &dims, std::vector< unsigned int > ¤t)
const TensorShape & GetShape() const
unsigned int ReducedOutputOffset(const unsigned int numDims, const armnn::TensorShape &dims, std::vector< unsigned int > &index, const unsigned int numAxis, const std::vector< unsigned int > &axis)
void Reduce(const TensorInfo &inputInfo, const TensorInfo &outputInfo, Decoder< float > &input, Encoder< float > &output, const std::vector< uint32_t > axis, const ReduceOperation reduceOperation)
virtual void Set(IType right)=0
Copyright (c) 2021 ARM Limited and Contributors.
virtual IType Get() const =0
#define ARMNN_ASSERT(COND)
std::enable_if_t< std::is_unsigned< Source >::value &&std::is_unsigned< Dest >::value, Dest > numeric_cast(Source source)
unsigned int GetNumDimensions() const
unsigned int GetNumElements() const