Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.CEDMA.Server/3.3/SimpleDispatcher.cs @ 2301

Last change on this file since 2301 was 2290, checked in by gkronber, 15 years ago
  • introduced a variablename to index mapping for SVM models (to make sure we can use the model for prediction in the model analyzer)
  • added support to enable and disable algorithms in the dispatcher and removed DispatcherBase
  • fixed bugs when calculating variable impacts and reading the final model of GP algorithms

#722 (IModel should provide a Predict() method to get predicted values for an input vector)

File size: 12.5 KB
RevLine 
[1044]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 System.ServiceModel.Description;
30using System.Linq;
31using HeuristicLab.CEDMA.Core;
[1053]32using HeuristicLab.Data;
[1060]33using HeuristicLab.Core;
[1857]34using HeuristicLab.Modeling;
[2223]35using HeuristicLab.Modeling.Database;
[1044]36
37namespace HeuristicLab.CEDMA.Server {
[2290]38  public class SimpleDispatcher : IDispatcher {
[2119]39    private class AlgorithmConfiguration {
40      public string name;
41      public int targetVariable;
42      public List<int> inputVariables;
43    }
44
[2290]45    private IModelingDatabase database;
46    public IModelingDatabase Database {
47      get {
48        return database;
49      }
50    }
51
52    private Problem problem;
53    public Problem Problem {
54      get {
55        return problem;
56      }
57    }
58    internal event EventHandler Changed;
59
60    public IEnumerable<string> TargetVariables {
61      get {
62        return Enumerable.Range(0, problem.Dataset.Columns).Select(x => problem.Dataset.GetVariableName(x));
63      }
64    }
65
66    public IEnumerable<string> InputVariables {
67      get {
68        return TargetVariables;
69      }
70    }
71
72    private HeuristicLab.Modeling.IAlgorithm[] algorithms;
73    public IEnumerable<HeuristicLab.Modeling.IAlgorithm> Algorithms {
74      get {
75        switch (Problem.LearningTask) {
76          case LearningTask.Regression: {
77              return algorithms.Where(a => (a as IClassificationAlgorithm) == null && (a as ITimeSeriesAlgorithm) == null);
78            }
79          case LearningTask.Classification: {
80              return algorithms.Where(a => (a as IClassificationAlgorithm) != null);
81            }
82          case LearningTask.TimeSeries: {
83              return algorithms.Where(a => (a as ITimeSeriesAlgorithm) != null);
84            }
85        }
86        return new HeuristicLab.Modeling.IAlgorithm[] { };
87      }
88    }
89
90    private List<HeuristicLab.Modeling.IAlgorithm> activeAlgorithms;
91    public IEnumerable<HeuristicLab.Modeling.IAlgorithm> ActiveAlgorithms {
92      get { return activeAlgorithms; }
93    }
94
[2270]95    private Random random;
[2290]96    private List<int> allowedTargetVariables;
97    private Dictionary<int, List<int>> activeInputVariables;
[2119]98    private Dictionary<int, List<AlgorithmConfiguration>> finishedAndDispatchedRuns;
[2290]99    private object locker = new object();
[1873]100
[2290]101    public SimpleDispatcher(IModelingDatabase database, Problem problem) {
102      this.problem = problem;
103      this.database = database;
104      this.random = new Random();
105
106      this.finishedAndDispatchedRuns = new Dictionary<int, List<AlgorithmConfiguration>>();
107      this.allowedTargetVariables = new List<int>();
108      this.activeInputVariables = new Dictionary<int, List<int>>();
109      this.activeAlgorithms = new List<HeuristicLab.Modeling.IAlgorithm>();
110      DiscoveryService ds = new DiscoveryService();
111      this.algorithms = ds.GetInstances<HeuristicLab.Modeling.IAlgorithm>();
112      problem.Changed += (sender, args) => {
113        lock (locker) {
114          allowedTargetVariables.Clear();
115          activeInputVariables.Clear();
116          activeAlgorithms.Clear();
117        }
118        OnChanged();
119      };
120
[1873]121      PopulateFinishedRuns();
[1044]122    }
123
[2290]124    public HeuristicLab.Modeling.IAlgorithm GetNextJob() {
125      lock (locker) {
126        if (allowedTargetVariables.Count > 0) {
127          int[] targetVariables = allowedTargetVariables.ToArray();
128          int targetVariable = SelectTargetVariable(targetVariables);
129          int[] inputVariables = activeInputVariables[targetVariable].ToArray();
130
131          HeuristicLab.Modeling.IAlgorithm selectedAlgorithm = SelectAndConfigureAlgorithm(targetVariable, inputVariables, problem);
132
133          return selectedAlgorithm;
134        } else return null;
[1857]135      }
[2290]136    }
[2119]137
[2290]138    public virtual int SelectTargetVariable(int[] targetVariables) {
139      return targetVariables[random.Next(targetVariables.Length)];
140    }
[2119]141
[2290]142    public HeuristicLab.Modeling.IAlgorithm SelectAndConfigureAlgorithm(int targetVariable, int[] inputVariables, Problem problem) {
143      HeuristicLab.Modeling.IAlgorithm selectedAlgorithm = null;
144      DiscoveryService ds = new DiscoveryService();
145      var allAlgorithms = ds.GetInstances<HeuristicLab.Modeling.IAlgorithm>();
146      var allowedAlgorithmTypes = activeAlgorithms.Select(x => x.GetType());
147      var possibleAlgos =
148        allAlgorithms
149        .Where(x => allowedAlgorithmTypes.Contains(x.GetType()) &&
150          ((x is IStochasticAlgorithm) || !AlgorithmFinishedOrDispatched(targetVariable, inputVariables, x.Name)));
151      if (possibleAlgos.Count() > 0) selectedAlgorithm = possibleAlgos.ElementAt(random.Next(possibleAlgos.Count()));
[1873]152      if (selectedAlgorithm != null) {
[2152]153        SetProblemParameters(selectedAlgorithm, problem, targetVariable, inputVariables);
[2290]154        if (!(selectedAlgorithm is IStochasticAlgorithm))
155          AddDispatchedRun(targetVariable, inputVariables, selectedAlgorithm.Name);
[1873]156      }
157      return selectedAlgorithm;
[1044]158    }
159
[1873]160    private void PopulateFinishedRuns() {
[2258]161      var dispatchedAlgos = from model in Database.GetAllModels()
[2270]162                            select new {
163                              TargetVariable = model.TargetVariable.Name,
164                              Algorithm = model.Algorithm.Name,
165                              Inputvariables = Database.GetInputVariableResults(model).Select(x => x.Variable.Name).Distinct()
166                            };
[2258]167      foreach (var algo in dispatchedAlgos) {
168        AddDispatchedRun(algo.TargetVariable, algo.Inputvariables, algo.Algorithm);
169      }
[1873]170    }
171
[2223]172    private void SetProblemParameters(HeuristicLab.Modeling.IAlgorithm algo, Problem problem, int targetVariable, int[] inputVariables) {
[2119]173      algo.Dataset = problem.Dataset;
174      algo.TargetVariable = targetVariable;
175      algo.ProblemInjector.GetVariable("TrainingSamplesStart").GetValue<IntData>().Data = problem.TrainingSamplesStart;
176      algo.ProblemInjector.GetVariable("TrainingSamplesEnd").GetValue<IntData>().Data = problem.TrainingSamplesEnd;
177      algo.ProblemInjector.GetVariable("ValidationSamplesStart").GetValue<IntData>().Data = problem.ValidationSamplesStart;
178      algo.ProblemInjector.GetVariable("ValidationSamplesEnd").GetValue<IntData>().Data = problem.ValidationSamplesEnd;
179      algo.ProblemInjector.GetVariable("TestSamplesStart").GetValue<IntData>().Data = problem.TestSamplesStart;
180      algo.ProblemInjector.GetVariable("TestSamplesEnd").GetValue<IntData>().Data = problem.TestSamplesEnd;
181      ItemList<IntData> allowedFeatures = algo.ProblemInjector.GetVariable("AllowedFeatures").GetValue<ItemList<IntData>>();
[2130]182      foreach (int inputVariable in inputVariables) {
183        if (inputVariable != targetVariable) {
184          allowedFeatures.Add(new IntData(inputVariable));
185        }
186      }
[2119]187
188      if (problem.LearningTask == LearningTask.TimeSeries) {
189        algo.ProblemInjector.GetVariable("Autoregressive").GetValue<BoolData>().Data = problem.AutoRegressive;
190        algo.ProblemInjector.GetVariable("MinTimeOffset").GetValue<IntData>().Data = problem.MinTimeOffset;
191        algo.ProblemInjector.GetVariable("MaxTimeOffset").GetValue<IntData>().Data = problem.MaxTimeOffset;
[2130]192        if (problem.AutoRegressive) {
193          allowedFeatures.Add(new IntData(targetVariable));
194        }
[2119]195      } else if (problem.LearningTask == LearningTask.Classification) {
196        ItemList<DoubleData> classValues = algo.ProblemInjector.GetVariable("TargetClassValues").GetValue<ItemList<DoubleData>>();
197        foreach (double classValue in GetDifferentClassValues(problem.Dataset, targetVariable)) classValues.Add(new DoubleData(classValue));
198      }
199    }
200
201    private IEnumerable<double> GetDifferentClassValues(HeuristicLab.DataAnalysis.Dataset dataset, int targetVariable) {
202      return Enumerable.Range(0, dataset.Rows).Select(x => dataset.GetValue(x, targetVariable)).Distinct();
203    }
204
[2258]205    private void AddDispatchedRun(string targetVariable, IEnumerable<string> inputVariables, string algorithm) {
206      AddDispatchedRun(
[2270]207        Problem.Dataset.GetVariableIndex(targetVariable),
208        inputVariables.Select(x => Problem.Dataset.GetVariableIndex(x)).ToArray(),
[2258]209        algorithm);
210    }
211
[2119]212    private void AddDispatchedRun(int targetVariable, int[] inputVariables, string algoName) {
[2012]213      if (!finishedAndDispatchedRuns.ContainsKey(targetVariable)) {
[2119]214        finishedAndDispatchedRuns[targetVariable] = new List<AlgorithmConfiguration>();
[1873]215      }
[2119]216      AlgorithmConfiguration conf = new AlgorithmConfiguration();
217      conf.name = algoName;
218      conf.inputVariables = new List<int>(inputVariables);
219      conf.targetVariable = targetVariable;
220      finishedAndDispatchedRuns[targetVariable].Add(conf);
[1873]221    }
222
[2119]223    private bool AlgorithmFinishedOrDispatched(int targetVariable, int[] inputVariables, string algoName) {
[1873]224      return
[2012]225        finishedAndDispatchedRuns.ContainsKey(targetVariable) &&
[2119]226        finishedAndDispatchedRuns[targetVariable].Any(x => targetVariable == x.targetVariable &&
227                                                           algoName == x.name &&
228                                                           inputVariables.Count() == x.inputVariables.Count() &&
229                                                           inputVariables.All(v => x.inputVariables.Contains(v)));
[1873]230    }
[2290]231
232    public void EnableAlgorithm(HeuristicLab.Modeling.IAlgorithm algo) {
233      lock (locker) {
234        if (!activeAlgorithms.Contains(algo)) activeAlgorithms.Add(algo);
235      }
236    }
237
238    public void DisableAlgorithm(HeuristicLab.Modeling.IAlgorithm algo) {
239      lock (locker) {
240        while (activeAlgorithms.Remove(algo)) ;
241      }
242    }
243
244    internal void EnableTargetVariable(string name) {
245      int varIndex = problem.Dataset.GetVariableIndex(name);
246      lock (locker)
247        if (!allowedTargetVariables.Contains(varIndex)) allowedTargetVariables.Add(varIndex);
248    }
249
250    internal void DisableTargetVariable(string name) {
251      int varIndex = problem.Dataset.GetVariableIndex(name);
252      lock (locker)
253        while (allowedTargetVariables.Remove(varIndex)) ;
254    }
255
256    internal void EnableInputVariable(string target, string name) {
257      int targetIndex = problem.Dataset.GetVariableIndex(target);
258      int inputIndex = problem.Dataset.GetVariableIndex(name);
259      lock (locker) {
260        if (!activeInputVariables.ContainsKey(targetIndex)) activeInputVariables[targetIndex] = new List<int>();
261        if (!activeInputVariables[targetIndex].Contains(inputIndex)) {
262          activeInputVariables[targetIndex].Add(inputIndex);
263        }
264      }
265    }
266
267    internal void DisableInputVariable(string target, string name) {
268      int targetIndex = problem.Dataset.GetVariableIndex(target);
269      int inputIndex = problem.Dataset.GetVariableIndex(name);
270      lock (locker) {
271        if (!activeInputVariables.ContainsKey(targetIndex)) activeInputVariables[targetIndex] = new List<int>();
272        while (activeInputVariables[targetIndex].Remove(inputIndex)) ;
273      }
274    }
275
276    public void OnChanged() {
277      if (Changed != null) Changed(this, new EventArgs());
278    }
279
280    internal IEnumerable<string> GetInputVariables(string target) {
281      int targetIndex = problem.Dataset.GetVariableIndex(target);
282      lock (locker) {
283        if (!activeInputVariables.ContainsKey(targetIndex)) activeInputVariables[targetIndex] = new List<int>();
284        return activeInputVariables[targetIndex]
285          .Select(i => problem.Dataset.GetVariableName(i));
286      }
287    }
288
289
290    #region IViewable Members
291
292    public virtual IView CreateView() {
293      return new DispatcherView(this);
294    }
295
296    #endregion
297
298
[1044]299  }
300}
Note: See TracBrowser for help on using the repository browser.