Warning: session_start(): open(/var/lib/php/sessions/sess_ki8dguv2ij8kcpqqofbkh0vurn, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
concept Sentence {
S text;
S action;
}
sclass Example {
L tok;
int start, end;
*() {}
*(L *tok, IntRange subjectTokens) {
start = subjectTokens.start;
end = subjectTokens.end;
}
toString {
ret quote(joinWithSpaces(tok)) + " => " + joinWithSpaces(subList(tok, start, end));
}
}
abstract sclass Guesser {
abstract IntRange getSubjectTokens(L tok);
void learn(L material) {
for (Example e : material)
learn(e);
}
void learn(Example e) {}
}
Guesser > G1 {
IntRange getSubjectTokens(L tok) {
ret new IntRange(0, 1);
}
}
Guesser > G2 { // skips first words
new StringTree1 skipTree;
IntRange getSubjectTokens(L tok) {
int n = walkStringTreeToLeaf(skipTree, allToLower(tok));
if (n >= 0) ret new IntRange(n, n+1);
null;
}
void learn(Example e) {
if (e.start > 0)
addToStringTree(skipTree, allToLower(takeFirst(e.tok, e.start)));
}
}
Guesser > G3 {
new StringTree1 continuationTree;
IntRange getSubjectTokens(L tok) {
int n = walkStringTreeToLeaf(continuationTree, allToLower(tok));
if (n >= 0) ret new IntRange(0, n+1);
null;
}
void learn(Example e) {
L l = allToLower(subList(e.tok, e.start, e.end-1));
if (nempty(l))
addToStringTree(continuationTree, l);
}
}
Guesser > Chained {
new L l;
*() {}
*(Guesser... guessers) { addAll(l, guessers); }
IntRange getSubjectTokens(L tok) {
for (Guesser g : l) {
IntRange result = cast pcall(g, "getSubjectTokens", tok);
if (result != null) ret result;
}
null;
}
}
Guesser > GCheater {
new Map map;
IntRange getSubjectTokens(L tok) {
ret map.get(joinWithSpace(tok));
}
void learn(Example e) {
map.put(joinWithSpace(e.tok), intRange(e.start, e.end));
}
}
p {
loadConceptsFrom(#1008607);
L material = learningMaterial();
pnlStruct(material);
G1 g1;
G2 g2;
G3 g3;
Chained chained;
checkGuesser(material, g1 = new G1);
set printSuccesses;
checkGuesserAfterFullLearn(material, g2 = new G2);
checkGuesserAfterFullLearn(material, g3 = new G3);
checkGuesserAfterFullLearn(material, new GCheater);
checkGuesserAfterPartialLearn(material, new GCheater, 50);
checkGuesser(material, chained = new Chained(g1, g2, g3));
printStruct(g2);
printUnrolledStringTree(g2.skipTree);
print();
printUnrolledStringTree(g3.continuationTree);
//printStruct(bestLearner(material, allNew(G1, G2, G3, GCheater), 50, 3, false));
printStruct(bestLearner(material, listPlus(allNew(G1, G2, G3, GCheater), new Chained(new G2, new G1)), 50, 3, true));
}
sbool printDetails, printSuccesses;
static double checkGuesser(L testMaterial, Guesser g) {
print();
int score = 0, n = 0;
for (Example e : testMaterial) {
IntRange r = cast pcall(g, "getSubjectTokens", e.tok);
bool ok = eq(IntRange(e.start, e.end), r);
if (ok) ++score;
++n;
if (printDetails || ok && printSuccesses)
if (ok)
print("OK " + e);
else
print("FAIL " + (r == null ? "-" : joinWithSpaces(subList(e.tok, r.start, r.end))) + " for " + e);
}
printScore(shortClassName(g), score, n);
ret ratioToPercent(score, n);
}
static double checkGuesserAfterFullLearn(L testMaterial, Guesser g) {
g.learn(testMaterial);
ret checkGuesser(testMaterial, g);
}
static double checkGuesserAfterPartialLearn(L testMaterial, Guesser g, double percentToLearn) {
g.learn(getFirstPercent(testMaterial, percentToLearn));
ret checkGuesser(testMaterial, g);
}
static double checkGuesserAfterRandomizedPartialLearn(L testMaterial, Guesser g, double percentToLearn, bool hardMode) {
Pair> p = getRandomPercent2(testMaterial, percentToLearn);
g.learn(p.a);
ret checkGuesser(hardMode ? p.b : testMaterial, g);
}
// best learner with randomized x% training material
// returns guesser, percentage solved
// hardMode = only count scores on untrained examples
static Pair bestLearner(final L material, L guessers, final double percent, int repetitions, final bool hardMode) {
new Best best;
for (final Guesser g : guessers)
best.put(g, repeatAndAdd_double(repetitions, func {
checkGuesserAfterRandomizedPartialLearn(material, cloneObject(g), percent, hardMode)
})/repetitions);
ret best.pair();
}
static L learningMaterial() {
L out = new L;
for (Sentence s) {
if (s.action == null) continue;
IntRange r = ai_parseSubjectAction(s.action);
if (r != null) {
L tok = nlTok5(s.text);
r = charRangeToTokenRange(tok, r);
r = IntRange((r.start | 1)/2, r.end/2);
tok = codeTokens(tok);
out.add(Example(tok, r));
}
}
ret out;
}