Example #1
0
 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))
Example #2
0
 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))
Example #3
0
 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)
Example #4
0
 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)
Example #5
0
 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
Example #6
0
 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
Example #7
0
 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))
Example #8
0
 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
Example #9
0
 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
Example #10
0
 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))
Example #11
0
 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
Example #12
0
 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)
Example #13
0
 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)
Example #14
0
 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
Example #15
0
 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
Example #16
0
 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
Example #17
0
 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)
Example #18
0
 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
Example #19
0
 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
Example #20
0
 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)
Example #21
0
 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
Example #22
0
 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