Clingo
Loading...
Searching...
No Matches
solver.hh
1#pragma once
2
3#include <clingo/control/config.hh>
4#include <clingo/control/grounder.hh>
5
6#include <clingo/output/backend.hh>
7
8#include <clasp/clasp_facade.h>
9#include <clasp/cli/clasp_options.h>
10
11namespace CppClingo::Control {
12
15
16class Solver;
17
22 public:
24 void main(Solver &slv) { do_main(slv); }
26 void exec(std::string_view code) { do_exec(code); }
27
28 private:
29 virtual void do_exec(std::string_view code) = 0;
30 virtual void do_main(Solver &slv) = 0;
31};
33using UScript = std::unique_ptr<Script>;
34
40 public:
42 void register_script(std::string_view name, UScript script);
44 void main(Solver &slv);
45
46 private:
47 void do_exec(Location const &loc, Logger &log, std::string_view name, std::string_view code) override;
48 auto do_callable(std::string_view name, size_t args) -> bool override;
49 void do_call(Location const &loc, std::string_view name, SymbolSpan args, SymbolVec &out) override;
50
51 std::vector<std::pair<std::string, UScript>> scripts_;
52};
53
55enum class IStop : uint8_t {
56 none,
57 sat,
58 unsat,
59 unknown
60};
61
63enum class AppMode : uint8_t {
64 parse,
65 rewrite,
66 ground,
67 solve
68};
69
75 size_t imin = 0;
77 std::optional<size_t> imax = std::nullopt;
81 std::string iquery = "query";
83 bool single_shot = false;
84};
85
87enum class SymbolSelectFlags : uint8_t {
88 none = 0,
89 shown = 1,
90 atoms = 2,
91 terms = 4,
92 theory = 8,
93 all = 15,
94};
97
99enum class ModelType : uint8_t {
100 model = 0,
103};
104
106enum class ConsequenceType : uint8_t {
107 false_ = 0,
108 true_ = 1,
109 unknown = 2
110};
111
114 public:
117
126 template <class F> auto add(Symbol sym, F &&fun) -> prg_id_t {
127 auto [it, ins] = map_.emplace(sym, 0);
128 if (ins) {
129 it.value() = std::invoke(std::forward<F>(fun));
130 }
131 return it.value();
132 }
133
140 void add(Symbol sym, prg_id_t id) {
141 if (!map_.emplace(sym, id).second) {
142 throw std::runtime_error("collision of term ids");
143 }
144 }
145
150 [[nodiscard]] auto term_id(size_t i) const -> prg_id_t {
151 if (i < size()) {
152 return map_.nth(i).value();
153 }
154 throw std::range_error{"index out of range"};
155 }
156
161 [[nodiscard]] auto symbol(size_t i) const -> Symbol {
162 if (i < size()) {
163 return *map_.nth(i).key();
164 }
165 throw std::range_error{"index out of range"};
166 }
167
175 [[nodiscard]] auto index(Symbol sym) const -> size_t { return map_.find(sym) - map_.begin(); }
176
180 [[nodiscard]] auto size() const -> size_t { return map_.size(); }
181
186 [[nodiscard]] auto begin() const -> Map::const_iterator { return map_.cbegin(); }
187
192 [[nodiscard]] auto end() const -> Map::const_iterator { return map_.cend(); }
193
194 private:
196};
197
199class BaseView {
200 public:
202 virtual ~BaseView() = default;
204 [[nodiscard]] auto bases() const -> Ground::Bases const & { return do_bases(); }
206 [[nodiscard]] auto term_base() const -> TermBaseMap const & { return do_term_base(); }
208 [[nodiscard]] auto clasp_program() const -> Clasp::Asp::LogicProgram const & { return do_clasp_program(); }
210 [[nodiscard]] auto clasp_theory() const -> Potassco::TheoryData const & { return clasp_program().theoryData(); }
211
212 private:
213 [[nodiscard]] virtual auto do_bases() const -> Ground::Bases const & = 0;
214 [[nodiscard]] virtual auto do_term_base() const -> TermBaseMap const & = 0;
215 [[nodiscard]] virtual auto do_clasp_program() const -> Clasp::Asp::LogicProgram const & = 0;
216};
217
219class SolveControl : public BaseView {
220 public:
222 void add_clause(PrgLitSpan lits) { do_add_clause(lits); }
223
224 private:
225 virtual void do_add_clause(PrgLitSpan lits) = 0;
226};
227
229class Model {
230 public:
231 virtual ~Model() = default;
232
237 void symbols(SymbolSelectFlags type, SymbolVec &res) const { do_symbols(type, res); }
241 [[nodiscard]] auto number() const -> uint64_t { return do_number(); }
245 [[nodiscard]] auto type() const -> ModelType { return do_type(); }
250 [[nodiscard]] auto contains(Symbol sym) const -> bool { return do_contains(sym); }
255 [[nodiscard]] auto is_true(prg_lit_t lit) const -> bool { return do_is_true(lit); }
260 [[nodiscard]] auto is_consequence(prg_lit_t lit) const -> ConsequenceType { return do_is_consequence(lit); }
264 [[nodiscard]] auto costs() const -> std::span<prg_sum_t const> { return do_costs(); }
268 [[nodiscard]] auto priorities() const -> std::span<prg_weight_t const> { return do_priorities(); }
272 [[nodiscard]] auto optimality_proven() const -> bool { return do_optimality_proven(); }
276 [[nodiscard]] auto thread_id() const -> prg_id_t { return do_thread_id(); }
280 [[nodiscard]] auto context() -> SolveControl & { return do_control(); }
281
283 virtual void extend(SymbolSpan symbols) { do_extend(symbols); }
284
285 private:
286 virtual void do_symbols(SymbolSelectFlags type, SymbolVec &res) const = 0;
287 [[nodiscard]] virtual auto do_number() const -> uint64_t = 0;
288 [[nodiscard]] virtual auto do_type() const -> ModelType = 0;
289 [[nodiscard]] virtual auto do_contains(Symbol sym) const -> bool = 0;
290 virtual void do_extend(SymbolSpan symbols) = 0;
291 [[nodiscard]] virtual auto do_is_true(prg_lit_t lit) const -> bool = 0;
292 [[nodiscard]] virtual auto do_is_consequence(prg_lit_t lit) const -> ConsequenceType = 0;
293 [[nodiscard]] virtual auto do_costs() const -> std::span<prg_sum_t const> = 0;
294 [[nodiscard]] virtual auto do_priorities() const -> std::span<prg_weight_t const> = 0;
295 [[nodiscard]] virtual auto do_optimality_proven() const -> bool = 0;
296 [[nodiscard]] virtual auto do_thread_id() const -> prg_id_t = 0;
297 [[nodiscard]] virtual auto do_control() -> SolveControl & = 0;
298};
300using UModel = std::unique_ptr<Model>;
301
306enum class SolveResult : uint8_t {
307 empty = 0,
308 satisfiable = 1,
309 unsatisfiable = 2,
310 exhausted = 4,
311 interrupted = 8,
312};
315
318 public:
320 virtual ~SolveHandle() = default;
321
327 auto get() -> SolveResult { return do_get(); }
331 void cancel() { do_cancel(); }
337 void resume() { do_resume(); }
347 auto model() -> Model const * { return do_model(); }
353 auto last() -> Model const * { return do_last(); }
360 auto core() -> PrgLitSpan { return do_core(); }
370 auto wait(double timeout) -> bool { return do_wait(timeout); }
371
372 private:
373 virtual auto do_get() -> SolveResult = 0;
374 virtual void do_cancel() = 0;
375 virtual void do_resume() = 0;
376 virtual auto do_model() -> Model const * = 0;
377 virtual auto do_last() -> Model const * = 0;
378 virtual auto do_core() -> PrgLitSpan = 0;
379 virtual auto do_wait(double timeout) -> bool = 0;
380};
382using USolveHandle = std::unique_ptr<SolveHandle>;
383
386 public:
387 virtual ~SolveEventHandler() = default;
388
395 auto on_model(Model &mdl) -> bool { return do_on_model(mdl); }
403 void on_stats(Potassco::AbstractStatistics &stats) { do_on_stats(stats); }
410 void on_unsat(Clasp::SumView bound) { do_on_unsat(bound); }
415 void on_core(Potassco::LitSpan core) { do_on_core(core); }
422 void on_finish(SolveResult result) { do_on_finish(result); }
423
424 private:
425 virtual auto do_on_model([[maybe_unused]] Model &mdl) -> bool { return true; }
426 virtual void do_on_stats([[maybe_unused]] Potassco::AbstractStatistics &stats) {}
427 virtual void do_on_unsat([[maybe_unused]] Clasp::SumView bound) {}
428 virtual void do_on_core([[maybe_unused]] Potassco::LitSpan core) {}
429 virtual void do_on_finish([[maybe_unused]] SolveResult result) {}
430};
432using USolveEventHandler = std::unique_ptr<SolveEventHandler>;
433
437enum class SolveMode : uint8_t {
438 none = 0,
439 async = 1,
440 yield = 2,
441};
444
458 public:
462 [[nodiscard]] auto program() -> Clasp::Asp::LogicProgram & { return do_program(); }
466 [[nodiscard]] auto theory() -> Output::TheoryData & { return do_theory(); }
470 [[nodiscard]] auto store() -> SymbolStore & { return do_store(); }
477 [[nodiscard]] auto add_atom(Symbol atom) -> prg_lit_t { return do_add_atom(atom); }
482 void close() { do_close(); }
484 virtual ~BackendHandle() = default;
485
486 private:
487 virtual auto do_program() -> Clasp::Asp::LogicProgram & = 0;
488 virtual auto do_theory() -> Output::TheoryData & = 0;
489 virtual auto do_store() -> SymbolStore & = 0;
490 virtual auto do_add_atom(Symbol atom) -> prg_lit_t = 0;
491 virtual void do_close() = 0;
492};
494using UBackendHandle = std::unique_ptr<BackendHandle>;
495
497class Propagator : public Potassco::AbstractPropagator, public Potassco::AbstractHeuristic {
498 public:
500 [[nodiscard]] virtual auto hasHeuristic() const -> bool = 0;
501};
503using UPropagator = std::unique_ptr<Propagator>;
504
510 public:
512 void lock() {
513 if (mut_) {
514 mut_->lock();
515 }
516 }
518 void unlock() {
519 if (mut_) {
520 mut_->unlock();
521 }
522 }
524 void enable(bool state) {
525 if (!state) {
526 mut_.reset();
527 } else if (!mut_) {
528 mut_.emplace();
529 mut_->lock();
530 }
531 }
532
533 private:
534 std::optional<std::mutex> mut_;
535};
536
538template <class M> class unlock_guard {
539 public:
541 explicit unlock_guard(M &mut) : mut_{&mut} { mut_->unlock(); }
543 unlock_guard(const unlock_guard &) = delete;
544 ~unlock_guard() { mut_->lock(); }
545 auto operator=(const unlock_guard &) -> unlock_guard & = delete;
546
547 private:
548 M *mut_;
549};
550
553 public:
555 void init(CppClingo::Control::BaseView &view, std::ostream &out);
559 void end_step();
561 auto out() -> std::ostream & { return *out_; }
562
563 private:
564 struct State {
565 State() = default;
566 size_t atom : 1 = 0;
567 size_t term : 1 = 0;
568 size_t index : (8 * sizeof(size_t)) - 2 = 0;
569 };
570
571 auto output(CppClingo::Symbol const &sym) -> State &;
572
573 CppClingo::Control::BaseView *view_ = nullptr;
574 std::ostream *out_ = nullptr;
575 size_t ids_ = 0;
576 std::vector<size_t> buf_;
578};
580using USymbolTable = std::unique_ptr<SymbolTable>;
581
583// TODO: Simplify/Move on next output refactoring
584class Grounded : public Clasp::Event {
585 public:
587 explicit Grounded(Input::ProgramParamVec const &params)
588 : Event(this, subsystem_load, verbosity_quiet), params(params) {}
590 std::span<Input::ProgramParamVec::value_type const> params;
591};
592
593class Grounder;
594
600 public:
607 void finish(GroundResult result) noexcept { do_finish(result); }
608
609 private:
610 virtual void do_finish([[maybe_unused]] GroundResult result) noexcept {}
611};
612
614using UGroundEventHandler = std::unique_ptr<GroundEventHandler>;
615
620 public:
627 ~GroundHandle() noexcept;
628
630 GroundHandle(GroundHandle const &other) = delete;
632 GroundHandle(GroundHandle &&other) noexcept;
634 auto operator=(GroundHandle &&other) noexcept -> GroundHandle &;
636 auto operator=(GroundHandle const &other) -> GroundHandle & = delete;
637
648 [[nodiscard]] auto wait(double timeout) -> bool;
653 [[nodiscard]] auto get() -> GroundResult;
657 void cancel();
658
659 private:
660 class Impl;
661 std::unique_ptr<Impl> impl_;
662};
663
667class Solver : public BaseView {
668 public:
670 Solver(Clasp::ClaspFacade &clasp, Clasp::Cli::ClaspCliConfig &config, Logger &log, SymbolStore &store,
671 Scripts &scripts, Input::RewriteOptions ropts, SolverOptions sopts, FILE *out = stdout);
672
674 void main(std::span<std::string_view const> const &files);
676 void main();
677
681 void parse(std::string_view str);
683 void parse(std::span<std::string_view const> const &files);
685 void parse_with(std::function<void(ProgramBackend *, TheoryBackend *)> cb);
686
688 void add_const(String name, Symbol value);
690 [[nodiscard]] auto const_map() -> Input::ConstMap const &;
692 [[nodiscard]] auto start_ground(ProgramParamVec params, UGroundEventHandler handler) -> GroundHandle;
694 auto ground(ProgramParamVec const &params, Ground::ScriptCallback *ctx, Util::StopFlag *stop = nullptr)
695 -> GroundResult;
702 auto solve(USolveEventHandler handler = {}, PrgLitSpan assumptions = {}, SolveMode mode = SolveMode::none)
703 -> USolveHandle;
704
706 void output_unprocessed_program(std::ostream &out);
707
709 void output_program(std::ostream &out);
710
712 auto map_model(Clasp::Model const &mdl) -> Model &;
713
718 [[nodiscard]] auto buf() -> Util::OutputBuffer & { return buf_; };
719
724 [[nodiscard]] auto backend() -> UBackendHandle;
725
727 [[nodiscard]] auto clasp_facade() -> Clasp::ClaspFacade & { return *clasp_; }
728
730 [[nodiscard]] auto clasp_facade() const -> Clasp::ClaspFacade const & { return *clasp_; }
731
733 [[nodiscard]] auto config() -> ClingoConfig & { return config_; }
734
736 [[nodiscard]] auto clasp_stats() -> Potassco::AbstractStatistics const & {
737 auto const *stats = clasp_->getStats();
738 return stats != nullptr ? *stats : throw std::runtime_error("not in solving mode");
739 }
740
745
747 auto get_lock() -> CallbackLock & { return lock_; }
748
750 void block_main(bool block) { block_main_ = block; }
751
753 [[nodiscard]] auto get_mode() const -> AppMode { return opts_.mode; }
754
756 auto user_data() -> void *& { return data_; }
757
759 void interrupt() noexcept;
760
762 [[nodiscard]] auto get_parts() -> std::optional<Input::StmParts> const & { return grd_.get_parts(); }
763
765 void set_parts(std::optional<Input::StmParts> parts) { grd_.set_parts(std::move(parts)); }
768 auto pos = Position{*grd_.store().string("<cmd>"), 1, 1};
769 auto loc = Location{pos, pos};
770 grd_.set_parts(std::make_optional<Input::StmParts>(loc, Input::Precedence::override_, std::move(parts)));
771 }
772
774 void show(Input::SharedSig const &sig) { grd_.show(sig); }
775
777 auto sym_tab() -> SymbolTable & {
778 if (!sym_tab_) {
779 sym_tab_ = std::make_unique<SymbolTable>();
780 }
781 return *sym_tab_;
782 }
783
787 auto print_summary(bool final) { grd_.print_summary(final); }
788
790 void accept(Ground::ProfileNode::Visitor const &visit) const { grd_.accept(visit); }
791
792 private:
793 class ProgramBackendAdapter;
794
802 enum class State : uint8_t {
803 initial, //< initial step
804 grounded, //< step has been grounded
805 prepared, //< step is prepared for solving
806 solved, //< step has been solved
807 };
808
816 auto make_output_(SymbolStore &store, AppMode mode) -> UOutputStm;
817
819 void prepare_();
820
822 void simplify_();
823
825 void enable_updates_();
826
827 [[nodiscard]] auto do_bases() const -> Ground::Bases const & override { return grd_.base(); }
828
829 [[nodiscard]] auto do_term_base() const -> TermBaseMap const & override { return terms_; }
830
831 [[nodiscard]] auto do_clasp_program() const -> Clasp::Asp::LogicProgram const & override {
832 return clasp_->asp() != nullptr ? *clasp_->asp() : throw std::runtime_error("not in solving mode");
833 }
834
835 void incmode_();
836
837 CallbackLock lock_;
838 std::vector<UPropagator> propagators_;
839 TermBaseMap terms_;
840 Clasp::ClaspFacade *clasp_;
841 ClingoConfig config_;
842 Util::OutputBuffer buf_;
843 UProgramBackend backend_;
844 std::unique_ptr<Output::TheoryData> theory_;
845 UOutputStm out_;
846 UModel mdl_;
847 USymbolTable sym_tab_;
848 Grounder grd_;
849 Scripts *scripts_;
850 State state_ = State::initial;
851 SolverOptions opts_;
852 BuiltinIncludes includes_ = BuiltinIncludes::empty;
853 void *data_ = nullptr;
854 bool block_main_ = false;
855};
856
858
859} // namespace CppClingo::Control
Object to provide access to the backend.
Definition solver.hh:457
auto store() -> SymbolStore &
The symbol store.
Definition solver.hh:470
auto theory() -> Output::TheoryData &
Get the theory.
Definition solver.hh:466
void close()
Close the handle.
Definition solver.hh:482
auto program() -> Clasp::Asp::LogicProgram &
Get the logic program.
Definition solver.hh:462
virtual ~BackendHandle()=default
Destroy the handle.
auto add_atom(Symbol atom) -> prg_lit_t
Add a literal for the given symbol.
Definition solver.hh:477
Interface providing the necessary data to inspect atom, term, and theory bases.
Definition solver.hh:199
auto clasp_theory() const -> Potassco::TheoryData const &
Get a reference to the underlying facade.
Definition solver.hh:210
virtual ~BaseView()=default
The default destructor.
auto bases() const -> Ground::Bases const &
Get a reference to the underlying atom bases.
Definition solver.hh:204
auto term_base() const -> TermBaseMap const &
Get a reference to the underlying term bases.
Definition solver.hh:206
auto clasp_program() const -> Clasp::Asp::LogicProgram const &
Get a reference to the underlying facade.
Definition solver.hh:208
This lock ensures that callbacks during solving are called in lock-step.
Definition solver.hh:509
void enable(bool state)
Enable or disable the lock.
Definition solver.hh:524
void unlock()
Release the lock.
Definition solver.hh:518
void lock()
Acquire the lock.
Definition solver.hh:512
This class provides a hierarchical configuration interface for clingo.
Definition config.hh:24
This callback interface provides grounding events.
Definition solver.hh:599
void finish(GroundResult result) noexcept
Callback to inform that the grounding has finished.
Definition solver.hh:607
A handle for asynchronous grounding.
Definition solver.hh:619
GroundHandle(Solver &solver, Input::ProgramParamVec params, UGroundEventHandler handler)
Start grounding with the given params and context.
~GroundHandle() noexcept
Destroy the ground handle.
Event emitted by a solver after the program is grounded.
Definition solver.hh:584
std::span< Input::ProgramParamVec::value_type const > params
The program parts that have been grounded.
Definition solver.hh:590
Grounded(Input::ProgramParamVec const &params)
Construct a grounded event.
Definition solver.hh:587
A grounder for logic programs.
Definition grounder.hh:18
The model class.
Definition solver.hh:229
auto contains(Symbol sym) const -> bool
Check if the model contains a (symbolic) atom.
Definition solver.hh:250
auto context() -> SolveControl &
Get the context object to control the search.
Definition solver.hh:280
auto is_true(prg_lit_t lit) const -> bool
Check if a program literal is true in a model.
Definition solver.hh:255
auto is_consequence(prg_lit_t lit) const -> ConsequenceType
Check whether the given literal is a consequence.
Definition solver.hh:260
auto number() const -> uint64_t
Get the running number of the model.
Definition solver.hh:241
auto optimality_proven() const -> bool
Check if the model corresponds to an optimal solution.
Definition solver.hh:272
auto thread_id() const -> prg_id_t
Get the solver/thread id the model was found in.
Definition solver.hh:276
auto type() const -> ModelType
Get the type of the model.
Definition solver.hh:245
auto priorities() const -> std::span< prg_weight_t const >
get the priorities of the costs.
Definition solver.hh:268
virtual void extend(SymbolSpan symbols)
Extend the model with the given symbols.
Definition solver.hh:283
void symbols(SymbolSelectFlags type, SymbolVec &res) const
Get the selected symbols in the model.
Definition solver.hh:237
auto costs() const -> std::span< prg_sum_t const >
Get the costs associated with a model.
Definition solver.hh:264
The propagator interface.
Definition solver.hh:497
virtual auto hasHeuristic() const -> bool=0
Can return false to not also register the propagator as a heuristic.
Script providing code execution, main, and callbacks.
Definition solver.hh:21
void main(Solver &slv)
Run the main function.
Definition solver.hh:24
void exec(std::string_view code)
Execute the given code.
Definition solver.hh:26
Helper to run specific code and callbacks.
Definition solver.hh:39
void register_script(std::string_view name, UScript script)
Register the given script.
void main(Solver &slv)
Run the main function.
Simple control class to add clauses while enumerating models.
Definition solver.hh:219
void add_clause(PrgLitSpan lits)
Add a clause over the given literal.
Definition solver.hh:222
The event handler interface.
Definition solver.hh:385
void on_unsat(Clasp::SumView bound)
Callback to intercept lower bounds.
Definition solver.hh:410
void on_finish(SolveResult result)
Callback to inform that the search has finished.
Definition solver.hh:422
auto on_model(Model &mdl) -> bool
Callback to intercept models.
Definition solver.hh:395
void on_core(Potassco::LitSpan core)
The unsatisfiable core of the current problem.
Definition solver.hh:415
void on_stats(Potassco::AbstractStatistics &stats)
Callback to update statistics.
Definition solver.hh:403
A handle to control a running search.
Definition solver.hh:317
auto last() -> Model const *
Get the last model after the search has finished.
Definition solver.hh:353
void resume()
Resume search after a model has been found to start search for the next one.
Definition solver.hh:337
auto wait(double timeout) -> bool
Wait for the given amount of time or until the next result is ready.
Definition solver.hh:370
auto get() -> SolveResult
Get the result of a search.
Definition solver.hh:327
auto model() -> Model const *
Get the current model or a nullptr if there is none.
Definition solver.hh:347
auto core() -> PrgLitSpan
Get a subset of the assumptions that made the problem unsatisfiable.
Definition solver.hh:360
virtual ~SolveHandle()=default
The default destructor.
void cancel()
Cancel the current search.
Definition solver.hh:331
A grounder and solver for logic programs.
Definition solver.hh:667
void parse(std::string_view str)
Parse a program from the given string.
void output_program(std::ostream &out)
Output the current program.
void join(Input::UnprocessedProgram const &prg)
Join with the given program.
void parse_with(std::function< void(ProgramBackend *, TheoryBackend *)> cb)
Parse with optional backends.
void set_parts(Input::ProgramParamVec parts)
Set the program parts to ground.
Definition solver.hh:767
void main(std::span< std::string_view const > const &files)
Parse, ground, and solve a program.
auto clasp_facade() -> Clasp::ClaspFacade &
Get a pointer to the underlying clasp facade.
Definition solver.hh:727
void interrupt() noexcept
Interrupt the running (or next search).
void parse(std::span< std::string_view const > const &files)
Parse the given files.
auto backend() -> UBackendHandle
Get a handle that provides access to the backend to add atoms and rules.
void block_main(bool block)
Block execution of the main function in scripts.
Definition solver.hh:750
auto buf() -> Util::OutputBuffer &
Get the output buffer.
Definition solver.hh:718
void main()
Ground and solve a program.
auto const_map() -> Input::ConstMap const &
Get the const map.
auto print_summary(bool final)
Print per step summaries.
Definition solver.hh:787
auto ground(ProgramParamVec const &params, Ground::ScriptCallback *ctx, Util::StopFlag *stop=nullptr) -> GroundResult
Ground the program.
auto clasp_stats() -> Potassco::AbstractStatistics const &
Get the statistics.
Definition solver.hh:736
auto get_lock() -> CallbackLock &
Get the solvers callback lock.
Definition solver.hh:747
void accept(Ground::ProfileNode::Visitor const &visit) const
Accept a visitor for the profile nodes.
Definition solver.hh:790
void add_const(String name, Symbol value)
Define a constant.
auto sym_tab() -> SymbolTable &
Get the symbol table.
Definition solver.hh:777
Solver(Clasp::ClaspFacade &clasp, Clasp::Cli::ClaspCliConfig &config, Logger &log, SymbolStore &store, Scripts &scripts, Input::RewriteOptions ropts, SolverOptions sopts, FILE *out=stdout)
Create a solver object.
auto clasp_facade() const -> Clasp::ClaspFacade const &
Get a pointer to the underlying clasp facade.
Definition solver.hh:730
void set_parts(std::optional< Input::StmParts > parts)
Set the program parts to ground.
Definition solver.hh:765
void register_propagator(UPropagator propagator)
Register the given propagator with the control object.
auto map_model(Clasp::Model const &mdl) -> Model &
Map the given clasp model to the clingo one.
auto config() -> ClingoConfig &
Only non-null in solving mode.
Definition solver.hh:733
auto solve(USolveEventHandler handler={}, PrgLitSpan assumptions={}, SolveMode mode=SolveMode::none) -> USolveHandle
Solve the program.
void show(Input::SharedSig const &sig)
Show the given signature.
Definition solver.hh:774
void output_unprocessed_program(std::ostream &out)
Output the current unprocessed program.
auto start_ground(ProgramParamVec params, UGroundEventHandler handler) -> GroundHandle
Ground the program asynchronously.
auto user_data() -> void *&
Get user data for C integration.
Definition solver.hh:756
auto get_mode() const -> AppMode
Get the application mode.
Definition solver.hh:753
Helper to output symbols.
Definition solver.hh:552
void init(CppClingo::Control::BaseView &view, std::ostream &out)
Initialize the table before output.
void end_step()
Output atoms in extended aspif format.
auto out() -> std::ostream &
Get the underlying output stream.
Definition solver.hh:561
void begin_step()
Output ids of shown terms in extended aspif format.
Map from symbols to show term ids.
Definition solver.hh:113
auto size() const -> size_t
Get the number of mapped symbols.
Definition solver.hh:180
auto add(Symbol sym, F &&fun) -> prg_id_t
Add a new symbol to the map.
Definition solver.hh:126
auto end() const -> Map::const_iterator
Get an iterator over the symbol id pairs in the map pointing to the end of the sequence.
Definition solver.hh:192
void add(Symbol sym, prg_id_t id)
Add a symbol with the given id.
Definition solver.hh:140
auto index(Symbol sym) const -> size_t
Get the index of the symbol.
Definition solver.hh:175
auto term_id(size_t i) const -> prg_id_t
Get the id at the given index.
Definition solver.hh:150
auto begin() const -> Map::const_iterator
Get an iterator over the symbol id pairs in the map pointing to the beginning of the sequence.
Definition solver.hh:186
Util::ordered_map< SharedSymbol, prg_id_t > Map
The container storing the mapping (internal).
Definition solver.hh:116
auto symbol(size_t i) const -> Symbol
Get the symbol at the given index.
Definition solver.hh:161
RAII helper to unlock a mutex.
Definition solver.hh:538
unlock_guard(const unlock_guard &)=delete
Destructor re-locking the mutex.
unlock_guard(M &mut)
Constructor unlocking the mutex.
Definition solver.hh:541
std::function< void(std::variant< std::pair< std::string_view, bool >, std::pair< ProfileStats const *, ProfileType > >, size_t)> Visitor
The type of visitor function to use for visiting profile nodes.
Definition profile.hh:106
Interface to call functions during parsing/grounding.
Definition script.hh:28
void call(Location const &loc, std::string_view name, SymbolSpan args, SymbolVec &out)
Call the function with the given name and arguments.
Definition script.hh:35
Interface to execute code in source files.
Definition script.hh:12
Program grouping unprocessed statements.
Definition program.hh:70
The Location of an expression in an input source.
Definition location.hh:44
Simple logger to report message to stderr or via a callback.
Definition logger.hh:63
Class similar to Potassco::TheoryData but with automatic id generation.
Definition backend.hh:17
A point in an input source.
Definition location.hh:15
Abstract class connecting grounder and solver.
Definition backend.hh:54
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
Abstract class connecting grounder and theory data.
Definition backend.hh:213
Create an output buffer that bears some similarities with C++'s iostreams.
Definition print.hh:24
Helper class to signal stopping of grounding.
Definition sync.hh:11
std::unique_ptr< Propagator > UPropagator
A unique pointer to a propagator.
Definition solver.hh:503
std::unique_ptr< SolveHandle > USolveHandle
A unique pointer for a solve handle.
Definition solver.hh:382
ModelType
Enumeration of available model flags.
Definition solver.hh:99
IStop
Stop condition for incremental mode.
Definition solver.hh:55
SolveMode
The available solve modes.
Definition solver.hh:437
BuiltinIncludes
Bitset of enabled builtin includes.
Definition parse.hh:23
SymbolSelectFlags
A bit set of symbol selection flags.
Definition solver.hh:87
AppMode
Enumeration of available application modes.
Definition solver.hh:63
std::unique_ptr< SymbolTable > USymbolTable
A unique pointer to a symbol table.
Definition solver.hh:580
std::unique_ptr< SolveEventHandler > USolveEventHandler
A unique pointer for an event handler.
Definition solver.hh:432
SolveResult
The solve result.
Definition solver.hh:306
std::unique_ptr< Model > UModel
A unique pointer to a model.
Definition solver.hh:300
ConsequenceType
Enumeration of available consequence types.
Definition solver.hh:106
std::unique_ptr< BackendHandle > UBackendHandle
A unique pointer to a backend handle.
Definition solver.hh:494
std::unique_ptr< Script > UScript
A unique pointer to a script.
Definition solver.hh:33
std::unique_ptr< GroundEventHandler > UGroundEventHandler
A unique pointer to a ground event handler.
Definition solver.hh:614
@ cautious_consequences
The model represents a set of cautious consequences.
@ model
The model represents a stable model.
@ brave_consequences
The model represents a set of brave consequences.
@ none
Do not consider solve result.
@ sat
Stop when satisfiable.
@ unsat
Stop when unsat.
@ unknown
Stop when interrupted.
@ async
Solve asynchronously in background threads.
@ yield
Yield models while solving via SolveHandle::model().
@ shown
Select shown atoms and terms.
@ theory
Select symbols added by theory.
@ parse
Stop processing after parsing.
@ ground
Stop processing after grounding.
@ rewrite
Stop processing after rewriting.
@ solve
Stop processing after solving.
@ satisfiable
The search produced at least one model.
@ exhausted
The search has been exhausted.
@ true_
The literal is a consequence.
@ false_
The literal is not a consequence.
int32_t prg_lit_t
A program literal.
Definition backend.hh:27
std::unique_ptr< OutputStm > UOutputStm
Unique pointer for statement output.
Definition output.hh:253
std::span< prg_lit_t const > PrgLitSpan
A span of program literals.
Definition backend.hh:37
int32_t prg_weight_t
A weight used in weight and minimize constraints.
Definition backend.hh:33
int64_t prg_sum_t
Type to represent sums of weights.
Definition backend.hh:35
uint32_t prg_id_t
An id to refer to elements of a logic program.
Definition backend.hh:16
std::unique_ptr< ProgramBackend > UProgramBackend
A unique pointer for a program backend.
Definition backend.hh:210
std::span< Symbol const > SymbolSpan
A span of symbols.
Definition symbol.hh:218
std::vector< Symbol > SymbolVec
A vector of symbols.
Definition symbol.hh:220
GroundResult
Available grounding results.
Definition core.hh:187
@ unsatisfiable
The grounding was successful but an inconsistency was derived.
@ interrupted
The grounding was interrupted.
@ none
No sign.
Util::ordered_map< SharedString, std::pair< StmConst, SharedSymbol > > ConstMap
Map from identifiers to constants.
Definition program.hh:48
std::vector< ProgramParam > ProgramParamVec
A list of program params.
Definition statement.hh:764
std::tuple< SharedString, size_t, bool > SharedSig
The signature of a predicate.
Definition term.hh:42
tsl::ordered_map< Key, T, Hash, KeyEqual, Allocator, ValueTypeContainer, IndexType > ordered_map
Alias for ordered maps.
Definition ordered_map.hh:16
tsl::hopscotch_map< Key, T, Hash, KeyEqual, Allocator, NeighborhoodSize, StoreHash, GrowthPolicy > unordered_map
Alias for unordered maps.
Definition unordered_map.hh:17
#define CLINGO_ENABLE_BITSET_ENUM(E,...)
Opt-in macro for enabling bit operations for a given enum type.
Definition enum.hh:18
Options for the solver.
Definition solver.hh:71
std::string iquery
The name of the query atom.
Definition solver.hh:81
size_t imin
The minimum number of incremental steps.
Definition solver.hh:75
bool single_shot
Restrict to single shot-solving.
Definition solver.hh:83
AppMode mode
Operation mode of the solver.
Definition solver.hh:73
std::optional< size_t > imax
The maximum number of incremental steps.
Definition solver.hh:77
IStop istop
The stop condition for the incremental mode.
Definition solver.hh:79
Options to configure rewriting.
Definition program.hh:38