Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2521_ProblemRefactoring/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs @ 17525

Last change on this file since 17525 was 17525, checked in by abeham, 4 years ago

#2521: working on porting orienteering problem
Open points include:

  • Visualization of OrienteeringProblemData
  • Fix visualization of solution
  • Cleanup unused classes
File size: 6.9 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Drawing;
24using HEAL.Attic;
25using HeuristicLab.Common;
26using HeuristicLab.Common.Resources;
27using HeuristicLab.Core;
28using HeuristicLab.Parameters;
29
30namespace HeuristicLab.Optimization {
31  [Item("ResultParameter", "A parameter whose value is written to a result collection.")]
32  [StorableType("CF10EF50-82B6-4A98-82C0-3C5ECED48904")]
33  public sealed class ResultParameter<T> : LookupParameter<T>, IResultParameter<T> where T : class, IItem {
34    public override Image ItemImage { get { return VSImageLibrary.Exception; } }
35    public override bool CanChangeDescription { get { return true; } }
36
37    [Storable]
38    private string resultCollectionName;
39    public string ResultCollectionName {
40      get { return resultCollectionName; }
41      set {
42        if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException();
43        else if (!value.Equals(resultCollectionName)) {
44          resultCollectionName = value;
45          OnResultCollectionNameChanged();
46        }
47      }
48    }
49
50    [Storable]
51    private T defaultValue;
52    public T DefaultValue {
53      get { return defaultValue; }
54      set {
55        if (value != defaultValue) {
56          defaultValue = value;
57          OnDefaultValueChanged();
58        }
59      }
60    }
61
62    [Storable]
63    public ResultCollection ResultCollection { get; set; }
64
65    string IResultDefinition.Name { get => ActualName; set => ActualName = value; }
66    T IResultDefinition<T>.Get(ResultCollection results) => ((IResultDefinition)this).Get(results) as T;
67    IItem IResultDefinition.Get(ResultCollection results) => results[ActualName].Value;
68
69    [StorableConstructor]
70    private ResultParameter(StorableConstructorFlag _) : base(_) { }
71    private ResultParameter(ResultParameter<T> original, Cloner cloner)
72      : base(original, cloner) {
73      resultCollectionName = original.resultCollectionName;
74      defaultValue = cloner.Clone(original.defaultValue);
75      ResultCollection = cloner.Clone(original.ResultCollection);
76    }
77    public override IDeepCloneable Clone(Cloner cloner) {
78      return new ResultParameter<T>(this, cloner);
79    }
80    public ResultParameter() : this("Anonymous", string.Empty, "Results") { }
81    public ResultParameter(string name, string description) : this(name, description, "Results") { }
82
83    public ResultParameter(string name, string description, string resultCollectionName)
84      : base(name, description, string.Empty) {
85      if (string.IsNullOrEmpty(resultCollectionName)) throw new ArgumentException("resultCollectionName");
86      this.resultCollectionName = resultCollectionName;
87      Hidden = false;
88    }
89    public ResultParameter(string name, string description, string resultCollectionName, T defaultValue)
90      : base(name, description, string.Empty) {
91      if (string.IsNullOrEmpty(resultCollectionName)) throw new ArgumentException("resultCollectionName");
92      if (defaultValue == null) throw new ArgumentNullException("defaultValue");
93      this.resultCollectionName = resultCollectionName;
94      this.defaultValue = defaultValue;
95      Hidden = false;
96    }
97
98    protected override IItem GetActualValue() {
99      ResultCollection results = ResultCollection;
100      if (results == null) {
101        if (CachedActualValue != null) {
102          results = CachedActualValue as ResultCollection;
103          if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
104        } else {
105          var tmp = ResultCollectionName;
106          // verifyType has to be disabled, because the ResultCollection may not be identical to the generic type of the parameter
107          results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
108          if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
109          CachedActualValue = results;
110        }
111      }
112
113      IResult result;
114      if (!results.TryGetValue(ActualName, out result)) {
115        if (DefaultValue == null) return null;
116        result = ItemDescription == Description ? new Result(ActualName, (T)DefaultValue.Clone()) : new Result(ActualName, Description, (T)DefaultValue.Clone());
117        results.Add(result);
118      }
119
120      var resultValue = result.Value as T;
121      if (resultValue == null)
122        throw new InvalidOperationException(string.Format("Type mismatch. Result \"{0}\" does not contain a \"{1}\".", ActualName, typeof(T).GetPrettyName()));
123
124      return resultValue;
125    }
126
127    protected override void SetActualValue(IItem value) {
128      ResultCollection results = ResultCollection;
129      if (results == null) {
130        if (CachedActualValue != null) {
131          results = CachedActualValue as ResultCollection;
132          if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
133        } else {
134          var tmp = ResultCollectionName;
135          results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
136          if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
137          CachedActualValue = results;
138        }
139      }
140
141      IResult result;
142      if (!results.TryGetValue(ActualName, out result)) {
143        result = ItemDescription == Description ? new Result(ActualName, value) : new Result(ActualName, Description, value);
144        results.Add(result);
145      } else result.Value = value;
146    }
147
148
149    public event EventHandler ResultCollectionNameChanged;
150    private void OnResultCollectionNameChanged() {
151      var handler = ResultCollectionNameChanged;
152      if (handler != null) handler(this, EventArgs.Empty);
153      OnToStringChanged();
154    }
155
156    public event EventHandler DefaultValueChanged;
157    private void OnDefaultValueChanged() {
158      EventHandler handler = DefaultValueChanged;
159      if (handler != null) handler(this, EventArgs.Empty);
160      OnItemImageChanged();
161    }
162  }
163}
Note: See TracBrowser for help on using the repository browser.