DiseaseStatusTransitionModel.java
package org.matsim.episim.model.progression;
import org.matsim.episim.EpisimPerson;
import org.matsim.episim.Immunizable;
import org.matsim.episim.VaccinationConfigGroup;
import org.matsim.episim.model.VaccinationType;
/**
* Model to calculate the next disease status of a person. Duration will be drawn from a different model.
*/
@FunctionalInterface
public interface DiseaseStatusTransitionModel {
/**
* Calculate the next disease status of a person.
*
* @param person the person
* @param status current disease status
* @param day current day (iteration number)
* @return the next disease status.
*/
EpisimPerson.DiseaseStatus decideNextState(EpisimPerson person, EpisimPerson.DiseaseStatus status, int day);
/**
* Factor for showing symptoms depending on vaccination or immunity.
*/
default double getShowingSymptomsFactor(EpisimPerson person, VaccinationConfigGroup vaccinationConfig, int day) {
double a = vaccinationConfig.getMinFactor(person, day, VaccinationConfigGroup.VaccinationParams::getFactorShowingSymptoms);
double b = (person.getNumInfections() > 0 && person.hadDiseaseStatus(EpisimPerson.DiseaseStatus.recovered) && vaccinationConfig.hasParams(VaccinationType.natural))
? vaccinationConfig.getParams(VaccinationType.natural).getFactorShowingSymptoms(person.getVirusStrain(), person.daysSince(EpisimPerson.DiseaseStatus.recovered, day))
: 1d;
return Math.min(a, b);
}
/**
* Factor for showing symptoms depending on vaccination or immunity.
*/
default double getSeriouslySickFactor(Immunizable person, VaccinationConfigGroup vaccinationConfig, int day) {
double a = vaccinationConfig.getMinFactor((EpisimPerson) person, day, VaccinationConfigGroup.VaccinationParams::getFactorSeriouslySick);
double b = (person.getNumInfections() > 0 && person.hadDiseaseStatus(EpisimPerson.DiseaseStatus.recovered) && vaccinationConfig.hasParams(VaccinationType.natural))
? vaccinationConfig.getParams(VaccinationType.natural).getFactorSeriouslySick(person.getVirusStrain(), person.daysSince(EpisimPerson.DiseaseStatus.recovered, day))
: 1d;
return Math.min(a, b);
}
/**
* Factor for showing symptoms depending on vaccination or immunity.
*/
default double getCriticalFactor(Immunizable person, VaccinationConfigGroup vaccinationConfig, int day) {
double a = vaccinationConfig.getMinFactor((EpisimPerson) person, day, VaccinationConfigGroup.VaccinationParams::getFactorCritical);
double b = (person.getNumInfections() > 0 && person.hadDiseaseStatus(EpisimPerson.DiseaseStatus.recovered) && vaccinationConfig.hasParams(VaccinationType.natural))
? vaccinationConfig.getParams(VaccinationType.natural).getFactorCritical(person.getVirusStrain(), person.daysSince(EpisimPerson.DiseaseStatus.recovered, day))
: 1d;
return Math.min(a, b);
}
}