/// <summary> /// replace the child-optimizer in the experiment /// Sideeffect: the optimizerTask.Optimizer will be prepared (scopes are deleted and executionstate will be reset) /// </summary> private void UpdateOptimizerInExperiment(Optimization.Experiment experiment, OptimizerTask optimizerTask) { itemTaskLock.EnterWriteLock(); try { if (optimizerTask.IndexInParentOptimizerList < 0) { throw new IndexOutOfRangeException("IndexInParentOptimizerList must be equal or greater than zero! The Task is invalid and the optimizer-tree cannot be reassembled."); } while (experiment.Optimizers.Count < optimizerTask.IndexInParentOptimizerList) { experiment.Optimizers.Add(new UserDefinedAlgorithm("Placeholder")); // add dummy-entries to Optimizers so that its possible to insert the optimizerTask at the correct position } if (experiment.Optimizers.Count < optimizerTask.IndexInParentOptimizerList + 1) { experiment.Optimizers.Add(optimizerTask.Item); } else { // if ComputeInParallel==true, don't replace the optimizer (except it is still a Placeholder) // this is because Jobs with ComputeInParallel get submitted to hive with their child-optimizers deleted if (!optimizerTask.ComputeInParallel || experiment.Optimizers[optimizerTask.IndexInParentOptimizerList].Name == "Placeholder") { experiment.Optimizers[optimizerTask.IndexInParentOptimizerList] = optimizerTask.Item; } } } finally { itemTaskLock.ExitWriteLock(); } }
/// <summary> /// if this.Optimizer is an experiment /// Uses the child-optimizers of this.HiveTask and creates HiveTask-childs /// if this.Optimizer is a batchrun /// Creates a number of child-jobs according to repetitions /// </summary> protected override void UpdateChildHiveTasks() { base.UpdateChildHiveTasks(); childHiveTasksLock.EnterWriteLock(); try { if (Task != null && syncTasksWithOptimizers) { if (!ItemTask.ComputeInParallel) { this.childHiveTasks.Clear(); } else { if (ItemTask.Item is Optimization.Experiment) { Optimization.Experiment experiment = (Optimization.Experiment)ItemTask.Item; foreach (IOptimizer childOpt in experiment.Optimizers) { var optimizerHiveTask = new OptimizerHiveTask(childOpt); optimizerHiveTask.Task.Priority = Task.Priority; //inherit priority from parent this.childHiveTasks.Add(optimizerHiveTask); } } else if (ItemTask.Item is Optimization.BatchRun) { Optimization.BatchRun batchRun = ItemTask.OptimizerAsBatchRun; if (batchRun.Optimizer != null) { while (this.childHiveTasks.Count < batchRun.Repetitions) { var optimizerHiveTask = new OptimizerHiveTask(batchRun.Optimizer); optimizerHiveTask.Task.Priority = Task.Priority; this.childHiveTasks.Add(optimizerHiveTask); } while (this.childHiveTasks.Count > batchRun.Repetitions) { this.childHiveTasks.Remove(this.childHiveTasks.Last()); } } } } } } finally { childHiveTasksLock.ExitWriteLock(); } }
protected override void DeregisterItemTaskEvents() { base.DeregisterItemTaskEvents(); if (ItemTask != null) { if (ItemTask.Item is Optimization.Experiment) { Optimization.Experiment experiment = ItemTask.OptimizerAsExperiment; experiment.Optimizers.ItemsAdded -= new CollectionItemsChangedEventHandler <IndexedItem <IOptimizer> >(Optimizers_ItemsAdded); experiment.Optimizers.ItemsReplaced -= new CollectionItemsChangedEventHandler <IndexedItem <IOptimizer> >(Optimizers_ItemsReplaced); experiment.Optimizers.ItemsRemoved -= new CollectionItemsChangedEventHandler <IndexedItem <IOptimizer> >(Optimizers_ItemsRemoved); experiment.Optimizers.CollectionReset -= new CollectionItemsChangedEventHandler <IndexedItem <IOptimizer> >(Optimizers_CollectionReset); } else if (ItemTask.Item is Optimization.BatchRun) { Optimization.BatchRun batchRun = ItemTask.OptimizerAsBatchRun; batchRun.RepetitionsChanged -= new EventHandler(batchRun_RepetitionsChanged); batchRun.OptimizerChanged -= new EventHandler(batchRun_OptimizerChanged); } } }