LogicNG uses Semantic Versioning.
- New class
OptimizationConfig
used to configure optimization computations in various algorithms. It allows to configure the following aspects:- the
optimizationType
(either SAT-based optimization or a MaxSAT algorithm) - the
maxSATConfig
to further configure the MaxSAT algorithm - the
optimizationHandler
to use - the
maxSATHandler
to use
- the
- Added three new configuration options to
AdvancedSimplifierConfig
:minimalDnfCover
determines whether the step for computing the minimal DNF cover should be performed. Default istrue
.returnIntermediateResult
allows to return an intermediate result from theAdvancedSimplifier
if the computation was aborted by a handler. Default isfalse
.optimizationConfig
can be used to configure the algorithms in the simplifier which perform optimizations, also theOptimizationHandler handler
moved into this config
- Changed visibility from some methods from package-private to public for formula and solver serializiation via the new https://github.com/logic-ng/serialization library
- All parser classes from
org.logicng.io.parsers
(including in particular the two main parsersPropositionalParser
andPseudoBooleanParser
) as well as the classorg.logicng.io.readers.FormulaReader
were moved to the new artifactsorg.logicng.logicng-parser-j8
(ororg.logicng.logicng-parser-j11
for Java 11). So LogicNG now consists of two artifacts:- All the core functionality of LogicNG except for the parser is located in the "old"
org.logicng:logicng
artifact. This artifact does not depend on ANTLR anymore (which was the reason for splitting the library). This library will stay on Java 8, but nothing should prevent its usage in higher Java versions. - The parser functionality is located in
org.logicng:logicng-parser-j8
(for Java 8 and ANTLR 4.9.3) andorg.logicng:logicng-parser-j11
(for Java 11 and the most recent ANTLR version). The version of this library will stay in sync with the core library.
- All the core functionality of LogicNG except for the parser is located in the "old"
- The method
FormulaFactory.parse()
was removed. If you're using this method you should include one of the new parser artefacts and then just create your ownPropositionalParser
orPseudoBooleanParser
and callparse()
on them.
- Added unsafe methods
term
anddnf
to theFormulaFactory
to create a term (conjunction of literals) or a DNF (c.f. with methodFormulaFactory#clause
andFormulaFactory#cnf
). Both methods do not perform reduction operations and therefore are faster. Only use these methods if you are sure the input is free of complementary and redundant operands. - Class
UBTree
offers new methodgenerateSubsumedUBTree
to directly generate a subsumed UBTree for the given sets. - The
DnnfFactory
now offers a method to compile a DNNF with aDnnfCompilationHandler
- The
ModelCounter
now offers a method to pass aDnnfCompilationHandler
in order to control long-running computations
- UBTree data structure now supports empty sets.
- Added side effect note in
SATSolver
for the four assumption solving methods. - Methods for reordering and swapping variables on BDD were refactored:
BDD.getReordering
,BDDKernel.getReordering
, andBDD.swapVariables
are now deprecated and should not be used anymore. Instead, there are new methods on theBDDKernel
. Note that these actions affect all BDDs generated by the kernel.BDDKernel.swapVariables
for swapping two variables (or variable indices)BDDKernel.reorder
for automatically reordering the BDDBDDKernel.activateReorderDuringBuild
for activating reordering during buildBDDKernel.addVariableBlock
for defining a variable block for reorderingBDDKernel.addAllVariablesAsBlock
for defining one block for each variable (s.t. all variables are allowed to be reordered independently)
- Significant performance improvements in the DTree generation for DNNFs
- Minor performance improvements in some DNF/CNF generating algorithms by using faster
cnf
/dnf
.
- The formula generation on BDDs was broken when the ordering was changed by
BDDKernel.reorder
orBDDKernel.swapVariables
. This is now fixed.
- Allowing symbol
#
in variable names for thePropositionalParser
and thePseudoBooleanParser
. - Set the Java Jigsaw automatic module name to
logicng
in the manifest.
- Completely rewritten graphical outputs of formulas, BDDs, and graphs in the package
org.logicng.io.graphical
. It is now possible to configure the generated graphs by dynamically styling nodes, edges, and computing node labels. Also, there are now two possible output formats: GraphViz DOT and Mermaid.js. - Convenience methods
isSatisfiable
,isTautology
,isContradiction
,implies
,isImpliedBy
andisEquivalentTo
in theFormula
class. - New OLL algorithm for OpenWBO for more efficient weighted MaxSAT solving.
- Two overloaded factory methods
mk
inMiniSat
to construct a solver by formula factory, solver style and optional configuration. - Methods to directly apply Boolean functions on BDDs
- Added
toFormula
method on BDDs to generate a formula via Shannon expansion - Convenience methods
variables(Collection<String> names)
andvariables(String... names)
for creating a list of variables in theFormulaFactory
class.
- Methods
generateFromCnf(Formula formula)
andgenerateFromCnf(Collection<Formula> formulas)
inConstraintGraphGenerator
are now deprecated, since the constraint graph generation is not CNF specific. Both methods will be removed with LogicNG 3.0. Instead, use the general methodgenerateFromFormulas(Collection<Formula> formulas)
.
- The cached PB and CC encodings are no longer held in the constraint itselt but analogously to the other caches in the formula factory.
- A small bug which could occur when using the extended formula factory in combination with cached CC and PB encodings.
- Removed
negativeVariables
from the internal representation ofAssignment
it is now computed each time the method is called. This leeds to a minimal performance disadvantage but to a proportional better memory footprint. The public API is not changed. - Updated ANTLR to 4.9.3 (there were no relevant updates to the Java target, therefore no changes are expected for LogicNG)
- A small bug when comparing two backbones with the same set of negative/positive/optional variables but different satisfiability.
- Overloaded method
createAssignment
inMiniSat
by flag whether the created assignment should be a fast evaluable assignment. - Extended
ModelEnumerationFunction.Builder
by flagfastEvaulable
which indicates whether the created assignments should be a fast evaluable assignment. - Convenience methods
isNNF()
,isDNF()
andisCNF()
in classFormula
- Two new constructors for
Substitution
s and a new methodgetMapping()
to get the internal mapping - Method
getSubstitution
onAnonymizer
to get the mapping from original variable to anonymized one - A DNF from BDD function
BDDDNFFunction
, a subclass of the newly added classBDDNormalFormFunction
- A DNF from BDD formula transformation
BDDDNFTransformation
, a subclass of the newly added classBDDNormalFormTransforamtion
- A canonical CNF enumeration
CanonicalCNFEnumeration
, a subclass of the newly added classCanonicalEnumeration
.
- Improved methods
intersection
andunion
inCollectionHelper
by using bounded wildcards. - Improved performance of
hashCode
andequals
inAssignment
by avoiding redundant hash set creation. - Method
BDD#dnf()
uses the newly introducedBDDDNFFunction
to obtain a smaller DNF instead of a canonical DNF - Class
BDDCNFFunction
uses the singleton pattern - All functions/transformations/predicates with only a default constructor introduce a static
get()
method with the singleton pattern. The public constructors are now deprecated and will be removed with LogicNG 3.0 - Always use the default configuration of algorithms from the formula factory and do not construct them in the respective classes separately.
- Minor edge case issue in
NegationSimplifier
which yielded a larger result formula than input formula. - The
TermPredicate
logic was inverted. In detail, the minterm predicateTermPredicate#getMintermPredicate()
tested for a maxterm and theTermPredicate#getMaxtermPredicate()
tested for a minterm. To prevent silent errors for callers of these predicates, the factory method names were changed tominterm()
andmaxterm()
, respectively. Thus, an intentional breaking change on compile time level has been introduced to force callers to adjust their logic. - Minor edge case issue in
MiniSat
when performing assumption solving with proof tracing. - Fixed two bugs in the backbone computation on the MiniCard solver.
- Basic support for OSGi via
maven-bundle-plugin
- Improved
FormulaFactory
by avoiding creating unnecessary negations (cache pollution) during the check for complementary operands. - Improved the NNF computation by avoiding creating unnecessary negations (cache pollution) during the recursive calls.
- Extracted the NNF computation in its own transformation class
NNFTransformation
. - Moved all formula caches from the
Formula
class to theFormulaFactory
to save memory by avoiding creating empty cache maps. - New
TermPredicate
class to check whether a formula is a minterm (clause) or maxterm (DNF term). - Extended helper classes
CollectionHelper
andFormulaHelper
by additional convenient methods.
- Fixed a bug in the
addSoftFormula
method of theMaxSATSolver
class. A soft formula is now weighted properly if the soft formula is not a clause. - Fixed a bug in the
addWithRelaxation
method of theSATSolver
class. The CNF of the formula is now computed properly regarding the configuration of the solver.
- Deprecation of method
addWithoutUnknown
in classSATSolver
- this method will be removed in future versions. - Deprecation of method
addWithRelaxation
for propositions in classSATSolver
- this method will be removed in future versions.
- Reworked handlers
- New handlers for backbones, MUS, SMUS, prime compilation, and advanced simplifier
- three different types for timeout handlers:
SINGLE_TIMEOUT
: The timeout is started when the handler'sstarted()
method is calledRESTARTING_TIMEOUT
: The timeout is restarted everytime the handler'sstarted()
method is calledFIXED_END
: The timeout is interpreted as a fixed point in time (in milliseconds) at which the computation should be aborted
- Improved version detection for compiled and packaged versions of LogicNG
- Introduced Mockito for unit tests
- Fixed a bug in the DIMACS formula writer when there was only a single clause with multiple literals
- Fixed another bug for a special case in the DRUP proof generation
- Fixed a bug for a special case in the DRUP proof generation
- DNNF data structure and compilation
- DNNF-based model counting
- BDD Reordering
- Computation of shortest MUSes
- Computation of prime implicant and implicates
- New algorithms for simplifying Boolean formulas including the possibility to define an own rating function for the formula complexity
- A new method for generation constraint graphs of formulas
- A SAT encoding of the SET COVER problem
- New explicit data structure for cardinality constraints
- New formula functions for
- Computing the depth of a formula
- Computing a minimum prime implicant of a formula
- New formula predicates for
- Pseudo Boolean Constraint containment
- Fast evaluation to a constant
- New formula transformations for
- Literal substitution
- Expansion of pseudo-Boolean constraints
- New solver function for optimizing the current formula on the solver (wrt. the number of positive/negative literals)
- New formula randomizer and corner case generator, especially useful for testing
- Configuration object for formula factory which can be used to allow trivial contradictions and tautologies in formulas and to specify a default merge strategy for formulas from different factories
- New helper classes for collections
- Stream operators on formulas
- Changed Java Version to JDK 8
- switched to ANTLR 4.8
- switched to JUnit 5
- PBC and CC methods in the formula factory return
Formula
objects now (notPBConstraint
objects) and can simplify the constraints - Moved BDD package to
knowledgecompilation
- Reorganized
explanations
package - Reorganized code location in the BDD package and simplified the
BDDFactory
- Reorganized code location in the SAT Solver package, introduced solver functions which allow better separation of code for functions of the solver
- Propositions now hold a simple formula, no
ImmutableFormulaList
anymore - fixed a spelling problem: propositions now have a correct
backpack
- More classes are
protected
now and can be extended from outside - Moved parser grammars from
resources
toantlr
- CleaneLing solver
ImmutableFormulaList
class
- New BDD handlers
- Some improvements to handlers for computations
- A new method for solving a formula with a given literal ordering.
- Minor refactoring of the Formatter super class (no effects on callers).
- Fixed the behaviour of model enumeration with additional variables.
- A new method for generating CNFs directly on the solver instead of using the formula factory. This often leads to a faster generation and reduced Heap consumption but with the loss of caching
- The current formula on a MiniSat-based solver can be extracted
- The standard MiniSat-based solvers can now directly efficiently compute a backone. No extra solver is required anymore
- BDD factory can now be extended externally
- Clarified behaviour of the
Backbone
object
- Fixed caching behaviour when using a
sat()
call without assumptions after a call with assumptions
- Introduced a new
FormulaHelper
class for small utility methods on formulas - Added a new NNF predicate
- Fixed an unspecified behaviour in
SATPredicate
- Fixed a small performance issue in the new backbone solver
- Fixed a bug in a special case of the CNF transformation of a pseudo-Boolean constraint
- Algorithm & data structures for efficiently computing backbones of formulas
- Data structures for UBTrees in order to efficiently identify sub- and supersets
- CNF and DNF subsumption as formula transformations
- Backbone simplifier (compute and propagate the backbone of a formula)
- A new sorted formula formatter which respects a given variable ordering when printing formulas
- Minor code refactorings and improvements
- Deprecation of CleaneLing - this solver will be removed in future versions.
- Some refactorings for unit tests on Windows regarding encodings
- The Quine-McCluskey implementation does not yield CNF auxiliary variables anymore
- Fixed a minor bug in the generation of incremental cardinality constraints
- BDD package (based on Buddy) for creating, manipulating, and writing BDDs
- Creation of BDDs from LogicNG formulas
- CNF, DNF transformation of BDDs
- Restriction, existential & universal quantifier elimination
- Model counting & enumeration
- Different static variable ordering heuristics (FORCE, DFS, BFS, MinMax)
- Writing BDDs in the GraphViz .dot format
- Quine-McCluskey Implementation for minimizing canonical DNFs
- New formula transformation for anonymizing formulas
- Internal parser and IO improvements. Variables can now start with a digit.
- New formula transformation which imports formulas in another formula factory
- Huge performance boost in the model enumeration of MiniSat
- Small bugfix for a trivial case in DRUP
- MiniSat and Glucose have a new option for proof tracing. A DRUP implementation stores all the necessary information for generating a proof for unsatisfiable
formulas after
solving them. The new method can be found in the SAT solver class:
unsatCore()
- A new simplifier which applies the distributive law was added:
DistributiveSimplifier
- Unsat Cores are now parametrized with the proposition type
- Some minor bug-fixes in handling corner cases of cardinality and pseudo-Boolean constraints
- Introduced an extended formula factory which is able to return to a previously saved state and delete old formulas (and get them garbage collected)
- A simple data structure for generic graphs including algorithms for connected components and maximal cliques
- Improved IO (Writers for formulas, Dimacs CNFs, and graphs)
- SAT solvers can now track the currently known variables
- Updated to ANTLR 4.7
- Various smaller bugfixes
- Implemented cardinality constraint encodings and pseudo-Boolean constraints encodings of PBLib
- Incremental cardinality constraints, including the possibility to add cardinaliy constraints to the solver without introducing new formula factory variables
- Different MUS algorithms
- Initial Release of LogicNG