101 const std::vector<int>& axes,
110 U* out_ptr = out.
data<U>();
112 opc(x.
data<T>(), out_ptr, x.
size());
116 std::vector<int> shape;
117 std::vector<size_t> strides;
120 int reduction_size = plan.
shape[0];
121 const T* x_ptr = x.
data<T>();
122 U* out_ptr = out.
data<U>();
123 for (
int i = 0; i < out.
size(); i++, out_ptr++, x_ptr += reduction_size) {
125 opc(x_ptr, out_ptr, reduction_size);
131 int reduction_size = plan.
shape.back();
132 plan.
shape.pop_back();
134 const T* x_ptr = x.
data<T>();
135 U* out_ptr = out.
data<U>();
139 if (plan.
shape.size() == 0) {
140 for (
int i = 0; i < out.
size(); i++, out_ptr++) {
143 opc(x_ptr + offset, out_ptr, reduction_size);
146 for (
int i = 0; i < out.
size(); i++, out_ptr++) {
150 [&](
int extra_offset) {
151 opc(x_ptr + offset + extra_offset, out_ptr, reduction_size);
161 int reduction_size = plan.
shape.back();
162 size_t reduction_stride = plan.
strides.back();
163 plan.
shape.pop_back();
165 const T* x_ptr = x.
data<T>();
166 U* out_ptr = out.
data<U>();
167 for (
int i = 0; i < out.
size(); i += reduction_stride) {
168 std::fill_n(out_ptr, reduction_stride, init);
169 ops(x_ptr, out_ptr, reduction_size, reduction_stride);
170 x_ptr += reduction_stride * reduction_size;
171 out_ptr += reduction_stride;
178 int reduction_size = plan.
shape.back();
179 size_t reduction_stride = plan.
strides.back();
180 plan.
shape.pop_back();
182 const T* x_ptr = x.
data<T>();
183 U* out_ptr = out.
data<U>();
185 if (plan.
shape.size() == 0) {
186 for (
int i = 0; i < out.
size(); i += reduction_stride) {
188 std::fill_n(out_ptr, reduction_stride, init);
189 ops(x_ptr + offset, out_ptr, reduction_size, reduction_stride);
190 out_ptr += reduction_stride;
193 for (
int i = 0; i < out.
size(); i += reduction_stride) {
195 std::fill_n(out_ptr, reduction_stride, init);
197 [&](
int extra_offset) {
198 ops(x_ptr + offset + extra_offset,
205 out_ptr += reduction_stride;
212 const T* x_ptr = x.
data<T>();
213 U* out_ptr = out.
data<U>();
215 for (
int i = 0; i < out.
size(); i++, out_ptr++) {
219 [&](
int extra_offset) {
op(&val, *(x_ptr + offset + extra_offset)); },
array std(const array &a, bool keepdims, int ddof=0, StreamOrDevice s={})
Computes the standard deviation of the elements of an array.
void reduction_op(const array &x, array &out, const std::vector< int > &axes, U init, OpS ops, OpC opc, Op op)
Definition reduce.h:98