1 | lib 1003153 // magic.jar for Lua |
2 | |
3 | sinterface Make { |
4 | abstract S getLua(); |
5 | } |
6 | |
7 | // collects HIGHEST score |
8 | sclass Best<A> { |
9 | A best; |
10 | double score; |
11 | |
12 | void put(A a, double score) { |
13 | if (best == null || score > this.score) { |
14 | best = a; |
15 | this.score = score; |
16 | } |
17 | } |
18 | |
19 | A get() { ret best; } |
20 | } |
21 | |
22 | abstract sclass GenOpt<Data> { |
23 | // User-supplied: makeData, fillSandbox, getScore, updatePool |
24 | |
25 | void fillSandbox(Sandbox s, Data d) {} |
26 | abstract double getScore(Sandbox s, Data d, LuaValue result); |
27 | abstract Data makeData(); |
28 | void updatePool(L<Make> pool) {} |
29 | |
30 | int steps = 1000; // execution steps limit |
31 | int verifications = 1000; // sets of data to verify program with |
32 | |
33 | L<Make> pool; |
34 | int round; |
35 | S verifiedProgram; |
36 | |
37 | void go() { |
38 | pool = new L; |
39 | new Best<Make> best; |
40 | new Best<S> bestProgram; |
41 | while (licensed()) { |
42 | ping(); |
43 | ++round; |
44 | updatePool(pool); |
45 | |
46 | new HashMap<Make, Number> scores; |
47 | Data data = makeData(); |
48 | |
49 | for (Make maker : pool) { |
50 | ping(); |
51 | try { |
52 | S program = maker.getLua(); |
53 | |
54 | if ((round % 10) == 0) print(program); |
55 | double score = scoreProgram(program, data); |
56 | scores.put(maker, score); |
57 | best.put(maker, score); |
58 | bestProgram.put(program, score); |
59 | |
60 | if (score >= 100) { |
61 | int vround = verifyProgram(program); |
62 | if (vround >= verifications) { |
63 | print("\nProgram verifies! (searched for " + round + " rounds, tested " + vround + " rounds)"); |
64 | verifiedProgram = program; |
65 | print(program); |
66 | ret; |
67 | } else |
68 | print("Program does not verify in round " + vround); |
69 | } |
70 | |
71 | } catch { |
72 | // fail quietly |
73 | } |
74 | } |
75 | Make winner = highest(scores); |
76 | if ((round % 10) == 0) |
77 | print(round + " Best score: " + scores.get(winner) + " - " + structure(winner) + ", all time: " + best.score); |
78 | if ((round % 100) == 0) |
79 | print("All time winner: " + indent(bestProgram.best) + "\n"); |
80 | } |
81 | } |
82 | |
83 | Sandbox makeSandbox(final Data data) { |
84 | Sandbox s = luaSandbox(); |
85 | fillSandbox(s, data); |
86 | ret s; |
87 | } |
88 | |
89 | double scoreProgram(S program, Data data) { |
90 | Sandbox sandbox = makeSandbox(data); |
91 | luaMaxSteps(steps); |
92 | LuaValue result; |
93 | try { |
94 | result = evalLua(sandbox, program); |
95 | } catch e { |
96 | silentException(e); |
97 | ret -1000; |
98 | } |
99 | ret getScore(sandbox, data, result); |
100 | } |
101 | |
102 | int verifyProgram(S program) { |
103 | int i = 0; |
104 | try { |
105 | for (i = 0; i < verifications; i++) |
106 | if (scoreProgram(program, makeData()) < 100) |
107 | ret i; |
108 | ret verifications; |
109 | } catch { |
110 | ret i; |
111 | } |
112 | } |
113 | } |
Began life as a copy of #1003165
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, ddnzoavkxhuk, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1004584 |
Snippet name: | Lua GenOpt 3 (include) |
Eternal ID of this version: | #1004584/1 |
Text MD5: | 7f985b42bfa4db55fc48ba31108197eb |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2016-08-23 15:11:02 |
Source code size: | 2875 bytes / 113 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 541 / 899 |
Referenced in: | [show references] |