list; *() {} *(L
*list) {}
*(P... a) { list = asList(a); }
void add(P p) { list.add(p); }
S read(S file, L tok) {
for (P p : list) {
S s = p.read(file, tok);
if (s != null) return s;
}
return null;
}
P derive() {
new Chain c;
for (P p : list)
c.add(p.derive());
return c;
}
}
static class Tuples extends P {
Map tok) {
if (!eq(file, this.file)) {
seen = 0;
this.file = file;
}
while (tok.size() > seen) {
++seen;
if (seen > n)
map.put(new ArrayList(tok.subList(seen-n-1, seen-1)), tok.get(seen-1));
}
if (tok.size() >= n)
return map.get(new ArrayList(tok.subList(tok.size()-n, tok.size())));
return null;
}
// slow...
P oldDerive() {
Tuples t = new Tuples(n);
t.map.putAll(map);
// t.seen == 0 which is ok
return t;
}
// fast!
P derive() {
Tuples t = new Tuples(n);
t.map = new DerivedHashMap history;
for (int i = allTokens ? 0 : 1; i < f.tok.size(); i += allTokens ? 1 : 2) {
S t = f.tok.get(i);
S x = p.read(f.name, history);
boolean correct = t.equals(x);
total += t.length();
if (correct) {
//predicted.add(i);
points += t.length();
}
history.add(t);
}
int percent = roundUpTo(10, (int) (ii*100L/files.size()));
if (percent > lastPercent) {
print("Learning " + percent + "% done.");
lastPercent = percent;
}
}
double score = points*100.0/total;
collector.add(p, score);
}
!include #1000989 // SnippetDB
static L> rows = db.rowsOrderedBy("sn_created");
for (int i = 0; i < Math.min(rows.size(), numSnippets); i++) {
new F f;
f.id = db.getField(rows.get(i), "sn_id");
f.name = db.getField(rows.get(i), "sn_title");
S text = db.getField(rows.get(i), "sn_text");
f.tok = internAll(javaTok(text));
files.add(f);
++i;
}
return files;
}
static class Collector {
P winner;
double bestScore = -1;
Set