package jcgp.backend.modules.problem; import java.io.File; import java.util.List; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import jcgp.backend.parser.TestCaseParser; import jcgp.backend.resources.Resources; import jcgp.backend.resources.parameters.IntegerParameter; 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 IntegerParameter maxFitness; protected Resources resources; protected TestCaseParser parser; public TestCaseProblem(Resources resources) { super(); this.resources = resources; maxFitness = new IntegerParameter(0, "Max fitness", true, false) { @Override public void validate(Number newValue) { // blank } }; testCases = FXCollections.observableArrayList(); parser = new TestCaseParser(this); } public TestCaseProblem(Resources resources, File testCase) { super(); this.resources = resources; maxFitness = new IntegerParameter(0, "Max fitness", true, false) { @Override public void validate(Number newValue) { // blank } }; testCases = FXCollections.observableArrayList(); parser = new TestCaseParser(this); parser.parse(testCase); } @Override public Parameter[] getLocalParameters() { return new Parameter[]{maxFitness}; } protected int 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); public 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 void removeTestCase(TestCase testCase) { testCases.remove(testCase); maxFitness.set(getMaxFitness()); } public int getInputCount() { return resources.inputs(); } public int getOutputCount() { return resources.outputs(); } public void parse(File file) { parser.parse(file); } public void clearTestCases() { testCases.clear(); } public abstract String getFileExtension(); }