def union(g1, g2, vid1=None, vid2=None, edge_type='<'): """ Return the union of the MTGs g1 and g2. :Parameters: - g1, g2 (MTG) : An MTG graph - vid1 : the anchor vertex identid=fier that belong to `g1` - vid2 : the root of the sub_mtg that belong to `g2` which will be added to g1. - edge_type (str) : the type of the edge which will connect vid1 to vid2 """ v1 = vid1 if vid1 is not None else g1.root if v1 not in g1: raise InvalidVertex(v1) v2 = vid2 if vid2 is not None else g2.root if v2 not in g2: raise InvalidVertex(v2) g = g1.sub_mtg(g1.root) #n2 = g._id+1 treeid_id = {} subtree = traversal.iter_mtg2(g2, v2) if v1 is g1.root and v2 is g2.root: treeid_id[v2] = v1 subtree.next() else: v2 = subtree.next() v = g.add_child(v1) treeid_id[v2] = v g._add_vertex_properties(v,g2.get_vertex_property(v2)) g.node(v).edge_type = edge_type for vid in subtree: complex_id = treeid_id[g2.complex(vid)] v = g.add_component(complex_id) treeid_id[vid] = v pid = g2.parent(vid) if pid is not None: parent = treeid_id[pid] v = g.add_child(parent, child=v) # Copy the properties g._add_vertex_properties(v, g2.get_vertex_property(vid)) return g
def heights(g, scale=-1): """ Compute the order of all vertices at scale `scale`. If scale == -1, the compute the order for vertices at the finer scale. """ heights = {} if scale <= 0: for vid in traversal.iter_mtg2(g, g.root): pid = g.parent(vid) p_height = -1 if pid is None else heights[pid] heights[vid] = p_height+1 else: for rid in g.roots_iter(scale=scale): for vid in traversal.pre_order2(g, rid): pid = g.parent(vid) p_height = -1 if pid is None else heights[pid] heights[vid] = p_height+1 return heights
def orders(g, scale=-1): """ Compute the order of all vertices at scale `scale`. If scale == -1, the compute the order for vertices at the finer scale. """ orders = {} if scale <= 0: for vid in traversal.iter_mtg2(g, g.root): pid = g.parent(vid) p_order = 0 if pid is None else orders[pid] orders[vid] = p_order+1 if g.edge_type(vid) == '+' else p_order else: for rid in g.roots_iter(scale=scale): for vid in traversal.pre_order2(g, rid): pid = g.parent(vid) p_order = 0 if pid is None else orders[pid] orders[vid] = p_order+1 if g.edge_type(vid) == '+' else p_order return orders
def backward_rewriting_traversal(mgt): from traversal import iter_mtg2 return [ RewritableNode(mtg, vid) for vid in reversed(iter_mtg2(mtg, mtg.root)) ]
def forward_rewriting_traversal(mtg): from traversal import iter_mtg2 return [RewritableNode(mtg, vid) for vid in list(iter_mtg2(mtg, mtg.root))]
def backward_rewriting_traversal(mgt): from traversal import iter_mtg2 return [RewritableNode(mtg, vid) for vid in reversed(iter_mtg2(mtg, mtg.root))]