1
- from collections import MappingView
1
+ from collections import MappingView , Set
2
2
from networkx .exception import NetworkXError
3
3
4
4
5
+ class BaseEdgeView (Set ):
6
+ __slots__ = ["_edgesobj" ]
7
+ def __init__ (self , edgesobj ):
8
+ self ._edgesobj = edgesobj
9
+ def __repr__ (self ):
10
+ return '{0.__class__.__name__}({1})' .format (self ,list (self ))
11
+ def __len__ (self ):
12
+ return len (self ._edgesobj )
13
+ # Set also demands __iter__ and __contains__ be defined.
14
+
15
+ class EdgeKeys (BaseEdgeView ):
16
+ __slots__ = ["_edgesobj" ]
17
+ def __iter__ (self ):
18
+ return iter (self ._edgesobj )
19
+ def __contains__ (self , key ):
20
+ u ,v = key
21
+ return v in self ._edgesobj ._adj [u ]
22
+
23
+ class EdgeData (BaseEdgeView ):
24
+ __slots__ = ["_edgesobj" ]
25
+ def __iter__ (self ):
26
+ for e ,d in self ._edgesobj ._items ():
27
+ yield d
28
+ def __contains__ (self , data ):
29
+ # Do we need/want to provide ability to look up a datadict?
30
+ # need to look at all data
31
+ for d in self :
32
+ if d == data :
33
+ return True
34
+ return False
35
+
36
+ class EdgeItems (BaseEdgeView ):
37
+ __slots__ = ["_edgesobj" ]
38
+ def __iter__ (self ):
39
+ return self ._edgesobj ._items ()
40
+ def __contains__ (self , key ):
41
+ adj = self ._edgesobj ._adj
42
+ (u ,v ),d = key
43
+ return v in adj [u ] and adj [u ][v ] == d
44
+
45
+
5
46
class UndirectedEdges (object ):
6
- __slots__ = ('_adj' ,'_node' )
7
- def __init__ (self , node , adj ):
8
- self ._adj = adj
9
- self ._node = node
47
+ def __len__ (self ):
48
+ return sum (len (nbrs ) for n , nbrs in self ._adj .items ()) // 2
10
49
def __iter__ (self ):
11
50
seen = set ()
12
51
nodes_nbrs = self ._adj .items ()
@@ -16,8 +55,6 @@ def __iter__(self):
16
55
yield (n , nbr )
17
56
seen .add (n )
18
57
del seen
19
- def __len__ (self ):
20
- return sum (len (nbrs ) for n , nbrs in self ._adj .items ()) // 2
21
58
def _items (self ):
22
59
seen = set ()
23
60
nodes_nbrs = self ._adj .items ()
@@ -27,35 +64,6 @@ def _items(self):
27
64
yield (n ,nbr ),ddict
28
65
seen .add (n )
29
66
del seen
30
-
31
- class EdgeKeys (UndirectedEdges ):
32
- def __repr__ (self ):
33
- return '{})' .format (list (self ))
34
-
35
- class EdgeData (UndirectedEdges ):
36
- def __iter__ (self ):
37
- for e ,d in self ._items ():
38
- yield d
39
- def __repr__ (self ):
40
- return '{})' .format (list (self ))
41
- def __contains__ (self , key ):
42
- # need to look at all data
43
- for k in self :
44
- if k == key :
45
- return True
46
- return False
47
-
48
- class EdgeItems (UndirectedEdges ):
49
- def __iter__ (self ):
50
- return self ._items ()
51
- def __repr__ (self ):
52
- return '{})' .format (list (self ))
53
- def __contains__ (self , key ):
54
- (u ,v ),d = key
55
- return v in self ._adj [u ] and self ._adj [u ][v ] == d
56
-
57
-
58
- class Edges (UndirectedEdges ):
59
67
def __contains__ (self , key ):
60
68
u ,v = key
61
69
return v in self ._adj [u ]
@@ -65,26 +73,7 @@ def __getitem__(self, key):
65
73
return self ._adj [u ][v ]
66
74
except TypeError :
67
75
raise NetworkXError ('bad edge key: use edge key = (u,v)' )
68
- def __and__ (self , other ):
69
- return set (self ) & set (other )
70
- def __or__ (self , other ):
71
- return set (self ) | set (other )
72
- def __xor__ (self , other ):
73
- return set (self ) ^ set (other )
74
- def __sub__ (self , other ):
75
- return set (self ) - set (other )
76
- def __repr__ (self ):
77
- return '{0.__class__.__name__}({1})' .format (self ,list (self ))
78
- def keys (self ):
79
- return EdgeKeys (self ._node , self ._adj )
80
- def data (self ):
81
- return EdgeData (self ._node , self ._adj )
82
- def items (self ):
83
- return EdgeItems (self ._node , self ._adj )
84
- def selfloops (self ):
85
- return ((n , n )
86
- for n , nbrs in self ._adj .items () if n in nbrs )
87
-
76
+ # Mutating Methods
88
77
def add (self , u , v , attr_dict = None , ** attr ):
89
78
if attr_dict is None :
90
79
attr_dict = attr
@@ -106,8 +95,6 @@ def add(self, u, v, attr_dict=None, **attr):
106
95
datadict .update (attr_dict )
107
96
self ._adj [u ][v ] = datadict
108
97
self ._adj [v ][u ] = datadict
109
-
110
-
111
98
def update (self , ebunch , attr_dict = None , ** attr ):
112
99
# set up attribute dict
113
100
if attr_dict is None :
@@ -140,7 +127,6 @@ def update(self, ebunch, attr_dict=None, **attr):
140
127
datadict .update (dd )
141
128
self ._adj [u ][v ] = datadict
142
129
self ._adj [v ][u ] = datadict
143
-
144
130
def remove (self , u , v ):
145
131
try :
146
132
del self ._adj [u ][v ]
@@ -151,3 +137,20 @@ def remove(self, u, v):
151
137
def clear (self ):
152
138
for n in self ._adj :
153
139
self ._adj [n ].clear ()
140
+
141
+ class Edges (UndirectedEdges , Set ):
142
+ __slots__ = ('_adj' ,'_node' )
143
+ def __init__ (self , node , adj ):
144
+ self ._adj = adj
145
+ self ._node = node
146
+ def __repr__ (self ):
147
+ return '{0.__class__.__name__}({1})' .format (self ,list (self ))
148
+ def keys (self ):
149
+ return EdgeKeys (self )
150
+ def data (self ):
151
+ return EdgeData (self )
152
+ def items (self ):
153
+ return EdgeItems (self )
154
+ def selfloops (self ):
155
+ return ((n , n )
156
+ for n , nbrs in self ._adj .items () if n in nbrs )
0 commit comments