Skip to content

Releases: CPMpy/cpmpy

Release v0.10.1

10 Jun 11:06

Choose a tag to compare

Release notes

Fixed

This is a hotfix release due to a bug discovered in bounds computation.

  • Bounds for pow and mod (cherry picked for this hotfix) #1012

Full Changelog: v0.10.0...v0.10.1

Release v0.10.0

19 Jan 13:01
3ffdd63

Choose a tag to compare

Release notes

Added

  • New solver: Rc2 MaxSAT solver #729
  • Expended to_cnf using pindakaas encoding backend #782
  • Linearisation of multiplication between Boolean and Integer #769
  • Solution callback for Hexaly #787, #809
  • Start of solver parametrised testsuite #817
  • Documentation overview of solver capabilities #728
  • Typehints and documentation update for global constraints #812
  • Typehints for Solve and SolveAll #775
  • OCUS in tools, allowing meta-constraints on MUSes #698
  • Fix supported solver version ranges #816
  • Transversal / hitting set example (contributed by @nandorsieben) #790
  • Nurserostering benchmark #789
  • Prediction+optimisation example of scheduling surgeries under uncertainty 5a87c5e
  • Decision-focused learning example #621

Internal improvements

  • Globals define their own negation #703
  • Change cp.sum(*iterable, **kwargs) to cp.sum(iterable, **kwargs) #756
  • Division and Modulo as global functions #807
  • Refactor decompose for global functions #793
  • Refactor and update Cumulative and NoOverlap constraints #694

Changed

  • Throw ModuleNotFoundError when module is not installed #825

Fixed

  • Fix support for newest OR-Tools 9.15 release #821
  • Check Hexaly license before using solver #826
  • Fix to_cnf clause bypass issue #824
  • Fix bug handle pdk unsat with conditions #811
  • Missing packaging dependency in setup.py #813
  • Abs constraint handle None #794
  • Timeout under assumptions for Exact #805
  • Support for expressions in start, duration and end in CPO #802
  • Consistent version checks #792
  • Missing constraint tags for Pumpkin #799
  • Z3 negate maximisation objective #786
  • Scaled Booleans in Pumpkin interface #776

Full Changelog: v0.9.29...v0.10.0

v0.9.29

15 Jan 13:32

Choose a tag to compare

Release notes

This is a hotfix release due to external breaking changes in the default solver backend.

Fixed

  • Pin solver versions (not merged, cherry picked for this hotfix) #816

Full Changelog: v0.9.28...v0.9.29

v0.9.28

17 Oct 10:22
679c87b

Choose a tag to compare

Release notes

This is a very small release with a hotfix for multi-dimensional indexing where the index is a decision variable.

Fixed

  • Hotfix for single expression in multi-dimensional indexing #772

Full Changelog: v0.9.27...v0.9.28

v0.9.27

06 Oct 07:46
070c8b1

Choose a tag to compare

Release notes

Added

  • New solver: CPLEX ILP solver #583, #762, #763
  • New solver: Hexaly local search solver #718
  • New tool: CPMpy cli (get version information on all subsolvers) #693
  • Use of CSE in flatten_objective #730
  • Constraint tagging for pumpkin #720
  • Solver capability overview in docs d8d3a2d
  • PSP-lib dataset and loader #701
  • Safen name collision between user and aux variables #731

Changed

  • Update pindakaas to version 0.2.1 #753
  • Exclude slow examples from testset #746
  • Safe variable names #731
  • SolverInterface consistency improvements and added tests #726
  • Improve testing of examples #651
  • Modernize shebangs of examples #644
  • Linearize improvements e721b0a
  • Update waterfall (added automated int-to-bool) 710ec42
  • Collection of improvements to GitHub README

