Free cookie consent management tool by TermsFeed Policy Generator

source: branches/DataPreprocessing/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/TransformationToSymbolicTreeMapper.cs @ 10940

Last change on this file since 10940 was 10940, checked in by tsteinre, 10 years ago
  • fixed CopyColumnTransformation inheritance
  • created a non-generic version of Transformation
File size: 11.2 KB
RevLine 
[10845]1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2013 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
[10846]22using System;
[10845]23using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
24using HeuristicLab.Problems.DataAnalysis.Transformations;
25
26namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
[10872]27  public class TransformationToSymbolicTreeMapper : ITransformationMapper<ISymbolicExpressionTreeNode> {
[10846]28    private ITransformation transformation;
29    private string column;
30
[10845]31    #region ITransformationMapper<ISymbolicExpressionTree> Members
32
[10872]33    public ISymbolicExpressionTreeNode GenerateModel(ITransformation transformation) {
[10846]34      InitComponents(transformation);
[10845]35
36      if (transformation is LinearTransformation) {
[10846]37        return GenerateModelForLinearTransformation();
[10845]38      } else if (transformation is ExponentialTransformation) {
[10848]39        return GenerateModelForExponentialTransformation();
[10845]40      } else if (transformation is LogarithmicTransformation) {
[10853]41        return GenerateModelForLogarithmicTransformation();
[10845]42      } else if (transformation is PowerTransformation) {
[10853]43        return GenerateModelForPowerTransformation();
[10845]44      } else if (transformation is ReciprocalTransformation) {
[10853]45        return GenerateModelForReciprocalTransformation();
[10845]46      } else if (transformation is ShiftStandardDistributionTransformation) {
[10853]47        return GenerateModelForShiftStandardDistributionTransformation();
[10940]48      } else if (transformation is CopyColumnTransformation) {
49        // TODO
[10845]50      }
[10846]51      throw new NotImplementedException();
[10845]52    }
53
[10872]54    public ISymbolicExpressionTreeNode GenerateInverseModel(ITransformation transformation) {
[10846]55      InitComponents(transformation);
[10845]56
57      if (transformation is LinearTransformation) {
[10848]58        return GenerateInverseModelForLinearTransformation();
[10845]59      } else if (transformation is ExponentialTransformation) {
[10848]60        return GenerateInverseModelForExponentialTransformation();
[10845]61      } else if (transformation is LogarithmicTransformation) {
[10853]62        return GenerateInverseModelForLogarithmicTransformation();
[10845]63      } else if (transformation is PowerTransformation) {
[10853]64        return GenerateInverseModelForPowerTransformation();
[10845]65      } else if (transformation is ReciprocalTransformation) {
[10853]66        return GenerateInverseModelForReciprocalTransformation();
[10845]67      } else if (transformation is ShiftStandardDistributionTransformation) {
[10866]68        GenerateInverseModelForShiftStandardDistributionTransformation();
[10845]69      }
70
[10846]71      throw new NotImplementedException();
[10845]72    }
73
74    #endregion
75
[10853]76    // helper
77
[10872]78    private ISymbolicExpressionTreeNode GenerateModelForLinearTransformation() {
[10846]79      var linearTransformation = (LinearTransformation)transformation;
80      var kValue = linearTransformation.Multiplier;
81      var dValue = linearTransformation.Addend;
82
83      // k * x
84      var multiplicationNode = new Multiplication().CreateTreeNode();
[10866]85      var kNode = CreateConstantTreeNode("k", kValue);
86      var xNode = CreateVariableTreeNode(column, "x");
[10846]87      multiplicationNode.AddSubtree(kNode);
88      multiplicationNode.AddSubtree(xNode);
89
90      // ( k * x ) + d
91      var additionNode = new Addition().CreateTreeNode();
[10866]92      var dNode = CreateConstantTreeNode("d", dValue);
[10846]93      additionNode.AddSubtree(multiplicationNode);
94      additionNode.AddSubtree(dNode);
95
[10872]96      return additionNode;
[10846]97    }
98
[10872]99    private ISymbolicExpressionTreeNode GenerateInverseModelForLinearTransformation() {
[10848]100      var linearTransformation = (LinearTransformation)transformation;
101      var kValue = linearTransformation.Multiplier;
102      var dValue = linearTransformation.Addend;
103
104      // x - d
105      var substractionNode = new Subtraction().CreateTreeNode();
[10866]106      var dNode = CreateConstantTreeNode("d", dValue);
107      var xNode = CreateVariableTreeNode(column, "x");
[10848]108      substractionNode.AddSubtree(xNode);
109      substractionNode.AddSubtree(dNode);
110
111      // ( x - d ) / k
112      var divisionNode = new Division().CreateTreeNode();
[10866]113      var kNode = CreateConstantTreeNode("k", kValue);
[10848]114      divisionNode.AddSubtree(substractionNode);
115      divisionNode.AddSubtree(kNode);
116
[10872]117      return divisionNode;
[10848]118    }
119
120
[10872]121    private ISymbolicExpressionTreeNode GenerateModelForExponentialTransformation() {
[10848]122      var exponentialTransformation = (ExponentialTransformation)transformation;
123      var bValue = exponentialTransformation.Base;
124
[10853]125      return GenTreePow_b_x(bValue);
126    }
127
[10872]128    private ISymbolicExpressionTreeNode GenerateInverseModelForExponentialTransformation() {
[10853]129      var exponentialTransformation = (ExponentialTransformation)transformation;
130      var bValue = exponentialTransformation.Base;
131
132      return GenTreeLog_x_b(bValue);
133    }
134
135
[10872]136    private ISymbolicExpressionTreeNode GenerateModelForLogarithmicTransformation() {
[10853]137      var logarithmicTransformation = (LogarithmicTransformation)transformation;
138      var bValue = logarithmicTransformation.Base;
139
140      return GenTreeLog_x_b(bValue);
141    }
142
[10872]143    private ISymbolicExpressionTreeNode GenerateInverseModelForLogarithmicTransformation() {
[10853]144      var logarithmicTransformation = (LogarithmicTransformation)transformation;
145      var bValue = logarithmicTransformation.Base;
146
147      return GenTreePow_b_x(bValue);
148    }
149
150
[10872]151    private ISymbolicExpressionTreeNode GenerateModelForPowerTransformation() {
[10853]152      var powerTransformation = (PowerTransformation)transformation;
153      var expValue = powerTransformation.Exponent;
154
155      // x ^ exp
[10848]156      var powerNode = new Power().CreateTreeNode();
[10866]157      var xNode = CreateVariableTreeNode(column, "x");
158      var expNode = CreateConstantTreeNode("exp", expValue);
[10848]159      powerNode.AddSubtree(xNode);
[10853]160      powerNode.AddSubtree(expNode);
[10848]161
[10872]162      return powerNode;
[10848]163    }
164
[10872]165    private ISymbolicExpressionTreeNode GenerateInverseModelForPowerTransformation() {
[10853]166      var powerTransformation = (PowerTransformation)transformation;
167      var expValue = powerTransformation.Exponent;
[10848]168
[10853]169      // rt(x, b)
170      var rootNode = new Root().CreateTreeNode();
[10866]171      var xNode = CreateVariableTreeNode(column, "x");
172      var bNode = CreateConstantTreeNode("b", expValue);
[10853]173      rootNode.AddSubtree(xNode);
174      rootNode.AddSubtree(bNode);
175
[10872]176      return rootNode;
[10853]177    }
178
179
[10872]180    private ISymbolicExpressionTreeNode GenerateModelForReciprocalTransformation() {
[10853]181      return GenTreeDiv_1_x();
182    }
183
[10872]184    private ISymbolicExpressionTreeNode GenerateInverseModelForReciprocalTransformation() {
[10853]185      return GenTreeDiv_1_x();
186    }
187
[10872]188
189    private ISymbolicExpressionTreeNode GenerateModelForShiftStandardDistributionTransformation() {
[10853]190      var shiftStandardDistributionTransformation = (ShiftStandardDistributionTransformation)transformation;
191      var m_orgValue = shiftStandardDistributionTransformation.OriginalMean;
192      var s_orgValue = shiftStandardDistributionTransformation.OriginalStandardDeviation;
193      var m_tarValue = shiftStandardDistributionTransformation.Mean;
194      var s_tarValue = shiftStandardDistributionTransformation.StandardDeviation;
195
[10866]196      return GenTreeShiftStdDist(column, m_orgValue, s_orgValue, m_tarValue, s_tarValue);
197    }
[10853]198
[10872]199    private ISymbolicExpressionTreeNode GenerateInverseModelForShiftStandardDistributionTransformation() {
[10866]200      var shiftStandardDistributionTransformation = (ShiftStandardDistributionTransformation)transformation;
201      var m_orgValue = shiftStandardDistributionTransformation.OriginalMean;
202      var s_orgValue = shiftStandardDistributionTransformation.OriginalStandardDeviation;
203      var m_tarValue = shiftStandardDistributionTransformation.Mean;
204      var s_tarValue = shiftStandardDistributionTransformation.StandardDeviation;
[10853]205
[10866]206      return GenTreeShiftStdDist(column, m_tarValue, s_tarValue, m_orgValue, s_orgValue);
[10853]207    }
208
209    // helper's helper:
210
[10872]211    private ISymbolicExpressionTreeNode GenTreeLog_x_b(double b) {
[10848]212      // log(x, b)
213      var logNode = new Logarithm().CreateTreeNode();
[10866]214      var bNode = CreateConstantTreeNode("b", b);
215      var xNode = CreateVariableTreeNode(column, "x");
[10848]216      logNode.AddSubtree(xNode);
217      logNode.AddSubtree(bNode);
218
[10872]219      return logNode;
[10848]220    }
221
[10872]222    private ISymbolicExpressionTreeNode GenTreePow_b_x(double b) {
[10853]223      // b ^ x
224      var powerNode = new Power().CreateTreeNode();
[10866]225      var bNode = CreateConstantTreeNode("b", b);
226      var xNode = CreateVariableTreeNode(column, "x");
[10853]227      powerNode.AddSubtree(bNode);
228      powerNode.AddSubtree(xNode);
229
[10872]230      return powerNode;
[10853]231    }
232
[10872]233    private ISymbolicExpressionTreeNode GenTreeDiv_1_x() {
[10853]234      // 1 / x
235      var divNode = new Division().CreateTreeNode();
[10866]236      var oneNode = CreateConstantTreeNode("1", 1.0);
237      var xNode = CreateVariableTreeNode(column, "x");
[10853]238      divNode.AddSubtree(oneNode);
239      divNode.AddSubtree(xNode);
240
[10872]241      return divNode;
[10853]242    }
[10872]243
244    private ISymbolicExpressionTreeNode GenTreeShiftStdDist(string variable, double m_org, double s_org, double m_tar, double s_tar) {
[10866]245      // x - m_org
246      var substractionNode = new Subtraction().CreateTreeNode();
247      var xNode = CreateVariableTreeNode(variable, "x");
248      var m_orgNode = CreateConstantTreeNode("m_org", m_org);
249      substractionNode.AddSubtree(xNode);
250      substractionNode.AddSubtree(m_orgNode);
[10853]251
[10866]252      // (x - m_org) / s_org
253      var divisionNode = new Division().CreateTreeNode();
254      var s_orgNode = CreateConstantTreeNode("s_org", s_org);
255      divisionNode.AddSubtree(substractionNode);
256      divisionNode.AddSubtree(s_orgNode);
[10853]257
[10866]258      // ((x - m_org) / s_org ) * s_tar
259      var multiplicationNode = new Multiplication().CreateTreeNode();
260      var s_tarNode = CreateConstantTreeNode("s_tar", s_tar);
261      multiplicationNode.AddSubtree(divisionNode);
262      multiplicationNode.AddSubtree(s_tarNode);
263
264      // ((x - m_org) / s_org ) * s_tar + m_tar
265      var additionNode = new Addition().CreateTreeNode();
266      var m_tarNode = CreateConstantTreeNode("m_tar", m_tar);
267      additionNode.AddSubtree(multiplicationNode);
268      additionNode.AddSubtree(m_tarNode);
269
[10872]270      return additionNode;
[10866]271    }
272
273    private ConstantTreeNode CreateConstantTreeNode(string description, double value) {
[10869]274      return new ConstantTreeNode(new Constant()) { Value = value };
[10866]275    }
[10872]276
[10878]277    private VariableTreeNode CreateVariableTreeNode(string name, string description) {
278      return new VariableTreeNode(new Variable(name, description)) { VariableName = name, Weight = 1.0 };
[10866]279    }
280
[10846]281    private void InitComponents(ITransformation transformation) {
282      this.transformation = transformation;
283      column = transformation.Column;
284    }
[10845]285  }
286}
Note: See TracBrowser for help on using the repository browser.