summaryrefslogtreecommitdiff
path: root/src/prop/cryptominisat/Solver/Solver.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/prop/cryptominisat/Solver/Solver.h')
-rw-r--r--src/prop/cryptominisat/Solver/Solver.h859
1 files changed, 0 insertions, 859 deletions
diff --git a/src/prop/cryptominisat/Solver/Solver.h b/src/prop/cryptominisat/Solver/Solver.h
deleted file mode 100644
index 9276823dd..000000000
--- a/src/prop/cryptominisat/Solver/Solver.h
+++ /dev/null
@@ -1,859 +0,0 @@
-/****************************************************************************************[Solver.h]
-MiniSat -- Copyright (c) 2003-2006, Niklas Een, Niklas Sorensson
-CryptoMiniSat -- Copyright (c) 2009 Mate Soos
-glucose -- Gilles Audemard, Laurent Simon (2008)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
-associated documentation files (the "Software"), to deal in the Software without restriction,
-including without limitation the rights to use, copy, modify, merge, publish, distribute,
-sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or
-substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
-NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
-OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-**************************************************************************************************/
-
-#ifndef SOLVER_H
-#define SOLVER_H
-
-#include <cstdio>
-#include <string.h>
-#include <stdio.h>
-#include <stack>
-#include <stdexcept>
-
-//#define ANIMATE3D
-
-#include "PropBy.h"
-#include "Vec.h"
-#include "Heap.h"
-#include "Alg.h"
-#include "MersenneTwister.h"
-#include "SolverTypes.h"
-#include "Clause.h"
-#include "constants.h"
-#include "BoundedQueue.h"
-#include "GaussianConfig.h"
-#include "ClauseAllocator.h"
-#include "SolverConf.h"
-
-namespace CMSat {
-
-class Gaussian;
-class MatrixFinder;
-class Conglomerate;
-class VarReplacer;
-class XorFinder;
-class FindUndef;
-class ClauseCleaner;
-class FailedLitSearcher;
-class Subsumer;
-class XorSubsumer;
-class RestartTypeChooser;
-class StateSaver;
-class UselessBinRemover;
-class SCCFinder;
-class ClauseVivifier;
-class SharedData;
-class DataSync;
-class BothCache;
-
-#ifdef VERBOSE_DEBUG
-#define DEBUG_UNCHECKEDENQUEUE_LEVEL0
-using std::cout;
-using std::endl;
-#endif
-
-struct reduceDB_ltMiniSat
-{
- bool operator () (const Clause* x, const Clause* y);
-};
-
-struct reduceDB_ltGlucose
-{
- bool operator () (const Clause* x, const Clause* y);
-};
-
-struct PolaritySorter
-{
- PolaritySorter(vector<char>& polarity) :
- pol(polarity)
- {}
-
- bool operator()(const Lit lit1, const Lit lit2) const
- {
- return (((((bool)pol[lit1.var()])^(lit1.sign())) == false)
- && ((((bool)pol[lit2.var()])^(lit2.sign())) == true));
- }
- vector<char>& pol;
-};
-
-/**
-@brief The main solver class
-
-This class creates and manages all the others. It is here that settings must
-be set, and it is here that all data enter and leaves the system. The basic
-use is to add normal and XOR clauses, and then solve(). The solver will then
-solve the problem, and return with either a SAT solution with corresponding
-variable settings, or report that the problem in UNSATisfiable.
-
-The prolbem-solving can be interrupted with the "interrupt" varible, and can
-also be pre-set to stop after a certain number of restarts. The data until the
-interruption can be dumped by previously setting parameters like
-dumpSortedLearnts
-*/
-class Solver
-{
-public:
-
- // Constructor/Destructor:
- //
- Solver(const SolverConf& conf = SolverConf(), const GaussConf& _gaussconfig = GaussConf(), SharedData* sharedUnitData = NULL);
- ~Solver();
-
- // Problem specification:
- //
- Var newVar (bool dvar = true) throw (std::out_of_range); // Add a new variable with parameters specifying variable mode.
- template<class T>
- bool addClause (T& ps); // Add a clause to the solver. NOTE! 'ps' may be shrunk by this method!
- template<class T>
- bool addLearntClause(T& ps, const uint32_t glue = 10, const float miniSatActivity = 10.0);
- template<class T>
- bool addXorClause (T& ps, bool xorEqualFalse) throw (std::out_of_range); // Add a xor-clause to the solver. NOTE! 'ps' may be shrunk by this method!
-
- // Solving:
- //
- lbool solve (const vec<Lit>& assumps); ///<Search for a model that respects a given set of assumptions.
- lbool solve (); ///<Search without assumptions.
- void handleSATSolution(); ///<Extends model, if needed, and fills "model"
- void handleUNSATSolution(); ///<If conflict really was zero-length, sets OK to false
- bool okay () const; ///<FALSE means solver is in a conflicting state
-
- // Variable mode:
- //
- void setDecisionVar (Var v, bool b); ///<Declare if a variable should be eligible for selection in the decision heuristic.
- void addBranchingVariable (Var v);
-
- // Read state:
- //
- lbool value (const Var x) const; ///<The current value of a variable.
- lbool value (const Lit p) const; ///<The current value of a literal.
- lbool modelValue (const Lit p) const; ///<The value of a literal in the last model. The last call to solve must have been satisfiable.
- uint32_t nAssigns () const; ///<The current number of assigned literals.
- uint32_t nClauses () const; ///<The current number of original clauses.
- uint32_t nLiterals () const; ///<The current number of total literals.
- uint32_t nLearnts () const; ///<The current number of learnt clauses.
- uint32_t nVars () const; ///<The current number of variables.
-
- // Extra results: (read-only member variable)
- //
- vec<lbool> model; ///<If problem is satisfiable, this vector contains the model (if any).
- vec<Lit> conflict; ///<If problem is unsatisfiable (possibly under assumptions), this vector represent the final conflict clause expressed in the assumptions.
-
- // Mode of operation:
- //
- SolverConf conf;
- GaussConf gaussconfig; ///<Configuration for the gaussian elimination can be set here
- bool needToInterrupt; ///<Used internally mostly. If set to TRUE, we will interrupt cleanly ASAP. The important thing is "cleanly", since we need to wait until a point when all datastructures are in a sane state (i.e. not in the middle of some algorithm)
-
- //Logging
- void needStats(); // Prepares the solver to output statistics
- void needProofGraph(); // Prepares the solver to output proof graphs during solving
- const vec<Clause*>& get_sorted_learnts(); //return the set of learned clauses, sorted according to the logic used in MiniSat to distinguish between 'good' and 'bad' clauses
- const vec<Clause*>& get_learnts() const; //Get all learnt clauses that are >1 long
- vector<Lit> get_unitary_learnts() const; //return the set of unitary learnt clauses
- uint32_t get_unitary_learnts_num() const; //return the number of unitary learnt clauses
- bool dumpSortedLearnts(const std::string& fileName, const uint32_t maxSize); // Dumps all learnt clauses (including unitary ones) into the file; returns true for success, false for failure
- bool needLibraryCNFFile(const std::string& fileName); //creates file in current directory with the filename indicated, and puts all calls from the library into the file.
- bool dumpOrigClauses(const std::string& fileName) const;
- void printBinClause(const Lit litP1, const Lit litP2, FILE* outfile) const;
-
- uint32_t get_sum_gauss_called() const;
- uint32_t get_sum_gauss_confl() const;
- uint32_t get_sum_gauss_prop() const;
- uint32_t get_sum_gauss_unit_truths() const;
-
- //Printing statistics
- void printStats();
- uint32_t getNumElimSubsume() const; ///<Get number of variables eliminated
- uint32_t getNumElimXorSubsume() const; ///<Get number of variables eliminated with xor-magic
- uint32_t getNumXorTrees() const; ///<Get the number of trees built from 2-long XOR-s. This is effectively the number of variables that replace other variables
- uint32_t getNumXorTreesCrownSize() const; ///<Get the number of variables being replaced by other variables
- /**
- @brief Get total time spent in Subsumer.
-
- This includes: subsumption, self-subsuming resolution, variable elimination,
- blocked clause elimination, subsumption and self-subsuming resolution
- using non-existent binary clauses.
- */
- double getTotalTimeSubsumer() const;
- double getTotalTimeFailedLitSearcher() const;
- double getTotalTimeSCC() const;
-
- /**
- @brief Get total time spent in XorSubsumer.
-
- This included subsumption, variable elimination through XOR, and local
- substitution (see Heule's Thesis)
- */
- double getTotalTimeXorSubsumer() const;
-
-protected:
- //gauss
- bool clearGaussMatrixes();
- vector<Gaussian*> gauss_matrixes;
- void print_gauss_sum_stats();
- uint32_t sum_gauss_called;
- uint32_t sum_gauss_confl;
- uint32_t sum_gauss_prop;
- uint32_t sum_gauss_unit_truths;
-
- // Statistics
- //
- template<class T, class T2>
- void printStatsLine(std::string left, T value, T2 value2, std::string extra);
- template<class T>
- void printStatsLine(std::string left, T value, std::string extra = "");
- uint64_t starts; ///<Num restarts
- uint64_t dynStarts; ///<Num dynamic restarts
- uint64_t staticStarts; ///<Num static restarts: note that after full restart, we do a couple of static restarts always
- /**
- @brief Num full restarts
-
- Full restarts are restarts that are made always, no matter what, after
- a certan number of conflicts have passed. The problem will tried to be
- decomposed into multiple parts, and then there will be a couple of static
- restarts made. Finally, the problem will be determined to be MiniSat-type
- or Glucose-type.
-
- NOTE: I belive there is a point in having full restarts even if the
- glue-clause vs. MiniSat clause can be fully resolved
- */
- uint64_t fullStarts; ///<Number of full restarts made
- uint64_t decisions; ///<Number of decisions made
- uint64_t rnd_decisions; ///<Numer of random decisions made
- /**
- @brief An approximation of accumulated propagation difficulty
-
- It does not hold the number of propagations made. Rather, it holds a
- value that is approximate of the difficulty of the propagations made
- This makes sense, since it is not at all the same difficulty to proapgate
- a 2-long clause than to propagate a 20-long clause. In certain algorihtms,
- there is a need to know how difficult the propagation part was. This value
- can be used in these algorihms. However, the reported "statistic" will be
- bogus.
- */
- uint64_t propagations;
- uint64_t conflicts; ///<Num conflicts
- uint64_t clauses_literals, learnts_literals, max_literals, tot_literals;
- uint64_t nbGlue2; ///<Num learnt clauses that had a glue of 2 when created
- uint64_t numNewBin; ///<new binary clauses that have been found through some form of resolution (shrinking, conflicts, etc.)
- uint64_t lastNbBin; ///<Last time we seached for SCCs, numBins was this much
- uint64_t lastSearchForBinaryXor; ///<Last time we looked for binary xors, this many bogoprops(=propagations) has been done
- uint64_t nbReduceDB; ///<Number of times learnt clause have been cleaned
- uint64_t improvedClauseNo; ///<Num clauses improved using on-the-fly subsumption
- uint64_t improvedClauseSize; ///<Num literals removed using on-the-fly subsumption
- uint64_t numShrinkedClause; ///<Num clauses improved using on-the-fly self-subsuming resolution
- uint64_t numShrinkedClauseLits; ///<Num literals removed by on-the-fly self-subsuming resolution
- uint64_t moreRecurMinLDo; ///<Decided to carry out transitive on-the-fly self-subsuming resolution on this many clauses
- uint64_t updateTransCache; ///<Number of times the transitive OTF-reduction cache has been updated
- uint64_t nbClOverMaxGlue; ///<Number or clauses over maximum glue defined in maxGlue
-
- //Multi-threading
- DataSync* dataSync;
-
- // Helper structures:
- //
- struct VarOrderLt {
- const vec<uint32_t>& activity;
- bool operator () (Var x, Var y) const {
- return activity[x] > activity[y];
- }
- VarOrderLt(const vec<uint32_t>& act) : activity(act) { }
- };
-
- struct VarFilter {
- const Solver& s;
- VarFilter(const Solver& _s) : s(_s) {}
- bool operator()(Var v) const {
- return s.assigns[v].isUndef() && s.decision_var[v];
- }
- };
-
- // Solver state:
- //
- bool ok; ///< If FALSE, the constraints are already unsatisfiable. No part of the solver state may be used!
- ClauseAllocator clauseAllocator; ///< Handles memory allocation for claues
- vec<Clause*> clauses; ///< List of problem clauses that are normally larger than 2. Sometimes, due to on-the-fly self-subsuming resoulution, clauses here become 2-long. They are never purposfully put here such that they are long
- vec<XorClause*> xorclauses; ///< List of problem xor-clauses. Will be freed
- vec<Clause*> learnts; ///< List of learnt clauses.
- uint32_t numBins;
- vec<XorClause*> freeLater; ///< xor clauses that need to be freed later (this is needed due to Gauss) \todo Get rid of this
- float cla_inc; ///< Amount to bump learnt clause oldActivity with
- vec<vec<Watched> > watches; ///< 'watches[lit]' is a list of constraints watching 'lit' (will go there if literal becomes true).
- vec<lbool> assigns; ///< The current assignments
- vector<char> decision_var; ///< Declares if a variable is eligible for selection in the decision heuristic.
- vec<Lit> trail; ///< Assignment stack; stores all assigments made in the order they were made.
- vec<uint32_t> trail_lim; ///< Separator indices for different decision levels in 'trail'.
- vec<PropBy> reason; ///< 'reason[var]' is the clause that implied the variables current value, or 'NULL' if none.
- vec<int32_t> level; ///< 'level[var]' contains the level at which the assignment was made.
- vec<BinPropData> binPropData;
- uint32_t qhead; ///< Head of queue (as index into the trail)
- Lit failBinLit; ///< Used to store which watches[~lit] we were looking through when conflict occured
- vec<Lit> assumptions; ///< Current set of assumptions provided to solve by the user.
- bqueue<uint32_t> avgBranchDepth; ///< Avg branch depth. We collect this, and use it to do random look-around in the searchspace during simplifyProblem()
- MTRand mtrand; ///< random number generator
- vector<Var> branching_variables;
-
- /////////////////
- // Variable activities
- /////////////////
- Heap<VarOrderLt> order_heap; ///< A priority queue of variables ordered with respect to the variable activity. All variables here MUST be decision variables. If you changed the decision variables, you MUST filter this
- vec<uint32_t> activity; ///< A heuristic measurement of the activity of a variable.
- uint32_t var_inc; ///< Amount to bump next variable with.
-
- /////////////////
- // Learnt clause cleaning
- /////////////////
- uint64_t numCleanedLearnts; ///< Number of times learnt clauses have been removed through simplify() up until now
- uint32_t nbClBeforeRed; ///< Number of learnt clauses before learnt-clause cleaning
- uint32_t nbCompensateSubsumer; ///< Number of learnt clauses that subsumed normal clauses last time subs. was executed (used to delay learnt clause-cleaning)
-
- /////////////////////////
- // For glue calculation & dynamic restarts
- /////////////////////////
- //uint64_t MYFLAG; ///<For glue calculation
- template<class T>
- uint32_t calcNBLevels(const T& ps);
- //vec<uint64_t> permDiff; ///<permDiff[var] is used to count the number of different decision level variables in learnt clause (filled with data from MYFLAG )
- vec<Var> lastDecisionLevel;
- bqueue<uint32_t> glueHistory; ///< Set of last decision levels in (glue of) conflict clauses. Used for dynamic restarting
- #ifdef ENABLE_UNWIND_GLUE
- vec<Clause*> unWindGlue;
- #endif //ENABLE_UNWIND_GLUE
-
- // Temporaries (to reduce allocation overhead). Each variable is prefixed by the method in which it is
- // used, exept 'seen' wich is used in several places.
- //
- vector<char> seen; ///<Used in multiple places. Contains 2 * numVars() elements, all zeroed out
- vector<Lit> seen_vec;
- vec<Lit> analyze_stack;
- vec<Lit> analyze_toclear;
-
- ////////////
- // Transitive on-the-fly self-subsuming resolution
- ///////////
- class TransCache {
- public:
- TransCache() :
- conflictLastUpdated(std::numeric_limits<uint64_t>::max())
- {};
-
- vector<Lit> lits;
- uint64_t conflictLastUpdated;
- };
- class LitReachData {
- public:
- LitReachData() :
- lit(lit_Undef)
- , numInCache(0)
- {}
- Lit lit;
- uint32_t numInCache;
- };
- vector<char> seen2; ///<To reduce temoprary data creation overhead. Used in minimiseLeartFurther(). contains 2 * numVars() elements, all zeroed out
- vec<Lit> allAddedToSeen2; ///<To reduce temoprary data creation overhead. Used in minimiseLeartFurther()
- std::stack<Lit> toRecursiveProp; ///<To reduce temoprary data creation overhead. Used in minimiseLeartFurther()
- vector<TransCache> transOTFCache;
- bqueue<uint32_t> conflSizeHist;
- void minimiseLeartFurther(vec<Lit>& cl, const uint32_t glue);
- void transMinimAndUpdateCache(const Lit lit, uint32_t& moreRecurProp);
- void saveOTFData();
- vector<LitReachData>litReachable;
- void calcReachability();
- void cleanCache();
- void cleanCachePart(const Lit vertLit);
-
- ////////////
- //Logging
- ///////////
- FILE *libraryCNFFile; //The file that all calls from the library are logged
-
- /////////////////
- // Propagating
- ////////////////
- Lit pickBranchLit (); // Return the next decision variable.
- void newDecisionLevel (); // Begins a new decision level.
- void uncheckedEnqueue (const Lit p, const PropBy& from = PropBy()); // Enqueue a literal. Assumes value of literal is undefined.
- void uncheckedEnqueueLight (const Lit p);
- void uncheckedEnqueueLight2(const Lit p, const uint32_t binPropDatael, const Lit lev1Ancestor, const bool learntLeadHere);
- PropBy propagateBin(vec<Lit>& uselessBin);
- PropBy propagateNonLearntBin();
- bool multiLevelProp;
- bool propagateBinExcept(const Lit exceptLit);
- bool propagateBinOneLevel();
- template<bool full>
- PropBy propagate(const bool update = true); // Perform unit propagation. Returns possibly conflicting clause.
- template<bool full>
- bool propTriClause (vec<Watched>::iterator &i, const Lit p, PropBy& confl);
- template<bool full>
- bool propBinaryClause(vec<Watched>::iterator &i, const Lit p, PropBy& confl);
- template<bool full>
- bool propNormalClause(vec<Watched>::iterator &i, vec<Watched>::iterator &j, const Lit p, PropBy& confl, const bool update);
- template<bool full>
- bool propXorClause (vec<Watched>::iterator &i, vec<Watched>::iterator &j, const Lit p, PropBy& confl);
- void sortWatched();
-
- ///////////////
- // Conflicting
- ///////////////
- void cancelUntil (int level); // Backtrack until a certain level.
- void cancelUntilLight();
- Clause* analyze (PropBy confl, vec<Lit>& out_learnt, int& out_btlevel, uint32_t &nblevels, const bool update);
- void analyzeFinal (Lit p, vec<Lit>& out_conflict); // COULD THIS BE IMPLEMENTED BY THE ORDINARIY "analyze" BY SOME REASONABLE GENERALIZATION?
- bool litRedundant (Lit p, uint32_t abstract_levels); // (helper method for 'analyze()')
- void insertVarOrder (Var x); // Insert a variable in the decision order priority queue.
-
- /////////////////
- // Searching
- /////////////////
- lbool search (const uint64_t nof_conflicts, const uint64_t nof_conflicts_fullrestart, const bool update = true); // Search for a given number of conflicts.
- llbool handle_conflict (vec<Lit>& learnt_clause, PropBy confl, uint64_t& conflictC, const bool update);// Handles the conflict clause
- llbool new_decision (const uint64_t nof_conflicts, const uint64_t nof_conflicts_fullrestart, const uint64_t conflictC); // Handles the case when all propagations have been made, and now a decision must be made
-
- /////////////////
- // Maintaining Variable/Clause activity:
- /////////////////
- void claBumpActivity (Clause& c);
- void varDecayActivity (); // Decay all variables with the specified factor. Implemented by increasing the 'bump' value instead.
- void varBumpActivity (Var v); // Increase a variable with the current 'bump' value.
- void claDecayActivity (); // Decay all clauses with the specified factor. Implemented by increasing the 'bump' value instead.
-
- /////////////////
- // Operations on clauses:
- /////////////////
- template<class T> bool addClauseHelper(T& ps) throw (std::out_of_range);
- template <class T>
- Clause* addClauseInt(T& ps, const bool learnt = false, const uint32_t glue = 10, const float miniSatActivity = 10.0, const bool inOriginalInput = false);
- template<class T>
- XorClause* addXorClauseInt(T& ps, bool xorEqualFalse, const bool learnt = false) throw (std::out_of_range);
- void attachBinClause(const Lit lit1, const Lit lit2, const bool learnt);
- void attachClause (XorClause& c);
- void attachClause (Clause& c); // Attach a clause to watcher lists.
- void detachClause (const XorClause& c);
- void detachClause (const Clause& c); // Detach a clause to watcher lists.
- void detachModifiedClause(const Lit lit1, const Lit lit2, const Lit lit3, const uint32_t origSize, const Clause* address);
- void detachModifiedClause(const Var var1, const Var var2, const uint32_t origSize, const XorClause* address);
- template<class T>
- void removeClause(T& c); // Detach and free a clause.
- bool locked (const Clause& c) const; // Returns TRUE if a clause is a reason for some implication in the current state.
-
- ///////////////////////////
- // Debug clause attachment
- ///////////////////////////
- void testAllClauseAttach() const;
- void findAllAttach() const;
- bool findClause(XorClause* c) const;
- bool findClause(Clause* c) const;
- bool xorClauseIsAttached(const XorClause& c) const;
- bool normClauseIsAttached(const Clause& c) const;
-
- // Misc:
- //
- uint32_t decisionLevel () const; // Gives the current decisionlevel.
- uint32_t abstractLevel (const Var x) const; // Used to represent an abstraction of sets of decision levels.
-
- /////////////////////////
- //Classes that must be friends, since they accomplish things on our datastructures
- /////////////////////////
- friend class VarFilter;
- friend class Gaussian;
- friend class FindUndef;
- friend class XorFinder;
- friend class Conglomerate;
- friend class MatrixFinder;
- friend class VarReplacer;
- friend class ClauseCleaner;
- friend class RestartTypeChooser;
- friend class FailedLitSearcher;
- friend class Subsumer;
- friend class XorSubsumer;
- friend class StateSaver;
- friend class UselessBinRemover;
- friend class OnlyNonLearntBins;
- friend class ClauseAllocator;
- friend class CompleteDetachReatacher;
- friend class SCCFinder;
- friend class ClauseVivifier;
- friend class DataSync;
- friend class BothCache;
- Conglomerate* conglomerate;
- VarReplacer* varReplacer;
- ClauseCleaner* clauseCleaner;
- FailedLitSearcher* failedLitSearcher;
- Subsumer* subsumer;
- XorSubsumer* xorSubsumer;
- RestartTypeChooser* restartTypeChooser;
- MatrixFinder* matrixFinder;
- SCCFinder* sCCFinder;
- ClauseVivifier* clauseVivifier;
-
- /////////////////////////
- // Restart type handling
- /////////////////////////
- bool chooseRestartType(const uint32_t& lastFullRestart);
- void setDefaultRestartType();
- bool checkFullRestart(uint64_t& nof_conflicts, uint64_t& nof_conflicts_fullrestart, uint32_t& lastFullRestart);
- RestartType restartType; ///<Used internally to determine which restart strategy is currently in use
- RestartType lastSelectedRestartType; ///<The last selected restart type. Used when we are just after a full restart, and need to know how to really act
-
- //////////////////////////
- // Problem simplification
- //////////////////////////
- void performStepsBeforeSolve();
- lbool simplifyProblem(const uint32_t numConfls);
- void reduceDB(); // Reduce the set of learnt clauses.
- bool simplify(); // Removes satisfied clauses and finds binary xors
- bool simplifying; ///<We are currently doing burst search
- double totalSimplifyTime;
- uint32_t simpDB_assigns; ///< Number of top-level assignments since last execution of 'simplify()'.
- int64_t simpDB_props; ///< Remaining number of propagations that must be made before next execution of 'simplify()'.
-
- /////////////////////////////
- // SAT solution verification
- /////////////////////////////
- void checkSolution ();
- bool verifyModel () const;
- bool verifyBinClauses() const;
- bool verifyClauses (const vec<Clause*>& cs) const;
- bool verifyXorClauses () const;
-
- // Debug & etc:
- void printAllClauses();
- void printLit (const Lit l) const;
- void checkLiteralCount();
- void printStatHeader () const;
- void printRestartStat (const char* type = "N");
- void printEndSearchStat();
- void addSymmBreakClauses();
- void initialiseSolver();
-
- //Misc related binary clauses
- void dumpBinClauses(const bool alsoLearnt, const bool alsoNonLearnt, FILE* outfile) const;
- uint32_t countNumBinClauses(const bool alsoLearnt, const bool alsoNonLearnt) const;
- uint32_t getBinWatchSize(const bool alsoLearnt, const Lit lit);
- void printStrangeBinLit(const Lit lit) const;
-
- /////////////////////
- // Polarity chooser
- /////////////////////
- void calculateDefaultPolarities(); //Calculates the default polarity for each var, and fills defaultPolarities[] with it
- bool defaultPolarity(); //if polarity_mode is not polarity_auto, this returns the default polarity of the variable
- void tallyVotesBin(vec<double>& votes) const;
- void tallyVotes(const vec<Clause*>& cs, vec<double>& votes) const;
- void tallyVotes(const vec<XorClause*>& cs, vec<double>& votes) const;
- void setPolarity(Var v, bool b); // Declare which polarity the decision heuristic should use for a variable. Requires mode 'polarity_user'.
- vector<char> polarity; // The preferred polarity of each variable.
-};
-
-
-
-//**********************************
-// Implementation of inline methods
-//**********************************
-
-inline void Solver::insertVarOrder(Var x)
-{
- if (!order_heap.inHeap(x) && decision_var[x]) order_heap.insert(x);
-}
-
-inline void Solver::varDecayActivity()
-{
- var_inc *= 11;
- var_inc /= 10;
-}
-inline void Solver::varBumpActivity(Var v)
-{
- if ( (activity[v] += var_inc) > (0x1U) << 24 ) {
- //printf("RESCALE!!!!!!\n");
- //std::cout << "var_inc: " << var_inc << std::endl;
- // Rescale:
- for (Var var = 0; var != nVars(); var++) {
- activity[var] >>= 14;
- }
- var_inc >>= 14;
- //var_inc = 1;
- //std::cout << "var_inc: " << var_inc << std::endl;
-
- /*Heap<VarOrderLt> copy_order_heap2(order_heap);
- while(!copy_order_heap2.empty()) {
- Var v = copy_order_heap2.getmin();
- if (decision_var[v])
- std::cout << "var_" << v+1 << " act: " << activity[v] << std::endl;
- }*/
- }
-
- // Update order_heap with respect to new activity:
- if (order_heap.inHeap(v))
- order_heap.decrease(v);
-}
-
-inline void Solver::claBumpActivity (Clause& c)
-{
- if ( (c.getMiniSatAct() += cla_inc) > 1e20 ) {
- // Rescale:
- for (uint32_t i = 0; i < learnts.size(); i++)
- learnts[i]->getMiniSatAct() *= 1e-17;
- cla_inc *= 1e-20;
- }
-}
-
-inline void Solver::claDecayActivity()
-{
- //cla_inc *= clause_decay;
-}
-
-inline bool Solver::locked(const Clause& c) const
-{
- if (c.size() <= 3) return true; //we don't know in this case :I
- PropBy from(reason[c[0].var()]);
- return from.isClause() && !from.isNULL() && from.getClause() == clauseAllocator.getOffset(&c) && value(c[0]) == l_True;
-}
-
-inline void Solver::newDecisionLevel()
-{
- trail_lim.push(trail.size());
- #ifdef VERBOSE_DEBUG
- cout << "New decision level: " << trail_lim.size() << endl;
- #endif
-}
-/*inline int Solver::nbPropagated(int level) {
- if (level == decisionLevel())
- return trail.size() - trail_lim[level-1] - 1;
- return trail_lim[level] - trail_lim[level-1] - 1;
-}*/
-inline uint32_t Solver::decisionLevel () const
-{
- return trail_lim.size();
-}
-inline uint32_t Solver::abstractLevel (const Var x) const
-{
- return 1 << (level[x] & 31);
-}
-inline lbool Solver::value (const Var x) const
-{
- return assigns[x];
-}
-inline lbool Solver::value (const Lit p) const
-{
- return assigns[p.var()] ^ p.sign();
-}
-inline lbool Solver::modelValue (const Lit p) const
-{
- return model[p.var()] ^ p.sign();
-}
-inline uint32_t Solver::nAssigns () const
-{
- return trail.size();
-}
-inline uint32_t Solver::nClauses () const
-{
- return clauses.size() + xorclauses.size();
-}
-inline uint32_t Solver::nLiterals () const
-{
- return clauses_literals + learnts_literals;
-}
-inline uint32_t Solver::nLearnts () const
-{
- return learnts.size();
-}
-inline uint32_t Solver::nVars () const
-{
- return assigns.size();
-}
-inline void Solver::setPolarity (Var v, bool b)
-{
- polarity [v] = (char)b;
-}
-inline void Solver::setDecisionVar(Var v, bool b)
-{
- decision_var[v] = b;
- if (b) {
- insertVarOrder(v);
- }
-}
-inline void Solver::addBranchingVariable(Var v)
-{
- branching_variables.push_back(v);
-}
-inline lbool Solver::solve ()
-{
- vec<Lit> tmp;
- return solve(tmp);
-}
-inline bool Solver::okay () const
-{
- return ok;
-}
-
-inline uint32_t Solver::get_sum_gauss_unit_truths() const
-{
- return sum_gauss_unit_truths;
-}
-
-inline uint32_t Solver::get_sum_gauss_called() const
-{
- return sum_gauss_called;
-}
-
-inline uint32_t Solver::get_sum_gauss_confl() const
-{
- return sum_gauss_confl;
-}
-
-inline uint32_t Solver::get_sum_gauss_prop() const
-{
- return sum_gauss_prop;
-}
-
-inline uint32_t Solver::get_unitary_learnts_num() const
-{
- if (decisionLevel() > 0)
- return trail_lim[0];
- else
- return trail.size();
-}
-
-template<class T>
-inline void Solver::removeClause(T& c)
-{
- detachClause(c);
- clauseAllocator.clauseFree(&c);
-}
-
-//**********************************
-// Debug + etc:
-//**********************************
-
-static inline void logLit(FILE* f, Lit l)
-{
- fprintf(f, "%sx%d", l.sign() ? "~" : "", l.var()+1);
-}
-
-static inline void logLits(FILE* f, const vec<Lit>& ls)
-{
- fprintf(f, "[ ");
- if (ls.size() > 0) {
- logLit(f, ls[0]);
- for (uint32_t i = 1; i < ls.size(); i++) {
- fprintf(f, ", ");
- logLit(f, ls[i]);
- }
- }
- fprintf(f, "] ");
-}
-
-#ifndef DEBUG_ATTACH_FULL
-inline void Solver::testAllClauseAttach() const
-{
- return;
-}
-inline void Solver::findAllAttach() const
-{
- return;
-}
-#endif //DEBUG_ATTACH_FULL
-
-inline void Solver::uncheckedEnqueueLight(const Lit p)
-{
- assert(value(p.var()) == l_Undef);
- #if WATCHED_CACHE_NUM > 0
- __builtin_prefetch(watches.getData() + p.toInt());
- #else
- if (watches[p.toInt()].size() > 0) __builtin_prefetch(watches[p.toInt()].getData());
- #endif
-
- assigns [p.var()] = boolToLBool(!p.sign());//lbool(!sign(p)); // <<== abstract but not uttermost effecient
- trail.push(p);
- if (decisionLevel() == 0) {
- level[p.var()] = 0;
- #ifdef ANIMATE3D
- fprintf(stderr, "s %u %d\n", p.var(), p.sign());
- #endif
- }
-}
-
-inline void Solver::uncheckedEnqueueLight2(const Lit p, const uint32_t binSubLevel, const Lit lev1Ancestor, const bool learntLeadHere)
-{
- assert(value(p.var()) == l_Undef);
- #if WATCHED_CACHE_NUM > 0
- __builtin_prefetch(watches.getData() + p.toInt());
- #else
- if (watches[p.toInt()].size() > 0) __builtin_prefetch(watches[p.toInt()].getData());
- #endif
-
- assigns [p.var()] = boolToLBool(!p.sign());//lbool(!sign(p)); // <<== abstract but not uttermost effecient
- trail.push(p);
- binPropData[p.var()].lev = binSubLevel;
- binPropData[p.var()].lev1Ancestor = lev1Ancestor;
- binPropData[p.var()].learntLeadHere = learntLeadHere;
-}
-
-/**
-@brief Enqueues&sets a new fact that has been found
-
-Call this when a fact has been found. Sets the value, enqueues it for
-propagation, sets its level, sets why it was propagated, saves the polarity,
-and does some logging if logging is enabled.
-
-@p p the fact to enqueue
-@p from Why was it propagated (binary clause, tertiary clause, normal clause)
-*/
-inline void Solver::uncheckedEnqueue(const Lit p, const PropBy& from)
-{
- #ifdef DEBUG_UNCHECKEDENQUEUE_LEVEL0
- #ifndef VERBOSE_DEBUG
- if (decisionLevel() == 0)
- #endif //VERBOSE_DEBUG
-
- std::cout << "uncheckedEnqueue var " << p.var()+1
- << " to val " << !p.sign()
- << " level: " << decisionLevel()
- << " sublevel: " << trail.size()
- << " by: " << from << std::endl;
-
- if (from.isClause() && !from.isNULL()) {
- std::cout << "by clause: " << *clauseAllocator.getPointer(from.getClause()) << std::endl;
- }
- #endif //DEBUG_UNCHECKEDENQUEUE_LEVEL0
-
- //assert(decisionLevel() == 0 || !subsumer->getVarElimed()[p.var()]);
-
- const Var v = p.var();
- assert(value(v).isUndef());
- #if WATCHED_CACHE_NUM > 0
- __builtin_prefetch(watches.getData() + p.toInt());
- #else
- if (watches[p.toInt()].size() > 0) __builtin_prefetch(watches[p.toInt()].getData());
- #endif
-
- assigns [v] = boolToLBool(!p.sign());
- #ifdef ANIMATE3D
- fprintf(stderr, "s %u %d\n", v, p.sign());
- #endif
- level [v] = decisionLevel();
- reason [v] = from;
- polarity[v] = p.sign();
- trail.push(p);
-}
-
-}
-
-#endif //SOLVER_H
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback