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:

  1. Admission - New patient enters facility
  2. Discharge - Patient leaves facility
  3. Transmission - Susceptible → Colonized
  4. Detection - Clinical or surveillance
  5. Decolonization - Colonized → Susceptible
  6. 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)