Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.GP.StructureIdentification/ModelAnalyzerExporter.cs @ 1227

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

merged fix for #472 (Export of HL3 function trees to HL2 import format (copy-to-clipboard) doesn't work) r1226 from CEDMA refactoring branch to trunk.

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.Linq;
25using System.Text;
26using HeuristicLab.Data;
27
28namespace HeuristicLab.GP.StructureIdentification {
29  public class ModelAnalyzerExporter : IFunctionTreeExporter, IFunctionTreeNameGenerator {
30    #region IFunctionTreeExporter Members
31
32    public string Name {
33      get {
34        return "HL2 ModelAnalyzer Exporter";
35      }
36    }
37
38    public bool TryExport(IFunctionTree tree, out string exported) {
39      try {
40        exported = Export(tree);
41        return true;
42      } catch(UnknownFunctionException) {
43        exported = "";
44        return false;
45      }
46    }
47
48    public string Export(IFunctionTree tree) {
49      string result = ExportFunction(tree.Function, tree);
50      if(tree.SubTrees.Count>0)
51        result += "(\n";
52      foreach(IFunctionTree subTree in tree.SubTrees) {
53        result += Export(subTree);
54        result += ";\n";
55      }
56      result = result.TrimEnd(';', '\n');
57      if(tree.SubTrees.Count > 0) result += ")";
58      return result;
59    }
60
61    #endregion
62
63    private string ExportFunction(IFunction function, IFunctionTree tree) {
64      // this is smelly, if there is a cleaner way to have a 'dynamic' visitor
65      // please let me know! (gkronber 14.10.2008)
66      if(function is Addition) return ((Addition)function).ExportToHL2(tree);
67      if(function is And) return ((And)function).ExportToHL2(tree);
68      if(function is Average) return ((Average)function).ExportToHL2(tree);
69      if(function is Constant) return ((Constant)function).ExportToHL2(tree);
70      if(function is Cosinus) return ((Cosinus)function).ExportToHL2(tree);
71      if(function is Differential) return ((Differential)function).ExportToHL2(tree);
72      if(function is Division) return ((Division)function).ExportToHL2(tree);
73      if(function is Equal) return ((Equal)function).ExportToHL2(tree);
74      if(function is Exponential) return ((Exponential)function).ExportToHL2(tree);
75      if(function is GreaterThan) return ((GreaterThan)function).ExportToHL2(tree);
76      if(function is IfThenElse) return ((IfThenElse)function).ExportToHL2(tree);
77      if(function is LessThan) return ((LessThan)function).ExportToHL2(tree);
78      if(function is Logarithm) return ((Logarithm)function).ExportToHL2(tree);
79      if(function is Multiplication) return ((Multiplication)function).ExportToHL2(tree);
80      if(function is Not) return ((Not)function).ExportToHL2(tree);
81      if(function is Or) return ((Or)function).ExportToHL2(tree);
82      if(function is Power) return ((Power)function).ExportToHL2(tree);
83      if(function is Signum) return ((Signum)function).ExportToHL2(tree);
84      if(function is Sinus) return ((Sinus)function).ExportToHL2(tree);
85      if(function is Sqrt) return ((Sqrt)function).ExportToHL2(tree);
86      if(function is Subtraction) return ((Subtraction)function).ExportToHL2(tree);
87      if(function is Tangens) return ((Tangens)function).ExportToHL2(tree);
88      if(function is Variable) return ((Variable)function).ExportToHL2(tree);
89      if(function is Xor) return ((Xor)function).ExportToHL2(tree);
90      throw new UnknownFunctionException(function.Name);
91    }
92
93    #region IFunctionTreeNameGenerator Members
94
95    string IFunctionTreeNameGenerator.Name {
96      get { return "HL2 Representation"; }
97    }
98
99    public string GetName(IFunctionTree tree) {
100      string name = "";
101      try {
102        name = ExportFunction(tree.Function, tree);
103      } catch(UnknownFunctionException) {
104        name = "N/A";
105      }
106      return name;
107    }
108
109    #endregion
110  }
111
112  internal static class HL2ExporterExtensions {
113    private static string GetHL2FunctionName(string name) {
114      return "[F]" + name ;
115    }
116
117    public static string ExportToHL2(this Addition addition, IFunctionTree tree) {
118      return GetHL2FunctionName("Addition[0]");
119    }
120
121    public static string ExportToHL2(this Constant constant, IFunctionTree tree) {
122      double value = ((ConstrainedDoubleData)tree.GetLocalVariable(Constant.VALUE).Value).Data;
123      return "[T]Constant(" + value.ToString("r") + ";0;0)";
124    }
125
126    public static string ExportToHL2(this Cosinus cosinus, IFunctionTree tree) {
127      return GetHL2FunctionName("Trigonometrics[1]");
128    }
129
130    public static string ExportToHL2(this Differential differential, IFunctionTree tree) {
131      double weight = ((ConstrainedDoubleData)tree.GetLocalVariable(Differential.WEIGHT).Value).Data;
132      double index = ((ConstrainedIntData)tree.GetLocalVariable(Differential.INDEX).Value).Data;
133      double offset = ((ConstrainedIntData)tree.GetLocalVariable(Differential.OFFSET).Value).Data;
134
135      return "[T]Differential(" + weight.ToString("r") + ";" + index + ";" + -offset + ")";
136    }
137
138    public static string ExportToHL2(this Division division, IFunctionTree tree) {
139      return GetHL2FunctionName("Division[0]");
140    }
141
142    public static string ExportToHL2(this Exponential exponential, IFunctionTree tree) {
143      return GetHL2FunctionName("Exponential[0]");
144    }
145
146    public static string ExportToHL2(this Logarithm logarithm, IFunctionTree tree) {
147      return GetHL2FunctionName("Logarithm[0]");
148    }
149
150    public static string ExportToHL2(this Multiplication multiplication, IFunctionTree tree) {
151      return GetHL2FunctionName("Multiplication[0]");
152    }
153
154    public static string ExportToHL2(this Power power, IFunctionTree tree) {
155      return GetHL2FunctionName("Power[0]");
156    }
157
158    public static string ExportToHL2(this Signum signum, IFunctionTree tree) {
159      return GetHL2FunctionName("Signum[0]");
160    }
161
162    public static string ExportToHL2(this Sinus sinus, IFunctionTree tree) {
163      return GetHL2FunctionName("Trigonometrics[0]");
164    }
165
166    public static string ExportToHL2(this Sqrt sqrt, IFunctionTree tree) {
167      return GetHL2FunctionName("Sqrt[0]");
168    }
169
170    public static string ExportToHL2(this Subtraction substraction, IFunctionTree tree) {
171      return GetHL2FunctionName("Subtraction[0]");
172    }
173
174    public static string ExportToHL2(this Tangens tangens, IFunctionTree tree) {
175      return GetHL2FunctionName("Trigonometrics[2]");
176    }
177
178    public static string ExportToHL2(this Variable variable, IFunctionTree tree) {
179      double weight = ((ConstrainedDoubleData)tree.GetLocalVariable(Variable.WEIGHT).Value).Data;
180      double index = ((ConstrainedIntData)tree.GetLocalVariable(Variable.INDEX).Value).Data;
181      double offset = ((ConstrainedIntData)tree.GetLocalVariable(Variable.OFFSET).Value).Data;
182
183      return "[T]Variable(" + weight.ToString("r") + ";" + index + ";" + -offset + ")";
184    }
185
186    public static string ExportToHL2(this And and, IFunctionTree tree) {
187      return GetHL2FunctionName("Logical[0]");
188    }
189
190    public static string ExportToHL2(this Average average, IFunctionTree tree) {
191      return GetHL2FunctionName("Average[0]");
192    }
193
194    public static string ExportToHL2(this IfThenElse ifThenElse, IFunctionTree tree) {
195      return GetHL2FunctionName("Conditional[0]");
196    }
197
198    public static string ExportToHL2(this Not not, IFunctionTree tree) {
199      return GetHL2FunctionName("Logical[2]");
200    }
201
202    public static string ExportToHL2(this Or or, IFunctionTree tree) {
203      return GetHL2FunctionName("Logical[1]");
204    }
205
206    public static string ExportToHL2(this Xor xor, IFunctionTree tree) {
207      return GetHL2FunctionName("Logical[3]");
208    }
209
210    public static string ExportToHL2(this Equal equal, IFunctionTree tree) {
211      return GetHL2FunctionName("Boolean[2]");
212    }
213
214    public static string ExportToHL2(this LessThan lessThan, IFunctionTree tree) {
215      return GetHL2FunctionName("Boolean[0]");
216    }
217
218    public static string ExportToHL2(this GreaterThan greaterThan, IFunctionTree tree) {
219      return GetHL2FunctionName("Boolean[4]");
220    }
221  }
222}
Note: See TracBrowser for help on using the repository browser.