Skip to main content

Python bindings for Exact

Project description

Exact

Exact solves decision and optimization problems formulated as integer linear programs. Under the hood, it converts integer variables to binary (0-1) variables and applies highly efficient propagation routines and strong cutting-planes / pseudo-Boolean conflict analysis.

Exact is a fork of RoundingSat and improves upon its predecessor in reliability, performance and ease-of-use. In particular, Exact supports integer variables, reified linear constraints, multiplication constraints, and propagation and count inferences. The name "Exact" reflects that the answers are fully sound, as approximate and floating-point calculations only occur in heuristic parts of the algorithm. As such, Exact can soundly be used for verification and theorem proving, where its envisioned ability to emit machine-checkable certificates of optimality and unsatisfiability should prove useful.

Features

  • Native conflict analysis over binary linear constraints, constructing full-blown cutting planes proofs.
  • Highly efficient watched propagation routines.
  • Seamless use of arbitrary precision arithmetic when needed.
  • Hybrid linear (top-down) and core-guided (bottom-up) optimization.
  • Optional integration with the SoPlex LP solver.
  • Core solver also compiles on macOS and Windows.
  • Under development: Python interface with assumption solving and reuse of solver state (Linux only for now).
  • Under development: generation of certificates of optimality and unsatisfiability that can be automatically verified by VeriPB.

Python interface

PyPI package

The easiest way is to use Exact's Python interfaces is on an x86_64 machine with Windows or Linux. In that case, install this precompiled PyPi package, e.g., by running pip install exact.

Compile your own Python package

To use the Exact Python interface with optimal binaries for your machine (and the option to include SoPlex in the binary), compile as a shared library and install it with your package manager. E.g., on Linux systems, running pip install . in Exact's root directory should do the trick. On Windows, uncomment the build options below # FOR WINDOWS and comment out those for # FOR LINUX. Make sure to have the Boost libraries installed (see dependencies).

Documentation

The header file Exact.hpp contains the C++ methods exposed to Python via Pybind11 as well as their description. This is probably the best place to start to learn about Exact's Python interface.

Next, python_examples contains instructive examples. Of particular interest is the knapsack tutorial, which is fully commented, starts simple, and ends with some of Exact's advanced features.

Command line usage

Exact takes as command line input an integer linear program and outputs a(n optimal) solution or reports that none exists. Either pipe the program

cat test/instances/opb/opt/stein15.opb | build/Exact

or pass the file as a parameter

build/Exact test/instances/opb/opt/stein15.opb

Use the flag --help to display a list of runtime parameters.

Exact supports five input formats (described in more detail in InputFormats.md):

  • .opb pseudo-Boolean decision and optimization (equivalent to 0-1 integer linear programming)
  • .wbo weighted pseudo-Boolean optimization (0-1 integer linear programming with weighted soft constraints)
  • .cnf DIMACS Conjunctive Normal Form (CNF)
  • .wcnf Weighted Conjunctive Normal Form (WCNF)
  • .mps Mathematical Programming System (MPS) via the optional CoinUtils library
  • .lp Linear Program (LP) via the optional CoinUtils library

Note that .mps and .lp allow rational variables, which are not supported by Exact. Additionally, these formats permit floating point values, which may lead to tricky issues. Rewrite constraints with fractional values to integral ones by multiplying with the lowest common multiple of the denominators.

By default, Exact decides on the format based on the filename extension, but this can be overridden with the --format option.

Compilation from source

In the root directory of Exact:

cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make

Replace make by cmake --build . on Windows. For more builds, similar build directories can be created.

For installing system-wide or to the CMAKE_INSTALL_PREFIX root, use make install (on Linux).

Dependencies

  • A recent C++20 compiler (GCC, Clang or MSVC should do)
  • Boost library, minimal version 1.65. On a Debian/Ubuntu system, install with sudo apt install libboost-dev. On Windows, follow the instructions on boost.org
  • Optionally: CoinUtils library to parse MPS and LP file formats. Use CMake option -Dcoinutils=ON after installing the library.
  • Optionally: SoPlex LP solver (see below).

