def add_node(self, n): if n in self: return # already in tree elif len(self.adj)==0: Graph.add_node(self,n) # first node else: # not allowed raise NetworkXError(\ "adding single node %s not allowed in non-empty tree"%(n))
def add_node(self, n): if n in self: return # already in tree elif len(self.adj) == 0: Graph.add_node(self, n) # first node else: # not allowed raise NetworkXError(\ "adding single node %s not allowed in non-empty tree"%(n))
def delete_node(self, n): try: if len(self.adj[n]) == 1: # allowed for leaf node Graph.delete_node(self, n) else: raise NetworkXError( "deleting interior node %s not allowed in tree" % (n)) except KeyError: # NetworkXError if n not in self raise NetworkXError("node %s not in graph" % n)
def delete_node(self, n): try: if len(self.adj[n])==1: # allowed for leaf node Graph.delete_node(self,n) else: raise NetworkXError( "deleting interior node %s not allowed in tree"%(n)) except KeyError: # NetworkXError if n not in self raise NetworkXError("node %s not in graph"%n)
def delete_edge(self, u, v=None): if v is None: (u,v)=u # no v given, assume u is an edge tuple Graph.delete_edge(self,u,v) # this will always break a tree into two trees # put nodes connected to v in a new component vnodes=component.node_connected_component(self,v) for n in vnodes: self.comp[n]=self.nc self.nc+=1
def delete_edge(self, u, v=None): if v is None: (u, v) = u # no v given, assume u is an edge tuple Graph.delete_edge(self, u, v) # this will always break a tree into two trees # put nodes connected to v in a new component vnodes = component.node_connected_component(self, v) for n in vnodes: self.comp[n] = self.nc self.nc += 1
def add_edge(self, u, v=None): if v is None: (u,v)=u # no v given, assume u is an edge tuple if self.has_edge(u,v): return # no parallel edges allowed elif u in self and v in self: raise NetworkXError("adding edge %s-%s not allowed in tree"%(u,v)) elif u in self or v in self: Graph.add_edge(self,u,v) return elif len(self.adj)==0: # first leaf Graph.add_edge(self,u,v) return else: raise NetworkXError("adding edge %s-%s not allowed in tree"%(u,v))
def delete_node(self, n): # get neighbors first since this will remove all edges to them neighbors = self.neighbors(n) Graph.delete_node(self, n) # delete node and adjacent edges del self.comp[n] # remove node from component dictionary if len(neighbors) == 1: return # n was a leaf node for nbr in neighbors: # make new components of each nbr and connected graph # FIXME this does more work then is necessary # since nbrs of n could be in same conected component # and then will get renumbered more than once vnodes = component.node_connected_component(self, nbr) for v in vnodes: self.comp[v] = self.nc self.nc += 1
def __init__(self,data=None,**kwds): Graph.__init__(self,**kwds) if data is not None: try: # build a graph G=Graph() G=convert.from_whatever(data,create_using=G) except: raise NetworkXError, "Data %s is not a tree"%data # check if it is a tree. if G.order()==G.size()+1 and \ component.number_connected_components(G)==1: self.adj=G.adj.copy() del G else: raise NetworkXError, "Data %s is not a tree"%data
def add_edge(self, u, v=None): if v is None: (u, v) = u # no v given, assume u is an edge tuple if self.has_edge(u, v): return # no parallel edges allowed elif u in self and v in self: raise NetworkXError("adding edge %s-%s not allowed in tree" % (u, v)) elif u in self or v in self: Graph.add_edge(self, u, v) return elif len(self.adj) == 0: # first leaf Graph.add_edge(self, u, v) return else: raise NetworkXError("adding edge %s-%s not allowed in tree" % (u, v))
def delete_node(self, n): # get neighbors first since this will remove all edges to them neighbors=self.neighbors(n) Graph.delete_node(self,n) # delete node and adjacent edges del self.comp[n] # remove node from component dictionary if len(neighbors)==1: return # n was a leaf node for nbr in neighbors: # make new components of each nbr and connected graph # FIXME this does more work then is necessary # since nbrs of n could be in same conected component # and then will get renumbered more than once vnodes=component.node_connected_component(self,nbr) for v in vnodes: self.comp[v]=self.nc self.nc+=1
def delete_edge(self, u, v=None): if v is None: (u,v)=u if self.degree(u)==1 or self.degree(v)==1: # leaf edge Graph.delete_edge(self,u,v) else: # interior edge raise NetworkXError(\ "deleting interior edge %s-%s not allowed in tree"%(u,v)) if self.degree(u)==0: # OK to delete remaining isolated node Graph.delete_node(self,u) if self.degree(v)==0: # OK to delete remaining isolated node Graph.delete_node(self,v)
def delete_edge(self, u, v=None): if v is None: (u, v) = u if self.degree(u) == 1 or self.degree(v) == 1: # leaf edge Graph.delete_edge(self, u, v) else: # interior edge raise NetworkXError(\ "deleting interior edge %s-%s not allowed in tree"%(u,v)) if self.degree(u) == 0: # OK to delete remaining isolated node Graph.delete_node(self, u) if self.degree(v) == 0: # OK to delete remaining isolated node Graph.delete_node(self, v)
def to_undirected(self): """Return an undirected representation of the digraph. A new graph is returned with the same name and nodes and with edge (u,v,data) if either (u,v,data) or (v,u,data) is in the digraph. If both edges exist in digraph and their edge data is different, only one edge is created with an arbitrary choice of which edge data to use. You must check and correct for this manually if desired. """ H = Graph() H.name = self.name H.add_nodes_from(self) H.add_edges_from([(v, u, d) for (u, v, d) in self.edges_iter(data=True)]) return H
def __init__(self, data=None, **kwds): Graph.__init__(self, **kwds) if data is not None: try: # build a graph G = Graph() G = convert.from_whatever(data, create_using=G) except: raise NetworkXError, "Data %s is not a tree" % data # check if it is a tree. if G.order()==G.size()+1 and \ component.number_connected_components(G)==1: self.adj = G.adj.copy() del G else: raise NetworkXError, "Data %s is not a tree" % data
def to_undirected(self): """Return an undirected representation of the digraph. A new graph is returned with the same name and nodes and with edge (u,v,data) if either (u,v,data) or (v,u,data) is in the digraph. If both edges exist in digraph and their edge data is different, only one edge is created with an arbitrary choice of which edge data to use. You must check and correct for this manually if desired. """ H=Graph() H.name=self.name H.add_nodes_from(self) H.add_edges_from([(v,u,d) for (u,v,d) in self.edges_iter(data=True)]) return H
def add_edge(self, u, v=None): if v is None: (u,v)=u # no v given, assume u is an edge tuple if self.has_edge(u,v): # no parallel edges return elif u in self and v in self: raise NetworkXError, "adding edge %s-%s not allowed in tree"%(u,v) elif u in self: Graph.add_edge(self,u,v) self.par[v]=u return elif v in self: Graph.add_edge(self,u,v) self.par[u]=v return elif len(self.adj)==0: # first leaf Graph.add_edge(self,u,v) self.par[v]=u # u is v's parent return else: raise NetworkXError, "adding edge %s-%s not allowed in tree"%(u,v)
def add_edge(self, u, v=None): if v is None: (u,v)=u # no v given, assume u is an edge tuple if self.has_edge(u,v): return # no parallel edges if u in self: # u is in forest if v in self: # v is in forest if self.comp[u]==self.comp[v]: # same tree? raise NetworkXError, \ "adding edge %s-%s not allowed in forest"%(u,v) else: # join two trees Graph.add_edge(self,u,v) ucomp=self.comp[u] # set component number of v tree to u tree for n in component.node_connected_component(self,v): self.comp[n]=ucomp else: # add u-v to tree in component with u Graph.add_edge(self,u,v) self.comp[v]=self.comp[u] else: # make new tree with only u-v Graph.add_edge(self,u,v) self.comp[u]=self.nc self.comp[v]=self.nc self.nc+=1
def add_edge(self, u, v=None): if v is None: (u, v) = u # no v given, assume u is an edge tuple if self.has_edge(u, v): return # no parallel edges if u in self: # u is in forest if v in self: # v is in forest if self.comp[u] == self.comp[v]: # same tree? raise NetworkXError, \ "adding edge %s-%s not allowed in forest"%(u,v) else: # join two trees Graph.add_edge(self, u, v) ucomp = self.comp[u] # set component number of v tree to u tree for n in component.node_connected_component(self, v): self.comp[n] = ucomp else: # add u-v to tree in component with u Graph.add_edge(self, u, v) self.comp[v] = self.comp[u] else: # make new tree with only u-v Graph.add_edge(self, u, v) self.comp[u] = self.nc self.comp[v] = self.nc self.nc += 1
def add_edge(self, u, v=None): if v is None: (u, v) = u # no v given, assume u is an edge tuple if self.has_edge(u, v): # no parallel edges return elif u in self and v in self: raise NetworkXError, "adding edge %s-%s not allowed in tree" % (u, v) elif u in self: Graph.add_edge(self, u, v) self.par[v] = u return elif v in self: Graph.add_edge(self, u, v) self.par[u] = v return elif len(self.adj) == 0: # first leaf Graph.add_edge(self, u, v) self.par[v] = u # u is v's parent return else: raise NetworkXError, "adding edge %s-%s not allowed in tree" % (u, v)
def add_node(self, n): Graph.add_node(self,n) # this is not called from add_edge so we must assign # and component (else that is assigned in add_edge) self.comp[n]=self.nc self.nc+=1
def add_node(self, n): Graph.add_node(self, n) # this is not called from add_edge so we must assign # and component (else that is assigned in add_edge) self.comp[n] = self.nc self.nc += 1