delpi  0.0.1
DElta-complete LP solver
Loading...
Searching...
No Matches
Formula.h
1
7#pragma once
8
9#include <vector>
10
11#include "delpi/libs/gmp.h"
12#include "delpi/symbolic/Expression.h"
13#include "delpi/symbolic/FormulaKind.h"
14#include "delpi/util/concepts.h"
15
16namespace delpi {
17
32class Formula {
33 public:
34 Formula(Expression expression, FormulaKind kind, mpq_class rhs);
35 Formula(const Formula& o) = default;
36 Formula(Formula&& o) noexcept = default;
37 Formula& operator=(const Formula& o) = default;
38 Formula& operator=(Formula&& o) noexcept = default;
39
53 [[nodiscard]] Formula Substitute(const Expression::SubstitutionMap& s) const;
62 template <MapFromTo<Variable, mpq_class> T>
63 [[nodiscard]] bool Evaluate(const T& env) const;
64
66 [[nodiscard]] const Expression& expression() const { return expression_; }
68 [[nodiscard]] FormulaKind kind() const { return kind_; }
70 [[nodiscard]] const mpq_class& rhs() const { return rhs_; }
72 [[nodiscard]] std::vector<Variable> variables() const { return expression_.variables(); }
73
75 [[nodiscard]] bool equal_to(const Formula& o) const noexcept;
77 [[nodiscard]] bool less(const Formula& o) const noexcept;
79 [[nodiscard]] std::size_t hash() const noexcept;
80
81 Formula operator-() const;
82 Formula operator!() const;
83 std::strong_ordering operator<=>(const Formula&) const;
84 bool operator==(const Formula& o) const { return equal_to(o); }
85
88 mpq_class rhs_;
89};
90
91Formula operator==(const Variable& lhs, const Variable& rhs);
92Formula operator!=(const Variable& lhs, const Variable& rhs);
93Formula operator<(const Variable& lhs, const Variable& rhs);
94Formula operator<=(const Variable& lhs, const Variable& rhs);
95Formula operator>(const Variable& lhs, const Variable& rhs);
96Formula operator>=(const Variable& lhs, const Variable& rhs);
97
98Formula operator==(const Expression& lhs, const Expression& rhs);
99Formula operator!=(const Expression& lhs, const Expression& rhs);
100Formula operator<(const Expression& lhs, const Expression& rhs);
101Formula operator<=(const Expression& lhs, const Expression& rhs);
102Formula operator>(const Expression& lhs, const Expression& rhs);
103Formula operator>=(const Expression& lhs, const Expression& rhs);
104
105Formula operator==(mpq_class lhs, const Expression& rhs);
106Formula operator!=(mpq_class lhs, const Expression& rhs);
107Formula operator<(mpq_class lhs, const Expression& rhs);
108Formula operator<=(mpq_class lhs, const Expression& rhs);
109Formula operator>(mpq_class lhs, const Expression& rhs);
110Formula operator>=(mpq_class lhs, const Expression& rhs);
111
112Formula operator==(const Expression& lhs, mpq_class rhs);
113Formula operator!=(const Expression& lhs, mpq_class rhs);
114Formula operator<(const Expression& lhs, mpq_class rhs);
115Formula operator<=(const Expression& lhs, mpq_class rhs);
116Formula operator>(const Expression& lhs, mpq_class rhs);
117Formula operator>=(const Expression& lhs, mpq_class rhs);
118
119std::ostream& operator<<(std::ostream& os, const Formula& formula);
120
121} // namespace delpi
122
123#ifdef DELPI_INCLUDE_FMT
124
125#include "delpi/util/logging.h"
126
127OSTREAM_FORMATTER(delpi::Formula);
128
129#endif
Represents a symbolic form of an expression.
Definition Expression.h:37
Symbolic formula used to represent a constraint in the LP problem.
Definition Formula.h:32
bool Evaluate(const T &env) const
Evaluates the formula using a given environment (by default, an empty environment).
Definition Formula.cpp:25
Expression expression_
Left-hand side expression.
Definition Formula.h:86
FormulaKind kind_
Kind of the formula .
Definition Formula.h:87
mpq_class rhs_
Right-hand side constant.
Definition Formula.h:88
Formula Substitute(const Expression::SubstitutionMap &s) const
Create a copy of this formula with the expression having all occurrences of the variables in s replac...
Definition Formula.cpp:21
Real symbolic variable.
Definition Variable.h:20
Global namespace for the delpi library.
FormulaKind
Kinds of symbolic formulas.
Definition FormulaKind.h:14