#region License Information /* HeuristicLab * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System; using System.Collections.Generic; using System.Linq; namespace HeuristicLab.Algorithms.MemPR.Util { public static class Auxiliary { public static double[] PrepareProportional(IEnumerable weights, bool windowing, bool inverseProportional) { double maxValue = double.MinValue, minValue = double.MaxValue; double[] valueArray = weights.ToArray(); for (int i = 0; i < valueArray.Length; i++) { if (valueArray[i] > maxValue) maxValue = valueArray[i]; if (valueArray[i] < minValue) minValue = valueArray[i]; } if (minValue == maxValue) { // all values are equal for (int i = 0; i < valueArray.Length; i++) { valueArray[i] = 1.0; } } else { if (windowing) { if (inverseProportional) InverseProportionalScale(valueArray, maxValue); else ProportionalScale(valueArray, minValue); } else { if (minValue < 0.0) throw new InvalidOperationException("Proportional selection without windowing does not work with values < 0."); if (inverseProportional) InverseProportionalScale(valueArray, 2 * maxValue); } } return valueArray; } private static void ProportionalScale(double[] values, double minValue) { for (int i = 0; i < values.Length; i++) { values[i] = values[i] - minValue; } } private static void InverseProportionalScale(double[] values, double maxValue) { for (int i = 0; i < values.Length; i++) { values[i] = maxValue - values[i]; } } } }