This file is dedicated to sum up the new features added and bugs fixed in Choco-solver since the version, 4.0.0. Note: double-space is replaced by "\t" character on release process. Make sure the format is ok.
- Fix PropModXY in case of negative mod
- Charles Prud'homme charles.prudhomme@imt-atlantique.fr
- Jean-Guillaume Fages jg.fages@cosling.com
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v6.0.0...v6.0.1
- Faster modulo constraints with bounded variables
- Fix modulo constraint with negative values
- Add
lcgExtractFromVariablesOnSolutionsetting to control whether the solution-forbidding clause is built from variable assignments (true) or from the decision path (false, default) - Add optimized implementations for the
elementconstraint - Improve filtering of signs of variables in PropDivXYZ
- Fix
SparseBitSet.prevClearBit(final int fromIndex)
- Migrate to Java 17 (
<release>17</release>); Java 17 language features and APIs are now available - Simplify Maven compiler configuration: remove multi-release JAR dual-compilation strategy (Java 8 + module-info at Java 9)
- Enforce minimum Java 17 and Maven 3.6.0 via
maven-enforcer-plugin - Upgrade ANTLR from 4.9.3 to 4.13.2; migrate grammars to standard
src/main/antlr4/layout; generated parser sources are no longer committed to the repository - Upgrade TestNG from 7.5.1 to 7.12.0
- Upgrade args4j from 2.33 to 2.37
See milestone 5.0.2
- Charles Prud'homme (@cprudhom)
- Jean-Guillaume Fages (@jgFages)
- Arthur Godet (@ArthurGodet)
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v5.0.1...v5.0.2
- Add table reformulation for pow constraint when LCG is on
- Reduce runtime for building table reformulations by excluding the result variable from the tuple generation
- Fix integer overflow in PropDivXYZLight
- Fix bounded domains management with LCG in PropDivXYZ
- Faster modulo constraint with large domains
- Add arithm preprocessing
- Fix decreasing constraint
See milestone 5.0.1
- Charles Prud'homme (@cprudhom)
- Jean-Guillaume Fages (@jgFages)
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v5.0.0...v5.0.1
This set of commits delivers a major consolidation of Lazy Clause Generation, significant performance and memory improvements, more robust constraint handling, and a broad cleanup and modernization of the internal APIs and tooling.
- Significant performance improvements on:
- Core propagators (X+Y=Z, abs, div, sum, scalar, etc.)
- CompactTable (CT) and STR2+
- Memory management and estimation mechanisms
- Dynamic selection of table algorithms based on memory footprint
- Optimizations in MiniSat and SAT-related components (clause reduction, propagation, assertions)
- Major consolidation effort on LCG:
- Fixes for critical bugs (initialization, reification, lost propagations)
- New assertions and invariants
- Improved separation and handling of learnt clauses (failure vs prohibiting-solution)
- Extended LCG support for constraints such as abs, div, table, element
- Better interaction with:
- Restart strategies
- ParallelPortfolio
- Explanation and Reason APIs
- Refactoring or improvement of many constraints:
- AllDifferent, AllDifferentExcept*
- Cumulative, DiffN, BinPacking, Element, Table
- Arithmetic constraints (abs, div, times, min/max)
- Smarter choice between decomposition and extension
- Improved expression recognition and handling (XCSP / Flatzinc)
- Numerous test fixes and stabilizations
- Addition of new tests, especially for LCG and XCSP
- Timeout adjustments
- Cleanup of memory-intensive or unstable tests
- Update of XCSP3 tools (v2.5)
- Improvements in parsing and expression handling
- Better support for:
- Negative values
- Constants
- Variable groups and restarts
- Competition-oriented adjustments for XCSP and Flatzinc
- Enhancements to:
- RoundRobin strategies
- Dom/Wdeg and ConflictHistorySearch
- MetaStrategy framework
- New parameters and more robust default behaviors
- Simplification and clarification of search-related APIs
- Large-scale code cleanup:
- Removal of obsolete classes
- Simplification of core APIs (IntVar, Decision, Reason)
- Improved and updated Javadoc
- Clearer separation of responsibilities between Solver, MiniSat, and learning components
- Updates to Maven configuration, Docker, and Makefiles
- CI workflow adjustments (tests, snapshots, releases)
- Preparation of intermediate and beta releases
- Performance improvement in PropXPlusYEqZ and PropAbsolute
- Fix bug in ConflictOrderingSearch (monitor not plugged)
- Performance improvement for LastConflict, ConflictOrderingSearch and StrategySequencer.
- Fix bug : regular constraints parsed from XCSP now support negative values
- Fix bug : Unexpected behavior when using Task with scalar (#1114)
- Replace Cumulative implementation by state-of-the-art implementation of TimeTabling and OverloadChecking
- Fix bug : IntVar no longer extends Iterable to avoid errors in nested loops
- Fix bug : Fix iterator issue when using ISet, especially within graph variables (#1174 and #1175)
- Charles Prud'homme (@cprudhom)
- Jean-Guillaume Fages (@jgFages)
- Arthur Godet (@ArthurGodet)
- Sulian Le Bozec Chiffoleau (@SulianLBC)
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v5.0.0-beta.1...v5.0.0-beta.2
This version introduces CP-SAT in Choco-solver which replaces the previous explanation framework. The Lazy Clause Generation (LCG) is a technique that allows the solver to generate clauses during search. The current implementation is inspired by Chuffed and "Lazy Clause Generation Reengineered" - Feydy, T., Stuckey, P.J. (2009). This new version has necessitated a rather intrusive revision of the way propagators filter.
By default, LCG is not enabled. The following code shows how to enable it:
Model model = new Model(SettingsBuilder.init().setLCG(true));At this stage, this is a beta version. First, only integer and boolean variables are supported. Second, some constraints are explained with dedicated functions and others are decomposed into explained ones. More importantly, others are neither explained nor decomposed (for the moment). In the latter case, an exception is raised to inform the user of the situation.
See milestone 5.0.0
- Charles Prud'homme (@cprudhom)
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v4.10.18...v5.0.0-beta.1
- Fix unexpected behaviour when using
neg()intvar in arithm #1115 - Fix bin packing initial propagation (#1113)
- Fixed an error in
increasingconstraint documentation and updateddecreasingconstraint documentation (#1103)
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v4.10.17...v4.10.18
- Fix bug in
PropHybridTable(#1102)
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v4.10.16...v4.10.17
- Fix bug in
IntAffineView(#1101)
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v4.10.15...v4.10.16
- Add
PickOnDomand variants (seeSearch.pickOnDom) - Enhance MiniZinc output
- Revamp scripts to solver flatzinc files
- Fix bugs (see closed issues)
- Arthur Godet (@ArthurGodet)
- Paul King (@paulk-asert)
- Zhang Yang (@zy-nesime)
- Charles Prud'homme (@cprudhom)
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v4.10.14...v4.10.15
- NEW:
solver..showRestarts();to display the number of restarts during the search. - NEW: hybrid table constraints (see
model.table(...)) - NEW: partial assignement generator for COP (see
Search.generatePartialAssignment()) - NEW: Add Blackbox configuration (#1058)
- Revamp views (#564)
- Improve
pow(base, exponent, result) - Remove
BitsetArrayIntVarImplnow managed inBitSetIntVarImpl
- Jean-Guillaume Fages (@jgFages)
- Arthur Godet (@ArthurGodet)
- Fabien Hermenier (@fhermeni)
- Charles Prud'homme (@cprudhom)
Full Changelog: https://github.com/chocoteam/choco-solver/compare/v4.10.13...v4.10.14
Mainly bug fixes and improvements of Pareto front performances.
- Charles Prud'homme (@cprudhom)
- Jani Simomaa (@jsimomaa)
- Fix bug #1006, #1011 and #1014
- Dimitri Justeau-Allaire (@dimitri-justeau)
- Charles Prud'homme (@cprudhom)
- Correcting the lack of filtering in
PropIncreasing - Change the SetType for the undirected graph stored in DiffN for efficiency reason
SparseBitSetfor a backtrackable bitset with mostly 0s (#935)- Change the way restarting works: not a
Moveanymore, directly included inSolver(#950) - Simplification of objective manager (#949)
- Calling
getValue()on an uninstantiated variable throws an IllegalStateException (#957) - Change the MiniZinc complementary search to a FirstFail (instead of DomOverWDeg) (#958)
- Reduce object creation during solving (#985)
- Reduce object creation during propagation (#969)
- Reduce memory footprint of
Model(#964) - Add
model.getEstimatedMemory()method - Add
Modelanalysis (#939) - Add log file as RegParser option (for parsers)
- creation of PropPower propagators with exponent as int
From Solver:
Propagate getPropagate()void setPropagate(Propagate p)Closeable outputSearchTreeToCPProfiler(boolean domain)
Others:
PropagateclassIntEventType:int combine(IntEventType... evts)
- Jean-Guillaume Fages (@jgFages)
- Arthur Godet (@ArthurGodet)
- Fabien Hermenier (@fhermeni)
- Charles Prud'homme (@cprudhom)
- Fix performance issue of ViewDeltaMonitor
- Fix lack of filtering in STR2+ when domain is bounded
- Fix issue relative to
ORandANDinLogOp - Add missing checks in OneWordS32BitSet and OneWordS64BitSet + update constructors
- Add new API to VariableUtils
- Add CITATION.cff
- Update paper.md
- Jean-Guillaume Fages (@jgFages)
- Charles Prud'homme (@cprudhom)
- Mehmet Hakan Satman (@jbytecode)
- It is now possible to declare hints to help the search finding a first solution. See
solver.addHint(var, val). - Add
Solver.tableSamplingresolution policy which returns a stream ofSolutionrandomly sampled. - Add
increasinganddecreasingconstraints - Add
costFlowconstraint, which is composed of scalar products and a MinCostMaxFlow propagator - Revamp
powconstraint - Add threshold for
elementwith array of variables signature - Add a propagator for 0/1-knapsack (thanks to @PoltyPoltou)
- Remove
CPProfilersince the project is not active anymore. - Make possible to deal with large domains for some constraints (#894)
- Add a
LinearProgramclass to deal with linear program (!) and a two-phase Simplex (not connected yet) - Fix bug related to delta in boolean views
- Improvements relative to reified propagators
- Change signature of AtLeastNValues
- Record time to best in
Measures(IMeasures measures)constructor
Each variable is in charge of scheduling its propagators.
This impacts the way propagators are stored in a variable.
Consequently, the getPropagators() and getPropagator(int) methods are deprecated, streamPropagators() replaces them.
Unless otherwise stated, a propagator that can be entailed is automatically swapped in its variables' internal structure.
- Extend some black-box strategies to
SetVar - Add
union(SetVar unionSet, SetVar indices, SetVar[] sets)constraint - Add free strategy for SetVar (RegParser and ParallelPortfolio)
- Fix
SetVar#getDomainSize - Add
SetDomainMax - Add 'setLe' and 'setLt' constraint (as a decomposition) in
ISetConstraintFactory
- Change default search of Flatzinc
- Increase interval for Flatzinc unbounded intvar
- Remove default ANSI in parsers
- Update FZN grammar to deal with 'set of int'
- Flatzinc: deal with warm_start
- Add ignored search annotation warning in FGoal
- Update XCSPParser + add
model.amongDec
Since 4.10.9, a new jar file is available for download.
This is a lighter version of the one with dependencies,
namely choco-parsers-light-VERSION.jar.
The following dependencies have been excluded from this archive:
org.apache.pdfbox:pdfboxorg.apache.fontbox:fontboxcom.ibm.icu:icu4j
This results in 82% smaller archive. Note that the non-alleged versions are still available for download.
IOutputFactory.outputSearchTreeToCPProfiler(boolean domain)
See milestone 4.10.9
- Mathieu Vavrille (@MathieuVavrille)
- Nicolas Pierre (@PoltyPoltou)
- Charles Prud'homme (@cprudhom)
- Jean-Guillaume Fages (@jgFages)
- Arthur Godet (@ArthurGodet)
- Propagation is now observable,
solver.observePropagation(PropagationObserver). Consequently, it is now possible to profil the propagation by callingsolver.profilePropagation(). See Javadoc for details and usages (#832). - Release 4.10.7 introduces a bug related to delta monitors, which is now fixed (#837).
- Add new black-box strategy: failure based variable ordering heuristics (@lihb905)
- Add
model.streamVars()andmodel.streamCstrs() - Bounded domains checking for table constraints
- Change complementary search in FlatZincParser
- Bump XCSP3
See milestone 4.10.8
- Jean-Guillaume Fages (@jgFages)
- Fabien Hermenier (@fhermeni)
- Hongbo Li (@lihb905)
- Charles Prud'homme (@cprudhom)
- Simplify the way deltamonitors work. There is no need to
freezeandunfreezethem before callingforEach...methods. But, a call toforEach...consumes all values stored. - Fix a bug related to incremental propagators, views and missing events.
- STR2+ now deals with STAR tuples. Can be used when CT+ is not efficient (mainly due to very large domain size)
- Resetting cutoff strategies now possible
- Change restart behavior to reset cutoff on solutions (can be disabled though, calling
solver.setRestarts(..)API). - Display occurrences of variable types and occurrences of propagator types
- Now
IntDomainBestoffers API to break ties (seeSearch.ValH.BLASTfor an example). - Add
solver.defaultSolution()which creates lazily a solution recording everything, plugs it and returns it. This is helpful when a Solution object is required in many places. - Modification of the management of expressions in order to reduce the number of created variables (WIP).
- Add
IntVar.stream()that streams a variable's values (in increasing order) - Add
Search.ValH.BMINandSearch.ValH.BLAST - Add DIMACS CNF parser (
org.chocosolver.parser.mps.ChocoDIMACS) - Add Logger (
solver.log()) to trace from Model/Solver. - Change some default settings
- Revamp
Settings, now is defined as a factory pattern + addSettings.dev()andSettings.prod()profiles. - Make half reification possible. Seed
c.implies(b)orc.impliedBy(b)wherecis a Constraint andba BoolVar. - Update MiniZinc constraints definition + flatzinc files (for testing).
- Update
choco.msc(for MiniZinc IDE) +./minizinc/README.md - Add
ArgmaxandArgminconstraints - Add
IfThenElseas a decomposed constraint - Improvement of
solver.findParetoFront()
See milestone 4.10.7
- Dimitri Justeau-Allaire (@dimitri-justeau)
- Jean-Guillaume Fages (@jgFages)
- Charles Prud'homme (@cprudhom)
- Charles Vernerey (@chaver)
- Add new resolution helper in
Solver, namelyfindOptimalSolutionWithBounds. See Javadoc for details and usages. ParallelPortfolionow allows to add unreliable models, that is models whose resolution is deliberately made incomplete. These models should not stop the parallel resolution process when they no longer find a solution. Only complete models can inform the portfolio that they have proven the full exploration of the search space.- Add
org.chocosolver.util.tools.PreProcessingclass, and a first preprocessing rule: equalities detection - Upgrade ibex integration to support ibex-java v1.2.0. Fixes for issues #653 and #740.
- Add QuickXPlain algorithm to find the Minimum Conflicting Set (see issue #509)
- Update XCSP3 parser.
- Fix
InDomainMedianwhen domain size is even - Add new way to watch solving:
solver.verboseSolving() - Deal with annotations for some Flatzinc constraints (allDifferent and inverse)
- Add
MultiArmedBanditstrategy sequencer
See milestone 4.10.6
- Charles Prud'homme (@cprudhom)
- João Pedro Schmitt (@schmittjoaopedro)
- add
INarithmetic int expression.
Settings.enableACOnTernarySum()removedSettings.setEnableACOnTernarySum(boolean)removed
See milestone 4.10.5
- Guillaume Le Louët (@glelouet)
- Charles Prud'homme (@cprudhom)
- João Pedro Schmitt (@schmittjoaopedro)
- Change search strategies in ParallelPortfolio
- Make "CT+" available to binary table constraint
- Update Dockerfile, now automatically released in hub.docker.com
- Migrate to ANTLR 4.8-1
- Support nested
seq_searchin FlatZinc file - Add missing operations in
model.unpost(c) - Add new constraint, named
conditional, that posts constraints on condition - Merge
cutoffseqinsolver - Merge
pf4csinparsers - Remove
geostfromparsers
#692, #698, #700, #702, #703, #704, #705
- Dimitri Justeau-Allaire (@dimitri-justeau)
- João Pedro Schmitt (@schmittjoaopedro)
- Charles Prud'homme (@cprudhom)
Multi-modules and JPMS-ready.
- Move
cutoffseq,choco-sat,choco-solver,pf4cs,choco-parsersandsamplesprojects into a (maven) multi-modules project, JPMS-ready
- Add Conflict History Search ("Conflict history based search for constraint satisfaction problem." Habetand Terrioux,SAC 19 (#676)
- Add dom/wdeg with refinement ("Refining Constraint Weighting." Wattez et al. ICTAI 2019.)
- Default AC algorithm for
AllDifferentis now from IJCAI-18 "A Fast Algorithm for Generalized Arc Consistency of the Alldifferent Constraint", Zhang et al. (#644) - Add a pure java alternative to Ibex (#666)
- LNS can now be defined with a solution as bootstrap.
- Add simplify API for current Solver operations (#659)
- Simplify code for the nValues constraint (using a watching/witnessing reasoning) (#674)
- Replace former Bin Packing propagators by Paul Shaw propagator (#671)
- Improving PropDiffN performance (#663)
- Add nogood stealing for
ParallelPortfolio(#669) - Adding of new constructors for Task objects (#662)
- Remove JSON writer/parser (which was actually partially supported and not maintained) (#664)
Task(IntVar s, IntVar d, IntVar e, boolean declareMonitor)AbstractProblem.readArgs(String... args)
#617, #633, #637, #639, #645, #646, #647, #648, #658, #665, #667, #678, #682, #686, #689, #691
- fix issues relative to propagation
- change constraints' status checking
- change stop conditions in
ExplanationForSignedClause - add stable module name
#618
- LNS on other variables (e.g. SetVarLNS)
- Continuous integration fixed
IntDomainMiddlenow allows an external definition of what middle is, thanks toToDoubleFunction<IntVar>
#538, #600, #611, #612, #613, #614, #615, #617, #619, #627, #630
This release comes with several major modifications. The most important one is related to explanations. The previous framework is replaced by a new one based on "A Proof-Producing CSP Solver", M.Vesler and O.Strichman, AAI'10.
See notebooks for an example of use.
- Update statistic dashboard (see
solver.showDashboard()) - Fix
Settings.loadon missing property - Fix issue in
Cumulativesimplified API - Add additional views
model.intEqView(x,c),model.intNeView(x,c),model.intLeView(x,c)andmodel.intGeView(x,c) - Detect when the same views is created twice on the same pair <variable, value?>
- Revamp the way LNS' neighbor is declared (simplication)
- Add
AbstractStrategy.remove()method to remove a declared strategy and its dependencies - Add new strategies to
Search - Add new decomposition to
IDecompositionFactory - Improve initialization of CT+ and CT*
- Improve
IntVar#isInstantiatedTo(int)
INeighborinterface is deprecated and replaced byNeighborabstract classINeighborFactory#explanationBased(IntVar...)is deprecated, no replacement.ILearnFactory#setCBJLearning(boolean,boolean)andILearnFactory#setDBTLearning(boolean,boolean)are deprecated, seeILearnFactory#setLearningSignedClauses()instead
#604, #605, #606
Minor release
- Offer possibility to store and load
Settingsfrom a property file. - Add API for
cumulativewhen only starts are variable - Add decomposition of cumulative:
model.cumulativeTimeDecomp(...) - Logical expression XOR manages more than 2 variables
- Add new API to IOutputFactory (to Gephi and to Graphviz)
- Add constraint network output (to gexf format), see
solver.constraintNetworkToGephi(file) - add
ParallelPortfolio.streamSolutions(#579)
#596, #600, #601, #602
Update DefaultSettings with right version
JAR file names have changed:
- the suffix 'with-dependencies' disappears,
- the suffix '-no-dep' (for no dependencies) appears.
This should intends to clarify the selection for new comers.
Add a PayPal button for donations.
Move to Ibex-2.6.5.
- Revamp
Settings: no default method anymore, add setters. A concrete classDefaultSettingsprovides the default behavior. IViewFactory.intScaleViewnow manages negative constants,IViewFactory.intAffineViewis now available- add new constraint for mixed linear equation (over real/int variables and double/int coefficients)
- Dow/WDeg now manages variables in a bipartite set (instantiated variables are swaped)
- Assert that a propagator that is passive is not allowed to filter anymore
- An exception is thrown when a sum (or scalar) constraint is candidate for integer over/underflow (an alternative should be provided later)
BoolVarnow handles modifications in different way (may impact performances)- Propagation engine has changed: no alternative to seven-queue one anymore + simplification of code (may impact performances)
- add new relation expression
ift(e1,e2)
Model.set(Settings)is deprecated. Now settings are declared in theModelconstructor.Settings.debugPropagation()is deprecated. There is no alternative.
#527, #564, #569, #576, #578, #581, #586
Move to Ibex-2.6.3.
- Ibex instance is no longer static, that offers better stability and reduce memory consumption when adding/removing functions. Reification no longer managed by Choco but delegated to Ibex.
Search.realVarSearch(...)offers possibility to define minimal range size, known asepsilonSearch.ibexSolving(model)let Ibex iterates over solutions once all integer variables are instantiated- add detection of min/max sub-cases
- add simple dashboard in Swing to show resolution statistics, see
solver.showDashboard()
IntEqRealConstraintwill be removed in next release, Ibex managed this concept (int to real)Model.getIbex()should not be used. AIbexHandlermanages Ibex instances (one per model).
#558, #561, #565, #566, #568, #570
The current release was submitted to MiniZinc Challenge 2017 and at XCSP3 Competition 2017 and won medals.
choco-parsers provides utility to export a Model to JSON format
and or import JSON data into a Model.
- Compact-Table now deals with short tuples (#531)
- Checking if a created constraint is free (neither posted or reified) is now possible with
Settings.checkDeclaredConstraints() - Improvements on BoolVarImpl and BoolNotView.
- Remove code deprecated in last release.
- Fix error in Views.
- Add scalar detection in
BiReExpression - fix errors in Impact-based Search
- update Search.intVarSearch() + Search.defaultSearch(Model)
- update ParallelPortfolio default strategies
- fix bug in
PropNogoodswhen dealing with negative values (impactsolver..setNoGoodRecordingFromRestarts()andsolver..setNoGoodRecordingFromSolutions(...)) - fix bug in
model.sum(...)andmodel.scalar(...)when dealing with arity greater than 100 and all operators except= - fix bug in
model.table(...)with binary scope and universal value - fix bug related to Ibex and GC.
#531 ,#545, #546.
- add logical operator to expression (#520). Now it is possible, f-ex., to declare expression like:
x.eq(y.add(1)).or(x.eq(y).and(x.eq(1))) - add new API to
Solverto print features in a single line - enable ignoring passivate propagators when iterating over propagators of a modified variable (false by default; see Settings)
IPropagationEngine.fails(c,v,m)is replaced bySolver.throwsException(c,v,m)(#524)IPropagationEngine.getContradictionException()is replaced bySolver.getContradictionException()(#524)MathUtils.bounds(values)is replaced by a call toMathUtils.min(values)andMathUtils.max(values)
- SparseSet
- IFeatures, Features, IAttribute and Attribute
#516, #517, #518, #519, #520, #521, #524.
arithm(IntVar,String,IntVar,String,int)andarithm(IntVar,String,IntVar,String,IntVar)manage '*' and '/'- add new APIs to
ArrayUtils - fix error in
PropBoolMinandPropBoolMax
#500, #502, #507, #510, #512, #514, #515.
- restrict calls to
Solver.setEngine(...)when propagation started. See javadoc for details. - remove global constructive disjunction, only local constructive disjunction is allowed.
- add
Solution.restore()to restore a solution (#354). - deep reset of
Solver(#490, #491)
Solver.getState()(#485)Measures.IN_SEC(related to #486)Settings.outputWithANSIColors,IOutputFactory.ANSI_*IMoveFactory.setLubyRestart(int, int, ICounter, int)
#468, #479, #480, #481, #484, #487, #488, #489, #492, #493, #494, #495, #496, #497, #499.