def testUpperDetectionRates(self): """ See if the upper bound on detection rates is correct """ undirected = True numVertices = 10 graph = HIVGraph(numVertices, undirected) hiddenDegSeq = self.gen.rvs(size=graph.getNumVertices()) rates = HIVRates(graph, hiddenDegSeq) t = 0.1 graph.getVertexList().setInfected(0, t) graph.getVertexList().setInfected(1, t) graph.getVertexList().setInfected(8, t) t = 0.2 rates.removeEvent(8, HIVVertices.randomDetect, t) rates.infectionProbability = 1.0 infectedList = graph.infectedIndsAt(t) removedList = graph.removedIndsAt(t) n = graph.size-removedList self.assertEquals(rates.upperDetectionRates(infectedList, n), rates.randomDetectionRates(infectedList, n, seed=21).sum()) t = 0.3 rates.contactEvent(0, 2, t) graph.vlist.setInfected(2, t) t = 0.4 rates.removeEvent(0, HIVVertices.randomDetect, t) infectedList = graph.infectedIndsAt(t) removedSet = graph.removedIndsAt(t) removedSet = set(removedSet.tolist()) nptst.assert_array_almost_equal(rates.contactTracingRates(infectedList, removedSet, t + rates.ctStartTime + 1), numpy.array([0, rates.ctRatePerPerson])) upperDetectionRates = rates.ctRatePerPerson + rates.randomDetectionRates(infectedList, n, seed=21).sum() self.assertEquals(rates.upperDetectionRates(infectedList, n), upperDetectionRates)
def testContactTracingRate(self): undirected = True numVertices = 10 graph = HIVGraph(numVertices, undirected) hiddenDegSeq = self.gen.rvs(size=graph.getNumVertices()) rates = HIVRates(graph, hiddenDegSeq) t = 0.1 graph.getVertexList().setInfected(0, t) rates.contactEvent(0, 3, 0.2) rates.contactEvent(0, 9, 0.1) t = 0.3 graph.getVertexList().setInfected(3, t) graph.getVertexList().setInfected(9, t) t = 0.4 rates.removeEvent(0, HIVVertices.randomDetect, t) removedSet = graph.getRemovedSet() infectedList = [3, 9] ctRates = rates.contactTracingRates(infectedList, removedSet, t) self.assertTrue((ctRates==numpy.array([0.0, 0.0])).all()) ctRates = rates.contactTracingRates(infectedList, removedSet, t+rates.ctStartTime) self.assertTrue((ctRates == numpy.array([rates.ctRatePerPerson, rates.ctRatePerPerson])).all()) #Test contact tracing is within correct time period ctRates = rates.contactTracingRates(infectedList, removedSet, t+rates.ctEndTime-0.01) self.assertTrue((ctRates == numpy.array([rates.ctRatePerPerson, rates.ctRatePerPerson])).all()) ctRates = rates.contactTracingRates(infectedList, removedSet, t+rates.ctEndTime+1) self.assertTrue((ctRates == numpy.array([0, 0])).all()) rates.contactEvent(3, 5, t) graph.getVertexList().setInfected(5, t) rates.removeEvent(5, HIVVertices.randomDetect, t) removedSet = graph.getRemovedSet() ctRates = rates.contactTracingRates(infectedList, removedSet, t+rates.ctStartTime) self.assertTrue((ctRates == numpy.array([rates.ctRatePerPerson, rates.ctRatePerPerson])).all()) rates.contactEvent(3, 6, t) graph.getVertexList().setInfected(6, t) infectedList = [3, 6, 9] removedSet = graph.getRemovedSet() ctRates = rates.contactTracingRates(infectedList, removedSet, t+rates.ctStartTime) self.assertTrue((ctRates == numpy.array([rates.ctRatePerPerson, 0, rates.ctRatePerPerson])).all()) #Now make removedSet bigger than infectedList graph.getVertexList().setInfected(4, t) graph.getVertexList().setInfected(7, t) graph.getVertexList().setInfected(8, t) graph.getVertexList().setDetected(4, t, HIVVertices.randomDetect) graph.getVertexList().setDetected(7, t, HIVVertices.randomDetect) graph.getVertexList().setDetected(8, t, HIVVertices.randomDetect) #Note: InfectedList is out of order infectedList = list(graph.getInfectedSet()) sortInds = numpy.argsort(numpy.array(infectedList)) removedSet = graph.getRemovedSet() ctRates = rates.contactTracingRates(infectedList, removedSet, t+rates.ctStartTime) ctRates2 = numpy.array([rates.ctRatePerPerson, 0, rates.ctRatePerPerson]) self.assertTrue((ctRates[sortInds] == ctRates2).all()) #Test the case where InfectedList is out of order and removedSet is small graph.getVertexList().setInfected(4, t) graph.getVertex(7)[HIVVertices.stateIndex] = HIVVertices.susceptible graph.getVertex(8)[HIVVertices.stateIndex] = HIVVertices.susceptible infectedList = list(graph.getInfectedSet()) sortInds = numpy.argsort(numpy.array(infectedList)) removedSet = graph.getRemovedSet() ctRates = rates.contactTracingRates(infectedList, removedSet, t+rates.ctStartTime) ctRates2 = numpy.array([rates.ctRatePerPerson, 0, 0, rates.ctRatePerPerson]) self.assertTrue((ctRates[sortInds] == ctRates2).all())