124 case FormulaPart::token_function::exp: {
127 case FormulaPart::token_function::log: {
130 case FormulaPart::token_function::ln: {
133 case FormulaPart::token_function::pow: {
136 case FormulaPart::token_function::sqrt: {
150 return args[1].number + args[0].number;
154 return args[1].number - args[0].number;
158 return args[1].number * args[0].number;
162 return args[1].number / args[0].number;
166 return std::pow(args[1].
number, args[0].number);
170 return 0 - args[0].number;
182 case FormulaPart::token_function::exp: {
183 return std::exp(args[0].
number);
185 case FormulaPart::token_function::log: {
186 return std::log(args[0].
number);
188 case FormulaPart::token_function::ln: {
189 return std::log2(args[0].
number);
191 case FormulaPart::token_function::pow: {
192 return std::pow(args[1].
number, args[0].number);
194 case FormulaPart::token_function::sqrt: {
195 return std::sqrt(args[0].
number);
238 || __stack.top().type != FormulaPart::token_type::OPERATOR) {
255 if (__isUnaryOperator(o)) {
256 __push_unaryOperator(o);
259 FormulaPart t(FormulaPart::token_type::OPERATOR, o);
266 switch (__last_token.type) {
267 case FormulaPart::token_type::OPERATOR:
268 case FormulaPart::token_type::NIL:
269 case FormulaPart::token_type::ARG_SEP: {
273 case FormulaPart::token_type::PARENTHESIS: {
274 return (o ==
'-') && (__last_token.character ==
'(');
277 default: {
return false; }
284 FormulaPart t(FormulaPart::token_type::OPERATOR,
'_');
290 while (__popOperator(t)) {
291 __push_output(__stack.top());
300 FormulaPart t(FormulaPart::token_type::PARENTHESIS,
'(');
306 while ((!__stack.empty()) && (__stack.top().character !=
'(')) {
307 __push_output(__stack.top());
311 if (__stack.empty()) {
314 }
else if (__stack.top().character !=
'(') {
320 if ((!__stack.empty())
321 && __stack.top().type == FormulaPart::token_type::FUNCTION) {
322 __push_output(__stack.top());
325 __last_token =
FormulaPart(FormulaPart::token_type::PARENTHESIS,
')');
330 while (!__stack.empty()) {
331 if (__stack.top().character ==
'(') {
335 __push_output(__stack.top());
343 std::stack< FormulaPart >& stack)
const {
344 std::vector< FormulaPart > args;
346 if (stack.size() < item.
argc()) {
350 while (item.
argc() > args.size()) {
351 args.push_back(stack.top());
355 stack.push(item.
eval(args));
360 __output.push_back(t);
374 FormulaPart::token_function::exp);
377 }
else if (func ==
"log") {
379 FormulaPart::token_function::log);
382 }
else if (func ==
"ln") {
384 FormulaPart::token_function::ln);
387 }
else if (func ==
"pow") {
389 FormulaPart::token_function::pow);
392 }
else if (func ==
"sqrt") {
394 FormulaPart::token_function::sqrt);
404 while ((!__stack.empty()) && (__stack.top().character !=
'(')) {
405 __push_output(__stack.top());
409 if (__stack.empty() || __stack.top().character !=
'(') {
413 __last_token =
FormulaPart(FormulaPart::token_type::ARG_SEP,
',');
426 if (__variables.exists(var)) {
427 __push_number(__variables[var]);
437 __push_function(ident);
441 __push_variable(ident);
Formula operator+(const Formula &a, const Formula &b)
gum is the global namespace for all aGrUM entities
std::ostream & operator<<(std::ostream &output, const BayesNet< GUM_SCALAR > &bn)
Prints map's DAG in output using the Graphviz-dot format.
Formula operator/(const Formula &a, const Formula &b)
std::string to_string(const Formula &f)
Formula operator*(const Formula &a, const Formula &b)
ListConstIterator< Val >::difference_type operator-(const ListConstIterator< Val > &iter1, const ListConstIterator< Val > &iter2)
For STL compliance, a distance operator.
#define GUM_ERROR(type, msg)