28 #ifndef GUM_MATH_FORMULA_H 29 #define GUM_MATH_FORMULA_H 40 #include <agrum/agrum.h> 41 #include <agrum/tools/core/hashTable.h> 95 token_function function;
113 FormulaPart(token_type t,
double n);
120 FormulaPart(token_type t,
char c);
127 FormulaPart(token_type t, token_function func);
133 FormulaPart(
const FormulaPart& source);
139 FormulaPart(FormulaPart&& source);
157 FormulaPart& operator=(
const FormulaPart& source);
164 FormulaPart& operator=(FormulaPart&& source);
176 std::string str()
const;
184 bool isLeftAssociative()
const;
192 bool isRightAssociative()
const;
202 int precedence()
const;
226 FormulaPart eval(
const std::vector< FormulaPart >& args)
const;
244 double operator_eval__(
const std::vector< FormulaPart >& args)
const;
259 double function_eval__(
const std::vector< FormulaPart >& args)
const;
267 size_t operator_argc__()
const;
275 size_t function_argc__()
const;
290 friend class gum::formula::Parser;
303 Formula(
unsigned short us);
305 Formula(
unsigned int ui);
307 Formula(
unsigned long ul);
308 Formula(
long long l);
309 Formula(
unsigned long long ul);
318 Formula(
const std::string& f);
324 Formula(
const Formula& source);
330 Formula(Formula&& source);
348 Formula& operator=(
const Formula& source);
355 Formula& operator=(Formula&& source);
360 explicit operator
double()
const {
return result(); }
372 HashTable< std::string,
double >& variables();
378 const HashTable< std::string,
double >& variables()
const;
387 double result()
const;
392 const std::string& formula()
const;
397 std::string& formula();
410 void push_number__(
const double& v);
416 void push_operator__(
char o);
421 void push_leftParenthesis__();
426 void push_rightParenthesis__();
432 void push_function__(
const std::string& func);
437 void push_variable__(
const std::string& var);
442 void push_identifier__(
const std::string& ident);
457 std::string formula__;
460 std::unique_ptr< gum::formula::Scanner > scanner__;
463 std::unique_ptr< gum::formula::Parser > parser__;
466 FormulaPart last_token__;
469 std::vector< FormulaPart > output__;
472 std::stack< FormulaPart > stack__;
475 HashTable< std::string,
double > variables__;
487 bool popOperator__(FormulaPart o);
494 void reduceOperatorOrFunction__(FormulaPart item,
495 std::stack< FormulaPart >& stack)
const;
501 void push_unaryOperator__(
char o);
507 void push_operator__(FormulaPart t);
513 bool isUnaryOperator__(
char o);
519 void push_output__(FormulaPart t);
525 void push_stack__(FormulaPart t);
533 Formula operator-(
const Formula& a);
535 Formula operator+(
const Formula& a,
const Formula& b);
537 Formula operator-(
const Formula& a,
const Formula& b);
539 Formula operator*(
const Formula& a,
const Formula& b);
541 Formula operator/(
const Formula& a,
const Formula& b);
543 std::string to_string(
const Formula& f);
545 std::ostream& operator<<(std::ostream& os,
const Formula& f);
551 #ifndef GUM_NO_INLINE 552 # include <agrum/tools/core/math/formula_inl.h>