Free cookie consent management tool by TermsFeed Policy Generator

Ticket #2281: ResultsParameter3.patch

File ResultsParameter3.patch, 7.8 KB (added by mkommend, 10 years ago)

Reused parameter lookup introduced in r14037

  • branches/PerformanceComparison/HeuristicLab.Optimization/3.3/Results/IResultParameter.cs

     
    2424
    2525namespace HeuristicLab.Optimization {
    2626  public interface IResultParameter : ILookupParameter {
    27     string ResultName { get; set; }
    28     event EventHandler ResultNameChanged;
     27    //string ResultName { get; set; }
     28    //event EventHandler ResultNameChanged;
    2929  }
    3030
    31   public interface IResultParameter<T> : ILookupParameter<ResultCollection>, IResultParameter where T : class, IItem, new() {
     31  public interface IResultParameter<T> : ILookupParameter<T>, IResultParameter where T : class, IItem, new() {
     32    string ResultCollectionName { get; set; }
     33
    3234    T DefaultValue { get; set; }
    33     T ResultValue { get; set; }
     35    event EventHandler DefaultValueChanged;
    3436  }
    3537}
  • branches/PerformanceComparison/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs

     
    3030  [Item("ResultParameter", "A parameter whose value is written to a result collection.")]
    3131  [StorableClass]
    3232  [NonDiscoverableType]
    33   public sealed class ResultParameter<T> : LookupParameter<ResultCollection>, IResultParameter<T> where T : class, IItem, new() {
     33  public sealed class ResultParameter<T> : LookupParameter<T>, IResultParameter<T> where T : class, IItem, new() {
    3434
    3535    [Storable]
    36     private string resultName;
    37     public string ResultName {
    38       get { return resultName; }
     36    private string resultCollectionName;
     37    public string ResultCollectionName {
     38      get { return resultCollectionName; }
    3939      set {
    4040        if (value == null) throw new ArgumentNullException();
    41         if (string.IsNullOrWhiteSpace(value)) {
    42           resultName = Name;
    43           OnResultNameChanged();
    44         } else if (!resultName.Equals(value)) {
    45           resultName = value;
    46           OnResultNameChanged();
     41        if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException();
     42        else if (!resultCollectionName.Equals(value)) {
     43          resultCollectionName = value;
     44          OnResultCollectionNameChanged();
    4745        }
    4846      }
    4947    }
     
    6058      }
    6159    }
    6260
    63     public T ResultValue {
    64       get { return GetResultValue(); }
    65       set { SetResultValue(value); }
    66     }
    67 
    6861    [StorableConstructor]
    6962    private ResultParameter(bool deserializing) : base(deserializing) { }
    7063    private ResultParameter(ResultParameter<T> original, Cloner cloner)
    7164      : base(original, cloner) {
    72       resultName = original.resultName;
     65      resultCollectionName = original.resultCollectionName;
    7366      defaultValue = cloner.Clone(original.defaultValue);
    7467    }
    7568    public override IDeepCloneable Clone(Cloner cloner) {
    7669      return new ResultParameter<T>(this, cloner);
    7770    }
    78     public ResultParameter() : this("Anonymous") { }
    79     public ResultParameter(string name)
    80       : base(name, string.Empty, "Results") {
    81       resultName = Name;
    82       defaultValue = new T();
    83     }
    84     public ResultParameter(string name, string description) : this(name, description, new T()) { }
    85     public ResultParameter(string name, string description, T defaultValue)
    86       : base(name, description, "Results") {
     71    public ResultParameter() : this("Anonymous", string.Empty, "Results", new T()) { }
     72
     73    public ResultParameter(string name, string description, string resultCollectionName, T defaultValue)
     74      : base(name, description, string.Empty) {
    8775      if (defaultValue == null) throw new ArgumentNullException("defaultValue");
    88       resultName = Name;
     76      if (resultCollectionName == null) throw new ArgumentNullException("resultCollectionName");
     77      if (string.IsNullOrEmpty(resultCollectionName)) throw new ArgumentException("resultCollectionName");
     78
     79      this.resultCollectionName = resultCollectionName;
    8980      this.defaultValue = defaultValue;
    9081    }
    91     public ResultParameter(string name, string description, string resultName) : this(name, description, new T(), resultName) { }
    92     public ResultParameter(string name, string description, T defaultValue, string resultName)
    93       : base(name, description, "Results") {
    94       if (defaultValue == null) throw new ArgumentNullException("defaultValue");
    95       this.resultName = string.IsNullOrWhiteSpace(resultName) ? Name : resultName;
    96       this.defaultValue = defaultValue;
    97     }
    9882
    99     public override string ToString() {
    100       if (Name.Equals(ResultName)) return Name;
    101       return Name + ": " + ResultName;
    102     }
    10383
    104     private T GetResultValue() {
    105       var results = ActualValue;
     84    protected override IItem GetActualValue() {
     85      ResultCollection results;
     86      if (CachedActualValue != null) results = (ResultCollection)CachedActualValue;
     87
     88      //TODO name & type checks
     89      else results = (ResultCollection)GetActualValue(ExecutionContext, ResultCollectionName);
     90
     91      CachedActualValue = results;
     92
    10693      if (results == null)
    107         throw new InvalidOperationException("ResultParameter (" + ResultName + "): ResultCollection " + ActualName + " not found.");
     94        throw new InvalidOperationException("ResultParameter (" + Name + "): ResultCollection not found.");
    10895
    109       if (!results.ContainsKey(ResultName)) results.Add(new Result(ResultName, (T)DefaultValue.Clone()));
    110       var resultValue = results[ResultName].Value as T;
     96      //null check for default value
     97      if (!results.ContainsKey(Name)) results.Add(new Result(Name, (T)DefaultValue.Clone()));
     98
     99      var resultValue = results[Name].Value as T;
    111100      if (resultValue == null)
    112         throw new InvalidOperationException(string.Format("Type mismatch. Result \"{0}\" does not contain a \"{1}\".", ResultName, typeof(T).GetPrettyName()));
     101        throw new InvalidOperationException(string.Format("Type mismatch. Result \"{0}\" does not contain a \"{1}\".", Name, typeof(T).GetPrettyName()));
    113102
    114103      return resultValue;
    115104    }
     105    protected override void SetActualValue(IItem value) {
     106      ResultCollection results;
     107      if (CachedActualValue != null) results = (ResultCollection)CachedActualValue;
    116108
    117     private void SetResultValue(T value) {
    118       var results = ActualValue;
     109
     110      else //TODO name & type checks
     111        results = (ResultCollection)GetActualValue(ExecutionContext, ResultCollectionName);
     112
     113      CachedActualValue = results;
     114
    119115      if (results == null)
    120         throw new InvalidOperationException("ResultParameter (" + ResultName + "): ResultCollection " + ActualName + " not found.");
     116        throw new InvalidOperationException("ResultParameter (" + Name + "): ResultCollection not found.");
    121117
    122       if (!results.ContainsKey(ResultName))
    123         results.Add(new Result(ResultName, value));
    124       else results[ResultName].Value = value;
     118      if (!results.ContainsKey(Name))
     119        results.Add(new Result(Name, value));
     120      else results[Name].Value = value;
    125121    }
    126122
    127     public event EventHandler ResultNameChanged;
    128     private void OnResultNameChanged() {
    129       var handler = ResultNameChanged;
     123
     124    public event EventHandler ResultCollectionNameChanged;
     125    private void OnResultCollectionNameChanged() {
     126      var handler = ResultCollectionNameChanged;
    130127      if (handler != null) handler(this, EventArgs.Empty);
    131128      OnToStringChanged();
    132129    }