1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022011 Heuristic and Evolutionary Algorithms Laboratory (HEAL)


4  *


5  * This file is part of HeuristicLab.


6  *


7  * HeuristicLab is free software: you can redistribute it and/or modify


8  * it under the terms of the GNU General Public License as published by


9  * the Free Software Foundation, either version 3 of the License, or


10  * (at your option) any later version.


11  *


12  * HeuristicLab is distributed in the hope that it will be useful,


13  * but WITHOUT ANY WARRANTY; without even the implied warranty of


14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the


15  * GNU General Public License for more details.


16  *


17  * You should have received a copy of the GNU General Public License


18  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.


19  */


20  #endregion


21 


22  using System;


23  using System.Collections.Generic;


24 


25  namespace HeuristicLab.Problems.DataAnalysis {


26  public class OnlineCovarianceEvaluator : IOnlineEvaluator {


27 


28  private double originalMean, estimatedMean, Cn;


29  private int n;


30  public double Covariance {


31  get {


32  if (n < 1)


33  throw new InvalidOperationException("No elements");


34  else


35  return Cn / n;


36  }


37  }


38 


39  public OnlineCovarianceEvaluator() {


40  Reset();


41  }


42 


43  #region IOnlineEvaluator Members


44  public double Value {


45  get { return Covariance; }


46  }


47  public void Reset() {


48  n = 0;


49  Cn = 0.0;


50  originalMean = 0.0;


51  estimatedMean = 0.0;


52  }


53 


54  public void Add(double original, double estimated) {


55  if (double.IsNaN(estimated)  double.IsInfinity(estimated) 


56  double.IsNaN(original)  double.IsInfinity(original)) {


57  throw new ArgumentException("Covariance is not defined for series containing NaN or infinity elements");


58  } else {


59  n++;


60  // online calculation of tMean


61  originalMean = originalMean + (original  originalMean) / n;


62  double delta = estimated  estimatedMean; // delta = (y  yMean(n1))


63  estimatedMean = estimatedMean + delta / n;


64 


65  // online calculation of covariance


66  Cn = Cn + delta * (original  originalMean); // C(n) = C(n1) + (y  yMean(n1)) (t  tMean(n))


67  }


68  }


69  #endregion


70 


71  public static double Calculate(IEnumerable<double> first, IEnumerable<double> second) {


72  IEnumerator<double> firstEnumerator = first.GetEnumerator();


73  IEnumerator<double> secondEnumerator = second.GetEnumerator();


74  OnlineCovarianceEvaluator covarianceEvaluator = new OnlineCovarianceEvaluator();


75 


76  while (firstEnumerator.MoveNext() && secondEnumerator.MoveNext()) {


77  double estimated = secondEnumerator.Current;


78  double original = firstEnumerator.Current;


79  covarianceEvaluator.Add(original, estimated);


80  }


81 


82  if (secondEnumerator.MoveNext()  firstEnumerator.MoveNext()) {


83  throw new ArgumentException("Number of elements in first and second enumeration doesn't match.");


84  } else {


85  return covarianceEvaluator.Covariance;


86  }


87  }


88  }


89  }

