ADR-006: SimPy for Discrete Event Simulation¶
Status: IMPLEMENTED - 2025-01-15
Context¶
Need a discrete event simulation framework for modeling Pop-Up workshop operations with individual wagon tracking and resource management.
Decision¶
Use SimPy as the simulation engine.
Rationale¶
- Proven in POC: Successfully validated during 3-Länderhack 2024 hackathon
- Python native: Integrates seamlessly with Python ecosystem
- Discrete event paradigm: Perfect fit for workshop operations simulation
- Deterministic: Supports reproducible results
- Well-documented: Mature library with good community support
- Lightweight: No heavy infrastructure requirements
Alternatives Considered¶
- SimPy ✅ Chosen
- Mesa: Agent-based, overkill for our use case
- Custom simulation: Too much development effort
- AnyLogic: Commercial, not open source
Implementation in MVP¶
Core SimPy Usage¶
# workshop_operations/infrastructure/simulation/simpy_adapter.py
class SimulationAdapter:
def __init__(self):
self.env = simpy.Environment()
def create_resource(self, capacity: int) -> simpy.Resource:
return simpy.Resource(self.env, capacity)
def create_store(self, capacity: int = float('inf')) -> simpy.Store:
return simpy.Store(self.env, capacity)
# workshop_operations/application/orchestrator.py
class WorkshopOrchestrator:
def run(self, until: float) -> None:
self.sim.run_process(process_train_arrivals, self)
self.sim.run_process(pickup_wagons_to_retrofit, self)
self.sim.run_process(move_wagons_to_stations, self)
self.sim.run(until)
SimPy Resources and Stores¶
- Workshop Stations:
simpy.Resourcefor retrofit station capacity - Locomotive Pool:
simpy.Storefor locomotive availability - Workflow Coordination:
simpy.Storefor wagon flow between processes - Event Scheduling:
simpy.Environmentfor deterministic time progression
Consequences¶
Achieved¶
- ✅ Deterministic Results: Reproducible simulation runs with same seed
- ✅ Resource Management: SimPy Resources handle workshop station blocking
- ✅ Event-Driven Workflow: SimPy Stores eliminate polling delays
- ✅ Process Coordination: 5 concurrent processes coordinate via SimPy primitives
- ✅ Abstraction Layer: SimulationAdapter isolates SimPy dependencies
Files Implementing This Decision¶
workshop_operations/infrastructure/simulation/simpy_adapter.py- SimPy abstractionworkshop_operations/application/orchestrator.py- Main simulation orchestrationworkshop_operations/infrastructure/resources/- Resource management with SimPy