package jcgp.backend.modules.problem; import java.io.File; import java.util.List; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import jcgp.backend.parsers.TestCaseParser; import jcgp.backend.resources.ModifiableResources; import jcgp.backend.resources.Resources; import jcgp.backend.resources.parameters.DoubleParameter; import jcgp.backend.resources.parameters.Parameter; /** * * This fitness function module implements a simple test case evaluator. * * A TestCase object is a * * * @author Eduardo Pedroni * */ public abstract class TestCaseProblem extends Problem { public static class TestCase { private T[] inputs; private T[] outputs; public TestCase(T[] inputs, T[] outputs) { this.inputs = inputs; this.outputs = outputs; } public T getInput(int index) { return inputs[index]; } public T getOutput(int index) { return outputs[index]; } public T[] getInputs() { return inputs; } public T[] getOutputs() { return outputs; } } protected ObservableList> testCases; protected DoubleParameter maxFitness; protected Resources resources; public TestCaseProblem(Resources resources) { super(); this.resources = resources; maxFitness = new DoubleParameter(0, "Max fitness", true, false) { @Override public void validate(Number newValue) { // blank } }; testCases = FXCollections.observableArrayList(); } @Override public Parameter[] getLocalParameters() { return new Parameter[]{maxFitness}; } protected double getMaxFitness() { int fitness = 0; for (TestCase tc : testCases) { fitness += tc.getOutputs().length; } return fitness; } public void setTestCases(List> testCases) { this.testCases.clear(); this.testCases.addAll(testCases); maxFitness.set(getMaxFitness()); } public ObservableList> getTestCases() { return testCases; } public abstract void addTestCase(String[] inputs, String[] outputs); protected final void addTestCase(TestCase testCase) { if (testCase.getInputs().length != resources.inputs()) { throw new IllegalArgumentException("Received test case with " + testCase.getInputs().length + " inputs but need exactly " + resources.inputs()); } else if (testCase.getOutputs().length != resources.outputs()) { throw new IllegalArgumentException("Received test case with " + testCase.getOutputs().length + " outputs but need exactly " + resources.outputs()); } else { this.testCases.add(testCase); maxFitness.set(getMaxFitness()); } } public int getInputCount() { return resources.inputs(); } public int getOutputCount() { return resources.outputs(); } public void clearTestCases() { testCases.clear(); } public void parseProblemData(File file, ModifiableResources resources) { TestCaseParser.parse(file, this, resources); } }