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 | |