clingo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
clasp_facade.h
Go to the documentation of this file.
1 //
2 // Copyright (c) 2006-2012, Benjamin Kaufmann
3 //
4 // This file is part of Clasp. See http://www.cs.uni-potsdam.de/clasp/
5 //
6 // Clasp is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 2 of the License, or
9 // (at your option) any later version.
10 //
11 // Clasp is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with Clasp; if not, write to the Free Software
18 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 //
20 #ifndef CLASP_CLASP_FACADE_H_INCLUDED
21 #define CLASP_CLASP_FACADE_H_INCLUDED
22 
23 #ifdef _MSC_VER
24 #pragma warning (disable : 4200) // nonstandard extension used : zero-sized array
25 #pragma once
26 #endif
27 
28 #if !defined(CLASP_VERSION)
29 #define CLASP_VERSION "3.0.4-p8"
30 #endif
31 #if !defined(CLASP_LEGAL)
32 #define CLASP_LEGAL \
33 "Copyright (C) Benjamin Kaufmann\n"\
34 "License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>\n"\
35 "clasp is free software: you are free to change and redistribute it.\n"\
36 "There is NO WARRANTY, to the extent permitted by law."
37 #endif
38 
39 #if !defined(WITH_THREADS)
40 #error Invalid thread configuration - use WITH_THREADS=0 for single-threaded or WITH_THREADS=1 for multi-threaded version of libclasp!
41 #endif
42 
43 #if WITH_THREADS
44 #include <clasp/parallel_solve.h>
45 namespace Clasp { typedef Clasp::mt::ParallelSolveOptions SolveOptions; }
46 #else
47 #include <clasp/shared_context.h>
48 #include <clasp/solve_algorithms.h>
49 namespace Clasp { typedef Clasp::BasicSolveOptions SolveOptions; }
50 #endif
51 
52 #include <clasp/program_builder.h>
53 #include <clasp/logic_program.h>
54 #include <clasp/enumerator.h>
61 namespace Clasp {
63 // Configuration
66 class ClaspConfig : public BasicSatConfig {
67 public:
69  typedef Solver** SolverIt;
71  ClaspConfig();
72  ~ClaspConfig();
73  // Base interface
74  void prepare(SharedContext&);
75  void reset();
76  // own interface
77  UserConfig* testerConfig() const { return tester_; }
79  void setSolvers(uint32 n);
80 
84 private:
85  ClaspConfig(const ClaspConfig&);
86  ClaspConfig& operator=(const ClaspConfig&);
87  UserConfig* tester_;
88 };
90 // ClaspFacade
95  ExpectedQuantity(double d);
96  ExpectedQuantity(uint32 x) : rep(static_cast<double>(x)) {}
97  ExpectedQuantity(uint64 x) : rep(static_cast<double>(x)) {}
98  explicit ExpectedQuantity(const void* x) : rep(static_cast<double>(reinterpret_cast<uintp>(x))) {}
100  bool valid() const { return error() == error_none; }
101  Error error() const;
102  operator double() const;
103  double rep;
104 };
105 
107 class ClaspFacade : public EventHandler {
108  struct SolveImpl;
109  struct SolveStrategy;
110 public:
112  struct Result {
114  enum Base {
115  UNKNOWN = 0,
116  SAT = 1,
117  UNSAT = 2,
118  };
119  enum Ext {
122  EXT_ERROR = 16,
123  };
124  bool sat() const { return *this == SAT; }
125  bool unsat() const { return *this == UNSAT; }
126  bool unknown() const { return *this == UNKNOWN; }
127  bool exhausted() const { return (flags & EXT_EXHAUST) != 0; }
128  bool interrupted()const { return (flags & EXT_INTERRUPT) != 0; }
129  bool error() const { return (flags & EXT_ERROR) != 0; }
130  operator Base() const { return static_cast<Base>(flags & 3u);}
131  operator double() const { return (double(signal)*256.0) + flags; }
132  uint8 flags; // result flags
133  uint8 signal; // term signal or 0
134  };
136  struct Summary {
138  void init(ClaspFacade& f);
139  const SharedContext& ctx() const { return facade->ctx; }
140  const Asp::LpStats* lpStats() const { return facade->lpStats_.get(); }
141  uint64 enumerated() const { return numEnum; }
142  bool sat() const { return result.sat(); }
143  bool unsat() const { return result.unsat(); }
144  bool complete() const { return result.exhausted(); }
145  bool optimum() const;
146  uint64 optimal() const;
147  bool optimize() const;
148  const SharedMinData* costs() const;
149  const char* consequences() const;
150  int stats() const;
151  const Model* model() const;
153  double totalTime;
154  double cpuTime;
155  double solveTime;
156  double unsatTime;
157  double satTime;
158  uint64 numEnum;
159  uint32 step;
161  };
163  struct StepStart : Event_t<StepStart> {
166  };
168  struct StepReady : Event_t<StepReady> {
170  const Summary* summary;
171  };
172  ClaspFacade();
173  ~ClaspFacade();
184  Asp::LogicProgram& startAsp(ClaspConfig& config, bool allowUpdate = false);
187  SatBuilder& startSat(ClaspConfig& config, bool allowUpdate = false);
189  PBBuilder& startPB(ClaspConfig& config , bool allowUpdate = false);
191  ProgramBuilder& start(ClaspConfig& config, ProblemType t, bool allowUpdate = false);
192 
195 
202  bool prepare(EnumMode m = enum_volatile);
204  void assume(Literal p);
206  void assume(const LitVec& ext);
208 
211  ProgramBuilder& update(bool updateConfig = false);
213 
215 
223  Result solve(Clasp::EventHandler* onModel = 0);
224 #if WITH_THREADS
225  struct AsyncSolve;
227  class AsyncResult {
228  public:
229  typedef StepReady Ready;
230  explicit AsyncResult(SolveImpl& x);
231  ~AsyncResult();
232  AsyncResult(const AsyncResult&);
233  AsyncResult& operator=(AsyncResult temp) { swap(*this, temp); return *this; }
234  friend void swap(AsyncResult& lhs, AsyncResult& rhs){ std::swap(lhs.state_, rhs.state_); }
235  // blocking operations
237  Result get() const;
239  void wait() const;
241  bool waitFor(double sec)const;
243  bool cancel() const;
244 
245  // non-blocking operations
247  bool ready() const;
249  bool ready(Result& r) const;
251  int interrupted() const;
253  bool error() const;
255  bool running() const;
256 
257  // model iterator operations
258  // Example:
259  // for (AsyncResult it = facade.startSolveAsync(); !it.end(); it.next()) {
260  // printModel(it.model());
261  // }
263  bool end() const;
265  void next() const;
267  const Model& model() const;
268  private:
269  AsyncSolve* state_;
270  };
272 
278  AsyncResult solveAsync(Clasp::EventHandler* handler = 0);
279 
281 
289  AsyncResult startSolveAsync();
290 #endif
291  bool ok() const { return program() ? program()->ok() : ctx.ok(); }
294  bool terminate(int signal);
295  const Summary& shutdown();
297  bool solving() const;
299  const Summary& summary() const { return step_; }
301  const ClaspConfig* config() const { return config_;}
303  int step() const { return (int)step_.step;}
305  Result result() const { return step_.result; }
307  ProgramBuilder* program() const { return builder_.get(); }
308 
309  ExpectedQuantity getStat(const char* path)const;
310  const char* getKeys(const char* path)const;
311 private:
312  typedef SingleOwnerPtr<ProgramBuilder> BuilderPtr;
313  typedef SingleOwnerPtr<Asp::LpStats> LpStatsPtr;
314  typedef SingleOwnerPtr<SolveImpl> SolvePtr;
315  typedef SingleOwnerPtr<Summary> SummaryPtr;
316  ExpectedQuantity getStatImpl(const char* path, bool keys)const;
317  ExpectedQuantity getStat(const SharedContext& ctx, const char* key, bool accu, const Range<uint32>& r) const;
318  void init(ClaspConfig& cfg, bool discardProblem);
319  void initBuilder(ProgramBuilder* in, bool incremental);
320  void discardProblem();
321  void startStep(uint32 num);
322  Result stopStep(int signal, bool complete);
323  void accuStep();
324  bool onModel(const Solver& s, const Model& m);
325  ClaspConfig* config_;
326  BuilderPtr builder_;
327  LpStatsPtr lpStats_;
328  SolvePtr solve_;
329  SummaryPtr accu_;
330  LitVec assume_;
331  Summary step_;
332 };
333 }
334 #endif
Result of a solving step.
Definition: clasp_facade.h:112
void assume(Literal p)
Adds p to the list of assumptions under which solving should operate.
Definition: clasp_facade.cpp:393
uint64 optimal() const
Definition: clasp_facade.cpp:602
bool complete() const
Definition: clasp_facade.h:144
int stats() const
Definition: clasp_facade.cpp:591
const Summary * summary
Definition: clasp_facade.h:170
SolveOptions solve
Definition: clasp_facade.h:81
bool solving() const
Returns whether a solve operation is currently active.
Definition: clasp_facade.cpp:399
Definition: clasp_facade.h:116
uint8 flags
Definition: clasp_facade.h:132
uint64 numEnum
Definition: clasp_facade.h:158
Event type used to signal that a solve step has terminated.
Definition: clasp_facade.h:168
~ClaspConfig()
Definition: clasp_facade.cpp:39
uint8 signal
Definition: clasp_facade.h:133
const char * consequences() const
Definition: clasp_facade.cpp:594
Type for storing a model.
Definition: enumerator.h:38
Clasp::BasicSolveOptions SolveOptions
Definition: clasp_facade.h:49
double cpuTime
Definition: clasp_facade.h:154
Type
Definition: claspfwd.h:30
Asp::LogicProgram & startAsp(ClaspConfig &config, bool allowUpdate=false)
Starts definition of an ASP-problem.
Definition: clasp_facade.cpp:340
EnumMode
Definition: clasp_facade.h:193
Options for configuring enumeration.
Definition: enumerator.h:61
Ext
Definition: clasp_facade.h:119
bool sat() const
Definition: clasp_facade.h:124
ProgramBuilder & start(ClaspConfig &config, ProblemType t, bool allowUpdate=false)
Starts definition of a problem of type t.
Definition: clasp_facade.cpp:321
ExpectedQuantity(uint32 x)
Definition: clasp_facade.h:96
def complete
Definition: server.py:15
Definition: clasp_facade.h:122
tuple s
Definition: server.py:45
UTerm lhs
Definition: literals.cc:185
uint64 enumerated() const
Definition: clasp_facade.h:141
void swap(Literal &l, Literal &r)
Definition: literal.h:188
auto f
Definition: statements.cc:122
Definition: misc_types.h:83
ProgramBuilder & update(bool updateConfig=false)
Starts update of the active problem.
Definition: clasp_facade.cpp:350
Aggregates information to be shared between solver objects.
Definition: shared_context.h:396
StepStart(const ClaspFacade &f)
Definition: clasp_facade.h:164
Error error() const
Definition: clasp_facade.cpp:477
Options for the Asp-Preprocessor.
Definition: logic_program.h:95
const Asp::LpStats * lpStats() const
Definition: clasp_facade.h:140
Type summarizing one or more solving steps.
Definition: clasp_facade.h:136
bool unknown() const
Definition: clasp_facade.h:126
Definition: clasp_facade.cpp:119
ExpectedQuantity(double d)
Definition: clasp_facade.cpp:476
PodVector< Literal >::type LitVec
Definition: literal.h:193
double satTime
Definition: clasp_facade.h:157
const SharedMinData * costs() const
Definition: clasp_facade.cpp:593
bool error() const
Definition: clasp_facade.h:129
bool exhausted() const
Definition: clasp_facade.h:127
SharedContext ctx
Definition: clasp_facade.h:174
Result solve(Clasp::EventHandler *onModel=0)
Solves the current prepared problem.
Definition: clasp_facade.cpp:408
UserConfig * testerConfig() const
Definition: clasp_facade.h:77
ExpectedQuantity(const void *x)
Definition: clasp_facade.h:98
uint32 step
Definition: clasp_facade.h:159
bool terminate(int signal)
Tries to terminate an active solve operation.
Definition: clasp_facade.cpp:362
Definition: clasp_facade.h:94
Term & rhs
Definition: literals.cc:186
ProgramBuilder * program() const
Returns the active program or 0 if it was already released.
Definition: clasp_facade.h:307
int step() const
Returns the current incremental step (starts at 0).
Definition: clasp_facade.h:303
~ClaspFacade()
Definition: clasp_facade.cpp:275
void init(ClaspFacade &f)
Definition: clasp_facade.cpp:590
virtual bool ok() const
Returns true if the program is not conflicting.
Definition: program_builder.cpp:35
double unsatTime
Definition: clasp_facade.h:156
Definition: solve_algorithms.h:202
Program statistics for one incremental step.
Definition: logic_program.h:35
StepReady(const Summary &x)
Definition: clasp_facade.h:169
bool ok() const
Returns true unless the master has an unresolvable top-level conflict.
Definition: shared_context.cpp:499
ClaspConfig()
Definition: clasp_facade.cpp:38
ClaspFacade()
Definition: clasp_facade.cpp:274
Definition: clasp_facade.h:121
bool interrupted() const
Definition: clasp_facade.h:128
EnumOptions enumerate
Definition: clasp_facade.h:82
const char * getKeys(const char *path) const
Definition: clasp_facade.cpp:572
A class for defining a SAT-problem in CNF.
Definition: program_builder.h:109
ExpectedQuantity getStat(const char *path) const
Definition: clasp_facade.cpp:569
const Summary & summary() const
Returns the summary of the active step.
Definition: clasp_facade.h:299
const Model * model() const
Definition: clasp_facade.cpp:592
Base
Possible solving results.
Definition: clasp_facade.h:114
Definition: clasp_facade.cpp:91
Definition: clasp_facade.h:66
const ClaspFacade * facade
Definition: clasp_facade.h:165
Definition: misc_types.h:39
const SharedContext & ctx() const
Definition: clasp_facade.h:139
unsigned num
Definition: dependency.cc:114
bool optimum() const
Definition: clasp_facade.cpp:601
void setSolvers(uint32 n)
Definition: clasp_facade.cpp:55
bool unsat() const
Definition: clasp_facade.h:143
const Summary & shutdown()
Definition: clasp_facade.cpp:401
tuple p
Definition: server.py:49
UserConfig * addTesterConfig()
Definition: clasp_facade.cpp:51
bool valid() const
Definition: clasp_facade.h:100
bool unsat() const
Definition: clasp_facade.h:125
Result result
Definition: clasp_facade.h:160
Result result() const
Returns the result of the active step. (unknown if run is not yet completed).
Definition: clasp_facade.h:305
std::vector< std::string > Model
Definition: solver_helper.hh:38
Definition: clasp_facade.h:193
Definition: misc_types.h:38
T * get() const
Definition: misc_types.h:341
Definition: clasp_facade.h:120
Definition: misc_types.h:48
int x
Definition: utility.cc:65
BasicSatConfig UserConfig
Definition: clasp_facade.h:68
tuple d
Definition: pyclingo.py:49
Definition: clasp_facade.h:193
Definition: clasp_facade.h:115
bool ok() const
Returns whether the problem is still valid.
Definition: clasp_facade.h:292
PBBuilder & startPB(ClaspConfig &config, bool allowUpdate=false)
Starts definition of a PB-problem.
Definition: clasp_facade.cpp:334
A class for defining a logic program.
Definition: logic_program.h:77
A (positive) numeric value.
Definition: clasp_facade.h:93
double solveTime
Definition: clasp_facade.h:155
Interface for defining an input program.
Definition: program_builder.h:43
Definition: clasp_facade.h:117
AspOptions asp
Definition: clasp_facade.h:83
double rep
Definition: clasp_facade.h:103
bool sat() const
Definition: clasp_facade.h:142
tuple e
Definition: pyclingo.py:50
A type holding data (possibly) shared between a set of minimize constraints.
Definition: minimize_constraint.h:58
Asp::LogicProgram::AspOptions AspOptions
Definition: clasp_facade.h:70
ExpectedQuantity(uint64 x)
Definition: clasp_facade.h:97
A class for defining a PB-problem.
Definition: program_builder.h:160
Provides a simplified interface to the services of the clasp library.
Definition: clasp_facade.h:107
Error
Definition: clasp_facade.h:94
bool prepare(EnumMode m=enum_volatile)
Finishes the definition of a problem and prepares it for solving.
Definition: clasp_facade.cpp:371
Definition: solver_strategies.h:438
A literal is a variable or its negation.
Definition: literal.h:80
bool optimize() const
Definition: clasp_facade.cpp:600
const ClaspConfig * config() const
Returns the active configuration.
Definition: clasp_facade.h:301
Event type used to signal that a solve step has started.
Definition: clasp_facade.h:163
void prepare(SharedContext &)
Prepares this configuration for the usage in the given context.
Definition: clasp_facade.cpp:63
SharedMinimizeData SharedMinData
Definition: clasp_facade.h:137
const ClaspFacade * facade
Definition: clasp_facade.h:152
Solver ** SolverIt
Definition: clasp_facade.h:69
void reset()
Definition: clasp_facade.cpp:43
SatBuilder & startSat(ClaspConfig &config, bool allowUpdate=false)
Starts definition of a SAT-problem.
Definition: clasp_facade.cpp:328
double totalTime
Definition: clasp_facade.h:153
clasp's Solver class.
Definition: solver.h:82
int end
Definition: literals.cc:62