def testGetAllVertexIds(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.getAllVertexIds(), [1, 2, 3, 5])
def testGetVertex(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.getVertex(1), None) self.assertEquals(dictGraph.getVertex(2), None) self.assertEquals(dictGraph.getVertex(3), None) self.assertEquals(dictGraph.getVertex(5), 12) self.assertRaises(ValueError, dictGraph.getVertex, 4) #Directed graphs dictGraph = DictGraph(False) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.getVertex(1), None) self.assertEquals(dictGraph.getVertex(2), None) self.assertEquals(dictGraph.getVertex(3), None) self.assertEquals(dictGraph.getVertex(5), 12) self.assertRaises(ValueError, dictGraph.getVertex, 4)
def testDensity(self): numVertices = 10 graph = DictGraph(True) for i in range(numVertices): graph.setVertex(i, 0) graph.addEdge(0, 1) self.assertEquals(graph.density(), float(1)/45) graph.addEdge(0, 2) self.assertEquals(graph.density(), float(2)/45) graph = DictGraph(False) for i in range(numVertices): graph.setVertex(i, 0) graph.addEdge(0, 1) self.assertEquals(graph.density(), float(1)/90) graph.addEdge(0, 2) self.assertEquals(graph.density(), float(2)/90) #Test a graph with 1 vertex graph = DictGraph(True) graph.setVertex(0, 12) self.assertEquals(graph.density(), 0) graph.addEdge(0, 0) self.assertEquals(graph.density(), 1)
def testGetAllEdgeIndices(self): graph = DictGraph() graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d") graph.addEdge("d", "e") edgeIndices = graph.getAllEdgeIndices() keys = graph.getAllVertexIds() self.assertEquals(edgeIndices.shape[0], graph.getNumEdges()) for i in range(edgeIndices.shape[0]): self.assertTrue(graph.getEdge(keys[int(edgeIndices[i, 0])], keys[edgeIndices[i, 1]]) == 1) graph = DictGraph(False) graph.addEdge("a", "b") graph.addEdge("b", "a") graph.addEdge("a", "c") graph.addEdge("a", "d") graph.addEdge("d", "e") edgeIndices = graph.getAllEdgeIndices() keys = graph.getAllVertexIds() self.assertEquals(edgeIndices.shape[0], graph.getNumEdges()) for i in range(edgeIndices.shape[0]): self.assertTrue(graph.getEdge(keys[int(edgeIndices[i, 0])], keys[edgeIndices[i, 1]]) == 1)
def testSetItem(self): graph = DictGraph() graph.addEdge(1, 1, 0.1) graph.addEdge(1, 3, 0.5) self.assertEquals(graph[1,3], 0.5) graph[1, 3] = 2 self.assertEquals(graph[1,3], 2)
def testGetItem(self): graph = DictGraph() graph.addEdge(1, 1, 0.1) graph.addEdge(1, 3, 0.5) graph.addEdge(2, 4, 1) graph.addEdge(2, 3, 2) graph.setVertex(0, "abc") self.assertEquals(graph[1,1], 0.1) self.assertEquals(graph[1,3], 0.5)
def testAddVertex(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.getVertex(5), 12) dictGraph.setVertex(5, 22) self.assertEquals(dictGraph.getVertex(5), 22) dictGraph.addEdge(5, 11, 18) self.assertEquals(dictGraph.getVertex(5), 22)
def testGetEdge(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) self.assertEquals(dictGraph.getEdge(1, 2), 12) self.assertEquals(dictGraph.getEdge(2, 1), 12) self.assertEquals(dictGraph.getEdge(2, 2), None) self.assertRaises(ValueError, dictGraph.getEdge, 5, 8) dictGraph = DictGraph(False) dictGraph.addEdge(1, 2, 12) self.assertEquals(dictGraph.getEdge(1, 2), 12) self.assertEquals(dictGraph.getEdge(2, 1), None)
def testGetWeightMatrix(self): graph = DictGraph() graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d") graph.addEdge("d", "e") W = graph.getWeightMatrix() keys = graph.getAllVertexIds() for i in range(len(keys)): for j in range(len(keys)): if W[i, j] == 1: self.assertEquals(graph.getEdge(keys[i], keys[j]), 1) else: self.assertEquals(graph.getEdge(keys[i], keys[j]), None) #Try a directed graph graph = DictGraph(False) graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d") graph.addEdge("d", "e") W = graph.getWeightMatrix() for i in range(len(keys)): for j in range(len(keys)): if W[i, j] == 1: self.assertEquals(graph.getEdge(keys[i], keys[j]), 1) else: self.assertEquals(graph.getEdge(keys[i], keys[j]), None)
def testAdjacencyList(self): graph = DictGraph() graph.addEdge("a", "b", 1) graph.addEdge("b", "c", 1) graph.addEdge("b", "d", 1) graph.addEdge("c", "e", 1) graph.setVertex("f", 1) neighbourIndices, neighbourWeights = graph.adjacencyList() vertexIds = graph.getAllVertexIds() for i in range(len(neighbourIndices)): for k, j in enumerate(neighbourIndices[i]): self.assertTrue(graph.edgeExists(vertexIds[i], vertexIds[j])) self.assertEquals(graph[vertexIds[i], vertexIds[j]], neighbourWeights[i][k])
def testGetNumDirEdges(self): graph = DictGraph() graph.addEdge(0, 1, 0.1) graph.addEdge(1, 2, 0.1) self.assertTrue(graph.getNumDirEdges() == 4) graph.addEdge(1, 1) self.assertTrue(graph.getNumDirEdges() == 5) graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(1, 2) self.assertTrue(graph.getNumDirEdges() == 2) graph.addEdge(1, 1) self.assertTrue(graph.getNumDirEdges() == 3)
def testBreadthFirstSearch(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(0, 7) graph.addEdge(7, 8) graph.addEdge(7, 9) graph.addEdge(1, 2) graph.addEdge(1, 3) graph.addEdge(2, 6) graph.addEdge(4, 5) self.assertEquals(graph.breadthFirstSearch(0), [0,1, 7,2,3,8,9,6]) self.assertEquals(graph.breadthFirstSearch(1), [1,0,2,3,7,6,8,9]) self.assertEquals(graph.breadthFirstSearch(6), [6, 2,1,0,3,7,8,9]) self.assertEquals(graph.breadthFirstSearch(4), [4, 5]) self.assertEquals(graph.breadthFirstSearch(5), [5, 4]) self.assertEquals(graph.breadthFirstSearch(7), [7, 0, 8, 9, 1, 2, 3, 6])
def testDepthFirstSearch(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(1, 2) graph.addEdge(1, 3) graph.addEdge(2, 6) graph.addEdge(4, 5) self.assertEquals(graph.depthFirstSearch(0), [0,1,2,6,3]) self.assertEquals(graph.depthFirstSearch(1), [1,0,2,6,3]) self.assertEquals(graph.depthFirstSearch(6), [6,2,1,0,3]) self.assertEquals(graph.depthFirstSearch(4), [4, 5]) self.assertEquals(graph.depthFirstSearch(5), [5, 4])
def testVertexExists(self): graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) self.assertTrue(graph.vertexExists(0)) self.assertTrue(graph.vertexExists(1)) self.assertTrue(graph.vertexExists(2)) self.assertTrue(graph.vertexExists(3)) self.assertFalse(graph.vertexExists(4))
def testToSparseGraph(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) graph.addEdge(3, 4) graph2 = graph.toSparseGraph() self.assertEquals(graph2[0, 1], 1) self.assertEquals(graph2[0, 2], 1) self.assertEquals(graph2[0, 3], 1) self.assertEquals(graph2[2, 1], 1) self.assertEquals(graph2[2, 3], 1) self.assertEquals(graph2[3, 4], 1)
def testRemoveEdge(self): dictGraph = DictGraph() dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getEdge(1, 2), 12) self.assertEquals(dictGraph.getEdge(1, 3), 18) self.assertEquals(dictGraph.getEdge(3, 4), 1) dictGraph.removeEdge(1, 3) self.assertEquals(dictGraph.getEdge(1, 3), None) self.assertEquals(dictGraph.getEdge(1, 2), 12) self.assertEquals(dictGraph.getEdge(3, 4), 1) #Some tests on directed graphs dictGraph = DictGraph(False) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(2, 1, 12) dictGraph.removeEdge(1, 2) self.assertEquals(dictGraph.getEdge(1, 2), None) self.assertEquals(dictGraph.getEdge(2, 1), 12)
def testGetAllEdges(self): dictGraph = DictGraph(True) dictGraph.setVertex(5, 12) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) edges = dictGraph.getAllEdges() self.assertEquals(len(edges), 2) self.assertTrue((1,2) in edges) self.assertTrue((1,3) in edges) dictGraph = DictGraph(False) dictGraph.setVertex(5, 12) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(2, 1, 12) dictGraph.addEdge(1, 3, 18) edges = dictGraph.getAllEdges() self.assertEquals(len(edges), 3) self.assertTrue((1,2) in edges) self.assertTrue((2,1) in edges) self.assertTrue((1,3) in edges)
class EgoSimulator: """ A class which simulates information diffusion processes within an Ego Network. In this case one models information by taking as input a graph and then iterating using a classifier for all pairs of vertices. The presence of information is stored in the last index of the VertexList as a (0, 1) value. """ def __init__(self, graph, egoPairClassifier, preprocessor=None): self.graph = graph self.egoPairClassifier = egoPairClassifier self.preprocessor = preprocessor self.iteration = 0 self.allTransmissionEdges = [] self.transmissionGraph = DictGraph(False) self.numVertexFeatures = self.graph.getVertexList().getNumFeatures() self.numPersonFeatures = self.numVertexFeatures-1 self.infoIndex = self.numVertexFeatures-1 self.edges = self.graph.getAllEdges() def advanceGraph(self): #First, find all the edges in the graph and create an ExampleList blockSize = 5000 X = numpy.zeros((blockSize, self.numPersonFeatures*2)) possibleTransmissionEdges = [] possibleTransmissionEdgeIndices = [] for i in range(self.edges.shape[0]): vertex1 = self.graph.getVertex(self.edges[i,0]) vertex2 = self.graph.getVertex(self.edges[i,1]) if vertex1[self.infoIndex] == 1 and vertex2[self.infoIndex] == 0: X[len(possibleTransmissionEdges), :] = numpy.r_[vertex1[0:self.numPersonFeatures], vertex2[0:self.numPersonFeatures]] possibleTransmissionEdges.append((self.edges[i,0], self.edges[i,1])) possibleTransmissionEdgeIndices.append(i) if vertex2[self.infoIndex] == 1 and vertex1[self.infoIndex] == 0: X[len(possibleTransmissionEdges), :] = numpy.r_[vertex2[0:self.numPersonFeatures], vertex1[0:self.numPersonFeatures]] possibleTransmissionEdges.append((self.edges[i,1], self.edges[i,0])) possibleTransmissionEdgeIndices.append(i) #Increase X if it is small if (len(possibleTransmissionEdges) == X.shape[0]): X = numpy.r_[X, numpy.zeros((blockSize, self.numPersonFeatures*2))] #Now, remove from edges the ones that can possible have a transmission self.edges = numpy.delete(self.edges, possibleTransmissionEdgeIndices, 0) X = X[0:len(possibleTransmissionEdges), :] name = "X" examplesList = ExamplesList(X.shape[0]) examplesList.addDataField(name, X) examplesList.setDefaultExamplesName(name) if self.preprocessor != None: X = examplesList.getDataField(examplesList.getDefaultExamplesName()) X = self.preprocessor.standardiseArray(X) examplesList.overwriteDataField(examplesList.getDefaultExamplesName(), X) y = self.egoPairClassifier.classify(X) transmissionEdges = numpy.zeros((sum(y==1), 2), numpy.int) j = 0 #Now, update the vertices to reflect transfer for i in range(len(possibleTransmissionEdges)): if y[i] == 1: transmissionEdges[j, 0] = possibleTransmissionEdges[i][0] transmissionEdges[j, 1] = possibleTransmissionEdges[i][1] self.transmissionGraph.setVertex(int(transmissionEdges[j, 0]), self.graph.getVertex(transmissionEdges[j, 0])) self.transmissionGraph.setVertex(int(transmissionEdges[j, 1]), self.graph.getVertex(transmissionEdges[j, 1])) self.transmissionGraph.addEdge(int(transmissionEdges[j, 0]), int(transmissionEdges[j, 1]), 1) j += 1 vertex = self.graph.getVertex(possibleTransmissionEdges[i][1]) vertex[self.infoIndex] = 1 self.graph.setVertex(possibleTransmissionEdges[i][1], vertex) self.allTransmissionEdges.append(transmissionEdges) self.iteration = self.iteration + 1 return self.graph def fullTransGraph(self): """ This function will return a new graph which contains a directed edge if a transmission will occur between two vertices. """ if self.iteration != 0: raise ValueError("Must run fullTransGraph before advanceGraph") #First, find all the edges in the graph and create an ExampleList numEdges = self.edges.shape[0] X = numpy.zeros((numEdges*2, self.numPersonFeatures*2)) ind = 0 for i in range(numEdges): vertex1 = self.graph.getVertex(self.edges[i,0]) vertex2 = self.graph.getVertex(self.edges[i,1]) X[ind, :] = numpy.r_[vertex1[0:self.numPersonFeatures], vertex2[0:self.numPersonFeatures]] X[ind+numEdges, :] = numpy.r_[vertex2[0:self.numPersonFeatures], vertex1[0:self.numPersonFeatures]] ind = ind + 1 name = "X" examplesList = ExamplesList(X.shape[0]) examplesList.addDataField(name, X) examplesList.setDefaultExamplesName(name) if self.preprocessor != None: X = self.preprocessor.process(examplesList.getDataField(examplesList.getDefaultExamplesName())) examplesList.overwriteDataField(examplesList.getDefaultExamplesName(), X) y = self.egoPairClassifier.classify(examplesList.getSampledDataField(name)) fullTransmissionGraph = SparseGraph(self.graph.getVertexList(), False) transIndices = numpy.nonzero(y==1)[0] #Now, write out the transmission graph for i in range(len(transIndices)): if transIndices[i] < numEdges: fullTransmissionGraph.addEdge(self.edges[transIndices[i],0], self.edges[transIndices[i],1]) else: fullTransmissionGraph.addEdge(self.edges[transIndices[i]-numEdges,1], self.edges[transIndices[i]-numEdges,0]) return fullTransmissionGraph def getGraph(self): return self.graph def getTransmissions(self, i=None): if i != None: Parameter.checkIndex(i, 0, self.iteration) return self.allTransmissionEdges[i] else: return self.allTransmissionEdges def getAlters(self, i): Parameter.checkIndex(i, 0, self.iteration) alters = [] for j in range(0, len(self.allTransmissionEdges[i])): alters.append(self.allTransmissionEdges[i][j, 1]) return numpy.unique(numpy.array(alters)) def getNumIterations(self): return self.iteration def getTransmissionGraph(self): return self.transmissionGraph graph = None egoPairClassifier = None preprocessor = None iteration = None allTransmissionEdges = [] transmissionGraph = None
def testRemoveVertex(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) graph.addEdge(3, 4) graph.removeVertex(4) self.assertFalse(graph.vertexExists(4)) self.assertFalse(graph.edgeExists(3, 4)) graph.removeVertex(3) self.assertFalse(graph.vertexExists(3)) self.assertFalse(graph.edgeExists(2, 3)) self.assertFalse(graph.edgeExists(0, 3)) graph.removeVertex(2) self.assertFalse(graph.vertexExists(2)) self.assertFalse(graph.edgeExists(1, 2)) self.assertFalse(graph.edgeExists(0, 2)) self.assertTrue(graph.getAllVertexIds() == [0, 1]) self.assertTrue(graph.getAllEdges() == [(0, 1)]) #Try directed graph graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(1, 0) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) graph.addEdge(3, 4) graph.removeVertex(0) self.assertFalse(graph.vertexExists(0)) self.assertFalse(graph.edgeExists(0, 1)) self.assertFalse(graph.edgeExists(0, 3)) self.assertFalse(graph.edgeExists(1, 0)) graph.removeVertex(2) self.assertFalse(graph.vertexExists(2)) self.assertFalse(graph.edgeExists(1, 2)) self.assertFalse(graph.edgeExists(2, 3)) self.assertTrue(graph.getAllVertexIds() == [1, 3, 4]) self.assertTrue(graph.getAllEdges() == [(3, 4)])
def testInDegreeSequence(self): graph = DictGraph(True) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) degSeq, vertices = graph.inDegreeSequence() self.assertTrue((degSeq == numpy.array([ 3, 2, 3, 2.])).all()) self.assertTrue(vertices == [0, 1, 2, 3]) #Test results on a directed graph graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) degSeq, vertices = graph.inDegreeSequence() self.assertTrue((degSeq == numpy.array([ 0, 1, 2, 2])).all())
class SimpleGraphWriterTest(unittest.TestCase): def setUp(self): #Finally, try DictGraphs self.dctGraph1 = DictGraph(True) self.dctGraph1.addEdge(0, 1, 1) self.dctGraph1.addEdge(0, 2, 2) self.dctGraph1.addEdge(2, 4, 8) self.dctGraph1.addEdge(2, 3, 1) self.dctGraph1.addEdge(12, 4, 1) self.dctGraph2 = DictGraph(False) self.dctGraph2.addEdge(0, 1, 0.5) self.dctGraph2.addEdge(0, 2, 1) self.dctGraph2.addEdge(2, 4, 1) self.dctGraph2.addEdge(2, 3, 0.2) self.dctGraph2.addEdge(12, 4, 1) def testWriteToFile(self): sgw = SimpleGraphWriter() directory = PathDefaults.getOutputDir() + "test/" #Have to check the files fileName1 = directory + "dictTestUndirected" sgw.writeToFile(fileName1, self.dctGraph1) fileName2 = directory + "dictTestDirected" sgw.writeToFile(fileName2, self.dctGraph2)
def testDijkstrasAlgorithm(self): graph = DictGraph() graph.addEdge(0, 1, 1) graph.addEdge(1, 2, 1) graph.addEdge(1, 3, 1) graph.addEdge(2, 4, 1) graph.setVertex(4, 1) self.assertTrue((graph.dijkstrasAlgorithm(0) == numpy.array([0, 1, 2, 2, 3])).all()) self.assertTrue((graph.dijkstrasAlgorithm(1) == numpy.array([1, 0, 1, 1, 2])).all()) self.assertTrue((graph.dijkstrasAlgorithm(2) == numpy.array([2, 1, 0, 2, 1])).all()) self.assertTrue((graph.dijkstrasAlgorithm(3) == numpy.array([2, 1, 2, 0, 3])).all()) self.assertTrue((graph.dijkstrasAlgorithm(4) == numpy.array([3, 2, 1, 3, 0])).all()) #Test a graph which has an isolated node graph = DictGraph() graph.setVertex(5, 1) graph.addEdge(0, 1, 1) graph.addEdge(1, 2, 1) graph.addEdge(1, 3, 1) self.assertTrue((graph.dijkstrasAlgorithm(0) == numpy.array([0, 1, 2, 2, numpy.inf])).all()) #Test a graph in a ring graph = DictGraph() graph.addEdge(0, 1, 1) graph.addEdge(1, 2, 1) graph.addEdge(2, 3, 1) graph.addEdge(3, 4, 1) graph.addEdge(4, 0, 1) self.assertTrue((graph.dijkstrasAlgorithm(0) == numpy.array([0, 1, 2, 2, 1])).all()) #Try case in which vertex ids are not numbers graph = DictGraph() graph.addEdge("a", "b", 1) graph.addEdge("b", "c", 1) graph.addEdge("b", "d", 1) graph.addEdge("c", "e", 1) inds = Util.argsort(graph.getAllVertexIds()) self.assertTrue((graph.dijkstrasAlgorithm("a")[inds] == numpy.array([0, 1, 2, 2, 3])).all()) self.assertTrue((graph.dijkstrasAlgorithm("b")[inds] == numpy.array([1, 0, 1, 1, 2])).all()) self.assertTrue((graph.dijkstrasAlgorithm("c")[inds] == numpy.array([2, 1, 0, 2, 1])).all()) self.assertTrue((graph.dijkstrasAlgorithm("d")[inds] == numpy.array([2, 1, 2, 0, 3])).all()) self.assertTrue((graph.dijkstrasAlgorithm("e")[inds] == numpy.array([3, 2, 1, 3, 0])).all())
""" Name: Generate Graph: Author: Jia_qiu Wang(王佳秋) Data: December, 2016 function: """ from apgl.graph.DictGraph import DictGraph from apgl.graph.SparseGraph import SparseGraph from apgl.graph.GeneralVertexList import GeneralVertexList graph = DictGraph() graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d") edgeIndices = graph.getAllEdgeIndices() graph2 = SparseGraph(GeneralVertexList(graph.getNumVertices())) graph2.addEdges(edgeIndices)
# -*- coding: utf-8 -*- from apgl.graph.DictGraph import DictGraph from apgl.graph.SparseGraph import SparseGraph from apgl.graph.GeneralVertexList import GeneralVertexList graph = DictGraph() graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d") edgeIndices = graph.getAllEdgeIndices() graph2 = SparseGraph(GeneralVertexList(graph.getNumVertices())) graph2.addEdges(edgeIndices)
class DictGraphTest(unittest.TestCase): def setUp(self): self.graph = DictGraph() self.graph.addEdge(0, 1, 1) self.graph.addEdge(1, 3, 1) self.graph.addEdge(0, 2, 2) self.graph.addEdge(2, 3, 5) self.graph.addEdge(0, 4, 1) self.graph.addEdge(3, 4, 1) self.graph.setVertex(5, None) self.graph2 = DictGraph(False) self.graph2.addEdge(0, 1, 1) self.graph2.addEdge(1, 3, 1) self.graph2.addEdge(0, 2, 2) self.graph2.addEdge(2, 3, 5) self.graph2.addEdge(0, 4, 1) self.graph2.addEdge(3, 4, 1) self.graph2.setVertex(5, 1) def testInit(self): dictGraph = DictGraph() def testAddEdge(self): dictGraph = DictGraph() dictGraph.addEdge("A", "B", [1,2,3]) dictGraph.addEdge("A", "C", "HelloThere") dictGraph.addEdge(12, 8, [1,2,3, 12]) self.assertEquals(dictGraph.getEdge("A", "B"), [1,2,3]) self.assertEquals(dictGraph.getEdge("B", "A"), [1,2,3]) self.assertEquals(dictGraph.getEdge("A", "C"), "HelloThere") self.assertEquals(dictGraph.getEdge("C", "A"), "HelloThere") self.assertEquals(dictGraph.getEdge(12, 8), [1,2,3, 12]) self.assertEquals(dictGraph.getEdge(8, 12), [1,2,3, 12]) dictGraph.addEdge(2, 8) dictGraph = DictGraph(False) dictGraph.addEdge("A", "B", [1,2,3]) dictGraph.addEdge("A", "C", "HelloThere") dictGraph.addEdge(12, 8, [1,2,3, 12]) self.assertEquals(dictGraph.getEdge("A", "B"), [1,2,3]) self.assertEquals(dictGraph.getEdge("B", "A"), None) self.assertEquals(dictGraph.getEdge("A", "C"), "HelloThere") self.assertEquals(dictGraph.getEdge("C", "A"), None) self.assertEquals(dictGraph.getEdge(12, 8), [1,2,3, 12]) self.assertEquals(dictGraph.getEdge(8, 12), None) dictGraph.addEdge(2, 8) #Test directed graphs def testRemoveEdge(self): dictGraph = DictGraph() dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getEdge(1, 2), 12) self.assertEquals(dictGraph.getEdge(1, 3), 18) self.assertEquals(dictGraph.getEdge(3, 4), 1) dictGraph.removeEdge(1, 3) self.assertEquals(dictGraph.getEdge(1, 3), None) self.assertEquals(dictGraph.getEdge(1, 2), 12) self.assertEquals(dictGraph.getEdge(3, 4), 1) #Some tests on directed graphs dictGraph = DictGraph(False) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(2, 1, 12) dictGraph.removeEdge(1, 2) self.assertEquals(dictGraph.getEdge(1, 2), None) self.assertEquals(dictGraph.getEdge(2, 1), 12) def testIsUndirected(self): dictGraph = DictGraph(True) self.assertEquals(dictGraph.isUndirected(), True) dictGraph = DictGraph(False) self.assertEquals(dictGraph.isUndirected(), False) def testGetNumEdges(self): dictGraph = DictGraph(True) self.assertEquals(dictGraph.getNumEdges(), 0) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getNumEdges(), 3) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getNumEdges(), 3) dictGraph.addEdge(3, 5, 1) self.assertEquals(dictGraph.getNumEdges(), 4) dictGraph.addEdge(3, 3, 1) self.assertEquals(dictGraph.getNumEdges(), 5) #Identical tests with directed graphs dictGraph = DictGraph(False) self.assertEquals(dictGraph.getNumEdges(), 0) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getNumEdges(), 3) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getNumEdges(), 3) dictGraph.addEdge(3, 5, 1) self.assertEquals(dictGraph.getNumEdges(), 4) dictGraph.addEdge(3, 3, 1) self.assertEquals(dictGraph.getNumEdges(), 5) def testGetEdge(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) self.assertEquals(dictGraph.getEdge(1, 2), 12) self.assertEquals(dictGraph.getEdge(2, 1), 12) self.assertEquals(dictGraph.getEdge(2, 2), None) self.assertRaises(ValueError, dictGraph.getEdge, 5, 8) dictGraph = DictGraph(False) dictGraph.addEdge(1, 2, 12) self.assertEquals(dictGraph.getEdge(1, 2), 12) self.assertEquals(dictGraph.getEdge(2, 1), None) def testGetNeighbours(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(1, 4, 1) dictGraph.addEdge(3, 4, 1) dictGraph.addEdge(2, 2, 1) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.neighbours(1), [2, 3, 4]) self.assertEquals(dictGraph.neighbours(3), [1, 4]) self.assertEquals(dictGraph.neighbours(2), [1, 2]) self.assertEquals(dictGraph.neighbours(5), []) #Directed graphs dictGraph = DictGraph(False) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(1, 4, 1) dictGraph.addEdge(3, 4, 1) dictGraph.addEdge(2, 2, 1) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.neighbours(1), [2,3,4]) self.assertEquals(dictGraph.neighbours(3), [4]) self.assertEquals(dictGraph.neighbours(2), [2]) self.assertEquals(dictGraph.neighbours(5), []) def testGetVertex(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.getVertex(1), None) self.assertEquals(dictGraph.getVertex(2), None) self.assertEquals(dictGraph.getVertex(3), None) self.assertEquals(dictGraph.getVertex(5), 12) self.assertRaises(ValueError, dictGraph.getVertex, 4) #Directed graphs dictGraph = DictGraph(False) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.getVertex(1), None) self.assertEquals(dictGraph.getVertex(2), None) self.assertEquals(dictGraph.getVertex(3), None) self.assertEquals(dictGraph.getVertex(5), 12) self.assertRaises(ValueError, dictGraph.getVertex, 4) def testAddVertex(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.getVertex(5), 12) dictGraph.setVertex(5, 22) self.assertEquals(dictGraph.getVertex(5), 22) dictGraph.addEdge(5, 11, 18) self.assertEquals(dictGraph.getVertex(5), 22) def testGetAllVertexIds(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.getAllVertexIds(), [1, 2, 3, 5]) def testGetAllEdges(self): dictGraph = DictGraph(True) dictGraph.setVertex(5, 12) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) edges = dictGraph.getAllEdges() self.assertEquals(len(edges), 2) self.assertTrue((1,2) in edges) self.assertTrue((1,3) in edges) dictGraph = DictGraph(False) dictGraph.setVertex(5, 12) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(2, 1, 12) dictGraph.addEdge(1, 3, 18) edges = dictGraph.getAllEdges() self.assertEquals(len(edges), 3) self.assertTrue((1,2) in edges) self.assertTrue((2,1) in edges) self.assertTrue((1,3) in edges) def testDensity(self): numVertices = 10 graph = DictGraph(True) for i in range(numVertices): graph.setVertex(i, 0) graph.addEdge(0, 1) self.assertEquals(graph.density(), float(1)/45) graph.addEdge(0, 2) self.assertEquals(graph.density(), float(2)/45) graph = DictGraph(False) for i in range(numVertices): graph.setVertex(i, 0) graph.addEdge(0, 1) self.assertEquals(graph.density(), float(1)/90) graph.addEdge(0, 2) self.assertEquals(graph.density(), float(2)/90) #Test a graph with 1 vertex graph = DictGraph(True) graph.setVertex(0, 12) self.assertEquals(graph.density(), 0) graph.addEdge(0, 0) self.assertEquals(graph.density(), 1) def testSetVertices(self): graph = DictGraph() vertexIndices = [1, 2, 3] vertices = ["a", "b", "c"] graph.setVertices(vertexIndices, vertices) vertexIndices2 = graph.getAllVertexIds() vertices2 = graph.getVertices(vertexIndices2) self.assertEquals(vertexIndices, vertexIndices2) self.assertEquals(vertices, vertices2) def testGetWeightMatrix(self): graph = DictGraph() graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d") graph.addEdge("d", "e") W = graph.getWeightMatrix() keys = graph.getAllVertexIds() for i in range(len(keys)): for j in range(len(keys)): if W[i, j] == 1: self.assertEquals(graph.getEdge(keys[i], keys[j]), 1) else: self.assertEquals(graph.getEdge(keys[i], keys[j]), None) #Try a directed graph graph = DictGraph(False) graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d") graph.addEdge("d", "e") W = graph.getWeightMatrix() for i in range(len(keys)): for j in range(len(keys)): if W[i, j] == 1: self.assertEquals(graph.getEdge(keys[i], keys[j]), 1) else: self.assertEquals(graph.getEdge(keys[i], keys[j]), None) def testGetSparseWeightMatrix(self): graph = DictGraph() graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d", "blah") graph.addEdge("d", "e", -1.1) graph.addEdge("c", "b", 2) W = graph.getSparseWeightMatrix() keys = graph.getAllVertexIds() for i in range(len(keys)): for j in range(len(keys)): if graph.edgeExists(keys[i], keys[j]) and not isinstance(graph.getEdge(keys[i], keys[j]), numbers.Number): self.assertEquals(1, W[i, j]) elif W[i, j] != 0: self.assertEquals(graph.getEdge(keys[i], keys[j]), W[i, j]) else: self.assertEquals(graph.getEdge(keys[i], keys[j]), None) #Try a directed graph graph = DictGraph(False) graph.addEdge("a", "b") graph.addEdge("a", "c", "test") graph.addEdge("a", "d") graph.addEdge("d", "e") graph.addEdge("c", "a", 0.1) W = graph.getSparseWeightMatrix() for i in range(len(keys)): for j in range(len(keys)): if graph.edgeExists(keys[i], keys[j]) and not isinstance(graph.getEdge(keys[i], keys[j]), numbers.Number): self.assertEquals(1, W[i, j]) elif W[i, j] != 0: self.assertEquals(graph.getEdge(keys[i], keys[j]), W[i, j]) else: self.assertEquals(graph.getEdge(keys[i], keys[j]), None) def testGetAllEdgeIndices(self): graph = DictGraph() graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d") graph.addEdge("d", "e") edgeIndices = graph.getAllEdgeIndices() keys = graph.getAllVertexIds() self.assertEquals(edgeIndices.shape[0], graph.getNumEdges()) for i in range(edgeIndices.shape[0]): self.assertTrue(graph.getEdge(keys[int(edgeIndices[i, 0])], keys[edgeIndices[i, 1]]) == 1) graph = DictGraph(False) graph.addEdge("a", "b") graph.addEdge("b", "a") graph.addEdge("a", "c") graph.addEdge("a", "d") graph.addEdge("d", "e") edgeIndices = graph.getAllEdgeIndices() keys = graph.getAllVertexIds() self.assertEquals(edgeIndices.shape[0], graph.getNumEdges()) for i in range(edgeIndices.shape[0]): self.assertTrue(graph.getEdge(keys[int(edgeIndices[i, 0])], keys[edgeIndices[i, 1]]) == 1) def testGetItem(self): graph = DictGraph() graph.addEdge(1, 1, 0.1) graph.addEdge(1, 3, 0.5) graph.addEdge(2, 4, 1) graph.addEdge(2, 3, 2) graph.setVertex(0, "abc") self.assertEquals(graph[1,1], 0.1) self.assertEquals(graph[1,3], 0.5) def testSetItem(self): graph = DictGraph() graph.addEdge(1, 1, 0.1) graph.addEdge(1, 3, 0.5) self.assertEquals(graph[1,3], 0.5) graph[1, 3] = 2 self.assertEquals(graph[1,3], 2) def testAddEdges(self): graph = DictGraph() edgeList = [(1, 2), (2, 1), (5, 2), (8, 8)] graph.addEdges(edgeList) self.assertEquals(graph.getNumEdges(), 3) self.assertEquals(graph.getEdge(1, 2), 1) self.assertEquals(graph.getEdge(5, 2), 1) self.assertEquals(graph.getEdge(2, 1), 1) self.assertEquals(graph.getEdge(8, 8), 1) edgeValues = [1, 2, 3, 4] graph.addEdges(edgeList, edgeValues) self.assertEquals(graph.getEdge(1, 2), 2) self.assertEquals(graph.getEdge(5, 2), 3) self.assertEquals(graph.getEdge(2, 1), 2) self.assertEquals(graph.getEdge(8, 8), 4) #Now test directed graphs graph = DictGraph(False) graph.addEdges(edgeList) self.assertEquals(graph.getNumEdges(), 4) self.assertEquals(graph.getEdge(1, 2), 1) self.assertEquals(graph.getEdge(5, 2), 1) self.assertEquals(graph.getEdge(2, 1), 1) self.assertEquals(graph.getEdge(8, 8), 1) edgeValues = [1, 2, 3, 4] graph.addEdges(edgeList, edgeValues) self.assertEquals(graph.getEdge(1, 2), 1) self.assertEquals(graph.getEdge(5, 2), 3) self.assertEquals(graph.getEdge(2, 1), 2) self.assertEquals(graph.getEdge(8, 8), 4) def testSubgraph(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) graph.setVertex(0, "abc") graph.setVertex(3, "cde") self.assertEquals(graph.getNumEdges(), 5) subgraph = graph.subgraph([0, 1, 2]) self.assertEquals(subgraph.getNumVertices(), 3) self.assertEquals(subgraph.getNumEdges(), 3) self.assertEquals(subgraph.isUndirected(), True) self.assertEquals(subgraph.getEdge(0, 1), 1) self.assertEquals(subgraph.getEdge(0, 2), 1) self.assertEquals(subgraph.getEdge(1, 2), 1) self.assertEquals(subgraph.getVertex(0), "abc") #Check the original graph is fine self.assertEquals(graph.getNumVertices(), 4) self.assertEquals(graph.getNumEdges(), 5) self.assertEquals(graph.getVertex(0), "abc") self.assertEquals(graph.getVertex(3), "cde") #Now a quick test for directed graphs graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) subgraph = graph.subgraph([0, 1, 2]) self.assertEquals(subgraph.getNumEdges(), 3) self.assertEquals(subgraph.isUndirected(), False) self.assertEquals(subgraph.getEdge(0, 1), 1) self.assertEquals(subgraph.getEdge(0, 2), 1) self.assertEquals(subgraph.getEdge(1, 2), 1) def testNeighbourOf(self): graph = DictGraph(True) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) for i in range(4): self.assertEquals(graph.neighbours(i), graph.neighbourOf(i)) #Now test directed graph graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) self.assertEquals(graph.neighbourOf(0), []) self.assertEquals(graph.neighbourOf(1), [0]) self.assertEquals(graph.neighbourOf(2), [0,1]) self.assertEquals(graph.neighbourOf(3), [0, 2]) def testOutDegreeSequence(self): graph = DictGraph(True) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) degSeq, vertices = graph.outDegreeSequence() self.assertTrue((degSeq == numpy.array([ 3, 2, 3, 2.])).all()) self.assertTrue(vertices == [0, 1, 2, 3]) #Test results on a directed graph graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) degSeq, vertices = graph.outDegreeSequence() self.assertTrue((degSeq == numpy.array([ 3, 1, 1, 0])).all()) def testInDegreeSequence(self): graph = DictGraph(True) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) degSeq, vertices = graph.inDegreeSequence() self.assertTrue((degSeq == numpy.array([ 3, 2, 3, 2.])).all()) self.assertTrue(vertices == [0, 1, 2, 3]) #Test results on a directed graph graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) degSeq, vertices = graph.inDegreeSequence() self.assertTrue((degSeq == numpy.array([ 0, 1, 2, 2])).all()) def testVertexExists(self): graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) self.assertTrue(graph.vertexExists(0)) self.assertTrue(graph.vertexExists(1)) self.assertTrue(graph.vertexExists(2)) self.assertTrue(graph.vertexExists(3)) self.assertFalse(graph.vertexExists(4)) def testRemoveVertex(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) graph.addEdge(3, 4) graph.removeVertex(4) self.assertFalse(graph.vertexExists(4)) self.assertFalse(graph.edgeExists(3, 4)) graph.removeVertex(3) self.assertFalse(graph.vertexExists(3)) self.assertFalse(graph.edgeExists(2, 3)) self.assertFalse(graph.edgeExists(0, 3)) graph.removeVertex(2) self.assertFalse(graph.vertexExists(2)) self.assertFalse(graph.edgeExists(1, 2)) self.assertFalse(graph.edgeExists(0, 2)) self.assertTrue(graph.getAllVertexIds() == [0, 1]) self.assertTrue(graph.getAllEdges() == [(0, 1)]) #Try directed graph graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(1, 0) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) graph.addEdge(3, 4) graph.removeVertex(0) self.assertFalse(graph.vertexExists(0)) self.assertFalse(graph.edgeExists(0, 1)) self.assertFalse(graph.edgeExists(0, 3)) self.assertFalse(graph.edgeExists(1, 0)) graph.removeVertex(2) self.assertFalse(graph.vertexExists(2)) self.assertFalse(graph.edgeExists(1, 2)) self.assertFalse(graph.edgeExists(2, 3)) self.assertTrue(graph.getAllVertexIds() == [1, 3, 4]) self.assertTrue(graph.getAllEdges() == [(3, 4)]) def testToSparseGraph(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) graph.addEdge(3, 4) graph2 = graph.toSparseGraph() self.assertEquals(graph2[0, 1], 1) self.assertEquals(graph2[0, 2], 1) self.assertEquals(graph2[0, 3], 1) self.assertEquals(graph2[2, 1], 1) self.assertEquals(graph2[2, 3], 1) self.assertEquals(graph2[3, 4], 1) def testDepthFirstSearch(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(1, 2) graph.addEdge(1, 3) graph.addEdge(2, 6) graph.addEdge(4, 5) self.assertEquals(graph.depthFirstSearch(0), [0,1,2,6,3]) self.assertEquals(graph.depthFirstSearch(1), [1,0,2,6,3]) self.assertEquals(graph.depthFirstSearch(6), [6,2,1,0,3]) self.assertEquals(graph.depthFirstSearch(4), [4, 5]) self.assertEquals(graph.depthFirstSearch(5), [5, 4]) def testBreadthFirstSearch(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(0, 7) graph.addEdge(7, 8) graph.addEdge(7, 9) graph.addEdge(1, 2) graph.addEdge(1, 3) graph.addEdge(2, 6) graph.addEdge(4, 5) self.assertEquals(graph.breadthFirstSearch(0), [0,1, 7,2,3,8,9,6]) self.assertEquals(graph.breadthFirstSearch(1), [1,0,2,3,7,6,8,9]) self.assertEquals(graph.breadthFirstSearch(6), [6, 2,1,0,3,7,8,9]) self.assertEquals(graph.breadthFirstSearch(4), [4, 5]) self.assertEquals(graph.breadthFirstSearch(5), [5, 4]) self.assertEquals(graph.breadthFirstSearch(7), [7, 0, 8, 9, 1, 2, 3, 6]) def testDegreeSequence(self): graph = DictGraph() graph.setVertex("a", 10) graph["b", "c"] = 1 graph["b", "d"] = 1 graph["d", "e"] = 1 graph["e", "e"] = 1 degreeDict = {} degreeDict2 = {"a": 0, "b": 2, "c": 1, "d": 2, "e": 3} for i, id in enumerate(graph.getAllVertexIds()): degreeDict[id] = graph.degreeSequence()[i] self.assertEquals(degreeDict, degreeDict2) def testGetNumDirEdges(self): graph = DictGraph() graph.addEdge(0, 1, 0.1) graph.addEdge(1, 2, 0.1) self.assertTrue(graph.getNumDirEdges() == 4) graph.addEdge(1, 1) self.assertTrue(graph.getNumDirEdges() == 5) graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(1, 2) self.assertTrue(graph.getNumDirEdges() == 2) graph.addEdge(1, 1) self.assertTrue(graph.getNumDirEdges() == 3) def testDijkstrasAlgorithm(self): graph = DictGraph() graph.addEdge(0, 1, 1) graph.addEdge(1, 2, 1) graph.addEdge(1, 3, 1) graph.addEdge(2, 4, 1) graph.setVertex(4, 1) self.assertTrue((graph.dijkstrasAlgorithm(0) == numpy.array([0, 1, 2, 2, 3])).all()) self.assertTrue((graph.dijkstrasAlgorithm(1) == numpy.array([1, 0, 1, 1, 2])).all()) self.assertTrue((graph.dijkstrasAlgorithm(2) == numpy.array([2, 1, 0, 2, 1])).all()) self.assertTrue((graph.dijkstrasAlgorithm(3) == numpy.array([2, 1, 2, 0, 3])).all()) self.assertTrue((graph.dijkstrasAlgorithm(4) == numpy.array([3, 2, 1, 3, 0])).all()) #Test a graph which has an isolated node graph = DictGraph() graph.setVertex(5, 1) graph.addEdge(0, 1, 1) graph.addEdge(1, 2, 1) graph.addEdge(1, 3, 1) self.assertTrue((graph.dijkstrasAlgorithm(0) == numpy.array([0, 1, 2, 2, numpy.inf])).all()) #Test a graph in a ring graph = DictGraph() graph.addEdge(0, 1, 1) graph.addEdge(1, 2, 1) graph.addEdge(2, 3, 1) graph.addEdge(3, 4, 1) graph.addEdge(4, 0, 1) self.assertTrue((graph.dijkstrasAlgorithm(0) == numpy.array([0, 1, 2, 2, 1])).all()) #Try case in which vertex ids are not numbers graph = DictGraph() graph.addEdge("a", "b", 1) graph.addEdge("b", "c", 1) graph.addEdge("b", "d", 1) graph.addEdge("c", "e", 1) inds = Util.argsort(graph.getAllVertexIds()) self.assertTrue((graph.dijkstrasAlgorithm("a")[inds] == numpy.array([0, 1, 2, 2, 3])).all()) self.assertTrue((graph.dijkstrasAlgorithm("b")[inds] == numpy.array([1, 0, 1, 1, 2])).all()) self.assertTrue((graph.dijkstrasAlgorithm("c")[inds] == numpy.array([2, 1, 0, 2, 1])).all()) self.assertTrue((graph.dijkstrasAlgorithm("d")[inds] == numpy.array([2, 1, 2, 0, 3])).all()) self.assertTrue((graph.dijkstrasAlgorithm("e")[inds] == numpy.array([3, 2, 1, 3, 0])).all()) def testAdjacencyList(self): graph = DictGraph() graph.addEdge("a", "b", 1) graph.addEdge("b", "c", 1) graph.addEdge("b", "d", 1) graph.addEdge("c", "e", 1) graph.setVertex("f", 1) neighbourIndices, neighbourWeights = graph.adjacencyList() vertexIds = graph.getAllVertexIds() for i in range(len(neighbourIndices)): for k, j in enumerate(neighbourIndices[i]): self.assertTrue(graph.edgeExists(vertexIds[i], vertexIds[j])) self.assertEquals(graph[vertexIds[i], vertexIds[j]], neighbourWeights[i][k]) def testFindAllDistances(self): P = self.graph.findAllDistances() P2 = numpy.zeros((self.graph.size, self.graph.size)) P2[0, :] = numpy.array([0, 1, 2, 2, 1, numpy.inf]) P2[1, :] = numpy.array([1, 0, 3, 1, 2, numpy.inf]) P2[2, :] = numpy.array([2, 3, 0, 4, 3, numpy.inf]) P2[3, :] = numpy.array([2, 1, 4, 0, 1, numpy.inf]) P2[4, :] = numpy.array([1, 2, 3, 1, 0, numpy.inf]) P2[5, :] = numpy.array([numpy.inf, numpy.inf, numpy.inf, numpy.inf, numpy.inf, 0]) self.assertTrue((P == P2).all()) #Now test the directed graph P = self.graph2.findAllDistances() P2 = numpy.zeros((self.graph.size, self.graph.size)) P2[0, :] = numpy.array([0, 1, 2, 2, 1, numpy.inf]) P2[1, :] = numpy.array([numpy.inf, 0, numpy.inf, 1, 2, numpy.inf]) P2[2, :] = numpy.array([numpy.inf, numpy.inf, 0, 5, 6, numpy.inf]) P2[3, :] = numpy.array([numpy.inf, numpy.inf, numpy.inf, 0, 1, numpy.inf]) P2[4, :] = numpy.array([numpy.inf, numpy.inf, numpy.inf, numpy.inf, 0, numpy.inf]) P2[5, :] = numpy.array([numpy.inf, numpy.inf, numpy.inf, numpy.inf, numpy.inf, 0]) self.assertTrue((P == P2).all()) def testToIGraph(self): try: import igraph except ImportError as error: logging.debug(error) return graph = DictGraph() graph["a", "b"] = 1 graph["b", "c"] = 2 ig = graph.toIGraph() self.assertEquals(len(ig.vs), 3) self.assertEquals(ig[0, 2], 1) self.assertEquals(ig[1, 2], 1)
def testAddEdge(self): dictGraph = DictGraph() dictGraph.addEdge("A", "B", [1,2,3]) dictGraph.addEdge("A", "C", "HelloThere") dictGraph.addEdge(12, 8, [1,2,3, 12]) self.assertEquals(dictGraph.getEdge("A", "B"), [1,2,3]) self.assertEquals(dictGraph.getEdge("B", "A"), [1,2,3]) self.assertEquals(dictGraph.getEdge("A", "C"), "HelloThere") self.assertEquals(dictGraph.getEdge("C", "A"), "HelloThere") self.assertEquals(dictGraph.getEdge(12, 8), [1,2,3, 12]) self.assertEquals(dictGraph.getEdge(8, 12), [1,2,3, 12]) dictGraph.addEdge(2, 8) dictGraph = DictGraph(False) dictGraph.addEdge("A", "B", [1,2,3]) dictGraph.addEdge("A", "C", "HelloThere") dictGraph.addEdge(12, 8, [1,2,3, 12]) self.assertEquals(dictGraph.getEdge("A", "B"), [1,2,3]) self.assertEquals(dictGraph.getEdge("B", "A"), None) self.assertEquals(dictGraph.getEdge("A", "C"), "HelloThere") self.assertEquals(dictGraph.getEdge("C", "A"), None) self.assertEquals(dictGraph.getEdge(12, 8), [1,2,3, 12]) self.assertEquals(dictGraph.getEdge(8, 12), None) dictGraph.addEdge(2, 8)
class DatedPurchasesGraphListIterator(object): def __init__(self, purchasesByWeek, nb_purchases_per_it=None): """ The background graph is a bi-partite graph of purchases. Purchases are grouped by date (week by week), and we consider the graph of purchases between first week and $i$-th week. The returned graph considers only users and counts the number of common purchases between two users. Purchases are given in a list of [user, prod, week, year] with increasing date. nb_purchases_per_it is the maximum number of purchases to put in each week (if there is more, randomly split the week). None corresponds to no-limit case. """ # args self.group_by_iterator = DatedPurchasesGroupByIterator( purchasesByWeek, nb_purchases_per_it) # init variables self.dictUser = MyDictionary() self.dictProd = MyDictionary() for user, prod, week, year in purchasesByWeek: self.dictUser.index(user) self.dictProd.index(prod) self.backgroundGraph = DictGraph(False) # directed self.W = scipy.sparse.csr_matrix( (len(self.dictUser), len(self.dictUser)), dtype='int16') self.usefullEdges = numpy.array([]) def __iter__(self): return self def __next__(self): # next group of purchases (StopIteration is raised here) purchases_sublist = next(self.group_by_iterator) #logging.debug(" nb purchases: " + str(len(purchases_sublist))) # to check that the group really induces new edges W_has_changed = False # update graphs adding current-week purchases for user, prod, week, year in purchases_sublist: # update only if this purchase is seen for the first time try: newEdge = not self.backgroundGraph.getEdge(prod, user) except ValueError: newEdge = True if newEdge: self.backgroundGraph.addEdge(prod, user) newCommonPurchases = self.backgroundGraph.neighbours(prod) # print prod, newCommonPurchases for neighbour in filter(lambda neighbour: neighbour != user, newCommonPurchases): W_has_changed = True self.W[neighbour, user] += 1 self.W[user, neighbour] += 1 # the returned graph will be restricted to usefull edges currentUsefullEdges = numpy.array(self.W.sum(1)).ravel().nonzero()[0] newUsefullEdges = numpy.setdiff1d(currentUsefullEdges, self.usefullEdges) self.usefullEdges = numpy.r_[self.usefullEdges, newUsefullEdges] if W_has_changed: return self.W[self.usefullEdges, :][:, self.usefullEdges] else: return next(self) next = __next__
def testSubgraph(self): graph = DictGraph() graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) graph.setVertex(0, "abc") graph.setVertex(3, "cde") self.assertEquals(graph.getNumEdges(), 5) subgraph = graph.subgraph([0, 1, 2]) self.assertEquals(subgraph.getNumVertices(), 3) self.assertEquals(subgraph.getNumEdges(), 3) self.assertEquals(subgraph.isUndirected(), True) self.assertEquals(subgraph.getEdge(0, 1), 1) self.assertEquals(subgraph.getEdge(0, 2), 1) self.assertEquals(subgraph.getEdge(1, 2), 1) self.assertEquals(subgraph.getVertex(0), "abc") #Check the original graph is fine self.assertEquals(graph.getNumVertices(), 4) self.assertEquals(graph.getNumEdges(), 5) self.assertEquals(graph.getVertex(0), "abc") self.assertEquals(graph.getVertex(3), "cde") #Now a quick test for directed graphs graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) subgraph = graph.subgraph([0, 1, 2]) self.assertEquals(subgraph.getNumEdges(), 3) self.assertEquals(subgraph.isUndirected(), False) self.assertEquals(subgraph.getEdge(0, 1), 1) self.assertEquals(subgraph.getEdge(0, 2), 1) self.assertEquals(subgraph.getEdge(1, 2), 1)
def testNeighbourOf(self): graph = DictGraph(True) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) for i in range(4): self.assertEquals(graph.neighbours(i), graph.neighbourOf(i)) #Now test directed graph graph = DictGraph(False) graph.addEdge(0, 1) graph.addEdge(0, 2) graph.addEdge(0, 3) graph.addEdge(1, 2) graph.addEdge(2, 3) self.assertEquals(graph.neighbourOf(0), []) self.assertEquals(graph.neighbourOf(1), [0]) self.assertEquals(graph.neighbourOf(2), [0,1]) self.assertEquals(graph.neighbourOf(3), [0, 2])
def testGetSparseWeightMatrix(self): graph = DictGraph() graph.addEdge("a", "b") graph.addEdge("a", "c") graph.addEdge("a", "d", "blah") graph.addEdge("d", "e", -1.1) graph.addEdge("c", "b", 2) W = graph.getSparseWeightMatrix() keys = graph.getAllVertexIds() for i in range(len(keys)): for j in range(len(keys)): if graph.edgeExists(keys[i], keys[j]) and not isinstance(graph.getEdge(keys[i], keys[j]), numbers.Number): self.assertEquals(1, W[i, j]) elif W[i, j] != 0: self.assertEquals(graph.getEdge(keys[i], keys[j]), W[i, j]) else: self.assertEquals(graph.getEdge(keys[i], keys[j]), None) #Try a directed graph graph = DictGraph(False) graph.addEdge("a", "b") graph.addEdge("a", "c", "test") graph.addEdge("a", "d") graph.addEdge("d", "e") graph.addEdge("c", "a", 0.1) W = graph.getSparseWeightMatrix() for i in range(len(keys)): for j in range(len(keys)): if graph.edgeExists(keys[i], keys[j]) and not isinstance(graph.getEdge(keys[i], keys[j]), numbers.Number): self.assertEquals(1, W[i, j]) elif W[i, j] != 0: self.assertEquals(graph.getEdge(keys[i], keys[j]), W[i, j]) else: self.assertEquals(graph.getEdge(keys[i], keys[j]), None)
def testGetNeighbours(self): dictGraph = DictGraph(True) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(1, 4, 1) dictGraph.addEdge(3, 4, 1) dictGraph.addEdge(2, 2, 1) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.neighbours(1), [2, 3, 4]) self.assertEquals(dictGraph.neighbours(3), [1, 4]) self.assertEquals(dictGraph.neighbours(2), [1, 2]) self.assertEquals(dictGraph.neighbours(5), []) #Directed graphs dictGraph = DictGraph(False) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(1, 4, 1) dictGraph.addEdge(3, 4, 1) dictGraph.addEdge(2, 2, 1) dictGraph.setVertex(5, 12) self.assertEquals(dictGraph.neighbours(1), [2,3,4]) self.assertEquals(dictGraph.neighbours(3), [4]) self.assertEquals(dictGraph.neighbours(2), [2]) self.assertEquals(dictGraph.neighbours(5), [])
def testGetNumEdges(self): dictGraph = DictGraph(True) self.assertEquals(dictGraph.getNumEdges(), 0) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getNumEdges(), 3) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getNumEdges(), 3) dictGraph.addEdge(3, 5, 1) self.assertEquals(dictGraph.getNumEdges(), 4) dictGraph.addEdge(3, 3, 1) self.assertEquals(dictGraph.getNumEdges(), 5) #Identical tests with directed graphs dictGraph = DictGraph(False) self.assertEquals(dictGraph.getNumEdges(), 0) dictGraph.addEdge(1, 2, 12) dictGraph.addEdge(1, 3, 18) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getNumEdges(), 3) dictGraph.addEdge(3, 4, 1) self.assertEquals(dictGraph.getNumEdges(), 3) dictGraph.addEdge(3, 5, 1) self.assertEquals(dictGraph.getNumEdges(), 4) dictGraph.addEdge(3, 3, 1) self.assertEquals(dictGraph.getNumEdges(), 5)
class PajekWriterTest(unittest.TestCase): def setUp(self): #Let's set up a very simple graph numVertices = 5 numFeatures = 1 edges = [] vList = VertexList(numVertices, numFeatures) #An undirected dense graph self.dGraph1 = DenseGraph(vList, True) self.dGraph1.addEdge(0, 1, 1) self.dGraph1.addEdge(0, 2, 1) self.dGraph1.addEdge(2, 4, 1) self.dGraph1.addEdge(2, 3, 1) self.dGraph1.addEdge(3, 4, 1) #A directed sparse graph self.dGraph2 = DenseGraph(vList, False) self.dGraph2.addEdge(0, 1, 1) self.dGraph2.addEdge(0, 2, 1) self.dGraph2.addEdge(2, 4, 1) self.dGraph2.addEdge(2, 3, 1) self.dGraph2.addEdge(3, 4, 1) #Now try sparse graphs vList = VertexList(numVertices, numFeatures) self.sGraph1 = SparseGraph(vList, True) self.sGraph1.addEdge(0, 1, 1) self.sGraph1.addEdge(0, 2, 1) self.sGraph1.addEdge(2, 4, 1) self.sGraph1.addEdge(2, 3, 1) self.sGraph1.addEdge(3, 4, 1) self.sGraph2 = SparseGraph(vList, False) self.sGraph2.addEdge(0, 1, 1) self.sGraph2.addEdge(0, 2, 1) self.sGraph2.addEdge(2, 4, 1) self.sGraph2.addEdge(2, 3, 1) self.sGraph2.addEdge(3, 4, 1) #Finally, try DictGraphs self.dctGraph1 = DictGraph(True) self.dctGraph1.addEdge(0, 1, 1) self.dctGraph1.addEdge(0, 2, 2) self.dctGraph1.addEdge(2, 4, 8) self.dctGraph1.addEdge(2, 3, 1) self.dctGraph1.addEdge(12, 4, 1) self.dctGraph2 = DictGraph(False) self.dctGraph2.addEdge(0, 1, 1) self.dctGraph2.addEdge(0, 2, 1) self.dctGraph2.addEdge(2, 4, 1) self.dctGraph2.addEdge(2, 3, 1) self.dctGraph2.addEdge(12, 4, 1) def tearDown(self): pass def testInit(self): pass def testWriteToFile(self): pw = PajekWriter() directory = PathDefaults.getOutputDir() + "test/" #Have to check the files fileName1 = directory + "denseTestUndirected" pw.writeToFile(fileName1, self.dGraph1) fileName2 = directory + "denseTestDirected" pw.writeToFile(fileName2, self.dGraph2) fileName3 = directory + "sparseTestUndirected" pw.writeToFile(fileName3, self.sGraph1) fileName4 = directory + "sparseTestDirected" pw.writeToFile(fileName4, self.sGraph2) fileName5 = directory + "dictTestUndirected" pw.writeToFile(fileName5, self.dctGraph1) fileName6 = directory + "dictTestDirected" pw.writeToFile(fileName6, self.dctGraph2) def testWriteToFile2(self): pw = PajekWriter() directory = PathDefaults.getOutputDir() + "test/" def setVertexColour(vertexIndex, graph): colours = ["grey05", "grey10", "grey15", "grey20", "grey25"] return colours[vertexIndex] def setVertexSize(vertexIndex, graph): return vertexIndex def setEdgeColour(vertexIndex1, vertexIndex2, graph): colours = ["grey05", "grey10", "grey15", "grey20", "grey25"] return colours[vertexIndex1] def setEdgeSize(vertexIndex1, vertexIndex2, graph): return vertexIndex1+vertexIndex2 pw.setVertexColourFunction(setVertexColour) fileName1 = directory + "vertexColourTest" pw.writeToFile(fileName1, self.dGraph1) pw.setVertexColourFunction(None) pw.setVertexSizeFunction(setVertexSize) fileName1 = directory + "vertexSizeTest" pw.writeToFile(fileName1, self.dGraph1) pw.setVertexSizeFunction(None) pw.setEdgeColourFunction(setEdgeColour) fileName1 = directory + "edgeColourTest" pw.writeToFile(fileName1, self.dGraph1) pw.setEdgeColourFunction(None) pw.setEdgeSizeFunction(setEdgeSize) fileName1 = directory + "edgeSizeTest" pw.writeToFile(fileName1, self.dGraph1) pw.setEdgeColourFunction(None) def testWriteToFile3(self): """ We will test out writing out some random graphs to Pajek """ numVertices = 20 numFeatures = 0 vList = VertexList(numVertices, numFeatures) graph = SparseGraph(vList) p = 0.1 generator = ErdosRenyiGenerator(p) graph = generator.generate(graph) pw = PajekWriter() directory = PathDefaults.getOutputDir() + "test/" pw.writeToFile(directory + "erdosRenyi20", graph) #Now write a small world graph p = 0.2 k = 3 graph.removeAllEdges() generator = SmallWorldGenerator(p, k) graph = generator.generate(graph) pw.writeToFile(directory + "smallWorld20", graph)