20 #ifndef CLASP_SHARED_CONTEXT_H_INCLUDED
21 #define CLASP_SHARED_CONTEXT_H_INCLUDED
23 #pragma warning (disable : 4200) // nonstandard extension used : zero-sized array
43 class SharedDependencyGraph;
50 class SatPreprocessor {
58 uint32
size()
const {
return size_; }
60 bool inQ()
const {
return inQ_ != 0; }
63 bool marked()
const {
return marked_ != 0;}
93 uint32
numClauses()
const {
return (uint32)clauses_.size(); }
110 void cleanUp(
bool discardEliminated =
false);
135 clauses_[clId]->destroy();
176 void reset() { std::memset(
this, 0,
sizeof(*
this)); }
187 static const char*
keys(
const char* = 0);
220 bool has(uint32
f)
const {
return (
rep & f) != 0; }
235 void resize(uint32 nodes);
268 uint32
size()
const {
return graph_.size(); }
281 if (x.empty())
return true;
284 if (!op.unary(p, *it)) {
return false; }
287 if (!op.binary(p, it->first, it->second)) {
return false; }
290 for (Block*
b = (x).learnt;
b ;
b =
b->next) {
291 p.
watch();
bool r =
true;
292 for (Block::const_iterator imp =
b->begin(), endOf =
b->end(); imp != endOf; ) {
293 if (!imp->watched()) { r = op.binary(p, imp[0], imp[1]); imp += 2; }
294 else { r = op.unary(p, imp[0]); imp += 1; }
295 if (!r) {
return false; }
310 typedef const Literal* const_iterator;
312 enum { block_cap = (64 - (
sizeof(atomic_size)+
sizeof(atomic_ptr)))/
sizeof(
Literal) };
314 const_iterator
begin()
const {
return data; }
315 const_iterator
end()
const {
return data+
size(); }
316 iterator
end() {
return data+
size(); }
317 uint32
size()
const {
return size_lock >> 1; }
318 bool tryLock(uint32& lockedSize);
319 void addUnlock(uint32 lockedSize,
const Literal*
x, uint32 xs);
321 atomic_size size_lock;
322 Literal data[block_cap];
324 typedef Block::atomic_ptr SharedBlockPtr;
326 struct ImplicationList :
public ImpListBase {
327 ImplicationList() : ImpListBase() { learnt = 0; }
328 ImplicationList(
const ImplicationList& other) : ImpListBase(other), learnt(other.learnt) {}
330 bool hasLearnt(Literal q, Literal r =
negLit(0))
const;
331 void addLearnt(Literal q, Literal r =
negLit(0));
332 void simplifyLearnt(
const Solver&
s);
333 bool empty()
const {
return ImpListBase::empty() && learnt == 0; }
334 void move(ImplicationList& other);
336 SharedBlockPtr learnt;
341 ImplicationList& getList(Literal
p) {
return graph_[p.index()]; }
342 void remove_bin(ImplicationList& w, Literal p);
343 void remove_tern(ImplicationList& w, Literal p);
359 all = conflict | loop,
362 Policy(uint32 a_sz = 0, uint32 a_lbd = 0, uint32 a_type = 0) :
size(a_sz), lbd(a_lbd), types(a_type) {}
367 static uint64
mask(uint32 i) {
return uint64(1) << i; }
368 static uint32
initSet(uint32 sz) {
return (uint64(1) << sz) - 1; }
369 static bool inSet(uint64
s, uint32
id) {
return (s & mask(
id)) != 0; }
373 return size <= policy_.size && lbd <= policy_.lbd && ((type & policy_.types) != 0);
410 enum InitMode { init_share_symbols, init_copy_symbols };
427 void setConcurrency(uint32 numSolver);
439 void enableStats(uint32 level);
451 ConfigPtr configuration()
const {
return config_.get(); }
476 bool frozen()
const {
return share_.frozen;}
478 bool isShared()
const {
return frozen() && concurrency() > 1; }
481 bool hasSolver(uint32
id)
const {
return id < solvers_.size(); }
496 uint32
numVars()
const {
return static_cast<uint32
>(varInfo_.size() - 1); }
504 bool validVar(
Var var)
const {
return var < static_cast<uint32>(varInfo_.size()); }
508 bool eliminated(
Var v)
const;
512 uint32 numConstraints()
const;
520 uint32 problemComplexity()
const;
552 void cloneVars(
const SharedContext& other, InitMode m = init_copy_symbols);
554 void resizeVars(uint32 maxVar) { varInfo_.resize(std::max(
Var(1), maxVar)); problem_.vars = numVars(); }
565 void requestStepVar();
567 void requestData(
Var v);
569 void setFrozen(
Var v,
bool b);
583 void eliminate(
Var v);
591 Solver& startAddConstraints(uint32 constraintGuess = 100);
614 bool endInit(
bool attachAll =
false);
644 void detach(uint32
id,
bool reset =
false) {
return detach(*solver(
id), reset); }
645 void detach(
Solver&
s,
bool reset =
false);
649 uint32
winner()
const {
return share_.winner; }
650 void setWinner(uint32 sId) { share_.winner = std::min(sId, concurrency()); }
653 void simplify(
bool shuffle);
655 void removeConstraint(uint32 idx,
bool detach);
669 void report(
const Event& ev)
const {
if (progress_) progress_->dispatch(ev); }
670 bool report(
const Solver&
s,
const Model& m)
const {
return !progress_ || progress_->onModel(s, m); }
671 void initStats(
Solver&
s)
const;
683 struct SharedSymTab {
684 SharedSymTab() : refs(1) {}
688 ProblemStats problem_;
695 uint32 lastTopLevel_;
704 Share() : count(1), winner(0), shareM((uint32)ContextParams::share_auto), shortM(0), frozen(0), seed(0), satPreM(0) {}
Definition: shared_context.h:194
BinderType type
Definition: statements.cc:1283
bool forEach(Literal p, const OP &op) const
Applies op on all unary- and binary implications following from p.
Definition: shared_context.h:279
Definition: shared_context.h:196
struct Clasp::SatPreprocessor::Stats stats
ProblemStats()
Definition: shared_context.h:168
Var var() const
Returns the variable of the literal.
Definition: literal.h:117
PodVector< ValueRep >::type ValueVec
Definition: literal.h:207
Definition: shared_context.h:114
uint32 winner() const
Definition: shared_context.h:649
void mark(Literal p)
Definition: shared_context.h:577
ImpType
Definition: shared_context.h:232
VarType type() const
Returns the type of the variable (or Var_t::atom_body_var if variable was created with parameter eq=t...
Definition: shared_context.h:205
SccGraph sccGraph
Definition: shared_context.h:449
uint32 numBinary() const
Returns the number of binary constraints.
Definition: shared_context.h:514
SingleOwnerPtr< SDG > SccGraph
Definition: shared_context.h:400
uint32 numClauses() const
Definition: shared_context.h:93
Stores a reference to the constraint that implied a literal.
Definition: constraint.h:399
uint32 size() const
Definition: shared_context.h:268
void cleanUp(bool discardEliminated=false)
Force removal of state & clauses.
Definition: shared_context.cpp:329
uint32 index() const
Returns the unique index of this literal.
Definition: literal.h:99
void setProject(Var v, bool b)
Marks/unmarks v as projection variable.
Definition: shared_context.h:575
static Clause * newClause(const Literal *lits, uint32 size)
Definition: shared_context.cpp:444
PodVector< Solver * >::type SolverVec
Definition: shared_context.h:399
Solver * master() const
Returns the master solver associated with this object.
Definition: shared_context.h:483
PodVector< Clause * >::type ClauseList
Definition: shared_context.h:122
Definition: constraint.h:53
uint32 vars_eliminated
Definition: shared_context.h:170
Types
Definition: shared_context.h:355
Type for storing a model.
Definition: enumerator.h:38
void watch()
Sets the watched-flag of this literal.
Definition: literal.h:128
SharedContext * ctx_
Definition: shared_context.h:144
SingleOwnerPtr< SatPreprocessor > SatPrePtr
Definition: shared_context.h:409
VarInfo varInfo(Var v) const
Returns information about the given variable.
Definition: shared_context.h:506
bool isExtended() const
Definition: shared_context.h:479
const ImpGraph & ImpGraphRef
Definition: shared_context.h:407
Definition: solver_strategies.h:337
Definition: shared_context.h:197
uint32 vars_frozen
Definition: shared_context.h:171
bool hasSolver(uint32 id) const
Returns whether this object has a solver associcated with the given id.
Definition: shared_context.h:481
uint32 complexity
Definition: shared_context.h:175
void setVarEq(Var v, bool b)
Definition: shared_context.h:576
base_type::const_right_iterator const_right_iterator
Definition: left_right_sequence.h:258
Definition: solver_strategies.h:371
Literal negLit(Var v)
Creates the negative literal of variable v.
Definition: literal.h:166
bool isShared() const
Returns whether more than one solver is actively working on the problem.
Definition: shared_context.h:478
bool project() const
Returns true if var is a projection variable.
Definition: shared_context.h:209
static bool inSet(uint64 s, uint32 id)
Definition: shared_context.h:369
uint8 rep
Definition: shared_context.h:224
bool propagate(Solver &s, Literal p) const
Propagates consequences of p following from binary and ternary clauses.
Definition: shared_context.cpp:298
Base class for (boolean) constraints to be used in a Solver.
Definition: constraint.h:85
bool allowImplicit(ConstraintType t) const
Returns whether short constraints of type t can be stored in the short implication graph...
Definition: shared_context.h:465
Parameters for (optional) Sat-preprocessing.
Definition: solver_strategies.h:335
uint32 constraints_binary
Definition: shared_context.h:173
void report(const Event &ev) const
Definition: shared_context.h:669
void setMarked(bool b)
Definition: shared_context.h:66
void init(BoundVec const &bounds, IntervalSet< Value > &set)
Definition: statements.cc:332
const ProblemStats & StatsRef
Definition: shared_context.h:403
uint32 numConstraints() const
Definition: shared_context.h:177
Stores static information about a variable.
Definition: shared_context.h:191
bool inQ() const
Definition: shared_context.h:60
PodVector< Var >::type VarVec
Definition: literal.h:192
bool sign() const
Returns the sign of the literal.
Definition: literal.h:123
tuple s
Definition: server.py:45
bk_lib::pod_vector< ImplicationList > type
Definition: pod_vector.h:37
A struct for aggregating statistics maintained in a solver object.
Definition: solver_types.h:287
bool preprocess(SharedContext &ctx, SatPreParams &opts)
Runs the preprocessor on all clauses that were previously added.
Definition: shared_context.cpp:357
void removeTrue(const Solver &s, Literal p)
Removes p and its implications.
Definition: shared_context.cpp:228
Definition: constraint.h:52
virtual bool initPreprocess(SatPreParams &opts)=0
auto f
Definition: statements.cc:122
uint32 constraints_ternary
Definition: shared_context.h:174
uint32 Var
A variable is currently nothing more but an integer in the range [0..varMax).
Definition: literal.h:42
uint32 numLearnt() const
Definition: shared_context.h:266
Definition: misc_types.h:83
void setNant(Var v, bool b)
Marks/unmarks v as contained in a negative loop or head of a choice rule.
Definition: shared_context.h:571
uint32 numTernary() const
Definition: shared_context.h:265
Aggregates information to be shared between solver objects.
Definition: shared_context.h:396
uint32 clRemoved
Definition: shared_context.h:116
void destroyClause(uint32 clId)
Definition: shared_context.h:134
bool report(const Solver &s, const Model &m) const
Definition: shared_context.h:670
LitVec::size_type size_type
Definition: shared_context.h:405
void setPreserveModels(bool b=true)
If b is true, sets preprocessing mode to model-preserving operations only.
Definition: shared_context.h:442
A struct for aggregating basic problem statistics.
Definition: shared_context.h:167
Type
Definition: constraint.h:50
void setEventHandler(EventHandler *r)
Enables event reporting via the given event handler.
Definition: shared_context.h:421
bool has(uint32 f) const
Definition: shared_context.h:220
Stats()
Definition: shared_context.h:115
double operator[](const char *key) const
Definition: shared_context.cpp:28
ShortImplicationsGraph ImpGraph
Definition: shared_context.h:406
uint32 numBinary() const
Definition: shared_context.h:264
ImpGraphRef shortImplications() const
Definition: shared_context.h:667
uint32 numLearntShort() const
Returns the number of learnt short implications.
Definition: shared_context.h:666
PodVector< Literal >::type LitVec
Definition: literal.h:193
bool validVar(Var var) const
Returns true if var represents a valid variable in this problem.
Definition: shared_context.h:504
void resize(uint32 nodes)
Makes room for nodes number of nodes.
Definition: shared_context.cpp:163
Mode
Definition: solver_strategies.h:336
bool reverseArc(const Solver &s, Literal p, uint32 maxLev, Antecedent &out) const
Checks whether there is a reverse arc implying p and if so returns it in out.
Definition: shared_context.cpp:299
static uint64 abstractLit(Literal p)
Definition: shared_context.h:57
void resizeVars(uint32 maxVar)
Sets the range of problem variables to [1, maxVar)
Definition: shared_context.h:554
InitMode
Definition: shared_context.h:410
Definition: shared_context.h:198
bool marked(Literal p) const
Definition: shared_context.h:509
void detach(uint32 id, bool reset=false)
Detaches the solver with the given id from this object.
Definition: shared_context.h:644
uint32 litsRemoved
Definition: shared_context.h:118
const Literal & operator[](uint32 x) const
Definition: shared_context.h:59
A clause class optimized for preprocessing.
Definition: shared_context.h:54
SatPrePtr satPrepro
Definition: shared_context.h:448
bool preferredSign() const
Returns the preferred sign of this variable w.r.t its type.
Definition: shared_context.h:217
EventHandler * LogPtr
Definition: shared_context.h:408
Base class for distributing learnt knowledge between solvers.
Definition: shared_context.h:352
Definition: shared_context.h:193
uint32 numEliminatedVars() const
Returns the number of eliminated vars.
Definition: shared_context.h:498
Clause * elimTop_
Definition: shared_context.h:145
bool add(ImpType t, bool learnt, const Literal *lits)
Adds the given constraint to the implication graph.
Definition: shared_context.cpp:178
Stores two sequences in one contiguous memory block.
Definition: left_right_sequence.h:245
void setClause(uint32 clId, const LitVec &cl)
Definition: shared_context.h:131
Stores assignment related information.
Definition: solver_types.h:653
StatsRef stats() const
Definition: shared_context.h:521
Definition: solver_strategies.h:366
void reset()
Definition: shared_context.h:176
Literal stepLiteral() const
Definition: shared_context.h:510
virtual SatPreprocessor * clone()=0
Creates a clone of this preprocessor.
SingleOwnerPtr< Distributor > DistrPtr
Definition: shared_context.h:402
bool isCandidate(uint32 size, uint32 lbd, uint32 type) const
Definition: shared_context.h:372
void eliminateClause(uint32 id)
Definition: shared_context.h:139
VarInfo()
Definition: shared_context.h:202
bool attach(uint32 id)
Attaches the solver with the given id to this object.
Definition: shared_context.h:632
uint32 clAdded
Definition: shared_context.h:117
static uint8 flag(FLAG x)
Definition: shared_context.h:223
void discardClauses(bool discardEliminated)
Definition: shared_context.cpp:314
uint32 numVars() const
Returns the number of problem variables.
Definition: shared_context.h:496
tuple b
Definition: pyclingo.py:47
Symbol table that maps external ids to internal literals.
Definition: literal.h:249
base_type::const_left_iterator const_left_iterator
Definition: left_right_sequence.h:256
~ShortImplicationsGraph()
Definition: shared_context.cpp:160
uint32 vars
Definition: shared_context.h:169
SymbolsRef symbolTable() const
Definition: shared_context.h:522
uint32 numTernary() const
Returns the number of ternary constraints.
Definition: shared_context.h:516
Definition: shared_context.h:200
void setWinner(uint32 sId)
Definition: shared_context.h:650
SatPreParams Options
Definition: shared_context.h:120
uint64 abstr
Definition: shared_context.h:75
Definition: shared_context.h:199
Definition: shared_context.h:354
A class for efficiently storing and propagating binary and ternary clauses.
Definition: shared_context.h:228
void setInDisj(Var v, bool b)
Marks/unmarks v as contained in a non-hcf disjunction.
Definition: shared_context.h:573
void set(FLAG f)
Definition: shared_context.h:221
static const char * keys(const char *=0)
Definition: shared_context.cpp:40
void destroy()
Definition: shared_context.cpp:472
bool propagateBin(Assignment &out, Literal p, uint32 dl) const
Propagates immediate consequences of p following from binary clauses only.
Definition: shared_context.cpp:300
LogPtr eventHandler() const
Returns the active event handler or 0 if none was set.
Definition: shared_context.h:454
Type
Definition: literal.h:55
void markShared(bool b)
Mark the instance as shared/unshared.
Definition: shared_context.h:241
Interface for configuring a SharedContext object and its associated solvers.
Definition: solver_strategies.h:389
const Clause * clause(uint32 clId) const
Definition: shared_context.h:128
Definition: literal.h:270
static uint64 mask(uint32 i)
Definition: shared_context.h:367
bool nant() const
Returns true if var is contained in a negative loop or head of a choice rule.
Definition: shared_context.h:207
SharedDependencyGraph SDG
Definition: shared_context.h:398
ShortImplicationsGraph()
Definition: shared_context.cpp:155
tuple p
Definition: server.py:49
void strengthen(Literal p)
Definition: shared_context.cpp:452
bool inDisj() const
Definition: shared_context.h:210
bool preserveModels() const
Definition: shared_context.h:459
ShareMode
How to handle physical sharing of (explicit) constraints.
Definition: solver_strategies.h:369
bool frozen() const
Returns whether the problem is currently frozen and therefore ready for being solved.
Definition: shared_context.h:476
void simplify(Solver &s)
Definition: shared_context.cpp:460
virtual ~SatPreprocessor()
Definition: shared_context.cpp:311
SymbolTable & SymbolsRef
Definition: shared_context.h:404
tuple c
Definition: visualize.py:132
FLAG
Definition: shared_context.h:192
uint32 constraints
Definition: shared_context.h:172
Base class for library events.
Definition: misc_types.h:37
uint64 & abstraction()
Definition: shared_context.h:67
Base class for preprocessors working on clauses only.
Definition: shared_context.h:51
int x
Definition: utility.cc:65
Clause * clause(uint32 clId)
Definition: shared_context.h:127
virtual void doCleanUp()=0
Gringo::IntervalSet< T >::const_iterator begin(Gringo::IntervalSet< T > const &x)
Definition: intervals.hh:311
bool physicalShare(ConstraintType t) const
Returns whether physical sharing is enabled for constraints of type t.
Definition: shared_context.h:461
Var_t::Type VarType
Definition: literal.h:63
virtual void doExtendModel(ValueVec &m, LitVec &open)=0
Clause * next
Definition: shared_context.h:76
void toggle(FLAG f)
Definition: shared_context.h:222
SatPreprocessor()
Definition: shared_context.h:84
Definition: pod_vector.h:36
void diff(const ProblemStats &o)
Definition: shared_context.h:178
void extendModel(ValueVec &m, LitVec &open)
Extends the model in m with values for any eliminated variables.
Definition: shared_context.cpp:433
void setInQ(bool b)
Definition: shared_context.h:65
uint32 numEdges(Literal p) const
Definition: shared_context.cpp:176
bool marked() const
Definition: shared_context.h:63
Definition: constraint.h:51
An array of literals that can be shared between threads.
Definition: clause.h:33
Value var
Definition: output.cc:70
ShortMode
How to handle short learnt clauses.
Definition: solver_strategies.h:364
uint32 size() const
Definition: shared_context.h:58
bool physicalShareProblem() const
Returns whether pyhiscal sharing of problem constraints is enabled.
Definition: shared_context.h:463
Clause * linkRemoved(Clause *next)
Definition: shared_context.h:68
void freezeSeen()
Definition: shared_context.cpp:348
Definition: shared_context.h:232
bool seedSolvers() const
Returns whether this object seeds the RNG of new solvers.
Definition: shared_context.h:456
bool addClause(const LitVec &cl)
Adds a clause to the preprocessor.
Definition: shared_context.h:100
DistrPtr distributor
Definition: shared_context.h:647
Configuration * ConfigPtr
Definition: shared_context.h:401
uint32 numUnary() const
Returns the number of unary constraints.
Definition: shared_context.h:518
Definition: solver_strategies.h:338
Literal & operator[](uint32 x)
Definition: shared_context.h:64
Definition: shared_context.h:195
A literal is a variable or its negation.
Definition: literal.h:80
Solver * solver(uint32 id) const
Returns the solver with the given id.
Definition: shared_context.h:485
(Positive) Body-Atom-Dependency Graph.
Definition: dependency_graph.h:58
bool has(FLAG f) const
Definition: shared_context.h:219
uint32 concurrency() const
Returns the number of solvers that can share this object.
Definition: shared_context.h:458
void unmark(Var v)
Definition: shared_context.h:578
LparseOutputter & out
Definition: output.cc:685
bool frozen() const
Returns true if var is excluded from variable elimination.
Definition: shared_context.h:212
uint64 abstraction() const
Definition: shared_context.h:61
virtual bool doPreprocess()=0
Definition: shared_context.h:232
static uint32 initSet(uint32 sz)
Definition: shared_context.h:368
Clause * next() const
Definition: shared_context.h:62
clasp's Solver class.
Definition: solver.h:82
int end
Definition: literals.cc:62
Policy(uint32 a_sz=0, uint32 a_lbd=0, uint32 a_type=0)
Definition: shared_context.h:362