AmpGen
2.1
Toggle main menu visibility
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
17
namespace
AmpGen
{
18
class
ASTResolver
;
19
class
MinuitParameter
;
20
class
MinuitParameterSet
;
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
:
78
ExpressionParser
();
79
80
Expression
processEndPoint(
const
std::string &name,
const
MinuitParameterSet
*mps =
nullptr
);
81
Expression
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
Expression.h
MetaUtils.h
MsgService.h
Types.h
AmpGen::ASTResolver
(Internal) class to aide in the resolution of the dependencies of expression trees.
Definition
ASTResolver.h:30
AmpGen::Expression
Wrapper class for shared_ptrs to virtual expressions for use in conjunction with operators to build e...
Definition
Expression.h:135
AmpGen::ExpressionParser
Definition
ExpressionParser.h:53
AmpGen::ExpressionParser::add_unary
void add_unary(const std::string &name, const unaryFCN &op)
Definition
ExpressionParser.h:58
AmpGen::ExpressionParser::add_unary
void add_unary(const std::string &name)
Definition
ExpressionParser.h:59
AmpGen::ExpressionParser::getMe
static ExpressionParser * getMe()
Definition
ExpressionParser.h:72
AmpGen::ExpressionParser::unaryFCN
std::function< Expression(const Expression &)> unaryFCN
Definition
ExpressionParser.h:55
AmpGen::ExpressionParser::add_multi_arg
void add_multi_arg(const std::string &name, const std::function< Expression(args...)> &fcn)
Definition
ExpressionParser.h:62
AmpGen::ExpressionParser::parse
static Expression parse(std::vector< std::string >::const_iterator begin, std::vector< std::string >::const_iterator end, const MinuitParameterSet *mps=nullptr)
AmpGen::ExpressionParser::parse
static Expression parse(const std::string &str, const MinuitParameterSet *mps=nullptr)
AmpGen::ExpressionParser::add_binary
void add_binary(const std::string &name, binaryFCN op)
Definition
ExpressionParser.h:66
AmpGen::ExpressionParser::binaryFCN
std::function< Expression(const Expression &, const Expression &)> binaryFCN
Definition
ExpressionParser.h:56
AmpGen::ExpressionParser::gExpressionParser
static ExpressionParser * gExpressionParser
Definition
ExpressionParser.h:71
AmpGen::MinuitParameter
Definition
MinuitParameter.h:15
AmpGen::MinuitParameterSet
Definition
MinuitParameterSet.h:13
enum.h
declare_enum
#define declare_enum(name,...)
Definition
enum.h:7
FATAL
#define FATAL(X)
Used for printing fatal errors messages, and will always be printed and will terminate the process af...
Definition
MsgService.h:92
AmpGen::fcn
Definition
Expression.h:464
AmpGen
Definition
AddCPConjugate.h:2
AmpGen::set_tuple_from_expression
void set_tuple_from_expression(arg_type &arg, const Expression &expr)
Definition
ExpressionParser.h:25
AmpGen::is
bool is(const Expression &expression)
Definition
Expression.h:485
AmpGen::type_string
std::string type_string()
Utility classes for compile-time metaprogramming, such as identifying the types of arguments for gene...
Definition
MetaUtils.h:17
AmpGen::cast
T cast(const Expression &expression)
Definition
Expression.h:486
AmpGen::unpack
std::tuple< types... > unpack(const Expression &expression)
Definition
ExpressionParser.h:40
AmpGen::for_each
std::enable_if_t< I==sizeof...(Tp), void > for_each(std::tuple< Tp... > &, FuncT)
Definition
MetaUtils.h:36
AmpGen
ExpressionParser.h
Generated on
for AmpGen by
1.17.0