delpi  0.0.1
DElta-complete LP solver
Loading...
Searching...
No Matches
Expression.h
1
7#pragma once
8
9#include <cstddef>
10#include <functional>
11#include <map>
12#include <memory>
13#include <random>
14#include <string>
15#include <unordered_map>
16#include <utility>
17#include <vector>
18
19#include "delpi/libs/gmp.h"
20#include "delpi/symbolic/Variable.h"
21#include "delpi/util/concepts.h"
22#include "delpi/util/intrusive_ptr.hpp"
23
24namespace delpi {
25
26// Forward declaration. Found in "delpi/symbolic/ExpressionCell.h"
27class ExpressionCell;
28
37class Expression {
38 public:
39 using Addend = std::pair<Variable, mpq_class>;
40 using Addends = std::map<Variable, mpq_class>;
41 using SubstitutionMap = std::unordered_map<Variable, Variable>;
42
44 Expression();
45 Expression(Variable var); // NOLINT (runtime/explicit): This conversion is desirable.
46 Expression(Addend addend); // NOLINT (runtime/explicit): This conversion is desirable.
47 explicit Expression(Addends addends);
48 explicit Expression(std::vector<Addend> addends);
49 Expression(const Expression& e);
50 Expression(Expression&& e) noexcept;
51 Expression& operator=(const Expression& e);
52 Expression& operator=(Expression&& e) noexcept;
53 ~Expression();
54
56 [[nodiscard]] std::vector<Variable> variables() const;
58 [[nodiscard]] const Addends& addends() const;
60 [[nodiscard]] std::size_t use_count() const;
61
63 [[nodiscard]] bool equal_to(const Expression& o) const noexcept;
65 [[nodiscard]] bool less(const Expression& o) const noexcept;
67 [[nodiscard]] std::size_t hash() const noexcept;
75 template <MapFromTo<Variable, mpq_class> T>
76 [[nodiscard]] mpq_class Evaluate(const T& env = {}) const;
77
91 [[nodiscard]] Expression Substitute(const SubstitutionMap& s) const;
93 [[nodiscard]] std::string ToString() const;
94
102 Expression& Add(const Variable& var, const mpq_class& coeff);
110 Expression& Subtract(const Variable& var, const mpq_class& coeff);
111
112 Expression operator-() const;
113 Expression operator+() const;
114
115 Expression& operator*=(const mpq_class& o);
116 Expression& operator/=(const mpq_class& o);
117 Expression operator*(const mpq_class& o) const;
118 Expression operator/(const mpq_class& o) const;
119
120 Expression& operator+=(const Variable& o);
121 Expression& operator-=(const Variable& o);
122 Expression operator+(const Variable& o) const;
123 Expression operator-(const Variable& o) const;
124 Expression& operator+=(const Addend& o);
125 Expression& operator-=(const Addend& o);
126 Expression operator+(const Addend& o) const;
127 Expression operator-(const Addend& o) const;
128 Expression& operator+=(const Expression& o);
129 Expression& operator-=(const Expression& o);
130 Expression operator+(const Expression& o) const;
131 Expression operator-(const Expression& o) const;
132
140 std::ostream& Print(std::ostream& os) const;
141
142 private:
144};
145
146Expression operator-(const Variable& var);
147
148Expression operator*(const mpq_class& lhs, const Expression& rhs);
149Expression operator*(const mpq_class& lhs, const Variable& rhs);
150Expression operator*(const Variable& lhs, const mpq_class& rhs);
151Expression operator/(const Variable& lhs, const mpq_class& rhs);
152
153Expression operator+(const Variable& lhs, const Expression& rhs);
154Expression operator-(const Variable& lhs, const Expression& rhs);
155Expression operator+(const Expression::Addend& lhs, const Expression& rhs);
156Expression operator-(const Expression::Addend& lhs, const Expression& rhs);
157
158std::ostream& operator<<(std::ostream& os, const Expression& e);
159
160} // namespace delpi
161
162/* Provides std::hash<smats::Expression>. */
163template <>
164struct std::hash<delpi::Expression> {
165 size_t operator()(const delpi::Expression& e) const noexcept { return e.hash(); }
166};
167
168/* Provides std::less<smats::Expression>. */
169template <>
170struct std::less<delpi::Expression> {
171 bool operator()(const delpi::Expression& lhs, const delpi::Expression& rhs) const noexcept { return lhs.less(rhs); }
172};
173
174/* Provides std::equal_to<smats::Expression>. */
175template <>
176struct std::equal_to<delpi::Expression> {
177 bool operator()(const delpi::Expression& lhs, const delpi::Expression& rhs) const noexcept {
178 return lhs.equal_to(rhs);
179 }
180};
181
182#ifdef DELPI_INCLUDE_FMT
183
184#include "delpi/util/logging.h"
185
186OSTREAM_FORMATTER(delpi::Expression);
187
188#endif
Symbolic expression representing an addition between linear monomials.
Represents a symbolic form of an expression.
Definition Expression.h:37
Expression & Subtract(const Variable &var, const mpq_class &coeff)
Subtract a linear monomial , where is a constant and is a Variable, to the current expression.
Expression Substitute(const SubstitutionMap &s) const
Create a copy of this expression, replacing all occurrences of the variables in s with corresponding ...
std::ostream & Print(std::ostream &os) const
Print a string representation of this class to the provided os.
Expression & Add(const Variable &var, const mpq_class &coeff)
Add a linear monomial , where is a constant and is a Variable, to the current expression.
mpq_class Evaluate(const T &env={}) const
Evaluates using a given environment (by default, an empty environment).
intrusive_ptr< ExpressionCell > ptr_
Internal pointer to the ExpressionCell.
Definition Expression.h:143
Real symbolic variable.
Definition Variable.h:20
Pointer to a generic object that supports intrusive reference counting.
Global namespace for the delpi library.
LpRowSense operator-(const LpRowSense sense)
Invert the sense with delta > 0.