Libraryless. Click here for Pure Java version (3095L/22K/70K).
1 | !759 |
2 | |
3 | static S theme = |
4 | "Let's examine your input"; |
5 | |
6 | static O preprocessor = func(S in) {
|
7 | S s = findLastQuoted(in); |
8 | ret s == null ? null : parsePoemLine(s).type(); |
9 | }; |
10 | |
11 | //include #1003412 // LooseBot v4 |
12 | !include #1003413 // LooseBot v5 |
13 | !include #1003407 // OccTree2 |
14 | |
15 | static OccTree2 tree, botTree; |
16 | static O makeBot; |
17 | sbool walkTree_debug; |
18 | sbool useAdapter = true, useGrabber = true; |
19 | |
20 | p {
|
21 | L<Dialog> dialogs = loadDialogs(theme); |
22 | tree = goodDialogs2occTree2(dialogs); |
23 | botTree = goodDialogs2occTree2(dialogs); |
24 | printOccTree2(botTree); |
25 | print("Tree size: " + tree.size() + ", bot tree size: " + botTree.size());
|
26 | makeBot = func {
|
27 | LooseBot bot = new LooseBot(botTree, func { new WordAdapter });
|
28 | bot.debug = true; |
29 | if (useGrabber) pcall {
|
30 | bot.grabber = makeGrabber(botTree, preprocessor); |
31 | if (bot.grabber != null) |
32 | print("Grabber made!");
|
33 | } |
34 | ret bot; |
35 | }; |
36 | //walkTree_debug = true; |
37 | try {
|
38 | walkTree(); |
39 | } catch e {
|
40 | print("Engine not working, abort.");
|
41 | printStackTrace(e); |
42 | ret; |
43 | } |
44 | print("Tree walked! " + inputFed + " -> " + outputGot);
|
45 | |
46 | int origSize = botTree.size()-1; |
47 | print("Engine works! Trying to shrink the tree.");
|
48 | |
49 | while (canShrinkTree()) {
|
50 | print("Tree shrunk, trying it again.");
|
51 | } |
52 | |
53 | int newSize = botTree.size()-1; |
54 | printOccTree2(botTree); |
55 | if (newSize < origSize) {
|
56 | long percent = newSize == 0 ? 9999 : round(origSize*100.0/newSize-100); |
57 | print("Done shrinking tree (" + origSize + " -> " + newSize + " entries - " + percent + "% shrinkage!)");
|
58 | } else |
59 | print("Tree unshrinkable.");
|
60 | } |
61 | |
62 | static int inputFed, outputGot; |
63 | |
64 | sbool canShrinkTree() {
|
65 | L<OccTree2> leaves = botTree.allLeaves(); |
66 | print("Leaves found: " + l(leaves));
|
67 | |
68 | bool anyChange = false; |
69 | for (OccTree2 leaf : leaves) {
|
70 | print("Trying to remove leaf: " + leaf.e + " (level " + leaf.level() + ")");
|
71 | Reattach reattach = removeLeaf(leaf); |
72 | //printOccTree2(botTree); |
73 | if (canWalkTree()) {
|
74 | print("Leaf removed successfully!");
|
75 | anyChange = true; |
76 | } else |
77 | reattach.reattach(); |
78 | } |
79 | |
80 | ret anyChange; |
81 | } |
82 | |
83 | sclass Reattach {
|
84 | OccTree2 node, leaf; |
85 | int idx; |
86 | |
87 | void reattach() {
|
88 | leaf.parent = node; |
89 | node.next.add(idx, leaf); |
90 | } |
91 | } |
92 | |
93 | static Reattach removeLeaf(OccTree2 leaf) {
|
94 | new Reattach r; |
95 | r.leaf = leaf; |
96 | r.node = leaf.parent; |
97 | r.idx = leaf.parent.next.indexOf(leaf); |
98 | leaf.parent.next.remove(r.idx); |
99 | leaf.parent = null; |
100 | ret r; |
101 | } |
102 | |
103 | sbool canWalkTree() {
|
104 | ret canWalkTree(tree, call(makeBot)); |
105 | } |
106 | |
107 | sbool canWalkTree(OccTree2 tree, O bot) {
|
108 | try { walkTree(tree, bot); true; } catch e {
|
109 | if (walkTree_debug) |
110 | printStackTrace(e); |
111 | ret false; |
112 | } |
113 | } |
114 | |
115 | svoid walkTree() {
|
116 | walkTree(tree, call(makeBot)); |
117 | } |
118 | |
119 | svoid walkTree(OccTree2 tree, O bot) {
|
120 | if (tree.isLeaf()) |
121 | assertNull(getOutput(bot)); |
122 | else |
123 | for (E e : tree.followUpKeys()) {
|
124 | if (!contains(ll("good", "bad"), e.state)) {
|
125 | bool input = isInput(e); |
126 | if (walkTree_debug) |
127 | print((input ? "FEED " : "CHECK ") + structure(e)); |
128 | if (input) {
|
129 | assertNull(getOutput(bot)); |
130 | feed(bot, e); |
131 | } else |
132 | checkOutput(e, getOutput(bot)); |
133 | walkTree(tree.followUp(e), bot); |
134 | if (walkTree_debug) |
135 | print("Rewind " + structure(e));
|
136 | rewind(bot); |
137 | } |
138 | } |
139 | } |
140 | |
141 | svoid rewind(O bot) {
|
142 | call(bot, "rewind"); // rewind one step |
143 | } |
144 | |
145 | svoid feed(O bot, E e) {
|
146 | call(bot, "take", e); |
147 | ++inputFed; |
148 | } |
149 | |
150 | static E getOutput(O bot) {
|
151 | E e = cast call(bot, "getSingleOutput"); |
152 | if (e != null) ++outputGot; |
153 | ret e; |
154 | } |
155 | |
156 | svoid checkOutput(E e, E output) {
|
157 | //assertEquals(e, output); |
158 | if (neq(e, output)) {
|
159 | print("Bot fail: " + e + " vs " + output);
|
160 | fail(); |
161 | } |
162 | } |
163 | |
164 | static bool isInput(E e) {
|
165 | ret e.q() |
166 | //|| (e.state() && !matchStart("bot", e.state));
|
167 | ; |
168 | } |
Began life as a copy of #1003408
download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, ddnzoavkxhuk, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1003485 |
| Snippet name: | Dialog Optimizer 3 (with makeGrabber) |
| Eternal ID of this version: | #1003485/1 |
| Text MD5: | e8da84a86e7171b8158bf07b38d799b8 |
| Transpilation MD5: | 6eeed13568bade7a36f4fa04bc14cbfc |
| Author: | stefan |
| Category: | javax / talking robots |
| Type: | JavaX source code |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2016-07-05 21:21:19 |
| Source code size: | 4001 bytes / 168 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 782 / 889 |
| Referenced in: | [show references] |