- Timestamp:
- 01/26/10 05:14:51 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Operators/3.3/CombinedOperator.cs
r2526 r2684 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Drawing; 24 25 using System.Text; 25 26 using System.Xml; 27 using HeuristicLab.Collections; 26 28 using HeuristicLab.Core; 27 29 using HeuristicLab.Data; … … 30 32 namespace HeuristicLab.Operators { 31 33 /// <summary> 32 /// Contains an operator graph and automatically injects its sub-operators into the scope it is 33 /// applied on (useful for modularization to assemble complex operators out of simpler ones). 34 /// Operator which contains an operator graph. 34 35 /// </summary> 35 public class CombinedOperator : DelegatingOperator { 36 36 [Item("CombinedOperator", "An operator which contains an operator graph.")] 37 [Creatable("Test")] 38 public sealed class CombinedOperator : StandardOperator, IOperator { 39 public override Image ItemImage { 40 get { return HeuristicLab.Common.Resources.VS2008ImageLibrary.Module; } 41 } 37 42 [Storable] 38 private string myDescription; 39 /// <summary> 40 /// Gets the description of the current instance. 41 /// </summary> 42 public override string Description { 43 get { return myDescription; } 43 private OperatorGraph operatorGraph; 44 public OperatorGraph OperatorGraph { 45 get { return operatorGraph; } 46 } 47 public new ParameterCollection Parameters { 48 get { 49 return base.Parameters; 50 } 51 } 52 IObservableKeyedCollection<string, IParameter> IOperator.Parameters { 53 get { return Parameters; } 54 } 55 public override bool CanChangeDescription { 56 get { return true; } 44 57 } 45 58 46 [Storable] 47 private IOperatorGraph myOperatorGraph; 48 /// <summary> 49 /// Gets the operator graph of the current instance. 50 /// </summary> 51 public IOperatorGraph OperatorGraph { 52 get { return myOperatorGraph; } 59 public CombinedOperator() 60 : base() { 61 operatorGraph = new OperatorGraph(); 53 62 } 54 63 55 /// <summary> 56 /// Initializes a new instance of <see cref="CombinedOperator"/>. 57 /// </summary> 58 public CombinedOperator() 59 : base() { 60 myDescription = 61 @"A combined operator contains a whole operator graph. It is useful for modularization to assemble complex operators out of simpler ones. 62 63 A combined operator automatically inject its sub-operators into the scope it is applied on. Thereby the names of the sub-operators are used as variable names. Those operators can be extracted again in the contained operator graph by using an OperatorExtractor. So it is possible to parameterize a combined operator with custom operators."; 64 myOperatorGraph = new OperatorGraph(); 64 public override IDeepCloneable Clone(Cloner cloner) { 65 CombinedOperator clone = (CombinedOperator)base.Clone(cloner); 66 clone.operatorGraph = (OperatorGraph)cloner.Clone(operatorGraph); 67 return base.Clone(cloner); 65 68 } 66 69 67 /// <summary> 68 /// Sets the description of the current instance. 69 /// </summary> 70 /// <remarks>Calls <see cref="OnDescriptionChanged"/>.</remarks> 71 /// <exception cref="NullReferenceException">Thrown when <paramref name="description"/> is <c>null</c>.</exception> 72 /// <param name="description">The description to set.</param> 73 public void SetDescription(string description) { 74 if (description == null) 75 throw new NullReferenceException("description must not be null"); 76 77 if (description != myDescription) { 78 myDescription = description; 79 OnDescriptionChanged(); 80 } 81 } 82 83 /// <summary> 84 /// Clones the current instance (deep clone). 85 /// </summary> 86 /// <remarks>Calls <see cref="OperatorBase.Clone 87 /// (System.Collections.Generic.IDictionary<System.Guid, object>)"/> 88 /// of base class <see cref="DelegatingOperator"/>.<br/> 89 /// Deep clone through <see cref="cloner.Clone"/> method of helper class 90 /// <see cref="Auxiliary"/>.</remarks> 91 /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param> 92 /// <returns>The cloned object as <see cref="CombinedOperator"/>.</returns> 93 public override IItem Clone(ICloner cloner) { 94 CombinedOperator clone = (CombinedOperator)base.Clone(cloner); 95 clone.myDescription = Description; 96 clone.myOperatorGraph = (IOperatorGraph)cloner.Clone(OperatorGraph); 97 return clone; 98 } 99 100 /// <summary> 101 /// Adds all sub operators to the specified <paramref name="scope"/>. 102 /// </summary> 103 /// <param name="scope">The scope where to inject the sub operators.</param> 104 /// <returns><c>null</c> if the initial operator is <c>nulll</c>, else a new 105 /// <see cref="AtomicOperation"/> with the initial operator and the given <paramref name="scope"/>.</returns> 106 public override IOperation Apply(IScope scope) { 107 if (OperatorGraph.InitialOperator != null) { 108 for (int i = 0; i < SubOperators.Count; i++) { 109 if (scope.GetVariable(SubOperators[i].Name) != null) 110 scope.RemoveVariable(SubOperators[i].Name); 111 scope.AddVariable(new Variable(SubOperators[i].Name, SubOperators[i])); 112 } 113 return new AtomicOperation(OperatorGraph.InitialOperator, scope); 114 } else { 115 return null; 116 } 117 } 118 119 /// <summary> 120 /// Occurs when the description of the current instance has been changed. 121 /// </summary> 122 public event EventHandler DescriptionChanged; 123 /// <summary> 124 /// Fires a new <c>DescriptionChanged</c> event. 125 /// </summary> 126 protected virtual void OnDescriptionChanged() { 127 if (DescriptionChanged != null) 128 DescriptionChanged(this, new EventArgs()); 70 public override ExecutionContextCollection Apply(ExecutionContext context) { 71 ExecutionContextCollection next = base.Apply(context); 72 if (operatorGraph.InitialOperator != null) 73 next.Insert(0, new ExecutionContext(context, operatorGraph.InitialOperator, context.Scope)); 74 return next; 129 75 } 130 76 }
Note: See TracChangeset
for help on using the changeset viewer.