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