134 case FormulaPart::token_function::exp: {
137 case FormulaPart::token_function::log: {
140 case FormulaPart::token_function::ln: {
143 case FormulaPart::token_function::pow: {
146 case FormulaPart::token_function::sqrt: {
162 return args[1].number + args[0].number;
166 return args[1].number - args[0].number;
170 return args[1].number * args[0].number;
174 return args[1].number / args[0].number;
178 return std::pow(args[1].
number, args[0].number);
182 return 0 - args[0].number;
196 case FormulaPart::token_function::exp: {
197 return std::exp(args[0].
number);
199 case FormulaPart::token_function::log: {
200 return std::log(args[0].
number);
202 case FormulaPart::token_function::ln: {
203 return std::log2(args[0].
number);
205 case FormulaPart::token_function::pow: {
206 return std::pow(args[1].
number, args[0].number);
208 case FormulaPart::token_function::sqrt: {
209 return std::sqrt(args[0].
number);
256 || __stack.top().type != FormulaPart::token_type::OPERATOR) {
273 if (__isUnaryOperator(o)) {
274 __push_unaryOperator(o);
277 FormulaPart t(FormulaPart::token_type::OPERATOR, o);
284 switch (__last_token.type) {
285 case FormulaPart::token_type::OPERATOR:
286 case FormulaPart::token_type::NIL:
287 case FormulaPart::token_type::ARG_SEP: {
291 case FormulaPart::token_type::PARENTHESIS: {
292 return (o ==
'-') && (__last_token.character ==
'(');
304 FormulaPart t(FormulaPart::token_type::OPERATOR,
'_');
310 while (__popOperator(t)) {
311 __push_output(__stack.top());
320 FormulaPart t(FormulaPart::token_type::PARENTHESIS,
'(');
326 while ((!__stack.empty()) && (__stack.top().character !=
'(')) {
327 __push_output(__stack.top());
331 if (__stack.empty()) {
334 }
else if (__stack.top().character !=
'(') {
340 if ((!__stack.empty())
341 && __stack.top().type == FormulaPart::token_type::FUNCTION) {
342 __push_output(__stack.top());
345 __last_token =
FormulaPart(FormulaPart::token_type::PARENTHESIS,
')');
350 while (!__stack.empty()) {
351 if (__stack.top().character ==
'(') {
355 __push_output(__stack.top());
363 std::stack< FormulaPart >& stack)
const {
364 std::vector< FormulaPart > args;
366 if (stack.size() < item.
argc()) {
370 while (item.
argc() > args.size()) {
371 args.push_back(stack.top());
375 stack.push(item.
eval(args));
380 __output.push_back(t);
394 FormulaPart::token_function::exp);
397 }
else if (func ==
"log") {
399 FormulaPart::token_function::log);
402 }
else if (func ==
"ln") {
404 FormulaPart::token_function::ln);
407 }
else if (func ==
"pow") {
409 FormulaPart::token_function::pow);
412 }
else if (func ==
"sqrt") {
414 FormulaPart::token_function::sqrt);
424 while ((!__stack.empty()) && (__stack.top().character !=
'(')) {
425 __push_output(__stack.top());
429 if (__stack.empty() || __stack.top().character !=
'(') {
433 __last_token =
FormulaPart(FormulaPart::token_type::ARG_SEP,
',');
446 if (__variables.exists(var)) {
447 __push_number(__variables[var]);
457 __push_function(ident);
461 __push_variable(ident);
Formula operator+(const Formula &a, const Formula &b)
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
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)