All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.arcadedb.query.sql.function.math.SQLFunctionVariance Maven / Gradle / Ivy

There is a newer version: 24.11.1
Show newest version
/*
 * Copyright © 2021-present Arcade Data Ltd ([email protected])
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * SPDX-FileCopyrightText: 2021-present Arcade Data Ltd ([email protected])
 * SPDX-License-Identifier: Apache-2.0
 */
package com.arcadedb.query.sql.function.math;

import com.arcadedb.database.Identifiable;
import com.arcadedb.query.sql.executor.CommandContext;
import com.arcadedb.query.sql.executor.MultiValue;
import com.arcadedb.query.sql.function.SQLFunctionAbstract;

/**
 * Compute the variance estimation for a given field.
 * 

* This class uses the Weldford's algorithm (presented in Donald Knuth's Art of Computer Programming) to avoid multiple distribution * values' passes. When executed in distributed mode it uses the Chan at al. pairwise variance algorithm to merge the results. *
*
* References *

* *
    * *
  • Cook, John D. Accurately computing running variance.
  • * *
  • Knuth, Donald E. (1998) The Art of Computer Programming, Volume 2: Seminumerical Algorithms, 3rd Edition.
  • * *
  • Welford, B. P. (1962) Note on a method for calculating corrected sums of squares and products. Technometrics
  • * *
  • Chan, Tony F.; Golub, Gene H.; LeVeque, Randall J. (1979), Parallel Algorithm.
  • * *
* * @author Fabrizio Fortino */ public class SQLFunctionVariance extends SQLFunctionAbstract { public static final String NAME = "variance"; private long n; private double mean; private double m2; public SQLFunctionVariance() { super(NAME); } protected SQLFunctionVariance(final String name) { super(name); } @Override public Object execute(final Object iThis, final Identifiable iCurrentRecord, final Object iCurrentResult, final Object[] iParams, final CommandContext iContext) { if (iParams[0] instanceof Number) { addValue((Number) iParams[0]); } else if (MultiValue.isMultiValue(iParams[0])) { for (final Object n : MultiValue.getMultiValueIterable(iParams[0])) { addValue((Number) n); } } return null; } @Override public boolean aggregateResults() { return true; } @Override public Object getResult() { return this.evaluate(); } @Override public String getSyntax() { return NAME + "()"; } private void addValue(final Number value) { if (value != null) { ++n; final double doubleValue = value.doubleValue(); final double nextM = mean + (doubleValue - mean) / n; m2 += (doubleValue - mean) * (doubleValue - nextM); mean = nextM; } } private Double evaluate() { return n > 1 ? m2 / n : null; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy