This release is a pre-release and may not be stable for production use.
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 Problem, Types
from xqvm_py import XQMXDomain
problem = Problem("Triangle")
n = problem.input("n", type=Types.Int)
edges = problem.input("edges", type=Types.Vec)
problem.define_model(size=n, domain=XQMXDomain.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.
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
Fourteen 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.0rc1
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.0rc1.tar.gz | 32.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xqcp-0.4.0rc1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 57.9 kB
Release files / xqcp-0.4.0rc1.tar.gz
| Download URL | xqcp-0.4.0rc1.tar.gz |
|---|---|
| Size | 32.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3cd291fc9c23b38e84fd795b10eae0841780fd66b1c64986cb08d9df288a257f
|
|
BLAKE2b-256 checksum How to use checksums |
982a1958f756cdb6e1b0f82d96d72835c7d9a3e2d8490bf37417b0c081c91058
|
| 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.0rc1-py3-none-any.whl
| Download URL | xqcp-0.4.0rc1-py3-none-any.whl |
|---|---|
| Size | 25.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5fc2cdf1209fdb56fa35937ca40b18ca4c64d7fac02b9bc09a0fd2ed329012df
|
|
BLAKE2b-256 checksum How to use checksums |
5e90e38d1941dcb9b05b9ca94fa043cbb56fbb1d9fb3433681816c28b4fb2748
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.5
|