Libraryless. Click here for Pure Java version (2999L/21K/67K).
1 | !759 |
2 | |
3 | static S theme = |
4 | //"Color Showing Bot"; |
5 | "Yo robot"; |
6 | |
7 | //include #1003412 // LooseBot v4 |
8 | !include #1003413 // LooseBot v5 |
9 | !include #1003407 // OccTree2 |
10 | |
11 | static OccTree2 tree, botTree; |
12 | static O makeBot; |
13 | sbool walkTree_debug; |
14 | sbool useAdapter = true; |
15 | |
16 | p {
|
17 | L<Dialog> dialogs = loadDialogs(theme); |
18 | tree = goodDialogs2occTree2(dialogs); |
19 | botTree = goodDialogs2occTree2(dialogs); |
20 | printOccTree2(botTree); |
21 | print("Tree size: " + tree.size() + ", bot tree size: " + botTree.size());
|
22 | makeBot = func { new LooseBot(botTree, func { new WordAdapter }) };
|
23 | //walkTree_debug = true; |
24 | try {
|
25 | walkTree(); |
26 | } catch e {
|
27 | print("Engine not working, abort.");
|
28 | printStackTrace(e); |
29 | ret; |
30 | } |
31 | print("Tree walked! " + inputFed + " -> " + outputGot);
|
32 | |
33 | int origSize = botTree.size()-1; |
34 | print("Engine works! Trying to shrink the tree.");
|
35 | |
36 | while (canShrinkTree()) {
|
37 | print("Tree shrunk, trying it again.");
|
38 | } |
39 | |
40 | int newSize = botTree.size()-1; |
41 | printOccTree2(botTree); |
42 | if (newSize < origSize) {
|
43 | long percent = newSize == 0 ? 9999 : round(origSize*100.0/newSize); |
44 | print("Done shrinking tree (" + origSize + " -> " + newSize + " entries - " + percent + "% shrinkage!)");
|
45 | } else |
46 | print("Tree unshrinkable.");
|
47 | } |
48 | |
49 | static int inputFed, outputGot; |
50 | |
51 | sbool canShrinkTree() {
|
52 | L<OccTree2> leaves = botTree.allLeaves(); |
53 | print("Leaves found: " + l(leaves));
|
54 | |
55 | bool anyChange = false; |
56 | for (OccTree2 leaf : leaves) {
|
57 | print("Trying to remove leaf: " + leaf.e + " (level " + leaf.level() + ")");
|
58 | Reattach reattach = removeLeaf(leaf); |
59 | //printOccTree2(botTree); |
60 | if (canWalkTree()) {
|
61 | print("Leaf removed successfully!");
|
62 | anyChange = true; |
63 | } else |
64 | reattach.reattach(); |
65 | } |
66 | |
67 | ret anyChange; |
68 | } |
69 | |
70 | sclass Reattach {
|
71 | OccTree2 node, leaf; |
72 | int idx; |
73 | |
74 | void reattach() {
|
75 | leaf.parent = node; |
76 | node.next.add(idx, leaf); |
77 | } |
78 | } |
79 | |
80 | static Reattach removeLeaf(OccTree2 leaf) {
|
81 | new Reattach r; |
82 | r.leaf = leaf; |
83 | r.node = leaf.parent; |
84 | r.idx = leaf.parent.next.indexOf(leaf); |
85 | leaf.parent.next.remove(r.idx); |
86 | leaf.parent = null; |
87 | ret r; |
88 | } |
89 | |
90 | sbool canWalkTree() {
|
91 | ret canWalkTree(tree, call(makeBot)); |
92 | } |
93 | |
94 | sbool canWalkTree(OccTree2 tree, O bot) {
|
95 | try { walkTree(tree, bot); true; } catch e {
|
96 | if (walkTree_debug) |
97 | printStackTrace(e); |
98 | ret false; |
99 | } |
100 | } |
101 | |
102 | svoid walkTree() {
|
103 | walkTree(tree, call(makeBot)); |
104 | } |
105 | |
106 | svoid walkTree(OccTree2 tree, O bot) {
|
107 | if (tree.isLeaf()) |
108 | assertNull(getOutput(bot)); |
109 | else |
110 | for (E e : tree.followUpKeys()) {
|
111 | if (!contains(ll("good", "bad"), e.state)) {
|
112 | bool input = isInput(e); |
113 | if (walkTree_debug) |
114 | print((input ? "FEED " : "CHECK ") + structure(e)); |
115 | if (input) {
|
116 | assertNull(getOutput(bot)); |
117 | feed(bot, e); |
118 | } else |
119 | checkOutput(e, getOutput(bot)); |
120 | walkTree(tree.followUp(e), bot); |
121 | if (walkTree_debug) |
122 | print("Rewind " + structure(e));
|
123 | rewind(bot); |
124 | } |
125 | } |
126 | } |
127 | |
128 | svoid rewind(O bot) {
|
129 | call(bot, "rewind"); // rewind one step |
130 | } |
131 | |
132 | svoid feed(O bot, E e) {
|
133 | call(bot, "take", e); |
134 | ++inputFed; |
135 | } |
136 | |
137 | static E getOutput(O bot) {
|
138 | E e = cast call(bot, "getSingleOutput"); |
139 | if (e != null) ++outputGot; |
140 | ret e; |
141 | } |
142 | |
143 | svoid checkOutput(E e, E output) {
|
144 | assertEquals(e, output); |
145 | } |
146 | |
147 | static bool isInput(E e) {
|
148 | ret e.q() |
149 | //|| (e.state() && !matchStart("bot", e.state));
|
150 | ; |
151 | } |
Began life as a copy of #1003401
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: | #1003408 |
| Snippet name: | Dialog Optimizer 2 (works!) |
| Eternal ID of this version: | #1003408/1 |
| Text MD5: | 6d902feb81a077ac1e4bab0b2632a4ba |
| Transpilation MD5: | 45821d108c4d8f4dc47b68d04052a4d4 |
| 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 17:47:45 |
| Source code size: | 3550 bytes / 151 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 898 / 1094 |
| Referenced in: | [show references] |