smats  0.0.1
Satisfability Modulo Arithmetic Theories Symbols
Loading...
Searching...
No Matches
expression.h
1
7#pragma once
8
9#include <algorithm> // for cpplint only
10#include <cmath>
11#include <cstddef>
12#include <functional>
13#include <limits>
14#include <map>
15#include <memory>
16#include <numbers>
17#include <ostream>
18#include <random>
19#include <string>
20#include <type_traits>
21#include <unordered_map>
22#include <utility>
23#include <vector>
24
25#include "smats/symbolic/environment.h"
26#include "smats/symbolic/expression_kind.h"
27#include "smats/symbolic/variable.h"
28#include "smats/symbolic/variables.h"
29#include "smats/util/definitions.h"
30#include "smats/util/hash.hpp"
31
32namespace smats {
33
34template <class T>
35class ExpressionCell; // In expression_cell.h
36template <class T>
37class ExpressionVar; // In expression_cell.h
38template <class T>
39class UnaryExpressionCell; // In expression_cell.h
40template <class T>
41class BinaryExpressionCell; // In expression_cell.h
42template <class T>
43class ExpressionAdd; // In expression_cell.h
44template <class T>
45class ExpressionMul; // In expression_cell.h
46template <class T>
47class ExpressionDiv; // In expression_cell.h
48template <class T>
49class ExpressionLog; // In expression_cell.h
50template <class T>
51class ExpressionAbs; // In expression_cell.h
52template <class T>
53class ExpressionExp; // In expression_cell.h
54template <class T>
55class ExpressionSqrt; // In expression_cell.h
56template <class T>
57class ExpressionPow; // In expression_cell.h
58template <class T>
59class ExpressionSin; // In expression_cell.h
60template <class T>
61class ExpressionCos; // In expression_cell.h
62template <class T>
63class ExpressionTan; // In expression_cell.h
64template <class T>
65class ExpressionAsin; // In expression_cell.h
66template <class T>
67class ExpressionAcos; // In expression_cell.h
68template <class T>
69class ExpressionAtan; // In expression_cell.h
70template <class T>
71class ExpressionAtan2; // In expression_cell.h
72template <class T>
73class ExpressionSinh; // In expression_cell.h
74template <class T>
75class ExpressionCosh; // In expression_cell.h
76template <class T>
77class ExpressionTanh; // In expression_cell.h
78template <class T>
79class ExpressionMin; // In expression_cell.h
80template <class T>
81class ExpressionMax; // In expression_cell.h
82template <class T>
83class ExpressionCeiling; // In expression_cell.h
84template <class T>
85class ExpressionFloor; // In expression_cell.h
86template <class T>
87class ExpressionIfThenElse; // In expression_cell.h
88template <class T>
89class ExpressionUninterpretedFunction; // In expression_cell.h
90template <class T>
91class Formula; // In formula.h
92template <class T>
93class ExpressionAddFactory; // In expression_factory.h
94template <class T>
95class ExpressionMulFactory; // In expression_factory.h
96
184template <class T>
186 friend class ExpressionCell<T>;
187 friend class ExpressionAddFactory<T>;
188 friend class ExpressionMulFactory<T>;
189
190 public:
191 static Expression<T> zero();
192 static Expression<T> one();
193 static Expression<T> pi() {
194 static Expression pi{static_cast<T>(std::numbers::pi)};
195 return pi;
196 }
197 static Expression<T> e() {
198 static Expression e{static_cast<T>(std::numbers::e)};
199 return e;
200 }
201 static Expression<T> NaN();
202
204 Expression();
205 Expression(const T& constant); // NOLINT (runtime/explicit): This conversion is desirable.
210 Expression(const Variable& var); // NOLINT (runtime/explicit): This conversion is desirable.
211
213 [[nodiscard]] ExpressionKind kind() const;
214
216 [[nodiscard]] Variables variables() const;
217
247 [[nodiscard]] bool equal_to(const Expression<T>& e) const;
248
250 [[nodiscard]] bool less(const Expression<T>& e) const;
251
253 [[nodiscard]] bool is_polynomial() const;
254
262 [[nodiscard]] T evaluate(const Environment<T>& env = {}) const;
263
270 [[nodiscard]] Expression<T> evaluate_partial(const Environment<T>& env) const;
271
282 [[nodiscard]] bool is_expanded() const;
283
293 [[nodiscard]] Expression<T> expand() const;
294
299 [[nodiscard]] Expression<T> substitute(const Variable& var, const Expression<T>& e) const;
300
313 [[nodiscard]] Expression<T> substitute(const std::unordered_map<Variable, Expression<T>>& s) const;
314
319 [[nodiscard]] Expression<T> differentiate(const Variable& x) const;
320
322 [[nodiscard]] std::string to_string() const;
323
325 void hash(InvocableHashAlgorithm auto& hasher) const noexcept { cell_->hash(hasher); }
326
327 ARITHMETIC_OPERATORS(Expression<T>)
328 GENERIC_ARITHMETIC_OPERATORS(Expression<T>, T&)
329 GENERIC_ARITHMETIC_OPERATORS(Expression<T>, Variable&)
330 Expression<T> operator-() const;
331 Expression<T>& operator++();
332 Expression<T> operator++(int);
333 Expression<T>& operator--();
334 Expression<T> operator--(int);
335 Expression<T>& operator^=(const Expression<T>& o);
336 Expression<T> operator^(const Expression<T>& o) const;
337
338 // Cast functions which takes a pointer to a non-const Expression.
339 [[nodiscard]] bool is_leaf() const;
340 [[nodiscard]] bool is_constant() const;
341 [[nodiscard]] bool is_constant(const T& value) const;
342 [[nodiscard]] bool is_variable() const;
343 [[nodiscard]] bool is_variable(const Variable& var) const;
344 [[nodiscard]] bool is_addition() const;
345 [[nodiscard]] bool is_multiplication() const;
346 [[nodiscard]] bool is_division() const;
347 [[nodiscard]] bool is_nan() const;
348 [[nodiscard]] bool is_pow() const;
349 template <ExpressionKind K>
350 [[nodiscard]] bool is() const {
351 return cell_->kind() == K;
352 }
353
354 [[nodiscard]] const T& constant() const;
355 [[nodiscard]] const std::map<Expression<T>, T>& expression_to_coeff_map() const;
356 [[nodiscard]] const std::map<Expression<T>, Expression<T>>& base_to_exponent_map() const;
357 [[nodiscard]] const Expression<T>& lhs() const;
358 [[nodiscard]] const Expression<T>& rhs() const;
359
361 [[nodiscard]] long use_count() const { return cell_.use_count(); }
362
363 private:
364 explicit Expression(const std::shared_ptr<const ExpressionCell<T>>& cell, bool is_expanded = false);
365
367 [[nodiscard]] const ExpressionCell<T>& cell() const { return *cell_; }
373 [[nodiscard]] ExpressionCell<T>& m_cell();
374
375 std::shared_ptr<const ExpressionCell<T>> cell_;
376};
377
378template <class T>
379Expression<T> operator+(const T& c, const Expression<T>& e);
380template <class T>
381Expression<T> operator-(const T& c, const Expression<T>& e);
382template <class T>
383Expression<T> operator*(const T& c, const Expression<T>& e);
384template <class T>
385Expression<T> operator/(const T& c, const Expression<T>& e);
386template <class T>
387Expression<T> operator^(const T& c, const Expression<T>& e);
388
389template <class T>
390std::ostream& operator<<(std::ostream& os, const Expression<T>& e);
391
392EXTERNAL_TEMPLATE_INSTANTIATION_NUMERIC(Expression);
393
398
399} // namespace smats
400
401namespace std {
402
403/* Provides std::hash<smats::Expression>. */
404template <class T>
405struct hash<smats::Expression<T>> : public smats::DefaultHash {};
406
407/* Provides std::less<smats::Expression>. */
408template <class T>
409struct less<smats::Expression<T>> {
410 bool operator()(const smats::Expression<T>& lhs, const smats::Expression<T>& rhs) const { return lhs.less(rhs); }
411};
412
413/* Provides std::equal_to<smats::Expression>. */
414template <class T>
415struct equal_to<smats::Expression<T>> {
416 bool operator()(const smats::Expression<T>& lhs, const smats::Expression<T>& rhs) const { return lhs.equal_to(rhs); }
417};
418
419} // namespace std
Definition environment.h:45
Definition expression.h:51
Definition expression.h:67
Definition expression_factory.h:18
Definition expression.h:65
Definition expression.h:71
Definition expression.h:69
Definition expression.h:83
Definition expression_cell.h:54
Definition expression.h:61
Definition expression.h:75
Definition expression.h:53
Definition expression.h:85
Definition expression.h:87
Definition expression.h:49
Definition expression.h:81
Definition expression.h:79
Definition expression_factory.h:56
Definition expression_cell.h:530
Definition expression.h:59
Definition expression.h:73
Definition expression.h:55
Definition expression.h:63
Definition expression.h:77
Definition expression.h:89
Definition expression.h:185
Variables variables() const
Definition expression.cpp:40
bool is_polynomial() const
Definition expression.cpp:57
Expression< T > evaluate_partial(const Environment< T > &env) const
Definition expression.cpp:107
ExpressionKind kind() const
Definition expression.cpp:36
T evaluate(const Environment< T > &env={}) const
Definition expression.cpp:103
Expression()
Definition expression.cpp:19
bool equal_to(const Expression< T > &e) const
Definition expression.cpp:45
bool is_expanded() const
Definition expression.cpp:111
bool less(const Expression< T > &e) const
Definition expression.cpp:51
Definition expression.h:91
Definition variable.h:34
Definition variables.h:27
Definition concepts.h:88
ExpressionKind enum.
ExpressionKind
Definition expression_kind.h:20
Definition gmp.cpp:14
Definition hash.hpp:265