Free cookie consent management tool by TermsFeed Policy Generator

source: branches/OKB (trunk integration)/HeuristicLab.Clients.OKB/3.3/OKBProblem.cs @ 5338

Last change on this file since 5338 was 5338, checked in by swagner, 13 years ago

Worked on OKB (#1174)

File size: 9.5 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 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.Collections.Generic;
24using System.Drawing;
25using System.IO;
26using System.Linq;
27using HeuristicLab.Common;
28using HeuristicLab.Core;
29using HeuristicLab.Optimization;
30using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
31using HeuristicLab.Persistence.Default.Xml;
32
33namespace HeuristicLab.Clients.OKB {
34  [Item("OKB Problem", "Represents a problem which is stored in the OKB.")]
35  [StorableClass]
36  public class OKBProblem : Item, IProblem, IStorableContent {
37    public string Filename { get; set; }
38
39    public override Image ItemImage {
40      get { return Problem == null ? HeuristicLab.Common.Resources.VSImageLibrary.Type : Problem.ItemImage; }
41    }
42
43    public string Name {
44      get { return Problem == null ? ItemName : Problem.Name; }
45      set { throw new NotSupportedException("Name cannot be changed."); }
46    }
47    public string Description {
48      get { return Problem == null ? ItemDescription : Problem.Description; }
49      set { throw new NotSupportedException("Description cannot be changed."); }
50    }
51    public bool CanChangeName {
52      get { return false; }
53    }
54    public bool CanChangeDescription {
55      get { return false; }
56    }
57
58    public IKeyedItemCollection<string, IParameter> Parameters {
59      get { return Problem == null ? null : Problem.Parameters; }
60    }
61
62    public virtual Type ProblemType {
63      get { return typeof(IProblem); }
64    }
65    private long problemId;
66    public long ProblemId {
67      get { return problemId; }
68    }
69    private IProblem problem;
70    public IProblem Problem {
71      get { return problem; }
72      private set {
73        if (value == null) throw new ArgumentNullException("Problem");
74        if (value != problem) {
75          CancelEventArgs<string> e = new CancelEventArgs<string>(value.Name);
76          OnNameChanging(e);
77          if (!e.Cancel) {
78            DeregisterProblemEvents();
79            problem = value;
80            RegisterProblemEvents();
81
82            OnToStringChanged();
83            OnItemImageChanged();
84            OnNameChanged();
85            OnDescriptionChanged();
86            OnProblemChanged();
87            OnSolutionCreatorChanged();
88            OnEvaluatorChanged();
89            OnOperatorsChanged();
90            OnReset();
91          }
92        }
93      }
94    }
95
96    public IParameter SolutionCreatorParameter {
97      get { return Problem == null ? null : Problem.SolutionCreatorParameter; }
98    }
99    public ISolutionCreator SolutionCreator {
100      get { return Problem == null ? null : Problem.SolutionCreator; }
101    }
102    public IParameter EvaluatorParameter {
103      get { return Problem == null ? null : Problem.EvaluatorParameter; }
104    }
105    public IEvaluator Evaluator {
106      get { return Problem == null ? null : Problem.Evaluator; }
107    }
108    public IEnumerable<IOperator> Operators {
109      get { return Problem == null ? Enumerable.Empty<IOperator>() : Problem.Operators; }
110    }
111
112    #region Persistence Properties
113    [Storable(Name = "ProblemId")]
114    private long StorableProblemId {
115      get { return problemId; }
116      set { problemId = value; }
117    }
118    [Storable(Name = "Problem")]
119    private IProblem StorableProblem {
120      get { return Problem; }
121      set { Problem = value; }
122    }
123    #endregion
124
125    [StorableConstructor]
126    protected OKBProblem(bool deserializing) : base(deserializing) { }
127    protected OKBProblem(OKBProblem original, Cloner cloner)
128      : base(original, cloner) {
129      problemId = original.problemId;
130      problem = cloner.Clone(original.problem);
131    }
132    protected OKBProblem()
133      : base() {
134      problemId = -1;
135    }
136
137    public override IDeepCloneable Clone(Cloner cloner) {
138      return new OKBProblem(this, cloner);
139    }
140
141    public void Load(long problemId) {
142      if (this.problemId != problemId) {
143        IProblem problem;
144        ProblemData problemData = OKBClient.Instance.GetProblemData(problemId);
145        using (MemoryStream stream = new MemoryStream(problemData.Data)) {
146          problem = XmlParser.Deserialize<IProblem>(stream);
147        }
148        if (ProblemType.IsAssignableFrom(problem.GetType())) {
149          this.problemId = problemId;
150          Problem = problem;
151        }
152      }
153    }
154
155    public void CollectParameterValues(IDictionary<string, IItem> values) {
156      if (Problem != null) Problem.CollectParameterValues(values);
157    }
158
159    #region Events
160    public event EventHandler<CancelEventArgs<string>> NameChanging;
161    protected virtual void OnNameChanging(CancelEventArgs<string> e) {
162      var handler = NameChanging;
163      if (handler != null) handler(this, e);
164    }
165    public event EventHandler NameChanged;
166    protected virtual void OnNameChanged() {
167      var handler = NameChanged;
168      if (handler != null) handler(this, EventArgs.Empty);
169    }
170    public event EventHandler DescriptionChanged;
171    protected virtual void OnDescriptionChanged() {
172      var handler = DescriptionChanged;
173      if (handler != null) handler(this, EventArgs.Empty);
174    }
175    public event EventHandler ProblemChanged;
176    protected virtual void OnProblemChanged() {
177      EventHandler handler = ProblemChanged;
178      if (handler != null) handler(this, EventArgs.Empty);
179    }
180    public event EventHandler SolutionCreatorChanged;
181    protected virtual void OnSolutionCreatorChanged() {
182      var handler = SolutionCreatorChanged;
183      if (handler != null) handler(this, EventArgs.Empty);
184    }
185    public event EventHandler EvaluatorChanged;
186    protected virtual void OnEvaluatorChanged() {
187      var handler = EvaluatorChanged;
188      if (handler != null) handler(this, EventArgs.Empty);
189    }
190    public event EventHandler OperatorsChanged;
191    protected virtual void OnOperatorsChanged() {
192      var handler = OperatorsChanged;
193      if (handler != null) handler(this, EventArgs.Empty);
194    }
195    public event EventHandler Reset;
196    protected virtual void OnReset() {
197      var handler = Reset;
198      if (handler != null) handler(this, EventArgs.Empty);
199    }
200
201    protected virtual void RegisterProblemEvents() {
202      if (Problem != null) {
203        Problem.ToStringChanged += new EventHandler(Problem_ToStringChanged);
204        Problem.ItemImageChanged += new EventHandler(Problem_ItemImageChanged);
205        Problem.NameChanging += new EventHandler<CancelEventArgs<string>>(Problem_NameChanging);
206        Problem.NameChanged += new EventHandler(Problem_NameChanged);
207        Problem.DescriptionChanged += new EventHandler(Problem_DescriptionChanged);
208        Problem.SolutionCreatorChanged += new EventHandler(Problem_SolutionCreatorChanged);
209        Problem.EvaluatorChanged += new EventHandler(Problem_EvaluatorChanged);
210        Problem.OperatorsChanged += new EventHandler(Problem_OperatorsChanged);
211        Problem.Reset += new EventHandler(Problem_Reset);
212      }
213    }
214    protected virtual void DeregisterProblemEvents() {
215      if (Problem != null) {
216        Problem.ToStringChanged -= new EventHandler(Problem_ToStringChanged);
217        Problem.ItemImageChanged -= new EventHandler(Problem_ItemImageChanged);
218        Problem.NameChanging -= new EventHandler<CancelEventArgs<string>>(Problem_NameChanging);
219        Problem.NameChanged -= new EventHandler(Problem_NameChanged);
220        Problem.DescriptionChanged -= new EventHandler(Problem_DescriptionChanged);
221        Problem.SolutionCreatorChanged -= new EventHandler(Problem_SolutionCreatorChanged);
222        Problem.EvaluatorChanged -= new EventHandler(Problem_EvaluatorChanged);
223        Problem.OperatorsChanged -= new EventHandler(Problem_OperatorsChanged);
224        Problem.Reset -= new EventHandler(Problem_Reset);
225      }
226    }
227
228    private void Problem_ToStringChanged(object sender, EventArgs e) {
229      OnToStringChanged();
230    }
231    private void Problem_ItemImageChanged(object sender, EventArgs e) {
232      OnItemImageChanged();
233    }
234    private void Problem_NameChanging(object sender, CancelEventArgs<string> e) {
235      OnNameChanging(e);
236    }
237    private void Problem_NameChanged(object sender, EventArgs e) {
238      OnNameChanged();
239    }
240    private void Problem_DescriptionChanged(object sender, EventArgs e) {
241      OnDescriptionChanged();
242    }
243    private void Problem_SolutionCreatorChanged(object sender, EventArgs e) {
244      OnSolutionCreatorChanged();
245    }
246    private void Problem_EvaluatorChanged(object sender, EventArgs e) {
247      OnEvaluatorChanged();
248    }
249    private void Problem_OperatorsChanged(object sender, EventArgs e) {
250      OnOperatorsChanged();
251    }
252    private void Problem_Reset(object sender, EventArgs e) {
253      OnReset();
254    }
255    #endregion
256  }
257}
Note: See TracBrowser for help on using the repository browser.