Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.SupportVectorMachines/3.2/SupportVectorCreator.cs @ 1851

Last change on this file since 1851 was 1851, checked in by gkronber, 15 years ago

Reverted r1847 after discussion with swagner. Instead each operator should decide independently what happens after abort and adapt the returned next operation accordingly. #633 (Engines do not handle abortion of operators correctly)

File size: 6.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2009 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.Linq;
25using System.Text;
26using HeuristicLab.Core;
27using HeuristicLab.Data;
28using HeuristicLab.DataAnalysis;
29using System.Threading;
30
31namespace HeuristicLab.SupportVectorMachines {
32  public class SupportVectorCreator : OperatorBase {
33    private Thread trainingThread;
34    private object locker = new object();
35    private bool abortRequested = false;
36
37    public SupportVectorCreator()
38      : base() {
39      //Dataset infos
40      AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));
41      AddVariableInfo(new VariableInfo("AllowedFeatures", "List of indexes of allowed features", typeof(ItemList<IntData>), VariableKind.In));
42      AddVariableInfo(new VariableInfo("TargetVariable", "Index of the column of the dataset that holds the target variable", typeof(IntData), VariableKind.In));
43      AddVariableInfo(new VariableInfo("SamplesStart", "Start index of samples in dataset to evaluate", typeof(IntData), VariableKind.In));
44      AddVariableInfo(new VariableInfo("SamplesEnd", "End index of samples in dataset to evaluate", typeof(IntData), VariableKind.In));
45
46      //SVM parameters
47      AddVariableInfo(new VariableInfo("SVMType", "String describing which SVM type is used. Valid inputs are: C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR",
48        typeof(StringData), VariableKind.In));
49      AddVariableInfo(new VariableInfo("SVMKernelType", "String describing which SVM kernel is used. Valid inputs are: LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED",
50        typeof(StringData), VariableKind.In));
51      AddVariableInfo(new VariableInfo("SVMCost", "Cost parameter (C) of C-SVC, epsilon-SVR and nu-SVR", typeof(DoubleData), VariableKind.In));
52      AddVariableInfo(new VariableInfo("SVMNu", "Nu parameter of nu-SVC, one-class SVM and nu-SVR", typeof(DoubleData), VariableKind.In));
53      AddVariableInfo(new VariableInfo("SVMGamma", "Gamma parameter in kernel function", typeof(DoubleData), VariableKind.In));
54      AddVariableInfo(new VariableInfo("SVMModel", "Represent the model learned by the SVM", typeof(SVMModel), VariableKind.New | VariableKind.Out));
55      AddVariableInfo(new VariableInfo("SVMRangeTransform", "The applied transformation during the learning the model", typeof(SVMRangeTransform), VariableKind.New | VariableKind.Out));
56    }
57
58    public override void Abort() {
59      abortRequested = true;
60      lock (locker) {
61        if (trainingThread != null && trainingThread.ThreadState == ThreadState.Running) {
62          trainingThread.Abort();
63        }
64      }
65    }
66
67    public override IOperation Apply(IScope scope) {
68      abortRequested = false;
69      Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true);
70      ItemList<IntData> allowedFeatures = GetVariableValue<ItemList<IntData>>("AllowedFeatures", scope, true);
71      int targetVariable = GetVariableValue<IntData>("TargetVariable", scope, true).Data;
72      int start = GetVariableValue<IntData>("SamplesStart", scope, true).Data;
73      int end = GetVariableValue<IntData>("SamplesEnd", scope, true).Data;
74
75      string svmType = GetVariableValue<StringData>("SVMType", scope, true).Data;
76      string svmKernelType = GetVariableValue<StringData>("SVMKernelType", scope, true).Data;
77
78      //extract SVM parameters from scope and set them
79      SVM.Parameter parameter = new SVM.Parameter();
80      parameter.SvmType = (SVM.SvmType)Enum.Parse(typeof(SVM.SvmType), svmType, true);
81      parameter.KernelType = (SVM.KernelType)Enum.Parse(typeof(SVM.KernelType), svmKernelType, true);
82      parameter.C = GetVariableValue<DoubleData>("SVMCost", scope, true).Data;
83      parameter.Nu = GetVariableValue<DoubleData>("SVMNu", scope, true).Data;
84      parameter.Gamma = GetVariableValue<DoubleData>("SVMGamma", scope, true).Data;
85
86      SVM.Problem problem = SVMHelper.CreateSVMProblem(dataset, allowedFeatures, targetVariable, start, end);
87      SVM.RangeTransform rangeTransform = SVM.Scaling.DetermineRange(problem);
88      SVM.Problem scaledProblem = SVM.Scaling.Scale(problem, rangeTransform);
89
90      SVM.Model model = StartTraining(scaledProblem, parameter);
91      if (!abortRequested) {
92        //persist variables in scope
93        SVMModel modelData = new SVMModel();
94        modelData.Data = model;
95        scope.AddVariable(new Variable(scope.TranslateName("SVMModel"), modelData));
96        SVMRangeTransform rangeTransformData = new SVMRangeTransform();
97        rangeTransformData.Data = rangeTransform;
98        scope.AddVariable(new Variable(scope.TranslateName("SVMRangeTransform"), rangeTransformData));
99        return null;
100      } else {
101        return new AtomicOperation(this, scope);
102      }
103    }
104
105    private SVM.Model StartTraining(SVM.Problem scaledProblem, SVM.Parameter parameter) {
106      SVM.Model model = null;
107      lock (locker) {
108        if (!abortRequested) {
109          trainingThread = new Thread(() => {
110              model = SVM.Training.Train(scaledProblem, parameter);
111          });
112          trainingThread.Start();
113        }
114      }
115      trainingThread.Join();
116      trainingThread = null;
117      return model;
118    }
119  }
120}
Note: See TracBrowser for help on using the repository browser.