public static double Calculate(IEnumerable <double> startValues, IEnumerable <IEnumerable <double> > actualContinuations, IEnumerable <IEnumerable <double> > referenceContinuations, IEnumerable <IEnumerable <double> > predictedContinuations, out OnlineCalculatorError errorState)
        {
            IEnumerator <double> startValueEnumerator = startValues.GetEnumerator();
            IEnumerator <IEnumerable <double> > actualContinuationsEnumerator    = actualContinuations.GetEnumerator();
            IEnumerator <IEnumerable <double> > referenceContinuationsEnumerator = referenceContinuations.GetEnumerator();
            IEnumerator <IEnumerable <double> > predictedContinuationsEnumerator = predictedContinuations.GetEnumerator();

            OnlineTheilsUStatisticCalculator calculator = new OnlineTheilsUStatisticCalculator();

            // always move forward all enumerators (do not use short-circuit evaluation!)
            while (startValueEnumerator.MoveNext() & actualContinuationsEnumerator.MoveNext() & referenceContinuationsEnumerator.MoveNext() & predictedContinuationsEnumerator.MoveNext())
            {
                calculator.Add(startValueEnumerator.Current, actualContinuationsEnumerator.Current, referenceContinuationsEnumerator.Current, predictedContinuationsEnumerator.Current);
                if (calculator.ErrorState != OnlineCalculatorError.None)
                {
                    break;
                }
            }

            // check if all enumerators are at the end to make sure both enumerations have the same length
            if (calculator.ErrorState == OnlineCalculatorError.None &&
                (startValueEnumerator.MoveNext() || actualContinuationsEnumerator.MoveNext() || referenceContinuationsEnumerator.MoveNext() || predictedContinuationsEnumerator.MoveNext()))
            {
                throw new ArgumentException("Number of elements in startValues, actualContinuations, referenceContinuation and estimatedValues predictedContinuations doesn't match.");
            }
            else
            {
                errorState = calculator.ErrorState;
                return(calculator.TheilsUStatistic);
            }
        }
        public static double Calculate(double startValue, IEnumerable <double> actualContinuation, IEnumerable <double> referenceContinuation, IEnumerable <double> predictedContinuation, out OnlineCalculatorError errorState)
        {
            OnlineTheilsUStatisticCalculator calculator = new OnlineTheilsUStatisticCalculator();

            calculator.Add(startValue, actualContinuation, referenceContinuation, predictedContinuation);
            errorState = calculator.ErrorState;
            return(calculator.TheilsUStatistic);
        }
 public static double Calculate(double startValue, IEnumerable<double> actualContinuation, IEnumerable<double> referenceContinuation, IEnumerable<double> predictedContinuation, out OnlineCalculatorError errorState) {
   OnlineTheilsUStatisticCalculator calculator = new OnlineTheilsUStatisticCalculator();
   calculator.Add(startValue, actualContinuation, referenceContinuation, predictedContinuation);
   errorState = calculator.ErrorState;
   return calculator.TheilsUStatistic;
 }
    public static double Calculate(IEnumerable<double> startValues, IEnumerable<IEnumerable<double>> actualContinuations, IEnumerable<IEnumerable<double>> referenceContinuations, IEnumerable<IEnumerable<double>> predictedContinuations, out OnlineCalculatorError errorState) {
      IEnumerator<double> startValueEnumerator = startValues.GetEnumerator();
      IEnumerator<IEnumerable<double>> actualContinuationsEnumerator = actualContinuations.GetEnumerator();
      IEnumerator<IEnumerable<double>> referenceContinuationsEnumerator = referenceContinuations.GetEnumerator();
      IEnumerator<IEnumerable<double>> predictedContinuationsEnumerator = predictedContinuations.GetEnumerator();

      OnlineTheilsUStatisticCalculator calculator = new OnlineTheilsUStatisticCalculator();

      // always move forward all enumerators (do not use short-circuit evaluation!)
      while (startValueEnumerator.MoveNext() & actualContinuationsEnumerator.MoveNext() & referenceContinuationsEnumerator.MoveNext() & predictedContinuationsEnumerator.MoveNext()) {
        calculator.Add(startValueEnumerator.Current, actualContinuationsEnumerator.Current, referenceContinuationsEnumerator.Current, predictedContinuationsEnumerator.Current);
        if (calculator.ErrorState != OnlineCalculatorError.None) break;
      }

      // check if all enumerators are at the end to make sure both enumerations have the same length
      if (calculator.ErrorState == OnlineCalculatorError.None &&
          (startValueEnumerator.MoveNext() || actualContinuationsEnumerator.MoveNext() || referenceContinuationsEnumerator.MoveNext() || predictedContinuationsEnumerator.MoveNext())) {
        throw new ArgumentException("Number of elements in startValues, actualContinuations, referenceContinuation and estimatedValues predictedContinuations doesn't match.");
      } else {
        errorState = calculator.ErrorState;
        return calculator.TheilsUStatistic;
      }
    }