111 if (data.size() <= 1) {
115 float sum_of_squared_differences = std::accumulate(
116 data.begin(), data.end(), 0.0f, [mean](
float accumulator,
float value) {
117 float difference = mean - value;
118 return accumulator + difference * difference;
121 return sum_of_squared_differences / data.size();
144 const AttrDomain domain = AttrDomain(node.custom2);
154 const std::optional<AttributeAccessor> attributes = component->attributes();
155 if (!attributes.has_value()) {
158 if (attributes->domain_supported(domain)) {
161 data_evaluator.
add(input_field);
162 data_evaluator.set_selection(selection_field);
163 data_evaluator.evaluate();
164 const VArray<float> component_data = data_evaluator.get_evaluated<
float>(0);
165 const IndexMask selection = data_evaluator.get_evaluated_selection_as_mask();
167 const int next_data_index = data.
size();
168 data.resize(next_data_index + selection.size());
181 float standard_deviation = 0.0f;
182 float variance = 0.0f;
183 const bool sort_required =
params.output_is_required(
"Min") ||
184 params.output_is_required(
"Max") ||
185 params.output_is_required(
"Range") ||
186 params.output_is_required(
"Median");
187 const bool sum_required =
params.output_is_required(
"Sum") ||
188 params.output_is_required(
"Mean");
189 const bool variance_required =
params.output_is_required(
"Standard Deviation") ||
190 params.output_is_required(
"Variance");
192 if (data.size() != 0) {
194 std::sort(data.begin(), data.end());
201 if (sum_required || variance_required) {
203 mean =
sum / data.size();
205 if (variance_required) {
207 standard_deviation = std::sqrt(variance);
214 params.set_output(
"Mean", mean);
218 params.set_output(
"Max", max);
219 params.set_output(
"Range", range);
220 params.set_output(
"Median", median);
222 if (variance_required) {
223 params.set_output(
"Standard Deviation", standard_deviation);
224 params.set_output(
"Variance", variance);
232 const std::optional<AttributeAccessor> attributes = component->attributes();
233 if (!attributes.has_value()) {
236 if (attributes->domain_supported(domain)) {
239 data_evaluator.
add(input_field);
240 data_evaluator.set_selection(selection_field);
241 data_evaluator.evaluate();
243 const IndexMask selection = data_evaluator.get_evaluated_selection_as_mask();
245 const int next_data_index = data.
size();
246 data.resize(data.size() + selection.size());
260 float3 standard_deviation{0};
261 const bool sort_required =
params.output_is_required(
"Min") ||
262 params.output_is_required(
"Max") ||
263 params.output_is_required(
"Range") ||
264 params.output_is_required(
"Median");
265 const bool sum_required =
params.output_is_required(
"Sum") ||
266 params.output_is_required(
"Mean");
267 const bool variance_required =
params.output_is_required(
"Standard Deviation") ||
268 params.output_is_required(
"Variance");
273 if (sort_required || variance_required) {
277 for (
const int i : data.index_range()) {
278 data_x[i] = data[i].x;
279 data_y[i] = data[i].y;
280 data_z[i] = data[i].z;
284 if (data.size() != 0) {
286 std::sort(data_x.
begin(), data_x.
end());
287 std::sort(data_y.
begin(), data_y.
end());
288 std::sort(data_z.
begin(), data_z.
end());
293 median =
float3(x_median, y_median, z_median);
299 if (sum_required || variance_required) {
301 mean =
sum / data.size();
303 if (variance_required) {
307 variance =
float3(x_variance, y_variance, z_variance);
308 standard_deviation =
float3(
309 std::sqrt(variance.x), std::sqrt(variance.y), std::sqrt(variance.z));
316 params.set_output(
"Mean", mean);
320 params.set_output(
"Max", max);
321 params.set_output(
"Range", range);
322 params.set_output(
"Median", median);
324 if (variance_required) {
325 params.set_output(
"Standard Deviation", standard_deviation);
326 params.set_output(
"Variance", variance);