Fleet  0.0.9
Inference in the LOT
MyGrammar.h
Go to the documentation of this file.
1 #pragma once
2 
6 
7 #include "Singleton.h"
8 #include "Grammar.h"
9 #include "ConstantContainer.h"
10 
11 const double TERMINAL_P = 1.0;
12 const double X_P = 3.0;
13 const double CONST_P = 1.0;
14 
15 class MyGrammar : public Grammar<X_t,D,
16  X_t,D,Constant,ConstantContainer*>,
17  public Singleton<MyGrammar> {
18 public:
19  MyGrammar() {
20 
21  add("(%s+%s)", +[](D a, D b) -> D { return a+b; });
22  add("(%s-%s)", +[](D a, D b) -> D { return a-b; });
23  add("(%s*%s)", +[](D a, D b) -> D { return a*b; });
24  add("(%s/%s)", +[](D a, D b) -> D { return a/b; });
25  add("(-%s)", +[](D a) -> D { return -a; });
26 
27  add("exp(%s)", +[](D a) -> D { return exp(a); });
28  add("log(%s)", +[](D a) -> D { return log(a); });
29 
30  add("1", +[]() -> D { return 1.0; }, TERMINAL_P);
31  add("sqrt_abs(%s)", +[](D a) -> D { return std::sqrt(std::abs(a)); });
32 
33 #if FEYNMAN
34 
35  add("tau", +[]() -> D { return 2*M_PI; }, TERMINAL_P); // pi is for losers
36  add("0.5", +[]() -> D { return 0.5; }, TERMINAL_P);
37 
38  add("pow_abs(%s,2)", +[](D a) -> D { return a*a; }, 1./2);
39  add("pow_abs(%s,3)", +[](D a) -> D { return a*a*a; }, 1./2);
40 
41  add("tanh(%s)", +[](D a) -> D { return tanh(a); }, 1./5);
42  add("sin(%s)", +[](D a) -> D { return sin(a); }, 1./5);
43  add("cos(%s)", +[](D a) -> D { return cos(a); }, 1./5);
44  add("asin(%s)", +[](D a) -> D { return asin(a); }, 1./5);
45  add("acos(%s)", +[](D a) -> D { return acos(a); }, 1./5);
46 
47 #else
48  // we're only going to use unrestricted pow in non-FEYNMAN cases, just for simplicity
49  add("pow_abs(%s,%s)", +[](D a, D b) -> D { return pow(std::abs(a),b); });
50 
51  add("%s", +[](Constant c) -> D { return c.get_value(); }, CONST_P);
52 
53  // Access a constant (myself as ConstantContainer)
54  add("%s.C", +[](ConstantContainer* h) -> Constant { return h->next_constant(); });
55  add("h", Builtins::selfptr<MyGrammar, ConstantContainer>); // a pointer to myself (only one way) as a ConstantContainer
56 
57 #endif
58 
59  }
60 
61 } grammar;
Definition: Grammar.h:44
MyGrammar grammar
This is a struct to basically hold a double (or float) for use in SymbolicRegression etc This allows ...
Definition: Singleton.h:6
Definition: ConstantContainer.h:48
virtual Constant next_constant()
Definition: ConstantContainer.h:66
const double TERMINAL_P
Definition: Main.cpp:24
constant_t get_value() const
Definition: ConstantContainer.h:33
Definition: MyGrammar.h:72
MyGrammar()
Definition: MyGrammar.h:79
Definition: ConstantContainer.h:24
void add(std::string fmt, Primitive< T, args... > &b, double p=1.0, int a=0)
Definition: Grammar.h:312
double D
Definition: Main.cpp:15
A grammar stores all of the rules associated with any kind of nonterminal and permits us to sample as...