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, std::stack< FormulaPart >& stack)
const;
500 void _push_unaryOperator_(
char o);
506 void _push_operator_(FormulaPart t);
512 bool _isUnaryOperator_(
char o);
518 void _push_output_(FormulaPart t);
524 void _push_stack_(FormulaPart t);
532 Formula operator-(
const Formula& a);
534 Formula operator+(
const Formula& a,
const Formula& b);
536 Formula operator-(
const Formula& a,
const Formula& b);
538 Formula operator*(
const Formula& a,
const Formula& b);
540 Formula operator/(
const Formula& a,
const Formula& b);
542 std::string to_string(
const Formula& f);
544 std::ostream& operator<<(std::ostream& os,
const Formula& f);
550 #ifndef GUM_NO_INLINE 551 # include <agrum/tools/core/math/formula_inl.h>