Mercurial > repos > icfp2013
annotate src/bv.tp @ 28:6384e577842d
Add code for filtering a program set based on the operators used
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 10 Aug 2013 18:35:10 -0700 |
parents | 655d5b19333d |
children | b00904b36aca |
rev | line source |
---|---|
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
1 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
2 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
3 program <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
4 _input <- 0u64 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
5 _acc <- 0u64 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
6 _val <- 0u64 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
7 _zero <- #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
8 string <- { "0" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
9 eval <- { 0u64 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
10 operators <- { 0 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
11 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
12 isTerminal? <- { true } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 } |
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
15 _one <- #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
16 string <- { "1" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
17 eval <- { 1u64 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
18 operators <- { 0 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
19 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
20 isTerminal? <- { true } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 } |
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
23 _inputNode <- #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
24 string <- { "input" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
25 eval <- { _input } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
26 operators <- { 0 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
27 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
28 isTerminal? <- { true } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
29 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
30 _accNode <- #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
31 string <- { "acc" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
32 eval <- { _acc } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
33 operators <- { 0 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
34 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
35 isTerminal? <- { true } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
36 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
37 _valNode <- #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
38 string <- { "val" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
39 eval <- { _val } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
40 operators <- { 0 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
41 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
42 isTerminal? <- { true } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
43 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
44 _opPlus <- 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
45 _opAnd <- 2 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
46 _opOr <- 4 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
47 _opXor <- 8 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
48 _opNot <- 0x10 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
49 _opShl1 <- 0x20 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
50 _opShr1 <- 0x40 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
51 _opShr4 <- 0x80 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
52 _opShr16 <- 0x100 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
53 _opIf0 <- 0x200 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
54 _opFold <- 0x400 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
55 _opTfold <- 0x800 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
56 _maskRemoveFold <- 0x3FF |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
57 _names <- dict linear |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
58 _names set: "plus" _opPlus |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
59 _names set: "and" _opAnd |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
60 _names set: "xor" _opXor |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
61 _names set: "or" _opOr |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
62 _names set: "not" _opNot |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
63 _names set: "shl1" _opShl1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
64 _names set: "shr1" _opShr1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
65 _names set: "shr4" _opShr4 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
66 _names set: "shr16" _opShr16 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
67 _names set: "if0" _opIf0 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
68 _names set: "fold" _opFold |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
69 _names set: "tfold" _opTfold |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
70 _memo <- #[] |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
71 _memoFoldBody <- #[] |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
72 _memoFoldParam <- #[] |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
73 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
74 plus <- :left right { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
75 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
76 string <- { "(plus " . (string: left) . " " . (string: right) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
77 eval <- { (eval: left) + (eval: right)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
78 operators <- { _opPlus or (left operators) or (right operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
79 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
80 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
81 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 } |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
83 zero <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
84 _zero |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
85 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
87 one <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
88 _one |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 } |
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
91 opAnd <- :left right { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
92 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
93 string <- { "(and " . (string: left) . " " . (string: right) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
94 eval <- { (eval: left) and (eval: right)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
95 operators <- { _opAnd or (left operators) or (right operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
96 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
97 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
98 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
99 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
100 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
101 opOr <- :left right { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
102 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
103 string <- { "(or " . (string: left) . " " . (string: right) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
104 eval <- { (eval: left) or (eval: right)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
105 operators <- { _opOr or (left operators) or (right operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
106 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
107 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
108 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 } |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
110 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
111 opXor <- :left right { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
112 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
113 string <- { "(xor " . (string: left) . " " . (string: right) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
114 eval <- { (eval: left) xor (eval: right)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
115 operators <- { _opXor or (left operators) or (right operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
116 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
117 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
118 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
119 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
120 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
121 opNot <- :exp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
122 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
123 string <- { "(not " . (string: exp) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
124 eval <- { (eval: exp) xor -1u64 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
125 operators <- { _opNot or (exp operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
126 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
127 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
128 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
129 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
131 shl1 <- :exp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
132 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
133 string <- { "(shl1 " . (string: exp) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
134 eval <- { lshift: (eval: exp) by: 1u64 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
135 operators <- { _opShl1 or (exp operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
136 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
137 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
138 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
139 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
140 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
141 shr1 <- :exp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
142 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
143 string <- { "(shr1 " . (string: exp) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
144 eval <- { rshift: (eval: exp) by: 1u64 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
145 operators <- { _opShr1 or (exp operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
146 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
147 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
148 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
149 } |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
150 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
151 shr4 <- :exp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
152 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
153 string <- { "(shr4 " . (string: exp) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
154 eval <- { rshift: (eval: exp) by: 4u64 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
155 operators <- { _opShr4 or (exp operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
156 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
157 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
158 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
159 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
160 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
161 shr16 <- :exp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
162 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
163 string <- { "(shr16 " . (string: exp) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
164 eval <- { rshift: (eval: exp) by: 16u64 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
165 operators <- { _opShr16 or (exp operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
166 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
167 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
168 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
169 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
170 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
171 input <- { _inputNode } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
172 acc <- { _accNode } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
173 val <- { _valNode } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
174 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
175 if0:then:else <- :exp ifzero :ifnotzero { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
176 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
177 string <- { "(if0 " . (string: exp) . " " . (string: ifzero) . " " . (string: ifnotzero) . ")" } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
178 eval <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
179 if: (eval: exp) = 0u64 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
180 eval: ifzero |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
181 } else: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
182 eval: ifnotzero |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
183 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
184 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
185 operators <- { _opIf0 or (exp operators) or (ifzero operators) or (ifnotzero operators)} |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
186 isTfold? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
187 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
188 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
189 } |
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
190 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
191 fold:with:startingAt <- :toFold :fun :startAcc { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
192 #{ |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
193 string <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
194 "(fold " . (string: toFold) . " " . (string: startAcc) . " (lambda (val acc) " . (string: fun) . "))" |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
195 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
196 eval <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
197 _acc <- (eval: startAcc) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
198 source <- (eval: toFold) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
199 //parser doesn''t currently like vertical whitespace in arays so |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
200 //this needs to be on a single line until that bug is fixed |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
201 vals <- #[source and 255u64 (rshift: source by: 8u64) and 255u64 (rshift: source by: 16u64) and 255u64 (rshift: source by: 24u64) and 255u64 (rshift: source by: 32u64) and 255u64 (rshift: source by: 40u64) and 255u64 (rshift: source by: 48u64) and 255u64 (rshift: source by: 56u64) and 255u64] |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
202 foreach: vals :idx cur { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
203 _val <- cur |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
204 _acc <- (eval: fun) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
205 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
206 _acc |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
207 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
208 operators <- { _opFold or (toFold operators) or (fun operators) or (startAcc operators) } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
209 isTfold? <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
210 (toFold isTerminal?) && (startAcc isTerminal?) && (toFold string) = "input" && (startAcc string) = "0" |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
211 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
212 isTerminal? <- { false } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
213 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
214 } |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
215 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
216 run <- :in { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
217 _input <- in |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
218 eval: root |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
219 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
220 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
221 root <- _zero |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
222 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
223 string <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
224 "(lambda (input) " . (string: root) . ")" |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
225 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
226 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
227 gentestprog <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
228 root <- if0: (opAnd: input one) then: ( |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
229 plus: (opOr: input (shl1: one)) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
230 ) else: ( |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
231 opXor: input (shr16: input) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
232 ) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
233 self |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
234 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
235 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
236 exampleprog <- { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
237 root <- fold: input with: (opOr: val acc) startingAt: zero |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
238 self |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
239 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
240 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
241 //TODO: memoize this to improve runtime for large n |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
242 allOfSize:inFold? <- :n :infold? { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
243 memo <- if: infold? = 2 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
244 _memoFoldBody |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
245 } else: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
246 if: infold? = 1 && n > 4 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
247 _memoFoldParam |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
248 } else: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
249 _memo |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
250 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
251 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
252 if: n - 1 < (memo length) { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
253 print: "Memo hit: " . (string: n) . "\n" |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
254 memo get: (n - 1) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
255 } else: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
256 if: n = 1 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
257 res <- #[one zero input] |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
258 if: infold? = 2 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
259 res append: acc |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
260 res append: val |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
261 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
262 print: "Saving at memo index: " . (string: (memo length)) . "\n" |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
263 memo append: res |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
264 res |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
265 } else: { |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
266 res <- #[] |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
267 foreach: (allOfSize: n - 1 inFold?: infold?) :idx exp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
268 res append: (opNot: exp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
269 res append: (shl1: exp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
270 res append: (shr1: exp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
271 res append: (shr4: exp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
272 res append: (shr16: exp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
273 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
274 if: n > 2 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
275 numLeft <- 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
276 argTotal <- n - 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
277 while: { numLeft < argTotal } do: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
278 numRight <- argTotal - numLeft |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
279 choicesRight <- (allOfSize: numRight inFold?: infold?) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
280 foreach: (allOfSize: numLeft inFold?: infold?) :idx leftExp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
281 foreach: choicesRight :idx rightExp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
282 res append: (opAnd: leftExp rightExp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
283 res append: (opOr: leftExp rightExp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
284 res append: (opXor: leftExp rightExp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
285 res append: (plus: leftExp rightExp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
286 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
287 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
288 numLeft <- numLeft + 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
289 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
290 if: n > 3 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
291 numLeft <- 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
292 limitLeft <- n - 2 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
293 while: { numLeft < limitLeft } do: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
294 numMid <- 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
295 limitMid <- n - (1 + numLeft) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
296 while: { numMid < limitMid } do: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
297 numRight <- n - (1 + numLeft + numMid) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
298 choicesRight <- (allOfSize: numRight inFold?: infold?) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
299 choicesMid <- (allOfSize: numMid inFold?: infold?) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
300 foreach: (allOfSize: numLeft inFold?: infold?) :idx leftExp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
301 foreach: choicesMid :idx midExp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
302 foreach: choicesRight :idx rightExp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
303 res append: (if0: leftExp then: midExp else: rightExp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
304 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
305 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
306 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
307 numMid <- numMid + 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
308 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
309 numLeft <- numLeft + 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
310 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
311 if: n > 4 && infold? = 0 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
312 numSeq <- 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
313 limitSeq <- n - 3 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
314 while: { numSeq < limitSeq } do: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
315 numFun <- 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
316 limitFun <- n - (2 + numSeq) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
317 while: { numFun < limitFun } do: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
318 numStart <- n - (2 + numSeq + numFun) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
319 choicesStart <- (allOfSize: numStart inFold?: 1) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
320 choicesFun <- (allOfSize: numFun inFold?: 2) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
321 foreach: (allOfSize: numSeq inFold?: 1) :idx seqExp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
322 foreach: choicesFun :idx funExp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
323 foreach: choicesStart :idx startExp { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
324 res append: (fold: seqExp with: funExp startingAt: startExp) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
325 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
326 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
327 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
328 numFun <- numFun + 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
329 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
330 numSeq <- numSeq + 1 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
331 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
332 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
333 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
334 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
335 print: "Saving " . (string: n) . " at memo index: " . (string: (memo length)) . "\n" |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
336 memo append: res |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
337 res |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
338 } |
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
339 } |
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
340 } |
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
341 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
342 allOfSize <- :n { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
343 allOfSize: (n - 1) inFold?: 0 |
27
655d5b19333d
Add memoization support to program generator
Mike Pavone <pavone@retrodev.com>
parents:
9
diff
changeset
|
344 } |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
345 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
346 filterTrees <- :trees strops { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
347 filtered <- #[] |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
348 ops <- strops fold: 0 with: :acc el { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
349 acc or (_names get: el withDefault: 0) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
350 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
351 if: (ops and _opTfold) > 0 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
352 foreach: trees :idx tree { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
353 if: (tree isTfold?) { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
354 if: (tree operators) and _maskRemoveFold = ops and _maskRemoveFold { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
355 filtered append: tree |
9
0ccebdbc3e80
Add support for generating programs that contain fold. Make the desired program size a command line argument.
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
356 } |
0ccebdbc3e80
Add support for generating programs that contain fold. Make the desired program size a command line argument.
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
357 } |
8
3f0172ceab81
Add support for generating programs with if0, thus allowing us to generate all programs up to size 5.
Mike Pavone <pavone@retrodev.com>
parents:
7
diff
changeset
|
358 } |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
359 } else: { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
360 foreach: trees :idx tree { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
361 if: (tree operators) = ops { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
362 filtered append: tree |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
363 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
364 } |
7
301f16245955
Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
365 } |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
366 filtered |
7
301f16245955
Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
367 } |
301f16245955
Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
368 } |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
369 } |
7
301f16245955
Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
370 |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
371 test <- :prog { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
372 print: (string: prog) . "\n" |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
373 print: "Operators: " . (hex: ((prog root) operators)) . "\n" |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
374 if: ((prog root) isTfold?) { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
375 print: "TFold!\n" |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
376 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
377 //parser doesn''t currently like vertical whitespace in arays so |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
378 //this needs to be on a single line until that bug is fixed |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
379 vals <- #[0u64 1u64 2u64 3u64 4u64 5u64 6u64 7u64 8u64 9u64 10u64 11u64 12u64 13u64 14u64 15u64 0x30001u64 0x50015u64 (lshift: 0x11223344u64 by: 32u64) or 0x55667788u64] |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
380 foreach: vals :idx val { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
381 print: "p(0x" . (hex: val) . ") = 0x" . (hex: (prog run: val)) . "\n" |
7
301f16245955
Add support for generating all programs up to size 3 inclusive
Mike Pavone <pavone@retrodev.com>
parents:
5
diff
changeset
|
382 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
383 } |
28
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
384 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
385 main <- :args { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
386 //test: (program gentestprog) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
387 //test: (program exampleprog) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
388 size <- 3 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
389 if: (args length) > 1 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
390 size <- int32: (args get: 1) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
391 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
392 if: size >= 2 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
393 prog <- program |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
394 trees <- (prog allOfSize: size) |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
395 if: (args length) > 2 { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
396 ops <- (args get: 2) splitOn: "," |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
397 trees <- prog filterTrees: trees ops |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
398 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
399 foreach: trees :idx tree { |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
400 prog root! tree |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
401 test: prog |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
402 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
403 } |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
404 0 |
6384e577842d
Add code for filtering a program set based on the operators used
Mike Pavone <pavone@retrodev.com>
parents:
27
diff
changeset
|
405 } |
3
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
406 } |
dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
407 } |