1 #!/usr/bin/env python 2 from nose.tools import * 3 import networkx 4 from test_multigraph import BaseMultiGraphTester, TestMultiGraph 5 6 class BaseMultiDiGraphTester(BaseMultiGraphTester): 7 def test_edges(self): 8 G=self.K3 9 assert_equal(sorted(G.edges()),[(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 10 assert_equal(sorted(G.edges(0)),[(0,1),(0,2)]) 11 assert_raises((KeyError,networkx.NetworkXError), G.edges,-1) 12 13 def test_edges_data(self): 14 G=self.K3 15 assert_equal(sorted(G.edges(data=True)), 16 [(0,1,{}),(0,2,{}),(1,0,{}),(1,2,{}),(2,0,{}),(2,1,{})]) 17 assert_equal(sorted(G.edges(0,data=True)),[(0,1,{}),(0,2,{})]) 18 assert_raises((KeyError,networkx.NetworkXError), G.neighbors,-1) 19 20 21 def test_edges_iter(self): 22 G=self.K3 23 assert_equal(sorted(G.edges_iter()), 24 [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 25 assert_equal(sorted(G.edges_iter(0)),[(0,1),(0,2)]) 26 G.add_edge(0,1) 27 assert_equal(sorted(G.edges_iter()), 28 [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 29 30 def test_out_edges(self): 31 G=self.K3 32 assert_equal(sorted(G.out_edges()), 33 [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 34 assert_equal(sorted(G.out_edges(0)),[(0,1),(0,2)]) 35 assert_raises((KeyError,networkx.NetworkXError), G.out_edges,-1) 36 assert_equal(sorted(G.out_edges(0,keys=True)),[(0,1,0),(0,2,0)]) 37 38 def test_out_edges_iter(self): 39 G=self.K3 40 assert_equal(sorted(G.out_edges_iter()), 41 [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 42 assert_equal(sorted(G.out_edges_iter(0)),[(0,1),(0,2)]) 43 G.add_edge(0,1,2) 44 assert_equal(sorted(G.out_edges_iter()), 45 [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 46 47 def test_in_edges(self): 48 G=self.K3 49 assert_equal(sorted(G.in_edges()), 50 [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 51 assert_equal(sorted(G.in_edges(0)),[(1,0),(2,0)]) 52 assert_raises((KeyError,networkx.NetworkXError), G.in_edges,-1) 53 G.add_edge(0,1,2) 54 assert_equal(sorted(G.in_edges()), 55 [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 56 assert_equal(sorted(G.in_edges(0,keys=True)),[(1,0,0),(2,0,0)]) 57 58 def test_in_edges_iter(self): 59 G=self.K3 60 assert_equal(sorted(G.in_edges_iter()), 61 [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 62 assert_equal(sorted(G.in_edges_iter(0)),[(1,0),(2,0)]) 63 G.add_edge(0,1,2) 64 assert_equal(sorted(G.in_edges_iter()), 65 [(0,1),(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]) 66 67 assert_equal(sorted(G.in_edges_iter(data=True,keys=False)), 68 [(0,1,{}),(0,1,{}),(0,2,{}),(1,0,{}),(1,2,{}), 69 (2,0,{}),(2,1,{})]) 70 71 72 def is_shallow(self,H,G): 73 # graph 74 assert_equal(G.graph['foo'],H.graph['foo']) 75 G.graph['foo'].append(1) 76 assert_equal(G.graph['foo'],H.graph['foo']) 77 # node 78 assert_equal(G.node[0]['foo'],H.node[0]['foo']) 79 G.node[0]['foo'].append(1) 80 assert_equal(G.node[0]['foo'],H.node[0]['foo']) 81 # edge 82 assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) 83 G[1][2][0]['foo'].append(1) 84 assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) 85 86 def is_deep(self,H,G): 87 # graph 88 assert_equal(G.graph['foo'],H.graph['foo']) 89 G.graph['foo'].append(1) 90 assert_not_equal(G.graph['foo'],H.graph['foo']) 91 # node 92 assert_equal(G.node[0]['foo'],H.node[0]['foo']) 93 G.node[0]['foo'].append(1) 94 assert_not_equal(G.node[0]['foo'],H.node[0]['foo']) 95 # edge 96 assert_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) 97 G[1][2][0]['foo'].append(1) 98 assert_not_equal(G[1][2][0]['foo'],H[1][2][0]['foo']) 99 100 def test_to_undirected(self): 101 # MultiDiGraph -> MultiGraph changes number of edges so it is 102 # not a copy operation... use is_shallow, not is_shallow_copy 103 G=self.K3 104 self.add_attributes(G) 105 H=networkx.MultiGraph(G) 106 self.is_shallow(H,G) 107 H=G.to_undirected() 108 self.is_deep(H,G) 109 110 def test_has_successor(self): 111 G=self.K3 112 assert_equal(G.has_successor(0,1),True) 113 assert_equal(G.has_successor(0,-1),False) 114 115 def test_successors(self): 116 G=self.K3 117 assert_equal(sorted(G.successors(0)),[1,2]) 118 assert_raises((KeyError,networkx.NetworkXError), G.successors,-1) 119 120 def test_successors_iter(self): 121 G=self.K3 122 assert_equal(sorted(G.successors_iter(0)),[1,2]) 123 assert_raises((KeyError,networkx.NetworkXError), G.successors_iter,-1) 124 125 def test_has_predecessor(self): 126 G=self.K3 127 assert_equal(G.has_predecessor(0,1),True) 128 assert_equal(G.has_predecessor(0,-1),False) 129 130 def test_predecessors(self): 131 G=self.K3 132 assert_equal(sorted(G.predecessors(0)),[1,2]) 133 assert_raises((KeyError,networkx.NetworkXError), G.predecessors,-1) 134 135 def test_predecessors_iter(self): 136 G=self.K3 137 assert_equal(sorted(G.predecessors_iter(0)),[1,2]) 138 assert_raises((KeyError,networkx.NetworkXError), G.predecessors_iter,-1) 139 140 141 def test_degree(self): 142 G=self.K3 143 assert_equal(list(G.degree().values()),[4,4,4]) 144 assert_equal(G.degree(),{0:4,1:4,2:4}) 145 assert_equal(G.degree(0),4) 146 assert_equal(G.degree([0]),{0:4}) 147 assert_raises((KeyError,networkx.NetworkXError), G.degree,-1) 148 149 def test_degree_iter(self): 150 G=self.K3 151 assert_equal(list(G.degree_iter()),[(0,4),(1,4),(2,4)]) 152 assert_equal(dict(G.degree_iter()),{0:4,1:4,2:4}) 153 assert_equal(list(G.degree_iter(0)),[(0,4)]) 154 G.add_edge(0,1,weight=0.3,other=1.2) 155 assert_equal(list(G.degree_iter(weight='weight')),[(0,4.3),(1,4.3),(2,4)]) 156 assert_equal(list(G.degree_iter(weight='other')),[(0,5.2),(1,5.2),(2,4)]) 157 158 159 def test_in_degree(self): 160 G=self.K3 161 assert_equal(list(G.in_degree().values()),[2,2,2]) 162 assert_equal(G.in_degree(),{0:2,1:2,2:2}) 163 assert_equal(G.in_degree(0),2) 164 assert_equal(G.in_degree([0]),{0:2}) 165 assert_raises((KeyError,networkx.NetworkXError), G.in_degree,-1) 166 167 def test_in_degree_iter(self): 168 G=self.K3 169 assert_equal(list(G.in_degree_iter()),[(0,2),(1,2),(2,2)]) 170 assert_equal(dict(G.in_degree_iter()),{0:2,1:2,2:2}) 171 assert_equal(list(G.in_degree_iter(0)),[(0,2)]) 172 assert_equal(list(G.in_degree_iter(0,weight='weight')),[(0,2)]) 173 174 def test_out_degree(self): 175 G=self.K3 176 assert_equal(list(G.out_degree().values()),[2,2,2]) 177 assert_equal(G.out_degree(),{0:2,1:2,2:2}) 178 assert_equal(G.out_degree(0),2) 179 assert_equal(G.out_degree([0]),{0:2}) 180 assert_raises((KeyError,networkx.NetworkXError), G.out_degree,-1) 181 182 def test_out_degree_iter(self): 183 G=self.K3 184 assert_equal(list(G.out_degree_iter()),[(0,2),(1,2),(2,2)]) 185 assert_equal(dict(G.out_degree_iter()),{0:2,1:2,2:2}) 186 assert_equal(list(G.out_degree_iter(0)),[(0,2)]) 187 assert_equal(list(G.out_degree_iter(0,weight='weight')),[(0,2)]) 188 189 190 def test_size(self): 191 G=self.K3 192 assert_equal(G.size(),6) 193 assert_equal(G.number_of_edges(),6) 194 G.add_edge(0,1,weight=0.3,other=1.2) 195 assert_equal(G.size(weight='weight'),6.3) 196 assert_equal(G.size(weight='other'),7.2) 197 198 def test_to_undirected_reciprocal(self): 199 G=self.Graph() 200 G.add_edge(1,2) 201 assert_true(G.to_undirected().has_edge(1,2)) 202 assert_false(G.to_undirected(reciprocal=True).has_edge(1,2)) 203 G.add_edge(2,1) 204 assert_true(G.to_undirected(reciprocal=True).has_edge(1,2)) 205 206 def test_reverse_copy(self): 207 G=networkx.MultiDiGraph([(0,1),(0,1)]) 208 R=G.reverse() 209 assert_equal(sorted(R.edges()),[(1,0),(1,0)]) 210 R.remove_edge(1,0) 211 assert_equal(sorted(R.edges()),[(1,0)]) 212 assert_equal(sorted(G.edges()),[(0,1),(0,1)]) 213 214 def test_reverse_nocopy(self): 215 G=networkx.MultiDiGraph([(0,1),(0,1)]) 216 R=G.reverse(copy=False) 217 assert_equal(sorted(R.edges()),[(1,0),(1,0)]) 218 R.remove_edge(1,0) 219 assert_equal(sorted(R.edges()),[(1,0)]) 220 assert_equal(sorted(G.edges()),[(1,0)]) 221 222 223 class TestMultiDiGraph(BaseMultiDiGraphTester,TestMultiGraph): 224 def setUp(self): 225 self.Graph=networkx.MultiDiGraph 226 # build K3 227 self.k3edges=[(0, 1), (0, 2), (1, 2)] 228 self.k3nodes=[0, 1, 2] 229 self.K3=self.Graph() 230 self.K3.adj={0:{},1:{},2:{}} 231 self.K3.succ=self.K3.adj 232 self.K3.pred={0:{},1:{},2:{}} 233 for u in self.k3nodes: 234 for v in self.k3nodes: 235 if u==v: continue 236 d={0:{}} 237 self.K3.succ[u][v]=d 238 self.K3.pred[v][u]=d 239 self.K3.adj=self.K3.succ 240 self.K3.edge=self.K3.adj 241 self.K3.node={} 242 self.K3.node[0]={} 243 self.K3.node[1]={} 244 self.K3.node[2]={} 245 246 247 def test_add_edge(self): 248 G=self.Graph() 249 G.add_edge(0,1) 250 assert_equal(G.adj,{0: {1: {0:{}}}, 1: {}}) 251 assert_equal(G.succ,{0: {1: {0:{}}}, 1: {}}) 252 assert_equal(G.pred,{0: {}, 1: {0:{0:{}}}}) 253 G=self.Graph() 254 G.add_edge(*(0,1)) 255 assert_equal(G.adj,{0: {1: {0:{}}}, 1: {}}) 256 assert_equal(G.succ,{0: {1: {0:{}}}, 1: {}}) 257 assert_equal(G.pred,{0: {}, 1: {0:{0:{}}}}) 258 259 def test_add_edges_from(self): 260 G=self.Graph() 261 G.add_edges_from([(0,1),(0,1,{'weight':3})]) 262 assert_equal(G.adj,{0: {1: {0:{},1:{'weight':3}}}, 1: {}}) 263 assert_equal(G.succ,{0: {1: {0:{},1:{'weight':3}}}, 1: {}}) 264 assert_equal(G.pred,{0: {}, 1: {0:{0:{},1:{'weight':3}}}}) 265 266 G.add_edges_from([(0,1),(0,1,{'weight':3})],weight=2) 267 assert_equal(G.succ,{0: {1: {0:{}, 268 1:{'weight':3}, 269 2:{'weight':2}, 270 3:{'weight':3}}}, 271 1: {}}) 272 assert_equal(G.pred,{0: {}, 1: {0:{0:{},1:{'weight':3}, 273 2:{'weight':2}, 274 3:{'weight':3}}}}) 275 276 assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,)]) # too few in tuple 277 assert_raises(networkx.NetworkXError, G.add_edges_from,[(0,1,2,3,4)]) # too many in tuple 278 assert_raises(TypeError, G.add_edges_from,[0]) # not a tuple 279 280 def test_remove_edge(self): 281 G=self.K3 282 G.remove_edge(0,1) 283 assert_equal(G.succ,{0:{2:{0:{}}}, 284 1:{0:{0:{}},2:{0:{}}}, 285 2:{0:{0:{}},1:{0:{}}}}) 286 assert_equal(G.pred,{0:{1:{0:{}}, 2:{0:{}}}, 287 1:{2:{0:{}}}, 288 2:{0:{0:{}},1:{0:{}}}}) 289 assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0) 290 assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,0,2, 291 key=1) 292 293 294 def test_remove_multiedge(self): 295 G=self.K3 296 G.add_edge(0,1,key='parallel edge') 297 G.remove_edge(0,1,key='parallel edge') 298 assert_equal(G.adj,{0: {1: {0:{}}, 2: {0:{}}}, 299 1: {0: {0:{}}, 2: {0:{}}}, 300 2: {0: {0:{}}, 1: {0:{}}}}) 301 302 assert_equal(G.succ,{0: {1: {0:{}}, 2: {0:{}}}, 303 1: {0: {0:{}}, 2: {0:{}}}, 304 2: {0: {0:{}}, 1: {0:{}}}}) 305 306 assert_equal(G.pred,{0:{1: {0:{}},2:{0:{}}}, 307 1:{0:{0:{}},2:{0:{}}}, 308 2:{0:{0:{}},1:{0:{}}}}) 309 G.remove_edge(0,1) 310 assert_equal(G.succ,{0:{2:{0:{}}}, 311 1:{0:{0:{}},2:{0:{}}}, 312 2:{0:{0:{}},1:{0:{}}}}) 313 assert_equal(G.pred,{0:{1:{0:{}}, 2:{0:{}}}, 314 1:{2:{0:{}}}, 315 2:{0:{0:{}},1:{0:{}}}}) 316 assert_raises((KeyError,networkx.NetworkXError), G.remove_edge,-1,0) 317 318 def test_remove_edges_from(self): 319 G=self.K3 320 G.remove_edges_from([(0,1)]) 321 assert_equal(G.succ,{0:{2:{0:{}}}, 322 1:{0:{0:{}},2:{0:{}}}, 323 2:{0:{0:{}},1:{0:{}}}}) 324 assert_equal(G.pred,{0:{1:{0:{}}, 2:{0:{}}}, 325 1:{2:{0:{}}}, 326 2:{0:{0:{}},1:{0:{}}}}) 327 G.remove_edges_from([(0,0)]) # silent fail 328