Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
def backward_rewriting_traversal(mgt):
    from traversal import iter_mtg2
    return [
        RewritableNode(mtg, vid) for vid in reversed(iter_mtg2(mtg, mtg.root))
    ]
Exemple #5
0
def forward_rewriting_traversal(mtg):
    from traversal import iter_mtg2
    return [RewritableNode(mtg, vid) for vid in list(iter_mtg2(mtg, mtg.root))]
Exemple #6
0
def backward_rewriting_traversal(mgt):
    from traversal import iter_mtg2

    return [RewritableNode(mtg, vid) for vid in reversed(iter_mtg2(mtg, mtg.root))]
Exemple #7
0
def forward_rewriting_traversal(mtg):
    from traversal import iter_mtg2

    return [RewritableNode(mtg, vid) for vid in list(iter_mtg2(mtg, mtg.root))]