def computeContactConfigGraphs(): graphFileNameBase = resultsDir + "ConfigGraph" for j in range(numGraphs): configGraph = SparseGraph(GeneralVertexList(numVertices)) degSequence = numpy.zeros(numVertices, numpy.int) lastDegSequence = numpy.zeros(numVertices, numpy.int) generator = ConfigModelGenerator(lastDegSequence) for i in dayList: logging.info("Date: " + str(DateUtils.getDateStrFromDay(i, startYear))) subgraphIndices = numpy.nonzero(detections <= i)[0] subgraphIndices = numpy.unique(subgraphIndices) subgraph = sGraph.subgraph(subgraphIndices) subDegSequence = subgraph.degreeSequence() degSequence[subgraphIndices] = subDegSequence diffSequence = degSequence - lastDegSequence generator.setOutDegSequence(diffSequence) configGraph = generator.generate(configGraph, False) lastDegSequence = configGraph.degreeSequence() assert (degSequence>=lastDegSequence).all() assert subgraph.getNumEdges() >= configGraph.getNumEdges() configGraph.save(graphFileNameBase + str(j))
def computeInfectConfigGraphs(): #We need the directed infection graph hivReader = HIVGraphReader() graph = hivReader.readHIVGraph(False) sGraphInfect = graph.getSparseGraph(edgeTypeIndex2) sGraph = sGraphInfect graphFileNameBase = resultsDir + "ConfigInfectGraph" for j in range(numGraphs): configGraph = SparseGraph(GeneralVertexList(numVertices), False) outDegSequence = numpy.zeros(numVertices, numpy.int) inDegSequence = numpy.zeros(numVertices, numpy.int) lastOutDegSequence = numpy.zeros(numVertices, numpy.int) lastInDegSequence = numpy.zeros(numVertices, numpy.int) generator = ConfigModelGenerator(lastOutDegSequence, lastInDegSequence) for i in dayList: logging.info("Date: " + str(DateUtils.getDateStrFromDay(i, startYear))) subgraphIndices = numpy.nonzero(detections <= i)[0] subgraphIndices = numpy.unique(subgraphIndices) subgraph = sGraph.subgraph(subgraphIndices) outDegSequence[subgraphIndices] = subgraph.outDegreeSequence() inDegSequence[subgraphIndices] = subgraph.inDegreeSequence() outDiffSequence = outDegSequence - lastOutDegSequence inDiffSequence = inDegSequence - lastInDegSequence generator.setInDegSequence(inDiffSequence) generator.setOutDegSequence(outDiffSequence) configGraph = generator.generate(configGraph, False) lastOutDegSequence = configGraph.outDegreeSequence() lastInDegSequence = configGraph.inDegreeSequence() assert (outDegSequence>=lastOutDegSequence).all() assert (inDegSequence>=lastInDegSequence).all() configGraph.save(graphFileNameBase + str(j))
def testGenerate(self): degSequence = numpy.array([2, 1, 3, 0, 0, 0, 0, 0, 0, 1]) generator = ConfigModelGenerator(degSequence) numVertices = 10 graph = SparseGraph(GeneralVertexList(numVertices)) graph = generator.generate(graph) tol = 3 self.assertTrue( numpy.linalg.norm(degSequence - graph.degreeSequence()) < tol) degSequence = numpy.array([2, 1, 3, 0, 2, 1, 4, 0, 0, 1]) generator.setOutDegSequence(degSequence) graph.removeAllEdges() graph = generator.generate(graph) self.assertTrue( numpy.linalg.norm(degSequence - graph.degreeSequence()) < tol) #Test using a non-empty graph degSequence = numpy.array([0, 0, 0, 2, 0, 0, 0, 1, 1, 0]) generator.setOutDegSequence(degSequence) oldDegSequence = graph.degreeSequence() self.assertRaises(ValueError, generator.generate, graph, True) graph = generator.generate(graph, False) diffSequence = graph.degreeSequence() - oldDegSequence self.assertTrue(numpy.linalg.norm(degSequence - diffSequence) < tol) #Test the case where we also have an in-degree sequence degSequence = numpy.array([2, 1, 3, 0, 0, 0, 0, 0, 0, 1]) inDegSequence = numpy.array([1, 1, 1, 1, 1, 1, 1, 0, 0, 0]) generator = ConfigModelGenerator(degSequence, inDegSequence) graph = SparseGraph(GeneralVertexList(numVertices)) self.assertRaises(ValueError, generator.generate, graph) graph = SparseGraph(GeneralVertexList(numVertices), False) graph = generator.generate(graph) self.assertTrue( numpy.linalg.norm(degSequence - graph.outDegreeSequence()) < tol) self.assertTrue( numpy.linalg.norm(inDegSequence - graph.inDegreeSequence()) < tol) outDegSequence = numpy.array([2, 1, 3, 0, 2, 1, 4, 0, 0, 1]) inDegSequence = numpy.array([1, 2, 1, 1, 2, 1, 2, 1, 2, 1]) generator.setOutDegSequence(outDegSequence) generator.setInDegSequence(inDegSequence) graph.removeAllEdges() graph = generator.generate(graph) self.assertTrue( numpy.linalg.norm(outDegSequence - graph.outDegreeSequence()) < tol) self.assertTrue( numpy.linalg.norm(inDegSequence - graph.inDegreeSequence()) < tol) #In the case that the in-degree sequence sum larger than that of the out-degree it is #not satisfied, but the out-degree should be. inDegSequence = numpy.array([1, 2, 1, 1, 2, 1, 2, 1, 5, 6]) generator.setInDegSequence(inDegSequence) graph.removeAllEdges() graph = generator.generate(graph) self.assertTrue( numpy.linalg.norm(outDegSequence - graph.outDegreeSequence()) < tol) #Now try the other way around generator.setOutDegSequence(inDegSequence) generator.setInDegSequence(outDegSequence) graph.removeAllEdges() graph = generator.generate(graph) self.assertTrue( numpy.linalg.norm(outDegSequence - graph.inDegreeSequence()) < tol) #Test growing graph outDegSequence = numpy.array([2, 1, 3, 0, 2, 1, 4, 0, 0, 1]) inDegSequence = numpy.array([1, 2, 1, 1, 2, 1, 2, 1, 2, 1]) generator.setOutDegSequence(outDegSequence) generator.setInDegSequence(inDegSequence) graph.removeAllEdges() graph = generator.generate(graph) newOutDegreeSequence = numpy.array([2, 1, 3, 5, 2, 1, 4, 0, 0, 1]) newInDegreeSequence = numpy.array([2, 3, 2, 2, 3, 1, 2, 1, 2, 1]) diffOutSequence = newOutDegreeSequence - graph.outDegreeSequence() diffInSequence = newInDegreeSequence - graph.inDegreeSequence() generator.setOutDegSequence(diffOutSequence) generator.setInDegSequence(diffInSequence) graph = generator.generate(graph, False) self.assertTrue( numpy.linalg.norm(newOutDegreeSequence - graph.outDegreeSequence()) < tol) self.assertTrue( numpy.linalg.norm(newInDegreeSequence - graph.inDegreeSequence()) < tol)
def testGenerate(self): degSequence = numpy.array([2, 1, 3, 0, 0, 0, 0, 0, 0, 1]) generator = ConfigModelGenerator(degSequence) numVertices = 10 graph = SparseGraph(GeneralVertexList(numVertices)) graph = generator.generate(graph) tol = 3 self.assertTrue(numpy.linalg.norm(degSequence - graph.degreeSequence()) < tol) degSequence = numpy.array([2, 1, 3, 0, 2, 1, 4, 0, 0, 1]) generator.setOutDegSequence(degSequence) graph.removeAllEdges() graph = generator.generate(graph) self.assertTrue(numpy.linalg.norm(degSequence - graph.degreeSequence()) < tol) #Test using a non-empty graph degSequence = numpy.array([0, 0, 0, 2, 0, 0, 0, 1, 1, 0]) generator.setOutDegSequence(degSequence) oldDegSequence = graph.degreeSequence() self.assertRaises(ValueError, generator.generate, graph, True) graph = generator.generate(graph, False) diffSequence = graph.degreeSequence() - oldDegSequence self.assertTrue(numpy.linalg.norm(degSequence - diffSequence) < tol) #Test the case where we also have an in-degree sequence degSequence = numpy.array([2, 1, 3, 0, 0, 0, 0, 0, 0, 1]) inDegSequence = numpy.array([1, 1, 1, 1, 1, 1, 1, 0, 0, 0]) generator = ConfigModelGenerator(degSequence, inDegSequence) graph = SparseGraph(GeneralVertexList(numVertices)) self.assertRaises(ValueError, generator.generate, graph) graph = SparseGraph(GeneralVertexList(numVertices), False) graph = generator.generate(graph) self.assertTrue(numpy.linalg.norm(degSequence - graph.outDegreeSequence()) < tol) self.assertTrue(numpy.linalg.norm(inDegSequence - graph.inDegreeSequence()) < tol) outDegSequence = numpy.array([2, 1, 3, 0, 2, 1, 4, 0, 0, 1]) inDegSequence = numpy.array([1, 2, 1, 1, 2, 1, 2, 1, 2, 1]) generator.setOutDegSequence(outDegSequence) generator.setInDegSequence(inDegSequence) graph.removeAllEdges() graph = generator.generate(graph) self.assertTrue(numpy.linalg.norm(outDegSequence - graph.outDegreeSequence()) < tol) self.assertTrue(numpy.linalg.norm(inDegSequence - graph.inDegreeSequence()) < tol) #In the case that the in-degree sequence sum larger than that of the out-degree it is #not satisfied, but the out-degree should be. inDegSequence = numpy.array([1, 2, 1, 1, 2, 1, 2, 1, 5, 6]) generator.setInDegSequence(inDegSequence) graph.removeAllEdges() graph = generator.generate(graph) self.assertTrue(numpy.linalg.norm(outDegSequence - graph.outDegreeSequence()) < tol) #Now try the other way around generator.setOutDegSequence(inDegSequence) generator.setInDegSequence(outDegSequence) graph.removeAllEdges() graph = generator.generate(graph) self.assertTrue(numpy.linalg.norm(outDegSequence - graph.inDegreeSequence()) < tol) #Test growing graph outDegSequence = numpy.array([2, 1, 3, 0, 2, 1, 4, 0, 0, 1]) inDegSequence = numpy.array([1, 2, 1, 1, 2, 1, 2, 1, 2, 1]) generator.setOutDegSequence(outDegSequence) generator.setInDegSequence(inDegSequence) graph.removeAllEdges() graph = generator.generate(graph) newOutDegreeSequence = numpy.array([2, 1, 3, 5, 2, 1, 4, 0, 0, 1]) newInDegreeSequence = numpy.array([2, 3, 2, 2, 3, 1, 2, 1, 2, 1]) diffOutSequence = newOutDegreeSequence - graph.outDegreeSequence() diffInSequence = newInDegreeSequence - graph.inDegreeSequence() generator.setOutDegSequence(diffOutSequence) generator.setInDegSequence(diffInSequence) graph = generator.generate(graph, False) self.assertTrue(numpy.linalg.norm(newOutDegreeSequence - graph.outDegreeSequence()) < tol) self.assertTrue(numpy.linalg.norm(newInDegreeSequence - graph.inDegreeSequence()) < tol)