Free cookie consent management tool by TermsFeed Policy Generator

source: branches/XmlReaderWriterBranch/HeuristicLab.Core/EngineBase.cs @ 125

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

created a branch that combines the XmlReader and XmlWriter branches

File size: 8.6 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.Threading;
27
28namespace HeuristicLab.Core {
29  public abstract class EngineBase : ItemBase, IEngine {
30    protected IOperatorGraph myOperatorGraph;
31    public IOperatorGraph OperatorGraph {
32      get { return myOperatorGraph; }
33    }
34    protected IScope myGlobalScope;
35    public IScope GlobalScope {
36      get { return myGlobalScope; }
37    }
38
39    private TimeSpan myExecutionTime;
40    public TimeSpan ExecutionTime {
41      get { return myExecutionTime; }
42      protected set {
43        myExecutionTime = value;
44        OnExecutionTimeChanged();
45      }
46    }
47
48    protected Stack<IOperation> myExecutionStack;
49    public Stack<IOperation> ExecutionStack {
50      get { return myExecutionStack; }
51    }
52    protected bool myRunning;
53    public bool Running {
54      get { return myRunning; }
55    }
56    protected bool myCanceled;
57    public bool Canceled {
58      get { return myCanceled; }
59    }
60    public virtual bool Terminated {
61      get { return ExecutionStack.Count == 0; }
62    }
63
64    protected EngineBase() {
65      myOperatorGraph = new OperatorGraph();
66      myGlobalScope = new Scope("Global");
67      myExecutionStack = new Stack<IOperation>();
68      Reset();
69    }
70
71    public override object Clone(IDictionary<Guid, object> clonedObjects) {
72      EngineBase clone = (EngineBase)base.Clone(clonedObjects);
73      clone.myOperatorGraph = (IOperatorGraph)Auxiliary.Clone(OperatorGraph, clonedObjects);
74      clone.myGlobalScope = (IScope)Auxiliary.Clone(GlobalScope, clonedObjects);
75      clone.myExecutionTime = ExecutionTime;
76      IOperation[] operations = new IOperation[ExecutionStack.Count];
77      ExecutionStack.CopyTo(operations, 0);
78      for (int i = operations.Length - 1; i >= 0; i--)
79        clone.myExecutionStack.Push((IOperation)Auxiliary.Clone(operations[i], clonedObjects));
80      clone.myRunning = Running;
81      clone.myCanceled = Canceled;
82      return clone;
83     
84    }
85
86    public virtual void Execute() {
87      myRunning = true;
88      myCanceled = false;
89      ThreadPool.QueueUserWorkItem(new WaitCallback(Run), null);
90    }
91    public virtual void ExecuteSteps(int steps) {
92      myRunning = true;
93      myCanceled = false;
94      ThreadPool.QueueUserWorkItem(new WaitCallback(Run), steps);
95    }
96    public void ExecuteStep() {
97      ExecuteSteps(1);
98    }
99    public virtual void Abort() {
100      myCanceled = true;
101    }
102    public virtual void Reset() {
103      myCanceled = false;
104      myRunning = false;
105      GlobalScope.Clear();
106      ExecutionTime = new TimeSpan();
107      myExecutionStack.Clear();
108      if (OperatorGraph.InitialOperator != null)
109        myExecutionStack.Push(new AtomicOperation(OperatorGraph.InitialOperator, GlobalScope));
110      OnInitialized();
111    }
112
113    private void Run(object state) {
114      if (state == null) Run();
115      else RunSteps((int)state);
116      myRunning = false;
117      OnFinished();
118    }
119    private void Run() {
120      DateTime start = DateTime.Now;
121      DateTime end;
122      while ((!Canceled) && (!Terminated)) {
123        ProcessNextOperation();
124        end = DateTime.Now;
125        ExecutionTime += end - start;
126        start = end;
127      }
128      ExecutionTime += DateTime.Now - start;
129    }
130    private void RunSteps(int steps) {
131      DateTime start = DateTime.Now;
132      DateTime end;
133      int step = 0;
134      while ((!Canceled) && (!Terminated) && (step < steps)) {
135        ProcessNextOperation();
136        step++;
137        end = DateTime.Now;
138        ExecutionTime += end - start;
139        start = end;
140      }
141      ExecutionTime += DateTime.Now - start;
142    }
143
144    protected abstract void ProcessNextOperation();
145
146    public event EventHandler Initialized;
147    protected virtual void OnInitialized() {
148      if (Initialized != null)
149        Initialized(this, new EventArgs());
150    }
151    public event EventHandler<OperationEventArgs> OperationExecuted;
152    protected virtual void OnOperationExecuted(IOperation operation) {
153      if (OperationExecuted != null)
154        OperationExecuted(this, new OperationEventArgs(operation));
155    }
156    public event EventHandler<ExceptionEventArgs> ExceptionOccurred;
157    protected virtual void OnExceptionOccurred(Exception exception) {
158      Abort();
159      if (ExceptionOccurred != null)
160        ExceptionOccurred(this, new ExceptionEventArgs(exception));
161    }
162    public event EventHandler ExecutionTimeChanged;
163    protected virtual void OnExecutionTimeChanged() {
164      if (ExecutionTimeChanged != null)
165        ExecutionTimeChanged(this, new EventArgs());
166    }
167    public event EventHandler Finished;
168    protected virtual void OnFinished() {
169      if (Finished != null)
170        Finished(this, new EventArgs());
171    }
172
173    #region Persistence Methods
174    //public override XmlNode GetXmlNode(string name, XmlDocument document, IDictionary<Guid,IStorable> persistedObjects) {
175    //  XmlNode node = base.GetXmlNode(name, document, persistedObjects);
176
177    //  node.AppendChild(PersistenceManager.Persist("OperatorGraph", OperatorGraph, document, persistedObjects));
178    //  node.AppendChild(PersistenceManager.Persist("GlobalScope", GlobalScope, document, persistedObjects));
179
180    //  XmlNode stackNode = document.CreateNode(XmlNodeType.Element, "ExecutionStack", null);
181    //  IOperation[] operations = new IOperation[ExecutionStack.Count];
182    //  ExecutionStack.CopyTo(operations, 0);
183    //  for (int i = 0; i < operations.Length; i++)
184    //    stackNode.AppendChild(PersistenceManager.Persist(operations[i], document, persistedObjects));
185    //  node.AppendChild(stackNode);
186
187    //  XmlNode timeNode = document.CreateNode(XmlNodeType.Element, "ExecutionTime", null);
188    //  timeNode.InnerText = ExecutionTime.ToString();
189    //  node.AppendChild(timeNode);
190    //  return node;
191    //}
192    public override void Persist(string name, XmlWriter writer, IDictionary<Guid, IStorable> persistedObjects) {
193      base.Persist(name, writer, persistedObjects);
194      PersistenceManager.Persist("OperatorGraph", OperatorGraph, writer, persistedObjects);
195      PersistenceManager.Persist("GlobalScope", GlobalScope, writer, persistedObjects);
196      writer.WriteStartElement("ExecutionStack");
197      IOperation[] operations = new IOperation[ExecutionStack.Count];
198      ExecutionStack.CopyTo(operations, 0);
199      for (int i = 0; i < operations.Length; i++)
200          PersistenceManager.Persist(operations[i], writer, persistedObjects);
201      writer.WriteEndElement(); // </ExecutionStack>
202      writer.WriteStartElement("ExecutionTime");
203      writer.WriteValue(ExecutionTime.ToString());
204      writer.WriteEndElement(); // </ExecutionTime>
205    }
206    public override void Populate(XmlReader reader, IDictionary<Guid,IStorable> restoredObjects) {
207      base.Populate(reader, restoredObjects);
208      reader.Read();
209      myOperatorGraph = (IOperatorGraph)PersistenceManager.Restore(reader, "OperatorGraph", restoredObjects);
210      reader.Skip();
211      myGlobalScope = (IScope)PersistenceManager.Restore(reader, "GlobalScope", restoredObjects);
212      reader.Skip();
213      if(reader.Name!="ExecutionStack") throw new XmlException("Expected \"ExecutionStack\", found: \""+reader.Name+"\"");
214      List<IOperation> operationList = new List<IOperation>();
215      if(!reader.IsEmptyElement) {
216        reader.Read();
217        while(reader.IsStartElement()) {
218          operationList.Insert(0, (IOperation)PersistenceManager.Restore(reader, restoredObjects));
219          reader.Skip();
220        }
221        reader.ReadEndElement();
222      } else {
223        reader.Read();
224      }
225      foreach(IOperation op in operationList)
226        myExecutionStack.Push(op);
227      myExecutionTime = TimeSpan.Parse(reader.ReadElementString("ExecutionTime"));
228    }
229    #endregion
230  }
231}
Note: See TracBrowser for help on using the repository browser.