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;
      }
    }