pmcontrols
Project scheduling and earned value control for Python. Critical path analysis, PERT with Monte Carlo schedule risk, minimum-cost crashing, and earned value with Lipke's earned schedule. Every released number is checked against published reference values on every CI run.
pip install pmcontrols
Sixty seconds
import pmcontrols as pm
activities = [
{"id": "A", "predecessors": [], "duration": 2},
{"id": "B", "predecessors": [], "duration": 3},
{"id": "C", "predecessors": ["A"], "duration": 2},
{"id": "D", "predecessors": ["B"], "duration": 4},
{"id": "E", "predecessors": ["C"], "duration": 4},
{"id": "F", "predecessors": ["C"], "duration": 3},
{"id": "G", "predecessors": ["D", "E"], "duration": 5},
{"id": "H", "predecessors": ["F", "G"], "duration": 2},
]
r = pm.cpm(activities)
print(r.summary())
pmcontrols cpm - 2026-06-13T00:00:00+00:00
project_duration 15.0000
n_activities 8.0000
n_critical 5.0000
Verdict: on track - no indicator breaches thresholds.
The critical path is A-C-E-G-H at 15 periods, with B, D and F carrying slack. This is the standard General Foundry result, reproduced exactly in the validation suite.
Plan once, freeze, control forever
pm.plan(periods, pv_curve).save("pmb.json") # commit to git
r = pm.evm("pmb.json", ev=30_000, ac=35_000, at=4)
r.ok # False if CPI or SPI(t) is below threshold
r.stats["ieac_t"] # earned-schedule duration forecast
See the guides for the critical path, schedule risk, crashing, and earned value, and the reference section for the full API and the validation methodology.