3#include <clingo/ground/literal.hh>
4#include <clingo/ground/matcher.hh>
5#include <clingo/ground/statement.hh>
7#include <clingo/util/small_vector.hh>
9#include <memory_resource>
12namespace CppClingo::Ground {
31 [[nodiscard]]
auto is_fact() const ->
bool;
43 [[nodiscard]] auto
elems() const -> std::span<
size_t const>;
45 [[nodiscard]] auto
todo() -> std::span<
size_t const>;
48 [[nodiscard]] auto
uid() const -> std::optional<
size_t>;
53 Util::small_vector<
size_t> elems_;
54 size_t uid_ = invalid_offset;
55 uint64_t propagated_ : 62 = 0;
57 uint64_t enqueued_ : 1 = 0;
58 uint64_t fact_ : 1 = 0;
72 auto add(
Symbol const *sym) -> std::pair<AtomMap::iterator, bool>;
75 [[nodiscard]]
auto size() const ->
size_t;
80 [[nodiscard]] auto index(
Symbol const *sym) const ->
size_t;
82 [[nodiscard]] auto nth(
size_t i) const ->
AtomMap::const_iterator;
84 [[nodiscard]] auto nth(
size_t i) ->
AtomMap::iterator;
111 size_t index,
bool single_pass_body)
112 : base_{global.size()}, global_{std::move(global)}, bases_{std::move(bases)}, mbr_{&mbr}, index_{index},
113 single_pass_body_{single_pass_body} {}
121 [[nodiscard]] auto single_pass_body() const ->
bool;
123 [[nodiscard]] auto index() const ->
size_t;
127 [[nodiscard]] auto indices() const -> std::vector<
size_t>;
142 void print(std::ostream &out,
bool print_index);
152 void enqueue_(
AtomMap::iterator it);
157 auto atom_index_(
AtomMap::iterator it) ->
size_t;
164 std::vector<
size_t> queue_;
165 std::pmr::monotonic_buffer_resource *mbr_;
166 Symbol *atom_key_ =
nullptr;
168 bool single_pass_body_;
176 : state_{&state}, body_{std::move(body)}, priority_{priority} {}
180 void do_print(std::ostream &out)
const override;
182 [[nodiscard]]
auto do_body() const ->
ULitVec const & override;
183 [[nodiscard]] auto do_important() const ->
VariableSet override;
186 void do_print_head(std::ostream &out) const override;
187 void do_init(
size_t gen) override;
188 [[nodiscard]] auto do_report(
EvalContext const &ctx) ->
bool override;
190 [[nodiscard]] auto do_priority() const ->
size_t override;
202 : state_{&state}, head_{std::move(head)}, base_{&base}, body_{std::move(body)} {}
205 [[nodiscard]]
auto do_body() const ->
ULitVec const & override;
206 [[nodiscard]] auto do_important() const ->
VariableSet override;
207 void do_init(
size_t gen) override;
208 [[nodiscard]] auto do_report(
EvalContext const &ctx) ->
bool override;
210 [[nodiscard]] auto do_priority() const ->
size_t override;
211 void do_print_head(std::ostream &out) const override;
212 void do_print(std::ostream &out) const override;
248 std::vector<
Symbol> mutable eval_;
261 [[nodiscard]]
auto do_domain() const ->
bool override;
264 [[nodiscard]] auto do_single_pass() const ->
bool override;
266 [[nodiscard]] auto do_matcher(std::pmr::monotonic_buffer_resource &mbr,
MatcherType type,
267 std::vector<
bool> const &bound)
268 -> std::pair<
UMatcher, std::optional<
size_t>> override;
270 [[nodiscard]] auto do_score(std::vector<
bool> const &bound) const ->
double override;
272 void do_print(std::ostream &out) const override;
276 [[nodiscard]] auto do_copy() const ->
ULit override;
278 [[nodiscard]] auto do_hash() const ->
size_t override;
280 [[nodiscard]] auto do_equal_to(
Lit const &other) const ->
bool override;
282 [[nodiscard]] auto do_compare_to(
Lit const &other) const -> std::weak_ordering override;
284 size_t offset_ = invalid_offset;
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:62
auto size() const -> size_t
Get the number of derived atoms.
BaseDisjunction(size_t size)
Construct an empty base.
Definition disjunction.hh:69
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:66
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:35
Literal representing a disjunction.
Definition disjunction.hh:253
LitDisjunction(StateDisjunction &state)
Construct the disjunction literal.
Definition disjunction.hh:256
The base class for groundable literals.
Definition literal.hh:34
A term like object used to match disjunction atoms.
Definition disjunction.hh:221
MatchDisjunction(StateDisjunction &state)
Construct the matcher.
Definition disjunction.hh:227
auto vars() const -> VariableSet
Get the variables of the matcher.
Symbol const * Key
The key to match against.
Definition disjunction.hh:224
A queue to process instantiators.
Definition instantiator.hh:206
State storing all necessary information to ground disjunctions.
Definition disjunction.hh:100
BaseDisjunction::AtomMap AtomMap
A map from global variables (including the guards) to the disjunction representation.
Definition disjunction.hh:103
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:110
std::pair< Symbol, size_t > ElementKey
A key consisting of a head atom and a disjunction atom index.
Definition disjunction.hh:105
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:107
Class to store state for grounding.
Definition base.hh:438
Gather disjunction elements.
Definition disjunction.hh:198
StmDisjunctionElem(StateDisjunction &state, UTerm head, AtomBase &base, ULitVec body)
Construct the statement.
Definition disjunction.hh:201
A statement deriving disjunction atoms to trigger grounding of elements.
Definition disjunction.hh:172
StmDisjunction(StateDisjunction &state, Ground::ULitVec body, size_t priority)
Construct the statement.
Definition disjunction.hh:175
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:97
MatcherType
Enumeration of matcher types.
Definition instantiator.hh:48
std::unique_ptr< Matcher > UMatcher
A unique pointer to a matcher.
Definition instantiator.hh:100
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:33
tsl::ordered_map< Key, T, Hash, KeyEqual, Allocator, ValueTypeContainer, IndexType > ordered_map
Alias for ordered maps.
Definition ordered_map.hh:16