Skip to main content

Scheduling extension for PyCSP3 with interval variables, sequence variables, and scheduling constraints

Project description

pycsp3-scheduling

Scheduling extension for pycsp3 with interval variables, sequence variables, and scheduling constraints.

Features

  • Interval Variables: Represent tasks/activities with start, end, size, length, and optional presence
  • Intensity Functions: Stepwise intensity metadata with granularity scaling for size/length
  • Sequence Variables: Ordered sequences of intervals on disjunctive resources
  • Precedence Constraints: end_before_start, start_at_start, etc.
  • Grouping Constraints: span, alternative, synchronize
  • Cumulative Functions: pulse, step_at_start, step_at_end for resource modeling
  • State Functions: Model resource states with transitions
  • XCSP3 Extension: Output scheduling models in extended XCSP3 format
  • Visualization: Gantt charts and resource profiles

Installation

pip install pycsp3-scheduling

For development:

git clone https://github.com/sohaibafifi/pycsp3-scheduling.git
cd pycsp3-scheduling
pip install -e ".[dev]"

Quick Start

from pycsp3 import *
from pycsp3_scheduling import *

# Create interval variables for tasks
task1 = IntervalVar(size=10, name="task1")
task2 = IntervalVar(size=15, name="task2")
task3 = IntervalVar(size=8, name="task3")

# Precedence: task1 must finish before task2 starts
satisfy(end_before_start(task1, task2))

# No overlap: task2 and task3 cannot overlap
satisfy(SeqNoOverlap([task2, task3]))

# Minimize makespan
minimize(max(end_time(task1), end_time(task2), end_time(task3)))

Example: Job Shop Scheduling

from pycsp3 import *
from pycsp3_scheduling import *

# Data
n_jobs, n_machines = 3, 3
durations = [[3, 2, 2], [2, 1, 4], [4, 3, 3]]
machines = [[0, 1, 2], [0, 2, 1], [1, 0, 2]]

# Create interval variables for each operation
ops = [[IntervalVar(size=durations[j][o], name=f"op_{j}_{o}")
        for o in range(n_machines)] for j in range(n_jobs)]

# Sequences for each machine
sequences = [SequenceVar(
    intervals=[ops[j][o] for j in range(n_jobs)
               for o in range(n_machines) if machines[j][o] == m],
    name=f"machine_{m}"
) for m in range(n_machines)]

# Precedence within jobs
satisfy(
    end_before_start(ops[j][o], ops[j][o+1])
    for j in range(n_jobs) for o in range(n_machines-1)
)

# No overlap on machines
satisfy(SeqNoOverlap(seq) for seq in sequences)

# Minimize makespan
minimize(Maximum(end_time(ops[j][-1]) for j in range(n_jobs)))

Example: RCPSP (Resource-Constrained Project Scheduling)

from pycsp3 import *
from pycsp3_scheduling import *

# Data
durations = [3, 2, 5, 4, 2]
demands = [[2, 1], [1, 2], [3, 0], [2, 1], [1, 3]]
capacities = [4, 3]
precedences = [(0, 2), (1, 3), (2, 4)]

# Interval variables
tasks = [IntervalVar(size=durations[i], name=f"task_{i}")
         for i in range(len(durations))]

# Precedence constraints
satisfy(end_before_start(tasks[p], tasks[s]) for p, s in precedences)

# Cumulative resource constraints
for r in range(len(capacities)):
    resource = sum(pulse(tasks[i], demands[i][r])
                   for i in range(len(tasks)) if demands[i][r] > 0)
    satisfy(resource <= capacities[r])

# Minimize makespan
minimize(Maximum(end_time(t) for t in tasks))

API Reference

Variables

Function Description
IntervalVar(size, start, end, length, intensity, granularity, optional, name) Create an interval variable
IntervalVarArray(size, ...) Create array of interval variables
SequenceVar(intervals, types, name) Create a sequence variable

Expressions

Function Description
start_of(interval, absent_value=0) Start time of interval
end_of(interval, absent_value=0) End time of interval
size_of(interval, absent_value=0) Size/duration of interval
length_of(interval, absent_value=0) Length of interval
presence_of(interval) Boolean presence status

Interop Helpers

Function Description
start_time(interval) pycsp3 variable for start time
end_time(interval) pycsp3 expression for end time

Precedence Constraints

Constraint Semantics (when both present)
start_before_start(a, b, delay) start(b) >= start(a) + delay
start_before_end(a, b, delay) end(b) >= start(a) + delay
end_before_start(a, b, delay) start(b) >= end(a) + delay
end_before_end(a, b, delay) end(b) >= end(a) + delay
start_at_start(a, b, delay) start(b) == start(a) + delay
start_at_end(a, b, delay) start(b) == end(a) + delay
end_at_start(a, b, delay) end(a) == start(b) + delay
end_at_end(a, b, delay) end(b) == end(a) + delay

Grouping Constraints

Constraint Description
span(main, subtasks) Main interval spans all present subtasks
alternative(main, alts, card=1) Select card alternatives matching main
synchronize(main, intervals) All present intervals sync with main

Cumulative Functions

Function Description
pulse(interval, height) Constant consumption during interval
step_at(time, height) Step at fixed time point
step_at_start(interval, height) Step at interval start
step_at_end(interval, height) Step at interval end
cumul_range(cumul, min, max) Constrain cumul to [min, max]

State Functions

Function Description
StateFunction(transition_matrix) Create state function
always_in(func, interval, min, max) State in range during interval
always_equal(func, interval, value) State equals value during interval
always_constant(func, interval) State constant during interval

Requirements

  • Python >= 3.10
  • pycsp3 >= 2.5
  • lxml >= 4.9
  • matplotlib >= 3.7 (optional, for visualization)
  • java >= 8 (optional, for solving with ACE/Choco)

License

MIT License - see LICENSE file.

References

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pycsp3_scheduling-0.2.2.tar.gz (385.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pycsp3_scheduling-0.2.2-py3-none-any.whl (70.3 kB view details)

Uploaded Python 3

File details

Details for the file pycsp3_scheduling-0.2.2.tar.gz.

File metadata

  • Download URL: pycsp3_scheduling-0.2.2.tar.gz
  • Upload date:
  • Size: 385.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pycsp3_scheduling-0.2.2.tar.gz
Algorithm Hash digest
SHA256 0d30202c4167e8c558ffbd5e86f25cbafe39eacf111af8148f301b4069d3d57d
MD5 8f9b115ca38893714d4d97241edf6855
BLAKE2b-256 515db790fa6e127ce9936170a833b8902fcac672eaf3a6f8917bdd7cd920e986

See more details on using hashes here.

Provenance

The following attestation bundles were made for pycsp3_scheduling-0.2.2.tar.gz:

Publisher: publish.yml on sohaibafifi/pycsp3-scheduling

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pycsp3_scheduling-0.2.2-py3-none-any.whl.

File metadata

File hashes

Hashes for pycsp3_scheduling-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 879d1610c193e08a497cfd67453016ea195e9d6279d6a7a21bd27c5e13a55661
MD5 1fefc5450650509f312bda12244e9edc
BLAKE2b-256 e8279624b0bdd9aee54f617f55a5602af6841fa859e4ca917b49a905aa874039

See more details on using hashes here.

Provenance

The following attestation bundles were made for pycsp3_scheduling-0.2.2-py3-none-any.whl:

Publisher: publish.yml on sohaibafifi/pycsp3-scheduling

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page