Metadata-Version: 2.4
Name: compwa-python-constraint
Version: 1.4.0.post1
Summary: Support for handling constraint-solving problems over finite domains
Author-email: Gustavo Niemeyer <gustavo@niemeyer.net>
License-Expression: BSD-2-Clause
Project-URL: Documentation, https://python-constraint.github.io/python-constraint
Project-URL: Issues, https://github.com/ComPWA/python-constraint/issues
Project-URL: Repository, https://github.com/ComPWA/python-constraint
Keywords: CSP,constraint solving,problem solver
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Cython
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Topic :: Scientific/Engineering
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: dev
Requires-Dist: check-manifest; extra == "dev"
Requires-Dist: nose; extra == "dev"
Provides-Extra: test
Requires-Dist: coverage; extra == "test"
Requires-Dist: nose; extra == "test"
Dynamic: license-file

[![CI](https://github.com/ComPWA/python-constraint/actions/workflows/ci.yml/badge.svg)](https://github.com/ComPWA/python-constraint/actions/workflows/ci.yml)

# compwa-python-constraint

> [!NOTE]
> This is a packaging fork of [python-constraint 1.4.0](https://github.com/python-constraint/python-constraint/tree/1.4.0), maintained by the [ComPWA project](https://compwa.github.io). It is published as [compwa-python-constraint](https://pypi.org/project/compwa-python-constraint), but preserves the public `constraint` import package and the behavior of the upstream 1.4.0 solver.

## Why this fork exists

The upstream 1.4.0 release on
[PyPI](https://pypi.org/project/python-constraint/1.4.0) provides only a
`.tar.bz2` source distribution.
[PEP 625](https://peps.python.org/pep-0625/) standardized source distributions
as gzip-compressed `.tar.gz` archives. In version 0.12.0,
[uv stopped accepting legacy source-distribution formats](https://github.com/astral-sh/uv/releases/tag/0.12.0#breaking-changes),
including `.tar.bz2`, and recommends rebuilding affected packages as `.tar.gz`
archives.

This fork makes that packaging-only update so projects can continue using the
1.4.0 implementation with current Python packaging tools. Its declarative
`pyproject.toml` build produces:

- a pure-Python `py3-none-any` wheel, which installers can use without a local
  build step; and
- a standards-compliant `.tar.gz` source distribution as a fallback.

The distribution is versioned as `1.4.0.post1` to identify it as a downstream
packaging revision. Solver changes continue to belong in the
[upstream project](https://github.com/python-constraint/python-constraint).

## Introduction

The Python constraint module offers solvers for
[Constraint Satisfaction Problems (CSPs)](https://en.wikipedia.org/wiki/Constraint_satisfaction_problem)
over finite domains in simple and pure Python. A CSP can be represented in
terms of variables, their possible domains, and constraints between them.

## Examples

### Basics

```python
>>> from constraint import *
>>> problem = Problem()
>>> problem.addVariable("a", [1, 2, 3])
>>> problem.addVariable("b", [4, 5, 6])
>>> problem.getSolutions()
[{'a': 3, 'b': 6}, {'a': 3, 'b': 5}, {'a': 3, 'b': 4},
 {'a': 2, 'b': 6}, {'a': 2, 'b': 5}, {'a': 2, 'b': 4},
 {'a': 1, 'b': 6}, {'a': 1, 'b': 5}, {'a': 1, 'b': 4}]

>>> problem.addConstraint(lambda a, b: a * 2 == b, ("a", "b"))
>>> problem.getSolutions()
[{'a': 3, 'b': 6}, {'a': 2, 'b': 4}]

>>> problem = Problem()
>>> problem.addVariables(["a", "b"], [1, 2, 3])
>>> problem.addConstraint(AllDifferentConstraint())
>>> problem.getSolutions()
[{'a': 3, 'b': 2}, {'a': 3, 'b': 1}, {'a': 2, 'b': 3},
 {'a': 2, 'b': 1}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}]
```

### Rooks problem

```python
>>> problem = Problem()
>>> numpieces = 8
>>> cols = range(numpieces)
>>> rows = range(numpieces)
>>> problem.addVariables(cols, rows)
>>> for col1 in cols:
...     for col2 in cols:
...         if col1 < col2:
...             problem.addConstraint(
...                 lambda row1, row2: row1 != row2,
...                 (col1, col2),
...             )
>>> solutions = problem.getSolutions()
```

### Magic squares

```python
>>> problem = Problem()
>>> problem.addVariables(range(16), range(1, 17))
>>> problem.addConstraint(AllDifferentConstraint(), range(16))
>>> problem.addConstraint(ExactSumConstraint(34), [0, 5, 10, 15])
>>> problem.addConstraint(ExactSumConstraint(34), [3, 6, 9, 12])
>>> for row in range(4):
...     problem.addConstraint(
...         ExactSumConstraint(34),
...         [row * 4 + i for i in range(4)],
...     )
>>> for col in range(4):
...     problem.addConstraint(
...         ExactSumConstraint(34),
...         [col + 4 * i for i in range(4)],
...     )
>>> solutions = problem.getSolutions()
```

## Features

The following solvers are available:

- Backtracking solver
- Recursive backtracking solver
- Minimum conflicts solver

Predefined constraint types include:

- `FunctionConstraint`
- `AllDifferentConstraint`
- `AllEqualConstraint`
- `ExactSumConstraint`
- `MaxSumConstraint`
- `MinSumConstraint`
- `InSetConstraint`
- `NotInSetConstraint`
- `SomeInSetConstraint`
- `SomeNotInSetConstraint`

## Installation

```shell
python -m pip install compwa-python-constraint
```

The distribution name is `compwa-python-constraint`, while the import remains
unchanged:

```python
from constraint import Problem
```

## Upstream project

`python-constraint` was written by Gustavo Niemeyer and is maintained at
[python-constraint/python-constraint](https://github.com/python-constraint/python-constraint).
Please report solver bugs and propose behavioral changes
[upstream](https://github.com/python-constraint/python-constraint/issues).

For packaging issues specific to this fork, use the
[ComPWA issue tracker](https://github.com/ComPWA/python-constraint/issues).
