source: branches/CEDMA-Refactoring-Ticket419/HeuristicLab.CEDMA.Server/Executer.cs @ 1156

Last change on this file since 1156 was 1156, checked in by gkronber, 12 years ago

worked on #419

  • added function to open and display any model
  • added 'hard-coded' implementation of offspring selection GP (work in progress)
  • added properties for max. size and max. height in StandardGP
File size: 5.9 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.Windows.Forms;
26using HeuristicLab.PluginInfrastructure;
27using System.Net;
28using System.ServiceModel;
29using HeuristicLab.CEDMA.DB.Interfaces;
30using HeuristicLab.CEDMA.DB;
31using System.ServiceModel.Description;
32using System.Linq;
33using HeuristicLab.CEDMA.Core;
34using HeuristicLab.GP.StructureIdentification;
35using HeuristicLab.Data;
36using HeuristicLab.Grid;
37using System.Diagnostics;
38using HeuristicLab.Core;
39using System.Threading;
40
41namespace HeuristicLab.CEDMA.Server {
42  public class Executer {
43    private static int MaxActiveJobs {
44      get { return 100; }
45    }
46    private Dispatcher dispatcher;
47    private JobManager jobManager;
48    private IStore store;
49
50    public Executer(Dispatcher dispatcher, IStore store, string gridUrl) {
51      this.dispatcher = dispatcher;
52      this.store = store;
53      this.jobManager = new JobManager(gridUrl);
54      jobManager.Reset();
55    }
56
57    internal void Start() {
58      new Thread(StartJobs).Start();
59    }
60
61    private void StartJobs() {
62      List<WaitHandle> wh = new List<WaitHandle>();
63      Dictionary<WaitHandle, AtomicOperation> activeOperations = new Dictionary<WaitHandle,AtomicOperation>();
64      Dictionary<WaitHandle, Execution> activeExecutions = new Dictionary<WaitHandle,Execution>();
65      while (true) {
66        try {
67          // start new jobs as long as there are less than MaxActiveJobs
68          while (wh.Count < MaxActiveJobs) {
69            // get an execution from the dispatcher and execute in grid via job-manager
70            Execution execution = dispatcher.GetNextJob();
71            if (execution != null) {
72              AtomicOperation op = new AtomicOperation(execution.Engine.OperatorGraph.InitialOperator, execution.Engine.GlobalScope);
73              WaitHandle opWh = jobManager.BeginExecuteOperation(execution.Engine.GlobalScope, op);
74              wh.Add(opWh);
75              activeOperations.Add(opWh, op);
76              activeExecutions.Add(opWh, execution);
77            }
78          }
79          // wait until any job is finished
80          WaitHandle[] whArr = wh.ToArray();
81          int readyHandleIndex = WaitHandle.WaitAny(whArr);
82          WaitHandle readyHandle = whArr[readyHandleIndex];
83          AtomicOperation finishedOp = activeOperations[readyHandle];
84          Execution finishedExecution = activeExecutions[readyHandle];
85          wh.Remove(readyHandle);
86          activeExecutions.Remove(readyHandle);
87          activeOperations.Remove(readyHandle);
88          ProcessingEngine finishedEngine = null;
89          try {
90            finishedEngine = jobManager.EndExecuteOperation(finishedOp);
91          } catch (Exception badEx) {
92            Trace.WriteLine("CEDMA Executer: Exception in job execution thread. " + badEx.Message);
93          }
94          if (finishedEngine != null) {
95            StoreResults(finishedExecution, finishedEngine);
96          }
97        }
98        catch (Exception ex) {
99          Trace.WriteLine("CEDMA Executer: Exception in job-management thread. " + ex.Message);
100        }
101      }
102    }
103
104    private void StoreResults(Execution finishedExecution, ProcessingEngine finishedEngine) {
105      Entity model = new Entity(Ontology.CedmaNameSpace + Guid.NewGuid());
106      store.Add(new Statement(model, Ontology.PredicateInstanceOf, Ontology.TypeGeneticProgrammingFunctionTree));
107      store.Add(new Statement(finishedExecution.DataSetEntity, Ontology.PredicateHasModel, model));
108      StoreModelAttribute(model, Ontology.TargetVariable, finishedExecution.TargetVariable);
109      Scope bestModelScope = finishedEngine.GlobalScope.GetVariableValue<Scope>("BestValidationSolution", false);
110      StoreModelAttribute(model, Ontology.TrainingMeanSquaredError, bestModelScope.GetVariableValue<DoubleData>("Quality", false).Data);
111      StoreModelAttribute(model, Ontology.ValidationMeanSquaredError, bestModelScope.GetVariableValue<DoubleData>("ValidationQuality", false).Data);
112      StoreModelAttribute(model, Ontology.TrainingMeanAbsolutePercentageError, bestModelScope.GetVariableValue<DoubleData>("TrainingMAPE", false).Data);
113      StoreModelAttribute(model, Ontology.ValidationMeanAbsolutePercentageError, bestModelScope.GetVariableValue<DoubleData>("ValidationMAPE", false).Data);
114      StoreModelAttribute(model, Ontology.TreeSize, bestModelScope.GetVariableValue<IntData>("TreeSize", false).Data);
115      StoreModelAttribute(model, Ontology.TreeHeight, bestModelScope.GetVariableValue<IntData>("TreeHeight", false).Data);
116      StoreModelAttribute(model, Ontology.EvaluatedSolutions, bestModelScope.GetVariableValue<IntData>("EvaluatedSolutions", false).Data);
117       
118      byte[] serializedModel = PersistenceManager.SaveToGZip(bestModelScope.GetVariableValue("FunctionTree", false));
119      store.Add(new Statement(model, Ontology.PredicateSerializedData, new Literal(Convert.ToBase64String(serializedModel))));
120   }
121
122    private void StoreModelAttribute(Entity model, Entity predicate, object value) {
123      store.Add(new Statement(model, predicate, new Literal(value)));
124    }
125  }
126}
Note: See TracBrowser for help on using the repository browser.