using System.Collections.Generic; using System.Globalization; using System.Linq; using HeuristicLab.Optimization; namespace HeuristicLab.Analysis { public static class ExpectedRuntimeHelper { public static ErtCalculationResult CalculateErt(List runs, string indexedDataTableName, double target, bool maximization) { var successful = new List(); var unsuccessful = new List(); foreach (var r in runs) { var targetAchieved = false; var row = ((IndexedDataTable)r.Results[indexedDataTableName]).Rows.First(); foreach (var v in row.Values) { if (maximization && v.Item2 >= target || !maximization && v.Item2 <= target) { successful.Add(v.Item1); targetAchieved = true; break; } } if (!targetAchieved) unsuccessful.Add(row.Values.Last().Item1); } var ert = double.NaN; if (successful.Count > 0) { if (unsuccessful.Count == 0) ert = successful.Average(); else { var ps = successful.Count / (double)(successful.Count + unsuccessful.Count); ert = successful.Average() + ((1.0 - ps) / ps) * unsuccessful.Average(); } } return new ErtCalculationResult(successful.Count, (successful.Count + unsuccessful.Count), ert); } } public struct ErtCalculationResult { public int SuccessfulRuns; public int TotalRuns; public double ExpectedRuntime; public ErtCalculationResult(int successful, int total, double ert) { SuccessfulRuns = successful; TotalRuns = total; ExpectedRuntime = ert; } public override string ToString() { return SuccessfulRuns == 0 ? "\u221e" : ExpectedRuntime.ToString("##,0.0", CultureInfo.CurrentCulture.NumberFormat); } } }