Exemplo n.º 1
0
def generatePool(N,  maxDepth, tree, rule_table, debug=False):

	# Collecting all non-terminal nodes
	nodeIDs = []
	for nodeID in tree.expand_tree(mode=Tree.DEPTH):
		nodeType = tree[nodeID].data
		if isinstance(nodeType, PiRL.DataStructures.Token.NonTerminal):
			nodeIDs.append(nodeID) 

	neighbours = []
	for _ in range(N):
		# Making a deep copy
		newTree = Tree(tree=tree, deep=True)

		# Selecting a random non-terminal to be replaced
		nodeToReplaceID = random.choice(nodeIDs)
		
		# Generating a new subtree
		newSubTree = getProgTree(newTree[nodeToReplaceID].data, maxDepth - newTree.depth(nodeToReplaceID))

		# Replacing subtree
		try:
			newTree.replace_node(newTree[nodeToReplaceID].predecessor(newTree.identifier), nodeToReplaceID, newSubTree, deep=False)
		except Exception as e:
			# traceback.print_exc()
			if debug:
				print("Root node replaced") 
			newTree = newSubTree

		if debug:
			print("Generated neighbour:", end=' ')
			# newTree.show(data_property='str')
			for leaf in newTree.leaves():
			    print(leaf.data.name, end=' ')
			print("\n")		

		neighbours.append(newTree)

	return neighbours