!7 sclass Example { S sentence, converted; } concept Solver { S code, codeHints; long modified, testedWhen; double score, total; S errorCases; } module ConvertTo3rdPersonSolver > DynCRUD { *() { super(Solver); } start { crud.excludeFieldsFromEditing('testedWhen, 'score, 'total, 'errorCases); crud.multiLineFields = litset('code); crud.modifiedField = 'modified; } afterVisualize { addButton(tableDependentButton(table(), "Test Solver", rThread { testSolver(selected(), scorerWithErrors()) })); addButton(tableDependentButton(table(), "Show Errors", rThread { showText("Errors of solver " + selected().id, sfuLines(safeUnstructList(selected().errorCases))); })); } Scorer testSolver(Solver solver, Scorer scorer) enter { set codeWithHintsToFunctionOnString_verbose; F1 f = codeWithHintsToFunctionOnString(solver.code, solver.codeHints); L examples = dm_importCrudModuleConcepts(Example, "#1020639/ConvertTo3rdPersonExamples"); cset(solver, score := 0.0, testedWhen := now(), total := l(examples)); for (Example e : examples) { S got = pcallF(f, e.sentence); scorer.add(eqic(e.converted, got), pair(e, got)); } cset(solver, score := scorer.score, errorCases := struct(scorer.errors)); ret scorer; } // API void addSolver(S code) { uniq_sync(Solver, +code); } }