AmpGen 2.1
Loading...
Searching...
No Matches
ExpressionParser.h
Go to the documentation of this file.
1#ifndef AMPGEN_EXPRESSIONPARSER_H
2#define AMPGEN_EXPRESSIONPARSER_H 1
3
4#include <complex>
5#include <functional>
6#include <map>
7#include <string>
8#include <utility>
9#include <vector>
10
11#include "AmpGen/Expression.h"
12#include "AmpGen/MetaUtils.h"
13#include "AmpGen/Types.h"
14#include "AmpGen/enum.h"
15#include "AmpGen/MsgService.h"
16
17namespace AmpGen {
18 class ASTResolver;
19 class MinuitParameter;
21
22 declare_enum(coordinateType, cartesian, polar);
23 declare_enum(angType, deg, rad);
24
25 template <typename arg_type> void set_tuple_from_expression(arg_type &arg, const Expression &expr) {
26 if constexpr(std::is_same<arg_type, Expression>::value) {
27 arg = expr;
28 } else if constexpr(std::is_same<arg_type, std::string>::value) {
29 arg = is<Variable>(expr) ? cast<Variable>(expr).name() : "ERROR";
30 } else if constexpr(std::is_same<arg_type, int>::value) {
31 arg = int(std::real(expr()));
32 } else if constexpr(std::is_same<arg_type, double>::value) {
33 arg = double(std::real(expr()));
34 } else if constexpr(std::is_same<arg_type, std::complex<double>>::value) {
35 arg = expr();
36 } else
37 FATAL("Unrecognised type: " << type_string<arg_type>());
38 }
39
40 template <typename... types> std::tuple<types...> unpack(const Expression &expression) {
41 std::tuple<types...> rt;
42 unsigned int counter = 0;
43 if(!is<ExpressionPack>(expression)) FATAL("Not a packed expression");
44 auto as_pack = cast<ExpressionPack>(expression).expressions();
45 if(as_pack.size() != std::tuple_size<std::tuple<types...>>::value) FATAL("Wrong number of expressions");
46 for_each(rt, [&as_pack, &counter](auto &element) {
47 set_tuple_from_expression(element, as_pack[counter]);
48 counter++;
49 });
50 return rt;
51 }
52
53 class ExpressionParser {
54 public:
55 typedef std::function<Expression(const Expression &)> unaryFCN;
56 typedef std::function<Expression(const Expression &, const Expression &)> binaryFCN;
57
58 void add_unary(const std::string &name, const unaryFCN &op) { m_unaryFunctions[name] = op; }
59 template <typename OP> void add_unary(const std::string &name) {
60 add_unary(name, [](const auto &expression) { return OP(expression); });
61 }
62 template <typename... args> void add_multi_arg(const std::string &name, const std::function<Expression(args...)> &fcn) {
63 add_unary(name, [fcn](const auto &expression) { return std::apply(fcn, unpack<args...>(expression)); });
64 }
65
66 void add_binary(const std::string &name, binaryFCN op) { m_binaryFunctions.emplace_back(name, op); }
67
68 static Expression parse(const std::string &str, const MinuitParameterSet *mps = nullptr);
69 static Expression
70 parse(std::vector<std::string>::const_iterator begin, std::vector<std::string>::const_iterator end, const MinuitParameterSet *mps = nullptr);
71 static ExpressionParser *gExpressionParser;
72 static ExpressionParser *getMe() {
73 if(!gExpressionParser) gExpressionParser = new ExpressionParser();
74 return gExpressionParser;
75 }
76
77 private:
79
80 Expression processEndPoint(const std::string &name, const MinuitParameterSet *mps = nullptr);
82 parseTokens(std::vector<std::string>::const_iterator begin, std::vector<std::string>::const_iterator end, const MinuitParameterSet *mps = nullptr);
83
84 void processBinaryOperators(std::vector<std::string> &opCodes, std::vector<Expression> &expressions);
85 void processUnaryOperators(std::vector<std::string> &opCodes, std::vector<Expression> &expressions);
86
87 std::map<std::string, unaryFCN> m_unaryFunctions;
88 std::vector<std::pair<std::string, binaryFCN>> m_binaryFunctions;
89 bool m_isCartesian = {true};
90 double m_sf = {1};
91 };
92} // namespace AmpGen
93
94#endif
(Internal) class to aide in the resolution of the dependencies of expression trees.
Definition ASTResolver.h:30
Wrapper class for shared_ptrs to virtual expressions for use in conjunction with operators to build e...
Definition Expression.h:135
void add_unary(const std::string &name, const unaryFCN &op)
void add_unary(const std::string &name)
static ExpressionParser * getMe()
std::function< Expression(const Expression &)> unaryFCN
void add_multi_arg(const std::string &name, const std::function< Expression(args...)> &fcn)
static Expression parse(std::vector< std::string >::const_iterator begin, std::vector< std::string >::const_iterator end, const MinuitParameterSet *mps=nullptr)
static Expression parse(const std::string &str, const MinuitParameterSet *mps=nullptr)
void add_binary(const std::string &name, binaryFCN op)
std::function< Expression(const Expression &, const Expression &)> binaryFCN
static ExpressionParser * gExpressionParser
#define declare_enum(name,...)
Definition enum.h:7
#define FATAL(X)
Used for printing fatal errors messages, and will always be printed and will terminate the process af...
Definition MsgService.h:92
void set_tuple_from_expression(arg_type &arg, const Expression &expr)
bool is(const Expression &expression)
Definition Expression.h:485
std::string type_string()
Utility classes for compile-time metaprogramming, such as identifying the types of arguments for gene...
Definition MetaUtils.h:17
T cast(const Expression &expression)
Definition Expression.h:486
std::tuple< types... > unpack(const Expression &expression)
std::enable_if_t< I==sizeof...(Tp), void > for_each(std::tuple< Tp... > &, FuncT)
Definition MetaUtils.h:36