Changeset 12860 for branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystem.cs
- Timestamp:
- 08/13/15 16:05:08 (9 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/ExpertSystem.cs
r12847 r12860 24 24 using System.Collections.Generic; 25 25 using System.Drawing; 26 26 using System.Linq; 27 using HeuristicLab.Analysis; 27 28 using HeuristicLab.Core; 28 29 using HeuristicLab.Optimization; … … 30 31 using HeuristicLab.Common; 31 32 using HeuristicLab.Common.Resources; 33 using HeuristicLab.Data; 32 34 33 35 namespace HeuristicLab.OptimizationExpertSystem { 34 [Item("Expert-System Optimizer", "Currently in experimental phase, an expert system that makes algorithm suggestions based on fitness landscape analysis features and an optimization knowledge base.")]36 [Item("Expert-System", "Currently in experimental phase, an expert system that makes algorithm suggestions based on fitness landscape analysis features and an optimization knowledge base.")] 35 37 [StorableClass] 36 [Creatable(CreatableAttribute.Categories.TestingAndAnalysis, Priority = 11 8)]37 public sealed class ExpertSystem Optimizer : ParameterizedNamedItem, IOptimizer, IStorableContent, INotifyPropertyChanged {38 [Creatable(CreatableAttribute.Categories.TestingAndAnalysis, Priority = 119)] 39 public sealed class ExpertSystem : NamedItem, IStorableContent, INotifyPropertyChanged { 38 40 39 41 public string Filename { get; set; } … … 51 53 maximumEvaluations = value; 52 54 OnPropertyChanged("MaximumEvaluations"); 55 UpdateSuggestions(); 53 56 } 54 57 } … … 58 61 public RunCollection Runs { 59 62 get { return runs; } 60 private set {61 if (value == null) throw new ArgumentNullException("value");62 if (runs == value) return;63 runs = value;64 OnPropertyChanged("Runs");65 }66 63 } 67 64 68 65 [Storable] 69 private ExecutionState executionState; 70 public ExecutionState ExecutionState { 71 get { return executionState; } 72 private set { 73 if (executionState != value) { 74 executionState = value; 75 OnPropertyChanged("ExecutionState"); 76 OnExecutionStateChanged(); 77 OnItemImageChanged(); 78 } 79 } 66 private ItemList<IAlgorithm> algorithmInstances; 67 public ItemList<IAlgorithm> AlgorithmInstances { 68 get { return algorithmInstances; } 80 69 } 81 70 82 71 [Storable] 83 private TimeSpan executionTime; 84 public TimeSpan ExecutionTime { 85 get { return executionTime; } 86 private set { 87 if (executionTime == value) return; 88 executionTime = value; 89 OnPropertyChanged("ExecutionTime"); 90 OnExecutionTimeChanged(); 91 } 92 } 93 94 [Storable] 95 private RunCollection knowledgeBase; 96 public RunCollection KnowledgeBase { 97 get { return knowledgeBase; } 98 private set { 99 if (value == null) throw new ArgumentNullException("value"); 100 if (knowledgeBase == value) return; 101 knowledgeBase = value; 102 OnPropertyChanged("KnowledgeBase"); 103 } 104 } 105 106 [Storable] 107 private IProblem problem; 108 public IProblem Problem { 72 private ISingleObjectiveHeuristicOptimizationProblem problem; 73 public ISingleObjectiveHeuristicOptimizationProblem Problem { 109 74 get { return problem; } 110 75 set { … … 112 77 problem = value; 113 78 OnPropertyChanged("Problem"); 79 UpdateSuggestions(); 114 80 } 115 81 } … … 122 88 } 123 89 124 p ublic IEnumerable<IOptimizer> NestedOptimizers{125 get { return SuggestedInstances; }90 private bool Maximization { 91 get { return Problem != null && ((IValueParameter<BoolValue>)Problem.MaximizationParameter).Value.Value; } 126 92 } 127 93 128 94 [StorableConstructor] 129 private ExpertSystem Optimizer(bool deserializing) : base(deserializing) { }130 private ExpertSystem Optimizer(ExpertSystemOptimizeroriginal, Cloner cloner)95 private ExpertSystem(bool deserializing) : base(deserializing) { } 96 private ExpertSystem(ExpertSystem original, Cloner cloner) 131 97 : base(original, cloner) { 132 98 runs = cloner.Clone(original.runs); 133 executionState = original.executionState; 134 executionTime = original.executionTime; 135 knowledgeBase = cloner.Clone(original.knowledgeBase); 99 algorithmInstances = cloner.Clone(original.algorithmInstances); 136 100 problem = cloner.Clone(original.problem); 137 101 suggestedInstances = cloner.Clone(original.suggestedInstances); 138 102 readOnlySuggestedInstances = suggestedInstances.AsReadOnly(); 103 RegisterEventHandlers(); 139 104 } 140 public ExpertSystemOptimizer() { 141 Runs = new RunCollection(); 142 KnowledgeBase = new RunCollection(); 105 public ExpertSystem() { 106 Name = ItemName; 107 Description = ItemDescription; 108 runs = new RunCollection(); 109 algorithmInstances = new ItemList<IAlgorithm>(); 143 110 suggestedInstances = new ItemList<IAlgorithm>(); 144 111 readOnlySuggestedInstances = suggestedInstances.AsReadOnly(); 145 ExecutionState = ExecutionState.Stopped; 146 ExecutionTime = TimeSpan.Zero; 112 RegisterEventHandlers(); 147 113 } 148 114 149 115 public override IDeepCloneable Clone(Cloner cloner) { 150 return new ExpertSystem Optimizer(this, cloner);116 return new ExpertSystem(this, cloner); 151 117 } 152 118 … … 154 120 private void AfterDeserialization() { 155 121 readOnlySuggestedInstances = suggestedInstances.AsReadOnly(); 122 RegisterEventHandlers(); 156 123 } 157 124 158 public void Prepare() { 159 Prepare(false); 125 private void RegisterEventHandlers() { 126 runs.CollectionReset += InformationChanged; 127 runs.ItemsAdded += InformationChanged; 128 runs.ItemsRemoved += InformationChanged; 129 runs.Reset += InformationChanged; 130 runs.UpdateOfRunsInProgressChanged += InformationChanged; 131 algorithmInstances.CollectionReset += InformationChanged; 132 algorithmInstances.ItemsAdded += InformationChanged; 133 algorithmInstances.ItemsRemoved += InformationChanged; 160 134 } 161 135 162 public void Prepare(bool clearRuns) { 163 if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused) && (ExecutionState != ExecutionState.Stopped)) 164 throw new InvalidOperationException(string.Format("Prepare not allowed in execution state \"{0}\".", ExecutionState)); 165 if (clearRuns) Runs.Clear(); 166 ExecutionTime = TimeSpan.Zero; 167 ExecutionState = ExecutionState.Prepared; 168 OnPrepared(); 136 private void InformationChanged(object sender, EventArgs e) { 137 var runCollection = sender as RunCollection; 138 if (runCollection != null && runCollection.UpdateOfRunsInProgress) return; 139 UpdateSuggestions(); 169 140 } 170 141 171 public void Start() { 172 if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused)) 173 throw new InvalidOperationException(string.Format("Start not allowed in execution state \"{0}\".", ExecutionState)); 174 ExecutionState = ExecutionState.Started; 175 OnStarted(); 176 } 142 private void UpdateSuggestions() { 143 if (Problem == null) return; 144 var instances = new SortedList<double, IAlgorithm>(); 145 foreach (var instance in algorithmInstances) { 146 var relevantRuns = instance.Runs.Where(x => ((StringValue)x.Parameters["Problem Type"]).Value == Problem.GetType().Name); 147 var avgQuality = 0.0; 148 var counter = 0; 149 foreach (var run in relevantRuns) { 150 var performanceGraph = ((IndexedDataTable<double>)run.Results["QualityPerEvaluations"]); 151 try { 152 avgQuality += performanceGraph.Rows.First().Values.TakeWhile(x => x.Item1 < MaximumEvaluations).Last().Item2; 153 counter++; 154 } catch { continue; } 155 } 156 avgQuality /= counter; 157 instances.Add(avgQuality, instance); 158 } 177 159 178 public void Pause() { 179 if (ExecutionState != ExecutionState.Started) 180 throw new InvalidOperationException(string.Format("Pause not allowed in execution state \"{0}\".", ExecutionState)); 181 ExecutionState = ExecutionState.Paused; 182 OnPaused(); 183 } 184 185 186 public void Stop() { 187 if ((ExecutionState != ExecutionState.Started) && (ExecutionState != ExecutionState.Paused)) 188 throw new InvalidOperationException(string.Format("Stop not allowed in execution state \"{0}\".", ExecutionState)); 189 ExecutionState = ExecutionState.Stopped; 190 OnStopped(); 191 } 192 193 public event EventHandler Prepared; 194 private void OnPrepared() { 195 var handler = Prepared; 196 if (handler != null) handler(this, EventArgs.Empty); 197 } 198 199 public event EventHandler Started; 200 private void OnStarted() { 201 var handler = Started; 202 if (handler != null) handler(this, EventArgs.Empty); 203 } 204 205 public event EventHandler Paused; 206 private void OnPaused() { 207 var handler = Paused; 208 if (handler != null) handler(this, EventArgs.Empty); 209 } 210 211 public event EventHandler Stopped; 212 private void OnStopped() { 213 var handler = Stopped; 214 if (handler != null) handler(this, EventArgs.Empty); 215 } 216 217 public event EventHandler<EventArgs<Exception>> ExceptionOccurred; 218 private void OnExceptionOccurred(Exception e) { 219 var handler = ExceptionOccurred; 220 if (handler != null) handler(this, new EventArgs<Exception>(e)); 221 } 222 223 public event EventHandler ExecutionStateChanged; 224 private void OnExecutionStateChanged() { 225 var handler = ExecutionStateChanged; 226 if (handler != null) handler(this, EventArgs.Empty); 227 } 228 229 public event EventHandler ExecutionTimeChanged; 230 private void OnExecutionTimeChanged() { 231 var handler = ExecutionTimeChanged; 232 if (handler != null) handler(this, EventArgs.Empty); 160 suggestedInstances.Clear(); 161 var instanceLadder = instances.Select(x => x.Value); 162 suggestedInstances.AddRange(Maximization ? instanceLadder.Reverse() : instanceLadder); 233 163 } 234 164
Note: See TracChangeset
for help on using the changeset viewer.