Skip to main content

bindings to picosat (a SAT solver)

Project description

PicoSAT is a popular SAT solver written by Armin Biere in pure C. This package provides efficient Python bindings to picosat on the C level, i.e. when importing pycosat, the picosat solver becomes part of the Python process itself. For ease of deployment, the picosat source (namely picosat.c and picosat.h) is included in this project. These files have been extracted from the picosat source (picosat-957.tar.gz).

Usage

The pycosat module has two functions solve and itersolve, both of which take an iterable of clauses as an argument. Each clause is itself represented as an iterable of (non-zero) integers.

The function solve returns one of the following:
  • one solution (a list of integers)

  • the string “UNSAT” (when the clauses are unsatisfiable)

  • the string “UNKNOWN” (when a solution could not be determined within the propagation limit)

The function itersolve returns an iterator over solutions. When the propagation limit is specified, exhausting the iterator may not yield all possible solutions.

Both functions take the following keyword arguments:
  • prop_limit: the propagation limit (integer)

  • vars: number of variables (integer)

  • verbose: the verbosity level (integer)

Example

Let us consider the following clauses, represented using the DIMACS cnf format:

p cnf 5 3
1 -5 4 0
-1 5 3 4 0
-3 -4 0

Here, we have 5 variables and 3 clauses, the first clause being (x1 or not x5 or x4). Note that the variable x2 is not used in any of the clauses, which means that for each solution with x2 = True, we must also have a solution with x2 = False. In Python, each clause is most conveniently represented as a list of integers. Naturally, it makes sense to represent each solution also as a list of integers, where the sign corresponds to the Boolean value (+ for True and - for False) and the absolute value corresponds to ith variable:

>>> import pycosat
>>> cnf = [[1, -5, 4], [-1, 5, 3, 4], [-3, -4]]
>>> pycosat.solve(cnf)
[1, -2, -3, -4, 5]

This solution translates to: x1 = x5 = True, x2 = x3 = x4 = False

To find all solutions, use itersolve:

>>> for sol in pycosat.itersolve(cnf):
...     print sol
...
[1, -2, -3, -4, 5]
[1, -2, -3, 4, -5]
[1, -2, -3, 4, 5]
...
>>> len(list(pycosat.itersolve(cnf)))
18

In this example, there are a total of 18 possible solutions, which had to be an even number because x2 was left unspecified in the clauses.

The fact that itersolve returns an iterator, makes it very elegant and efficient for many types of operations. For example, using the itertools module from the standard library, here is how one would construct a list of (up to) 3 solutions:

>>> import itertools
>>> list(itertools.islice(pycosat.itersolve(cnf), 3))
[[1, -2, -3, -4, 5], [1, -2, -3, 4, -5], [1, -2, -3, 4, 5]]

Implementation of itersolve

How does one go from having found one solution to another solution? The answer is surprisingly simple. One adds the inverse of the already found solution as a new clause. This new clause ensures that another solution is searched for, as it excludes the already found solution. Here is basically a pure Python implementation of itersolve in terms of solve:

def py_itersolve(clauses): # don't use this function!
    while True:            # (it is only here to explain things)
        sol = pycosat.solve(clauses)
        if isinstance(sol, list):
            yield sol
            clauses.append([-x for x in sol])
        else: # no more solutions -- stop iteration
            return

This implementation has several problems. Firstly, it is quite slow as pycosat.solve has to convert the list of clauses over and over and over again. Secondly, after calling py_itersolve the list of clauses will be modified. In pycosat, itersolve is implemented on the C level, making use of the picosat C interface (which makes it much, much faster than the naive Python implementation above).

Project details


Download files

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

Source Distribution

pycosat-0.6.1.tar.gz (59.3 kB view details)

Uploaded Source

Built Distributions

pycosat-0.6.1-cp34-none-win_amd64.whl (48.6 kB view details)

Uploaded CPython 3.4Windows x86-64

pycosat-0.6.1-cp34-none-win32.whl (41.9 kB view details)

Uploaded CPython 3.4Windows x86

pycosat-0.6.1-cp33-none-win_amd64.whl (48.6 kB view details)

Uploaded CPython 3.3Windows x86-64

pycosat-0.6.1-cp33-none-win32.whl (41.9 kB view details)

