13#include <unordered_map>
16#include "smats/symbolic/environment.h"
17#include "smats/symbolic/expression.h"
18#include "smats/symbolic/expression_kind.h"
19#include "smats/symbolic/variable.h"
20#include "smats/symbolic/variables.h"
21#include "smats/util/definitions.h"
22#include "smats/util/hash.hpp"
27using Substitution = std::unordered_map<Variable, Expression<T>>;
29#define PARAMS(...) __VA_ARGS__
30#define NEW_OPERATOR(class_name) \
31 static std::shared_ptr<const class_name<T>> New() { \
32 return std::make_shared<const class_name<T>>(typename ExpressionCell<T>::Private()); \
34 explicit class_name(typename ExpressionCell<T>::Private)
36#define NEW_OPERATOR_PARAMS(class_name, params, args) \
37 static std::shared_ptr<const class_name<T>> New(params) { \
38 return std::make_shared<const class_name<T>>(typename ExpressionCell<T>::Private(), args); \
40 class_name(typename ExpressionCell<T>::Private, params)
54class ExpressionCell :
public std::enable_shared_from_this<ExpressionCell<T>> {
61 return std::enable_shared_from_this<ExpressionCell<T>>::shared_from_this().use_count();
96 template <
template <
class>
class E>
97 [[nodiscard]]
const E<T>&
to()
const {
99 if (
kind() != E<T>::expression_kind)
throw std::runtime_error(
"ExpressionCell::to(): invalid cast");
101 return static_cast<const E<T>&
>(*this);
108 template <
template <
class>
class E>
109 [[nodiscard]] E<T>&
to() {
111 if (
kind() != E<T>::expression_kind)
throw std::runtime_error(
"ExpressionCell::to(): invalid cast");
113 return static_cast<E<T>&
>(*this);
121 return Expression{std::enable_shared_from_this<ExpressionCell<T>>::shared_from_this()};
167 virtual std::ostream&
display(std::ostream& os)
const = 0;
194 virtual void compute_variables(std::optional<Variables>&
variables)
const = 0;
195 virtual void compute_is_polynomial(std::optional<bool>&
is_polynomial)
const = 0;
291 [[nodiscard]]
virtual T
do_evaluate(
const T& v1,
const T& v2)
const = 0;
293 void compute_variables(std::optional<Variables>&
variables)
const override;
294 void compute_is_polynomial(std::optional<bool>&
is_polynomial)
const override;
328 std::ostream&
display(std::ostream& os)
const override;
333 void compute_variables(std::optional<Variables>&
variables)
const override;
334 void compute_is_polynomial(std::optional<bool>&
is_polynomial)
const override;
362 std::ostream&
display(std::ostream& os)
const override;
367 void compute_variables(std::optional<Variables>&
variables)
const override;
368 void compute_is_polynomial(std::optional<bool>&
is_polynomial)
const override;
392 std::ostream&
display(std::ostream& os)
const override;
395 void compute_variables(std::optional<Variables>&
variables)
const override;
396 void compute_is_polynomial(std::optional<bool>&
is_polynomial)
const override;
414 using ExpressionMap = std::map<Expression<T>, T>;
428 std::ostream&
display(std::ostream& os)
const override;
445 void compute_variables(std::optional<Variables>&
variables)
const override;
446 void compute_is_polynomial(std::optional<bool>&
is_polynomial)
const override;
472 using ExpressionMap = std::map<Expression<T>,
Expression<T>>;
476 PARAMS(
constant, expr_to_coeff_map));
486 std::ostream&
display(std::ostream& os)
const override;
503 void compute_variables(std::optional<Variables>&
variables)
const override;
504 void compute_is_polynomial(std::optional<bool>&
is_polynomial)
const override;
533 static void check_domain(
const T& v1,
const T& v2);
541 std::ostream&
display(std::ostream& os)
const override;
544 T
do_evaluate(
const T& v1,
const T& v2)
const override;
546 void compute_is_polynomial(std::optional<bool>&
is_polynomial)
const override;
564 static void check_domain(
const T& v1,
const T& v2);
572 std::ostream&
display(std::ostream& os)
const override;
575 T
do_evaluate(
const T& v1,
const T& v2)
const override;
Definition expression_cell.h:265
T evaluate(const Environment< T > &env) const override
Definition expression_cell.cpp:206
const Expression< T > & lhs() const
Definition expression_cell.h:272
virtual T do_evaluate(const T &v1, const T &v2) const =0
bool equal_to(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:194
const Expression< T > e1_
The first argument of the binary expression.
Definition expression_cell.h:297
const Expression< T > e2_
The second argument of the binary expression.
Definition expression_cell.h:298
void hash(DelegatingHasher &hasher) const override
Definition expression_cell.cpp:189
const Expression< T > & rhs() const
Definition expression_cell.h:274
BinaryExpressionCell(ExpressionKind kind, Expression< T > e1, Expression< T > e2, bool is_expanded)
Definition expression_cell.cpp:186
bool less(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:200
Definition environment.h:45
Definition expression_cell.h:412
Expression< T > differentiate(const Variable &x) const override
Definition expression_cell.cpp:474
ExpressionMap & m_expr_to_coeff_map()
Definition expression_cell.cpp:489
Expression< T > substitute(const Substitution< T > &s) const override
Definition expression_cell.cpp:468
bool equal_to(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:424
const T & constant() const
Definition expression_cell.h:430
const ExpressionMap & expr_to_coeff_map() const
Definition expression_cell.h:435
const ExpressionMap expr_to_coeff_map_
Map from expressions to their coefficients.
Definition expression_cell.h:443
T & m_constant()
Definition expression_cell.cpp:484
void hash(DelegatingHasher &) const override
Definition expression_cell.cpp:404
Expression< T > evaluate_partial(const Environment< T > &env) const override
Definition expression_cell.cpp:462
std::ostream & display(std::ostream &os) const override
Definition expression_cell.cpp:494
T evaluate(const Environment< T > &env) const override
Definition expression_cell.cpp:451
bool less(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:435
std::ostream & display_term(std::ostream &os, bool print_plus, const T &coeff, const Expression< T > &term) const
Definition expression_cell.cpp:510
Expression< T > expand() const override
Definition expression_cell.cpp:456
const T constant_
Constant term of the addition.
Definition expression_cell.h:442
Definition expression_cell.h:54
virtual Expression< T > evaluate_partial(const Environment< T > &env) const =0
virtual void hash(DelegatingHasher &) const =0
void set_expanded()
Definition expression_cell.h:89
ExpressionKind kind() const
Definition expression_cell.h:65
std::optional< bool > is_polynomial_
Cached information about whether the expression is a polynomial.
Definition expression_cell.h:200
virtual T evaluate(const Environment< T > &env) const =0
virtual Expression< T > substitute(const Substitution< T > &s) const =0
virtual Expression< T > expand() const =0
E< T > & to()
Definition expression_cell.h:109
bool is_expanded_
Whether the expression is already expanded.
Definition expression_cell.h:201
virtual Expression< T > differentiate(const Variable &x) const =0
Expression< T > to_expression() const
Definition expression_cell.h:120
const E< T > & to() const
Definition expression_cell.h:97
virtual bool less(const ExpressionCell< T > &o) const =0
virtual bool equal_to(const ExpressionCell< T > &o) const =0
std::optional< Variables > variables_
Cached variables in the expression.
Definition expression_cell.h:199
bool is_polynomial() const
Definition expression_cell.cpp:161
const ExpressionKind kind_
The kind of the expression.
Definition expression_cell.h:198
void invalidate_cache()
Definition expression_cell.cpp:167
bool is_expanded() const
Definition expression_cell.h:80
virtual std::ostream & display(std::ostream &os) const =0
long use_count() const
Definition expression_cell.h:60
const Variables & variables() const
Definition expression_cell.cpp:155
Definition expression_cell.h:308
T & m_value()
Definition expression_cell.cpp:273
Expression< T > expand() const override
Definition expression_cell.cpp:257
const T value_
Constant value.
Definition expression_cell.h:331
Expression< T > differentiate(const Variable &x) const override
Definition expression_cell.cpp:269
T evaluate(const Environment< T > &env) const override
Definition expression_cell.cpp:253
std::ostream & display(std::ostream &os) const override
Definition expression_cell.cpp:278
bool less(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:247
const T & value() const
Definition expression_cell.h:315
Expression< T > evaluate_partial(const Environment< T > &env) const override
Definition expression_cell.cpp:261
bool equal_to(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:241
Expression< T > substitute(const Substitution< T > &s) const override
Definition expression_cell.cpp:265
Definition expression_cell.h:561
Expression< T > evaluate_partial(const Environment< T > &env) const override
Definition expression_cell.cpp:752
Expression< T > substitute(const Substitution< T > &s) const override
Definition expression_cell.cpp:762
T do_evaluate(const T &v1, const T &v2) const override
Definition expression_cell.cpp:756
Expression< T > expand() const override
Definition expression_cell.cpp:742
std::ostream & display(std::ostream &os) const override
Definition expression_cell.cpp:777
Expression< T > differentiate(const Variable &x) const override
Definition expression_cell.cpp:766
Definition expression_cell.h:470
const T constant_
Constant term of the multiplication.
Definition expression_cell.h:500
void hash(DelegatingHasher &) const override
Definition expression_cell.cpp:534
std::ostream & display(std::ostream &os) const override
Definition expression_cell.cpp:647
const ExpressionMap & base_to_exponent_map() const
Definition expression_cell.h:493
Expression< T > expand() const override
Definition expression_cell.cpp:603
std::ostream & display_term(std::ostream &os, bool print_mul, const Expression< T > &base, const Expression< T > &exponent) const
Definition expression_cell.cpp:662
T & m_constant()
Definition expression_cell.cpp:637
Expression< T > evaluate_partial(const Environment< T > &env) const override
Definition expression_cell.cpp:615
Expression< T > differentiate(const Variable &x) const override
Definition expression_cell.cpp:629
T evaluate(const Environment< T > &env) const override
Definition expression_cell.cpp:593
const ExpressionMap base_to_exponent_map_
Map from expressions to their exponent.
Definition expression_cell.h:501
Expression< T > substitute(const Substitution< T > &s) const override
Definition expression_cell.cpp:622
const T & constant() const
Definition expression_cell.h:488
bool equal_to(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:566
ExpressionMap & m_base_to_exponent_map()
Definition expression_cell.cpp:642
bool less(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:577
Definition expression_cell.h:378
T evaluate(const Environment< T > &env) const override
Definition expression_cell.cpp:371
Expression< T > evaluate_partial(const Environment< T > &env) const override
Definition expression_cell.cpp:379
bool less(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:366
Expression< T > differentiate(const Variable &x) const override
Definition expression_cell.cpp:387
bool equal_to(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:361
Expression< T > expand() const override
Definition expression_cell.cpp:375
Expression< T > substitute(const Substitution< T > &s) const override
Definition expression_cell.cpp:383
std::ostream & display(std::ostream &os) const override
Definition expression_cell.cpp:391
void hash(DelegatingHasher &hasher) const override
Definition expression_cell.cpp:347
Definition expression_cell.h:530
T do_evaluate(const T &v1, const T &v2) const override
Definition expression_cell.cpp:730
Expression< T > expand() const override
Definition expression_cell.cpp:689
Expression< T > evaluate_partial(const Environment< T > &env) const override
Definition expression_cell.cpp:697
Expression< T > differentiate(const Variable &x) const override
Definition expression_cell.cpp:710
std::ostream & display(std::ostream &os) const override
Definition expression_cell.cpp:714
Expression< T > substitute(const Substitution< T > &s) const override
Definition expression_cell.cpp:701
Definition expression_cell.h:344
bool less(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:309
bool equal_to(const ExpressionCell< T > &o) const override
Definition expression_cell.cpp:303
std::ostream & display(std::ostream &os) const override
Definition expression_cell.cpp:337
Expression< T > expand() const override
Definition expression_cell.cpp:319
Expression< T > substitute(const Substitution< T > &s) const override
Definition expression_cell.cpp:328
Expression< T > evaluate_partial(const Environment< T > &env) const override
Definition expression_cell.cpp:323
Expression< T > differentiate(const Variable &x) const override
Definition expression_cell.cpp:333
T evaluate(const Environment< T > &env) const override
Definition expression_cell.cpp:315
const Variable var_
Variable contained in the Expression. Cannot be a Boolean variable.
Definition expression_cell.h:365
const Variable & variable() const
Definition expression_cell.h:351
Definition expression.h:185
Definition expression_cell.h:219
const Expression< T > & get_argument() const
Definition expression_cell.h:222
UnaryExpressionCell(ExpressionKind k, Expression< T > e, bool is_expanded)
Definition expression_cell.cpp:176
virtual T do_evaluate(T v) const =0
const Expression< T > e_
The argument of the unary expression.
Definition expression_cell.h:248
Definition variables.h:27
ExpressionKind
Definition expression_kind.h:20
@ Constant
constant (double)
Definition expression_cell.h:179