1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022013 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.Collections.Generic;


23  using System.Linq;


24 


25  namespace HeuristicLab.Analysis.AlgorithmBehavior.Analyzers {


26  public static class ConvexHullMeasures {


27  //Calculates the volumne of a dsimplex


28  private static double CalculateSimplexVolume(List<double[]> hyperHull) {


29  double[,] diffs = new double[hyperHull.Count, hyperHull.Count];


30 


31  for (int i = 0; i < hyperHull.Count; i++) {


32  for (int j = 0; j < hyperHull.Count; j++) {


33  diffs[i, j] = CalculateVectorDiff(hyperHull[i], hyperHull[j]);


34  }


35  }


36 


37  double det = alglib.rmatrixdet(diffs);


38  double result = det / hyperHull[0].Count().Fact();


39 


40  return result;


41  }


42 


43  private static double CalculateVectorDiff(double[] vector1, double[] vector2) {


44  double result = 0.0;


45 


46  for (int i = 0; i < vector1.Length; i++) {


47  result += vector1[i]  vector2[i];


48  }


49 


50  return result;


51  }


52 


53  //calculate inner point for boundary triangulation (slowwwww.....)


54  private static double[] CalculateInnerPoint(List<double[]> hyperHull) {


55  double[] result = new double[hyperHull[0].Count()];


56 


57  for (int i = 0; i < hyperHull[0].Count(); i++) {


58  result[i] = hyperHull.Max(x => x[i])  hyperHull.Min(x => x[i]);


59  }


60 


61  return result;


62  }


63 


64  //calculates the volume of a convex dpolytope


65  //decomposition based on boundary triangulation


66  public static double CalculateVolume(List<double[]> hyperHull) {


67  double[] innerPoint = CalculateInnerPoint(hyperHull);


68  double volume = 0.0;


69 


70  for (int i = 0; i < hyperHull.Count  1; i += 2) {


71  List<double[]> simplex = new List<double[]>();


72  simplex.Add(innerPoint);


73  simplex.Add(hyperHull[i]);


74  simplex.Add(hyperHull[i + 1]);


75  volume += CalculateSimplexVolume(simplex);


76  }


77  return volume;


78  }


79  }


80  }

