Clingo
Loading...
Searching...
No Matches
disjunction.hh
1#pragma once
2
3#include <clingo/ground/literal.hh>
4#include <clingo/ground/matcher.hh>
5#include <clingo/ground/statement.hh>
6
7#include <clingo/util/small_vector.hh>
8
9#include <memory_resource>
10#include <ostream>
11
12namespace CppClingo::Ground {
13
16
17// Outline:
18// - grounding of disjunctions is very similar to the grounding of head aggregates
19// - the differences are small
20// - grounding can be stopped if one element becomes true
21// - data structures do not have to store term tuples
22
29 public:
31 [[nodiscard]] auto is_fact() const -> bool;
33 void mark_fact();
35 auto enqueue() -> bool;
39 void dequeue();
41 void add_elem(size_t idx);
43 [[nodiscard]] auto elems() const -> std::span<size_t const>;
45 [[nodiscard]] auto todo() -> std::span<size_t const>;
46
48 [[nodiscard]] auto uid() const -> std::optional<size_t>;
50 void uid(size_t uid);
51
52 private:
53 Util::small_vector<size_t> elems_;
54 size_t uid_ = invalid_offset;
55 uint64_t propagated_ : 62 = 0;
56 uint64_t enqueued_ : 1 = 0;
57 uint64_t fact_ : 1 = 0;
58};
59
62 public:
66
68 BaseDisjunction(size_t size) : atoms_{0, size, size} {}
69
71 auto add(Symbol const *sym) -> std::pair<AtomMap::iterator, bool>;
72
74 [[nodiscard]] auto size() const -> size_t;
75
79 [[nodiscard]] auto index(Symbol const *sym) const -> size_t;
81 [[nodiscard]] auto nth(size_t i) const -> AtomMap::const_iterator;
83 [[nodiscard]] auto nth(size_t i) -> AtomMap::iterator;
84
86 [[nodiscard]] auto atoms() -> AtomMap &;
87
88 private:
89 AtomMap atoms_;
90};
91
96using DisjunctionBaseVec = std::vector<std::tuple<std::tuple<String, size_t, bool>, AtomBase *, std::vector<size_t>>>;
97
99class StateDisjunction : public State {
100 public:
104 using ElementKey = std::pair<Symbol, size_t>;
107
109 StateDisjunction(std::pmr::monotonic_buffer_resource &mbr, DisjunctionBaseVec bases, VariableVec global,
110 size_t index, bool single_pass_body)
111 : base_{global.size()}, global_{std::move(global)}, bases_{std::move(bases)}, mbr_{&mbr}, index_{index},
112 single_pass_body_{single_pass_body} {}
113
115 [[nodiscard]] auto global() const -> VariableVec const &;
117 [[nodiscard]] auto symbols() -> SymbolVec &;
120 [[nodiscard]] auto single_pass_body() const -> bool;
122 [[nodiscard]] auto index() const -> size_t;
126 [[nodiscard]] auto indices() const -> std::vector<size_t>;
127
129 void enqueue(Queue &queue);
130
132 void propagate(OutputStm &out, Queue &queue);
133
135 auto insert_atom(Assignment &ass) -> std::pair<AtomMap::iterator, bool>;
136
138 void insert_elem(EvalContext const &ctx, AtomMap::iterator it, UTerm const &head, auto const &get_cond);
139
141 void print(std::ostream &out, bool print_index);
142
144 void output(Logger &log, SymbolStore &store, OutputStm &out) override;
145
147 [[nodiscard]] auto base() -> BaseDisjunction &;
148
149 private:
151 void enqueue_(AtomMap::iterator it);
152
156 auto atom_index_(AtomMap::iterator it) -> size_t;
157
158 BaseDisjunction base_;
159 ElementMap elems_;
160 VariableVec global_;
161 SymbolVec symbols_;
162 DisjunctionBaseVec bases_;
163 std::vector<size_t> queue_;
164 std::pmr::monotonic_buffer_resource *mbr_;
165 Symbol *atom_key_ = nullptr;
166 size_t index_;
167 bool single_pass_body_;
168};
169
171class StmDisjunction : public Stm {
172 public:
175 : state_{&state}, body_{std::move(body)}, node_{node}, priority_{priority} {}
176
177 private:
178 // Stm interface
179 void do_print(std::ostream &out) const override;
180
181 [[nodiscard]] auto do_body() const -> ULitVec const & override;
182 [[nodiscard]] auto do_important() const -> VariableSet override;
183
184 // InstanceCallback interface
185 void do_print_head(std::ostream &out) const override;
186 void do_init(size_t gen) override;
187 [[nodiscard]] auto do_report(EvalContext const &ctx) -> bool override;
188 void do_propagate(SymbolStore &store, OutputStm &out, Queue &queue) override;
189 [[nodiscard]] auto do_priority() const -> size_t override;
190 [[nodiscard]] auto do_profile_node() const -> ProfileNodeInternal * override { return node_; }
191
192 StateDisjunction *state_;
193 ULitVec body_;
194 ProfileNodeInternal *node_;
195 size_t priority_;
196};
197
199class StmDisjunctionElem : public Stm {
200 public:
203 : state_{&state}, head_{std::move(head)}, base_{&base}, body_{std::move(body)}, node_{node} {}
204
205 private:
206 [[nodiscard]] auto do_body() const -> ULitVec const & override;
207 [[nodiscard]] auto do_important() const -> VariableSet override;
208 void do_init(size_t gen) override;
209 [[nodiscard]] auto do_report(EvalContext const &ctx) -> bool override;
210 void do_propagate(SymbolStore &store, OutputStm &out, Queue &queue) override;
211 [[nodiscard]] auto do_priority() const -> size_t override;
212 void do_print_head(std::ostream &out) const override;
213 void do_print(std::ostream &out) const override;
214 [[nodiscard]] auto do_profile_node() const -> ProfileNodeInternal * override { return node_; }
215
216 StateDisjunction *state_;
217 UTerm head_;
218 AtomBase *base_;
219 ULitVec body_;
220 ProfileNodeInternal *node_;
221};
222
225 public:
227 using Key = Symbol const *;
228
230 MatchDisjunction(StateDisjunction &state) : state_{&state} { eval_.reserve(state_->global().size()); }
231
233 [[nodiscard]] auto vars() const -> VariableSet;
234
236 [[nodiscard]] auto signature(VariableSet const &bound, VariableSet const &bind) const -> VariableVec;
237
239 [[nodiscard]] auto match(EvalContext const &ctx, Symbol const *sym) const -> bool;
240
242 [[nodiscard]] auto eval(EvalContext const &ctx) const -> std::optional<Symbol const *>;
243
245 friend auto operator<<(std::ostream &out, MatchDisjunction const &m) -> std::ostream &;
246
248 [[nodiscard]] auto state() const -> StateDisjunction &;
249
250 private:
251 std::vector<Symbol> mutable eval_;
252 StateDisjunction *state_;
253};
254
256class LitDisjunction : public Lit, private MatchDisjunction {
257 public:
260
261 private:
262 void do_vars(VariableSet &vars, VarSelectMode mode) const override;
263
264 [[nodiscard]] auto do_domain() const -> bool override;
265
267 [[nodiscard]] auto do_single_pass() const -> bool override;
268
269 [[nodiscard]] auto do_matcher(std::pmr::monotonic_buffer_resource &mbr, MatcherType type,
270 std::vector<bool> const &bound)
271 -> std::pair<UMatcher, std::optional<size_t>> override;
272
273 [[nodiscard]] auto do_score(std::vector<bool> const &bound) const -> double override;
274
275 void do_print(std::ostream &out) const override;
276
277 auto do_output(EvalContext const &ctx, OutputLit &out) const -> bool override;
278
279 [[nodiscard]] auto do_copy() const -> ULit override;
280
281 [[nodiscard]] auto do_hash() const -> size_t override;
282
283 [[nodiscard]] auto do_equal_to(Lit const &other) const -> bool override;
284
285 [[nodiscard]] auto do_compare_to(Lit const &other) const -> std::weak_ordering override;
286
287 size_t offset_ = invalid_offset;
288};
289
291
292} // namespace CppClingo::Ground
An atom base used to store derivable atoms and associated state.
Definition base.hh:212
Extensible ground representation of disjunctions.
Definition disjunction.hh:28
auto is_fact() const -> bool
Check if the disjunction is a fact.
void mark_fact()
Mark the disjunction as fact.
void dequeue()
Dequeue the atom after propagation.
auto uid() const -> std::optional< size_t >
Get the unique id of the disjunction atom.
auto enqueue() -> bool
Enqueue the atom for propagation.
auto elems() const -> std::span< size_t const >
Get the disjunction elements.
auto todo() -> std::span< size_t const >
Get the disjunction elements to propagate.
void add_elem(size_t idx)
Add a new element.
The base capturing derived disjunction atoms.
Definition disjunction.hh:61
auto size() const -> size_t
Get the number of derived atoms.
BaseDisjunction(size_t size)
Construct an empty base.
Definition disjunction.hh:68
auto add(Symbol const *sym) -> std::pair< AtomMap::iterator, bool >
Add an atom to the current generation.
Util::ordered_map< Symbol const *, AtomDisjunction, Util::array_hash, Util::array_equal_to > AtomMap
Mapping from global variables to disjunction atoms.
Definition disjunction.hh:65
The base implementation of an atom base.
Definition base.hh:148
auto contains(Key const &sym, MatcherType type) const -> std::optional< size_t >
Check if the base contains the given atom with in the given generation.
Definition base.hh:160
Context object to capture state used during instantiation.
Definition instantiator.hh:39
Literal representing a disjunction.
Definition disjunction.hh:256
LitDisjunction(StateDisjunction &state)
Construct the disjunction literal.
Definition disjunction.hh:259
The base class for groundable literals.
Definition literal.hh:34
A term like object used to match disjunction atoms.
Definition disjunction.hh:224
MatchDisjunction(StateDisjunction &state)
Construct the matcher.
Definition disjunction.hh:230
auto vars() const -> VariableSet
Get the variables of the matcher.
Symbol const * Key
The key to match against.
Definition disjunction.hh:227
Profile node that can hold children.
Definition profile.hh:155
A queue to process instantiators.
Definition instantiator.hh:222
State storing all necessary information to ground disjunctions.
Definition disjunction.hh:99
BaseDisjunction::AtomMap AtomMap
A map from global variables (including the guards) to the disjunction representation.
Definition disjunction.hh:102
auto global() const -> VariableVec const &
Get the global variables in the disjunction.
StateDisjunction(std::pmr::monotonic_buffer_resource &mbr, DisjunctionBaseVec bases, VariableVec global, size_t index, bool single_pass_body)
Initialize a disjunction state.
Definition disjunction.hh:109
std::pair< Symbol, size_t > ElementKey
A key consisting of a head atom and a disjunction atom index.
Definition disjunction.hh:104
Util::ordered_map< ElementKey, std::pair< size_t, Util::small_vector< size_t > > > ElementMap
A map from disjunction atoms and their heads to conditions.
Definition disjunction.hh:106
Class to store state for grounding.
Definition base.hh:438
Gather disjunction elements.
Definition disjunction.hh:199
StmDisjunctionElem(StateDisjunction &state, UTerm head, AtomBase &base, ULitVec body, ProfileNodeInternal *node)
Construct the statement.
Definition disjunction.hh:202
A statement deriving disjunction atoms to trigger grounding of elements.
Definition disjunction.hh:171
StmDisjunction(StateDisjunction &state, Ground::ULitVec body, size_t priority, ProfileNodeInternal *node)
Construct the statement.
Definition disjunction.hh:174
Base class for groundable statements.
Definition statement.hh:17
Simple logger to report message to stderr or via a callback.
Definition logger.hh:63
Interface to output literals.
Definition output.hh:61
Interface to output statements.
Definition output.hh:90
Reference to a string stored in a symbol store.
Definition symbol.hh:18
A store for symbols.
Definition symbol.hh:454
Variant-like class to store symbols stored in a symbol store.
Definition symbol.hh:225
std::vector< std::optional< Symbol > > Assignment
Assignment mapping variables to symbols.
Definition symbol.hh:222
std::vector< Symbol > SymbolVec
A vector of symbols.
Definition symbol.hh:220
VariableSet::values_container_type VariableVec
A vector of variables.
Definition base.hh:21
Util::ordered_set< size_t > VariableSet
A set of variables.
Definition base.hh:19
std::vector< std::tuple< std::tuple< String, size_t, bool >, AtomBase *, std::vector< size_t > > > DisjunctionBaseVec
A vector of signatures, bases, and indices.
Definition disjunction.hh:96
MatcherType
Enumeration of matcher types.
Definition instantiator.hh:52
std::unique_ptr< Matcher > UMatcher
A unique pointer to a matcher.
Definition instantiator.hh:104
std::unique_ptr< Lit > ULit
A unique pointer holding a literal.
Definition literal.hh:29
VarSelectMode
Available variable selection modes.
Definition literal.hh:21
std::vector< ULit > ULitVec
A vector of literals.
Definition literal.hh:31
std::unique_ptr< Term > UTerm
A unique pointer holding a term.
Definition term.hh:34
tsl::ordered_map< Key, T, Hash, KeyEqual, Allocator, ValueTypeContainer, IndexType > ordered_map
Alias for ordered maps.
Definition ordered_map.hh:16