- Timestamp:
- 04/24/16 10:03:52 (8 years ago)
- 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 26 26 SeedByCloning 27 27 } 28 29 public enum ProblemInstanceProximityType {30 FeatureSpace,31 PCA,32 MDS,33 SOM34 }35 28 } -
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/HeuristicLab.OptimizationExpertSystem.Common-3.3.csproj
r13774 r13787 158 158 </ItemGroup> 159 159 <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" /> 164 166 <Compile Include="KnowledgeCenter.cs" /> 165 167 <Compile Include="Plugin.cs" /> 166 168 <Compile Include="Enums.cs" /> 169 <Compile Include="Recommenders\FixedRankModel.cs" /> 167 170 <None Include="Properties\AssemblyInfo.cs.frame" /> 168 171 <Compile Include="ProblemCharacteristicAnalysis\CharacteristicCalculator.cs" /> -
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Interfaces/IAlgorithmInstanceRecommender.cs
r13786 r13787 20 20 #endregion 21 21 22 using HeuristicLab.Common; 23 using HeuristicLab.Optimization; 24 using System.Collections.Generic; 22 using HeuristicLab.Core; 25 23 26 24 namespace HeuristicLab.OptimizationExpertSystem.Common { 27 public interface IAlgorithmInstanceRecommender : I Content{28 I Enumerable<IAlgorithm> GetRanking();25 public interface IAlgorithmInstanceRecommender : IParameterizedItem { 26 IRecommendationModel TrainModel(KnowledgeCenter kc, string[] characteristics); 29 27 } 30 28 } -
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/KnowledgeCenter.cs
r13774 r13787 96 96 } 97 97 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 } 108 106 } 109 107 … … 135 133 readonlyAlgorithmInstances = algorithmInstances.AsReadOnly(); 136 134 problemInstances = new RunCollection(); 137 problemCharacteristics = new CheckedItemList<StringValue>(); 138 readonlyProblemCharacteristics = problemCharacteristics.AsReadOnly(); 139 algorithmInstanceRecommender = new OverallBestRecommender(this); 135 recommendationModel = FixedRankModel.GetEmpty(); 140 136 problem = new SingleObjectiveOKBProblem(); 141 137 algorithmId2RunMapping = new BidirectionalLookup<long, IRun>(); … … 167 163 knowledgeBase.ItemsAdded += InformationChanged; 168 164 knowledgeBase.ItemsRemoved += InformationChanged; 169 problemCharacteristics.ItemsAdded += CharacteristicChanged;170 problemCharacteristics.ItemsReplaced += CharacteristicChanged;171 problemCharacteristics.ItemsRemoved += CharacteristicChanged;172 problemCharacteristics.CollectionReset += CharacteristicChanged;173 problemCharacteristics.CheckedItemsChanged += CharacteristicChanged;174 165 } 175 166 176 167 private void MaximumEvaluationsOnValueChanged(object sender, EventArgs eventArgs) { 177 UpdateSuggestions(); 168 178 169 } 179 170 180 171 private void MinimumTargetOnValueChanged(object sender, EventArgs e) { 181 UpdateSuggestions(); 172 182 173 } 183 174 … … 192 183 var runCollection = sender as RunCollection; 193 184 if (runCollection != null && runCollection.UpdateOfRunsInProgress) return; 194 UpdateSuggestions();195 }196 197 private void CharacteristicChanged(object sender, EventArgs e) {198 if (SuppressEvents) return;199 UpdateInstanceProjection();200 185 } 201 186 … … 205 190 } 206 191 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); 211 196 212 197 var key2Idx = new BidirectionalDictionary<IRun, int>(); … … 227 212 #endregion 228 213 #region PCA 229 var ds = new double[instances.Count, ProblemCharacteristics.CheckedItems.Count()];214 var ds = new double[instances.Count, characteristics.Length]; 230 215 foreach (var instance in instances) { 231 216 var arr = instance.Value; … … 240 225 #endregion 241 226 #region SOM 242 var features = new DoubleMatrix( ProblemCharacteristics.CheckedItems.Count(), instances.Count);227 var features = new DoubleMatrix(characteristics.Length, instances.Count); 243 228 foreach (var instance in instances) { 244 229 var arr = instance.Value; … … 283 268 } 284 269 285 p rivate Dictionary<IRun, double[]> GetProblemCharacteristics() {270 public Dictionary<IRun, double[]> GetProblemCharacteristics(string[] characteristics) { 286 271 var instances = new Dictionary<IRun, double[]>(); 287 var values = new List<double>[ ProblemCharacteristics.CheckedItems.Count()];272 var values = new List<double>[characteristics.Length]; 288 273 foreach (var run in ProblemInstances) { 289 274 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) { 292 277 if (values[f] == null) values[f] = new List<double>(ProblemInstances.Count); 293 278 IItem item; … … 514 499 if (alg != null) { 515 500 lock (algorithmId2AlgorithmInstanceMapping) { 501 algorithmInstances.Add(alg); 516 502 algorithmId2AlgorithmInstanceMapping.Add(algInst.Id, alg); 517 503 progress.Status = string.Format("Downloaded algorithm {0} (okb-id: {1})...", algInst.Name, algInst.Id); … … 549 535 550 536 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 609 538 try { 610 539 KnowledgeBase.UpdateOfRunsInProgress = true; … … 612 541 KnowledgeBase.AddRange(runList); 613 542 } 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 } 614 577 } 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()); 623 579 } 624 580 625 581 public Dictionary<IAlgorithm, double> GetAlgorithmPerformance(IRun problemInstance) { 626 582 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); 628 584 return knowledgeBase.Where(x => ((StringValue)x.Parameters["Problem Name"]).Value == ((StringValue)problemInstance.Parameters["Problem Name"]).Value) 629 585 .GroupBy(x => algorithmId2AlgorithmInstanceMapping.GetByFirst(algorithmId2RunMapping.GetBySecond(x).Single())) … … 636 592 } 637 593 638 public IEnumerable<IRegressionProblem> Get DataAnalysisProblem(double target) {594 public IEnumerable<IRegressionProblem> GetRegressionProblemPerAlgorithmInstance(double target, string[] characteristics) { 639 595 if (Problem == null) yield break; 640 var characteristics = GetProblemCharacteristics();596 var features = GetProblemCharacteristics(characteristics); 641 597 // TODO: knowledgebase only stores problem name as a string 642 598 // this doesn't work if there are two equally named problem instances … … 647 603 var ds = new ModifiableDataset(); 648 604 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>()); 651 607 ds.AddVariable("ERT", new List<double>()); 652 var max = Maximization;653 608 foreach (var pr in problemRuns) { 654 609 var prob = problemMap[pr.Key]; 655 var features = characteristics[prob]; 610 var f = features[prob]; 611 var max = ((BoolValue)prob.Parameters["Maximization"]).Value; 656 612 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; 658 614 if (double.IsNaN(ert)) ert = int.MaxValue; 659 ds.AddRow(new object[] { pr.Key }.Concat(f eatures.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"); 662 618 var result = new RegressionProblem() { 663 619 Name = algorithmId2AlgorithmInstanceMapping.GetByFirst(relevantRuns.Key).Name … … 668 624 } 669 625 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>(); 676 657 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); 701 664 } 702 665 return result; 703 666 } 704 667 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)); 712 712 } 713 713 … … 722 722 var handler = AlgorithmInstanceStarted; 723 723 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); 724 730 } 725 731 … … 809 815 return mean; 810 816 } 817 818 public IEnumerable<Tuple<IAlgorithm, double>> GetAlgorithmInstanceRanking() { 819 return RecommendationModel.GetRanking(this); 820 } 811 821 } 812 822 } -
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/DistanceWeightedRecommender.cs
r13786 r13787 35 35 [StorableClass] 36 36 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 }42 37 43 38 private IFixedValueParameter<DoubleValue> NeighborhoodFactorParameter { 44 39 get { return (IFixedValueParameter<DoubleValue>)Parameters["NeighborhoodFactor"]; } 45 }46 47 public ProblemInstanceProximityType ProximityType {48 get { return ProximityTypeParameter.Value.Value; }49 set { ProximityTypeParameter.Value.Value = value; }50 40 } 51 41 … … 59 49 private DistanceWeightedRecommender(DistanceWeightedRecommender original, Cloner cloner) 60 50 : 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() { 64 52 Parameters.Add(new FixedValueParameter<DoubleValue>("NeighborhoodFactor", "Penalize neighbors that are far away.", new DoubleValue(5))); 65 53 } … … 69 57 } 70 58 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); 75 61 var maxDist = piDistances.Max(x => x.Value); 76 62 var instances = new SortedList<double, IAlgorithm>(); … … 109 95 avgERT += new System.Random().NextDouble(); 110 96 } 111 instances.Add(avgERT, algorithm);97 instances.Add(avgERT, (IAlgorithm)algorithm.Clone()); 112 98 } 113 99 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))); 116 101 } 117 102 } -
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/KNearestNeighborRecommender.cs
r13786 r13787 23 23 using HeuristicLab.Core; 24 24 using HeuristicLab.Data; 25 using HeuristicLab.Optimization;26 25 using HeuristicLab.Parameters; 27 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 using System.Collections.Generic;29 using System.Linq;30 27 31 28 namespace HeuristicLab.OptimizationExpertSystem.Common { … … 33 30 [StorableClass] 34 31 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 46 33 private IFixedValueParameter<IntValue> KParameter { 47 34 get { return (IFixedValueParameter<IntValue>)Parameters["K"]; } … … 52 39 private KNearestNeighborRecommender(KNearestNeighborRecommender original, Cloner cloner) 53 40 : 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() { 57 42 Parameters.Add(new FixedValueParameter<IntValue>("K", "The number of nearest neighbors to consider.", new IntValue(5))); 58 43 } … … 62 47 } 63 48 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); 93 51 } 94 52 } -
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/OverallBestRecommender.cs
r13786 r13787 35 35 [StorableClass] 36 36 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 }42 37 43 38 private IFixedValueParameter<DoubleValue> NeighborhoodFactorParameter { 44 39 get { return (IFixedValueParameter<DoubleValue>)Parameters["NeighborhoodFactor"]; } 45 }46 47 public ProblemInstanceProximityType ProximityType {48 get { return ProximityTypeParameter.Value.Value; }49 set { ProximityTypeParameter.Value.Value = value; }50 40 } 51 41 … … 59 49 private OverallBestRecommender(OverallBestRecommender original, Cloner cloner) 60 50 : 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() { 64 52 Parameters.Add(new FixedValueParameter<DoubleValue>("NeighborhoodFactor", "Penalize neighbors that are far away.", new DoubleValue(5))); 65 53 } … … 69 57 } 70 58 71 public IEnumerable<IAlgorithm> GetRanking() { 72 if (okc.Problem.ProblemId == -1) yield break; 73 59 public IRecommendationModel TrainModel(KnowledgeCenter kc, string[] characteristics) { 74 60 var instances = new List<Tuple<IAlgorithm, double>>(); 75 foreach (var relevantRuns in okc.GetKnowledgeBaseByAlgorithm()) {61 foreach (var relevantRuns in kc.GetKnowledgeBaseByAlgorithm()) { 76 62 var algorithm = relevantRuns.Key; 77 63 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))) 79 65 .Where(x => x.Item2 != null) 80 66 .Select(x => Tuple.Create(x.Item1, ((DoubleValue)x.Item2.Parameters["BestKnownQuality"]).Value)) … … 84 70 foreach (var problemRuns in relevantRuns.Value.GroupBy(x => ((StringValue)x.Parameters["Problem Name"]).Value)) { 85 71 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; 87 73 if (double.IsNaN(ert)) ert = int.MaxValue; 88 74 avgERT += ert; … … 90 76 } 91 77 avgERT /= count; 92 instances.Add(Tuple.Create( algorithm, avgERT));78 instances.Add(Tuple.Create((IAlgorithm)algorithm.Clone(), avgERT)); 93 79 } 94 80 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)); 97 82 } 98 83 }
Note: See TracChangeset
for help on using the changeset viewer.