Free cookie consent management tool by TermsFeed Policy Generator

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

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

simplification of grammar and problem and bug fixes related to precalculated smoothed features

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