Architecture & Design
Core Classes
FacilityEpiSim (builders/)
Role: Main simulation controller and Repast builder
Key Methods: - build(Context<Object>) - Initializes simulation
Responsibilities: - Creates Facility region and facility containesrs - Creates all HCW and process agents
Facility (agentcontainers/)
Role: Healthcare facility container and primary agent
Key Attributes: - currentPatients - LinkedList of active patients - outbreaks - ArrayList of disease FacilityOutbreak agents - avgPopulation - Running average daily census
Key Methods: - admitNewPatient() / admitPatient() - Intake process - dischargePatient() - Discharge and cleanup - updateTransmissionRate() - Recalculate beta for all diseases - getRandomLOS() - Sample length of stay
Responsibilities: - Patient management (admission/discharge) - Transmission rate updates - Surveillance scheduling - Statistics tracking
Person (agents/)
Role: Individual patient agent
Key Attributes: - personDiseases - ArrayList of PersonDisease (one per disease type) - currentFacility - Reference to containing Facility - currentLOS - Length of stay counter - isIsolated - Isolation status
Key Methods: - admitToFacility() - Initialize facility reference - startDischargeTimer() - Schedule discharge event - isolate() - Enter isolation - doSurveillanceTest() - Respond to surveillance - updateAllTransmissionRateContributions() - Update facility beta
Responsibilities: - Disease state tracking - Event scheduling - Isolation status management
PersonDisease (disease/)
Role: Disease state for a single person
Key Attributes: - colonizationStatus - Susceptible / Colonized / Clinically infected - detectionStatus - Detected vs. undetected - disease - Reference to Disease object
Key Methods: - isColonized() - Query infection status - setDetected() - Mark as diagnosed - startClinicalDetectionTimer() - Schedule spontaneous detection - startDecolonizationTimer() - Schedule natural clearance
Responsibilities: - Individual disease state - Detection scheduling - Decolonization scheduling
FacilityOutbreak (disease/)
Role: Disease transmission management for facility
Key Attributes: - facility - Reference to containing Facility - disease - Reference to Disease type - meanIntraEventTime - Average time between transmission events
Key Methods: - updateTransmissionRate() - Calculate new beta based on population - updatePrevalenceTally() - Record daily prevalence - updateAdmissionTally() - Record admission statistics - updateStayTally() - Record patient-day statistics
Responsibilities: - Transmission event scheduling - Prevalence tracking - Statistics aggregation
Disease (disease/)
Role: Disease type definition
Key Attributes: - probSurveillanceDetection - Detection probability per test - probClinicalDetection - Rate of spontaneous detection - isolatePatientWhenDetected - Isolation protocol
Key Methods: - getNextEventTime() - Sample inter-event interval
Responsibilities: - Disease-specific parameters - Detection probability - Isolation policies
Design Patterns
Scheduled Methods
Uses Repast Simphony’s @ScheduledMethod annotation:
@ScheduledMethod(start = 1.0, interval = 1)
public void dailyUpdate() {
// Called every day starting from tick 1.0
}Key scheduled methods: - FacilityEpiSim.updateDailyStatistics() - Every day - Facility.updatePopulationTally() - Every day - Person.startDischargeTimer() - Scheduled per patient
Event-Driven Simulation
Key events:
- Admission - New patient enters facility
- Discharge - Patient leaves facility
- Transmission - Susceptible → Colonized
- Detection - Clinical or surveillance
- Decolonization - Colonized → Susceptible
- Surveillance Test - Periodic testing
Data Flow
Simulation Initialization
1. FacilityEpiSim.build() called
2. Create Facility agent
3. Create initial patients (burn-in)
4. For each patient:
- Create PersonDisease for each disease
- Create FacilityOutbreak for disease tracking
- Schedule admission, discharge, detection events
5. Simulation clock starts
Daily (on the even tick [e.g. 45.0, 46.0, etc])
1. Facility.updatePopulationTally() records daily stats
2. FacilityEpiSim.updateDailyStatistics() writes outputs
Patient Discharge
1. Discharge timer fires
2. Facility.dischargePatient(person) called
3. Remove from patient list
4. Record patient-days and statistics
5. Create DischargedPatient record
6. Remove from Repast context (garbage collection)