class Tree: root = None emptyTree = None treeHashNum = None def copy(self): newTree = Tree() newTree.root = self.root.copy() return newTree def getTreeHashNum(self): if self.treeHashNum == None: self.treeHashNum = str(time()) + "." + str(rnd.random()) return self.treeHashNum def getHashNum(self): if not self.root == None: return self.root.getHashNum() else: return 0 @classmethod def getEmptyTree(cls): return Tree() def __init__(self): self.root = None @classmethod def loadFromFile(cls, filename): trees = [] f = open(filename, "r") for line in f.xreadlines(): if not line.strip()[0] == '#': #ignore comments where line begins with '#' tree = Tree().load(line.strip()) trees.append(tree) return trees def initHashNum(self): self.root.initHashNum() def load(self, string): self.root = Node(string[0]) self.root.loadChildren(string[2:-1]) self.root.initHashNum() return self def getSize(self): if not self.root == None: return self.root.getSize() else: return 0 def getVertices(self): if not self.root == None: return self.root.getVertices() else: return [] def getRoot(self): return self.root def toString(self): return self.root.toString() def generateRandomTree(self, alphabet, deg, pvals): rootIdx = rnd.random_integers(0, len(alphabet)-1, 1) self.root = Node(alphabet[int(rootIdx)]).generateRandom(alphabet, deg, pvals) self.root.initHashNum() return self def getStatistics(self): return self.root.getStatistics() def createGraph(self, name=""): import pydot if name != "": graph = pydot.Subgraph(name, graph_type="digraph", strict=True, label=name) else: graph = pydot.Subgraph(graph_type="digraph", strict=True) rootNode = pydot.Node(str(time()) + str(rnd.random()), label = str(self.root.getLabel())) graph.add_node(rootNode) self.root.visualize(rootNode, graph) return graph