15#ifdef DEAL_II_WITH_SYMENGINE
23# include <symengine/complex_double.h>
24# include <symengine/logic.h>
25# include <symengine/number.h>
26# include <symengine/parser.h>
27# include <symengine/real_double.h>
28# include <symengine/symbol.h>
29# include <symengine/symengine_exception.h>
38#ifdef DEAL_II_WITH_SYMENGINE
44 namespace SE = ::SymEngine;
56 : expression(SE::boolean(value))
76 "The conditional expression must return a boolean type."));
78 const SE::RCP<const SE::Boolean> condition_rcp =
79 SE::rcp_static_cast<const SE::Boolean>(condition.
get_RCP());
81 SE::piecewise({{expression_if_true.
get_RCP(), condition_rcp},
82 {expression_if_false.
get_RCP(), SE::boolTrue}});
87 &condition_expression,
90 SE::PiecewiseVec piecewise_function;
91 piecewise_function.reserve(condition_expression.size() + 1);
94 for (
const auto &entry : condition_expression)
96 Assert(SE::is_a_Boolean(entry.first.get_value()),
98 "The conditional expression must return a boolean type."));
99 piecewise_function.emplace_back(
100 entry.second.get_RCP(),
101 SE::rcp_static_cast<const SE::Boolean>(entry.first.get_RCP()));
105 piecewise_function.emplace_back(expression_otherwise.
get_RCP(),
110 expression = SE::piecewise(std::move(piecewise_function));
115 &condition_expression)
121 Expression(numbers::signaling_nan<double>()));
126 : expression(SE::symbol(symbol))
131 const bool parse_as_expression)
138 SE::rcp_static_cast<const SE::Basic>(SE::symbol(
150 : expression(SE::function_symbol(
152 Utilities::convert_expression_vector_to_basic_vector(arguments)))
206 std::getline(is, expr);
215 const SE::Expression &
236 const SE::RCP<const SE::Basic> &
248 const SymEngine::RCP<const SymEngine::Symbol> &symbol)
const
256 const SymEngine::RCP<const SymEngine::Basic> &symbol)
const
273 Expression::operator
const SymEngine::Expression &()
const
275 return get_expression();
279 Expression::operator
const SymEngine::RCP<const SymEngine::Basic> &()
const
281 return get_expression().get_basic();
290 const SymEngine::map_basic_basic &substitution_values)
const
311 "Substitution with a number that does not represent a symbol."));
314 sub_vals[symbol] = value;
336 this->expression = std::move(rhs.expression);
445 ExcMessage(
"The expression must return a boolean type."));
447 const SE::RCP<const SE::Boolean> expression_rcp =
448 SE::rcp_static_cast<const SE::Boolean>(expression.
get_RCP());
450 return Expression(SE::logical_not(expression_rcp));
458 ExcMessage(
"The lhs expression must return a boolean type."));
460 ExcMessage(
"The rhs expression must return a boolean type."));
462 const SE::RCP<const SE::Boolean> lhs_rcp =
463 SE::rcp_static_cast<const SE::Boolean>(lhs.
get_RCP());
464 const SE::RCP<const SE::Boolean> rhs_rcp =
465 SE::rcp_static_cast<const SE::Boolean>(rhs.
get_RCP());
467 return Expression(SE::logical_and({lhs_rcp, rhs_rcp}));
475 ExcMessage(
"The lhs expression must return a boolean type."));
477 ExcMessage(
"The rhs expression must return a boolean type."));
479 const SE::RCP<const SE::Boolean> lhs_rcp =
480 SE::rcp_static_cast<const SE::Boolean>(lhs.
get_RCP());
481 const SE::RCP<const SE::Boolean> rhs_rcp =
482 SE::rcp_static_cast<const SE::Boolean>(rhs.
get_RCP());
484 return Expression(SE::logical_or({lhs_rcp, rhs_rcp}));
492 ExcMessage(
"The lhs expression must return a boolean type."));
494 ExcMessage(
"The rhs expression must return a boolean type."));
496 const SE::RCP<const SE::Boolean> lhs_rcp =
497 SE::rcp_static_cast<const SE::Boolean>(lhs.
get_RCP());
498 const SE::RCP<const SE::Boolean> rhs_rcp =
499 SE::rcp_static_cast<const SE::Boolean>(rhs.
get_RCP());
501 return Expression(SE::logical_xor({lhs_rcp, rhs_rcp}));
* * reference operator*() const
Expression & operator/=(const Expression &rhs)
Expression & parse(const std::string &expression)
Expression operator-() const
Expression & operator=(const Expression &rhs)
const SymEngine::RCP< const SymEngine::Basic > & get_RCP() const
void load(std::istream &stream)
Expression & operator*=(const Expression &rhs)
std::ostream & print(std::ostream &stream) const
Expression substitute(const types::substitution_map &substitution_values) const
void save(std::ostream &stream) const
Expression & operator-=(const Expression &rhs)
const SymEngine::Basic & get_value() const
const SymEngine::Expression & get_expression() const
Expression & operator+=(const Expression &rhs)
SymEngine::Expression expression
Expression differentiate(const Expression &symbol) const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcIO()
static ::ExceptionBase & ExcSymEngineParserError(std::string arg1)
#define Assert(cond, exc)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
SymEngine::map_basic_basic convert_expression_map_to_basic_map(const SD::types::substitution_map &substitution_map)
std::vector< SD::Expression > symbol_vector
std::map< SD::Expression, SD::Expression, internal::ExpressionKeyLess > substitution_map
Expression operator<(const Expression &lhs, const Expression &rhs)
Expression operator-(Expression lhs, const Expression &rhs)
Expression operator+(Expression lhs, const Expression &rhs)
Expression operator!(const Expression &expression)
Expression operator||(const Expression &lhs, const Expression &rhs)
Expression operator^(const Expression &lhs, const Expression &rhs)
Expression operator>=(const Expression &lhs, const Expression &rhs)
Expression operator!=(const Expression &lhs, const Expression &rhs)
Expression operator|(const Expression &lhs, const Expression &rhs)
Expression operator>(const Expression &lhs, const Expression &rhs)
Expression operator&(const Expression &lhs, const Expression &rhs)
Expression operator/(Expression lhs, const Expression &rhs)
Expression operator<=(const Expression &lhs, const Expression &rhs)
Expression operator&&(const Expression &lhs, const Expression &rhs)
std::ostream & operator<<(std::ostream &stream, const Expression &expression)
Expression operator==(const Expression &lhs, const Expression &rhs)
std::istream & operator>>(std::istream &stream, Expression &expression)