dReal4
contractor.h
1 #pragma once
2 #include <iostream>
3 #include <memory>
4 #include <vector>
5 
6 #include "dreal/contractor/contractor_status.h"
7 #include "dreal/solver/config.h"
8 #include "dreal/util/box.h"
9 #include "dreal/util/ibex_converter.h"
10 
11 namespace dreal {
12 
13 // Forward declarations.
14 class ContractorCell;
15 class ContractorId;
16 class ContractorInteger;
17 class ContractorSeq;
18 class ContractorIbexFwdbwd;
19 class ContractorIbexPolytope;
20 class ContractorFixpoint;
21 class ContractorWorklistFixpoint;
22 class ContractorJoin;
23 template <typename ContextType>
25 
26 // Box::IntervalVector × Box::IntervalVector → Bool
27 using TerminationCondition =
28  std::function<bool(Box::IntervalVector const&, Box::IntervalVector const&)>;
29 
30 class Contractor {
31  public:
32  enum class Kind {
33  ID,
34  INTEGER,
35  SEQ,
36  IBEX_FWDBWD,
37  IBEX_POLYTOPE,
38  FIXPOINT,
39  WORKLIST_FIXPOINT,
40  FORALL,
41  JOIN,
42  };
43 
44  explicit Contractor(const Config& config);
45 
46  /// Default copy constructor.
47  Contractor(const Contractor&) = default;
48 
49  /// Default move constructor.
50  Contractor(Contractor&&) = default;
51 
52  /// Default copy assign operator.
53  Contractor& operator=(const Contractor&) = default;
54 
55  /// Default move assign operator.
56  Contractor& operator=(Contractor&&) = default;
57 
58  /// Default destructor.
59  ~Contractor() = default;
60 
61  /// Returns the input vector of this contractor. `input()[i] = true`
62  /// means that this contractor depends on the value of `box[i]`.
63  const DynamicBitset& input() const;
64 
65  /// Prunes @p cs.
66  void Prune(ContractorStatus* cs) const;
67 
68  /// Returns kind.
69  Kind kind() const;
70 
71  /// Returns true if this contractor includes a forall contractor.
72  bool include_forall() const;
73 
74  /// Sets include_forall true.
75  void set_include_forall();
76 
77  friend std::ostream& operator<<(std::ostream& os, Contractor const& ctc);
78 
79  private:
80  explicit Contractor(std::shared_ptr<ContractorCell> ptr);
81 
82  std::shared_ptr<ContractorCell> ptr_{};
83 
84  friend Contractor make_contractor_id(const Config& config);
85  friend Contractor make_contractor_integer(const Box& box,
86  const Config& config);
88  const std::vector<Contractor>& contractors, const Config& config);
90  const Config& config);
91  friend Contractor make_contractor_ibex_polytope(std::vector<Formula> formulas,
92  const Box& box,
93  const Config& config);
95  TerminationCondition term_cond,
96  const std::vector<Contractor>& contractors, const Config& config);
98  TerminationCondition term_cond,
99  const std::vector<Contractor>& contractors, const Config& config);
100  template <typename ContextType>
101  friend Contractor make_contractor_forall(Formula f, const Box& box,
102  double epsilon, double inner_delta,
103  const Config& config);
104  friend Contractor make_contractor_join(std::vector<Contractor> vec,
105  const Config& config);
106 
107  // Note that the following converter functions are only for
108  // low-level operations. To use them, you need to include
109  // "contractor_cell.h" file.
110  friend std::shared_ptr<ContractorId> to_id(const Contractor& contractor);
111  friend std::shared_ptr<ContractorInteger> to_integer(
112  const Contractor& contractor);
113  friend std::shared_ptr<ContractorSeq> to_seq(const Contractor& contractor);
114  friend std::shared_ptr<ContractorIbexFwdbwd> to_ibex_fwdbwd(
115  const Contractor& contractor);
116  friend std::shared_ptr<ContractorIbexPolytope> to_ibex_polytope(
117  const Contractor& contractor);
118  friend std::shared_ptr<ContractorFixpoint> to_fixpoint(
119  const Contractor& contractor);
120  friend std::shared_ptr<ContractorWorklistFixpoint> to_worklist_fixpoint(
121  const Contractor& contractor);
122  friend std::shared_ptr<ContractorJoin> to_join(const Contractor& contractor);
123  template <typename ContextType>
124  friend std::shared_ptr<ContractorForall<ContextType>> to_forall(
125  const Contractor& contractor);
126 };
127 
128 /// Returns an idempotent contractor.
129 /// @see ContractorId.
130 Contractor make_contractor_id(const Config& config);
131 
132 /// Returns an integer contractor. For an integer variable `v`, it
133 /// prunes `b[v] = [lb, ub]` into `[ceil(lb), floor(ub)]`. It sets the box empty
134 /// if it detects an empty interval in pruning.
135 ///
136 /// @see ContractorInteger.
137 Contractor make_contractor_integer(const Box& box, const Config& config);
138 
139 /// Returns a sequential contractor `C` from a vector of contractors
140 /// @p vec = [C₁, ..., Cₙ]. It applies `Cᵢ` sequentially. That is, we have:
141 /// <pre>
142 /// C(box) = (Cₙ∘...∘C₁)(box)
143 /// </pre>
144 ///
145 /// @see ContractorSeq.
146 Contractor make_contractor_seq(const std::vector<Contractor>& contractors,
147  const Config& config);
148 
149 /// Returns a contractor wrapping IBEX's forward/backward contractor.
150 /// If the number of jobs (in @p config) > 1, it creates a
151 /// multi-threaded version of the contractor, which is based on
152 /// ContractorIbexFwdbwdMt. Otherwise, it creates an instance of
153 /// ContractorIbexFwdbwd.
154 ///
155 /// @see ContractorIbexFwdbwd.
156 /// @see ContractorIbexFwdbwdMt.
158  const Config& config);
159 
160 /// Returns a contractor wrapping IBEX's polytope contractor. If then
161 /// number of jobs (in @p config) > 1, it creates a multi-threaded version of
162 /// the contractor, which is based on ContractorIbexPolytopeMt. Otherwise, it
163 /// creates an instance of ContractorIbexPolytope.
164 ///
165 /// @see ContractorIbexPolytope.
166 /// @see ContractorIbexPolytopeMt.
167 Contractor make_contractor_ibex_polytope(std::vector<Formula> formulas,
168  const Box& box, const Config& config);
169 
170 /// Returns a fixed-point contractor. The returned contractor applies
171 /// the contractors in @p vec sequentially until @p term_cond is met.
172 ///
173 /// @see ContractorFixpoint.
174 Contractor make_contractor_fixpoint(TerminationCondition term_cond,
175  const std::vector<Contractor>& contractors,
176  const Config& config);
177 
178 /// Returns a worklist fixed-point contractor. The returned contractor
179 /// applies the contractors in @p vec sequentially until @p term_cond
180 /// is met.
181 ///
182 /// @see ContractorFixpoint.
184  TerminationCondition term_cond, const std::vector<Contractor>& contractors,
185  const Config& config);
186 
187 /// Returns a join contractor. The returned contractor does the following
188 /// operation:
189 /// <pre>
190 /// (C₁ ∨ ... ∨ Cₙ)(box) = C₁(box) ∨ ... ∨ Cₙ(box).
191 /// </pre>
192 ///
193 /// @see ContractorJoin.
194 Contractor make_contractor_join(std::vector<Contractor> vec,
195  const Config& config);
196 
197 /// Returns a forall contractor.
198 ///
199 /// @note the implementation is at `dreal/contractor/contractor_forall.h` file.
200 /// @see ContractorForall.
201 template <typename ContextType>
202 Contractor make_contractor_forall(Formula f, const Box& box, double epsilon,
203  double inner_delta, const Config& config);
204 
205 std::ostream& operator<<(std::ostream& os, const Contractor& ctc);
206 
207 /// Returns true if @p contractor is idempotent contractor.
208 bool is_id(const Contractor& contractor);
209 
210 /// Returns true if @p contractor is integer contractor.
211 bool is_integer(const Contractor& contractor);
212 
213 /// Returns true if @p contractor is sequential contractor.
214 bool is_seq(const Contractor& contractor);
215 
216 /// Returns true if @p contractor is IBEX fwdbwd contractor.
217 bool is_ibex_fwdbwd(const Contractor& contractor);
218 
219 /// Returns true if @p contractor is IBEX polytope contractor.
220 bool is_ibex_polytope(const Contractor& contractor);
221 
222 /// Returns true if @p contractor is fixpoint contractor.
223 bool is_fixpoint(const Contractor& contractor);
224 
225 /// Returns true if @p contractor is worklist-fixpoint contractor.
226 bool is_worklist_fixpoint(const Contractor& contractor);
227 
228 /// Returns true if @p contractor is forall contractor.
229 bool is_forall(const Contractor& contractor);
230 
231 /// Returns true if @p contractor is join contractor.
232 bool is_join(const Contractor& contractor);
233 
234 } // namespace dreal
bool is_worklist_fixpoint(const Contractor &contractor)
Returns true if contractor is worklist-fixpoint contractor.
Definition: contractor.cc:218
friend Contractor make_contractor_id(const Config &config)
Returns an idempotent contractor.
Definition: contractor.cc:102
friend Contractor make_contractor_ibex_polytope(std::vector< Formula > formulas, const Box &box, const Config &config)
Returns a contractor wrapping IBEX&#39;s polytope contractor.
Definition: contractor.cc:145
Sum type of symbolic::Expression and symbolic::Formula.
Definition: api.cc:9
friend Contractor make_contractor_fixpoint(TerminationCondition term_cond, const std::vector< Contractor > &contractors, const Config &config)
Returns a fixed-point contractor.
Definition: contractor.cc:165
const DynamicBitset & input() const
Returns the input vector of this contractor.
Definition: contractor.cc:86
void set_include_forall()
Sets include_forall true.
Definition: contractor.cc:100
Contractor for forall constraints.
Definition: contractor.h:24
Kind kind() const
Returns kind.
Definition: contractor.cc:96
bool is_seq(const Contractor &contractor)
Returns true if contractor is sequential contractor.
Definition: contractor.cc:206
friend Contractor make_contractor_seq(const std::vector< Contractor > &contractors, const Config &config)
Returns a sequential contractor C from a vector of contractors vec = [C₁, ..., Cₙ].
Definition: contractor.cc:119
bool is_integer(const Contractor &contractor)
Returns true if contractor is integer contractor.
Definition: contractor.cc:203
friend Contractor make_contractor_integer(const Box &box, const Config &config)
Returns an integer contractor.
Definition: contractor.cc:106
friend std::shared_ptr< ContractorId > to_id(const Contractor &contractor)
Converts contractor to ContractorId.
Definition: contractor_cell.cc:55
friend Contractor make_contractor_forall(Formula f, const Box &box, double epsilon, double inner_delta, const Config &config)
Returns a forall contractor.
Definition: contractor_forall.h:318
void Prune(ContractorStatus *cs) const
Prunes cs.
Definition: contractor.cc:88
bool is_id(const Contractor &contractor)
Returns true if contractor is idempotent contractor.
Definition: contractor.cc:200
friend std::shared_ptr< ContractorSeq > to_seq(const Contractor &contractor)
Converts contractor to ContractorSeq.
Definition: contractor_cell.cc:63
friend std::shared_ptr< ContractorIbexPolytope > to_ibex_polytope(const Contractor &contractor)
Converts contractor to ContractorIbexPolytop.
Definition: contractor_cell.cc:71
bool is_fixpoint(const Contractor &contractor)
Returns true if contractor is fixpoint contractor.
Definition: contractor.cc:215
bool include_forall() const
Returns true if this contractor includes a forall contractor.
Definition: contractor.cc:98
Represents a n-dimensional interval vector.
Definition: box.h:17
Definition: config.h:12
friend Contractor make_contractor_worklist_fixpoint(TerminationCondition term_cond, const std::vector< Contractor > &contractors, const Config &config)
Returns a worklist fixed-point contractor.
Definition: contractor.cc:177
friend std::shared_ptr< ContractorForall< ContextType > > to_forall(const Contractor &contractor)
Converts contractor to ContractorForall.
Definition: contractor_forall.h:331
friend std::shared_ptr< ContractorWorklistFixpoint > to_worklist_fixpoint(const Contractor &contractor)
Converts contractor to ContractorWorklistFixpoint.
Definition: contractor_cell.cc:80
friend Contractor make_contractor_join(std::vector< Contractor > vec, const Config &config)
Returns a join contractor.
Definition: contractor.cc:189
friend std::shared_ptr< ContractorIbexFwdbwd > to_ibex_fwdbwd(const Contractor &contractor)
Converts contractor to ContractorIbexFwdbwd.
Definition: contractor_cell.cc:67
friend std::shared_ptr< ContractorFixpoint > to_fixpoint(const Contractor &contractor)
Converts contractor to ContractorFixpoint.
Definition: contractor_cell.cc:76
Contractor & operator=(const Contractor &)=default
Default copy assign operator.
friend std::shared_ptr< ContractorJoin > to_join(const Contractor &contractor)
Converts contractor to ContractorJoin.
Definition: contractor_cell.cc:85
bool is_forall(const Contractor &contractor)
Returns true if contractor is forall contractor.
Definition: contractor.cc:221
bool is_join(const Contractor &contractor)
Returns true if contractor is join contractor.
Definition: contractor.cc:224
Contractor status.
Definition: contractor_status.h:13
friend std::shared_ptr< ContractorInteger > to_integer(const Contractor &contractor)
Converts contractor to ContractorInteger.
Definition: contractor_cell.cc:59
Definition: contractor.h:30
Represents a symbolic form of a first-order logic formula.
Definition: symbolic_formula.h:101
bool is_ibex_polytope(const Contractor &contractor)
Returns true if contractor is IBEX polytope contractor.
Definition: contractor.cc:212
~Contractor()=default
Default destructor.
bool is_ibex_fwdbwd(const Contractor &contractor)
Returns true if contractor is IBEX fwdbwd contractor.
Definition: contractor.cc:209
friend Contractor make_contractor_ibex_fwdbwd(Formula f, const Box &box, const Config &config)
Returns a contractor wrapping IBEX&#39;s forward/backward contractor.
Definition: contractor.cc:124