SoPlex (on Linux)

Exact supports an integration with the LP solver SoPlex to improve its search routine. For this, checkout SoPlex from its git repository as a submodule, compile it in some separate directory, and configure the right CMake options when compiling Exact.

By default, the following commands in Exact's root directory should work with a freshly checked out repository:

    git submodule init
    git submodule update

    mkdir soplex_build
    cd soplex_build
    cmake ../soplex -DBUILD_TESTING="0" -DSANITIZE_UNDEFINED="0" -DCMAKE_BUILD_TYPE="Release" -DBOOST="0" -DGMP="0" -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS="0" -DZLIB="0"
    make -j 8

    cd ../build_debug
    cmake .. -DCMAKE_BUILD_TYPE="Release" -Dsoplex="ON"
    make -j 8

The CMake options soplex_src and soplex_build allow to look for SoPlex in a different location.

License

Exact is licensed under the AGPLv3. If this would hinder your intended usage, please contact @JoD.

Benchmarks

The current set of benchmarks which is used to assess performance is available here.

Citations

If you use Exact, please star and cite this repository and cite the RoundingSat origin paper (which focuses on cutting planes conflict analysis):
[EN18] J. Elffers, J. Nordström. Divide and Conquer: Towards Faster Pseudo-Boolean Solving. IJCAI 2018

Please cite any of the following papers if they are relevant.

Integration with SoPlex:
[DGN20] J. Devriendt, A. Gleixner, J. Nordström. Learn to Relax: Integrating 0-1 Integer Linear Programming with Pseudo-Boolean Conflict-Driven Search. CPAIOR 2020 / Constraints journal

Watched propagation:
[D20] J. Devriendt. Watched Propagation for 0-1 Integer Linear Constraints. CP 2020

Core-guided optimization:
[DGDNS21] J. Devriendt, S. Gocht, E. Demirović, J. Nordström, P. J. Stuckey. Cutting to the Core of Pseudo-Boolean Optimization: Combining Core-Guided Search with Cutting Planes Reasoning. AAAI 2021

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

Exact-2.1.0-cp312-cp312-win_amd64.whl (857.1 kB view details)

Uploaded CPython 3.12 Windows x86-64

Exact-2.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

Exact-2.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

Exact-2.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.27+ x86-64 manylinux: glibc 2.28+ x86-64

File details

Details for the file Exact-2.1.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: Exact-2.1.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 857.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for Exact-2.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 10a382a156a3e03499f8b222c133180719ecf4cd6bab4bec5480488a887a308f
MD5 612a1e4f7871878a3a0b2c917ba5517a
BLAKE2b-256 09b93cb6f2ec3850a4bcf1e5093d7a5226779508e9c62653feccaea79ba13b69

See more details on using hashes here.

File details

Details for the file Exact-2.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for Exact-2.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c69fe32a4a9f90394b853c4df823f9ffb592e543cb46c4f6b4deac432015e7a1
MD5 23d469e7c362e4cefafea4fdfbf5a312
BLAKE2b-256 32a9208cc147859d2df78e60082a397e90f27a0cee093cd0d26dcd9187cf0c6c

See more details on using hashes here.

File details

Details for the file Exact-2.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for Exact-2.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dbf55e0e9a608a7203a2ff92577d8793fceaf722c87dd4d038e4e71d7e82ff3a
MD5 2f08ec414c2b3d4264467291a05e03c3
BLAKE2b-256 9cf2a7c9f4b5e2439d9440258fb4b83640b4c20c3447fba7412a12d3fd6487a0

See more details on using hashes here.

File details

Details for the file Exact-2.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for Exact-2.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7421d3630767fe94552f709536a389bffb8d67c1584ea1a4647992bfd801e1d0
MD5 4aa1f213be0ee5262fb809ef331e62aa
BLAKE2b-256 5fe9d51fa1e790f9af446493bc84757c26d5658615809aafd4f5f2ddc59df281

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page