Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Core/3.3/OperatorGraph.cs @ 2664

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

Abandoned policy that the names of all abstract base classes have to end in "Base" (#95)

File size: 9.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 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.Text;
25using System.Xml;
26using System.Linq;
27using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
28using HeuristicLab.Common;
29using HeuristicLab.Collections;
30
31namespace HeuristicLab.Core {
32  /// <summary>
33  /// Represents a graph of operators.
34  /// </summary>
35  [Item("OperatorGraph", "Represents a graph of operators.")]
36  [Creatable("Test")]
37  public class OperatorGraph : Item {
38    private OperatorSet operators;
39    /// <summary>
40    /// Gets all operators of the current instance.
41    /// </summary>
42    [Storable]
43    public OperatorSet Operators {
44      get { return operators; }
45      private set {
46        DeregisterOperatorsEvents();
47        operators = value;
48        RegisterOperatorsEvents();
49      }
50    }
51
52    [Storable]
53    private IOperator initialOperator;
54    /// <summary>
55    /// Gets or sets the initial operator (the starting one).
56    /// </summary>
57    /// <remarks>Calls <see cref="OnInitialOperatorChanged"/> in the setter.</remarks>
58    public IOperator InitialOperator {
59      get { return initialOperator; }
60      set {
61        if (initialOperator != value) {
62          if (value != null) Operators.Add(value);
63          initialOperator = value;
64          OnInitialOperatorChanged();
65        }
66      }
67    }
68
69    /// <summary>
70    /// Initializes a new instance of <see cref="OperatorGraph"/>.
71    /// </summary>
72    public OperatorGraph() {
73      Operators = new OperatorSet();
74      initialOperator = null;
75    }
76
77    /// <summary>
78    /// Clones the current instance (deep clone).
79    /// </summary>
80    /// <remarks>Deep clone through <see cref="cloner.Clone"/> method of helper class
81    /// <see cref="Auxiliary"/>.</remarks>
82    /// <param name="clonedObjects">Dictionary of all already cloned objects. (Needed to avoid cycles.)</param>
83    /// <returns>The cloned object as <see cref="OperatorGraph"/>.</returns>
84    public override IDeepCloneable Clone(Cloner cloner) {
85      OperatorGraph clone = new OperatorGraph();
86      cloner.RegisterClonedObject(this, clone);
87      clone.Operators = (OperatorSet)cloner.Clone(operators);
88      clone.initialOperator = (IOperator)cloner.Clone(initialOperator);
89      return clone;
90    }
91
92    /// <inheritdoc/>
93    public event EventHandler InitialOperatorChanged;
94    /// <summary>
95    /// Fires a new <c>InitialOperatorChanged</c> event.
96    /// </summary>
97    protected virtual void OnInitialOperatorChanged() {
98      if (InitialOperatorChanged != null)
99        InitialOperatorChanged(this, new EventArgs());
100      OnChanged();
101    }
102
103    #region Operators Events
104    private void AddOperator(IOperator op) {
105      RegisterOperatorEvents(op);
106      foreach (IParameter param in op.Parameters)
107        AddParameter(param);
108    }
109    private void RemoveOperator(IOperator op) {
110      foreach (IParameter param in op.Parameters)
111        RemoveParameter(param);
112      DeregisterOperatorEvents(op);
113
114      // remove edges to removed operator
115      var opParams = from o in Operators
116                     from p in o.Parameters
117                     where p is IOperatorParameter
118                     where (((IOperatorParameter)p).Value != null) && (((IOperatorParameter)p).Value == op)
119                     select (IOperatorParameter)p;
120      foreach (IOperatorParameter opParam in opParams)
121        opParam.Value = null;
122    }
123    private void AddParameter(IParameter param) {
124      IOperatorParameter opParam = param as IOperatorParameter;
125      if (opParam != null) {
126        RegisterOperatorParameterEvents(opParam);
127        if (opParam.Value != null) Operators.Add(opParam.Value);
128      }
129    }
130    private void RemoveParameter(IParameter param) {
131      IOperatorParameter opParam = param as IOperatorParameter;
132      if (opParam != null) {
133        DeregisterOperatorParameterEvents(opParam);
134      }
135    }
136
137    private void RegisterOperatorsEvents() {
138      if (operators != null) {
139        operators.Changed += new ChangedEventHandler(Operators_Changed);
140        operators.ItemsAdded += new CollectionItemsChangedEventHandler<IOperator>(Operators_ItemsAdded);
141        operators.ItemsRemoved += new CollectionItemsChangedEventHandler<IOperator>(Operators_ItemsRemoved);
142        operators.CollectionReset += new CollectionItemsChangedEventHandler<IOperator>(Operators_CollectionReset);
143      }
144    }
145    private void DeregisterOperatorsEvents() {
146      if (operators != null) {
147        operators.Changed -= new ChangedEventHandler(Operators_Changed);
148        operators.ItemsAdded -= new CollectionItemsChangedEventHandler<IOperator>(Operators_ItemsAdded);
149        operators.ItemsRemoved -= new CollectionItemsChangedEventHandler<IOperator>(Operators_ItemsRemoved);
150        operators.CollectionReset -= new CollectionItemsChangedEventHandler<IOperator>(Operators_CollectionReset);
151      }
152    }
153    private void RegisterOperatorEvents(IOperator op) {
154      op.Parameters.ItemsAdded += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsAdded);
155      op.Parameters.ItemsRemoved += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsRemoved);
156      op.Parameters.ItemsReplaced += new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsReplaced);
157      op.Parameters.CollectionReset += new CollectionItemsChangedEventHandler<IParameter>(Parameters_CollectionReset);
158    }
159    private void DeregisterOperatorEvents(IOperator op) {
160      op.Parameters.ItemsAdded -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsAdded);
161      op.Parameters.ItemsRemoved -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsRemoved);
162      op.Parameters.ItemsReplaced -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_ItemsReplaced);
163      op.Parameters.CollectionReset -= new CollectionItemsChangedEventHandler<IParameter>(Parameters_CollectionReset);
164    }
165    private void RegisterOperatorParameterEvents(IOperatorParameter opParam) {
166      opParam.ValueChanged += new EventHandler(opParam_ValueChanged);
167    }
168    private void DeregisterOperatorParameterEvents(IOperatorParameter opParam) {
169      opParam.ValueChanged -= new EventHandler(opParam_ValueChanged);
170    }
171
172    private void Operators_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IOperator> e) {
173      foreach (IOperator op in e.Items)
174        AddOperator(op);
175    }
176    private void Operators_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IOperator> e) {
177      foreach (IOperator op in e.Items)
178        RemoveOperator(op);
179      if (!Operators.Contains(InitialOperator)) InitialOperator = null;
180    }
181    private void Operators_CollectionReset(object sender, CollectionItemsChangedEventArgs<IOperator> e) {
182      foreach (IOperator op in e.OldItems)
183        RemoveOperator(op);
184      foreach (IOperator op in e.Items)
185        AddOperator(op);
186      if (!Operators.Contains(InitialOperator)) InitialOperator = null;
187    }
188    private void Parameters_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
189      foreach (IParameter param in e.Items)
190        AddParameter(param);
191    }
192    private void Parameters_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
193      foreach (IParameter param in e.Items)
194        RemoveParameter(param);
195    }
196    private void Parameters_ItemsReplaced(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
197      foreach (IParameter param in e.OldItems)
198        RemoveParameter(param);
199      foreach (IParameter param in e.Items)
200        AddParameter(param);
201    }
202    private void Parameters_CollectionReset(object sender, CollectionItemsChangedEventArgs<IParameter> e) {
203      foreach (IParameter param in e.OldItems)
204        RemoveParameter(param);
205      foreach (IParameter param in e.Items)
206        AddParameter(param);
207    }
208    private void opParam_ValueChanged(object sender, EventArgs e) {
209      IOperatorParameter opParam = (IOperatorParameter)sender;
210      if (opParam.Value != null) Operators.Add(opParam.Value);
211    }
212    private void Operators_Changed(object sender, ChangedEventArgs e) {
213      OnChanged(e);
214    }
215    #endregion
216  }
217}
Note: See TracBrowser for help on using the repository browser.