diff options
Diffstat (limited to 'src/jcgp/backend/parser')
-rw-r--r-- | src/jcgp/backend/parser/ChromosomeParser.java | 177 | ||||
-rw-r--r-- | src/jcgp/backend/parser/FunctionParser.java | 51 | ||||
-rw-r--r-- | src/jcgp/backend/parser/ParameterParser.java | 77 | ||||
-rw-r--r-- | src/jcgp/backend/parser/TestCaseParser.java | 90 |
4 files changed, 0 insertions, 395 deletions
diff --git a/src/jcgp/backend/parser/ChromosomeParser.java b/src/jcgp/backend/parser/ChromosomeParser.java deleted file mode 100644 index fd03b7d..0000000 --- a/src/jcgp/backend/parser/ChromosomeParser.java +++ /dev/null @@ -1,177 +0,0 @@ -package jcgp.backend.parser; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.PrintWriter; -import java.util.Scanner; - -import jcgp.backend.population.Chromosome; -import jcgp.backend.population.Connection; -import jcgp.backend.population.Input; -import jcgp.backend.population.Node; -import jcgp.backend.resources.Resources; - -/** - * This class includes a method for parsing .chr files and another - * for writing .chr files from given chromosomes. - * - * @author Eduardo Pedroni - * - */ -public abstract class ChromosomeParser { - - /** - * Use this method to parse .chr files into a given chromosome. - * <br><br> - * This is not fully defensive as it doesn't check for number of inputs, - * doesn't compare rows and columns individually and doesn't account for levels back. It - * is not viable to implement these defensive measures with the chromosome format used - * by CGP. - * - * @param file the .chr file to parse from - * @param chromosome the chromosome to configure - * @param resources the experiment resources - */ - public static void parse(File file, Chromosome chromosome, Resources resources) { - /* - * Count the nodes to make sure the size of the .chr file matches the experiment parameters. - * - * We do this by using the scanner to get the node and output portions of the file as they - * are separated by 3 tab characters. Every number is replaced by a single known character, - * and the length of the string with the new characters is compared with that of a string - * where the new known character has been removed, yielding the total number of values. - * - */ - FileReader fr; - try { - fr = new FileReader(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return; - } - Scanner in = new Scanner(fr); - in.useDelimiter("\\t\\t\\t"); - String geneString = in.next().replaceAll("[0-9]+", "g"); - String outString = in.next().replaceAll("[0-9]+", "o"); - int geneCount = geneString.length() - geneString.replace("g", "").length(); - int outCount = outString.length() - outString.replace("o", "").length(); - in.close(); - - - // if the acquired values match the current parameters, apply them to the chromosome - if ((geneCount == resources.nodes() * (resources.arity() + 1)) - && outCount == resources.outputs()) { - // prepare a new scanner - try { - fr = new FileReader(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return; - } - in = new Scanner(fr); - - int gene; - Connection newConnection; - Node changingNode; - // for all nodes, columns first - for (int c = 0; c < resources.columns(); c++) { - for (int r = 0; r < resources.rows(); r++) { - // store the changing node - changingNode = chromosome.getNode(r, c); - - // for every connection - for (int i = 0; i < resources.arity(); i++) { - // get connection number from the .chr file - gene = in.nextInt(); - System.out.println("r: " + r + " c: " + c + " i: " + i + " gene: " + gene); - if (gene < resources.inputs()) { - // connection was an input - newConnection = chromosome.getInput(gene); - } else { - // connection was another node, calculate which from its number - newConnection = chromosome.getNode((gene - resources.inputs()) % resources.rows(), - (gene - resources.inputs()) / resources.rows()); - } - changingNode.setConnection(i, newConnection); - } - - // set the function, straight indexing should work - this is not entirely - // safe, but it is not viable to check for functionset compatibility - changingNode.setFunction(resources.getFunction(in.nextInt())); - } - } - - // outputs - for (int o = 0; o < resources.outputs(); o ++) { - gene = in.nextInt(); - if (gene < resources.inputs()) { - // connection was an input - newConnection = chromosome.getInput(gene); - } else { - // connection was another node, calculate which from its number - newConnection = chromosome.getNode((gene - resources.inputs()) % resources.rows(), - (gene - resources.inputs()) / resources.rows()); - } - chromosome.getOutput(o).setConnection(0, newConnection); - } - in.close(); - } else { - throw new IllegalArgumentException("The topology of the chromosome in " + file.getName() + " does not match that of the experiment."); - } - } - - /** - * Writes a chromosome into the specified .chr file. - * - * - * @param file the file to write to - * @param chromosome the chromosome to save - */ - public static void save(File file, Chromosome chromosome, Resources resources) { - PrintWriter writer; - try { - writer = new PrintWriter(file); - } catch (FileNotFoundException e) { - // something bad happened - return; - } - - // for all nodes, columns first - for (int c = 0; c < resources.columns(); c++) { - for (int r = 0; r < resources.rows(); r++) { - for (int i = 0; i < resources.arity(); i++) { - // print the connections, separated by spaces - Connection conn = chromosome.getNode(r, c).getConnection(i); - if (conn instanceof Input) { - writer.print(" " + ((Input) conn).getIndex()); - } else if (conn instanceof Node) { - writer.print(" " + (((((Node) conn).getColumn() + 1) * resources.inputs()) + ((Node) conn).getRow())); - } else { - throw new ClassCastException("Could not handle " + conn.getClass() + " as a subclass of Connection"); - } - } - // print the function numbers - writer.print(" " + resources.getFunctionIndex(chromosome.getNode(r, c).getFunction())); - // node is done, print tab - writer.print("\t"); - } - } - // nodes are done, print two tabs to separate from output - writer.print("\t\t"); - for (int o = 0; o < resources.outputs(); o ++) { - Connection source = chromosome.getOutput(o).getSource(); - if (source instanceof Input) { - writer.print(" " + ((Input) source).getIndex()); - } else if (source instanceof Node) { - writer.print(" " + (((((Node) source).getColumn() + 1) * resources.inputs()) + ((Node) source).getRow())); - } else { - throw new ClassCastException("Could not handle " + source.getClass() + " as a subclass of Connection"); - } - } - - writer.close(); - System.out.println("writer is closed"); - } - -} diff --git a/src/jcgp/backend/parser/FunctionParser.java b/src/jcgp/backend/parser/FunctionParser.java deleted file mode 100644 index ab94899..0000000 --- a/src/jcgp/backend/parser/FunctionParser.java +++ /dev/null @@ -1,51 +0,0 @@ -package jcgp.backend.parser; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.util.Scanner; - -import jcgp.backend.function.FunctionSet; -import jcgp.backend.modules.problem.Problem; - -public class FunctionParser { - -private FunctionSet functionSet; - - private FunctionParser(Problem problem) { - this.functionSet = problem.getFunctionSet(); - } - - public static void parseFunctions(File file, Problem problem) { - FunctionParser pp = new FunctionParser(problem); - - FileReader fr; - try { - fr = new FileReader(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return; - } - - Scanner in = new Scanner(fr); - - while (in.hasNextLine()) { - String line = in.nextLine(); - if (line.substring(line.length() - 1).matches("[0-9]")) { - pp.parseAndSet(line.split("[^0-9]+")); - } - } - - in.close(); - } - - private void parseAndSet(String[] splitString) { - int functionIndex = Integer.parseInt(splitString[splitString.length - 1]); - if (Integer.parseInt(splitString[0]) != 0) { - functionSet.enableFunction(functionIndex); - } else { - functionSet.disableFunction(functionIndex); - } - - } -} diff --git a/src/jcgp/backend/parser/ParameterParser.java b/src/jcgp/backend/parser/ParameterParser.java deleted file mode 100644 index f96ebf9..0000000 --- a/src/jcgp/backend/parser/ParameterParser.java +++ /dev/null @@ -1,77 +0,0 @@ -package jcgp.backend.parser; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.util.Scanner; - -import jcgp.backend.resources.ModifiableResources; - -public class ParameterParser { - - private ModifiableResources resources; - - private ParameterParser(ModifiableResources resources) { - this.resources = resources; - } - - public static void parseParameters(File file, ModifiableResources resources) { - ParameterParser pp = new ParameterParser(resources); - - FileReader fr; - try { - fr = new FileReader(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return; - } - - Scanner in = new Scanner(fr); - - while (in.hasNextLine()) { - pp.parseAndSet(in.nextLine().split("( |\t)+")); - } - - in.close(); - } - - private void parseAndSet(String[] splitString) { - switch (splitString[1]) { - - case "population_size": - resources.setPopulationSize(Integer.parseInt(splitString[0])); - break; - - case "num_generations": - resources.setGenerations(Integer.parseInt(splitString[0])); - break; - - case "num_runs_total": - resources.setRuns(Integer.parseInt(splitString[0])); - break; - - case "num_rows": - resources.setRows(Integer.parseInt(splitString[0])); - break; - - case "num_cols": - resources.setColumns(Integer.parseInt(splitString[0])); - break; - - case "levels_back": - resources.setLevelsBack(Integer.parseInt(splitString[0])); - break; - - case "report_interval": - resources.setReportInterval(Integer.parseInt(splitString[0])); - break; - - case "global_seed": - resources.setSeed(Integer.parseInt(splitString[0])); - break; - - default: - break; - } - } -} diff --git a/src/jcgp/backend/parser/TestCaseParser.java b/src/jcgp/backend/parser/TestCaseParser.java deleted file mode 100644 index d47d663..0000000 --- a/src/jcgp/backend/parser/TestCaseParser.java +++ /dev/null @@ -1,90 +0,0 @@ -package jcgp.backend.parser; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.util.Scanner; - -import jcgp.backend.modules.problem.TestCaseProblem; -import jcgp.backend.resources.ModifiableResources; - -public class TestCaseParser { - - private TestCaseProblem<?> problem; - - public TestCaseParser(TestCaseProblem<?> problem) { - this.problem = problem; - } - - public void parse(File file) { - FileReader fr; - try { - fr = new FileReader(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return; - } - - Scanner in = new Scanner(fr); - boolean readingTestCases = false; - int inputs = 0, outputs = 0; - - problem.clearTestCases(); - - while (in.hasNextLine()) { - String nextLine = in.nextLine(); - - if (nextLine.startsWith(".i")) { - String[] split = nextLine.split(" +"); - inputs = Integer.parseInt(split[1]); - } else if (nextLine.startsWith(".o")) { - String[] split = nextLine.split(" +"); - outputs = Integer.parseInt(split[1]); - } else if (nextLine.startsWith(".p") || nextLine.startsWith(".t")) { - readingTestCases = true; - } else if (nextLine.startsWith(".e")) { - readingTestCases = false; - // set test cases? not safe probably - } else if (readingTestCases) { - String[] split = nextLine.split("( |\t)+"); - String[] inputCases = new String[inputs]; - String[] outputCases = new String[outputs]; - for (int i = 0; i < inputs; i++) { - inputCases[i] = split[i]; - } - for (int o = 0; o < outputs; o++) { - outputCases[o] = split[o + inputs]; - } - - problem.addTestCase(inputCases, outputCases); - } - } - - in.close(); - } - - public static void parseParameters(File file, ModifiableResources resources) { - - FileReader fr; - try { - fr = new FileReader(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return; - } - - Scanner in = new Scanner(fr); - - while (in.hasNextLine()) { - String nextLine = in.nextLine(); - if (nextLine.startsWith(".i")) { - String[] split = nextLine.split(" +"); - resources.setInputs(Integer.parseInt(split[1])); - } else if (nextLine.startsWith(".o")) { - String[] split = nextLine.split(" +"); - resources.setOutputs(Integer.parseInt(split[1])); - } - } - in.close(); - } -} |