Libraryless. Click here for Pure Java version (2870L/20K/66K).
1 | !759 |
2 | |
3 | !include #1003405 // LooseBot v2 |
4 | |
5 | static OccTree<E> tree, botTree; |
6 | static O makeBot; |
7 | |
8 | p { |
9 | L<Dialog> dialogs = loadDialogs("Color Showing Bot"); |
10 | tree = dialogs2occTree(dialogs); |
11 | botTree = goodDialogs2occTree(dialogs); |
12 | print("Tree size: " + tree.size() + ", bot tree size: " + botTree.size()); |
13 | makeBot = func { new LooseBot(botTree) }; |
14 | if (!canWalkTree(tree, call(makeBot))) { |
15 | print("Engine not working, abort."); |
16 | ret; |
17 | } |
18 | print("Tree walked! " + inputFed + " -> " + outputGot); |
19 | print("Engine works! Trying to shrink the tree."); |
20 | |
21 | while (canShrinkTree()) { |
22 | print("Tree shrunk, trying it again."); |
23 | } |
24 | |
25 | print("Done shrinking tree (new size: " + botTree.size() + ")"); |
26 | } |
27 | |
28 | static int inputFed, outputGot; |
29 | |
30 | sbool canShrinkTree() { |
31 | L<OccTree<E>> leaves = botTree.allLeaves(); |
32 | print("Leaves found: " + l(leaves)); |
33 | |
34 | bool anyChange = false; |
35 | for (OccTree<E> leaf : leaves) { |
36 | Reattach reattach = removeLeaf(leaf); |
37 | if (canWalkTree()) { |
38 | print("Leaf removed successfully!"); |
39 | anyChange = true; |
40 | } else |
41 | reattach.reattach(); |
42 | } |
43 | |
44 | ret anyChange; |
45 | } |
46 | |
47 | sclass Reattach { |
48 | OccTree<E> node, leaf; |
49 | E key; |
50 | |
51 | void reattach() { |
52 | leaf.parent = node; |
53 | node.followUp.put(key, leaf); |
54 | } |
55 | } |
56 | |
57 | static Reattach removeLeaf(OccTree<E> leaf) { |
58 | new Reattach r; |
59 | r.leaf = leaf; |
60 | r.node = leaf.parent; |
61 | r.key = reverseLookup(leaf.parent.followUp, leaf); |
62 | leaf.parent.followUp.remove(r.key); |
63 | leaf.parent = null; |
64 | ret r; |
65 | } |
66 | |
67 | sbool canWalkTree() { |
68 | ret canWalkTree(tree, call(makeBot)); |
69 | } |
70 | |
71 | sbool canWalkTree(OccTree<E> tree, O bot) { |
72 | try { walkTree(tree, bot); true; } catch { ret false; } |
73 | } |
74 | |
75 | svoid walkTree(OccTree<E> tree, O bot) { |
76 | if (isViable(tree)) { |
77 | for (E e : keys(tree.followUp)) { |
78 | if (!contains(ll("good", "bad"), e.state)) { |
79 | //print("Step " + structure(e)); |
80 | if (isInput(e)) |
81 | feed(bot, e); |
82 | else |
83 | checkOutput(e, getOutput(bot)); |
84 | walkTree(tree.followUp(e), bot); |
85 | //print("Rewind " + structure(e)); |
86 | rewind(bot); |
87 | } |
88 | } |
89 | } |
90 | } |
91 | |
92 | svoid rewind(O bot) { |
93 | call(bot, "rewind"); // rewind one step |
94 | } |
95 | |
96 | svoid feed(O bot, E e) { |
97 | call(bot, "take", e); |
98 | ++inputFed; |
99 | } |
100 | |
101 | static E getOutput(O bot) { |
102 | E e = cast call(bot, "getSingleOutput"); |
103 | if (e != null) ++outputGot; |
104 | ret e; |
105 | } |
106 | |
107 | svoid checkOutput(E e, E output) { |
108 | assertEquals(e, output); |
109 | } |
110 | |
111 | static bool isInput(E e) { |
112 | ret e.q() |
113 | //|| (e.state() && !matchStart("bot", e.state)); |
114 | ; |
115 | } |
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: | #1003401 |
Snippet name: | Dialog Optimizer (dev.) |
Eternal ID of this version: | #1003401/1 |
Text MD5: | 9eef431ac339e8bb41a8e372c0c07749 |
Transpilation MD5: | b0f7810165f45a040ea919b6c34529ae |
Author: | stefan |
Category: | javax / talking robots |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2016-06-30 20:50:30 |
Source code size: | 2605 bytes / 115 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 701 / 751 |
Referenced in: | [show references] |