Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.GP.StructureIdentification/3.3/SymbolicExpressionExporter.cs @ 2264

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

Fixed export of GP trees to s-exp in the trunk. #715

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