Fixed

  • Precedence global decomposition #742
  • Minor bugs in examples #739
  • gnureadline typo in setup.py #722
  • Non-contiguous array handling in cpm_array #738
  • Remove simplification of nullifying arguments from constructors #725
  • Skip psplib in testset due to random failure on GitHub actions 7a15d07
  • (Pin Pumpkin solver git commit #719) outdated by #720

Full Changelog: v0.9.26...v0.9.27

v0.9.26

10 Aug 21:12
4e89e9d

Choose a tag to compare

Release notes

Added

  • New solver: Pumpkin LCG solver (by the ConSol Lab at TU Delft) #669
  • New solver: Pindakaas library for transforming pseudo Boolean to CNF #600
  • New global: Regular #677
  • New tool: Tooling for the XCSP3 format: dataset, loader, CLI, benchmarking #597
  • Common Subexpression Elimination (CSE) #679
  • Support for integer constraints for Boolean solvers using new int2bool transformation #653
  • Solution hinting for Gurobi #691
  • Solution callback for CP Optimizer #682
  • Acces to (installed) solver status/version: call .version() on a specific solver or on SolverLookup to get an overview. Or use cp.SolverLookup.print_version() for pretty printing. #628
  • Support for canonicalisation of subtraction expressions #686
  • Allow use of Boolean constants in weighted sum #711
  • Added testset for incremental assumptions
  • Catch beginner mistakes linked to incorrect usage of boolean expression #660

Changed

  • Refactoring of int2bool/pysat #714
  • Updated instructions for adding a new solver with request to add solver to overview table
  • Improve efficiency only_implies: avoid retransform if no subexpression #680
  • Consistent state reporting of .solve() across all solvers #545
  • Improved docs and error messages for canonical_comparison #678

Fixed

  • Support special cases for Xor global (boolean constants, single argument) #717
  • Missing optimal exit status for GCS #705
  • Missing solution for empty csp when enumerating #674
  • Use of constants in globals #700
  • CSE edge-case in only_numexpr_equality #696
  • Choco shorttable star symbol data type #697
  • Ensure python-native expression values to prevent unexpected behaviour with numpy constants #695
  • Correctly handle numpy integers in eval_comparison #683
  • CP Optimizer fix cumulative with zero-duration task #681
  • Fix incorrect decomposition of Inverse global constraint #673

Full Changelog: v0.9.25...v0.9.26

v0.9.25

07 May 10:12

Choose a tag to compare

Release notes

Added

  • New solver: IBM CP Optimizer #576
  • New global: ShortTable #469
  • model.add() as new default to add constraints to model (same behaviour as +=) #640
  • Easy install of all solvers through the "all" optional dependency, i.e. pip install cpmpy[all] #665
  • More complex variants of the Sudoku puzzle (in examples) #577
  • API summery sheet #629
  • Linearisation for div, abs and mod #516
  • Linearisation for subtraction #639
  • div linearisation for Gurobi #593
  • Native cardinality constraints for PySAT #588
  • wsum support for PySAT
  • Support for constants in Element global function #630
  • SolverLookup now has .supported() and .print_status() to get information on the available solvers on the current system #641
  • solveAll() now accepts solver-specific kwargs, just like solve() #582
  • Optional dependencies for solvers and tools (setup.py) #599
  • Documentation for all CPMpy exceptions #622

Changed

  • Bumped minimal Python version from 3.7 to 3.8 #575
  • mod and div now default to integer division
  • Improved reading of DIMACS formatted files #587
  • Avoid max-based decomposition for abs if possible #595
  • Cleanup semantics of Boolean Python builtins #602
  • Performance optimisation of simplify_bool #592
  • Ensure AllDifferent decomposition is linear #614
  • Much improved README
  • Improved docs formatting, especially for the Python API docstrings #603
  • Improved API documentation of explanation tools #512
  • Better exceptions for explanation tools #512
  • Improve documentation of non-standard solver args passing for Exact #616
  • General documentation improvements #619, #633, #634
  • Skip subset of PySAT tests when optional dependency pblib is not available #668

Fixed

  • Linearisation with boolean constants #581
  • Linearisation of AllDifferent with integer constants #547
  • Side conditions for Precedence global #589
  • simplify_bool on non-CPMpy expressions #626
  • Handling of negative variables in objective during linearisation #495
  • Integers in GCC global for Choco-solver #646
  • NValueExceptN for single value range #645
  • Handling of empty clauses in GCS #662
  • Missing user vars when calling solveAll(), resulting in incorrect number of solutions #609
  • Consistent handling of non-positive time_limit #642
  • Added setuptools to required dependencies (can be missing on some installs) #664
  • DIMACS tempfiles on Windows #601

Removed

  • Removed support for Python version 3.7 #575

Full Changelog: v0.9.24...v0.9.25

0.9.24

17 Jan 14:57

Choose a tag to compare

Release Notes

Enhancements and Features

  • Safening of partial functions: New transformation to safen partial function. #515
  • Update Choco interface with native reification: Improved the Choco solver interface with native reification support. #526
  • Reals in objective function: Added support for real numbers in the objective function. #529
  • Better naive grow: Enhanced the "naive grow" strategy for better performance. #528
  • Blocks world: Introduced a "blocks world" example for demonstration purposes. #533
  • Examples Colab links: Added direct Colab links to examples for easier experimentation. #553
  • Circuit decomposition for all ranges: Extended circuit decomposition to handle all ranges. #424
  • Global function in Z3 objective: Introduced global functions in Z3 solver objectives. #560
  • Z3 auto subsolver: Implemented automatic subsolver selection for Z3 when solving optimization problems. #567
  • Parametrize solver tests: Streamlined solver test cases using parameterization. #572
  • Linearize power: Added linearization for power operations. #538
  • Improve Boolean normalization for PySAT: Enhanced normalization of Boolean terms for PySAT. #569

Performance Improvements

  • Has subexpr optimization: Skip transformations of leaf expressions for improved efficiency. #532
  • Only implied speedup: Optimized "only implied" handling for significant speedups. #541
  • Distribute tests over CPUs: Distributed tests over 4 CPUs, reducing runtime from 21m30s to 8m45s. #571
  • ndvar_getitem optimization: Improved ndvar_getitem by moving fetch casts to initialization. #550
  • Remove inline imports: Instead use import as x at top of file. #542

Bug Fixes

  • Remove broadcast in min/max: Fixed issues when forwarding to built-in min/max functions. #536
  • Convert numpy array in Table constraint: Ensured proper conversion of NumPy arrays to lists in Table constraints. #540
  • Clear values on UNSAT: Added functionality to clear variable values when UNSAT is detected. #523
  • Fix cpm_array with order='F': Resolved issues with cpm_array() when using column-major order. #555
  • Car sequencing index fix: Corrected indexing issues in the car sequencing problem. #565

Code Quality and Maintenance

  • Improve exception messages: Enhanced clarity of exception messages and removed unused imports. #539
  • Edits to the docs: Updated documentation for clarity and completeness. #530
  • Gurobi license check: Separated Gurobi license checks into a distinct process. #566
  • Standardize solver version checks: Unified approach to checking solver version compatibility. #568
  • Update requirements: Upped our minimal python requirement from 3.6 to 3.7. #573

0.9.23

08 Oct 10:18

Choose a tag to compare

Quick release, because we want the updated tools to be available.

What's Changed

  • Extension to tools: MARCO and SMUS
  • Added tests for incremental solving and fixed incemental solving with objective in Exact
  • Cumulative decomposition fix when capacity was numpy integer.

Full Changelog: v0.9.22...v0.9.23

v0.9.22

03 Oct 16:07

Choose a tag to compare

What's New

  • New solver: GlasgowConstraintSolver (GCS)
  • Upgraded to Exact 2
  • Minizinc print: easily extract MiniZinc and FlatZinc text from CPMpy model.
  • Update TEMPLATE.py to make it clearer how to add new solvers.
  • SolverLookup gives clear error message in stead of returning None
  • allow kwargs in Model.solve()
  • call python builtins for sum, abs, min and max without expressions in the arguments.
  • All solvers now have a native_model() function, to allow native solver access.
  • It's now possible to name multiple new variables at once, by providing the names in a list.
  • Linearize transformation can now rewrite modulo (if multiplication is supported)
  • Fix behaviour of "all", "any", "max", "min", "sum", "prod" on higher dimensional NDVarArrays (maintain dimensionality)
  • Value function of expressions now always returns a python integer, where it could sometimes be a numpy integer.
  • Fixed performance issue where all solver vars where seen as user vars when solving with MiniZinc

Documentation

  • Overall improvement of documentation
  • update documentation of 'comparison' transformation

New Contributors

Thanks to 2 new contributors!

Full Changelog: v0.9.21...v0.9.22