Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Problems.GeneticProgramming.BloodGlucosePrediction/Grammar.cs @ 13865

Last change on this file since 13865 was 13865, checked in by gkronber, 8 years ago

#2608 first import of project

File size: 9.9 KB
Line 
1using HeuristicLab.Common;
2using HeuristicLab.Core;
3using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
4using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
5
6namespace HeuristicLab.Problems.GeneticProgramming.GlucosePrediction {
7  [StorableClass]
8  [Item("Blood glucose level forecast grammar", "See MedGEC Workshop at GECCO 2016")]
9  public class Grammar : SymbolicExpressionGrammar {
10    [StorableConstructor]
11    protected Grammar(bool deserializing) : base(deserializing) { }
12    protected Grammar(Grammar original, Cloner cloner) : base(original, cloner) { }
13
14    public Grammar()
15      : base("Blood glucose level forecast grammar", "See MedGEC Workshop at GECCO 2016") {
16      Initialize();
17    }
18
19    public void Initialize() {
20      var func = new SimpleSymbol("Func", "The root for the blood glucose forecasting model.", 3, 3);
21      var exprGluc = new SimpleSymbol("ExprGluc", string.Empty, 1, 1);
22      var exprIns = new SimpleSymbol("ExprIns", string.Empty, 1, 1);
23      var exprCh = new SimpleSymbol("ExprCh", string.Empty, 1, 1);
24
25      var predGlucData = new PredictedGlucoseVariableSymbol();
26      var realGlucData = new RealGlucoseVariableSymbol();
27
28      // operators for exprGluc
29      var plusGluc = new SimpleSymbol("+", "+", 2, 2);
30      var minusGluc = new SimpleSymbol("-", "-", 2, 2);
31      var prodGluc = new SimpleSymbol("*", "*", 2, 2);
32      var divGluc = new SimpleSymbol("/", "/", 2, 2);
33      var expGluc = new SimpleSymbol("Exp", "Exp", 1, 1);
34      var sinGluc = new SimpleSymbol("Sin", "Sin", 1, 1);
35      var cosGluc = new SimpleSymbol("Cos", "Cos", 1, 1);
36      var logGluc = new SimpleSymbol("Log", "Log", 1, 1);
37      // var cteGluc = new CteSymbol();
38
39      // operators for exprCh
40      var plusCh = new SimpleSymbol("+Ch", "+", 2, 2);
41      var minusCh = new SimpleSymbol("-Ch", "-", 2, 2);
42      var prodCh = new SimpleSymbol("*Ch", "*", 2, 2);
43      var divCh = new SimpleSymbol("/Ch", "/", 2, 2);
44      var expCh = new SimpleSymbol("ExpCh", "Exp", 1, 1);
45      var sinCh = new SimpleSymbol("SinCh", "Sin", 1, 1);
46      var cosCh = new SimpleSymbol("CosCh", "Cos", 1, 1);
47      var logCh = new SimpleSymbol("LogCh", "Log", 1, 1);
48      var curvedChShape1 = new CurvedChVariableSymbol("CurvedCh1", "", 2, 5);
49      var curvedChShape2 = new CurvedChVariableSymbol("CurvedCh2", "", 3, 3);
50      var curvedChShape3 = new CurvedChVariableSymbol("CurvedCh3", "", 5, 2);
51      // var cteCh = new CteSymbol();
52
53      // operators for exprIns
54      var plusIns = new SimpleSymbol("+Ins", "+", 2, 2);
55      var minusIns = new SimpleSymbol("-Ins", "-", 2, 2);
56      var prodIns = new SimpleSymbol("*Ins", "*", 2, 2);
57      var divIns = new SimpleSymbol("/Ins", "/", 2, 2);
58      var expIns = new SimpleSymbol("ExpIns", "Exp", 1, 1);
59      var sinIns = new SimpleSymbol("SinIns", "Sin", 1, 1);
60      var cosIns = new SimpleSymbol("CosIns", "Cos", 1, 1);
61      var logIns = new SimpleSymbol("LogIns", "Log", 1, 1);
62      var curvedInsShape1 = new CurvedInsVariableSymbol("CurvedIns1", "", 2, 5);
63      var curvedInsShape2 = new CurvedInsVariableSymbol("CurvedIns2", "", 3, 3);
64      var curvedInsShape3 = new CurvedInsVariableSymbol("CurvedIns3", "", 5, 2);
65      var realInsVar = new RealInsulineVariableSymbol();
66      // var cteCh = new CteSymbol();
67
68      AddSymbol(func);
69      AddSymbol(exprGluc);
70      AddSymbol(exprIns);
71      AddSymbol(exprCh);
72      AddSymbol(predGlucData);
73      AddSymbol(realGlucData);
74      AddSymbol(plusGluc);
75      AddSymbol(minusGluc);
76      AddSymbol(prodGluc);
77      AddSymbol(divGluc);
78      AddSymbol(expGluc);
79      AddSymbol(sinGluc);
80      AddSymbol(cosGluc);
81      AddSymbol(logGluc);
82
83      AddSymbol(curvedChShape1);
84      AddSymbol(curvedChShape2);
85      AddSymbol(curvedChShape3);
86      AddSymbol(plusCh);
87      AddSymbol(minusCh);
88      AddSymbol(prodCh);
89      AddSymbol(divCh);
90      AddSymbol(expCh);
91      AddSymbol(sinCh);
92      AddSymbol(cosCh);
93      AddSymbol(logCh);
94
95      AddSymbol(curvedInsShape1);
96      AddSymbol(curvedInsShape2);
97      AddSymbol(curvedInsShape3);
98      AddSymbol(plusIns);
99      AddSymbol(minusIns);
100      AddSymbol(prodIns);
101      AddSymbol(divIns);
102      AddSymbol(expIns);
103      AddSymbol(sinIns);
104      AddSymbol(cosIns);
105      AddSymbol(logIns);
106      AddSymbol(realInsVar);
107
108      // <func> ::= <exprgluc> + <exprch> - <exprins>
109      AddAllowedChildSymbol(func, exprGluc, 0);
110      AddAllowedChildSymbol(func, exprCh, 1);
111      AddAllowedChildSymbol(func, exprIns, 2);
112
113      /* # Glucose
114      <exprgluc> ::= (<exprgluc> <op> <exprgluc>)
115                    |<preop> (<exprgluc>)
116                    |(<cte> <op> <exprgluc>)
117                    |predictedData(k-<idxCurr2h>)
118                    |realData(k-<idx2hOrMore>)
119      */
120      var opGlucSet = new Symbol[] { plusGluc, minusGluc, prodGluc, divGluc, expGluc, sinGluc, cosGluc, logGluc };
121      foreach (var opGluc in opGlucSet) {
122        AddAllowedChildSymbol(exprGluc, opGluc);
123      }
124
125      // <exprgluc> ::= (<exprgluc> <op> <exprgluc>)
126      // <exprgluc> ::= (<cte> <op> <exprgluc>)
127      foreach (var op in new Symbol[] { plusGluc, minusGluc, prodGluc, divGluc }) {
128        AddAllowedChildSymbol(op, exprGluc, 0);
129        // AddAllowedChildSymbol(op, cteGluc, 0); // cte is only allowed as first child
130        AddAllowedChildSymbol(op, exprGluc, 1);
131      }
132      // <exprgluc> ::= <preop> (<exprgluc>)
133      foreach (var op in new Symbol[] { expGluc, sinGluc, cosGluc, logGluc }) {
134        AddAllowedChildSymbol(op, exprGluc, 0);
135      }
136
137      AddAllowedChildSymbol(exprGluc, predGlucData); // <exprgluc> ::= predictedData(k-<idxCurr2h>)
138      AddAllowedChildSymbol(exprGluc, realGlucData); // <exprgluc> ::= realData(k-<idx2hOrMore>)
139
140
141      /*
142      # CH
143      <exprch> ::= (<exprch> <op> <exprch>)
144                    |<preop> (<exprch>)
145                    |(<cte> <op> <exprch>) 
146                    |(getPrevData(1,k,1) * <cte> * <curvedCH>)
147
148      # CH in 2 (0.041,24), 3 (0.027,36) and 4 (0.02,48) hours with 3 shapes of beta:
149      <curvedCH> ::= beta(0.041*Math.min(24,getPrevDataDistance(1,k,1)),2,5)
150              |beta(0.041*Math.min(24,getPrevDataDistance(1,k,1)),3,3)
151              |beta(0.041*Math.min(24,getPrevDataDistance(1,k,1)),5,2)
152              |beta(0.027*Math.min(36,getPrevDataDistance(1,k,1)),2,5)
153              |beta(0.027*Math.min(36,getPrevDataDistance(1,k,1)),3,3)
154              |beta(0.027*Math.min(36,getPrevDataDistance(1,k,1)),5,2)
155              |beta(0.02*Math.min(48,getPrevDataDistance(1,k,1)),2,5)
156              |beta(0.02*Math.min(48,getPrevDataDistance(1,k,1)),3,3)
157              |beta(0.02*Math.min(48,getPrevDataDistance(1,k,1)),5,2)
158      */
159      var opChSet = new Symbol[] { plusCh, minusCh, prodCh, divCh, expCh, sinCh, cosCh, logCh };
160      foreach (var opCh in opChSet) {
161        AddAllowedChildSymbol(exprCh, opCh);
162      }
163
164      // <exprch> ::= (<exprch> <op> <exprch>)
165      // <exprch> ::= (<cte> <op> <exprch>)
166      foreach (var op in new Symbol[] { plusCh, minusCh, prodCh, divCh }) {
167        AddAllowedChildSymbol(op, exprCh, 0);
168        // AddAllowedChildSymbol(op, cteCh, 0); // cte is only allowed as first child
169        AddAllowedChildSymbol(op, exprCh, 1);
170      }
171      // <exprch> ::= <preop> (<exprch>)
172      foreach (var op in new Symbol[] { expCh, sinCh, cosCh, logCh }) {
173        AddAllowedChildSymbol(op, exprCh, 0);
174      }
175      // <exprch> ::= (getPrevData(1,k,1) * <cte> * <curvedCH>)
176      AddAllowedChildSymbol(exprCh, curvedChShape1);
177      AddAllowedChildSymbol(exprCh, curvedChShape2);
178      AddAllowedChildSymbol(exprCh, curvedChShape3);
179
180      /*
181       # Insulin:
182      ## Sum of insulins in past 2h minus the peak
183      ## Curve for the peak in past 2h
184      <exprins> ::= (<exprins> <op> <exprins>)
185        |<preop> (<exprins>)
186        |(<cte> <op> <exprins>)   
187        |getVariable(2,k-<idx>)
188        |(getSumOfValues(24,k,2) - getMaxValue(24,k,2) <op> (getMaxValue(24,k,2) <op> <curvedINS>))
189
190      # INS in 2 (0.041,24), 3 (0.027,36) and 4 (0.02,48) hours with 3 shapes of beta:
191      <curvedINS> ::= beta(0.041*Math.min(24,getMaxValueDistance(24,k,2)),2,5)
192              |beta(0.041*Math.min(24,getMaxValueDistance(24,k,2)),3,3)
193              |beta(0.041*Math.min(24,getMaxValueDistance(24,k,2)),5,2)
194              |beta(0.027*Math.min(36,getMaxValueDistance(36,k,2)),2,5)
195              |beta(0.027*Math.min(36,getMaxValueDistance(36,k,2)),3,3)
196              |beta(0.027*Math.min(36,getMaxValueDistance(36,k,2)),5,2)
197              |beta(0.02*Math.min(48,getMaxValueDistance(48,k,2)),2,5)
198              |beta(0.02*Math.min(48,getMaxValueDistance(48,k,2)),3,3)
199              |beta(0.02*Math.min(48,getMaxValueDistance(48,k,2)),5,2)
200
201      */
202      var opInsSet = new Symbol[] { plusIns, minusIns, prodIns, divIns, expIns, sinIns, cosIns, logIns };
203      foreach (var opIns in opInsSet) {
204        AddAllowedChildSymbol(exprIns, opIns);
205      }
206
207      // <exprins> ::= (<exprins> <op> <exprins>)
208      // <exprins> ::= (<cte> <op> <exprins>)   
209      foreach (var op in new Symbol[] { plusIns, minusIns, prodIns, divIns }) {
210        AddAllowedChildSymbol(op, exprIns, 0);
211        // AddAllowedChildSymbol(op, cteIns, 0); // cte is only allowed as first child
212        AddAllowedChildSymbol(op, exprIns, 1);
213      }
214      // <exprins> ::= <preop> (<exprins>)
215      foreach (var op in new Symbol[] { expIns, sinIns, cosIns, logIns }) {
216        AddAllowedChildSymbol(op, exprIns, 0);
217      }
218
219      // <exprIns> ::= getVariable(2,k-<idx>)
220      AddAllowedChildSymbol(exprIns, realInsVar);
221
222      AddAllowedChildSymbol(exprIns, curvedInsShape1);
223      AddAllowedChildSymbol(exprIns, curvedInsShape2);
224      AddAllowedChildSymbol(exprIns, curvedInsShape3);
225
226      // root is func
227      AddAllowedChildSymbol(StartSymbol, func);
228    }
229
230    public override IDeepCloneable Clone(Cloner cloner) {
231      return new Grammar(this, cloner);
232    }
233  }
234}
Note: See TracBrowser for help on using the repository browser.