1 | bool debug; |
2 | bool imagineMode; |
3 | bool collectCheckingLog = true; |
4 | new LinkedHashSet<S> imaginedFacts; |
5 | LS checkingLog; |
6 | long processingTime; |
7 | new L<IfThen> activeTempRules; |
8 | |
9 | visualize {
|
10 | ret withCenteredButtons(super.visualize(), |
11 | "Checking Log", r { showText("Checking Log", lines(checkingLog)) });
|
12 | } |
13 | |
14 | void thinkAbout(S s) {
|
15 | time "Processing Time For Message"{
|
16 | thinkAbout_impl(s); |
17 | } |
18 | processingTime = lastTiming(); |
19 | } |
20 | |
21 | void thinkAbout_impl(S input) {
|
22 | new Thinking().thinkAbout_impl(input); |
23 | } |
24 | |
25 | void _postMessage(S s) { postMessage(s); }
|
26 | |
27 | class Thinking {
|
28 | long cancelTime = now()+20000; |
29 | new Map<S, Int> ruleScores; |
30 | new LinkedHashSet<S> rewrittenInputs; |
31 | new LinkedHashSet<S> newRewrittenInputs; |
32 | volatile bool posted, done; |
33 | new L<IfThen> rules; |
34 | replace Plan with PlanInMotion. |
35 | new Plan<Runnable> plan; |
36 | |
37 | void postMessage(S s) {
|
38 | _postMessage(s); |
39 | posted = true; |
40 | } |
41 | |
42 | void done() { done = true; }
|
43 | |
44 | O evalExp(NLLogicChecker_v2 c, Exp e, NLLogicChecker_v2.Matching m) {
|
45 | // prepare context |
46 | final SS vars = m.matches; |
47 | temp tempSetThreadLocal(ai_context_tl(), new O {
|
48 | LS getList(S var) {
|
49 | int i = 1; |
50 | S s; |
51 | new LS l; |
52 | while ((s = vars.get(var + i++)) != null) |
53 | l.add(s); |
54 | ret l; |
55 | } |
56 | |
57 | IfThen getRule(S id) {
|
58 | ret findByField(rules, globalID := id); |
59 | } |
60 | }); |
61 | |
62 | S code = nlLogic_text(e); |
63 | print("Eval'ing: " + code);
|
64 | temp tempAdd(hotwire_copyOver_after, voidfunc(Class c) {
|
65 | copyFields(mc(), c, 'telegram_msg_tl, 'telegram_recentHistory_tl, 'ai_context_tl) |
66 | }); |
67 | O result = evalWithDollarVars(code, m.matches); |
68 | print("Result: " + shorten(str(result), 100));
|
69 | ret result; |
70 | } |
71 | |
72 | void thinkAbout_impl(fS input1) {
|
73 | plan.add(r "!initiative" {
|
74 | if (!eq(input1, "!initiative")) ret; |
75 | L<IfThen> rules = mL_parsedNLRulesWithoutIDs("Initiative rules");
|
76 | for (IfThen rule : shuffledIterator(rules)) {
|
77 | Pair<Exp> p = nlLogic_extractFirstCondition(rule.in); |
78 | if (p == null) continue; |
79 | if (nlLogic_isFunc(p.a, 'initiative)) {
|
80 | postMessage(nlLogic_text(((Func) p.a).arg)); |
81 | IfThen temp = IfThen(p.b, rule.out); |
82 | temp.globalID = aGlobalID(); |
83 | print("Have temp rule: " + sfu(temp));
|
84 | activeTempRules.add(temp); |
85 | ret with done(); |
86 | } |
87 | } |
88 | ret with done(); |
89 | }); |
90 | |
91 | plan.add(r "!step" {
|
92 | new Matches mm; |
93 | if (!startsWith_trim(input1, "!step ", mm)) ret; |
94 | // TODO |
95 | }); |
96 | |
97 | runPlanWithCheck(plan, func -> bool { !done });
|
98 | if (done) ret; |
99 | |
100 | S input2 = input1; |
101 | final new LS options; |
102 | if (startsWith(input2, "[")) {
|
103 | addAll(options, leadingSquareBracketOptions(input2)); |
104 | input2 = dropLeadingSquareBracketStuff(input2); |
105 | } |
106 | |
107 | fS input = input2; |
108 | ai_tg_collectRuleFeedback(ruleScores, null); |
109 | |
110 | newRewrittenInputs.add(input); |
111 | final Map msg = telegram_msg(); |
112 | |
113 | final NLLogicChecker_v3 c = new NLLogicChecker_v3 {
|
114 | bool checkExpression_impl(Exp e, Matching m) {
|
115 | if (e instanceof Literal) {
|
116 | // TEXT CONDITIONS |
117 | |
118 | S text = nlLogic_text(e); |
119 | if (eq(text, "authorized")) |
120 | ret telegram_amIAuthorized(); |
121 | else if(eq(text, "imagineMode")) |
122 | ret imagineMode; |
123 | } |
124 | |
125 | ret super.checkExpression_impl(e, m); |
126 | } |
127 | }; |
128 | |
129 | c.evaluator = func(Exp e, NLLogicChecker_v2.Matching m) -> O { evalExp(c, e, m) };
|
130 | |
131 | if (collectCheckingLog) {
|
132 | checkingLog = new L; |
133 | nlLogic_collectCheckingLog(c, checkingLog); |
134 | } |
135 | |
136 | Pair<L<IfThen>, LS> rulesAndFacts = getRulesAndFacts(); |
137 | c.facts = reversed(rulesAndFacts.b); |
138 | rules = concatLists_conservative(activeTempRules, reversed(rulesAndFacts.a)); // latest rules first! |
139 | activeTempRules.clear(); |
140 | |
141 | while (!posted && now() < cancelTime && nempty(newRewrittenInputs)) {
|
142 | fS s = first(newRewrittenInputs); |
143 | rewrittenInputs.add(s); |
144 | newRewrittenInputs.remove(s); |
145 | |
146 | c.input = s; |
147 | c.recentHistory = recentHistory; |
148 | final new L<RuleWithParams> battleSpace; |
149 | |
150 | applyNLLogicFacts_v4_verbose.set(debug); |
151 | applyNLLogicFacts_v4(c, voidfunc(IfThen rule, NLLogicChecker_v2.Matching m) {
|
152 | // Rule matches completely, add to battle space |
153 | |
154 | battleSpace.add(new RuleWithParams(rule, m.matches)); |
155 | }, rules); |
156 | |
157 | print("Have " + n2(battleSpace, "possible rule")
|
158 | + (empty(battleSpace) ? "" : ": " + joinWithComma(map(func(RuleWithParams r) -> S { r.ruleID() + "/" + toInt(ruleScores.get(r.ruleID())) }, battleSpace))));
|
159 | |
160 | bool all = options.contains("all");
|
161 | if (!all) nlLogic_battleItOut(battleSpace, c.facts); |
162 | |
163 | L<RuleWithParams> winners = all ? battleSpace : nlLogic_highestScore(battleSpace, ruleScores); |
164 | |
165 | fS msgGlobalID = getString(msg, 'globalID); |
166 | //print("msgGlobalID=" + msgGlobalID);
|
167 | for (RuleWithParams r : winners) {
|
168 | print("Firing rule " + r.rule.globalID);
|
169 | |
170 | // Save rule fire |
171 | if (nempty(msgGlobalID) && nempty(r.rule.globalID)) {
|
172 | S fact = format("Rule * fired on message * at *", r.rule.globalID, msgGlobalID, localDateWithMilliseconds());
|
173 | if (nempty(r.matches)) |
174 | fact += " with vars " + dropPrefix("lhm", struct(r.matches));
|
175 | print("Saving rule fire. Mech mode: " + mechMode());
|
176 | print(addToMechList("Telegram Rule Fires", print(fact)));
|
177 | } |
178 | |
179 | executeRule(c, r); |
180 | } |
181 | |
182 | if (collectCheckingLog) |
183 | print("Checking log length: " + l(checkingLog));
|
184 | } |
185 | } |
186 | |
187 | void executeRule(NLLogicChecker_v3 c, RuleWithParams r) {
|
188 | // Execute rule |
189 | for (Exp e : nlLogic_unrollAnd(r.rule.out)) {
|
190 | e = c.apply(e, r.matches); |
191 | if (e cast Func) {
|
192 | S name = e.name; |
193 | if (eqOneOf(name, 'output, 'say)) |
194 | postMessage(nlLogic_text(e.arg)); |
195 | else if (eq(name, 'fact)) {
|
196 | S fact = nlLogic_text(e.arg); |
197 | if (imagineMode) {
|
198 | if (!containsNL(imaginedFacts, fact)) {
|
199 | imaginedFacts.add(fact); |
200 | postMessage("Storing imaginary fact: " + fact);
|
201 | } |
202 | } else if (!ai_isQuestion_2(fact) && ai_storeActualFact(fact)) |
203 | postMessage("Storing fact: " + fact);
|
204 | } else if (eq(name, 'storeRule)) {
|
205 | S rule = nlLogic_text(e.arg); |
206 | if (!telegram_authorizedToStoreRule(rule)) continue; |
207 | rule = nlLogic_addGlobalID(rule); |
208 | if (mech_changed(appendToMechList_noUniq("NL Logic Examples", "\n" + rule)))
|
209 | postMessage("Rule stored");
|
210 | } else if (eq(name, 'imagineMode)) {
|
211 | imagineMode = match("true", nlLogic_text(e.arg));
|
212 | if (!imagineMode) imaginedFacts.clear(); |
213 | } else if (eq(name, 'input)) {
|
214 | S x = nlLogic_text(e.arg); |
215 | if (!rewrittenInputs.contains(x) && newRewrittenInputs.add(x)) |
216 | print("New rewritten input: " + x);
|
217 | } else |
218 | ret with print("Skipping rule with unknown RHS func: " + e.name);
|
219 | } else |
220 | ret with print("Skipping rule with unknown RHS element: " + e);
|
221 | } |
222 | } |
223 | } // end class Thinking |
224 | |
225 | Pair<L<IfThen>, LS> getRulesAndFacts() {
|
226 | ret ai_activeRulesAndFacts(imagineMode ? asList(imaginedFacts) : null); |
227 | } |
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1017946 |
| Snippet name: | Telegram Facts Bot [Include, old] |
| Eternal ID of this version: | #1017946/26 |
| Text MD5: | a14fe97d1536f3ecaaec168cd164ea8a |
| Author: | stefan |
| Category: | javax |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2018-08-29 12:33:15 |
| Source code size: | 8058 bytes / 227 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 672 / 1114 |
| Version history: | 25 change(s) |
| Referenced in: | [show references] |