DiseaseStatusTransitionModel.java

  1. package org.matsim.episim.model.progression;

  2. import org.matsim.episim.EpisimPerson;
  3. import org.matsim.episim.Immunizable;
  4. import org.matsim.episim.VaccinationConfigGroup;
  5. import org.matsim.episim.model.VaccinationType;

  6. /**
  7.  * Model to calculate the next disease status of a person. Duration will be drawn from a different model.
  8.  */
  9. @FunctionalInterface
  10. public interface DiseaseStatusTransitionModel {

  11.     /**
  12.      * Calculate the next disease status of a person.
  13.      *
  14.      * @param person the person
  15.      * @param status current disease status
  16.      * @param day    current day (iteration number)
  17.      * @return the next disease status.
  18.      */
  19.     EpisimPerson.DiseaseStatus decideNextState(EpisimPerson person, EpisimPerson.DiseaseStatus status, int day);


  20.     /**
  21.      * Factor for showing symptoms depending on vaccination or immunity.
  22.      */
  23.     default double getShowingSymptomsFactor(EpisimPerson person, VaccinationConfigGroup vaccinationConfig, int day) {

  24.         double a = vaccinationConfig.getMinFactor(person, day, VaccinationConfigGroup.VaccinationParams::getFactorShowingSymptoms);

  25.         double b = (person.getNumInfections() > 0 && person.hadDiseaseStatus(EpisimPerson.DiseaseStatus.recovered) && vaccinationConfig.hasParams(VaccinationType.natural))
  26.                 ? vaccinationConfig.getParams(VaccinationType.natural).getFactorShowingSymptoms(person.getVirusStrain(), person.daysSince(EpisimPerson.DiseaseStatus.recovered, day))
  27.                 : 1d;

  28.         return Math.min(a, b);
  29.     }

  30.     /**
  31.      * Factor for showing symptoms depending on vaccination or immunity.
  32.      */
  33.     default double getSeriouslySickFactor(Immunizable person, VaccinationConfigGroup vaccinationConfig, int day) {

  34.         double a = vaccinationConfig.getMinFactor((EpisimPerson) person, day, VaccinationConfigGroup.VaccinationParams::getFactorSeriouslySick);

  35.         double b = (person.getNumInfections() > 0 && person.hadDiseaseStatus(EpisimPerson.DiseaseStatus.recovered) && vaccinationConfig.hasParams(VaccinationType.natural))
  36.                 ? vaccinationConfig.getParams(VaccinationType.natural).getFactorSeriouslySick(person.getVirusStrain(), person.daysSince(EpisimPerson.DiseaseStatus.recovered, day))
  37.                 : 1d;

  38.         return Math.min(a, b);
  39.     }

  40.     /**
  41.      * Factor for showing symptoms depending on vaccination or immunity.
  42.      */
  43.     default double getCriticalFactor(Immunizable person, VaccinationConfigGroup vaccinationConfig, int day) {

  44.         double a = vaccinationConfig.getMinFactor((EpisimPerson) person, day, VaccinationConfigGroup.VaccinationParams::getFactorCritical);

  45.         double b = (person.getNumInfections() > 0 && person.hadDiseaseStatus(EpisimPerson.DiseaseStatus.recovered) && vaccinationConfig.hasParams(VaccinationType.natural))
  46.                 ? vaccinationConfig.getParams(VaccinationType.natural).getFactorCritical(person.getVirusStrain(), person.daysSince(EpisimPerson.DiseaseStatus.recovered, day))
  47.                 : 1d;

  48.         return Math.min(a, b);
  49.     }


  50. }