Spaces:
Runtime error
Runtime error
| class ProgramTranslator(object): | |
| def __init__(self, programDict, maxArity): | |
| self.programDict = programDict | |
| self.maxArity = maxArity | |
| self.maxStack = 0 | |
| def functionToKey(self, function, withValInputs = True): | |
| valInputs = "" | |
| if withValInputs: | |
| valInputs = "_" + ",".join(function["value_inputs"]) | |
| functionKey = function["function"] if "_" in function["function"] else \ | |
| "_".join([function["function"], function["function"]]) | |
| return str(len(function["inputs"])) + "_" + functionKey + valInputs | |
| def typeToKey(self, function, withValInputs = True): | |
| valInputs = "" | |
| if withValInputs: | |
| valInputs = "_" + ",".join(function["value_inputs"]) | |
| functionKey = function["type"] if "_" in function["type"] else \ | |
| "_".join([function["type"], function["type"]]) | |
| return str(len(function["inputs"])) + "_" + functionKey + valInputs | |
| def keyToFunction(self, key): | |
| assert key not in self.programDict.invalidSymbols | |
| function = {} | |
| parts = key.split("_") | |
| arity = int(parts[0]) | |
| function["function"] = "_".join([parts[1], parts[2]]) | |
| function["value_inputs"] = [] | |
| if len(parts) == 4: | |
| function["value_inputs"] = parts[3].split(",") | |
| function["inputs"] = [] | |
| return function, arity | |
| def keyToArity(self, key): | |
| if key in self.programDict.invalidSymbols: | |
| return 0 | |
| return int(key.split("_")[0]) | |
| def keyToType(self, key): | |
| if key in self.programDict.invalidSymbols: | |
| return ["0", "0", "0"] | |
| return ["0:" + key.split("_")[0], "1:" + key.split("_")[1], "2:" + key.split("_")[2]] | |
| def programToPostfixProgram(self, program): | |
| newProgram = [] | |
| def programToPostfixAux(currIndex = -1): | |
| childrenIndices = program[currIndex]["inputs"] | |
| #[int(child) for child in program[currIndex]["inputs"]] | |
| childrenNewIndices = [] | |
| for child in childrenIndices: | |
| programToPostfixAux(child) | |
| childrenNewIndices.append(len(newProgram) - 1) | |
| program[currIndex]["inputs"] = childrenNewIndices | |
| newProgram.append(program[currIndex]) | |
| programToPostfixAux() | |
| return newProgram | |
| def programToSeq(self, program): | |
| return [self.functionToKey(function) for function in program] | |
| def pdfProgramToSeq(self, program): | |
| return [self.typeToKey(function) for function in program] | |
| def programToInputs(self, program, offset = 0): | |
| inputs = [function["inputs"] for function in program] | |
| offsetedInputs = [[FuncInput + offset for FuncInput in FuncInputs] for FuncInputs in inputs] | |
| return offsetedInputs | |
| # def seqToProgram(self, seq, enforceValidPrograms = True): | |
| # program = [] | |
| # def seqToProgramAux(currIndex = len(seq) - 1): | |
| # if currIndex < 0: | |
| # program = None | |
| # return | |
| # currFunc, arity = self.keyToFunction(seq[currIndex]) | |
| # nextIndex = currIndex - 1 | |
| # program.append(currFunc) | |
| # for _ in arity: | |
| # currFunc["inputs"].append(nextIndex) | |
| # nextIndex = seqToProgramAux(nextIndex) | |
| # currFunc["inputs"].reverse() | |
| # return nextIndex | |
| # if enforceValidPrograms: | |
| # seqToProgramAux() | |
| # if program is not None: | |
| # program.reverse() | |
| # else: | |
| # stack = [0] * self.maxArity | |
| # for i in range(len(seq)): | |
| # func, arity = self.keyToFunction(seq[i]) | |
| # func["inputs"] = stack[len(stack) - arity:] | |
| # newLength = max(len(stack) - arity, self.maxArity) | |
| # stack = stack[:newLength] + [i + self.maxArity] | |
| # self.maxStack = max(len(stack), self.maxStack) | |
| # program.append(func) | |
| # return program | |