Changeset 15573 for stable/HeuristicLab.Optimization
- Timestamp:
- 01/03/18 07:16:03 (7 years ago)
- Location:
- stable
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 15408-15409,15452,15560
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Optimization
- Property svn:mergeinfo changed
/branches/ParallelExperiment/HeuristicLab.Optimization (added) merged: 15337,15373,15375,15389,15394,15407 /trunk/sources/HeuristicLab.Optimization merged: 15408-15409,15452,15560
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs
r15384 r15573 21 21 22 22 using System; 23 using System.Linq;24 23 using System.Threading; 25 24 using HeuristicLab.Common; … … 80 79 try { 81 80 Run((object)cancellationTokenSource.Token); 82 } 83 catch (OperationCanceledException) { 84 } 85 catch (AggregateException ae) { 81 } catch (OperationCanceledException) { 82 } catch (AggregateException ae) { 86 83 ae.FlattenAndHandle(new[] { typeof(OperationCanceledException) }, e => OnExceptionOccurred(e)); 87 } 88 catch (Exception e) { 84 } catch (Exception e) { 89 85 OnExceptionOccurred(e); 90 86 } … … 104 100 base.Pause(); 105 101 pausePending = true; 106 CancellationTokenSource.Cancel();102 if (CancellationTokenSource != null) CancellationTokenSource.Cancel(); 107 103 } 108 104 … … 112 108 base.Stop(); 113 109 if (ExecutionState == ExecutionState.Paused) OnStopped(); 114 else CancellationTokenSource.Cancel();110 else if (CancellationTokenSource != null) CancellationTokenSource.Cancel(); 115 111 } 116 112 … … 127 123 initialized = true; 128 124 Run(cancellationToken); 129 } 130 finally { 125 } finally { 131 126 timer.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed); 132 127 timer.Stop(); -
stable/HeuristicLab.Optimization/3.3/MetaOptimizers/BatchRun.cs
r15292 r15573 258 258 if (ExecutionState == ExecutionState.Paused || ExecutionState == ExecutionState.Stopped) break; 259 259 Optimizer.Prepare(); 260 if (ExecutionState == ExecutionState.Paused || ExecutionState == ExecutionState.Stopped) break; 260 261 } 261 262 } … … 271 272 if (Optimizer.ExecutionState != ExecutionState.Started) return; 272 273 // a race-condition may occur when the optimizer has changed the state by itself in the meantime 273 try { Optimizer.Pause(); } catch (InvalidOperationException) { } 274 try { Optimizer.Pause(); } catch (InvalidOperationException) { } catch (NotSupportedException) { } 274 275 } 275 276 public void Stop() { -
stable/HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs
r15382 r15573 97 97 } 98 98 99 [Storable] 100 private int numberOfWorkers = 1; 101 public int NumberOfWorkers { 102 get { return numberOfWorkers; } 103 set { 104 if (value < 1) throw new ArgumentException("Number of Workers must not be lower than one."); 105 numberOfWorkers = value; 106 } 107 } 108 99 109 public IEnumerable<IOptimizer> NestedOptimizers { 100 110 get { … … 111 121 private bool experimentStarted = false; 112 122 private bool experimentStopped = false; 113 private readonly ManualResetEventSlim allOptimizerFinished = new ManualResetEventSlim(false); // this indicates that all started optimizers have been paused or stopped 123 124 // track already started optimizers (.StartAsync does not set the executionstate immediately) 125 // and to avoid restarting optimizers that were manually paused/stopped by the user 126 private readonly IDictionary<IOptimizer, Task> startedOptimizers = new Dictionary<IOptimizer, Task>(); 127 private IEnumerable<IOptimizer> StartableOptimizers { 128 get { 129 return Optimizers 130 .Where(x => x.ExecutionState == ExecutionState.Prepared || x.ExecutionState == ExecutionState.Paused) 131 .Where(o => !startedOptimizers.ContainsKey(o)); // all startable optimizers that were not startet yet 132 } 133 } 114 134 115 135 public Experiment() … … 155 175 experimentStarted = original.experimentStarted; 156 176 experimentStopped = original.experimentStopped; 177 numberOfWorkers = original.numberOfWorkers; 157 178 Initialize(); 158 179 } … … 192 213 if ((ExecutionState != ExecutionState.Prepared) && (ExecutionState != ExecutionState.Paused)) 193 214 throw new InvalidOperationException(string.Format("Start not allowed in execution state \"{0}\".", ExecutionState)); 194 if (!Optimizers.Any(x => x.ExecutionState == ExecutionState.Prepared || x.ExecutionState == ExecutionState.Paused)) return; 215 216 startedOptimizers.Clear(); 217 if (!StartableOptimizers.Any()) return; 195 218 196 219 experimentStarted = true; 197 220 experimentStopped = false; 198 allOptimizerFinished.Reset(); 199 IOptimizer optimizer; 200 while ((optimizer = Optimizers.FirstOrDefault(x => x.ExecutionState == ExecutionState.Prepared || x.ExecutionState == ExecutionState.Paused)) != null) { 201 // a race-condition may occur when the optimizer has changed the state by itself in the meantime 202 try { optimizer.Start(cancellationToken); } catch (InvalidOperationException) { } 203 if (ExecutionState == ExecutionState.Paused || ExecutionState == ExecutionState.Stopped) break; 204 } 205 allOptimizerFinished.Wait(); 221 222 using (var availableWorkers = new SemaphoreSlim(NumberOfWorkers, NumberOfWorkers)) { 223 while (StartableOptimizers.Any()) { 224 try { 225 availableWorkers.Wait(cancellationToken); 226 var optimizer = StartableOptimizers.FirstOrDefault(); 227 if (experimentStopped || !experimentStarted || optimizer == null) break; 228 229 var startedTask = optimizer.StartAsync(cancellationToken).ContinueWith(async t => { 230 availableWorkers.Release(); // is guaranteed to be not disposed yet because Task.WaitAll blocks before the end of the using 231 await t; // trigger a potential exception on the optimizerTask 232 }); 233 startedOptimizers.Add(optimizer, startedTask.Unwrap()); // unwrap task because lambda of .ContinueWith is async 234 } catch (InvalidOperationException) { } catch (OperationCanceledException) { } 235 } 236 237 Task.WaitAll(startedOptimizers.Values.ToArray()); // retrieve exeptions of the asyncrounously started optimizer 238 } 206 239 } 207 240 public async Task StartAsync() { await StartAsync(CancellationToken.None); } … … 218 251 foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState == ExecutionState.Started)) { 219 252 // a race-condition may occur when the optimizer has changed the state by itself in the meantime 220 try { optimizer.Pause(); } catch (InvalidOperationException) { } 253 try { optimizer.Pause(); } catch (InvalidOperationException) { } catch (NotSupportedException) { } 221 254 } 222 255 } … … 256 289 public event EventHandler Prepared; 257 290 private void OnPrepared() { 291 if (ExecutionState == ExecutionState.Prepared) return; 258 292 ExecutionState = ExecutionState.Prepared; 259 293 EventHandler handler = Prepared; … … 262 296 public event EventHandler Started; 263 297 private void OnStarted() { 298 if (ExecutionState == ExecutionState.Started) return; 264 299 ExecutionState = ExecutionState.Started; 265 300 EventHandler handler = Started; … … 268 303 public event EventHandler Paused; 269 304 private void OnPaused() { 305 if (ExecutionState == ExecutionState.Paused) return; 270 306 ExecutionState = ExecutionState.Paused; 271 allOptimizerFinished.Set();272 307 EventHandler handler = Paused; 273 308 if (handler != null) handler(this, EventArgs.Empty); … … 275 310 public event EventHandler Stopped; 276 311 private void OnStopped() { 312 if (ExecutionState == ExecutionState.Stopped) return; 277 313 ExecutionState = ExecutionState.Stopped; 278 allOptimizerFinished.Set();279 314 EventHandler handler = Stopped; 280 315 if (handler != null) handler(this, EventArgs.Empty); … … 372 407 } 373 408 private void optimizer_Paused(object sender, EventArgs e) { 374 lock (locker) 375 if (Optimizers.All(x => x.ExecutionState != ExecutionState.Started)) OnPaused(); 409 UpdateExecutionState(); 376 410 } 377 411 private void optimizer_Prepared(object sender, EventArgs e) { 378 lock (locker) 379 if (Optimizers.All(x => x.ExecutionState == ExecutionState.Prepared)) OnPrepared(); 412 UpdateExecutionState(); 380 413 } 381 414 private void optimizer_Started(object sender, EventArgs e) { … … 384 417 } 385 418 private void optimizer_Stopped(object sender, EventArgs e) { 419 UpdateExecutionState(); 420 } 421 private void UpdateExecutionState() { 422 // Execution states of the Experiment are determined using the following _basic_ rules: 423 // if any Optimizer is Started => Experiment is Started (2. if) 424 // if any Optimizer is Paused => Experiment is Paused (3. if) 425 // if any Optimizer is Prepared => Experiment is Prepared (5. if) 426 // else (all Optimizer are Stopped) => Experiment is Stopped (6. if) 427 // Additional there are two extra rules: 428 // if the Experiment is running and there are still optimizers that can be started => keep the Experiment Running (1. if) 429 // if experiment-stop is pending: Stop Experiment even if there are still Prepared Optimizer (4. if) 430 386 431 lock (locker) { 387 if (experimentStopped) { 388 if (Optimizers.All(x => (x.ExecutionState == ExecutionState.Stopped) || (x.ExecutionState == ExecutionState.Prepared))) OnStopped(); 389 } else { 390 if (experimentStarted && Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused))) return; 391 else if (Optimizers.All(x => x.ExecutionState == ExecutionState.Stopped)) OnStopped(); 392 else if (Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)) && Optimizers.All(o => o.ExecutionState != ExecutionState.Started)) OnPaused(); 393 } 394 } 395 } 432 // 1. experiment is running & further startable optimizers are available => continue executing 433 if (experimentStarted && StartableOptimizers.Any()) 434 return; 435 436 // 2. any optimizer is running => continue executing 437 if (Optimizers.Any(x => x.ExecutionState == ExecutionState.Started)) 438 return; 439 440 experimentStarted = false; 441 // 3. any optimizer is paused => experiment paused 442 if (Optimizers.Any(x => x.ExecutionState == ExecutionState.Paused)) 443 OnPaused(); 444 445 // 4. stop pending & all optimizers either stopped or prepared => experiment stopped 446 else if (experimentStopped) 447 OnStopped(); 448 449 // 5. any optimizer prepared => experiment prepared 450 else if (Optimizers.Any(x => x.ExecutionState == ExecutionState.Prepared)) 451 OnPrepared(); 452 453 // 6. (else) all optimizers stopped 454 else 455 OnStopped(); 456 } 457 } 458 396 459 private void optimizer_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) { 397 460 lock (runsLocker) {
Note: See TracChangeset
for help on using the changeset viewer.