55from ast import literal_eval
66from itertools import combinations
77from random import sample
8+ from random import choice
9+ from random import shuffle
810
911import compas
1012
@@ -132,15 +134,21 @@ def __data__(self):
132134
133135 def __before_json_dump__ (self , data ):
134136 data ["node" ] = {repr (key ): attr for key , attr in data ["node" ].items ()}
135- data ["edge" ] = {repr (u ): {repr (v ): attr for v , attr in nbrs .items ()} for u , nbrs in data ["edge" ].items ()}
137+ data ["edge" ] = {
138+ repr (u ): {repr (v ): attr for v , attr in nbrs .items ()}
139+ for u , nbrs in data ["edge" ].items ()
140+ }
136141 return data
137142
138143 def __after_json_load__ (self , data ):
139144 l_e = literal_eval
140145 nodes = data ["node" ] or {}
141146 edges = data ["edge" ] or {}
142147 data ["node" ] = {l_e (node ): attr for node , attr in nodes .items ()}
143- data ["edge" ] = {l_e (u ): {l_e (v ): attr for v , attr in nbrs .items ()} for u , nbrs in edges .items ()}
148+ data ["edge" ] = {
149+ l_e (u ): {l_e (v ): attr for v , attr in nbrs .items ()}
150+ for u , nbrs in edges .items ()
151+ }
144152 return data
145153
146154 @classmethod
@@ -159,7 +167,13 @@ def __from_data__(cls, data):
159167 graph ._max_node = data .get ("max_node" , graph ._max_node )
160168 return graph
161169
162- def __init__ (self , default_node_attributes = None , default_edge_attributes = None , name = None , ** kwargs ):
170+ def __init__ (
171+ self ,
172+ default_node_attributes = None ,
173+ default_edge_attributes = None ,
174+ name = None ,
175+ ** kwargs ,
176+ ):
163177 super (Graph , self ).__init__ (kwargs , name = name )
164178 self ._max_node = - 1
165179 self .node = {}
@@ -375,8 +389,16 @@ def from_pointcloud(cls, cloud, degree=3):
375389 graph = cls ()
376390 for x , y , z in cloud :
377391 graph .add_node (x = x , y = y , z = z )
392+ nodes = list (graph .nodes ())
378393 for u in graph .nodes ():
379- for v in graph .node_sample (size = degree ):
394+ shuffle (nodes )
395+ for v in nodes :
396+ if v == u :
397+ continue
398+ if graph .degree (v ) == degree :
399+ continue
400+ if graph .degree (u ) == degree :
401+ break
380402 graph .add_edge (u , v )
381403 return graph
382404
@@ -1952,7 +1974,9 @@ def has_edge(self, edge, directed=True):
19521974 u , v = edge
19531975 if directed :
19541976 return u in self .edge and v in self .edge [u ]
1955- return (u in self .edge and v in self .edge [u ]) or (v in self .edge and u in self .edge [v ])
1977+ return (u in self .edge and v in self .edge [u ]) or (
1978+ v in self .edge and u in self .edge [v ]
1979+ )
19561980
19571981 # --------------------------------------------------------------------------
19581982 # Node geometry
@@ -2040,7 +2064,11 @@ def node_neighborhood_centroid(self, key):
20402064 :meth:`node_coordinates`, :meth:`node_point`, :meth:`node_laplacian`
20412065
20422066 """
2043- return Point (* centroid_points ([self .node_coordinates (nbr ) for nbr in self .neighbors (key )]))
2067+ return Point (
2068+ * centroid_points (
2069+ [self .node_coordinates (nbr ) for nbr in self .neighbors (key )]
2070+ )
2071+ )
20442072
20452073 # --------------------------------------------------------------------------
20462074 # Edge geometry
@@ -2320,7 +2348,10 @@ def connected_edges(self):
23202348 :meth:`connected_nodes`
23212349
23222350 """
2323- return [[(u , v ) for u in nodes for v in self .neighbors (u ) if u < v ] for nodes in self .connected_nodes ()]
2351+ return [
2352+ [(u , v ) for u in nodes for v in self .neighbors (u ) if u < v ]
2353+ for nodes in self .connected_nodes ()
2354+ ]
23242355
23252356 def exploded (self ):
23262357 """Explode the graph into its connected components.
@@ -2407,7 +2438,9 @@ def adjacency_matrix(self, rtype="array"):
24072438 from compas .matrices import adjacency_matrix
24082439
24092440 node_index = self .node_index ()
2410- adjacency = [[node_index [nbr ] for nbr in self .neighbors (key )] for key in self .nodes ()]
2441+ adjacency = [
2442+ [node_index [nbr ] for nbr in self .neighbors (key )] for key in self .nodes ()
2443+ ]
24112444 return adjacency_matrix (adjacency , rtype = rtype )
24122445
24132446 def connectivity_matrix (self , rtype = "array" ):
@@ -2447,7 +2480,9 @@ def degree_matrix(self, rtype="array"):
24472480 from compas .matrices import degree_matrix
24482481
24492482 node_index = self .node_index ()
2450- adjacency = [[node_index [nbr ] for nbr in self .neighbors (key )] for key in self .nodes ()]
2483+ adjacency = [
2484+ [node_index [nbr ] for nbr in self .neighbors (key )] for key in self .nodes ()
2485+ ]
24512486 return degree_matrix (adjacency , rtype = rtype )
24522487
24532488 def laplacian_matrix (self , normalize = False , rtype = "array" ):
0 commit comments