- Timestamp:
- 02/08/10 03:43:36 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Operators/3.3/ConditionalBranch.cs
r1530 r2757 23 23 using System.Collections.Generic; 24 24 using System.Text; 25 using System.Xml; 25 26 using HeuristicLab.Core; 26 27 using HeuristicLab.Data; 28 using HeuristicLab.Parameters; 29 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 27 30 28 31 namespace HeuristicLab.Operators { 29 32 /// <summary> 30 /// Branch of (one or)two operators whose executions depend on a specificcondition.33 /// A branch of two operators whose executions depend on a condition. 31 34 /// </summary> 32 public class ConditionalBranch : OperatorBase { 33 /// <inheritdoc select="summary"/> 34 public override string Description { 35 get { return @"ConditionalBranch expects to have 1 or 2 sub-operators. 36 It will return the 1st sub-operator if ""Condition"" is true and the 2nd sub-operator if ""Condition"" equals to false. 37 38 In case a 2nd sub-operator does not exist and ""Condition"" would equal to false, Conditional Branch will not return a new operation."; } 35 [Item("ConditionalBranch", "A branch of two operators whose executions depend on a boolean condition.")] 36 [Creatable("Test")] 37 [EmptyStorableClass] 38 public class ConditionalBranch : SingleSuccessorOperator { 39 public LookupParameter<BoolData> ConditionParameter { 40 get { return (LookupParameter<BoolData>)Parameters["Condition"]; } 41 } 42 protected OperatorParameter TrueBranchParameter { 43 get { return (OperatorParameter)Parameters["TrueBranch"]; } 44 } 45 protected OperatorParameter FalseBranchParameter { 46 get { return (OperatorParameter)Parameters["FalseBranch"]; } 47 } 48 public IOperator TrueBranch { 49 get { return TrueBranchParameter.Value; } 50 set { TrueBranchParameter.Value = value; } 51 } 52 public IOperator FalseBranch { 53 get { return FalseBranchParameter.Value; } 54 set { FalseBranchParameter.Value = value; } 39 55 } 40 56 41 /// <summary>42 /// Initializes a new instance of <see cref="ConditionalBranch"/> with one variable info43 /// (<c>Condition</c>).44 /// </summary>45 57 public ConditionalBranch() 46 58 : base() { 47 AddVariableInfo(new VariableInfo("Condition", "A boolean variable that decides the branch", typeof(BoolData), VariableKind.In)); 59 Parameters.Add(new LookupParameter<BoolData>("Condition", "A boolean variable which defines which branch is executed.")); 60 Parameters.Add(new OperatorParameter("TrueBranch", "The operator which is executed if the condition is true.")); 61 Parameters.Add(new OperatorParameter("FalseBranch", "The operator which is executed if the condition is false.")); 48 62 } 49 63 50 /// <summary> 51 /// Applies the operator of branch one under a specific condition on the given 52 /// <paramref name="scope"/>, or - if existent - operator of branch two if the condition could not 53 /// be fulfilled. 54 /// </summary> 55 /// <param name="scope">The scope to apply the operators on.</param> 56 /// <returns>A new <see cref="AtomicOperation"/> with either operator 1 or operator 2 applied 57 /// to the given <paramref name="scope"/> or <c>null</c>.</returns> 58 public override IOperation Apply(IScope scope) { 59 BoolData resultData = GetVariableValue<BoolData>("Condition", scope, true); 60 bool result = resultData.Data; 61 62 if ((result) && (SubOperators.Count > 0) && (SubOperators[0] != null)) 63 return new AtomicOperation(SubOperators[0], scope); 64 else if ((!result) && (SubOperators.Count > 1) && (SubOperators[1] != null)) 65 return new AtomicOperation(SubOperators[1], scope); 66 return null; 64 public override IExecutionContext Apply() { 65 ExecutionContextCollection next = new ExecutionContextCollection(base.Apply()); 66 if (ConditionParameter.ActualValue.Value) { 67 if (TrueBranch != null) next.Insert(0, new ExecutionContext(ExecutionContext.Parent, TrueBranch, ExecutionContext.Scope)); 68 } else { 69 if (FalseBranch != null) next.Insert(0, new ExecutionContext(ExecutionContext.Parent, FalseBranch, ExecutionContext.Scope)); 70 } 71 return next; 67 72 } 68 73 }
Note: See TracChangeset
for help on using the changeset viewer.