!7 concept Example { S input; S verb; transient S verb_guessed; } static F1 guesser; static JLabel lblStatus; p-subst { dbIndexing(Example, 'input); autoRestart(); for (S s : keys(gac36k())) uniq(Example, input := s); print("Making CRUD"); SimpleCRUD crud = simpleCRUD(Example); addToFrame(crud.panel, lblStatus = jlabel()); thread { guessLoop(); } } static SS examples() { ret mapFromKeyAndValueField([Example e : list(Example) | nempty(e.verb)], 'input, 'verb); } svoid guessLoop { repeat with sleep 5 { int changes = 0; new HashMap guessedMap; Window anim = miniLoadingAnim(); try { SS examples = examples(); int nTrain = l(examples)/2; SS trainExamples = keysToMap(examples, selectRandom_fast(keysList(examples))); guesser = cheatGuesser(trainExamples); for (Example e) { S s = unnullStr(pcallF(guesser, e.input)); changes += cset(e, verb_guessed := s); guessedMap.put(e.input, s); } if (changes > 0) change(); double score = scoreGuesserIC_1(mapGetter(guessedMap), examples); setText(lblStatus, n(examples, "example") + ", trained with " + l(trainExamples) + ", score: " + formatDouble(score*100, 1) + "%"); } finally { disposeWindow(anim); } } }