XQCP -- X-Quadratic Constraint Programmer
A constraint-programming DSL that compiles a problem description into three XQVM assembly programs: an encoder, a verifier, and a decoder. See Three Programs for what those three are and why there are three.
Install
pip install xqcp
A complete example
Max-Cut for three nodes -- the same graph
Quadratic Models
derives by hand -- built with Problem and compiled to .xqasm:
from xqcp import Domain, Problem, Types
problem = Problem("Triangle")
n = problem.input("n", type=Types.Int)
edges = problem.input("edges", type=Types.Vec)
problem.define_model(size=n, domain=Domain.BINARY)
edge_count = problem.stow("edge_count", edges.veclen() // 3)
with problem.range(0, edge_count) as e:
offset = e * 3
i = problem.stow("i", edges.get(offset))
j = problem.stow("j", edges.get(offset + 1))
w = problem.stow("w", edges.get(offset + 2))
problem.model.linear[i].add(-w)
problem.model.linear[j].add(-w)
problem.model.quadratic[i, j].add(w * 2)
partition = problem.output("partition", type=Types.Vec)
with problem.range(0, n) as node:
partition.append(problem.sample.getline(node))
programs = problem.compile()
print(programs.encoder.count("\n"), "lines in the compiled encoder")
# 57 lines in the compiled encoder
programs.encoder builds the model; programs.verifier checks a sample
against it and computes its energy; programs.decoder reads a sample back
into a partition. Each is a standalone .xqasm string, runnable through
any XQVM interpreter.
Domain also covers integer variables (INTEGER with k=, or with
lo=/hi= for a range XQCP shifts into the model and back out through
sample.value()) and unordered cases (CATEGORICAL with k= and
penalty=, recorded as a one-hot binary grid read with sample.case()).
The Modelling
chapter covers each form and what constraints are available on it.
How it works
Problem records every DSL call (input, define_model, range,
stow, model.linear[i].add(w), and the rest) as an Action. Nothing is
assembled until compile() runs: it walks the recorded actions once per
program and emits assembly with automatic register allocation and loop
nesting.
DSL reference
The full DSL -- inputs, expressions, objectives, constraints, control flow,
outputs, and what compile() produces -- is
Modelling,
eight chapters built around this exact package. The normative reference is
spec/xqcp/SPEC.md;
this package follows it, and any divergence here is a bug.
Examples
Fifteen complete problems built with this DSL, from Max-Cut to Travelling Salesman, are listed in the example gallery.
Also see
xqvm_py-- pure-Python reference VM that runs the compiled programs.xqffi-- pyo3 FFI bindings to the Rust runtime.xqsa-- solver adapters for the models this package builds.xquad-- umbrella meta-package.
License
AGPL-3.0-or-later.
Release files for xqcp 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| xqcp-0.4.1.tar.gz | 45.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xqcp-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 78.0 kB
Release files / xqcp-0.4.1.tar.gz
| Download URL | xqcp-0.4.1.tar.gz |
|---|---|
| Size | 45.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c04f6b802a9c019ffa15c63a0d7dcba45f49fc2e723ed3b382cbd23ba7cf9ae3
|
|
BLAKE2b-256 checksum How to use checksums |
c5e8b822315da2b85f40e025e62a9ec1a52d94be0c192de2710f69539d2c425e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|
Release files / xqcp-0.4.1-py3-none-any.whl
| Download URL | xqcp-0.4.1-py3-none-any.whl |
|---|---|
| Size | 32.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1881970209bfcbe7486edf15c4c7a27c58f01cac53c26ef490495a9528be0318
|
|
BLAKE2b-256 checksum How to use checksums |
e27f08898d7588537c0980ef376046aa1d644ca165bf57258852ec14f8fa68ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|