[17902]  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;


[17650]  24  using System.Linq;


[17628]  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")]


[17958]  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))) {


[17628]  36  Initialize();


 37  }


 38 


 39  [StorableConstructor]


[17958]  40  public LinearScalingGrammar(StorableConstructorFlag _) : base(_) { }


[17628]  41 


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


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


[17628]  44 


 45  public override IDeepCloneable Clone(Cloner cloner) {


[17958]  46  return new LinearScalingGrammar(this, cloner);


[17628]  47  }


 48 


 49  private void Initialize() {


 50  #region Symbols


 51 


[17880]  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();


[17902]  59  var tanh = new HyperbolicTangent();


[17880]  60  var log = new Logarithm();


[17902]  61  var exp = new Exponential();


[17880]  62  var square = new Square();


 63  var sqrt = new SquareRoot();


[17902]  64  var cube = new Cube();


 65  var cbrt = new CubeRoot();


 66  var abs = new Absolute();


 67  var aq = new AnalyticQuotient();


[18093]  68  var constant = new Num();


[17628]  69  constant.MinValue = 20;


 70  constant.MaxValue = 20;


[18093]  71  var number = new RealConstant();


 72  number.MinValue = 20;


 73  number.MaxValue = 20;


[17628]  74  var variableSymbol = new Variable();


 75 


 76  #endregion


 77 


 78  //Special symbols


[17902]  79  var offset = new Addition { Name = "Offset" };


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


[17628]  81  //all other symbols


 82  var allSymbols = new List<Symbol> {


[18093]  83  add, sub, mul, div, constant, number, variableSymbol, sin, cos, tan, log, square, sqrt, cube, cbrt, exp,


[17902]  84  tanh, aq, abs


[17628]  85  };


 86 


[17902]  87  var bivariateFuncs = new List<Symbol> { add, sub, mul, div, aq };


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


 89  var realValueSymbols = new List<Symbol> {


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


[18093]  91  variableSymbol, constant, number


[17902]  92  };


[17628]  93 


 94 


 95  //Add special symbols


 96  AddSymbol(offset);


 97  AddSymbol(scaling);


 98  //Add all other symbols


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


 100 


 101  #region define subtree count for special symbols


 102 


[17902]  103  foreach (var symb in bivariateFuncs) SetSubtreeCount(symb, 2, 2);


[17628]  104 


[17902]  105  foreach (var symb in univariateFuncs) SetSubtreeCount(symb, 1, 1);


[17628]  106 


 107  SetSubtreeCount(offset, 2, 2);


 108  SetSubtreeCount(scaling, 2, 2);


 109 


 110  #endregion


 111 


 112  #region child symbols config


 113 


 114  AddAllowedChildSymbol(StartSymbol, offset);


 115 


 116  //Define childs for offset


 117  AddAllowedChildSymbol(offset, scaling, 0);


 118  AddAllowedChildSymbol(offset, constant, 1);


 119 


 120  //Define childs for scaling


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


 122  AddAllowedChildSymbol(scaling, constant, 1);


 123 


 124  //Define childs for realvalue symbols


 125  foreach (var symb in realValueSymbols) {


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


 127  }


 128 


 129  #endregion


[17650]  130 


[17902]  131  Symbols.First(s => s is Cube).Enabled = false;


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


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


[17628]  134  }


 135  }


 136  } 
