18#ifndef ONERT_MICRO_PAL_REDUCE_COMMON_H
19#define ONERT_MICRO_PAL_REDUCE_COMMON_H
32inline bool resolveAxis(
const int num_dims,
const int *axis,
const int64_t num_axis,
int *out_axis,
42 for (int64_t idx = 0; idx < num_axis; ++idx)
47 int current = axis[idx] < 0 ? (axis[idx] + num_dims) : axis[idx];
48 if (current < 0 || current >= num_dims)
53 for (
int j = 0; j < *out_num_axis; ++j)
55 if (out_axis[j] == current)
63 if (*out_num_axis > 1)
67 out_axis[*out_num_axis] = current;
32inline bool resolveAxis(
const int num_dims,
const int *axis,
const int64_t num_axis,
int *out_axis, {
…}
77inline bool ReduceGeneric(
const T *input_data,
const int *input_dims,
const int input_num_dims,
78 T *output_data,
const int *axis,
const int64_t num_axis_dimensions,
79 T init_value,
const int output_flat_size, T reducer(
const T,
const T))
82 for (
int i = 0; i < input_num_dims; ++i)
84 if (input_dims[i] == 0)
88 for (
size_t idx = 0; idx < output_flat_size; ++idx)
90 output_data[idx] = init_value;
94 int num_resolved_axis = 0;
97 if (!
resolveAxis(input_num_dims, axis, num_axis_dimensions, resolved_axis, &num_resolved_axis))
104 for (
int idx = 0; idx < input_num_dims; ++idx)
111 size_t input_offset =
reducedOutputOffset(input_num_dims, input_dims, temp_index, 0,
nullptr);
112 size_t output_offset =
114 output_data[output_offset] = reducer(output_data[output_offset], input_data[input_offset]);
115 }
while (
nextIndex(input_num_dims, input_dims, temp_index));
77inline bool ReduceGeneric(
const T *input_data,
const int *input_dims,
const int input_num_dims, {
…}
122inline bool reduceSumImpl(
const T *input_data,
const int *input_dims,
const int input_num_dims,
123 T *output_data,
const int *axis,
const int num_axis,
124 const int num_outputs)
126 return ReduceGeneric<T>(input_data, input_dims, input_num_dims, output_data, axis, num_axis,
127 static_cast<T
>(0), num_outputs,
128 [](
const T current,
const T in) -> T {
return in + current; });
122inline bool reduceSumImpl(
const T *input_data,
const int *input_dims,
const int input_num_dims, {
…}
132inline bool Mean(
const int *input_dims,
const T *input_data,
const int input_num_dims,
133 T *output_data,
const int num_outputs,
const int *axis,
134 const int num_axis_dimensions)
136 if (!reduceSumImpl<T>(input_data, input_dims, input_num_dims, output_data, axis,
137 num_axis_dimensions, num_outputs))
143 int num_resolved_axis = 0;
144 int resolved_axis[2];
146 if (!
resolveAxis(input_num_dims, axis, num_axis_dimensions, resolved_axis, &num_resolved_axis))
152 size_t num_elements_in_axis = 1;
153 for (
int idx = 0; idx < num_resolved_axis; ++idx)
155 size_t current =
static_cast<size_t>(input_dims[resolved_axis[idx]]);
157 if (current > (std::numeric_limits<size_t>::max() / num_elements_in_axis))
161 num_elements_in_axis *= current;
164 if (num_elements_in_axis > 0)
166 for (
size_t idx = 0; idx < num_outputs; ++idx)
168 output_data[idx] =
static_cast<T
>(output_data[idx] /
static_cast<T
>(num_elements_in_axis));
132inline bool Mean(
const int *input_dims,
const T *input_data,
const int input_num_dims, {
…}
bool resolveAxis(const int num_dims, const int *axis, const int64_t num_axis, int *out_axis, int *out_num_axis)
bool nextIndex(const int32_t num_dims, const int32_t *dims, int32_t *current)
bool Mean(const int *input_dims, const T *input_data, const int input_num_dims, T *output_data, const int num_outputs, const int *axis, const int num_axis_dimensions)
bool ReduceGeneric(const T *input_data, const int *input_dims, const int input_num_dims, T *output_data, const int *axis, const int64_t num_axis_dimensions, T init_value, const int output_flat_size, T reducer(const T, const T))
size_t reducedOutputOffset(const int32_t num_dims, const int32_t *dims, const int32_t *index, const int32_t num_axis, const int32_t *axis)
bool reduceSumImpl(const T *input_data, const int *input_dims, const int input_num_dims, T *output_data, const int *axis, const int num_axis, const int num_outputs)