Changeset 8331 for branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Experiment.cs
- Timestamp:
- 07/26/12 09:51:13 (12 years ago)
- Location:
- branches/ScatterSearch (trunk integration)
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/ScatterSearch (trunk integration)
- Property svn:ignore
-
old new 21 21 protoc.exe 22 22 _ReSharper.HeuristicLab 3.3 Tests 23 Google.ProtocolBuffers-2.4.1.473.dll
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
branches/ScatterSearch (trunk integration)/HeuristicLab.Optimization/3.3/Experiment.cs
r8086 r8331 178 178 experimentStarted = false; 179 179 experimentStopped = false; 180 foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState != ExecutionState.Started)) 181 //if (clearRuns || optimizer.ExecutionState != ExecutionState.Prepared) 182 optimizer.Prepare(clearRuns); 180 foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState != ExecutionState.Started)) { 181 // a race-condition may occur when the optimizer has changed the state by itself in the meantime 182 try { optimizer.Prepare(clearRuns); } catch (InvalidOperationException) { } 183 } 183 184 } 184 185 public void Start() { … … 190 191 experimentStopped = false; 191 192 IOptimizer optimizer = Optimizers.FirstOrDefault(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)); 192 if (optimizer != null) optimizer.Start(); 193 if (optimizer != null) { 194 // a race-condition may occur when the optimizer has changed the state by itself in the meantime 195 try { optimizer.Start(); } catch (InvalidOperationException) { } 196 } 193 197 } 194 198 public void Pause() { … … 199 203 experimentStarted = false; 200 204 experimentStopped = false; 201 foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState == ExecutionState.Started)) 202 optimizer.Pause(); 205 foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState == ExecutionState.Started)) { 206 // a race-condition may occur when the optimizer has changed the state by itself in the meantime 207 try { optimizer.Pause(); } catch (InvalidOperationException) { } 208 } 203 209 } 204 210 public void Stop() { … … 210 216 experimentStopped = true; 211 217 if (Optimizers.Any(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused))) { 212 foreach (IOptimizer optimizer in Optimizers.Where(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused))) 213 optimizer.Stop(); 218 foreach (var optimizer in Optimizers.Where(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused))) { 219 // a race-condition may occur when the optimizer has changed the state by itself in the meantime 220 try { optimizer.Stop(); } catch (InvalidOperationException) { } 221 } 214 222 } else { 215 223 OnStopped(); … … 326 334 optimizer.Runs.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(optimizer_Runs_ItemsRemoved); 327 335 } 336 337 private readonly object locker = new object(); 328 338 private void optimizer_ExceptionOccurred(object sender, EventArgs<Exception> e) { 329 OnExceptionOccurred(e.Value); 339 lock (locker) 340 OnExceptionOccurred(e.Value); 330 341 } 331 342 private void optimizer_ExecutionTimeChanged(object sender, EventArgs e) { 332 ExecutionTime = Optimizers.Aggregate(TimeSpan.Zero, (t, o) => t + o.ExecutionTime); 343 lock (locker) 344 ExecutionTime = Optimizers.Aggregate(TimeSpan.Zero, (t, o) => t + o.ExecutionTime); 333 345 } 334 346 private void optimizer_Paused(object sender, EventArgs e) { 335 if (Optimizers.All(x => x.ExecutionState != ExecutionState.Started)) OnPaused(); 347 lock (locker) 348 if (Optimizers.All(x => x.ExecutionState != ExecutionState.Started)) OnPaused(); 336 349 } 337 350 private void optimizer_Prepared(object sender, EventArgs e) { 338 if (Optimizers.All(x => x.ExecutionState == ExecutionState.Prepared)) OnPrepared(); 351 lock (locker) 352 if (Optimizers.All(x => x.ExecutionState == ExecutionState.Prepared)) OnPrepared(); 339 353 } 340 354 private void optimizer_Started(object sender, EventArgs e) { 341 if (ExecutionState != ExecutionState.Started) OnStarted(); 355 lock (locker) 356 if (ExecutionState != ExecutionState.Started) OnStarted(); 342 357 } 343 358 private void optimizer_Stopped(object sender, EventArgs e) { 344 if (experimentStopped) { 345 if (Optimizers.All(x => (x.ExecutionState == ExecutionState.Stopped) || (x.ExecutionState == ExecutionState.Prepared))) OnStopped(); 346 } else { 347 if (experimentStarted && Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused))) { 348 Optimizers.First(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)).Start(); 349 } else if (Optimizers.All(x => x.ExecutionState == ExecutionState.Stopped)) OnStopped(); 350 else if (Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)) && Optimizers.All(o => o.ExecutionState != ExecutionState.Started)) OnPaused(); 359 lock (locker) { 360 if (experimentStopped) { 361 if (Optimizers.All(x => (x.ExecutionState == ExecutionState.Stopped) || (x.ExecutionState == ExecutionState.Prepared))) OnStopped(); 362 } else { 363 if (experimentStarted && Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused))) { 364 Optimizers.First(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)).Start(); 365 } else if (Optimizers.All(x => x.ExecutionState == ExecutionState.Stopped)) OnStopped(); 366 else if (Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)) && Optimizers.All(o => o.ExecutionState != ExecutionState.Started)) OnPaused(); 367 } 351 368 } 352 369 } 353 370 private void optimizer_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) { 354 Runs.RemoveRange(e.OldItems); 355 Runs.AddRange(e.Items); 371 lock (locker) { 372 Runs.RemoveRange(e.OldItems); 373 Runs.AddRange(e.Items); 374 } 356 375 } 357 376 private void optimizer_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) { 358 Runs.AddRange(e.Items); 377 lock (locker) 378 Runs.AddRange(e.Items); 359 379 } 360 380 private void optimizer_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) { 361 Runs.RemoveRange(e.Items); 381 lock (locker) 382 Runs.RemoveRange(e.Items); 362 383 } 363 384
Note: See TracChangeset
for help on using the changeset viewer.