### Simulation Module — Engine, Allocator, and Policies Directory: `scheduler/simulation/` This package provides a discrete‑event simulation of the court scheduling system. It generates synthetic case flows (or consumes real‑like parameters), evaluates scheduling/ripeness policies, and produces quantitative outputs and reports. #### Files overview - `engine.py` - Purpose: Main simulation loop and state transition engine. - Key classes: - `CourtSimConfig`: Parameters (capacity, stage transition matrices, adjournment params, filings, horizon, etc.). - `CourtSimResult`: Aggregated outputs produced by a run. - `CourtSim`: The engine orchestrating daily cycles: - `_init_stage_ready()`: initializes stage readiness from configuration. - `_evaluate_ripeness(current)`: classify cases using `core.ripeness.RipenessClassifier`. - `_choose_cases_for_day(current)`: select candidates (potentially via policies/priority). - `_file_new_cases(current, n)`: generate new cases based on expected filings. - `_day_process(current)`: core daily loop combining filings, ripeness, scheduling, hearings, adjournments, and disposals. - `run()`: iterate over the configured horizon; write metrics and event logs. - Interactions: Uses domain models in `scheduler/core/*`, policies in `scheduler/simulation/policies/*`, and allocator. - `allocator.py` - Purpose: Allocate prioritized cases to available courtroom capacity. - Typical responsibilities: respect per‑courtroom limits, avoid duplicate bookings, ensure eligibility constraints. - Interactions: Invoked by both the simulation engine and the core scheduling algorithm. - `policies/` - Purpose: Pluggable case selection strategies. - Files: - `age.py`: age‑based prioritization (older cases first, possibly weighted). - `fifo.py`: first‑in first‑out ordering respecting readiness. - `readiness.py`: prioritization by computed readiness or ripeness score. - Interface: Each policy exposes a common callable/signature expected by `engine.py` and the core algorithm’s policy abstraction (`core/policy.py`). #### Simulation flow (high level) 1) Initialize `CourtSimConfig` from data defaults and parameters. 2) Seed a case population and stage readiness. 3) For each simulated day: file new cases, evaluate ripeness, select cases, allocate to courtrooms, conduct hearings, sample adjournments/next stages/disposals. 4) Persist daily summaries, metrics, and event logs to `outputs/simulation_runs//`.