Clingo
Loading...
Searching...
No Matches
control.hh
1#pragma once
2
3#include <clingo/backend.hh>
4#include <clingo/base.hh>
5#include <clingo/config.hh>
6#include <clingo/core.hh>
7#include <clingo/observe.hh>
8#include <clingo/propagate.hh>
9#include <clingo/solve.hh>
10#include <clingo/stats.hh>
11#include <clingo/symbol.hh>
12
13#include <clingo/control.h>
14
15#include <cassert>
16#include <optional>
17#include <span>
18
19namespace Clingo {
20
21namespace AST {
22
23class Program;
24auto c_cast(Program const &x) -> clingo_program_t *;
25
26} // namespace AST
27
28namespace Detail {
29
30void join(clingo_control_t *ctx, clingo_program_t const *prg);
31
32} // namespace Detail
33
38
40struct Part {
45 Part(std::string name, SymbolVector params = {}) : name{std::move(name)}, params(std::move(params)) {
46 assert(!this->name.empty());
47 }
48
50 std::string name;
53};
55using PartSpan = std::span<Part const>;
57using PartList = std::initializer_list<Part>;
59using PartVector = std::vector<Part>;
60
64class ConstMap {
65 public:
67 using key_type = std::string_view;
71 using value_type = std::pair<key_type, mapped_type>;
73 using size_type = std::size_t;
75 using difference_type = std::ptrdiff_t;
79 using pointer = Detail::ArrowProxy<value_type>;
81 using iterator = Detail::RandomAccessIterator<ConstMap>;
82
86 explicit ConstMap(clingo_const_map_t const *map) : map_{map} {}
87
92 [[nodiscard]] auto contains(key_type name) const -> bool {
93 return Detail::call<clingo_const_map_find>(map_, name.data(), name.size(), nullptr);
94 }
95
100 [[nodiscard]] auto operator[](key_type name) const -> mapped_type {
101 clingo_symbol_t sym = 0;
102 bool found = false;
103 Detail::handle_error(clingo_const_map_find(map_, name.data(), name.size(), &sym, &found));
104 return found ? Symbol{sym, true} : throw std::out_of_range{"key not found"};
105 }
106
111 [[nodiscard]] auto at(size_t index) const -> value_type {
112 clingo_string_t name;
113 clingo_symbol_t sym = 0;
114 Detail::handle_error(clingo_const_map_at(map_, index, &name, &sym));
115 return {{name.data, name.size}, Symbol{sym, true}};
116 }
117
121 [[nodiscard]] auto size() const -> size_type { return Detail::call<clingo_const_map_size>(map_); }
122
126 [[nodiscard]] auto begin() const -> iterator { return iterator{*this, 0}; }
127
131 [[nodiscard]] auto end() const -> iterator { return iterator{*this, size()}; }
132
133 private:
134 clingo_const_map_t const *map_;
135};
136
146
158
167
169enum class DiscardType {
170 minimize = clingo_discard_type_e::minimize,
171 project = clingo_discard_type_e::project,
172};
173
179class Control {
180 public:
186 using Context = std::function<SymbolVector(std::string_view, SymbolSpan)>;
187
192 explicit Control(Library const &lib, StringList arguments) : Clingo::Control{lib, StringSpan{arguments}} {}
193
195 explicit Control(Library const &lib, StringSpan arguments = {}) {
196 auto cstrs = Detail::transform(arguments, [](auto const &x) { return clingo_string_t{x.data(), x.size()}; });
197 ctl_.reset(Detail::call<clingo_control_new>(c_cast(lib), cstrs.data(), arguments.size()), false);
198 }
199
206 explicit Control(clingo_control_t *rep, bool acquire) : ctl_{rep, acquire} {}
207
212 [[nodiscard]] friend auto c_cast(Control const &ctl) -> clingo_control_t * { return ctl.ctl_.get(); }
213
218 return static_cast<ControlMode>(Detail::call<clingo_control_mode>(ctl_.get()));
219 }
220
230 Detail::handle_error(clingo_control_write_aspif(ctl_.get(), path.data(), path.size(),
231 static_cast<clingo_write_aspif_mode_t>(flags)));
232 }
233
243 auto cfiles = Detail::transform(files, [](auto const &x) { return clingo_string_t{x.data(), x.size()}; });
244 Detail::handle_error(clingo_control_parse_files(ctl_.get(), cfiles.data(), cfiles.size()));
245 }
246
255 void parse_files(StringList files) const { parse_files(StringSpan{files.begin(), files.end()}); }
256
260 void parse_string(std::string_view program) const {
261 Detail::handle_error(clingo_control_parse_string(ctl_.get(), program.data(), program.size()));
262 }
263
272 void ground(std::optional<PartSpan> parts = std::nullopt, Context ctx = nullptr) const {
273 std::optional<PartVector> default_parts;
274 std::vector<clingo_part_t> c_parts;
275 if (default_parts = !parts ? this->parts() : std::nullopt; default_parts) {
276 parts = default_parts;
277 }
278 if (parts) {
279 c_parts.reserve(parts->size());
280 for (auto const &part : *parts) {
281 c_parts.emplace_back(part.name.data(), part.name.size(), c_cast(part.params.data()),
282 part.params.size());
283 }
284 } else {
285 c_parts.reserve(1);
286 c_parts.emplace_back("base", 4, nullptr, 0);
287 }
288 Detail::handle_error(
289 clingo_control_ground(ctl_.get(), c_parts.data(), c_parts.size(), ctx ? &ctx_ : nullptr, &ctx));
290 }
291
299 void ground(std::initializer_list<Part> parts, Context ctx = nullptr) const {
300 ground(PartSpan{parts}, std::move(ctx));
301 }
302
306 [[nodiscard]] auto base() const -> Base { return Base{Detail::call<clingo_control_base>(ctl_.get())}; }
307
312 auto const *stats = Detail::call<clingo_control_stats>(ctl_.get());
313 auto key = Detail::call<clingo_stats_root>(stats);
314 return ConstStats{stats, key};
315 }
316
327
337 -> SolveHandle {
338 return solve_(nullptr, assumptions, flags);
339 }
340
345 void main() const { Detail::handle_error(clingo_control_main(ctl_.get())); }
346
350 void interrupt() const { clingo_control_interrupt(ctl_.get()); }
351
355 void discard(DiscardType type) const {
356 Detail::handle_error(clingo_control_discard(ctl_.get(), static_cast<clingo_discard_type_t>(type)));
357 }
358
365 [[nodiscard]] auto buffer() const -> std::string_view {
366 auto [data, size] = Detail::call<clingo_control_buffer>(ctl_.get());
367 return {data, size};
368 }
369
377 clingo_part_t const *parts = nullptr;
378 size_t size = 0;
379 bool has_value = false;
380 Detail::handle_error(clingo_control_get_parts(ctl_.get(), &parts, &size, &has_value));
381 if (has_value) {
382 return Detail::transform(std::span{parts, size}, [](auto const &part) {
383 auto params = std::span{cpp_cast(part.params), part.params_size};
384 return Part{{part.name, part.name_size}, {params.begin(), params.end()}};
385 });
386 }
387 return std::nullopt;
388 }
389
393 void parts(PartList parts) const { this->parts(std::span{parts.begin(), parts.end()}); }
394
400 void parts(std::optional<PartSpan> parts) const {
401 if (parts) {
402 auto cparts = Detail::transform(*parts, [](auto const &part) {
403 return clingo_part_t{part.name.data(), part.name.size(), c_cast(part.params.data()),
404 part.params.size()};
405 });
406 Detail::handle_error(clingo_control_set_parts(ctl_.get(), cparts.data(), cparts.size(), true));
407 } else {
408 Detail::handle_error(clingo_control_set_parts(ctl_.get(), nullptr, 0, true));
409 }
410 }
411
415 [[nodiscard]] auto config() const -> Config {
416 auto *config = Detail::call<clingo_control_config>(ctl_.get());
417 auto key = Detail::call<clingo_config_root>(config);
418 return Config{config, key};
419 }
420
425 return ConstMap{Detail::call<clingo_control_const_map>(ctl_.get())};
426 }
427
432 void observe(Observer &obs, bool preprocess = true) const { obs.observe(ctl_.get(), preprocess); }
433
438 return ProgramBackend{Detail::call<clingo_control_backend>(ctl_.get())};
439 }
440
447 template <std::derived_from<Propagator> T> auto register_propagator(std::unique_ptr<T> propagator) const -> T & {
448 assert(propagator != nullptr);
449 auto &res = *propagator;
450 Detail::handle_error(clingo_control_register_propagator(
451 ctl_.get(), std::is_base_of_v<Heuristic, T> ? &Detail::c_heuristic : &Detail::c_propagator,
452 propagator.release()));
453 return res;
454 }
455
459 void join(AST::Program const &prg) const { Detail::join(ctl_.get(), c_cast(prg)); }
460
461 private:
462 friend class Detail::intrusive_handle<Control, clingo_control_t>;
463
464 static auto ctx_([[maybe_unused]] clingo_lib_t *lib, [[maybe_unused]] clingo_location_t const *location,
465 char const *name, size_t name_size, clingo_symbol_t const *arguments, size_t arguments_size,
467 CLINGO_TRY {
468 auto &cb = *static_cast<std::function<SymbolVector(std::string_view, SymbolSpan)> *>(data);
469 auto syms = cb({name, name_size}, {cpp_cast(arguments), arguments_size});
470 auto const *c_syms = c_cast(syms.data());
472 }
473 CLINGO_CATCH;
474 }
475
476 static auto acquire(clingo_control_t *ptr) { clingo_control_acquire(ptr); }
477
478 static auto release(clingo_control_t *ptr) { clingo_control_release(ptr); }
479
480 [[nodiscard]] auto solve_(SolveEventHandler *handler, ProgramLiteralSpan const &assumptions, SolveFlags flags) const
481 -> SolveHandle {
482 clingo_solve_handle_t *res = nullptr;
483 Detail::handle_error(clingo_control_solve(ctl_.get(), static_cast<clingo_solve_mode_bitset_t>(flags),
484 assumptions.data(), assumptions.size(),
485 handler != nullptr ? &Detail::c_solve_event_handler : nullptr,
486 handler != nullptr ? handler : nullptr, &res));
487 return SolveHandle{res};
488 }
489
490 Detail::intrusive_handle<Control, clingo_control_t> ctl_;
491};
492
494
495} // namespace Clingo
A program to add statements to.
Definition ast.hh:809
A base that maps signatures to atom bases, and captures term and theory bases.
Definition base.hh:608
Class modeling a mutable configuration entry.
Definition config.hh:138
Class to providing a view on the const directives in a logic program.
Definition control.hh:64
auto operator[](key_type name) const -> mapped_type
Get the value of for the given key.
Definition control.hh:100
std::ptrdiff_t difference_type
The difference type.
Definition control.hh:75
std::size_t size_type
The size type.
Definition control.hh:73
Detail::RandomAccessIterator< ConstMap > iterator
The iterator type.
Definition control.hh:81
value_type reference
The reference type.
Definition control.hh:77
auto contains(key_type name) const -> bool
Check if the map contains the given key.
Definition control.hh:92
std::string_view key_type
The key type.
Definition control.hh:67
auto at(size_t index) const -> value_type
Get the key value pair at the given index.
Definition control.hh:111
std::pair< key_type, mapped_type > value_type
The value type.
Definition control.hh:71
Detail::ArrowProxy< value_type > pointer
The pointer type.
Definition control.hh:79
auto begin() const -> iterator
Get an iterator to the beginning of the map.
Definition control.hh:126
ConstMap(clingo_const_map_t const *map)
Construct from the underlying C representation.
Definition control.hh:86
auto end() const -> iterator
Get an iterator to the end of the map.
Definition control.hh:131
auto size() const -> size_type
Get the size of the map.
Definition control.hh:121
Class modeling an immutable view on a statistics entry.
Definition stats.hh:29
The main control class for grounding and solving logic programs.
Definition control.hh:179
auto config() const -> Config
Get the configuration of the control object.
Definition control.hh:415
void discard(DiscardType type) const
Discard the statements of the given types.
Definition control.hh:355
void parts(std::optional< PartSpan > parts) const
Set the parts to ground.
Definition control.hh:400
void observe(Observer &obs, bool preprocess=true) const
Inspect the current ground program held by the control object.
Definition control.hh:432
auto base() const -> Base
Get the base of the program.
Definition control.hh:306
void write_aspif(std::string_view path, WriteAspifFlags flags=WriteAspifFlags::none) const
Write the current program to an ASPIF file.
Definition control.hh:229
Control(Library const &lib, StringSpan arguments={})
Constructs a control object with the given library and arguments.
Definition control.hh:195
auto stats() const -> ConstStats
Get the statistics of the control object.
Definition control.hh:311
void ground(std::initializer_list< Part > parts, Context ctx=nullptr) const
Ground the control object with the given parts.
Definition control.hh:299
auto parts() const -> std::optional< PartVector >
Get the parts to ground.
Definition control.hh:376
auto const_map() const -> ConstMap
Get the constant map of the control object.
Definition control.hh:424
auto solve(ProgramLiteralSpan const &assumptions={}, SolveFlags flags=SolveFlags::yield) const -> SolveHandle
Solve the grounded program with the given assumptions and flags.
Definition control.hh:336
auto register_propagator(std::unique_ptr< T > propagator) const -> T &
Register a propagator with the control object.
Definition control.hh:447
Control(clingo_control_t *rep, bool acquire)
Constructs a control object from an existing C representation.
Definition control.hh:206
void parts(PartList parts) const
Set the parts to ground.
Definition control.hh:393
void interrupt() const
Interrupt the current solve operation.
Definition control.hh:350
void parse_files(StringSpan files) const
Parse files with the given paths.
Definition control.hh:242
friend auto c_cast(Control const &ctl) -> clingo_control_t *
Cast to the C representation of the control object.
Definition control.hh:212
auto backend() const -> ProgramBackend
Get the backend of the control object.
Definition control.hh:437
auto buffer() const -> std::string_view
Get the text buffer of the control object.
Definition control.hh:365
void main() const
Run the default ground and solve flow.
Definition control.hh:345
Control(Library const &lib, StringList arguments)
Constructs a control object with the given library and arguments.
Definition control.hh:192
void parse_files(StringList files) const
Parse files with the given paths.
Definition control.hh:255
auto solve(SolveEventHandler &handler, ProgramLiteralSpan const &assumptions={}, SolveFlags flags=SolveFlags::empty) const -> SolveHandle
Solve the grounded program with the given assumptions and flags.
Definition control.hh:323
void join(AST::Program const &prg) const
Join the given non-ground program to the current control object.
Definition control.hh:459
void ground(std::optional< PartSpan > parts=std::nullopt, Context ctx=nullptr) const
Ground the control object with the given parts.
Definition control.hh:272
auto mode() const -> ControlMode
Get the control mode.
Definition control.hh:217
std::function< SymbolVector(std::string_view, SymbolSpan)> Context
Callbock for injecting symbols into the grounding process.
Definition control.hh:186
void parse_string(std::string_view program) const
Parse a logic program from a string.
Definition control.hh:260
The main library class for managing global information and logging.
Definition core.hh:471
Observer interface to inspect the current ground program.
Definition observe.hh:15
Program backend to add atoms and statements.
Definition backend.hh:132
Interface to handle events during solving.
Definition solve.hh:291
Class to control a running search.
Definition solve.hh:335
Class modeling a symbol in Clingo.
Definition symbol.hh:68
struct clingo_program clingo_program_t
Object to store.
Definition ast.h:499
unsigned clingo_discard_type_t
Corresponding type to clingo_discard_type_e.
Definition control.h:260
CLINGO_VISIBILITY_DEFAULT bool clingo_const_map_find(clingo_const_map_t const *map, char const *name, size_t name_size, clingo_symbol_t *symbol, bool *found)
Get the constant with the given name.
int clingo_mode_t
The corresponding type to clingo_mode_e.
Definition control.h:44
CLINGO_VISIBILITY_DEFAULT bool clingo_control_parse_string(clingo_control_t *control, char const *program, size_t size)
Extend the logic program with the given non-ground logic program in string form.
CLINGO_VISIBILITY_DEFAULT bool clingo_control_get_parts(clingo_control_t *control, clingo_part_t const **parts, size_t *size, bool *has_value)
Get the program parts to ground.
CLINGO_VISIBILITY_DEFAULT bool clingo_control_discard(clingo_control_t *control, clingo_discard_type_t type)
Discard the statements of the given types.
CLINGO_VISIBILITY_DEFAULT bool clingo_const_map_at(clingo_const_map_t const *map, size_t index, clingo_string_t *name, clingo_symbol_t *symbol)
Get the name and value of the contstant at the given index.
struct clingo_const_map clingo_const_map_t
A map from constantns to their values.
Definition control.h:111
CLINGO_VISIBILITY_DEFAULT void clingo_control_acquire(clingo_control_t *control)
Increment the reference count of the given control object.
CLINGO_VISIBILITY_DEFAULT bool clingo_control_parse_files(clingo_control_t *control, clingo_string_t const *files, size_t size)
Extend the logic program with a program in a file.
CLINGO_VISIBILITY_DEFAULT void clingo_control_interrupt(clingo_control_t *control)
Interrupt the running search.
CLINGO_VISIBILITY_DEFAULT bool clingo_control_ground(clingo_control_t *control, clingo_part_t const *parts, size_t size, clingo_ground_callback_t ground_callback, void *data)
Ground the selected parts of the current (non-ground) logic program.
CLINGO_VISIBILITY_DEFAULT bool clingo_control_main(clingo_control_t *control)
Execute the default ground and solve flow after parsing.
CLINGO_VISIBILITY_DEFAULT bool clingo_control_set_parts(clingo_control_t *control, clingo_part_t const *parts, size_t size, bool has_value)
Set the program parts to ground.
CLINGO_VISIBILITY_DEFAULT void clingo_control_release(clingo_control_t *control)
Decrement the reference count of the given control object and destroy if zero.
@ clingo_mode_ground
parse, rewrite, ground
Definition control.h:40
@ clingo_mode_parse
parse only
Definition control.h:38
@ clingo_mode_rewrite
parse and rewrite
Definition control.h:39
@ clingo_mode_solve
parse, rewrite, ground, and solve
Definition control.h:41
struct clingo_lib clingo_lib_t
A library object storing global information.
Definition core.h:176
struct clingo_location clingo_location_t
Represents a source code location marking its beginning and end.
Definition core.h:359
unsigned clingo_write_aspif_mode_t
Corresponding type to clingo_write_aspif_mode_e.
Definition observe.h:30
CLINGO_VISIBILITY_DEFAULT bool clingo_control_write_aspif(clingo_control_t *control, char const *path, size_t size, clingo_write_aspif_mode_t mode)
Write the current logic program in aspif format to a file.
@ clingo_write_aspif_mode_preamble_auto
Write preamble for newly created files.
Definition observe.h:24
@ clingo_write_aspif_mode_symbols
Whether to write symbols in a structured format.
Definition observe.h:27
@ clingo_write_aspif_mode_preamble
Write preamble.
Definition observe.h:23
@ clingo_write_aspif_mode_preprocess
Whether to preprocess the program before writing.
Definition observe.h:26
@ clingo_write_aspif_mode_append
Append to an existing file (or create it).
Definition observe.h:25
CLINGO_VISIBILITY_DEFAULT bool clingo_control_register_propagator(clingo_control_t *control, clingo_propagator_t const *propagator, void *data)
Register a custom propagator with the control object.
struct clingo_solve_handle clingo_solve_handle_t
Search handle to a solve call.
Definition solve.h:110
CLINGO_VISIBILITY_DEFAULT bool clingo_control_solve(clingo_control_t *control, clingo_solve_mode_bitset_t mode, clingo_literal_t const *assumptions, size_t assumptions_size, clingo_solve_event_handler_t const *handler, void *data, clingo_solve_handle_t **handle)
Solve the currently grounded logic program enumerating its models.
unsigned clingo_solve_mode_bitset_t
Corresponding type to clingo_solve_mode_e.
Definition solve.h:69
@ clingo_solve_mode_yield
Yield models in calls to clingo_solve_handle_model.
Definition solve.h:65
@ clingo_solve_mode_async
Enable non-blocking search.
Definition solve.h:64
bool(* clingo_symbol_callback_t)(clingo_symbol_t const *symbols, size_t symbols_size, void *data)
Callback function to inject symbols.
Definition symbol.h:60
uint64_t clingo_symbol_t
Type to represent a symbol.
Definition symbol.h:51
@ tuple
Theory tuples "(t1,...,tn)".
@ map
The configuration entry is a map of configurations.
SolveFlags
Enumeration of the flags for solving a logic program.
Definition control.hh:160
DiscardType
Enumeration of the types of statements that can be discarded.
Definition control.hh:169
WriteAspifFlags
Enumeration of the flags for writing ASPIF files.
Definition control.hh:148
std::vector< Part > PartVector
A vector of program parts.
Definition control.hh:59
ControlMode
Enumeration of the control modes.
Definition control.hh:140
std::span< Part const > PartSpan
A span of program parts.
Definition control.hh:55
std::initializer_list< Part > PartList
An initializer list of program parts.
Definition control.hh:57
@ async
Asynchronously solve in the background.
@ yield
Yield models as they are found.
@ empty
Standard event-based solving.
@ project
Discard project statements.
@ minimize
Discard minimize statements.
@ preamble_auto
Write preamble for newly created files.
@ preamble
Write preamble.
@ symbols
Whether to write symbols in a structured format.
@ append
Append to an existing file (or create it).
@ preprocess
Whether to preprocess the program before writing.
@ parse
Parse only.
@ ground
Parse, rewrite, ground.
@ rewrite
Parse and rewrite.
@ solve
Parse, rewrite, ground, and solve.
std::span< std::string_view const > StringSpan
A span of string views.
Definition core.hh:423
std::initializer_list< std::string_view const > StringList
A list of string views.
Definition core.hh:425
std::span< ProgramLiteral const > ProgramLiteralSpan
A span of program literals.
Definition core.hh:394
@ release
No longer treat an atom as external.
@ none
The empty set of flags.
Definition propagate.hh:38
std::vector< Symbol > SymbolVector
A vector of symbols.
Definition symbol.hh:42
std::span< Symbol const > SymbolSpan
A span of symbols, which is a view on a contiguous sequence of symbols.
Definition symbol.hh:38
auto cpp_cast(clingo_symbol_t const *sym) -> Symbol const *
Cast a C symbol to its C++ representation.
Definition symbol.hh:52
#define CLINGO_ENABLE_BITSET_ENUM(E,...)
Opt-in macro for enabling bit operations for a given enum type.
Definition enum.hh:18
A program part to provide inputs to program directives.
Definition control.hh:40
std::string name
The name of the part.
Definition control.hh:50
SymbolVector params
The parameters of the part.
Definition control.hh:52
Part(std::string name, SymbolVector params={})
Constructs a program part with the given name and parameters.
Definition control.hh:45
Struct used to specify the program parts that have to be grounded.
Definition control.h:57
char const * name
name of the program part
Definition control.h:58
Struct to capture strings that are not null-terminated.
Definition core.h:91
char const * data
pointer to the beginning of the string
Definition core.h:92