class HIVGraphMetricsProfile(): def __init__(self): #Total number of people in population self.M = 1000 numInitialInfected = 5 #The graph is one in which edges represent a contact undirected = True self.graph = HIVGraph(self.M, undirected) for i in range(self.M): vertex = self.graph.getVertex(i) #Set the infection time of a number of individuals to 0 if i < numInitialInfected: vertex[HIVVertices.stateIndex] = HIVVertices.infected p = 0.01 generator = ErdosRenyiGenerator(p) self.graph = generator.generate(self.graph) perm1 = numpy.random.permutation(self.M) perm2 = numpy.random.permutation(self.M) sizes = [200, 300, 500, 1000] self.summary1 = [] self.summary2 = [] for size in sizes: self.summary1.append(self.graph.subgraph(perm1[0:size])) self.summary2.append(self.graph.subgraph(perm2[0:int(size/10)])) print(self.graph) def profileDistance(self): times = numpy.arange(len(self.summary1)) #metrics = HIVGraphMetrics2(times, GraphMatch("RANK")) metrics = HIVGraphMetrics2(times, GraphMatch("U")) #Can try RANK and Umeyama algorithm - Umeyama is faster self.summary2 = self.summary2[0:2] ProfileUtils.profile('metrics.distance(self.summary1, self.summary2)', globals(), locals())
def testAddGraph(self): epsilon = 0.12 metrics = HIVGraphMetrics2(self.graph, epsilon) metrics.addGraph(self.graph) self.assertEquals(metrics.dists[0], 0.0) self.assertEquals(metrics.meanDistance(), 0.0) #Start a new graph #Compute distances directly matcher = GraphMatch("U") graph = HIVGraph(self.graph.size) dists = [] metrics = HIVGraphMetrics2(self.graph, epsilon) graph.vlist.setInfected(1, 0.0) graph.vlist.setDetected(1, 0.1, 0) metrics.addGraph(graph) t = graph.endTime() subgraph1 = graph.subgraph(graph.removedIndsAt(t)) subgraph2 = self.graph.subgraph(graph.removedIndsAt(t)) permutation, distance, time = matcher.match(subgraph1, subgraph2) lastDist = matcher.distance(subgraph1, subgraph2, permutation, True, True) self.assertEquals(metrics.dists[-1], lastDist) self.assertTrue(metrics.shouldBreak()) graph.vlist.setInfected(2, 2.0) graph.vlist.setDetected(2, 2.0, 0) metrics.addGraph(graph) t = graph.endTime() subgraph1 = graph.subgraph(graph.removedIndsAt(t)) subgraph2 = self.graph.subgraph(graph.removedIndsAt(t)) permutation, distance, time = matcher.match(subgraph1, subgraph2) lastDist = matcher.distance(subgraph1, subgraph2, permutation, True, True) self.assertEquals(metrics.dists[-1], lastDist) self.assertTrue(metrics.shouldBreak()) graph.vlist.setInfected(7, 3.0) graph.vlist.setDetected(7, 3.0, 0) metrics.addGraph(graph) t = graph.endTime() subgraph1 = graph.subgraph(graph.removedIndsAt(t)) subgraph2 = self.graph.subgraph(graph.removedIndsAt(t)) permutation, distance, time = matcher.match(subgraph1, subgraph2) lastDist = matcher.distance(subgraph1, subgraph2, permutation, True, True) self.assertEquals(metrics.dists[-1], lastDist) self.assertFalse(metrics.shouldBreak()) #Test case where one graph has zero size graph1 = HIVGraph(10) graph2 = HIVGraph(10) graph1.vlist[:, HIVVertices.stateIndex] = HIVVertices.removed metrics = HIVGraphMetrics2(graph2, epsilon) metrics.addGraph(graph1) #Problem is that distance is 1 when one graph is zero self.assertEquals(len(metrics.dists), 0)