Coverage for Bio.Nexus.Nodes : 26%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# Copyright 2005-2008 by Frank Kauff & Cymon J. Cox. All rights reserved. # This code is part of the Biopython distribution and governed by its # license. Please see the LICENSE file that should have been included # as part of this package. # # Nodes.py # # Provides functionality of a linked list. # Each node has one (or none) predecessor, and an arbitrary number of successors. # Nodes can store arbitrary data in a NodeData class. # # Subclassed by Nexus.Trees to store phylogenetic trees. # # Bug reports to Frank Kauff (fkauff@biologie.uni-kl.de) #
"""Stores a list of nodes that are linked together."""
"""Initiates a node chain.""" self.chain={} self.id=-1
"""Gets a new id for a node in the chain.""" self.id+=1 return self.id
"""Return a list of all node ids.""" return list(self.chain.keys())
"""Attaches node to another.""" if prev is not None and prev not in self.chain: raise ChainException('Unknown predecessor: '+str(prev)) else: id=self._get_id() node.set_id(id) node.set_prev(prev) if prev is not None: self.chain[prev].add_succ(id) self.chain[id]=node return id
"""Deletes node from chain and relinks successors to predecessor.""" if id not in self.chain: raise ChainException('Unknown ID: '+str(id)) prev_id=self.chain[id].get_prev() self.chain[prev_id].remove_succ(id) succ_ids=self.chain[id].get_succ() for i in succ_ids: self.chain[i].set_prev(prev_id) self.chain[prev_id].add_succ(succ_ids) node=self.chain[id] self.kill(id) return node
"""Kills a node from chain without caring to what it is connected.""" if id not in self.chain: raise ChainException('Unknown ID: '+str(id)) else: del self.chain[id]
"""Disconnects node from his predecessor.""" if id not in self.chain: raise ChainException('Unknown ID: '+str(id)) else: prev_id=self.chain[id].prev if prev_id is not None: self.chain[prev_id].succ.pop(self.chain[prev_id].succ.index(id)) self.chain[id].prev=None return prev_id
"""Connects son to parent.""" if child not in self.chain: raise ChainException('Unknown ID: '+str(child)) elif parent not in self.chain: raise ChainException('Unknown ID: '+str(parent)) else: self.unlink(child) self.chain[parent].succ.append(child) self.chain[child].set_prev(parent)
"""Check if grandchild is a subnode of parent.""" if grandchild==parent or grandchild in self.chain[parent].get_succ(): return True else: for sn in self.chain[parent].get_succ(): if self.is_parent_of(sn, grandchild): return True else: return False
"""Returns a list of all node_ids between two nodes (excluding start, including end).""" if start not in self.chain or finish not in self.chain: raise NodeException('Unknown node.') if not self.is_parent_of(start, finish) or start==finish: return [] for sn in self.chain[start].get_succ(): if self.is_parent_of(sn, finish): return [sn]+self.trace(sn, finish)
"""A single node."""
"""Represents a node with one predecessor and multiple successors.""" self.id=None self.data=data self.prev=None self.succ=[]
"""Sets the id of a node, if not set yet.""" if self.id is not None: raise NodeException('Node id cannot be changed.') self.id=id
"""Returns the node's id.""" return self.id
"""Returns a list of the node's successors.""" return self.succ
"""Returns the id of the node's predecessor.""" return self.prev
"""Adds a node id to the node's successors.""" if isinstance(id, type([])): self.succ.extend(id) else: self.succ.append(id)
"""Removes a node id from the node's successors.""" self.succ.remove(id)
"""Sets the node's successors.""" if not isinstance(new_succ, type([])): raise NodeException('Node successor must be of list type.') self.succ=new_succ
"""Sets the node's predecessor.""" self.prev=id
"""Returns a node's data.""" return self.data
"""Sets a node's data.""" self.data=data |