Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/03/10 04:43:06 (14 years ago)
Author:
swagner
Message:

Operator architecture refactoring (#95)

  • worked on parameters and operators
Location:
trunk/sources/HeuristicLab.Parameters/3.3
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Parameters/3.3/HeuristicLab.Parameters-3.3.csproj

    r2714 r2740  
    4949  </ItemGroup>
    5050  <ItemGroup>
     51    <Compile Include="SubScopesItemParameter.cs" />
     52    <Compile Include="ScopeParameter.cs" />
    5153    <Compile Include="HeuristicLabParametersPlugin.cs" />
    5254    <Compile Include="ItemParameter.cs" />
  • trunk/sources/HeuristicLab.Parameters/3.3/ItemParameter.cs

    r2715 r2740  
    2929namespace HeuristicLab.Parameters {
    3030  /// <summary>
    31   /// Represents a parameter.
     31  /// A generic parameter which represents an instance of type T.
    3232  /// </summary>
    3333  [Item("ItemParameter<T>", "A generic parameter which represents an instance of type T.")]
     
    4646    }
    4747
    48     private T value;
     48    private T localValue;
    4949    [Storable]
    50     public T Value {
    51       get { return this.value; }
     50    public T LocalValue {
     51      get { return this.localValue; }
    5252      set {
    53         if (value != this.value) {
     53        if (value != this.localValue) {
    5454          if ((value != null) && (!DataType.IsInstanceOfType(value))) throw new ArgumentException("Static value does not match data type of parameter");
    55           if (this.value != null) this.value.Changed -= new ChangedEventHandler(Value_Changed);
    56           this.value = value;
    57           if (this.value != null) this.value.Changed += new ChangedEventHandler(Value_Changed);
    58           OnValueChanged();
     55          if (this.localValue != null) this.localValue.Changed -= new ChangedEventHandler(LocalValue_Changed);
     56          this.localValue = value;
     57          if (this.localValue != null) this.localValue.Changed += new ChangedEventHandler(LocalValue_Changed);
     58          OnLocalValueChanged();
    5959        }
    6060      }
     61    }
     62
     63    public T Value {
     64      get { return GetValue(); }
     65      set { SetValue(value); }
    6166    }
    6267
     
    6469      : base("Anonymous", null, typeof(T)) {
    6570      actualName = Name;
    66       Value = null;
     71      LocalValue = null;
    6772    }
    6873    public ItemParameter(string name, string description)
    6974      : base(name, description, typeof(T)) {
    70       this.actualName = Name;
    71       this.Value = null;
     75      actualName = Name;
     76      LocalValue = null;
    7277    }
    73     public ItemParameter(string name, string description, T value)
     78    public ItemParameter(string name, string description, T localValue)
    7479      : base(name, description, typeof(T)) {
    75       this.actualName = Name;
    76       this.Value = value;
     80      actualName = Name;
     81      LocalValue = localValue;
    7782    }
    7883
    79     public override IItem GetValue(ExecutionContext context) {
     84    public override IDeepCloneable Clone(Cloner cloner) {
     85      ItemParameter<T> clone = (ItemParameter<T>)base.Clone(cloner);
     86      clone.actualName = actualName;
     87      clone.LocalValue = (T)cloner.Clone(localValue);
     88      return clone;
     89    }
     90
     91    public override string ToString() {
     92      return string.Format("{0}: {1} ({2})", Name, LocalValue != null ? LocalValue.ToString() : ActualName, DataType.Name);
     93    }
     94
     95    protected ItemParameter<T> GetParameter(out string name) {
    8096      ItemParameter<T> param = this;
    81       ExecutionContext current = context;
    82       string actualName = null;
     97      ExecutionContext current = ExecutionContext;
     98      name = param.Name;
    8399      while (param != null) {
    84         if (param.Value != null) return param.Value;
    85         actualName = param.ActualName;
     100        if (param.LocalValue != null) return param;
     101        name = param.ActualName;
    86102        current = current.Parent;
    87         while ((current != null) && !current.Operator.Parameters.ContainsKey(actualName))
     103        while ((current != null) && !current.Operator.Parameters.ContainsKey(name))
    88104          current = current.Parent;
    89105        if (current != null)
     
    92108          param = null;
    93109      }
    94 
    95       IScope scope = context.Scope;
    96       while ((scope != null) && !scope.Variables.ContainsKey(actualName))
     110      return null;
     111    }
     112    protected IVariable GetVariable(string name) {
     113      IScope scope = ExecutionContext.Scope;
     114      while ((scope != null) && !scope.Variables.ContainsKey(name))
    97115        scope = scope.Parent;
    98       return scope != null ? scope.Variables[actualName].Value : null;
     116      return scope != null ? scope.Variables[actualName] : null;
    99117    }
    100 
    101     public override IDeepCloneable Clone(Cloner cloner) {
    102       ItemParameter<T> clone = (ItemParameter<T>)base.Clone(cloner);
    103       clone.actualName = actualName;
    104       clone.Value = (T)cloner.Clone(value);
    105       return clone;
     118    protected virtual T GetValue() {
     119      string name;
     120      // try to get local value from context stack
     121      ItemParameter<T> param = GetParameter(out name);
     122      if (param != null) return param.Value;
     123      else {
     124        // try to get variable from scope
     125        IVariable var = GetVariable(name);
     126        if (var != null) return (T)var.Value;
     127      }
     128      return null;
    106129    }
    107 
    108     public override string ToString() {
    109       return string.Format("{0}: {1} ({2})", Name, Value != null ? Value.ToString() : ActualName, DataType.Name);
     130    protected virtual void SetValue(T value) {
     131      string name;
     132      // try to get local value from context stack
     133      ItemParameter<T> param = GetParameter(out name);
     134      if (param != null) param.Value = value;
     135      else {
     136        // try to get variable from scope
     137        IVariable var = GetVariable(name);
     138        if (var != null) var.Value = value;
     139        else ExecutionContext.Scope.Variables.Add(new Variable(name, value));
     140      }
    110141    }
    111142
     
    116147      OnChanged();
    117148    }
    118     public event EventHandler ValueChanged;
    119     private void OnValueChanged() {
    120       if (ValueChanged != null)
    121         ValueChanged(this, new EventArgs());
     149    public event EventHandler LocalValueChanged;
     150    private void OnLocalValueChanged() {
     151      if (LocalValueChanged != null)
     152        LocalValueChanged(this, new EventArgs());
    122153      OnChanged();
    123154    }
    124 
    125     private void Value_Changed(object sender, ChangedEventArgs e) {
     155    private void LocalValue_Changed(object sender, ChangedEventArgs e) {
    126156      OnChanged(e);
    127157    }
  • trunk/sources/HeuristicLab.Parameters/3.3/OperatorParameter.cs

    r2714 r2740  
    2929namespace HeuristicLab.Parameters {
    3030  /// <summary>
    31   /// Represents a parameter.
     31  /// A parameter which represents an operator.
    3232  /// </summary>
    3333  [Item("OperatorParameter", "A parameter which represents an operator.")]
    34   [EmptyStorableClass]
    3534  [Creatable("Test")]
    36   public class OperatorParameter : ItemParameter<IOperator>, IOperatorParameter {
     35  public class OperatorParameter : Parameter, IOperatorParameter {
     36    private IOperator value;
     37    [Storable]
     38    public IOperator Value {
     39      get { return this.value; }
     40      set {
     41        if (value != this.value) {
     42          if (this.value != null) this.value.Changed -= new ChangedEventHandler(Value_Changed);
     43          this.value = value;
     44          if (this.value != null) this.value.Changed += new ChangedEventHandler(Value_Changed);
     45          OnValueChanged();
     46        }
     47      }
     48    }
     49
    3750    public OperatorParameter()
    38       : base("Anonymous", null) {
     51      : base("Anonymous", null, typeof(IOperator)) {
    3952    }
    4053    public OperatorParameter(string name, string description)
    41       : base(name, description) {
     54      : base(name, description, typeof(IOperator)) {
    4255    }
    4356    public OperatorParameter(string name, string description, IOperator value)
    44       : base(name, description, value) {
     57      : base(name, description, typeof(IOperator)) {
     58      Value = value;
     59    }
     60
     61    public override IDeepCloneable Clone(Cloner cloner) {
     62      OperatorParameter clone = (OperatorParameter)base.Clone(cloner);
     63      clone.Value = (IOperator)cloner.Clone(value);
     64      return clone;
     65    }
     66
     67    public override string ToString() {
     68      return string.Format("{0}: {1} ({2})", Name, Value != null ? Value.ToString() : "null", DataType.Name);
     69    }
     70
     71    public event EventHandler ValueChanged;
     72    private void OnValueChanged() {
     73      if (ValueChanged != null)
     74        ValueChanged(this, new EventArgs());
     75      OnChanged();
     76    }
     77    private void Value_Changed(object sender, ChangedEventArgs e) {
     78      OnChanged(e);
    4579    }
    4680  }
  • trunk/sources/HeuristicLab.Parameters/3.3/Parameter.cs

    r2714 r2740  
    2929namespace HeuristicLab.Parameters {
    3030  /// <summary>
    31   /// Represents a parameter.
     31  /// A base class for parameters.
    3232  /// </summary>
    3333  [Item("Parameter", "A base class for parameters.")]
     
    4545      get { return dataType; }
    4646    }
     47    [Storable]
     48    private ExecutionContext executionContext;
     49    public ExecutionContext ExecutionContext {
     50      get { return executionContext; }
     51      set { executionContext = value; }
     52    }
    4753
    4854    protected Parameter()
     
    5662    }
    5763
    58     public abstract IItem GetValue(ExecutionContext context);
    59 
    6064    public override IDeepCloneable Clone(Cloner cloner) {
    6165      Parameter clone = (Parameter)base.Clone(cloner);
    6266      clone.dataType = dataType;
     67      clone.executionContext = (ExecutionContext)cloner.Clone(executionContext);
    6368      return clone;
    6469    }
Note: See TracChangeset for help on using the changeset viewer.