Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/24/16 10:03:52 (8 years ago)
Author:
abeham
Message:

#2457: worked on performance modeling

Location:
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3
Files:
5 added
3 edited
4 moved

Legend:

Unmodified
Added
Removed
  • branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Enums.cs

    r13757 r13787  
    2626    SeedByCloning
    2727  }
    28 
    29   public enum ProblemInstanceProximityType {
    30     FeatureSpace,
    31     PCA,
    32     MDS,
    33     SOM
    34   }
    3528}
  • branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/HeuristicLab.OptimizationExpertSystem.Common-3.3.csproj

    r13774 r13787  
    158158  </ItemGroup>
    159159  <ItemGroup>
    160     <Compile Include="OverallBestRecommender.cs" />
    161     <Compile Include="DistanceWeightedRecommender.cs" />
    162     <Compile Include="IAlgorithmInstanceRecommender.cs" />
    163     <Compile Include="KNearestNeighborRecommender.cs" />
     160    <Compile Include="Interfaces\IRecommendationModel.cs" />
     161    <Compile Include="Recommenders\KNearestNeighborModel.cs" />
     162    <Compile Include="Recommenders\OverallBestRecommender.cs" />
     163    <Compile Include="Recommenders\DistanceWeightedRecommender.cs" />
     164    <Compile Include="Interfaces\IAlgorithmInstanceRecommender.cs" />
     165    <Compile Include="Recommenders\KNearestNeighborRecommender.cs" />
    164166    <Compile Include="KnowledgeCenter.cs" />
    165167    <Compile Include="Plugin.cs" />
    166168    <Compile Include="Enums.cs" />
     169    <Compile Include="Recommenders\FixedRankModel.cs" />
    167170    <None Include="Properties\AssemblyInfo.cs.frame" />
    168171    <Compile Include="ProblemCharacteristicAnalysis\CharacteristicCalculator.cs" />
  • branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Interfaces/IAlgorithmInstanceRecommender.cs

    r13786 r13787  
    2020#endregion
    2121
    22 using HeuristicLab.Common;
    23 using HeuristicLab.Optimization;
    24 using System.Collections.Generic;
     22using HeuristicLab.Core;
    2523
    2624namespace HeuristicLab.OptimizationExpertSystem.Common {
    27   public interface IAlgorithmInstanceRecommender : IContent {
    28     IEnumerable<IAlgorithm> GetRanking();
     25  public interface IAlgorithmInstanceRecommender : IParameterizedItem {
     26    IRecommendationModel TrainModel(KnowledgeCenter kc, string[] characteristics);
    2927  }
    3028}
  • branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/KnowledgeCenter.cs

    r13774 r13787  
    9696    }
    9797
    98     private readonly CheckedItemList<StringValue> problemCharacteristics;
    99     private readonly ReadOnlyCheckedItemList<StringValue> readonlyProblemCharacteristics;
    100     public ReadOnlyCheckedItemList<StringValue> ProblemCharacteristics {
    101       get { return readonlyProblemCharacteristics; }
    102     }
    103 
    104     private IAlgorithmInstanceRecommender algorithmInstanceRecommender;
    105     public IAlgorithmInstanceRecommender AlgorithmInstanceRecommender {
    106       get { return algorithmInstanceRecommender; }
    107       set { algorithmInstanceRecommender = value; }
     98    private IRecommendationModel recommendationModel;
     99    public IRecommendationModel RecommendationModel {
     100      get { return recommendationModel; }
     101      set {
     102        if (recommendationModel == value) return;
     103        recommendationModel = value;
     104        OnRecommenderModelChanged();
     105      }
    108106    }
    109107
     
    135133      readonlyAlgorithmInstances = algorithmInstances.AsReadOnly();
    136134      problemInstances = new RunCollection();
    137       problemCharacteristics = new CheckedItemList<StringValue>();
    138       readonlyProblemCharacteristics = problemCharacteristics.AsReadOnly();
    139       algorithmInstanceRecommender = new OverallBestRecommender(this);
     135      recommendationModel = FixedRankModel.GetEmpty();
    140136      problem = new SingleObjectiveOKBProblem();
    141137      algorithmId2RunMapping = new BidirectionalLookup<long, IRun>();
     
    167163      knowledgeBase.ItemsAdded += InformationChanged;
    168164      knowledgeBase.ItemsRemoved += InformationChanged;
    169       problemCharacteristics.ItemsAdded += CharacteristicChanged;
    170       problemCharacteristics.ItemsReplaced += CharacteristicChanged;
    171       problemCharacteristics.ItemsRemoved += CharacteristicChanged;
    172       problemCharacteristics.CollectionReset += CharacteristicChanged;
    173       problemCharacteristics.CheckedItemsChanged += CharacteristicChanged;
    174165    }
    175166
    176167    private void MaximumEvaluationsOnValueChanged(object sender, EventArgs eventArgs) {
    177       UpdateSuggestions();
     168
    178169    }
    179170
    180171    private void MinimumTargetOnValueChanged(object sender, EventArgs e) {
    181       UpdateSuggestions();
     172
    182173    }
    183174
     
    192183      var runCollection = sender as RunCollection;
    193184      if (runCollection != null && runCollection.UpdateOfRunsInProgress) return;
    194       UpdateSuggestions();
    195     }
    196 
    197     private void CharacteristicChanged(object sender, EventArgs e) {
    198       if (SuppressEvents) return;
    199       UpdateInstanceProjection();
    200185    }
    201186   
     
    205190    }
    206191
    207     public void UpdateInstanceProjection() {
    208       if (ProblemCharacteristics.Count == 0) return;
    209 
    210       var instances = GetProblemCharacteristics();
     192    public void UpdateInstanceProjection(string[] characteristics) {
     193      if (characteristics.Length == 0) return;
     194
     195      var instances = GetProblemCharacteristics(characteristics);
    211196
    212197      var key2Idx = new BidirectionalDictionary<IRun, int>();
     
    227212      #endregion
    228213      #region PCA
    229       var ds = new double[instances.Count, ProblemCharacteristics.CheckedItems.Count()];
     214      var ds = new double[instances.Count, characteristics.Length];
    230215      foreach (var instance in instances) {
    231216        var arr = instance.Value;
     
    240225      #endregion
    241226      #region SOM
    242       var features = new DoubleMatrix(ProblemCharacteristics.CheckedItems.Count(), instances.Count);
     227      var features = new DoubleMatrix(characteristics.Length, instances.Count);
    243228      foreach (var instance in instances) {
    244229        var arr = instance.Value;
     
    283268    }
    284269
    285     private Dictionary<IRun, double[]> GetProblemCharacteristics() {
     270    public Dictionary<IRun, double[]> GetProblemCharacteristics(string[] characteristics) {
    286271      var instances = new Dictionary<IRun, double[]>();
    287       var values = new List<double>[ProblemCharacteristics.CheckedItems.Count()];
     272      var values = new List<double>[characteristics.Length];
    288273      foreach (var run in ProblemInstances) {
    289274        var f = 0;
    290         instances[run] = new double[ProblemCharacteristics.CheckedItems.Count()];
    291         foreach (var c in ProblemCharacteristics.CheckedItems.Select(x => x.Value.Value)) {
     275        instances[run] = new double[characteristics.Length];
     276        foreach (var c in characteristics) {
    292277          if (values[f] == null) values[f] = new List<double>(ProblemInstances.Count);
    293278          IItem item;
     
    514499            if (alg != null) {
    515500              lock (algorithmId2AlgorithmInstanceMapping) {
     501                algorithmInstances.Add(alg);
    516502                algorithmId2AlgorithmInstanceMapping.Add(algInst.Id, alg);
    517503                progress.Status = string.Format("Downloaded algorithm {0} (okb-id: {1})...", algInst.Name, algInst.Id);
     
    549535
    550536        progress.Status = "Finishing...";
    551         var algInstRunDict = runList.Where(x => x.Parameters.ContainsKey("Problem Name") && x.Parameters["Problem Name"] is StringValue)
    552                                           .GroupBy(x => ((StringValue)x.Parameters["Problem Name"]).Value)
    553                                           .ToDictionary(x => x.Key, x => x.GroupBy(y => ((StringValue)y.Parameters["Algorithm Name"]).Value)
    554                                                                                   .ToDictionary(y => y.Key, y => y.ToList()));
    555 
    556         foreach (var instance in ProblemInstances) {
    557           IItem probNameParam;
    558           if (!instance.Parameters.TryGetValue("Problem Name", out probNameParam)) continue;
    559 
    560           var probInstanceName = ((StringValue)probNameParam).Value;
    561           var maximization = ((BoolValue)instance.Parameters["Maximization"]).Value;
    562          
    563           IItem bkParam;
    564           if (!instance.Parameters.TryGetValue("BestKnownQuality", out bkParam) || !(bkParam is DoubleValue)) {
    565             Dictionary<string, List<IRun>> algRuns;
    566             if (!algInstRunDict.TryGetValue(probInstanceName, out algRuns)) continue;
    567             var list = algRuns.SelectMany(x => x.Value)
    568                               .Where(x => x.Results.ContainsKey("QualityPerEvaluations"))
    569                               .Select(x => ((IndexedDataTable<double>)x.Results["QualityPerEvaluations"]).Rows.First().Values.Last().Item2);
    570             bkParam = new DoubleValue(maximization ? list.Max() : list.Min());
    571             instance.Parameters["BestKnownQuality"] = bkParam;
    572           } else bkParam = instance.Parameters["BestKnownQuality"];
    573 
    574           var bkQuality = ((DoubleValue)bkParam).Value;
    575 
    576           if (!algInstRunDict.ContainsKey(probInstanceName)) continue;
    577           // TODO: Things needs to be configurable here (table name, targets)
    578           foreach (var target in new[] { 1, 1.01, 1.05, 1.1, 1.2, 1.5 }) {
    579             var indexMap = new BidirectionalDictionary<string, int>();
    580             var dict = new Dictionary<string, double>();
    581             var idx = 0;
    582             foreach (var kvp in algInstRunDict[probInstanceName]) {
    583               var result = ExpectedRuntimeHelper.CalculateErt(kvp.Value, "QualityPerEvaluations", bkQuality * target, maximization);
    584               indexMap.Add(kvp.Key, idx);
    585               dict[kvp.Key] = !double.IsNaN(result.ExpectedRuntime) ? result.ExpectedRuntime : int.MaxValue;
    586               idx++;
    587             }
    588             var points = dict.OrderBy(x => indexMap.GetByFirst(x.Key)).Select(x => x.Value > 0 ? Math.Log10(x.Value) : 0).ToArray();
    589             int[] clusters;
    590             Ckmeans1dClusters(points, 5, out clusters);
    591             var ranks = clusters.Select((c, i) => new { Cluster = c, Perf = dict[indexMap.GetBySecond(i)] })
    592                                 .GroupBy(x => x.Cluster, x => x.Perf)
    593                                 .Select(x => new { Cluster = x.Key, AvgPerf = x.Average() })
    594                                 .OrderBy(x => x.AvgPerf)
    595                                 .Select((c, i) => new { Cluster = c.Cluster, Rank = i })
    596                                 .ToDictionary(x => x.Cluster, x => x.Rank);
    597             for (var i = 0; i < clusters.Length; i++) {
    598               var resultName = "Rank." + indexMap.GetBySecond(i) + "@" + ((target - 1) * 100) + "%";
    599               instance.Results[resultName] = new IntValue(dict[indexMap.GetBySecond(i)] < int.MaxValue ? ranks[clusters[i]] : 6);
    600             }
    601           }
    602         }
    603         try {
    604           SuppressEvents = true;
    605           problemCharacteristics.Replace(characteristics.Select(x => new StringValue(x)));
    606           foreach (var pc in problemCharacteristics.Where(x => !x.Value.StartsWith("Characteristic.")))
    607             problemCharacteristics.SetItemCheckedState(pc, false);
    608         } finally { SuppressEvents = false; }
     537       
    609538        try {
    610539          KnowledgeBase.UpdateOfRunsInProgress = true;
     
    612541          KnowledgeBase.AddRange(runList);
    613542        } finally { KnowledgeBase.UpdateOfRunsInProgress = false; }
     543
     544        var algInstRunDict = runList.Where(x => x.Parameters.ContainsKey("Problem Name") && x.Parameters["Problem Name"] is StringValue)
     545                                          .GroupBy(x => ((StringValue)x.Parameters["Problem Name"]).Value)
     546                                          .ToDictionary(x => x.Key, x => x.GroupBy(y => ((StringValue)y.Parameters["Algorithm Name"]).Value)
     547                                                                                  .ToDictionary(y => y.Key, y => y.ToList()));
     548
     549        // set best-known quality to best-found in case it is not known
     550        foreach (var kvp in algInstRunDict) {
     551          var prob = ProblemInstances.SingleOrDefault(x => ((StringValue)x.Parameters["Problem Name"]).Value == kvp.Key);
     552          if (prob == null) continue;
     553          var maximization = ((BoolValue)prob.Parameters["Maximization"]).Value;
     554
     555          IItem bkParam;
     556          if (!prob.Parameters.TryGetValue("BestKnownQuality", out bkParam) || !(bkParam is DoubleValue)) {
     557            var list = kvp.Value.SelectMany(x => x.Value)
     558              .Where(x => x.Results.ContainsKey("QualityPerEvaluations"))
     559              .Select(x => ((IndexedDataTable<double>)x.Results["QualityPerEvaluations"]).Rows.First().Values.Last().Item2);
     560            if (!list.Any()) continue;
     561            bkParam = new DoubleValue(maximization ? list.Max() : list.Min());
     562            prob.Parameters["BestKnownQuality"] = bkParam;
     563          }
     564        }
     565
     566        // add algorithm instance ranks as features to the problem instances for a range of targets
     567        foreach (var target in new[] {1, 1.01, 1.05, 1.1, 1.2, 1.5}) {
     568          var cls = GetPerformanceClasses(target, 5);
     569          foreach (var kvp in cls) {
     570            var prob = kvp.Key;
     571            foreach (var kvp2 in kvp.Value) {
     572              var resultName = "Rank." + algorithmId2AlgorithmInstanceMapping.GetByFirst(kvp2.Key) + "@" + ((target - 1) * 100) + "%";
     573              prob.Results[resultName] = new IntValue(kvp2.Value);
     574            }
     575          }
     576        }
    614577      } finally { progress.Finish(); ProblemInstances.UpdateOfRunsInProgress = false; }
    615       UpdateInstanceProjection();
    616       UpdateSuggestions();
    617     }
    618 
    619     public void UpdateSuggestions() {
    620       // TODO: Maintain a separate list of suggested instances
    621       // TODO: expose expected expected run time
    622       algorithmInstances.Replace(AlgorithmInstanceRecommender.GetRanking());
     578      UpdateInstanceProjection(ProblemInstances.ResultNames.Where(x => x.StartsWith("Characteristic.")).ToArray());
    623579    }
    624580
    625581    public Dictionary<IAlgorithm, double> GetAlgorithmPerformance(IRun problemInstance) {
    626582      if (!problemInstance.Parameters.ContainsKey("BestKnownQuality")) return new Dictionary<IAlgorithm, double>();
    627       var target = GetTarget(((DoubleValue)problemInstance.Parameters["BestKnownQuality"]).Value);
     583      var target = GetTarget(((DoubleValue)problemInstance.Parameters["BestKnownQuality"]).Value, Maximization);
    628584      return knowledgeBase.Where(x => ((StringValue)x.Parameters["Problem Name"]).Value == ((StringValue)problemInstance.Parameters["Problem Name"]).Value)
    629585                          .GroupBy(x => algorithmId2AlgorithmInstanceMapping.GetByFirst(algorithmId2RunMapping.GetBySecond(x).Single()))
     
    636592    }
    637593
    638     public IEnumerable<IRegressionProblem> GetDataAnalysisProblem(double target) {
     594    public IEnumerable<IRegressionProblem> GetRegressionProblemPerAlgorithmInstance(double target, string[] characteristics) {
    639595      if (Problem == null) yield break;
    640       var characteristics = GetProblemCharacteristics();
     596      var features = GetProblemCharacteristics(characteristics);
    641597      // TODO: knowledgebase only stores problem name as a string
    642598      // this doesn't work if there are two equally named problem instances
     
    647603        var ds = new ModifiableDataset();
    648604        ds.AddVariable("Problem Name", new List<string>());
    649         foreach (var pc in ProblemCharacteristics.CheckedItems)
    650           ds.AddVariable(pc.Value.Value, new List<double>());
     605        foreach (var pc in characteristics)
     606          ds.AddVariable(pc, new List<double>());
    651607        ds.AddVariable("ERT", new List<double>());
    652         var max = Maximization;
    653608        foreach (var pr in problemRuns) {
    654609          var prob = problemMap[pr.Key];
    655           var features = characteristics[prob];
     610          var f = features[prob];
     611          var max = ((BoolValue)prob.Parameters["Maximization"]).Value;
    656612          var bkq = ((DoubleValue)prob.Parameters["BestKnownQuality"]).Value;
    657           var ert = ExpectedRuntimeHelper.CalculateErt(pr.ToList(), "QualityPerEvaluations", GetTarget(bkq), max).ExpectedRuntime;
     613          var ert = ExpectedRuntimeHelper.CalculateErt(pr.ToList(), "QualityPerEvaluations", GetTarget(bkq, max), max).ExpectedRuntime;
    658614          if (double.IsNaN(ert)) ert = int.MaxValue;
    659           ds.AddRow(new object[] { pr.Key }.Concat(features.Cast<object>()).Concat(new object[] { ert }));
    660         }
    661         var datAnalysisData = new RegressionProblemData(ds, ProblemCharacteristics.CheckedItems.Select(x => x.Value.Value), "ERT");
     615          ds.AddRow(new object[] { pr.Key }.Concat(f.Cast<object>()).Concat(new object[] { ert }));
     616        }
     617        var datAnalysisData = new RegressionProblemData(ds, characteristics, "ERT");
    662618        var result = new RegressionProblem() {
    663619          Name = algorithmId2AlgorithmInstanceMapping.GetByFirst(relevantRuns.Key).Name
     
    668624    }
    669625
    670     private double GetTarget(double bestKnownQuality) {
    671       return bestKnownQuality * (Maximization ? (1 - MinimumTarget.Value) : (1 + MinimumTarget.Value));
    672     }
    673 
    674     public Dictionary<IRun, double> GetProblemDistances(ProblemInstanceProximityType proximityType) {
    675       var result = new Dictionary<IRun, double>();
     626    public IEnumerable<IClassificationProblem> GetClassificationProblemPerAlgorithmInstance(double target, string[] characteristics) {
     627      if (Problem == null) yield break;
     628
     629      var classes = GetPerformanceClasses(target, 5);
     630      var features = GetProblemCharacteristics(characteristics);
     631
     632      foreach (var alg in AlgorithmInstances) {
     633        var ds = new ModifiableDataset();
     634        ds.AddVariable("Problem Name", new List<string>());
     635        foreach (var pc in characteristics)
     636          ds.AddVariable(pc, new List<double>());
     637        ds.AddVariable("Class", new List<double>());
     638
     639        foreach (var c in classes) {
     640          int cls;
     641          if (c.Value.TryGetValue(algorithmId2AlgorithmInstanceMapping.GetBySecond(alg), out cls)) {
     642            ds.AddRow(new object[] { ((StringValue)c.Key.Parameters["Problem Name"]).Value }
     643              .Concat(features[c.Key].Cast<object>()).Concat(new object[] { cls }));
     644          }
     645        }
     646        var datAnalysisData = new ClassificationProblemData(ds, characteristics, "Class");
     647        var result = new ClassificationProblem() {
     648          Name = alg.Name
     649        };
     650        result.ProblemDataParameter.Value = datAnalysisData;
     651        yield return result;
     652      }
     653    }
     654
     655    public Dictionary<IRun, double> GetProblemDistances(string[] characteristics) {
     656      var result = new Dictionary<IRun, double>();
    676657      var currentInstance = problemId2ProblemInstanceMapping.GetByFirst(Problem.ProblemId);
    677       switch (proximityType) {
    678         case ProblemInstanceProximityType.MDS:
    679         case ProblemInstanceProximityType.PCA:
    680         case ProblemInstanceProximityType.SOM:
    681           double xa, ya;
    682           GetProjectionCoordinates(currentInstance, proximityType, out xa, out ya);
    683           foreach (var b in ProblemInstances) {
    684             if (b == currentInstance) continue;
    685             double xb, yb;
    686             GetProjectionCoordinates(b, proximityType, out xb, out yb);
    687             var d = Math.Sqrt((xa - xb) * (xa - xb) + (ya - yb) * (ya - yb));
    688             result[b] = d;
    689           }
    690           break;
    691         case ProblemInstanceProximityType.FeatureSpace:
    692           var features = GetProblemCharacteristics();
    693           var cF = features[currentInstance];
    694           foreach (var b in ProblemInstances) {
    695             if (b == currentInstance) continue;
    696             var sum = features[b].Select((t, f) => (cF[f] - t) * (cF[f] - t)).Sum();
    697             result[b] = Math.Sqrt(sum);
    698           }
    699           break;
    700         default: throw new InvalidOperationException(string.Format("Unkonwn proximity type {0}", proximityType));
     658      var features = GetProblemCharacteristics(characteristics);
     659      var cF = features[currentInstance];
     660      foreach (var b in ProblemInstances) {
     661        if (b == currentInstance) continue;
     662        var sum = features[b].Select((t, f) => (cF[f] - t) * (cF[f] - t)).Sum();
     663        result[b] = Math.Sqrt(sum);
    701664      }
    702665      return result;
    703666    }
    704667
    705     private void GetProjectionCoordinates(IRun problemInstance, ProblemInstanceProximityType proximityType, out double x, out double y) {
    706       x = ((DoubleValue)problemInstance.Results["Projection." + proximityType + ".X"]).Value;
    707       y = ((DoubleValue)problemInstance.Results["Projection." + proximityType + ".Y"]).Value;
    708       if (proximityType == ProblemInstanceProximityType.SOM) {
    709         x = Math.Floor(x);
    710         y = Math.Floor(y);
    711       }
     668    public Dictionary<IRun, Dictionary<long, int>> GetPerformanceClasses(double target, int nClasses) {
     669      var result = new Dictionary<IRun, Dictionary<long, int>>();
     670      var problemMap = ProblemInstances.Select(x => new { Key = ((StringValue)x.Parameters["Problem Name"]).Value, Value = x })
     671                                       .ToDictionary(x => x.Key, x => x.Value);
     672      foreach (var pr in KnowledgeBase.GroupBy(x => ((StringValue)x.Parameters["Problem Name"]).Value).ToList()) {
     673        var bkq = ((DoubleValue)problemMap[pr.Key].Parameters["BestKnownQuality"]).Value;
     674        var max = ((BoolValue)problemMap[pr.Key].Parameters["Maximization"]).Value;
     675
     676        result[problemMap[pr.Key]] = new Dictionary<long, int>();
     677
     678        var indexMap = new BidirectionalDictionary<long, int>();
     679        var perf = new Dictionary<long, double>();
     680        var idx = 0;
     681        foreach (var kvp in pr.GroupBy(x => algorithmId2RunMapping.GetBySecond(x).Single())) {
     682          var ert = ExpectedRuntimeHelper.CalculateErt(kvp.ToList(), "QualityPerEvaluations", GetTarget(bkq, max), max).ExpectedRuntime;
     683          if (double.IsNaN(ert)) {
     684            // algorithm can't solve that instance with the given target
     685            // these are put into their own additional class
     686            result[problemMap[pr.Key]][kvp.Key] = nClasses;
     687            continue;
     688          }
     689          indexMap.Add(kvp.Key, idx);
     690          perf[kvp.Key] = Math.Log10(ert);
     691          idx++;
     692        }
     693        if (perf.Count == 0) continue;
     694       
     695        var points = perf.OrderBy(x => indexMap.GetByFirst(x.Key)).Select(x => x.Value).ToArray();
     696        int[] clusters;
     697        Ckmeans1dClusters(points, nClasses, out clusters);
     698        var ranks = clusters.Select((c, i) => new { Cluster = c, Perf = perf[indexMap.GetBySecond(i)] })
     699                            .GroupBy(x => x.Cluster, x => x.Perf)
     700                            .Select(x => new { Cluster = x.Key, AvgPerf = x.Average() })
     701                            .OrderBy(x => x.AvgPerf)
     702                            .Select((c, i) => new { Cluster = c.Cluster, Rank = i })
     703                            .ToDictionary(x => x.Cluster, x => x.Rank);
     704        for (var i = 0; i < clusters.Length; i++)
     705          result[problemMap[pr.Key]][indexMap.GetBySecond(i)] = ranks[clusters[i]];
     706      }
     707      return result;
     708    }
     709
     710    private double GetTarget(double bestKnownQuality, bool maximization) {
     711      return bestKnownQuality * (maximization ? (1 - MinimumTarget.Value) : (1 + MinimumTarget.Value));
    712712    }
    713713
     
    722722      var handler = AlgorithmInstanceStarted;
    723723      if (handler != null) handler(this, new EventArgs<IAlgorithm>(instance));
     724    }
     725
     726    public event EventHandler RecommendationModelChanged;
     727    private void OnRecommenderModelChanged() {
     728      var handler = RecommendationModelChanged;
     729      if (handler != null) handler(this, EventArgs.Empty);
    724730    }
    725731
     
    809815      return mean;
    810816    }
     817
     818    public IEnumerable<Tuple<IAlgorithm, double>> GetAlgorithmInstanceRanking() {
     819      return RecommendationModel.GetRanking(this);
     820    }
    811821  }
    812822}
  • branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/DistanceWeightedRecommender.cs

    r13786 r13787  
    3535  [StorableClass]
    3636  public class DistanceWeightedRecommender : ParameterizedNamedItem, IAlgorithmInstanceRecommender {
    37     private KnowledgeCenter okc;
    38 
    39     private IFixedValueParameter<EnumValue<ProblemInstanceProximityType>> ProximityTypeParameter {
    40       get { return (IFixedValueParameter<EnumValue<ProblemInstanceProximityType>>)Parameters["ProximityType"]; }
    41     }
    4237
    4338    private IFixedValueParameter<DoubleValue> NeighborhoodFactorParameter {
    4439      get { return (IFixedValueParameter<DoubleValue>)Parameters["NeighborhoodFactor"]; }
    45     }
    46 
    47     public ProblemInstanceProximityType ProximityType {
    48       get { return ProximityTypeParameter.Value.Value; }
    49       set { ProximityTypeParameter.Value.Value = value; }
    5040    }
    5141
     
    5949    private DistanceWeightedRecommender(DistanceWeightedRecommender original, Cloner cloner)
    6050      : base(original, cloner) { }
    61     public DistanceWeightedRecommender(KnowledgeCenter okc) {
    62       this.okc = okc;
    63       Parameters.Add(new FixedValueParameter<EnumValue<ProblemInstanceProximityType>>("ProximityType", "The type of neighbor proximity.", new EnumValue<ProblemInstanceProximityType>(ProblemInstanceProximityType.FeatureSpace)));
     51    public DistanceWeightedRecommender() {
    6452      Parameters.Add(new FixedValueParameter<DoubleValue>("NeighborhoodFactor", "Penalize neighbors that are far away.", new DoubleValue(5)));
    6553    }
     
    6957    }
    7058
    71     public IEnumerable<IAlgorithm> GetRanking() {
    72       if (okc.Problem.ProblemId == -1) yield break;
    73 
    74       var piDistances = okc.GetProblemDistances(ProximityType);
     59    public IRecommendationModel TrainModel(KnowledgeCenter okc, string[] characteristics) {
     60      var piDistances = okc.GetProblemDistances(characteristics);
    7561      var maxDist = piDistances.Max(x => x.Value);
    7662      var instances = new SortedList<double, IAlgorithm>();
     
    10995          avgERT += new System.Random().NextDouble();
    11096        }
    111         instances.Add(avgERT, algorithm);
     97        instances.Add(avgERT, (IAlgorithm)algorithm.Clone());
    11298      }
    11399
    114       foreach (var alg in instances.Select(x => (IAlgorithm)x.Value.Clone()))
    115         yield return alg;
     100      return new FixedRankModel(instances.Select(x => Tuple.Create(x.Value, x.Key)));
    116101    }
    117102  }
  • branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/KNearestNeighborRecommender.cs

    r13786 r13787  
    2323using HeuristicLab.Core;
    2424using HeuristicLab.Data;
    25 using HeuristicLab.Optimization;
    2625using HeuristicLab.Parameters;
    2726using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    28 using System.Collections.Generic;
    29 using System.Linq;
    3027
    3128namespace HeuristicLab.OptimizationExpertSystem.Common {
     
    3330  [StorableClass]
    3431  public sealed class KNearestNeighborRecommender : ParameterizedNamedItem, IAlgorithmInstanceRecommender {
    35     private KnowledgeCenter okc;
    36 
    37     private IFixedValueParameter<EnumValue<ProblemInstanceProximityType>> ProximityTypeParameter {
    38       get { return (IFixedValueParameter<EnumValue<ProblemInstanceProximityType>>)Parameters["ProximityType"]; }
    39     }
    40 
    41     public ProblemInstanceProximityType ProximityType {
    42       get { return ProximityTypeParameter.Value.Value; }
    43       set { ProximityTypeParameter.Value.Value = value; }
    44     }
    45 
     32   
    4633    private IFixedValueParameter<IntValue> KParameter {
    4734      get { return (IFixedValueParameter<IntValue>)Parameters["K"]; }
     
    5239    private KNearestNeighborRecommender(KNearestNeighborRecommender original, Cloner cloner)
    5340      : base(original, cloner) { }
    54     public KNearestNeighborRecommender(KnowledgeCenter okc) {
    55       this.okc = okc;
    56       Parameters.Add(new FixedValueParameter<EnumValue<ProblemInstanceProximityType>>("ProximityType", "The type of neighbor proximity.", new EnumValue<ProblemInstanceProximityType>(ProblemInstanceProximityType.FeatureSpace)));
     41    public KNearestNeighborRecommender() {
    5742      Parameters.Add(new FixedValueParameter<IntValue>("K", "The number of nearest neighbors to consider.", new IntValue(5)));
    5843    }
     
    6247    }
    6348
    64     public IEnumerable<IAlgorithm> GetRanking() {
    65       if (okc.Problem.ProblemId == -1) yield break;
    66 
    67       var distances = okc.GetProblemDistances(ProximityType);
    68       var K = KParameter.Value.Value;
    69       var performances = new Dictionary<IAlgorithm, List<double>>();
    70       for (var k = 0; k < K; k++) {
    71         if (distances.Count == 0) break;
    72         var min = distances.MinItems(x => x.Value).First();
    73         // lookup algorithm performances in min
    74         var perfs = okc.GetAlgorithmPerformance(min.Key);
    75         if (perfs.Count == 0) {
    76           k--;
    77           continue;
    78         }
    79         foreach (var p in perfs) {
    80           var ert = p.Value;
    81           if (double.IsNaN(ert)) ert = int.MaxValue;
    82           List<double> erts;
    83           if (!performances.TryGetValue(p.Key, out erts)) {
    84             performances[p.Key] = new List<double>() { ert }; ;
    85           } else erts.Add(ert);
    86         }
    87         distances.Remove(min.Key);
    88       }
    89       foreach (var alg in performances.Select(x => new { Alg = x.Key, Perf = x.Value.Average() })
    90                          .OrderBy(x => x.Perf)
    91                          .Select(x => x.Alg))
    92         yield return alg;
     49    public IRecommendationModel TrainModel(KnowledgeCenter kc, string[] characteristics) {
     50      return new KNearestNeighborModel(KParameter.Value.Value, characteristics);
    9351    }
    9452  }
  • branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/OverallBestRecommender.cs

    r13786 r13787  
    3535  [StorableClass]
    3636  public class OverallBestRecommender : ParameterizedNamedItem, IAlgorithmInstanceRecommender {
    37     private KnowledgeCenter okc;
    38 
    39     private IFixedValueParameter<EnumValue<ProblemInstanceProximityType>> ProximityTypeParameter {
    40       get { return (IFixedValueParameter<EnumValue<ProblemInstanceProximityType>>)Parameters["ProximityType"]; }
    41     }
    4237
    4338    private IFixedValueParameter<DoubleValue> NeighborhoodFactorParameter {
    4439      get { return (IFixedValueParameter<DoubleValue>)Parameters["NeighborhoodFactor"]; }
    45     }
    46 
    47     public ProblemInstanceProximityType ProximityType {
    48       get { return ProximityTypeParameter.Value.Value; }
    49       set { ProximityTypeParameter.Value.Value = value; }
    5040    }
    5141
     
    5949    private OverallBestRecommender(OverallBestRecommender original, Cloner cloner)
    6050      : base(original, cloner) { }
    61     public OverallBestRecommender(KnowledgeCenter okc) {
    62       this.okc = okc;
    63       Parameters.Add(new FixedValueParameter<EnumValue<ProblemInstanceProximityType>>("ProximityType", "The type of neighbor proximity.", new EnumValue<ProblemInstanceProximityType>(ProblemInstanceProximityType.FeatureSpace)));
     51    public OverallBestRecommender() {
    6452      Parameters.Add(new FixedValueParameter<DoubleValue>("NeighborhoodFactor", "Penalize neighbors that are far away.", new DoubleValue(5)));
    6553    }
     
    6957    }
    7058
    71     public IEnumerable<IAlgorithm> GetRanking() {
    72       if (okc.Problem.ProblemId == -1) yield break;
    73 
     59    public IRecommendationModel TrainModel(KnowledgeCenter kc, string[] characteristics) {
    7460      var instances = new List<Tuple<IAlgorithm, double>>();
    75       foreach (var relevantRuns in okc.GetKnowledgeBaseByAlgorithm()) {
     61      foreach (var relevantRuns in kc.GetKnowledgeBaseByAlgorithm()) {
    7662        var algorithm = relevantRuns.Key;
    7763        var pis = relevantRuns.Value.Select(x => ((StringValue)x.Parameters["Problem Name"]).Value).Distinct()
    78                               .Select(x => Tuple.Create(x, okc.ProblemInstances.SingleOrDefault(y => ((StringValue)y.Parameters["Problem Name"]).Value == x)))
     64                              .Select(x => Tuple.Create(x, kc.ProblemInstances.SingleOrDefault(y => ((StringValue)y.Parameters["Problem Name"]).Value == x)))
    7965                              .Where(x => x.Item2 != null)
    8066                              .Select(x => Tuple.Create(x.Item1, ((DoubleValue)x.Item2.Parameters["BestKnownQuality"]).Value))
     
    8470        foreach (var problemRuns in relevantRuns.Value.GroupBy(x => ((StringValue)x.Parameters["Problem Name"]).Value)) {
    8571          var bkq = pis[problemRuns.Key];
    86           var ert = ExpectedRuntimeHelper.CalculateErt(problemRuns.ToList(), "QualityPerEvaluations", (okc.Maximization ? (1 - okc.MinimumTarget.Value) : (1 + okc.MinimumTarget.Value)) * bkq, okc.Maximization).ExpectedRuntime;
     72          var ert = ExpectedRuntimeHelper.CalculateErt(problemRuns.ToList(), "QualityPerEvaluations", (kc.Maximization ? (1 - kc.MinimumTarget.Value) : (1 + kc.MinimumTarget.Value)) * bkq, kc.Maximization).ExpectedRuntime;
    8773          if (double.IsNaN(ert)) ert = int.MaxValue;
    8874          avgERT += ert;
     
    9076        }
    9177        avgERT /= count;
    92         instances.Add(Tuple.Create(algorithm, avgERT));
     78        instances.Add(Tuple.Create((IAlgorithm)algorithm.Clone(), avgERT));
    9379      }
    9480
    95       foreach (var alg in instances.OrderBy(x => x.Item2).Select(x => (IAlgorithm)x.Item1.Clone()))
    96         yield return alg;
     81      return new FixedRankModel(instances.OrderBy(x => x.Item2));
    9782    }
    9883  }
Note: See TracChangeset for help on using the changeset viewer.