#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];
}
}
}
}