Module asymmetree.seqevolve.EvolvingSequence
Data structure for evolving sequences.
Expand source code
# -*- coding: utf-8 -*-
"""
Data structure for evolving sequences.
"""
from enum import Enum, auto
from tralda.datastructures.DoublyLinkedList import (DLList,
DLListNode,
DLListIterator)
__author__ = 'David Schaller'
class State(Enum):
"""State of the sites in evolving sequences."""
ROOT = auto()
INSERTION = auto()
INHERITED = auto()
class EvoSeqNode(DLListNode):
"""Site in an evolving sequence."""
__slots__ = ('status', 'site_id', 'parent_el', 'rate_class', 'rate_factor')
def __init__(self, value,
status, site_id,
prev_node=None, next_node=None,
parent_el=None,
rate_class=0, rate_factor=1.0):
super().__init__(value, prev_node=prev_node, next_node=next_node)
self.status = status
self.site_id = site_id
self.parent_el = parent_el
self.rate_class = rate_class
self.rate_factor = rate_factor
class EvoSeq(DLList):
"""Evolving sequence."""
def __init__(self):
super().__init__()
def __iter__(self):
return EvoSeqIterator(self)
def __next__(self):
pass
def append(self, value, status, site_id, parent_el=None,
rate_class=0, rate_factor=1.0):
new_end = EvoSeqNode(value, status, site_id,
prev_node=self._last,
parent_el=parent_el,
rate_class=rate_class,
rate_factor=rate_factor)
if self._last:
self._last._next = new_end
self._last = new_end
if not self._first:
self._first = new_end
self._count += 1
return new_end
def append_left(self, value, status, site_id, parent_el=None,
rate_class=0, rate_factor=1.0):
new_start = EvoSeqNode(value, status, site_id,
next_node=self._first,
parent_el=parent_el,
rate_class=rate_class,
rate_factor=rate_factor)
if self._first:
self._first._prev = new_start
self._first = new_start
if not self._last:
self._last = new_start
self._count += 1
return new_start
def insert_right_of(self, element, value, status, site_id, parent_el=None,
rate_class=0, rate_factor=1.0):
if element is self._last:
new_element = self.append(value, status, site_id,
parent_el=parent_el,
rate_class=rate_class,
rate_factor=rate_factor)
else:
new_element = EvoSeqNode(value, status, site_id,
prev_node=element,
next_node=element._next,
parent_el=parent_el,
rate_class=rate_class,
rate_factor=rate_factor)
new_element._next._prev = new_element
element._next = new_element
self._count += 1
return new_element
def clone(self):
child_seq = EvoSeq()
parent_site = self._first
while parent_site:
child_seq.append(parent_site._value,
State.INHERITED, parent_site.site_id,
parent_el=parent_site,
rate_class=parent_site.rate_class,
rate_factor=parent_site.rate_factor)
parent_site = parent_site._next
return child_seq
def element_pairs(self):
"""Generator for subsequent element pairs."""
if self._count >= 2:
first = self._first
second = self._first._next
while second:
yield (first, second)
first = second
second = second._next
def count_status(self, status):
counter = 0
site = self._first
while site:
if site.status == status:
counter += 1
site = site._next
return counter
class EvoSeqIterator(DLListIterator):
"""Iterator class for evolving sequence."""
def __init__(self, evoseq):
super().__init__(evoseq)
def __next__(self):
"""Next site element in the evolving sequence.
Overrides the super class methods and returns the element instead
of the value only."""
if self._current:
x = self._current
self._current = self._current._next
return x
else:
raise StopIteration
Classes
class EvoSeq-
Evolving sequence.
Expand source code
class EvoSeq(DLList): """Evolving sequence.""" def __init__(self): super().__init__() def __iter__(self): return EvoSeqIterator(self) def __next__(self): pass def append(self, value, status, site_id, parent_el=None, rate_class=0, rate_factor=1.0): new_end = EvoSeqNode(value, status, site_id, prev_node=self._last, parent_el=parent_el, rate_class=rate_class, rate_factor=rate_factor) if self._last: self._last._next = new_end self._last = new_end if not self._first: self._first = new_end self._count += 1 return new_end def append_left(self, value, status, site_id, parent_el=None, rate_class=0, rate_factor=1.0): new_start = EvoSeqNode(value, status, site_id, next_node=self._first, parent_el=parent_el, rate_class=rate_class, rate_factor=rate_factor) if self._first: self._first._prev = new_start self._first = new_start if not self._last: self._last = new_start self._count += 1 return new_start def insert_right_of(self, element, value, status, site_id, parent_el=None, rate_class=0, rate_factor=1.0): if element is self._last: new_element = self.append(value, status, site_id, parent_el=parent_el, rate_class=rate_class, rate_factor=rate_factor) else: new_element = EvoSeqNode(value, status, site_id, prev_node=element, next_node=element._next, parent_el=parent_el, rate_class=rate_class, rate_factor=rate_factor) new_element._next._prev = new_element element._next = new_element self._count += 1 return new_element def clone(self): child_seq = EvoSeq() parent_site = self._first while parent_site: child_seq.append(parent_site._value, State.INHERITED, parent_site.site_id, parent_el=parent_site, rate_class=parent_site.rate_class, rate_factor=parent_site.rate_factor) parent_site = parent_site._next return child_seq def element_pairs(self): """Generator for subsequent element pairs.""" if self._count >= 2: first = self._first second = self._first._next while second: yield (first, second) first = second second = second._next def count_status(self, status): counter = 0 site = self._first while site: if site.status == status: counter += 1 site = site._next return counterAncestors
- tralda.datastructures.DoublyLinkedList.DLList
Methods
def append(self, value, status, site_id, parent_el=None, rate_class=0, rate_factor=1.0)-
Append an item to the list.
Parameters
value- The value to be inserted at the end of the list.
Returns
DLListNode- The new end node of the list.
Expand source code
def append(self, value, status, site_id, parent_el=None, rate_class=0, rate_factor=1.0): new_end = EvoSeqNode(value, status, site_id, prev_node=self._last, parent_el=parent_el, rate_class=rate_class, rate_factor=rate_factor) if self._last: self._last._next = new_end self._last = new_end if not self._first: self._first = new_end self._count += 1 return new_end def append_left(self, value, status, site_id, parent_el=None, rate_class=0, rate_factor=1.0)-
Append an item to left side of the list.
Parameters
value- The value to be inserted at the end of the list.
Returns
DLListNode- The new start node of the list.
Expand source code
def append_left(self, value, status, site_id, parent_el=None, rate_class=0, rate_factor=1.0): new_start = EvoSeqNode(value, status, site_id, next_node=self._first, parent_el=parent_el, rate_class=rate_class, rate_factor=rate_factor) if self._first: self._first._prev = new_start self._first = new_start if not self._last: self._last = new_start self._count += 1 return new_start def clone(self)-
Expand source code
def clone(self): child_seq = EvoSeq() parent_site = self._first while parent_site: child_seq.append(parent_site._value, State.INHERITED, parent_site.site_id, parent_el=parent_site, rate_class=parent_site.rate_class, rate_factor=parent_site.rate_factor) parent_site = parent_site._next return child_seq def count_status(self, status)-
Expand source code
def count_status(self, status): counter = 0 site = self._first while site: if site.status == status: counter += 1 site = site._next return counter def element_pairs(self)-
Generator for subsequent element pairs.
Expand source code
def element_pairs(self): """Generator for subsequent element pairs.""" if self._count >= 2: first = self._first second = self._first._next while second: yield (first, second) first = second second = second._next def insert_right_of(self, element, value, status, site_id, parent_el=None, rate_class=0, rate_factor=1.0)-
Insert a new item right of a node of the list in O(1).
Parameters
node:DLListNode- The list node next to which the item shall be inserted.
value:arbitrary type- The value to be inserted.
Return
DLListNode The list node for the inserted value.
Expand source code
def insert_right_of(self, element, value, status, site_id, parent_el=None, rate_class=0, rate_factor=1.0): if element is self._last: new_element = self.append(value, status, site_id, parent_el=parent_el, rate_class=rate_class, rate_factor=rate_factor) else: new_element = EvoSeqNode(value, status, site_id, prev_node=element, next_node=element._next, parent_el=parent_el, rate_class=rate_class, rate_factor=rate_factor) new_element._next._prev = new_element element._next = new_element self._count += 1 return new_element
class EvoSeqIterator (evoseq)-
Iterator class for evolving sequence.
Expand source code
class EvoSeqIterator(DLListIterator): """Iterator class for evolving sequence.""" def __init__(self, evoseq): super().__init__(evoseq) def __next__(self): """Next site element in the evolving sequence. Overrides the super class methods and returns the element instead of the value only.""" if self._current: x = self._current self._current = self._current._next return x else: raise StopIterationAncestors
- tralda.datastructures.DoublyLinkedList.DLListIterator
class EvoSeqNode (value, status, site_id, prev_node=None, next_node=None, parent_el=None, rate_class=0, rate_factor=1.0)-
Site in an evolving sequence.
Expand source code
class EvoSeqNode(DLListNode): """Site in an evolving sequence.""" __slots__ = ('status', 'site_id', 'parent_el', 'rate_class', 'rate_factor') def __init__(self, value, status, site_id, prev_node=None, next_node=None, parent_el=None, rate_class=0, rate_factor=1.0): super().__init__(value, prev_node=prev_node, next_node=next_node) self.status = status self.site_id = site_id self.parent_el = parent_el self.rate_class = rate_class self.rate_factor = rate_factorAncestors
- tralda.datastructures.DoublyLinkedList.DLListNode
Instance variables
var parent_el-
Return an attribute of instance, which is of type owner.
var rate_class-
Return an attribute of instance, which is of type owner.
var rate_factor-
Return an attribute of instance, which is of type owner.
var site_id-
Return an attribute of instance, which is of type owner.
var status-
Return an attribute of instance, which is of type owner.
class State (value, names=None, *, module=None, qualname=None, type=None, start=1)-
State of the sites in evolving sequences.
Expand source code
class State(Enum): """State of the sites in evolving sequences.""" ROOT = auto() INSERTION = auto() INHERITED = auto()Ancestors
- enum.Enum
Class variables
var INHERITEDvar INSERTIONvar ROOT