public static double Calculate(IEnumerable <double> first, IEnumerable <double> second, out OnlineCalculatorError errorState) { IEnumerator <double> firstEnumerator = first.GetEnumerator(); IEnumerator <double> secondEnumerator = second.GetEnumerator(); OnlineCovarianceCalculator covarianceCalculator = new OnlineCovarianceCalculator(); // always move forward both enumerators (do not use short-circuit evaluation!) while (firstEnumerator.MoveNext() & secondEnumerator.MoveNext()) { double x = secondEnumerator.Current; double y = firstEnumerator.Current; covarianceCalculator.Add(x, y); if (covarianceCalculator.ErrorState != OnlineCalculatorError.None) { break; } } // check if both enumerators are at the end to make sure both enumerations have the same length if (covarianceCalculator.ErrorState == OnlineCalculatorError.None && (secondEnumerator.MoveNext() || firstEnumerator.MoveNext())) { throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); } else { errorState = covarianceCalculator.ErrorState; return(covarianceCalculator.Covariance); } }
public void Add(double x, double y) { // no need to check validity of values explicitly here as it is checked in all three evaluators covCalculator.Add(x, y); sxCalculator.Add(x); syCalculator.Add(y); }
/// <summary> /// Calculates linear scaling parameters in one pass. /// The formulas to calculate the scaling parameters were taken from Scaled Symblic Regression by Maarten Keijzer. /// http://www.springerlink.com/content/x035121165125175/ /// </summary> public void Add(double original, double target) { // validity of values is checked in mean calculator and covariance calculator targetMeanCalculator.Add(target); originalMeanAndVarianceCalculator.Add(original); originalTargetCovarianceCalculator.Add(original, target); }
public static double Calculate(IEnumerable<double> first, IEnumerable<double> second, out OnlineCalculatorError errorState) { IEnumerator<double> firstEnumerator = first.GetEnumerator(); IEnumerator<double> secondEnumerator = second.GetEnumerator(); OnlineCovarianceCalculator covarianceCalculator = new OnlineCovarianceCalculator(); // always move forward both enumerators (do not use short-circuit evaluation!) while (firstEnumerator.MoveNext() & secondEnumerator.MoveNext()) { double x = secondEnumerator.Current; double y = firstEnumerator.Current; covarianceCalculator.Add(x, y); if (covarianceCalculator.ErrorState != OnlineCalculatorError.None) break; } // check if both enumerators are at the end to make sure both enumerations have the same length if (covarianceCalculator.ErrorState == OnlineCalculatorError.None && (secondEnumerator.MoveNext() || firstEnumerator.MoveNext())) { throw new ArgumentException("Number of elements in first and second enumeration doesn't match."); } else { errorState = covarianceCalculator.ErrorState; return covarianceCalculator.Covariance; } }