Spaces:
Runtime error
Runtime error
Upload program_translator.py
Browse files- program_translator.py +104 -0
program_translator.py
ADDED
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
class ProgramTranslator(object):
|
3 |
+
def __init__(self, programDict, maxArity):
|
4 |
+
self.programDict = programDict
|
5 |
+
self.maxArity = maxArity
|
6 |
+
|
7 |
+
self.maxStack = 0
|
8 |
+
|
9 |
+
def functionToKey(self, function, withValInputs = True):
|
10 |
+
valInputs = ""
|
11 |
+
if withValInputs:
|
12 |
+
valInputs = "_" + ",".join(function["value_inputs"])
|
13 |
+
functionKey = function["function"] if "_" in function["function"] else \
|
14 |
+
"_".join([function["function"], function["function"]])
|
15 |
+
return str(len(function["inputs"])) + "_" + functionKey + valInputs
|
16 |
+
|
17 |
+
def typeToKey(self, function, withValInputs = True):
|
18 |
+
valInputs = ""
|
19 |
+
if withValInputs:
|
20 |
+
valInputs = "_" + ",".join(function["value_inputs"])
|
21 |
+
functionKey = function["type"] if "_" in function["type"] else \
|
22 |
+
"_".join([function["type"], function["type"]])
|
23 |
+
return str(len(function["inputs"])) + "_" + functionKey + valInputs
|
24 |
+
|
25 |
+
def keyToFunction(self, key):
|
26 |
+
assert key not in self.programDict.invalidSymbols
|
27 |
+
function = {}
|
28 |
+
parts = key.split("_")
|
29 |
+
arity = int(parts[0])
|
30 |
+
function["function"] = "_".join([parts[1], parts[2]])
|
31 |
+
function["value_inputs"] = []
|
32 |
+
if len(parts) == 4:
|
33 |
+
function["value_inputs"] = parts[3].split(",")
|
34 |
+
function["inputs"] = []
|
35 |
+
return function, arity
|
36 |
+
|
37 |
+
def keyToArity(self, key):
|
38 |
+
if key in self.programDict.invalidSymbols:
|
39 |
+
return 0
|
40 |
+
return int(key.split("_")[0])
|
41 |
+
|
42 |
+
def keyToType(self, key):
|
43 |
+
if key in self.programDict.invalidSymbols:
|
44 |
+
return ["0", "0", "0"]
|
45 |
+
return ["0:" + key.split("_")[0], "1:" + key.split("_")[1], "2:" + key.split("_")[2]]
|
46 |
+
|
47 |
+
def programToPostfixProgram(self, program):
|
48 |
+
newProgram = []
|
49 |
+
|
50 |
+
def programToPostfixAux(currIndex = -1):
|
51 |
+
childrenIndices = program[currIndex]["inputs"]
|
52 |
+
#[int(child) for child in program[currIndex]["inputs"]]
|
53 |
+
childrenNewIndices = []
|
54 |
+
for child in childrenIndices:
|
55 |
+
programToPostfixAux(child)
|
56 |
+
childrenNewIndices.append(len(newProgram) - 1)
|
57 |
+
program[currIndex]["inputs"] = childrenNewIndices
|
58 |
+
newProgram.append(program[currIndex])
|
59 |
+
|
60 |
+
programToPostfixAux()
|
61 |
+
return newProgram
|
62 |
+
|
63 |
+
def programToSeq(self, program):
|
64 |
+
return [self.functionToKey(function) for function in program]
|
65 |
+
|
66 |
+
def pdfProgramToSeq(self, program):
|
67 |
+
return [self.typeToKey(function) for function in program]
|
68 |
+
|
69 |
+
def programToInputs(self, program, offset = 0):
|
70 |
+
inputs = [function["inputs"] for function in program]
|
71 |
+
offsetedInputs = [[FuncInput + offset for FuncInput in FuncInputs] for FuncInputs in inputs]
|
72 |
+
return offsetedInputs
|
73 |
+
|
74 |
+
# def seqToProgram(self, seq, enforceValidPrograms = True):
|
75 |
+
# program = []
|
76 |
+
|
77 |
+
# def seqToProgramAux(currIndex = len(seq) - 1):
|
78 |
+
# if currIndex < 0:
|
79 |
+
# program = None
|
80 |
+
# return
|
81 |
+
# currFunc, arity = self.keyToFunction(seq[currIndex])
|
82 |
+
# nextIndex = currIndex - 1
|
83 |
+
# program.append(currFunc)
|
84 |
+
# for _ in arity:
|
85 |
+
# currFunc["inputs"].append(nextIndex)
|
86 |
+
# nextIndex = seqToProgramAux(nextIndex)
|
87 |
+
# currFunc["inputs"].reverse()
|
88 |
+
# return nextIndex
|
89 |
+
|
90 |
+
# if enforceValidPrograms:
|
91 |
+
# seqToProgramAux()
|
92 |
+
# if program is not None:
|
93 |
+
# program.reverse()
|
94 |
+
# else:
|
95 |
+
# stack = [0] * self.maxArity
|
96 |
+
# for i in range(len(seq)):
|
97 |
+
# func, arity = self.keyToFunction(seq[i])
|
98 |
+
# func["inputs"] = stack[len(stack) - arity:]
|
99 |
+
# newLength = max(len(stack) - arity, self.maxArity)
|
100 |
+
# stack = stack[:newLength] + [i + self.maxArity]
|
101 |
+
# self.maxStack = max(len(stack), self.maxStack)
|
102 |
+
# program.append(func)
|
103 |
+
|
104 |
+
# return program
|