Free cookie consent management tool by TermsFeed Policy Generator

source: branches/XmlTextReaderBranch/HeuristicLab.ES/ES.cs @ 269

Last change on this file since 269 was 123, checked in by gkronber, 17 years ago

fixed more bugs (not thoroughly tested but at least it works for OSGP_NOx and OSGA_TSP)

File size: 22.2 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 HeuristicLab.Core;
27using HeuristicLab.Data;
28using HeuristicLab.SequentialEngine;
29using HeuristicLab.Operators;
30using HeuristicLab.Random;
31using HeuristicLab.Logging;
32using HeuristicLab.Selection;
33using HeuristicLab.Selection.OffspringSelection;
34using HeuristicLab.Evolutionary;
35
36namespace HeuristicLab.ES {
37  public class ES : ItemBase, IEditable {
38    #region Create Operators
39    public static void Create(IEngine engine) {
40      engine.OperatorGraph.Clear();
41
42      CombinedOperator co = CreateES();
43      co.Name = "ES";
44      engine.OperatorGraph.AddOperator(co);
45      engine.OperatorGraph.InitialOperator = co;
46
47      engine.Reset();
48    }
49    private static CombinedOperator CreateES() {
50      CombinedOperator op = new CombinedOperator();
51      SequentialProcessor sp = new SequentialProcessor();
52      op.OperatorGraph.AddOperator(sp);
53      op.OperatorGraph.InitialOperator = sp;
54
55      CombinedOperator co1 = CreateVariableInjection();
56      co1.Name = "Variable Injection";
57      op.OperatorGraph.AddOperator(co1);
58      sp.AddSubOperator(co1);
59
60      // place holder for ProblemInjector
61      EmptyOperator eo1 = new EmptyOperator();
62      eo1.Name = "ProblemInjector";
63      op.OperatorGraph.AddOperator(eo1);
64      co1.AddSubOperator(eo1);
65
66      CombinedOperator co2 = CreatePopulationInitialization();
67      co2.Name = "Population Initialization";
68      op.OperatorGraph.AddOperator(co2);
69      sp.AddSubOperator(co2);
70
71      // place holder for SolutionGenerator
72      EmptyOperator eo2 = new EmptyOperator();
73      eo2.Name = "SolutionGenerator";
74      op.OperatorGraph.AddOperator(eo2);
75      co2.AddSubOperator(eo2);
76
77      // place holder for Evaluator
78      EmptyOperator eo3 = new EmptyOperator();
79      eo3.Name = "Evaluator";
80      op.OperatorGraph.AddOperator(eo3);
81      co2.AddSubOperator(eo3);
82
83      CombinedOperator co3 = CreateESMain();
84      co3.Name = "ES Main";
85      op.OperatorGraph.AddOperator(co3);
86      sp.AddSubOperator(co3);
87
88      // place holder for Mutator
89      EmptyOperator eo4 = new EmptyOperator();
90      eo4.Name = "Mutator";
91      op.OperatorGraph.AddOperator(eo4);
92      co3.AddSubOperator(eo4);
93
94      // place holder for Evaluator
95      co3.AddSubOperator(eo3);
96
97      // place holder for Recombinator
98      EmptyOperator eo5 = new EmptyOperator();
99      eo5.Name = "Recombinator";
100      op.OperatorGraph.AddOperator(eo5);
101      co3.AddSubOperator(eo5);
102
103      return op;
104    }
105    private static CombinedOperator CreateVariableInjection() {
106      CombinedOperator op = new CombinedOperator();
107      SequentialProcessor sp = new SequentialProcessor();
108      op.OperatorGraph.AddOperator(sp);
109      op.OperatorGraph.InitialOperator = sp;
110
111      RandomInjector ri = new RandomInjector();
112      op.OperatorGraph.AddOperator(ri);
113      sp.AddSubOperator(ri);
114
115      OperatorExtractor oe = new OperatorExtractor();
116      oe.Name = "ProblemInjector";
117      oe.GetVariableInfo("Operator").ActualName = "ProblemInjector";
118      op.OperatorGraph.AddOperator(oe);
119      sp.AddSubOperator(oe);
120
121      VariableInjector vi = new VariableInjector();
122      vi.AddVariable(new Variable("ESmu", new IntData(1)));
123      vi.AddVariable(new Variable("ESrho", new IntData(1)));
124      vi.AddVariable(new Variable("ESlambda", new IntData(1)));
125      vi.AddVariable(new Variable("EvaluatedSolutions", new IntData()));
126      vi.AddVariable(new Variable("PlusNotation", new BoolData(true)));
127      vi.AddVariable(new Variable("Generations", new IntData()));
128      vi.AddVariable(new Variable("MaximumGenerations", new IntData(1000)));
129      vi.AddVariable(new Variable("LearningRate", new DoubleData(0.1)));
130      vi.AddVariable(new Variable("DampeningFactor", new DoubleData(10.0)));
131      vi.AddVariable(new Variable("ShakingFactor", new DoubleData(5.0)));
132      vi.AddVariable(new Variable("TargetSuccessProbability", new DoubleData(0.2)));
133      vi.AddVariable(new Variable("SuccessProbability", new DoubleData(0.2)));
134      vi.AddVariable(new Variable("UseSuccessRule", new BoolData(true)));
135      op.OperatorGraph.AddOperator(vi);
136      sp.AddSubOperator(vi);
137
138      return op;
139    }
140    private static CombinedOperator CreatePopulationInitialization() {
141      CombinedOperator op = new CombinedOperator();
142      SequentialProcessor sp1 = new SequentialProcessor();
143      op.OperatorGraph.AddOperator(sp1);
144      op.OperatorGraph.InitialOperator = sp1;
145
146      SubScopesCreater ssc = new SubScopesCreater();
147      ssc.GetVariableInfo("SubScopes").ActualName = "ESmu";
148      op.OperatorGraph.AddOperator(ssc);
149      sp1.AddSubOperator(ssc);
150
151      UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
152      op.OperatorGraph.AddOperator(ussp);
153      sp1.AddSubOperator(ussp);
154
155      SequentialProcessor sp2 = new SequentialProcessor();
156      op.OperatorGraph.AddOperator(sp2);
157      ussp.AddSubOperator(sp2);
158
159      OperatorExtractor oe1 = new OperatorExtractor();
160      oe1.Name = "SolutionGenerator";
161      oe1.GetVariableInfo("Operator").ActualName = "SolutionGenerator";
162      op.OperatorGraph.AddOperator(oe1);
163      sp2.AddSubOperator(oe1);
164
165      OperatorExtractor oe2 = new OperatorExtractor();
166      oe2.Name = "Evaluator";
167      oe2.GetVariableInfo("Operator").ActualName = "Evaluator";
168      op.OperatorGraph.AddOperator(oe2);
169      sp2.AddSubOperator(oe2);
170
171      Counter c = new Counter();
172      c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
173      op.OperatorGraph.AddOperator(c);
174      sp2.AddSubOperator(c);
175
176      Sorter s = new Sorter();
177      s.GetVariableInfo("Descending").ActualName = "Maximization";
178      s.GetVariableInfo("Value").ActualName = "Quality";
179      op.OperatorGraph.AddOperator(s);
180      sp1.AddSubOperator(s);
181
182      return op;
183    }
184    private static CombinedOperator CreateESMain() {
185      CombinedOperator op = new CombinedOperator();
186      SequentialProcessor sp = new SequentialProcessor();
187      op.OperatorGraph.AddOperator(sp);
188      op.OperatorGraph.InitialOperator = sp;
189
190      ESRandomSelector rs = new ESRandomSelector();
191      rs.Name = "Child Selector";
192      rs.GetVariableInfo("Lambda").ActualName = "ESlambda";
193      rs.GetVariableInfo("Rho").ActualName = "ESrho";
194      op.OperatorGraph.AddOperator(rs);
195      sp.AddSubOperator(rs);
196
197      SequentialSubScopesProcessor ssp = new SequentialSubScopesProcessor();
198      op.OperatorGraph.AddOperator(ssp);
199      sp.AddSubOperator(ssp);
200
201      EmptyOperator eo = new EmptyOperator();
202      op.OperatorGraph.AddOperator(eo);
203      ssp.AddSubOperator(eo);
204
205      CombinedOperator co1 = CreateCreateChildren();
206      co1.Name = "Create Children";
207      op.OperatorGraph.AddOperator(co1);
208      ssp.AddSubOperator(co1);
209
210      ConditionalBranch cb1 = new ConditionalBranch();
211      cb1.Name = "Plus or Comma Replacement";
212      cb1.GetVariableInfo("Condition").ActualName = "PlusNotation";
213      op.OperatorGraph.AddOperator(cb1);
214      sp.AddSubOperator(cb1);
215
216      MergingReducer mr = new MergingReducer();
217      mr.Name = "Plus Replacement";
218      op.OperatorGraph.AddOperator(mr);
219      cb1.AddSubOperator(mr);
220
221      RightReducer rr = new RightReducer();
222      rr.Name = "Comma Replacement";
223      op.OperatorGraph.AddOperator(rr);
224      cb1.AddSubOperator(rr);
225
226      CombinedOperator co2 = CreateReplacement();
227      co2.Name = "Parents Selection";
228      op.OperatorGraph.AddOperator(co2);
229      sp.AddSubOperator(co2);
230
231      QualityLogger ql = new QualityLogger();
232      op.OperatorGraph.AddOperator(ql);
233      sp.AddSubOperator(ql);
234
235      BestAverageWorstQualityCalculator bawqc = new BestAverageWorstQualityCalculator();
236      op.OperatorGraph.AddOperator(bawqc);
237      sp.AddSubOperator(bawqc);
238
239      DataCollector dc = new DataCollector();
240      ItemList<StringData> names = dc.GetVariable("VariableNames").GetValue<ItemList<StringData>>();
241      names.Add(new StringData("BestQuality"));
242      names.Add(new StringData("AverageQuality"));
243      names.Add(new StringData("WorstQuality"));
244      op.OperatorGraph.AddOperator(dc);
245      sp.AddSubOperator(dc);
246
247      LinechartInjector lci = new LinechartInjector();
248      lci.GetVariableInfo("Linechart").ActualName = "Quality Linechart";
249      lci.GetVariable("NumberOfLines").GetValue<IntData>().Data = 3;
250      op.OperatorGraph.AddOperator(lci);
251      sp.AddSubOperator(lci);
252
253      Counter c = new Counter();
254      c.GetVariableInfo("Value").ActualName = "Generations";
255      op.OperatorGraph.AddOperator(c);
256      sp.AddSubOperator(c);
257
258      LessThanComparator ltc = new LessThanComparator();
259      ltc.GetVariableInfo("LeftSide").ActualName = "Generations";
260      ltc.GetVariableInfo("RightSide").ActualName = "MaximumGenerations";
261      ltc.GetVariableInfo("Result").ActualName = "GenerationsCondition";
262      op.OperatorGraph.AddOperator(ltc);
263      sp.AddSubOperator(ltc);
264
265      ConditionalBranch cb2 = new ConditionalBranch();
266      cb2.GetVariableInfo("Condition").ActualName = "GenerationsCondition";
267      op.OperatorGraph.AddOperator(cb2);
268      sp.AddSubOperator(cb2);
269
270      cb2.AddSubOperator(sp);
271
272      return op;
273    }
274    private static CombinedOperator CreateCreateChildren() {
275      CombinedOperator op = new CombinedOperator();
276      SequentialProcessor sp1 = new SequentialProcessor();
277      op.OperatorGraph.AddOperator(sp1);
278      op.OperatorGraph.InitialOperator = sp1;
279
280      ConditionalBranch cb = new ConditionalBranch();
281      cb.GetVariableInfo("Condition").ActualName = "UseSuccessRule";
282      op.OperatorGraph.AddOperator(cb);
283      sp1.AddSubOperator(cb);
284
285      SequentialProcessor sp2 = new SequentialProcessor();
286      op.OperatorGraph.AddOperator(sp2);
287      cb.AddSubOperator(sp2);
288
289      OffspringAnalyzer oa = new OffspringAnalyzer();
290      oa.Name = "Offspring Analyzer";
291      oa.GetVariable("ParentsCount").Value = new IntData(1);
292      oa.GetVariable("ComparisonFactor").Value = new DoubleData(0.0);
293      op.OperatorGraph.AddOperator(oa);
294      sp2.AddSubOperator(oa);
295
296      SequentialProcessor sp3 = new SequentialProcessor();
297      op.OperatorGraph.AddOperator(sp3);
298      oa.AddSubOperator(sp3);
299      cb.AddSubOperator(sp3);
300
301      OperatorExtractor oe1 = new OperatorExtractor();
302      oe1.Name = "Recombinator";
303      oe1.GetVariableInfo("Operator").ActualName = "Recombinator";
304      op.OperatorGraph.AddOperator(oe1);
305      sp3.AddSubOperator(oe1);
306
307      UniformSequentialSubScopesProcessor ussp = new UniformSequentialSubScopesProcessor();
308      op.OperatorGraph.AddOperator(ussp);
309      sp3.AddSubOperator(ussp);
310
311      SequentialProcessor sp4 = new SequentialProcessor();
312      op.OperatorGraph.AddOperator(sp4);
313      ussp.AddSubOperator(sp4);
314
315      OperatorExtractor oe2 = new OperatorExtractor();
316      oe2.Name = "Mutator";
317      oe2.GetVariableInfo("Operator").ActualName = "Mutator";
318      op.OperatorGraph.AddOperator(oe2);
319      sp4.AddSubOperator(oe2);
320
321      OperatorExtractor oe3 = new OperatorExtractor();
322      oe3.Name = "Evaluator";
323      oe3.GetVariableInfo("Operator").ActualName = "Evaluator";
324      op.OperatorGraph.AddOperator(oe3);
325      sp4.AddSubOperator(oe3);
326
327      Counter c = new Counter();
328      c.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
329      op.OperatorGraph.AddOperator(c);
330      sp4.AddSubOperator(c);
331
332      SuccessRuleMutationStrengthAdjuster srmsa = new SuccessRuleMutationStrengthAdjuster();
333      srmsa.Name = "SuccessRuleMutationStrengthAdjuster";
334      op.OperatorGraph.AddOperator(srmsa);
335      sp2.AddSubOperator(srmsa);
336
337      Sorter s = new Sorter();
338      s.GetVariableInfo("Value").ActualName = "Quality";
339      s.GetVariableInfo("Descending").ActualName = "Maximization";
340      op.OperatorGraph.AddOperator(s);
341      sp1.AddSubOperator(s);
342
343      return op;
344    }
345    private static CombinedOperator CreateReplacement() {
346      CombinedOperator op = new CombinedOperator();
347      SequentialProcessor sp1 = new SequentialProcessor();
348      op.OperatorGraph.AddOperator(sp1);
349      op.OperatorGraph.InitialOperator = sp1;
350
351      Sorter s = new Sorter();
352      s.GetVariableInfo("Descending").ActualName = "Maximization";
353      s.GetVariableInfo("Value").ActualName = "Quality";
354      op.OperatorGraph.AddOperator(s);
355      sp1.AddSubOperator(s);
356
357      LeftSelector ls = new LeftSelector();
358      ls.Name = "Parents Selector";
359      ls.GetVariableInfo("Selected").ActualName = "ESmu";
360      ls.GetVariable("CopySelected").Value = new BoolData(false);
361      op.OperatorGraph.AddOperator(ls);
362      sp1.AddSubOperator(ls);
363
364      RightReducer rr = new RightReducer();
365      rr.Name = "RightReducer";
366      op.OperatorGraph.AddOperator(rr);
367      sp1.AddSubOperator(rr);
368
369      return op;
370    }
371    #endregion
372
373    #region Properties
374    private IEngine myEngine;
375    public IEngine Engine {
376      get { return myEngine; }
377    }
378    private BoolData mySetSeedRandomly;
379    public bool SetSeedRandomly {
380      get { return mySetSeedRandomly.Data; }
381      set { mySetSeedRandomly.Data = value; }
382    }
383    private IntData mySeed;
384    public int Seed {
385      get { return mySeed.Data; }
386      set {
387        mySeed.Data = value;
388        OnChanged();
389      }
390    }
391    private IntData myMu;
392    public int Mu {
393      get { return myMu.Data; }
394      set {
395        if (value > 0) {
396          myMu.Data = value;
397          if (!PlusNotation && value >= Lambda) myLambda.Data = value + 1;
398          if (value < Rho) myRho.Data = value;
399          OnChanged();
400        }
401      }
402    }
403    private IntData myRho;
404    public int Rho {
405      get { return myRho.Data; }
406      set {
407        if (value > 0) {
408          myRho.Data = value;
409          if (value > Mu) Mu = value;
410          OnChanged();
411        }
412      }
413    }
414    private IntData myLambda;
415    public int Lambda {
416      get { return myLambda.Data; }
417      set {
418        if (value > 0) {
419          if (PlusNotation) myLambda.Data = value;
420          else {
421            if (value > 1 && value < Mu) {
422              myLambda.Data = value;
423              myMu.Data = value - 1;
424            } else if (value == 1) {
425              myMu.Data = 1;
426              myLambda.Data = 2;
427            } else if (value > Mu) {
428              myLambda.Data = value;
429            }
430          }
431          OnChanged();
432        }
433      }
434    }
435    private BoolData myPlusNotation;
436    public bool PlusNotation {
437      get { return myPlusNotation.Data; }
438      set {
439        if (!value && myPlusNotation.Data) { // from plus to point
440          if (Lambda <= Mu) {
441            myLambda.Data = Mu + 1;
442          }
443        }
444        myPlusNotation.Data = value;
445        OnChanged();
446      }
447    }
448    private DoubleData myShakingFactor;
449    public double ShakingFactor {
450      get { return myShakingFactor.Data; }
451      set { myShakingFactor.Data = value; }
452    }
453    private DoubleData mySuccessProbability;
454    private DoubleData myTargetSuccessProbability;
455    public double SuccessProbability {
456      get { return myTargetSuccessProbability.Data; }
457      set {
458        myTargetSuccessProbability.Data = value;
459        mySuccessProbability.Data = value;
460      }
461    }
462    private DoubleData myLearningRate;
463    public double LearningRate {
464      get { return myLearningRate.Data; }
465      set {
466        if (value > 0.0 && value <= 1.0) {
467          myLearningRate.Data = value;
468          OnChanged();
469        }
470      }
471    }
472    private DoubleData myDampeningFactor;
473    public double DampeningFactor {
474      get { return myDampeningFactor.Data; }
475      set {
476        if (value >= 1.0) {
477          myDampeningFactor.Data = value;
478          OnChanged();
479        }
480      }
481    }
482    private IntData myMaximumGenerations;
483    public int MaximumGenerations {
484      get { return myMaximumGenerations.Data; }
485      set { myMaximumGenerations.Data = value; }
486    }
487    private BoolData myUseSuccessRule;
488    public bool UseSuccessRule {
489      get { return myUseSuccessRule.Data; }
490      set { myUseSuccessRule.Data = value; }
491    }
492    private CombinedOperator myES;
493    private IOperator myESMain;
494    private IOperator myVariableInjection;
495    public IOperator ProblemInjector {
496      get { return myVariableInjection.SubOperators[0]; }
497      set {
498        value.Name = "ProblemInjector";
499        myES.OperatorGraph.RemoveOperator(ProblemInjector.Guid);
500        myES.OperatorGraph.AddOperator(value);
501        myVariableInjection.AddSubOperator(value, 0);
502      }
503    }
504    private IOperator myPopulationInitialization;
505    public IOperator SolutionGenerator {
506      get { return myPopulationInitialization.SubOperators[0]; }
507      set {
508        value.Name = "SolutionGenerator";
509        myES.OperatorGraph.RemoveOperator(SolutionGenerator.Guid);
510        myES.OperatorGraph.AddOperator(value);
511        myPopulationInitialization.AddSubOperator(value, 0);
512      }
513    }
514    public IOperator Evaluator {
515      get { return myPopulationInitialization.SubOperators[1]; }
516      set {
517        value.Name = "Evaluator";
518        myES.OperatorGraph.RemoveOperator(Evaluator.Guid);
519        myES.OperatorGraph.AddOperator(value);
520        myPopulationInitialization.AddSubOperator(value, 1);
521        myESMain.AddSubOperator(value, 1);
522      }
523    }
524    public IOperator Mutator {
525      get { return myESMain.SubOperators[0]; }
526      set {
527        value.Name = "Mutator";
528        myES.OperatorGraph.RemoveOperator(Mutator.Guid);
529        myES.OperatorGraph.AddOperator(value);
530        myESMain.AddSubOperator(value, 0);
531      }
532    }
533    public IOperator Recombinator {
534      get { return myESMain.SubOperators[2]; }
535      set {
536        value.Name = "Recombinator";
537        myES.OperatorGraph.RemoveOperator(Recombinator.Guid);
538        myES.OperatorGraph.AddOperator(value);
539        myESMain.AddSubOperator(value, 2);
540      }
541    }
542    #endregion
543
544    public ES() {
545      myEngine = new SequentialEngine.SequentialEngine();
546      Create(myEngine);
547      SetReferences();
548    }
549
550    public override IView CreateView() {
551      return new ESEditor(this);
552    }
553    public virtual IEditor CreateEditor() {
554      return new ESEditor(this);
555    }
556
557    public override object Clone(IDictionary<Guid, object> clonedObjects) {
558      ES clone = new ES();
559      clonedObjects.Add(Guid, clone);
560      clone.myEngine = (IEngine)Auxiliary.Clone(Engine, clonedObjects);
561      return clone;
562    }
563
564    #region SetReferences Method
565    private void SetReferences() {
566      // ES
567      CombinedOperator co1 = (CombinedOperator)Engine.OperatorGraph.InitialOperator;
568      myES = co1;
569      // SequentialProcessor in ES
570      SequentialProcessor sp1 = (SequentialProcessor)co1.OperatorGraph.InitialOperator;
571      // Variable Injection
572      CombinedOperator co2 = (CombinedOperator)sp1.SubOperators[0];
573      myVariableInjection = co2;
574      // SequentialProcessor in Variable Injection
575      SequentialProcessor sp2 = (SequentialProcessor)co2.OperatorGraph.InitialOperator;
576      // RandomInjector
577      RandomInjector ri = (RandomInjector)sp2.SubOperators[0];
578      mySetSeedRandomly = ri.GetVariable("SetSeedRandomly").GetValue<BoolData>();
579      mySeed = ri.GetVariable("Seed").GetValue<IntData>();
580      // VariableInjector
581      VariableInjector vi = (VariableInjector)sp2.SubOperators[2];
582      myMu = vi.GetVariable("ESmu").GetValue<IntData>();
583      myRho = vi.GetVariable("ESrho").GetValue<IntData>();
584      myLambda = vi.GetVariable("ESlambda").GetValue<IntData>();
585      myMaximumGenerations = vi.GetVariable("MaximumGenerations").GetValue<IntData>();
586      myPlusNotation = vi.GetVariable("PlusNotation").GetValue<BoolData>();
587      myShakingFactor = vi.GetVariable("ShakingFactor").GetValue<DoubleData>();
588      myTargetSuccessProbability = vi.GetVariable("TargetSuccessProbability").GetValue<DoubleData>();
589      mySuccessProbability = vi.GetVariable("SuccessProbability").GetValue<DoubleData>();
590      myLearningRate = vi.GetVariable("LearningRate").GetValue<DoubleData>();
591      myDampeningFactor = vi.GetVariable("DampeningFactor").GetValue<DoubleData>();
592      myUseSuccessRule = vi.GetVariable("UseSuccessRule").GetValue<BoolData>();
593      // Population Initialization
594      CombinedOperator co3 = (CombinedOperator)sp1.SubOperators[1];
595      myPopulationInitialization = co3;
596      // ES Main
597      CombinedOperator co4 = (CombinedOperator)sp1.SubOperators[2];
598      myESMain = co4;
599    }
600    #endregion
601
602    #region Persistence Methods
603    public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid, IStorable> persistedObjects) {
604      XmlNode node = base.GetXmlNode(name, document, persistedObjects);
605      node.AppendChild(PersistenceManager.Persist("Engine", Engine, document, persistedObjects));
606      return node;
607    }
608    //public override void Populate(XmlNode node, IDictionary<Guid, IStorable> restoredObjects) {
609    //  base.Populate(node, restoredObjects);
610    //  myEngine = (IEngine)PersistenceManager.Restore(node.SelectSingleNode("Engine"), restoredObjects);
611    //  SetReferences();
612    //}
613    public override void Populate(XmlReader reader, IDictionary<Guid, IStorable> restoredObjects) {
614      base.Populate(reader, restoredObjects);
615      reader.Read();
616      myEngine = (IEngine)PersistenceManager.Restore(reader, "Engine", restoredObjects);
617      SetReferences();
618      reader.Read();
619    }
620    #endregion
621  }
622}
Note: See TracBrowser for help on using the repository browser.