Uploaded CPython 3.3Windows x86

pycosat-0.6.1-cp27-none-win_amd64.whl (47.0 kB view details)

Uploaded CPython 2.7Windows x86-64

pycosat-0.6.1-cp27-none-win32.whl (40.4 kB view details)

Uploaded CPython 2.7Windows x86

File details

Details for the file pycosat-0.6.1.tar.gz.

File metadata

  • Download URL: pycosat-0.6.1.tar.gz
  • Upload date:
  • Size: 59.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for pycosat-0.6.1.tar.gz
Algorithm Hash digest
SHA256 d438c488da6dd7bbb23ca8ac10531f1fbbd117bdbc2e6245382c1fe202e483ce
MD5 c1fc35b17865f5f992595ae0362f9f9f
BLAKE2b-256 760f16edae7bc75b79376f2c260b7a459829785f08e463ecf74a8ccdef62dd4a

See more details on using hashes here.

File details

Details for the file pycosat-0.6.1-cp34-none-win_amd64.whl.

File metadata

File hashes

Hashes for pycosat-0.6.1-cp34-none-win_amd64.whl
Algorithm Hash digest
SHA256 238a1d8695ad894e40a70235d020d33ab0bfdc3901715bcc77c7dee522173def
MD5 ec18e86aaf5a5f65a93219f28aed96e6
BLAKE2b-256 22df9ce078a789ef6e4028acd23076eca906ad30be8111815ca0a2efe5b2f6b3

See more details on using hashes here.

File details

Details for the file pycosat-0.6.1-cp34-none-win32.whl.

File metadata

File hashes

Hashes for pycosat-0.6.1-cp34-none-win32.whl
Algorithm Hash digest
SHA256 d874b86eadcc36f743d6bde9bd72608f6ca839ab02d72130725a195722f6060d
MD5 5db3026d7d51ab06ac2b270da979ddfe
BLAKE2b-256 fdb71d7da5b5983f7052f94c4705f43e0d7cfc5a54e34db4a7a669ed20f1fd44

See more details on using hashes here.

File details

Details for the file pycosat-0.6.1-cp33-none-win_amd64.whl.

File metadata

File hashes

Hashes for pycosat-0.6.1-cp33-none-win_amd64.whl
Algorithm Hash digest
SHA256 e16021fd8343b45f75563d783ddfee228d627a38c0dfba0bd66845734ae80b9a
MD5 167bc85ec7fdbb23e3a7548e212936fc
BLAKE2b-256 95507354a9727fb27450308e047d07c782c1f04584f869c3199d03107a420d65

See more details on using hashes here.

File details

Details for the file pycosat-0.6.1-cp33-none-win32.whl.

File metadata

File hashes

Hashes for pycosat-0.6.1-cp33-none-win32.whl
Algorithm Hash digest
SHA256 665d40accca8bb7098ea022578b36d242f72922c96cd109a614c3a7237f685ca
MD5 06eb3149b85032735c30edd2484d5d67
BLAKE2b-256 d9e6c4b89af0f362fed3da895eaba3d91adbc51e2d61d596896ec2c05a51a121

See more details on using hashes here.

File details

Details for the file pycosat-0.6.1-cp27-none-win_amd64.whl.

File metadata

File hashes

Hashes for pycosat-0.6.1-cp27-none-win_amd64.whl
Algorithm Hash digest
SHA256 0597e8588ba9e01c63653814f3a8e7c9377c150fe09980036786a03c286d2f45
MD5 244f426dcba8aab45cbf9f5f788b3bf5
BLAKE2b-256 4256e59d0ce4034a2f8772094b5aa2ea0f7857480826f48c21a86f36c0a82c0f

See more details on using hashes here.

File details

Details for the file pycosat-0.6.1-cp27-none-win32.whl.

File metadata

File hashes

Hashes for pycosat-0.6.1-cp27-none-win32.whl
Algorithm Hash digest
SHA256 c1ce640a2378f56599de6362423e1f98a1f9ef863bf2a94c393ab8e01514b46d
MD5 595f5352a9aee90466e352a2869f2fa9
BLAKE2b-256 32bef6ee46a171fac90bddd02bdc9362601732006e41166cdb92ebaf24df1d73

See more details on using hashes here.

Supported by

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