Free cookie consent management tool by TermsFeed Policy Generator

source: branches/OKB/HeuristicLab.OKB.AlgorithmHost/AlgorithmContainer.cs @ 4311

Last change on this file since 4311 was 4311, checked in by swagner, 14 years ago

Integrated OKB clients for HL 3.3 (#1166)

File size: 4.0 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using HeuristicLab.Optimization;
6using HeuristicLab.Data;
7using HeuristicLab.Collections;
8using HeuristicLab.Core;
9using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
10using HeuristicLab.Common.Resources;
11using HeuristicLab.Common;
12
13namespace HeuristicLab.OKB.AlgorithmHost {
14
15  [Item("Algorithm Container", "Encapsulates algorithm & parameters for storing in the OKB")] 
16  [StorableClass]
17  public class AlgorithmContainer : ParameterizedNamedItemContainer {
18
19    public AlgorithmContainer() {
20      ResultMapping = new ObservableDictionary<string, string>();
21    }
22
23    [StorableConstructor]
24    public AlgorithmContainer(bool deserializing) : base(deserializing) { }
25
26    public IAlgorithm Algorithm {
27      get { return (IAlgorithm)Item; }
28      set { Item = value; }
29    }
30
31    public override Type ItemType { get { return typeof(IAlgorithm); } }
32
33    public override string ItemName { get { return "AlgorithmContainer"; } }
34    public override string ItemDescription { get { return "Container for algorithms to be stored in the OKB"; } }
35
36
37    [Storable]
38    public ObservableDictionary<string, string> ResultMapping { get; private set; }
39
40    private ResultCollection results;
41
42    public override void InitializeMapping() {
43      base.InitializeMapping();
44      Results_CollectionReset(this, new CollectionItemsChangedEventArgs<IResult>(Enumerable.Empty<IResult>()));
45    }
46
47    protected override void RegisterItemEvents() {
48      base.RegisterItemEvents();
49      Algorithm.Prepared += new EventHandler(Algorithm_Prepared);
50      RegisterResultEvents();
51    }
52
53    protected override void DeregisterItemEvents() {
54      base.DeregisterItemEvents();
55      Algorithm.Prepared -= new EventHandler(Algorithm_Prepared);
56      DeregisterResultEvents();
57    }
58
59    private void RegisterResultEvents() {
60      results = Algorithm.Results;
61      results.CollectionReset += new CollectionItemsChangedEventHandler<IResult>(Results_CollectionReset);
62      results.ItemsAdded += new CollectionItemsChangedEventHandler<IResult>(Results_ItemsAdded);
63      results.ItemsRemoved += new CollectionItemsChangedEventHandler<IResult>(Results_ItemsRemoved);
64    }
65
66    private void DeregisterResultEvents() {
67      if (results == null) return;
68      results.CollectionReset -= new CollectionItemsChangedEventHandler<IResult>(Results_CollectionReset);
69      results.ItemsAdded -= new CollectionItemsChangedEventHandler<IResult>(Results_ItemsAdded);
70      results.ItemsRemoved -= new CollectionItemsChangedEventHandler<IResult>(Results_ItemsRemoved);
71    }
72
73    void Algorithm_Prepared(object sender, EventArgs e) {
74      DeregisterResultEvents();
75      RegisterResultEvents();
76    }
77
78    void Results_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IResult> e) {
79      foreach (var result in e.OldItems) {
80        ResultMapping.Remove(result.Name);
81      }
82    }
83
84    void Results_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IResult> e) {
85      foreach (var result in e.Items) {
86        ResultMapping.Add(result.Name, null);
87      }
88    }
89
90    void Results_CollectionReset(object sender, CollectionItemsChangedEventArgs<IResult> e) {
91      ResultMapping.Clear();
92      foreach (Result r in Algorithm.Results) {
93        ResultMapping.Add(r.Name, null);
94      }
95    }
96
97    public override HeuristicLab.Common.IDeepCloneable Clone(Cloner cloner) {
98      AlgorithmContainer clone = (AlgorithmContainer)base.Clone(cloner);
99      clone.ResultMapping = new ObservableDictionary<string, string>();
100      foreach (var item in ResultMapping) {
101        clone.ResultMapping.Add(item.Key, item.Value);
102      }
103      return clone;
104    }
105
106    public void Strip() {
107      DeregisterItemEvents();
108      DeregisterResultEvents();
109      try { Algorithm.Prepare(true); } catch (Exception) { }
110      try { Algorithm.Problem = null; } catch (Exception) { }
111    }
112  }
113}
Note: See TracBrowser for help on using the repository browser.