Source code for tsmakers.tree

import abjad
import quicktions


[docs]def divrewrite(tr, rulelst): rl = [rulelst] for nde in tr.levelorder: for rule in rl: if nde.value % rule[0] == 0: for val in rule[1]: nde.insert_child(val) return TimespanTree()
[docs]def flatten(lst): out = [] for i in lst: for x in i: out.extend([x]) return out
[docs]def levelbylevel(root): out = [] q = [root, None] while len(q) > 1: for i in q[: q.index(None)]: q.extend(i.children) out.append(q[: q.index(None)]) del q[: q.index(None) + 1] q.extend([None]) return out
[docs]def levelorder(root): out = [] q = [] q.append(root) while len(q) != 0: q.extend(q[0].children) out.append(q[0]) q.pop(0) return out
[docs]def tally(lst): out = 0 for i in lst: out += i return out
[docs]class TimespanTreeNode(object): def __init__(self, num=1, parent=None): self.value = num self.children = [] self.parent = parent
[docs] def insert_child(self, num): self.children.append(TimespanTreeNode(num, parent=self))
[docs] def get_children(self): return self.children
[docs] def get_childrensum(self): return tally([i.value for i in self.children])
[docs] def get_number_of_children(self): return len(self.children)
[docs] def get_parent(self): return self.parent
[docs] def find_root(self): if self.parent is None: return self else: return self.parent.find_root()
[docs] def get_fract_value(self): if self.parent is None: return 1 else: return quicktions.Fraction(self.value, self.parent.get_childrensum())
[docs] def get_real_value(self): if self.parent is None: return self.value else: return self.get_fract_value() * self.parent.get_real_value()
[docs] def localoffset(self): if self.parent is None: return 0 else: return tally( [ i.get_real_value() for i in self.parent.children[: self.parent.children.index(self)] ] ) # + self.localoffset()
[docs] def offset(self): if self.parent is None: return 0 else: return self.localoffset() + self.parent.offset()
[docs] def get_timespan(self): if self.parent is None: return abjad.Timespan(0, self.value) else: return abjad.Timespan(self.offset(), self.offset() + self.get_real_value())
[docs]class TimespanTree(object): r""" .. container:: example >>> a = tsmakers.TimespanTreeNode(10) >>> a.insert_child(1) >>> a.insert_child(1) >>> a.insert_child(1) >>> a.insert_child(1) >>> a.insert_child(1) >>> a.insert_child(1) >>> a.insert_child(1) >>> a.insert_child(1) >>> b, c, d, e, f, g, h, i = a.children >>> b.insert_child(2) >>> b.insert_child(1) >>> j, k = b.children >>> e.insert_child(3) >>> e.insert_child(1) >>> e.insert_child(2) >>> e.insert_child(2) >>> f.insert_child(1) >>> f.insert_child(1) >>> l, m = f.children >>> k.insert_child(1) >>> k.insert_child(1) >>> l.insert_child(1) >>> l.insert_child(1) >>> demotree = tsmakers.TimespanTree(a) >>> abjad.show(demotree.tspanlist()) # doctest: +SKIP .. docs:: >>> print(abjad.storage(demotree.tspanlist())) abjad.TimespanList( [ abjad.Timespan( start_offset=abjad.Offset((0, 1)), stop_offset=abjad.Offset((10, 1)), ), abjad.Timespan( start_offset=abjad.Offset((0, 1)), stop_offset=abjad.Offset((5, 4)), ), abjad.Timespan( start_offset=abjad.Offset((5, 4)), stop_offset=abjad.Offset((5, 2)), ), abjad.Timespan( start_offset=abjad.Offset((5, 2)), stop_offset=abjad.Offset((15, 4)), ), abjad.Timespan( start_offset=abjad.Offset((15, 4)), stop_offset=abjad.Offset((5, 1)), ), abjad.Timespan( start_offset=abjad.Offset((5, 1)), stop_offset=abjad.Offset((25, 4)), ), abjad.Timespan( start_offset=abjad.Offset((25, 4)), stop_offset=abjad.Offset((15, 2)), ), abjad.Timespan( start_offset=abjad.Offset((15, 2)), stop_offset=abjad.Offset((35, 4)), ), abjad.Timespan( start_offset=abjad.Offset((35, 4)), stop_offset=abjad.Offset((10, 1)), ), abjad.Timespan( start_offset=abjad.Offset((0, 1)), stop_offset=abjad.Offset((5, 6)), ), abjad.Timespan( start_offset=abjad.Offset((5, 6)), stop_offset=abjad.Offset((5, 4)), ), abjad.Timespan( start_offset=abjad.Offset((15, 4)), stop_offset=abjad.Offset((135, 32)), ), abjad.Timespan( start_offset=abjad.Offset((135, 32)), stop_offset=abjad.Offset((35, 8)), ), abjad.Timespan( start_offset=abjad.Offset((35, 8)), stop_offset=abjad.Offset((75, 16)), ), abjad.Timespan( start_offset=abjad.Offset((75, 16)), stop_offset=abjad.Offset((5, 1)), ), abjad.Timespan( start_offset=abjad.Offset((5, 1)), stop_offset=abjad.Offset((45, 8)), ), abjad.Timespan( start_offset=abjad.Offset((45, 8)), stop_offset=abjad.Offset((25, 4)), ), abjad.Timespan( start_offset=abjad.Offset((5, 6)), stop_offset=abjad.Offset((25, 24)), ), abjad.Timespan( start_offset=abjad.Offset((25, 24)), stop_offset=abjad.Offset((5, 4)), ), abjad.Timespan( start_offset=abjad.Offset((5, 1)), stop_offset=abjad.Offset((85, 16)), ), abjad.Timespan( start_offset=abjad.Offset((85, 16)), stop_offset=abjad.Offset((45, 8)), ), ] ) .. container:: example >>> a = tsmakers.TimespanTreeNode(10) >>> a.insert_child(8) >>> a.insert_child(5) >>> b, c, = a.children >>> b.insert_child(8) >>> b.insert_child(5) >>> c.insert_child(8) >>> c.insert_child(5) >>> d, e, = b.children >>> f, g, = c.children >>> d.insert_child(8) >>> d.insert_child(5) >>> e.insert_child(8) >>> e.insert_child(5) >>> f.insert_child(8) >>> f.insert_child(5) >>> g.insert_child(8) >>> g.insert_child(5) >>> h, i, = d.children >>> j, k, = e.children >>> l, m, = f.children >>> n, o, = g.children >>> h.insert_child(8) >>> h.insert_child(5) >>> i.insert_child(8) >>> i.insert_child(5) >>> j.insert_child(8) >>> j.insert_child(5) >>> k.insert_child(8) >>> k.insert_child(5) >>> l.insert_child(8) >>> l.insert_child(5) >>> m.insert_child(8) >>> m.insert_child(5) >>> n.insert_child(8) >>> n.insert_child(5) >>> o.insert_child(8) >>> o.insert_child(5) >>> demotree = tsmakers.TimespanTree(a) >>> demotree_list = demotree.tspanlist() >>> demotree_list = demotree_list.round_offsets( ... abjad.Duration((1, 8)), ... anchor=abjad.Left, ... ) ... >>> abjad.show(demotree_list, scale=0.7) # doctest: +SKIP .. docs:: >>> print(abjad.storage(demotree_list)) abjad.TimespanList( [ abjad.Timespan( start_offset=abjad.Offset((0, 1)), stop_offset=abjad.Offset((10, 1)), ), abjad.Timespan( start_offset=abjad.Offset((0, 1)), stop_offset=abjad.Offset((49, 8)), ), abjad.Timespan( start_offset=abjad.Offset((49, 8)), stop_offset=abjad.Offset((10, 1)), ), abjad.Timespan( start_offset=abjad.Offset((0, 1)), stop_offset=abjad.Offset((15, 4)), ), abjad.Timespan( start_offset=abjad.Offset((15, 4)), stop_offset=abjad.Offset((49, 8)), ), abjad.Timespan( start_offset=abjad.Offset((49, 8)), stop_offset=abjad.Offset((17, 2)), ), abjad.Timespan( start_offset=abjad.Offset((17, 2)), stop_offset=abjad.Offset((10, 1)), ), abjad.Timespan( start_offset=abjad.Offset((0, 1)), stop_offset=abjad.Offset((19, 8)), ), abjad.Timespan( start_offset=abjad.Offset((19, 8)), stop_offset=abjad.Offset((15, 4)), ), abjad.Timespan( start_offset=abjad.Offset((15, 4)), stop_offset=abjad.Offset((21, 4)), ), abjad.Timespan( start_offset=abjad.Offset((21, 4)), stop_offset=abjad.Offset((49, 8)), ), abjad.Timespan( start_offset=abjad.Offset((49, 8)), stop_offset=abjad.Offset((61, 8)), ), abjad.Timespan( start_offset=abjad.Offset((61, 8)), stop_offset=abjad.Offset((17, 2)), ), abjad.Timespan( start_offset=abjad.Offset((17, 2)), stop_offset=abjad.Offset((75, 8)), ), abjad.Timespan( start_offset=abjad.Offset((75, 8)), stop_offset=abjad.Offset((10, 1)), ), abjad.Timespan( start_offset=abjad.Offset((0, 1)), stop_offset=abjad.Offset((11, 8)), ), abjad.Timespan( start_offset=abjad.Offset((11, 8)), stop_offset=abjad.Offset((19, 8)), ), abjad.Timespan( start_offset=abjad.Offset((19, 8)), stop_offset=abjad.Offset((13, 4)), ), abjad.Timespan( start_offset=abjad.Offset((13, 4)), stop_offset=abjad.Offset((15, 4)), ), abjad.Timespan( start_offset=abjad.Offset((15, 4)), stop_offset=abjad.Offset((37, 8)), ), abjad.Timespan( start_offset=abjad.Offset((37, 8)), stop_offset=abjad.Offset((21, 4)), ), abjad.Timespan( start_offset=abjad.Offset((21, 4)), stop_offset=abjad.Offset((23, 4)), ), abjad.Timespan( start_offset=abjad.Offset((23, 4)), stop_offset=abjad.Offset((49, 8)), ), abjad.Timespan( start_offset=abjad.Offset((49, 8)), stop_offset=abjad.Offset((7, 1)), ), abjad.Timespan( start_offset=abjad.Offset((7, 1)), stop_offset=abjad.Offset((61, 8)), ), abjad.Timespan( start_offset=abjad.Offset((61, 8)), stop_offset=abjad.Offset((65, 8)), ), abjad.Timespan( start_offset=abjad.Offset((65, 8)), stop_offset=abjad.Offset((17, 2)), ), abjad.Timespan( start_offset=abjad.Offset((17, 2)), stop_offset=abjad.Offset((73, 8)), ), abjad.Timespan( start_offset=abjad.Offset((73, 8)), stop_offset=abjad.Offset((75, 8)), ), abjad.Timespan( start_offset=abjad.Offset((75, 8)), stop_offset=abjad.Offset((39, 4)), ), abjad.Timespan( start_offset=abjad.Offset((39, 4)), stop_offset=abjad.Offset((10, 1)), ), ] ) """ def __init__(self, root): self.root = root self.levelorder = levelorder(root) self.levelbylevel = levelbylevel(root)
[docs] def get_level_order(self): return self.levelorder
[docs] def get_level(self, n): return self.levelbylevel[n]
[docs] def get_level_order_value(self): return [[i.value for i in lev] for lev in self.levelbylevel]
[docs] def get_level_value(self, n): return [i.value for i in self.levelbylevel[n]]
[docs] def replace_values(self, lst): for i, j in zip(self.levelorder, lst): i.value = j
[docs] def tspanlist_level(self, n): return abjad.TimespanList([i.get_timespan() for i in self.get_level(n)])
[docs] def tspanlist(self): return abjad.TimespanList([i.get_timespan() for i in self.levelorder])
[docs] def show(self): abjad.show(self.tspanlist(), scale=0.7)
[docs] def show_level(self, n): abjad.show(self.tspanlist_level(n), scale=0.7)