1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022010 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 


22  using System.Collections.Generic;


23  using HeuristicLab.Common;


24  using HeuristicLab.Core;


25  using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;


26  using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Symbols;


27  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;


28  using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols;


29  namespace HeuristicLab.Problems.DataAnalysis.Symbolic {


30  [StorableClass]


31  [Item("FullFunctionalExpressionGrammar", "Represents a grammar for functional expressions using all available functions.")]


32  public class FullFunctionalExpressionGrammar : DefaultSymbolicExpressionGrammar {


33  [StorableConstructor]


34  protected FullFunctionalExpressionGrammar(bool deserializing) : base(deserializing) { }


35  protected FullFunctionalExpressionGrammar(FullFunctionalExpressionGrammar original, Cloner cloner) : base(original, cloner) { }


36  public FullFunctionalExpressionGrammar()


37  : base() {


38  Initialize();


39  }


40 


41  public override IDeepCloneable Clone(Cloner cloner) {


42  return new FullFunctionalExpressionGrammar(this, cloner);


43  }


44 


45  private void Initialize() {


46  var add = new Addition();


47  var sub = new Subtraction();


48  var mul = new Multiplication();


49  var div = new Division();


50  var mean = new Average();


51  var sin = new Sine();


52  var cos = new Cosine();


53  var tan = new Tangent();


54  var log = new Logarithm();


55  var exp = new Exponential();


56  var @if = new IfThenElse();


57  var gt = new GreaterThan();


58  var lt = new LessThan();


59  var and = new And();


60  var or = new Or();


61  var not = new Not();


62 


63  var timeLag = new TimeLag();


64  timeLag.InitialFrequency = 0.0;


65  var integral = new Integral();


66  integral.InitialFrequency = 0.0;


67  var derivative = new Derivative();


68  derivative.InitialFrequency = 0.0;


69 


70  var variableCondition = new VariableCondition();


71  variableCondition.InitialFrequency = 0.0;


72 


73  var constant = new Constant();


74  constant.MinValue = 20;


75  constant.MaxValue = 20;


76  var variableSymbol = new HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols.Variable();


77  var laggedVariable = new LaggedVariable();


78  laggedVariable.InitialFrequency = 0.0;


79 


80  var allSymbols = new List<Symbol>() { add, sub, mul, div, mean, sin, cos, tan, log, exp, @if, gt, lt,


81  and, or, not, timeLag, integral, derivative, variableCondition, constant, variableSymbol, laggedVariable };


82  var unaryFunctionSymbols = new List<Symbol>() { sin, cos, tan, log, exp, not, timeLag, integral, derivative };


83  var binaryFunctionSymbols = new List<Symbol>() { gt, lt, variableCondition };


84  var functionSymbols = new List<Symbol>() { add, sub, mul, div, mean, and, or };


85  var terminalSymbols = new List<Symbol>() { variableSymbol, constant, laggedVariable };


86 


87  foreach (var symb in allSymbols)


88  AddSymbol(symb);


89 


90  foreach (var funSymb in functionSymbols) {


91  SetMinSubtreeCount(funSymb, 1);


92  SetMaxSubtreeCount(funSymb, 3);


93  }


94  foreach (var funSymb in unaryFunctionSymbols) {


95  SetMinSubtreeCount(funSymb, 1);


96  SetMaxSubtreeCount(funSymb, 1);


97  }


98  foreach (var funSymb in binaryFunctionSymbols) {


99  SetMinSubtreeCount(funSymb, 2);


100  SetMaxSubtreeCount(funSymb, 2);


101  }


102 


103  foreach (var terminalSymbol in terminalSymbols) {


104  SetMinSubtreeCount(terminalSymbol, 0);


105  SetMaxSubtreeCount(terminalSymbol, 0);


106  }


107 


108  SetMinSubtreeCount(@if, 3);


109  SetMaxSubtreeCount(@if, 3);


110 


111 


112  // allow each symbol as child of the start symbol


113  foreach (var symb in allSymbols) {


114  SetAllowedChild(StartSymbol, symb, 0);


115  }


116 


117  // allow each symbol as child of every other symbol (except for terminals that have maxSubtreeCount == 0)


118  foreach (var parent in allSymbols) {


119  for (int i = 0; i < GetMaxSubtreeCount(parent); i++)


120  foreach (var child in allSymbols) {


121  SetAllowedChild(parent, child, i);


122  }


123  }


124  }


125  }


126  }

