KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
Expression.h
Go to the documentation of this file.
1
28#ifndef KIDS_EXPRESSION_H
29#define KIDS_EXPRESSION_H
30
31#include <string>
32#include <vector>
33
34#ifdef KIDS_EXPRESSION_USE_EXPRTK
35#include "exprtk/exprtk.hpp"
36#elif defined(KIDS_EXPRESSION_USE_LEPTON) // LEPTON is a math parser by OPENMM-team
37#else // by default using fparser.h
38#include "fparser/fparser.hh"
39#endif // KIDS_EXPRESSION_USE_EXPRTK
40
41namespace PROJECT_NS {
42
49template <typename T>
51 public:
57 static std::vector<Expression<T>>& getExpressions() {
58 static std::vector<Expression<T>> _GLOBAL_EXPRESSIONS;
59 return _GLOBAL_EXPRESSIONS;
60 }
61
69 static int registerExpression(const std::string& expression, const std::vector<std::string>& variables) {
70 auto& allExpressions = getExpressions();
71 int index = 0;
72 for (auto it = allExpressions.begin(); it != allExpressions.end(); ++it, ++index) {
73 if (expression == it->expressionString) return index; // Check if expression already exists
74 }
75 allExpressions.push_back(Expression<T>(expression, variables));
76 return allExpressions.size() - 1;
77 }
78
85 inline T evaluate(T* data) { return _evaluate(data); }
86
87 private:
88#ifdef KIDS_EXPRESSION_USE_EXPRTK
89 std::string expressionString;
90 std::vector<std::string> variablesString;
91 exprtk::expression<T> expressionValue;
92 std::vector<T> variablesValue;
93
100 Expression(const std::string& expressionStr, const std::vector<std::string>& varsStr)
101 : expressionString{expressionStr}, variablesString{varsStr} {
102 exprtk::symbol_table<T> symbolTable;
103 for (int i = 0; i < variablesString.size(); ++i)
104 symbolTable.add_variable(variablesString[i], variablesValue[i]);
105 symbolTable.add_constants();
106 expressionValue.register_symbol_table(symbolTable);
107 exprtk::parser<T>{}.compile(expressionString, expressionValue);
108 }
109
110 T _evaluate(T* data) {
111 for (int i = 0; i < variablesValue.size(); ++i) variablesValue[i] = data[i];
112 return expressionValue.value();
113 }
114
115#elif defined(KIDS_EXPRESSION_USE_LEPTON) // LEPTON is a math parser by OPENMM-team
116#else
117 std::string expressionString;
118 std::string variablesString;
119 FunctionParserBase<T> parser;
120
127 Expression(const std::string& expressionStr, const std::vector<std::string>& varsStr)
128 : expressionString{expressionStr} {
129 variablesString = "";
130 for (int i = 0; i < varsStr.size(); ++i) {
131 variablesString += (i == 0) ? varsStr[i] : (std::string(",") + varsStr[i]);
132 }
133 int res = parser.Parse(expressionString, variablesString);
134 if (res != -1) throw std::runtime_error(parser.ErrorMsg());
135 }
136
137 T _evaluate(T* data) { return parser.Eval(data); }
138
139#endif // KIDS_EXPRESSION_USE_EXPRTK
140};
141
142}; // namespace PROJECT_NS
143
144#endif // KIDS_EXPRESSION_H
A class representing a mathematical expression.
Definition Expression.h:50
static int registerExpression(const std::string &expression, const std::vector< std::string > &variables)
Register a new mathematical expression.
Definition Expression.h:69
static std::vector< Expression< T > > & getExpressions()
Get the list of registered expressions.
Definition Expression.h:57
FunctionParserBase< T > parser
The parser for the expression.
Definition Expression.h:119
T evaluate(T *data)
Evaluate the expression with given variable values.
Definition Expression.h:85
std::string expressionString
The mathematical expression string.
Definition Expression.h:117
std::string variablesString
List of variables in the expression.
Definition Expression.h:118
Expression(const std::string &expressionStr, const std::vector< std::string > &varsStr)
Private constructor to initialize the expression.
Definition Expression.h:127
VARIABLE< kids_real > T
< http://warp.povusers.org/FunctionParser/fparser.html
Definition Context.h:39