REMEND / remend /change_eqn_format.py
udiboy1209's picture
Add REMEND python module
7145fd6
from .parser import isint, OPERATORS
def prefix_to_brackets(eqn):
stack = []
lastop = []
intunit = []
N = len(eqn)
i = 0
while i < N:
# print("Stack", stack)
val = eqn[i]
if val.startswith("INT"):
intunit.append(val)
i += 1
while i < N and isint(eqn[i]):
intunit.append(eqn[i])
i += 1
stack.append(" ".join(intunit))
intunit = []
i -= 1
elif val in OPERATORS:
_, numops = OPERATORS[val]
lastop.append((len(stack), numops))
stack.append(val)
else:
stack.append(val)
while len(lastop) > 0 and len(stack) > lastop[-1][0] + lastop[-1][1]:
# Combine op
# print(lastop[-1], stack[lastop[-1][0]:])
op = " ".join(stack[lastop[-1][0]:])
del stack[lastop[-1][0]:]
lastop.pop()
stack.append(f"( {op} )")
i += 1
assert(len(stack) == 1)
return stack[0]
def prefix_to_postfix(eqn):
if eqn[0].startswith("INT"):
intunit = [eqn[0]]
for i, val in enumerate(eqn[1:]):
if not isint(val):
break
intunit.append(val)
return intunit, eqn[i+1:]
elif eqn[0] in OPERATORS:
_, numops = OPERATORS[eqn[0]]
remeqn = eqn[1:]
ops = []
for i in range(numops):
op, remeqn = prefix_to_postfix(remeqn)
ops.extend(op)
ops.append(eqn[0]) # Restructured to postfix
return ops, remeqn
else:
return [eqn[0]], eqn[1:]
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser("Change equation format from prefix to other")
parser.add_argument("--eqn", required=True)
parser.add_argument("--out", required=True)
args = parser.parse_args()
with open(args.eqn, "r") as inf, open(args.out, "w") as outf:
for eqn in inf:
postfix, _ = prefix_to_postfix(eqn.strip().split(" "))
outf.write(" ".join(postfix) + "\n")
# eqn = "div mul x add INT+ 5 add mul INT+ 3 x mul pow x INT+ 2 add INT- 5 add mul INT- 3 x mul x mul add INT+ 1 mul k0 pow x INT+ 3 add INT+ 4 x add INT+ 5 mul INT+ 3 x"
# eqn = "div add mul INT+ 3 x pow x INT- 4 mul sub x k0 add mul INT+ 5 x k1"
# print(" ".join(prefix_to_postfix(eqn.split(" "))[0]))
# postfix = "x INT+ 3 mul INT+ 5 add x INT+ 4 add INT+ 3 x pow k0 mul INT+ 1 add mul x mul x INT- 3 mul add INT- 5 add INT+ 2 x pow mul x INT+ 3 mul add INT+ 5 add x mul div"
# print(prefix_to_brackets(eqn.split(" ")))
# (div (mul x (add INT+ 5 (add (mul INT+ 3 x) (mul (pow x INT+ 2) (add INT- 5 (add (mul INT- 3 x) (mul x (mul (add INT+ 1 (mul k0 (pow x INT+ 3))) (add INT+ 4 x))))))))) (add INT+ 5 (mul INT+ 3 x)))
# ( div ( mul x ( add INT+ 5 ( add ( mul INT+ 3 x ) ( mul ( pow x INT+ 2 ) ( add INT- 5 ( add ( mul INT- 3 x ) ( mul x ( mul ( add INT+ 1 ( mul k0 ( pow x INT+ 3 ) ) ) ( add INT+ 4 x ) ) ) ) ) ) ) ) ) ( add INT+ 5 ( mul INT+ 3 x ) ) )