make macdonald ross stochastic
diff --git a/org.eclipse.stem/models/epidemiology/org.eclipse.stem.diseasemodels.vector/src/org/eclipse/stem/diseasemodels/vector/impl/MacdonaldRossDiseaseModelImpl.java b/org.eclipse.stem/models/epidemiology/org.eclipse.stem.diseasemodels.vector/src/org/eclipse/stem/diseasemodels/vector/impl/MacdonaldRossDiseaseModelImpl.java index bce1e81..487d06f 100644 --- a/org.eclipse.stem/models/epidemiology/org.eclipse.stem.diseasemodels.vector/src/org/eclipse/stem/diseasemodels/vector/impl/MacdonaldRossDiseaseModelImpl.java +++ b/org.eclipse.stem/models/epidemiology/org.eclipse.stem.diseasemodels.vector/src/org/eclipse/stem/diseasemodels/vector/impl/MacdonaldRossDiseaseModelImpl.java
@@ -3,6 +3,9 @@ import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.stem.core.graph.DynamicLabel; +import org.eclipse.stem.core.graph.Exchange; +import org.eclipse.stem.core.graph.ExchangePool; +import org.eclipse.stem.core.graph.ExchangeType; import org.eclipse.stem.core.graph.IntegrationLabel; import org.eclipse.stem.core.graph.LabelValue; import org.eclipse.stem.core.graph.Node; @@ -566,6 +569,8 @@ double totalVectorPop = vectorValue.getPopulationCount(); double absIChange=0.0, absEChange=0.0, absSChange=0.0, absRChange = 0.0; + // SED 03/14/19. For stochastic modeling + double numberOfSusceptibleToExposed = 0.0, numberOfExposedToInfectious=0.0,numberOfInfectedToRecovered=0.0, numberOfRecoveredToSusceptible=0.0; double incidence = 0.0; // Make sure we have both vectors and humans if(totalHumanPop > 0.0) { @@ -594,9 +599,57 @@ absRChange = fracRChange * totalHumanPop; incidence = dydt*totalHumanPop; + // SED 03/14/19 + numberOfSusceptibleToExposed = incidence; + numberOfExposedToInfectious = adjustedIncubationRate*seirVal.getE(); + numberOfInfectedToRecovered = adjustedRecoveryRate*seirVal.getI(); + numberOfRecoveredToSusceptible = adjustedImmunityLossRate*seirVal.getR(); // if(absIChange + absSChange + absEChange +absRChange != 0.0) // Activator.logInformation("Mismatch "+(absIChange + absSChange + absEChange +absRChange)); } + + + + ///////////////////////////////////////////////////////////////////////////// + // SED 03/14/2019 + // added to express the transitions. Necessary to support stochastic modeling + // S->E + Exchange seExchange = (Exchange)ExchangePool.POOL.get(); + seExchange.setSource(StandardPackage.eINSTANCE.getStandardDiseaseModelLabelValue_S()); + seExchange.setTarget(StandardPackage.eINSTANCE.getSEIRLabelValue_E()); + seExchange.setCount(numberOfSusceptibleToExposed); + seExchange.getForIncidence().add(StandardPackage.eINSTANCE.getStandardDiseaseModelLabelValue_Incidence()); + seExchange.setType(ExchangeType.COMPARTMENT_TRANSITION); + deltaValue.getDepartures().add(seExchange); + + // E->I + Exchange eiExchange = (Exchange)ExchangePool.POOL.get(); + eiExchange.setSource(StandardPackage.eINSTANCE.getSEIRLabelValue_E()); + eiExchange.setTarget(StandardPackage.eINSTANCE.getSILabelValue_I()); + eiExchange.setCount(numberOfExposedToInfectious); + eiExchange.setType(ExchangeType.COMPARTMENT_TRANSITION); + deltaValue.getDepartures().add(eiExchange); + + // I->R + Exchange irExchange = (Exchange)ExchangePool.POOL.get(); + irExchange.setSource(StandardPackage.eINSTANCE.getSILabelValue_I()); + irExchange.setTarget(StandardPackage.eINSTANCE.getSIRLabelValue_R()); + irExchange.setCount(numberOfInfectedToRecovered); + irExchange.setType(ExchangeType.COMPARTMENT_TRANSITION); + deltaValue.getDepartures().add(irExchange); + + // R->S + Exchange rsExchange = (Exchange)ExchangePool.POOL.get(); + rsExchange.setSource(StandardPackage.eINSTANCE.getSIRLabelValue_R()); + rsExchange.setTarget(StandardPackage.eINSTANCE.getStandardDiseaseModelLabelValue_S()); + rsExchange.setCount(numberOfRecoveredToSusceptible); + rsExchange.setType(ExchangeType.COMPARTMENT_TRANSITION); + deltaValue.getDepartures().add(rsExchange); + + + // added to express the transitions. Necessary to support stochastic modeling + ///////////////////////////////////////////////////////////////////////////// + SEIRLabelValue retV = (SEIRLabelValue)deltaValue; retV.setI(absIChange); retV.setS(absSChange); @@ -621,6 +674,9 @@ double totalVectorPop = vectorVal.getPopulationCount(); double absIChange=0.0, absEChange=0.0, absSChange=0.0; + // SED 03/14/19. For stochastic modeling + double numberOfSusceptibleToExposed = 0.0, numberOfExposedToInfectious=0.0; + // Find the vector population if(totalVectorPop>0.0) { SEIRLabel humanPop = findDiseaseLabel(diseaseLabel.getNode(), this.getPopulationIdentifier()); @@ -687,10 +743,36 @@ absEChange = fracEChange * totalVectorPop; absSChange = fracSChange * totalVectorPop; + // SED 03/14/19 + numberOfSusceptibleToExposed = -absSChange; + numberOfExposedToInfectious = adjustedIncubationRate*vectorVal.getE(); + // if(absIChange + absSChange + absEChange != 0.0) // Activator.logInformation("Mismatch vector"+(absIChange + absSChange + absEChange)); } + ///////////////////////////////////////////////////////////////////////////// + // SED 03/14/2019 + // added to express the transitions. Necessary to support stochastic modeling + // S->E + Exchange seExchange = (Exchange)ExchangePool.POOL.get(); + seExchange.setSource(StandardPackage.eINSTANCE.getStandardDiseaseModelLabelValue_S()); + seExchange.setTarget(StandardPackage.eINSTANCE.getSEIRLabelValue_E()); + seExchange.setCount(numberOfSusceptibleToExposed); + seExchange.getForIncidence().add(StandardPackage.eINSTANCE.getStandardDiseaseModelLabelValue_Incidence()); + seExchange.setType(ExchangeType.COMPARTMENT_TRANSITION); + deltaValue.getDepartures().add(seExchange); + + // E->I + Exchange eiExchange = (Exchange)ExchangePool.POOL.get(); + eiExchange.setSource(StandardPackage.eINSTANCE.getSEIRLabelValue_E()); + eiExchange.setTarget(StandardPackage.eINSTANCE.getSILabelValue_I()); + eiExchange.setCount(numberOfExposedToInfectious); + eiExchange.setType(ExchangeType.COMPARTMENT_TRANSITION); + deltaValue.getDepartures().add(eiExchange); + + // added to express the transitions. Necessary to support stochastic modeling + ///////////////////////////////////////////////////////////////////////////// SEIRLabelValue retV = (SEIRLabelValue)deltaValue; retV.setI(absIChange); retV.setS(absSChange);