-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsimplify.py
49 lines (43 loc) · 1.7 KB
/
simplify.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from differentiate import Div, Mul, Add, Variable
class Graph:
def __init__(self, node):
self.node = node
def simplify(self):
names = {Mul: '*', Add: '+', Div: '/'}
n = self.node
if hasattr(n, 'a'):
n.a = Graph(n.a).simplify()
n.b = Graph(n.b).simplify()
n.name = '({} {} {})'.format(n.a.name, names[type(n)], n.b.name)
while hasattr(n, 'a'):
if isinstance(n, Mul):
if n.a.fixed and n.b.fixed:
val = n.a.val*n.b.val
n = Variable(name=str(val), val=val, fixed=True)
elif n.a.fixed:
if n.a.val == 0:
n = Variable(name='0', val=0, fixed=True)
elif n.a.val == 1:
n = n.b
elif n.b.fixed:
if n.b.val == 0:
n = Variable(name='0', val=0, fixed=True)
elif n.b.val == 1:
n = n.a
elif isinstance(n, Add):
if n.a.fixed and n.b.fixed:
val = n.a.val + n.b.val
n = Variable(name=str(val), val=val, fixed=True)
elif n.a.fixed and n.a.val == 0:
n = n.b
elif n.b.fixed and n.b.val == 0:
n = n.a
elif isinstance(n, Div):
if n.a.fixed and n.a.val == 0:
n = Variable(name='0', val=0, fixed=True)
elif n.b.fixed and n.b.val == 1:
n = n.a
elif n.a is n.b:
n = Variable(name='1', val=1, fixed=True)
break
return n