Skip to main content

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.
  • Fine-grained employment of arbitrary precision calculations - only 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.
  • Python interface with assumption solving and reuse of solver state (Linux only for now).
  • Generation of certificates of optimality and unsatisfiability that can be automatically verified by VeriPB.
  • Excellent performance, as showcased in 2024's PB competition.

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
    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

Industrial use cases

After considering Gurobi and OR-tools to extract minimal unsatisfiable subsets for a workforce allocation problem, a big European airplane manufacturer decided Exact was the way to go! (mirror)

Release files for Exact 2.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for Exact 2.2.1
File
exact-2.2.1-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
exact-2.2.1-cp313-cp313-manylinux_2_34_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ x86-64 Details
exact-2.2.1-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
exact-2.2.1-cp312-cp312-manylinux_2_34_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ x86-64 Details
exact-2.2.1-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
exact-2.2.1-cp311-cp311-manylinux_2_34_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ x86-64 Details
exact-2.2.1-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
exact-2.2.1-cp310-cp310-manylinux_2_34_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.34+ x86-64 Details

Total release size: 9.0 MB

Release files / exact-2.2.1-cp313-cp313-win_amd64.whl

Download URL exact-2.2.1-cp313-cp313-win_amd64.whl
Size 912.5 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
8ed9b16af2ce61247f3d5e7284ee40fd7766ffa3d13d975b7ab358e895bb9111
BLAKE2b-256 checksum
How to use checksums
cbc4e296ccb98ad1b0fe2471f067ecc5605c764c6edd8808e44388a42417bf49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.5

Release files / exact-2.2.1-cp313-cp313-manylinux_2_34_x86_64.whl

Download URL exact-2.2.1-cp313-cp313-manylinux_2_34_x86_64.whl
Size 1.3 MB
Tags CPython 3.13 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
6605e445d97063fc7ec5691df64949e1a418efaa43fe3870708f24904a1a4ab2
BLAKE2b-256 checksum
How to use checksums
16a70d158306bcc8bd1f529c817ae8851c822b69793eceff5f1dba883b0575fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.5

Release files / exact-2.2.1-cp312-cp312-win_amd64.whl

Download URL exact-2.2.1-cp312-cp312-win_amd64.whl
Size 912.5 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
732ff1276dcbef456274f0d8411596ed10200ce34ee76bea44026026ba0d1531
BLAKE2b-256 checksum
How to use checksums
7713021175e9e3fe9211db246633efddec64b718089087ec6745bced0b42c3df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.1.0 CPython/3.12.3

Release files / exact-2.2.1-cp312-cp312-manylinux_2_34_x86_64.whl

Download URL exact-2.2.1-cp312-cp312-manylinux_2_34_x86_64.whl
Size 1.3 MB
Tags CPython 3.12 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
c8c5622cc0c219324ee5882d07dc850a6ef73b94051a0d0dd9968f615a327a72
BLAKE2b-256 checksum
How to use checksums
cf3ef7a98e7ad01c2ebc6161830b6fba0c359883aa605a6051f46abce45f92ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.5

Release files / exact-2.2.1-cp311-cp311-win_amd64.whl

Download URL exact-2.2.1-cp311-cp311-win_amd64.whl
Size 912.2 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
91aa45bc51079b79ec37328539303a45ec768553cc7d7cae413871943c4517f9
BLAKE2b-256 checksum
How to use checksums
f80999d3022d1631cb81ce10b92fd87e36be4633b0eea2d358a2197a24331d88
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.5

Release files / exact-2.2.1-cp311-cp311-manylinux_2_34_x86_64.whl

Download URL exact-2.2.1-cp311-cp311-manylinux_2_34_x86_64.whl
Size 1.3 MB
Tags CPython 3.11 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
5ebde005153ccd9dce4be444928db44cc40e869d181bacb2e1ca5b8bc859b039
BLAKE2b-256 checksum
How to use checksums
3121dae42e0b4b214e7bd03f24049faefc4f90fdcb9eabc30d288246696872c7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.13

Release files / exact-2.2.1-cp310-cp310-win_amd64.whl

Download URL exact-2.2.1-cp310-cp310-win_amd64.whl
Size 911.4 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
cd2d9803cfa2dabea06932e351d30004ce2792b3d6e3b5c22ab2eaa89078baf3
BLAKE2b-256 checksum
How to use checksums
6fd8ff5bd2ff900a8be941ae6a71c1708f0a592d5cae101c22556f6a2bcad781
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.11

Release files / exact-2.2.1-cp310-cp310-manylinux_2_34_x86_64.whl

Download URL exact-2.2.1-cp310-cp310-manylinux_2_34_x86_64.whl
Size 1.3 MB
Tags CPython 3.10 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
f217303e599a785951478e4570e17449645913d2d6f20309c15a32e6c592160c
BLAKE2b-256 checksum
How to use checksums
94d768d3869b3c185e7e0447865efb6453a7e8fdaadd083a434fd90d113c9d16
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.18

Release history Release notifications | RSS feed

This release

2.2.1 This release

8 release files

2.1.2

1 release file

2.1.1

1 release file

2.1.0

4 release files

2.0.0

4 release files

1.2.1

1 release file

1.2.0

1 release file

1.1.5

1 release file

1.1.4

1 release file

1.1.3

1 release file

1.1.2

1 release file

1.1.1

1 release file

1.0.3

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page