示例#1
0
def spn_to_ete(spn, context=None, unroll=False, symbols=_symbols):
    assert spn is not None

    tree = Tree()
    tree.id = spn.id
    tree.node_type = type(spn)
    tree.name = symbols.get(tree.node_type, spn.name)

    queue = []

    if not isinstance(spn, Leaf):
        for i, child in enumerate(spn.children):
            if unroll:
                if child in queue:
                    return "-> " + spn.id
                else:
                    queue.append(child)
            c = spn_to_ete(child, context=context, unroll=unroll)
            if isinstance(spn, Sum):
                c.support = spn.weights[i]
            tree.add_child(c)
    else:
        feature_names = None
        if context is not None:
            feature_names = context.feature_names

        try:
            tree.name = spn_to_str_equation(spn, feature_names=feature_names)
        except:
            if feature_names is None:
                feature_names = []
            tree.name += "(%s)" % ",".join(feature_names)

    return tree