CPSE
CPSE (Constraint Programming Scheduling Engine) is a scheduling engine that encodes scheduling problems as constraint satisfaction models and solves them using the CP-SAT solver from Google OR-Tools.
CPSE offers two scheduling engines, each supporting different problem kinds:
-
cpse: Supports scheduling problems with optional activities and scoped constraints. Partial support for fluents is provided: only increase and decrease effects on non-parametric fluents are handled, while assignment effects are not supported.
-
cpse-timepoints: Supports scheduling problems without optional activities. Offers full support for fluents, but is generally more computationally intensive.
Installation
pip install up-cpse
To try the latest unreleased build, install a wheel directly from the rolling
dev pre-release:
pip install --pre <url-of-wheel-on-dev-release>
Usage
CPSE is fully integrated with the Unified Planning framework. Before using CPSE, register its engines in the Unified Planning environment:
from unified_planning.shortcuts import *
# Register CPSE engines
env = get_environment()
env.factory.add_engine("cpse", "cpse", "CPSE")
env.factory.add_engine("cpse-timepoints", "cpse", "CPSETimepoints")
# Define your scheduling problem
scheduling_problem = ...
# Solve the problem using the cpse engine
with OneshotPlanner(name="cpse") as planner:
result = planner.solve(scheduling_problem)
print(result.plan)
Parameters
The CPSE engines support the following configuration parameters:
| Parameter | Type | Default Value | Description |
|---|---|---|---|
lower_bound |
int | 0 |
Minimum value for all model variables if not explicitly specified in the problem. |
upper_bound |
int | INT32_MAX |
Maximum value for all model variables if not explicitly specified in the problem (INT32_MAX = 2^31 - 1). |
These parameters can be passed as a dictionary to OneshotPlanner:
params = {
"lower_bound": 1,
"upper_bound": 100
}
with OneshotPlanner(name="cpse", params=params) as planner:
result = planner.solve(scheduling_problem)
print(result.plan)
Tip: Adjusting these bounds can help restrict variable domains or improve solver performance for specific scheduling problems.
Development
CPSE uses uv to manage the environment and just as a task runner. After cloning:
just install # uv sync — create .venv from uv.lock
Common tasks:
just test # run the pytest suite
just lint # ruff lint + format checks
just format # auto-fix lint issues and format
just typecheck # mypy
just precommit # run all pre-commit hooks against the whole repo
just build # build sdist + wheel into ./dist/
Install the git hook so the checks run automatically on each commit:
uv run pre-commit install
Running just --list shows all available recipes.
References
CPSE has been used in the following research paper:
- Elisa Tosello, Arthur Bit-Monnot, Davide Lusuardi, Alessandro Valentini and Andrea Micheli (2026). Interleaving Scheduling and Motion Planning with Incremental Learning of Symbolic Space-Time Motion Abstractions. ICAPS 2026
License
CPSE is released under the GNU General Public License v3.0 (GPL-3.0).
See the LICENSE file for full details.
Contact
For questions, bug reports, or contributions, please open an issue on GitHub or contact the authors at pso-tools@fbk.eu.
Release files for up-cpse 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| up_cpse-0.1.0.tar.gz | 36.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| up_cpse-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 74.4 kB
Release files / up_cpse-0.1.0.tar.gz
| Download URL | up_cpse-0.1.0.tar.gz |
|---|---|
| Size | 36.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9b4ef71a99243094f1e8d360e5875b0223e58b2095b747ade9346bbd5e78c5c6
|
|
BLAKE2b-256 checksum How to use checksums |
1b3a25ab9c6cdc52af23f7b806c71b2e5bfcf69eeabce9bc566f113686743bcd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 13, 2026.
Transparency logRelease files / up_cpse-0.1.0-py3-none-any.whl
| Download URL | up_cpse-0.1.0-py3-none-any.whl |
|---|---|
| Size | 38.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c9e75ebd76fdfeaa4d8e0fe0da41f855ac1c7c58bba0f7009be0d555b85348c6
|
|
BLAKE2b-256 checksum How to use checksums |
b86cfcefdc8958a56b16614e92cefdcf3953fbdeffe6c83a23223ee7c23ba5cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 13, 2026.
Transparency log