1  #region License Information


2 


3  /* HeuristicLab


4  * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)


5  *


6  * This file is part of HeuristicLab.


7  *


8  * HeuristicLab is free software: you can redistribute it and/or modify


9  * it under the terms of the GNU General Public License as published by


10  * the Free Software Foundation, either version 3 of the License, or


11  * (at your option) any later version.


12  *


13  * HeuristicLab is distributed in the hope that it will be useful,


14  * but WITHOUT ANY WARRANTY; without even the implied warranty of


15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the


16  * GNU General Public License for more details.


17  *


18  * You should have received a copy of the GNU General Public License


19  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.


20  */


21 


22  #endregion


23  using System.Collections.Generic;


24  using System.Linq;


25  using HEAL.Attic;


26  using HeuristicLab.Common;


27  using HeuristicLab.Core;


28  using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;


29 


30  namespace HeuristicLab.Problems.DataAnalysis.Symbolic {


31  [StorableType("5A2300A0D0FC4F2DB910F86384FE9052")]


32  [Item("LinearScalingGrammar", "Represents a grammar which includes linear scaling parts implicitly.")]


33  public class LinearScalingGrammar : DataAnalysisGrammar, ISymbolicDataAnalysisGrammar {


34  public LinearScalingGrammar() : base(ItemAttribute.GetName(typeof(LinearScalingGrammar)),


35  ItemAttribute.GetDescription(typeof(LinearScalingGrammar))) {


36  Initialize();


37  }


38 


39  [StorableConstructor]


40  public LinearScalingGrammar(StorableConstructorFlag _) : base(_) { }


41 


42  protected LinearScalingGrammar(LinearScalingGrammar original, Cloner cloner) : base(original, cloner) { }


43  public LinearScalingGrammar(string name, string description) : base(name, description) { }


44 


45  public override IDeepCloneable Clone(Cloner cloner) {


46  return new LinearScalingGrammar(this, cloner);


47  }


48 


49  private void Initialize() {


50  #region Symbols


51 


52  var add = new Addition();


53  var sub = new Subtraction();


54  var mul = new Multiplication();


55  var div = new Division();


56  var sin = new Sine();


57  var cos = new Cosine();


58  var tan = new Tangent();


59  var tanh = new HyperbolicTangent();


60  var log = new Logarithm();


61  var exp = new Exponential();


62  var square = new Square();


63  var sqrt = new SquareRoot();


64  var cube = new Cube();


65  var cbrt = new CubeRoot();


66  var abs = new Absolute();


67  var aq = new AnalyticQuotient();


68  var number = new Number();


69  number.MinValue = 20;


70  number.MaxValue = 20;


71  var constant = new Constant();


72  var variableSymbol = new Variable();


73 


74  #endregion


75 


76  //Special symbols


77  var offset = new Addition { Name = "Offset" };


78  var scaling = new Multiplication { Name = "Scaling" };


79  //all other symbols


80  var allSymbols = new List<Symbol> {


81  add, sub, mul, div, number, constant, variableSymbol, sin, cos, tan, log, square, sqrt, cube, cbrt, exp,


82  tanh, aq, abs


83  };


84 


85  var bivariateFuncs = new List<Symbol> { add, sub, mul, div, aq };


86  var univariateFuncs = new List<Symbol> { sin, cos, tan, tanh, exp, log, abs, square, cube, sqrt, cbrt };


87  var realValueSymbols = new List<Symbol> {


88  add, sub, mul, div, sin, cos, tan, tanh, exp, log, aq, abs, square, cube, sqrt, cbrt,


89  variableSymbol, number, constant


90  };


91 


92 


93  //Add special symbols


94  AddSymbol(offset);


95  AddSymbol(scaling);


96  //Add all other symbols


97  foreach (var symb in allSymbols) AddSymbol(symb);


98 


99  #region define subtree count for special symbols


100 


101  foreach (var symb in bivariateFuncs) SetSubtreeCount(symb, 2, 2);


102 


103  foreach (var symb in univariateFuncs) SetSubtreeCount(symb, 1, 1);


104 


105  SetSubtreeCount(offset, 2, 2);


106  SetSubtreeCount(scaling, 2, 2);


107 


108  #endregion


109 


110  #region child symbols config


111 


112  AddAllowedChildSymbol(StartSymbol, offset);


113 


114  //Define childs for offset


115  AddAllowedChildSymbol(offset, scaling, 0);


116  AddAllowedChildSymbol(offset, number, 1);


117 


118  //Define childs for scaling


119  foreach (var symb in allSymbols) AddAllowedChildSymbol(scaling, symb, 0);


120  AddAllowedChildSymbol(scaling, number, 1);


121 


122  //Define childs for realvalue symbols


123  foreach (var symb in realValueSymbols) {


124  foreach (var c in realValueSymbols) AddAllowedChildSymbol(symb, c);


125  }


126 


127  #endregion


128 


129  Symbols.First(s => s is Cube).Enabled = false;


130  Symbols.First(s => s is CubeRoot).Enabled = false;


131  Symbols.First(s => s is Absolute).Enabled = false;


132  }


133  }


134  } 
