!7 concept Solver { S code, codeHints; long modified, testedWhen; double score, total; S errorCases; } abstract sclass DynSolvers extends DynCRUD { transient S examplesModuleID, inputFieldName, outputFieldName; *() { 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))); })); addButton(jPopDownButton_noText("Show Examples", rThread { dm_makeOrShowModule(examplesModuleID) })); } Scorer testSolver(Solver solver, Scorer scorer) enter { O /*F1*/ f = dm_codeWithHintsToFunctionOnString(solver.code, solver.codeHints); L examples = dm_importCrudModuleConceptsAsPairs(inputFieldName, outputFieldName, examplesModuleID); cset(solver, score := 0.0, testedWhen := now(), total := l(examples)); for (PairS e : examples) { S got = str(pcallF(f, e.a)); scorer.add(eqic(e.b, got), pair(e, got)); } cset(solver, score := scorer.score, errorCases := struct(scorer.errors)); ret scorer; } // API void addSolver(S code) { uniq_sync(Solver, +code); } }