Clingo
Loading...
Searching...
No Matches
statement.hh
1#pragma once
2
3#include <clingo/ground/literal.hh>
4
5#include <clingo/ground/instantiator.hh>
6
7#include <clingo/core/core.hh>
8
9#include <memory_resource>
10
11namespace CppClingo::Ground {
12
15
17class Stm : public InstanceCallback {
18 public:
20 [[nodiscard]] auto body() const -> ULitVec const & { return do_body(); }
27 [[nodiscard]] auto important() const -> VariableSet { return do_important(); }
28
30 friend auto operator<<(std::ostream &out, Stm const &stm) -> std::ostream & {
31 stm.do_print(out);
32 return out;
33 }
34
35 private:
36 virtual void do_print(std::ostream &out) const = 0;
37 [[nodiscard]] virtual auto do_body() const -> ULitVec const & = 0;
38 [[nodiscard]] virtual auto do_important() const -> VariableSet = 0;
39};
40
42using UStm = std::unique_ptr<Stm>;
44using UStmVec = std::vector<UStm>;
45
48 public:
50 Linearizer(std::pmr::monotonic_buffer_resource &mbr) : mbr_{&mbr} {}
52 void start(Queue &queue);
55
56 private:
58 void build_(ULitVec const &lits);
60 auto order_(InstanceCallback &cb, std::vector<MatcherType> const &todo, VariableSet const &important,
61 ULitVec const &lits) -> std::pair<Instantiator, std::optional<size_t>>;
62
63 Queue *iqueue_ = nullptr;
64 std::pmr::monotonic_buffer_resource *mbr_;
65 std::vector<size_t> rec_;
66 std::vector<std::vector<MatcherType>> todos_;
67 std::vector<std::tuple<size_t, size_t, double>> queue_;
69 std::vector<std::tuple<size_t, std::vector<size_t>, std::vector<size_t>>> lit_map_;
71 std::vector<std::vector<size_t>> var_map_;
72};
73
75enum class RuleType : uint8_t {
76 normal,
77 choice
78};
79
81class StmRule : public Stm {
82 public:
85 : head_{head ? std::move(std::get<0>(*head)) : nullptr}, base_{head ? &std::get<1>(*head) : nullptr},
86 indices_{head ? std::move(std::get<2>(*head)) : std::vector<size_t>{}}, body_{std::move(body)}, type_{type} {
87 init_();
88 }
89
90 private:
91 void init_();
92
93 // Stm interface
94 void do_print(std::ostream &out) const override;
95 [[nodiscard]] auto do_body() const -> ULitVec const & override;
96 [[nodiscard]] auto do_important() const -> VariableSet override;
97
98 // InstanceCallback interface
99 void do_print_head(std::ostream &out) const override;
100 void do_init(size_t gen) override;
101 [[nodiscard]] auto do_report(EvalContext const &ctx) -> bool override;
102 void do_propagate(SymbolStore &store, OutputStm &out, Queue &queue) override;
103 [[nodiscard]] auto do_priority() const -> size_t override { return std::numeric_limits<size_t>::max(); }
104
108 UTerm head_;
109 AtomBase *base_;
114 std::vector<size_t> indices_;
115 ULitVec body_;
116 Symbol atom_ = SymbolStore::sup();
117 RuleType type_;
118};
119
121class StmExternal : public Stm {
122 public:
124 StmExternal(Ground::UTerm atom, AtomBase &base, std::vector<size_t> indices, ULitVec body,
125 std::optional<std::pair<Location, UTerm>> type)
126 : type_{std::move(type)}, atom_{std::move(atom)}, base_{&base}, indices_{std::move(indices)},
127 body_{std::move(body)} {
128 init_();
129 }
130
131 private:
132 void init_();
133
134 // Stm interface
135 void do_print(std::ostream &out) const override;
136 [[nodiscard]] auto do_body() const -> ULitVec const & override;
137 [[nodiscard]] auto do_important() const -> VariableSet override;
138
139 // InstanceCallback interface
140 void do_print_head(std::ostream &out) const override;
141 void do_init(size_t gen) override;
142 [[nodiscard]] auto do_report(EvalContext const &ctx) -> bool override;
143 void do_propagate(SymbolStore &store, OutputStm &out, Queue &queue) override;
144 [[nodiscard]] auto do_priority() const -> size_t override { return std::numeric_limits<size_t>::max(); }
145 [[nodiscard]] auto do_is_important([[maybe_unused]] size_t index) const -> bool override { return false; }
146
147 std::optional<std::pair<Location, UTerm>> type_;
151 UTerm atom_;
152 AtomBase *base_;
157 std::vector<size_t> indices_;
158 ULitVec body_;
159 Symbol res_atom_ = SymbolStore::sup();
160 ExternalType res_type_ = ExternalType::free;
161};
162
164class StmWeakConstraint : public Stm {
165 public:
167 StmWeakConstraint(Location loc_weight, UTerm weight, std::optional<std::pair<Location, UTerm>> prio, UTermVec terms,
169 : loc_weight_{std::move(loc_weight)}, loc_prio_{prio ? std::move(prio->first) : loc_weight_},
170 weight_{std::move(weight)}, prio_{prio ? std::move(prio->second) : nullptr}, terms_{std::move(terms)},
171 body_{std::move(body)} {
172 init_();
173 }
174
175 private:
176 void init_();
177 // Stm interface
178 void do_print(std::ostream &out) const override;
179 [[nodiscard]] auto do_body() const -> ULitVec const & override;
180 [[nodiscard]] auto do_important() const -> VariableSet override;
181
182 // InstanceCallback interface
183 void do_print_head(std::ostream &out) const override;
184 void do_init(size_t gen) override;
185 [[nodiscard]] auto do_report(EvalContext const &ctx) -> bool override;
186 void do_propagate(SymbolStore &store, OutputStm &out, Queue &queue) override;
187 [[nodiscard]] auto do_priority() const -> size_t override { return std::numeric_limits<size_t>::max(); }
188
189 Location loc_weight_;
190 Location loc_prio_;
191 UTerm weight_;
192 UTerm prio_;
193 UTermVec terms_;
194 ULitVec body_;
195 Symbol res_weight_;
196 std::optional<Symbol> res_prio_;
197 SymbolVec res_terms_;
198};
199
201class StmHeuristic : public Stm {
202 public:
204 StmHeuristic(UTerm atom, AtomBase &base, ULitVec body, Location loc_weight, UTerm weight,
205 std::optional<std::pair<Location, UTerm>> prio, Location loc_type, UTerm type)
206 : loc_weight_{std::move(loc_weight)}, loc_prio_{prio ? std::move(prio->first) : loc_weight_},
207 loc_type_{std::move(loc_type)}, atom_{std::move(atom)}, base_{&base}, weight_{std::move(weight)},
208 prio_{prio ? std::move(prio->second) : nullptr}, type_{std::move(type)}, body_{std::move(body)} {
209 init_();
210 }
211
212 private:
213 void init_();
214 // Stm interface
215 void do_print(std::ostream &out) const override;
216 [[nodiscard]] auto do_body() const -> ULitVec const & override;
217 [[nodiscard]] auto do_important() const -> VariableSet override;
218
219 // InstanceCallback interface
220 void do_print_head(std::ostream &out) const override;
221 void do_init(size_t gen) override;
222 [[nodiscard]] auto do_report(EvalContext const &ctx) -> bool override;
223 void do_propagate(SymbolStore &store, OutputStm &out, Queue &queue) override;
224 [[nodiscard]] auto do_priority() const -> size_t override { return std::numeric_limits<size_t>::max(); }
225
226 Location loc_weight_;
227 Location loc_prio_;
228 Location loc_type_;
229 UTerm atom_;
230 AtomBase *base_;
231 UTerm weight_;
232 UTerm prio_;
233 UTerm type_;
234 ULitVec body_;
235 size_t offset_ = 0;
236 Symbol res_weight_;
237 Symbol res_prio_;
238 HeuristicType res_type_ = HeuristicType::level;
239};
240
242class StmEdge : public Stm {
243 public:
245 StmEdge(UTerm src, UTerm dst, ULitVec body) : src_{std::move(src)}, dst_{std::move(dst)}, body_{std::move(body)} {
246 init_();
247 }
248
249 private:
250 void init_();
251 // Stm interface
252 void do_print(std::ostream &out) const override;
253 [[nodiscard]] auto do_body() const -> ULitVec const & override;
254 [[nodiscard]] auto do_important() const -> VariableSet override;
255
256 // InstanceCallback interface
257 void do_print_head(std::ostream &out) const override;
258 void do_init(size_t gen) override;
259 [[nodiscard]] auto do_report(EvalContext const &ctx) -> bool override;
260 void do_propagate(SymbolStore &store, OutputStm &out, Queue &queue) override;
261 [[nodiscard]] auto do_priority() const -> size_t override { return std::numeric_limits<size_t>::max(); }
262
263 UTerm src_;
264 UTerm dst_;
265 ULitVec body_;
266 Symbol res_src_;
267 Symbol res_dst_;
268};
269
271class StmShow : public Stm {
272 public:
274 StmShow(UTerm term, ULitVec body) : term_{std::move(term)}, body_{std::move(body)} { init_(); }
275
276 private:
277 void init_();
278 // Stm interface
279 void do_print(std::ostream &out) const override;
280 [[nodiscard]] auto do_body() const -> ULitVec const & override;
281 [[nodiscard]] auto do_important() const -> VariableSet override;
282
283 // InstanceCallback interface
284 void do_print_head(std::ostream &out) const override;
285 void do_init(size_t gen) override;
286 [[nodiscard]] auto do_report(EvalContext const &ctx) -> bool override;
287 void do_propagate(SymbolStore &store, OutputStm &out, Queue &queue) override;
288 [[nodiscard]] auto do_priority() const -> size_t override { return std::numeric_limits<size_t>::max(); }
289
290 UTerm term_;
291 ULitVec body_;
292 Symbol res_term_;
293};
294
296class StmProject : public Stm {
297 public:
300 : atom_{std::move(atom)}, base_{&base}, body_{std::move(body)} {
301 init_();
302 }
303
304 private:
305 void init_();
306 // Stm interface
307 void do_print(std::ostream &out) const override;
308 [[nodiscard]] auto do_body() const -> ULitVec const & override;
309 [[nodiscard]] auto do_important() const -> VariableSet override;
310
311 // InstanceCallback interface
312 void do_print_head(std::ostream &out) const override;
313 void do_init(size_t gen) override;
314 [[nodiscard]] auto do_report(EvalContext const &ctx) -> bool override;
315 void do_propagate(SymbolStore &store, OutputStm &out, Queue &queue) override;
316 [[nodiscard]] auto do_priority() const -> size_t override { return std::numeric_limits<size_t>::max(); }
317 [[nodiscard]] auto do_is_important([[maybe_unused]] size_t index) const -> bool override { return false; }
318
319 UTerm atom_;
320 AtomBase *base_;
321 ULitVec body_;
322 size_t offset_ = 0;
323};
324
326
327} // namespace CppClingo::Ground
An atom base used to store derivable atoms and associated state.
Definition base.hh:212
Context object to capture state used during instantiation.
Definition instantiator.hh:35
Callbacks to notify statements during instantiations.
Definition instantiator.hh:107
Helper class to prepare statements for grounding.
Definition statement.hh:47
void start(Queue &queue)
Indicate that a new domain is being prepared.
void prepare(InstanceCallback &cb, ULitVec const &body, VariableSet important)
Prepare a statement for grounding.
Linearizer(std::pmr::monotonic_buffer_resource &mbr)
Construct the linearizer.
Definition statement.hh:50
A queue to process instantiators.
Definition instantiator.hh:206
A statement edge directives.
Definition statement.hh:242
StmEdge(UTerm src, UTerm dst, ULitVec body)
Construct the statement.
Definition statement.hh:245
A statement capturing normal rules and integrity constraints.
Definition statement.hh:121
StmExternal(Ground::UTerm atom, AtomBase &base, std::vector< size_t > indices, ULitVec body, std::optional< std::pair< Location, UTerm > > type)
Construct the statement.
Definition statement.hh:124
Statement capturing heuristic directives.
Definition statement.hh:201
StmHeuristic(UTerm atom, AtomBase &base, ULitVec body, Location loc_weight, UTerm weight, std::optional< std::pair< Location, UTerm > > prio, Location loc_type, UTerm type)
Construct the statement.
Definition statement.hh:204
Statement capturing project directives.
Definition statement.hh:296
StmProject(UTerm atom, AtomBase &base, ULitVec body)
Construct the statement.
Definition statement.hh:299
A statement capturing normal rules and integrity constraints.
Definition statement.hh:81
StmRule(AtomSimple head, ULitVec body, RuleType type)
Construct the statement.
Definition statement.hh:84
A statement for show directives.
Definition statement.hh:271
StmShow(UTerm term, ULitVec body)
Construct the statement.
Definition statement.hh:274
A statement capturing weak constraints.
Definition statement.hh:164
StmWeakConstraint(Location loc_weight, UTerm weight, std::optional< std::pair< Location, UTerm > > prio, UTermVec terms, ULitVec body)
Construct the statement.
Definition statement.hh:167
Base class for groundable statements.
Definition statement.hh:17
auto important() const -> VariableSet
Get the important variables in the statement.
Definition statement.hh:27
friend auto operator<<(std::ostream &out, Stm const &stm) -> std::ostream &
Print the statement.
Definition statement.hh:30
auto body() const -> ULitVec const &
Get the body of the statement.
Definition statement.hh:20
The Location of an expression in an input source.
Definition location.hh:44
Interface to output statements.
Definition output.hh:90
A store for symbols.
Definition symbol.hh:454
static auto sup() noexcept -> Symbol
Construct the infimum constant (#inf).
Variant-like class to store symbols stored in a symbol store.
Definition symbol.hh:225
std::vector< Symbol > SymbolVec
A vector of symbols.
Definition symbol.hh:220
HeuristicType
Available heuristic types.
Definition core.hh:172
ExternalType
Available external types.
Definition core.hh:177
Util::ordered_set< size_t > VariableSet
A set of variables.
Definition base.hh:19
std::optional< std::tuple< Ground::UTerm, AtomBase &, std::vector< size_t > > > AtomSimple
Represents a simple head literal which is either represented by a symbol term or #false captured by s...
Definition literal.hh:231
std::vector< ULit > ULitVec
A vector of literals.
Definition literal.hh:31
std::vector< UStm > UStmVec
A vector of statements.
Definition statement.hh:44
std::unique_ptr< Stm > UStm
A unique pointer holding a statement.
Definition statement.hh:42
RuleType
Enumeration of available rule types.
Definition statement.hh:75
std::unique_ptr< Term > UTerm
A unique pointer holding a term.
Definition term.hh:33
std::vector< UTerm > UTermVec
A vector of terms.
Definition term.hh:35