1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022018 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  using System;


22  using System.Collections.Generic;


23  using System.Linq;


24  using HeuristicLab.Data;


25 


26  namespace HeuristicLab.Problems.TestFunctions.MultiObjective {


27  internal static class Utilities {


28  internal static double MinimumDistance(double[] point, IEnumerable<double[]> points) {


29  if (point == null) throw new ArgumentNullException("Point must not be null.");


30  if (points == null) throw new ArgumentNullException("Points must not be null.");


31  if (!points.Any()) throw new ArgumentException("Points must not be empty.");


32 


33  double minDistance = double.MaxValue;


34  foreach (double[] r in points) {


35  if (r.Length != point.Length) throw new ArgumentException("Dimensions of Points and Point do not match.");


36 


37  double squaredDistance = 0;


38  for (int i = 0; i < r.Length; i++) {


39  squaredDistance += (point[i]  r[i]) * (point[i]  r[i]);


40  }


41  minDistance = Math.Min(squaredDistance, minDistance);


42  }


43 


44  return Math.Sqrt(minDistance);


45  }


46 


47  internal static DoubleMatrix ToMatrix(IEnumerable<double[]> source) {


48  try {


49  int firstDimension = source.Count();


50  int secondDimension = source.GroupBy(row => row.Length).Single().Key; // throws InvalidOperationException if source is not rectangular


51 


52  var result = new DoubleMatrix(firstDimension, secondDimension);


53  var enumarator = source.GetEnumerator();


54  for (int i = 0; i < firstDimension && enumarator.MoveNext(); ++i)


55  for (int j = 0; j < secondDimension; ++j)


56  result[i, j] = enumarator.Current[j];


57  return result;


58  }


59  catch (InvalidOperationException) {


60  throw new InvalidOperationException("The given jagged array is not rectangular.");


61  }


62  }


63 


64  internal class DimensionComparer : IComparer<double[]> {


65  private readonly int dim;


66  private readonly int descending;


67 


68  public DimensionComparer(int dimension, bool descending) {


69  this.dim = dimension;


70  this.descending = descending ? 1 : 1;


71  }


72 


73  public int Compare(double[] x, double[] y) {


74  if (x[dim] < y[dim]) return descending;


75  else if (x[dim] > y[dim]) return descending;


76  else return 0;


77  }


78  }


79  }


80  }

