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.
CPSE is not yet available on PyPI, but you can install it directly from the source repository. The required Google OR-Tools package will be installed automatically.
pip install git+https://github.com/fbk-pso/cpse.gitCPSE 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)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.
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
CPSE is released under the GNU Lesser General Public License v3.0 (LGPL-3.0).
See the LICENSE file for full details.
For questions, bug reports, or contributions, please open an issue on GitHub or contact the authors.