Changeset 14538 for branches/HeuristicLab.DatastreamAnalysis/HeuristicLab.DatastreamAnalysis/3.4/DatastreamAnalysisOptimizer.cs
- Timestamp:
- 01/03/17 23:04:56 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.DatastreamAnalysis/HeuristicLab.DatastreamAnalysis/3.4/DatastreamAnalysisOptimizer.cs
r14536 r14538 24 24 using System; 25 25 using System.Collections.Generic; 26 using System.ComponentModel; 26 27 using System.Diagnostics; 27 28 using System.Drawing; … … 76 77 private bool stopPending; 77 78 private DateTime lastUpdateTime; 79 private bool prepared; 80 private bool finished; 78 81 79 82 [Storable] … … 106 109 if (value == null || value == ensembles) 107 110 return; 108 111 if(!(value is IRegressionEnsembleModel)) throw new ArgumentException("Invaid ensemble model type"); 112 DeregisterEnsembleEvents(); 109 113 ensembles = value; 114 RegisterEnsembleEvents(); 115 OnEnsemblesChanged(); 116 Prepare(); 110 117 } 111 118 } … … 121 128 if (value == null || value == datastream) 122 129 return; 123 130 if(!(value is IDatastream)) throw new ArgumentException("Invalid datastream type"); 131 DeregisterDatastreamEvents(); 124 132 datastream = value; 133 RegisterDatastreamEvents(); 134 OnDatastreamChanged(); 135 Prepare(); 125 136 } 126 137 } … … 128 139 #endregion properties 129 140 130 #region ResultsProperties 131 private double ResultsBestQuality 132 { 141 #region results properties 142 private int ResultsSlidingWindowMovements { 143 get { return ((IntValue)Results["Sliding Window Movements"].Value).Value; } 144 set { ((IntValue)Results["Sliding Window Movements"].Value).Value = value; } 145 } 146 private double ResultsBestQuality { 133 147 get { return ((DoubleValue)Results["Best Quality"].Value).Value; } 134 148 set { ((DoubleValue)Results["Best Quality"].Value).Value = value; } 135 149 } 136 private DataTable ResultsQualities 137 { 150 private DataTable ResultsQualities { 138 151 get { return ((DataTable)Results["Qualities"].Value); } 139 152 } 153 154 private const string ResultsQualitiesR2 = "R²"; 155 private const string ResultsQualitiesPearson = "Pearson"; 156 157 private DataTable ResultsTargets { 158 get { return ((DataTable) Results["Targets"].Value); } 159 } 160 161 private const string ResultsTargetsReal = "Real"; 162 163 protected void SetupResults() { 164 Results.Clear(); 165 166 Results.Add(new Result("Sliding Window Movements", new IntValue(0))); 167 Results.Add(new Result("Best Quality", new DoubleValue(0))); 168 Results.Add(new Result("Qualities", new DataTable("Qualities"))); 169 Results.Add(new Result("Targets", new DataTable("Targets"))); 170 171 ResultsQualities.Rows.Add(new DataRow(ResultsQualitiesR2)); 172 ResultsQualities.Rows.Add(new DataRow(ResultsQualitiesPearson)); 173 ResultsTargets.Rows.Add(new DataRow(ResultsTargetsReal)); 174 foreach (var ensemble in Ensembles) { 175 ResultsTargets.Rows.Add(new DataRow(ensemble.Name)); 176 } 177 } 178 140 179 #endregion 141 180 142 181 #region constructors, cloner,... 143 182 144 public DatastreamAnalysisOptimizer() {183 public DatastreamAnalysisOptimizer() : base() { 145 184 name = "Datastream Analysis"; 146 185 log = new Log(); … … 159 198 [StorableHook(HookType.AfterDeserialization)] 160 199 private void AfterDeserialization() { 161 // nothing to do in here200 Initialize(); 162 201 } 163 202 … … 179 218 private void Initialize() { 180 219 if (runs != null) RegisterRunsEvents(); 220 if (datastream != null) RegisterDatastreamEvents(); 221 if (ensembles != null) RegisterEnsembleEvents(); 181 222 } 182 223 #endregion … … 185 226 186 227 public override void Prepare() { 187 if (ensembles == null || datastream == null) return; 188 Prepare(true); 228 if (ensembles == null || ensembles.Count == 0 || datastream == null || !datastream.SlidingWindowEvaluationPossible) return; 229 //if (ensembles.SelectMany(x => x.Models).Count() == 0) return; 230 base.Prepare(); 231 OnPrepared(); 189 232 } 190 233 191 234 public void Prepare(bool clearRuns) { 192 if (ensembles == null || datastream == null) return; 235 if (ensembles == null || ensembles.Count == 0 || datastream == null || !datastream.SlidingWindowEvaluationPossible) return; 236 193 237 base.Prepare(); 194 if (clearRuns) r esults.Clear();238 if (clearRuns) runs.Clear(); 195 239 OnPrepared(); 196 240 } … … 201 245 cancellationTokenSource = new CancellationTokenSource(); 202 246 stopPending = false; 247 248 if (prepared) { 249 SetupResults(); 250 //prepared = false; 251 } 203 252 204 253 Task task = Task.Factory.StartNew(Run, cancellationTokenSource.Token, cancellationTokenSource.Token); … … 219 268 220 269 // handle stop/pause 221 if(stopPending) { } 222 if(!Datastream.SlidingWindowMovementPossible) OnStopped(); 223 else OnPaused(); 270 if (stopPending || finished) { 271 OnStopped(); 272 } else { 273 OnPaused(); 274 } 275 //if(!Datastream.SlidingWindowMovementPossible) OnStopped(); 276 //else OnPaused(); 224 277 }); 225 278 … … 244 297 245 298 protected override void OnPrepared() { 299 ExecutionTime = TimeSpan.Zero; 300 foreach (IStatefulItem statefulItem in this.GetObjectGraphObjects(new HashSet<object>() {Runs}).OfType<IStatefulItem>()) { 301 statefulItem.InitializeState(); 302 } 303 results.Clear(); 304 prepared = true; 305 finished = false; 246 306 Log.LogMessage("Datastream analysis prepared"); 247 307 base.OnPrepared(); … … 259 319 260 320 protected override void OnStopped() { 261 Log.LogMessage("Datastream analysis stopped"); 262 base.OnStopped(); 321 try { 322 runsCounter++; 323 var run = new Run(); 324 run.Filename = Filename; 325 run.Name = string.Format("{0} Run {1}", Name, runsCounter); 326 CollectParameterValues(run.Parameters); 327 CollectResultValues(run.Results); 328 runs.Add(run); 329 } 330 finally { 331 Log.LogMessage("Datastream analysis stopped"); 332 base.OnStopped(); 333 } 263 334 } 264 335 265 336 #endregion 266 337 267 338 #region run 268 339 private void Run(object state) { 269 340 CancellationToken cancellationToken = (CancellationToken) state; … … 287 358 } 288 359 360 private int replayedIndex; 361 289 362 protected void Run(CancellationToken cancellationToken) { 290 291 // setup results292 var slidingWindowMovements = new IntValue(0);293 Results.Add(new Result("Sliding Window Movements", slidingWindowMovements));294 295 var qtable = new DataTable("Qualities");296 qtable.Rows.Add(new DataRow("R²"));297 qtable.Rows.Add(new DataRow("Pearson"));298 Results.Add(new Result("Qualities", qtable));299 300 var curLoss = new DoubleValue();301 Results.Add(new Result("R²", curLoss));302 Results.Add(new Result("Best Quality", curLoss));303 304 305 363 // init algorithm 306 364 var problemData = Datastream.ProblemData; 307 365 var targetVarName = problemData.TargetVariable; 308 366 var activeVariables = problemData.AllowedInputVariables; 367 368 if (prepared) { 369 // replay datastream until FitnessPartition.End 370 //for (int i = 0; i < Datastream.FitnessPartition.End; i++) { 371 // var val = problemData.Dataset.GetDoubleValue(targetVarName, i); 372 // ResultsTargets.Rows[ResultsTargetsReal].Values.Add(val); 373 //} 374 //replayedIndex = Datastream.FitnessPartition.End; 375 replayedIndex = 0; 376 prepared = false; 377 } 378 379 309 380 Random rnd = new Random(); 310 381 311 382 try { 312 while (Datastream.SlidingWindowMovementPossible) { 313 cancellationToken.ThrowIfCancellationRequested(); 314 315 Task.Delay(Datastream.SlidingWindowMovementInterval.Value); 316 317 Datastream.MoveSlidingWindow(); 318 319 // TODO do the window evaluation 320 321 // TODO: collect results and display them 322 323 curLoss.Value = rnd.Next(100); 324 qtable.Rows["R²"].Values.Add(curLoss.Value); 325 qtable.Rows["Pearson"].Values.Add(curLoss.Value % 10); 326 327 slidingWindowMovements.Value++; 328 } 329 330 // TODO: collect runs (c.f. goal seeking) 383 do { 384 do { 385 cancellationToken.ThrowIfCancellationRequested(); 386 387 Thread.Sleep(Datastream.SlidingWindowMovementInterval.Value); 388 Datastream.MoveSlidingWindow(); 389 390 if (Datastream.SlidingWindowEvaluationPossible) { 391 foreach (var ensemble in Ensembles) { 392 // TODO do the window evaluation 393 double estimatedVal = problemData.Dataset.GetDoubleValue(targetVarName, replayedIndex) 394 * (1.0 + (((double)rnd.Next(0, 30)) / 100)); 395 for (int i = replayedIndex; i < Datastream.FitnessPartition.End; i++) { 396 ResultsTargets.Rows[ensemble.Name].Values.Add(estimatedVal); 397 } 398 } 399 } 400 401 // replay datastream until FitnessPartition.End 402 for (int i = replayedIndex; i < Datastream.FitnessPartition.End; i++) { 403 var val = problemData.Dataset.GetDoubleValue(targetVarName, i); 404 ResultsTargets.Rows[ResultsTargetsReal].Values.Add(val); 405 } 406 replayedIndex = Datastream.FitnessPartition.End; 407 408 409 // TODO: collect results and display them 410 411 int exp = rnd.Next(100); 412 ResultsQualities.Rows[ResultsQualitiesR2].Values.Add(exp); 413 ResultsQualities.Rows[ResultsQualitiesPearson].Values.Add((double)exp / 10); 414 ResultsSlidingWindowMovements++; 415 ResultsBestQuality = (double)exp / 42; 416 417 } while (Datastream.SlidingWindowMovementPossible); 418 } while (Datastream.UpdateAvailable); 419 finished = true; 331 420 } 332 421 catch (Exception ex) { … … 349 438 } 350 439 440 public void CollectParameterValues(IDictionary<string, IItem> values) { 441 values.Add("Datastream Analysis Name", new StringValue(Name)); 442 if (Datastream != null) { 443 Datastream.CollectParameterValues(values); 444 values.Add("Datastream Name", new StringValue(Datastream.Name)); 445 } 446 } 447 351 448 public void CollectResultValues(IDictionary<string, IItem> values) { 352 449 values.Add("Execution Time", new TimeSpanValue(ExecutionTime)); 353 450 Results.CollectResultValues(values); 354 451 } 452 #endregion 355 453 356 454 #region events 455 456 #region events registration 357 457 358 458 public EventHandler EnsemblesChanged; … … 367 467 } 368 468 469 protected virtual void RegisterDatastreamEvents() { 470 datastream.Reset += new EventHandler(Datastream_Reset); 471 datastream.ProblemDataChanged += new EventHandler(Datastream_ProblemDataChanged); 472 } 473 474 protected virtual void DeregisterDatastreamEvents() { 475 datastream.Reset -= new EventHandler(Datastream_Reset); 476 datastream.ProblemDataChanged -= new EventHandler(Datastream_ProblemDataChanged); 477 } 478 479 protected virtual void RegisterEnsembleEvents() { 480 ensembles.ItemsAdded += new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_ItemsChanged); 481 ensembles.ItemsMoved += new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_ItemsChanged); 482 ensembles.ItemsRemoved += new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_ItemsChanged); 483 ensembles.ItemsReplaced += new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_ItemsChanged); 484 ensembles.CollectionReset += new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_Reset); 485 } 486 487 protected virtual void DeregisterEnsembleEvents() { 488 ensembles.ItemsAdded -= new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_ItemsChanged); 489 ensembles.ItemsMoved -= new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_ItemsChanged); 490 ensembles.ItemsRemoved -= new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_ItemsChanged); 491 ensembles.ItemsReplaced -= new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_ItemsChanged); 492 ensembles.CollectionReset -= new CollectionItemsChangedEventHandler<IndexedItem<RegressionEnsembleModel>>(Ensembles_Reset); 493 } 494 #endregion 495 496 #region event handling 497 369 498 protected virtual void Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) { 370 499 runsCounter = runs.Count; 371 500 } 372 501 373 #region event handling 502 protected virtual void Datastream_Reset(object sender, EventArgs e) { 503 Prepare(); 504 } 505 506 protected virtual void Datastream_ProblemDataChanged(object sender, EventArgs e) { 507 Prepare(); 508 } 509 510 protected virtual void Ensembles_Reset(object sender, EventArgs e) { 511 Prepare(); 512 } 513 514 protected virtual void Ensembles_ItemsChanged(object sender, EventArgs e) { 515 Prepare(); 516 } 374 517 375 518 private void OnEnsemblesChanged() { … … 389 532 #endregion 390 533 391 #region nameditem 392 393 [Storable] protected string name; 534 #region NamedItem 535 536 [Storable] 537 protected string name; 394 538 395 539 /// <inheritdoc/>
Note: See TracChangeset
for help on using the changeset viewer.