From 75cd94d94577e6da240623ff9a2365dfe7976fc9 Mon Sep 17 00:00:00 2001 From: Lennart Eichhorn <lennart@madmanfred.com> Date: Sat, 30 May 2020 16:25:07 +0200 Subject: [PATCH] Changed Config to load directories and a jobname, instead of filenames. Closes #3 --- src/main/java/MainClasses/Config.java | 41 +++++++++++++------ .../java/MainClasses/GeneticAlgorithm.java | 27 ++++++------ src/main/java/MainClasses/Main.java | 3 +- .../Visualizers/PrintFoldingToConsole.java | 4 +- .../Visualizers/PrintFoldingToFile.java | 11 +++-- src/main/resources/genetic.properties | 14 ++++--- 6 files changed, 59 insertions(+), 41 deletions(-) diff --git a/src/main/java/MainClasses/Config.java b/src/main/java/MainClasses/Config.java index 44c5523..7cbaee3 100644 --- a/src/main/java/MainClasses/Config.java +++ b/src/main/java/MainClasses/Config.java @@ -9,6 +9,8 @@ import java.awt.*; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Properties; public class Config { @@ -19,7 +21,6 @@ public class Config { private String encodingVariant; private int seed; - private int populationSize; private int totalGenerations; private InitializationMethods initializationMethod; @@ -37,10 +38,12 @@ public class Config { private double crossoverMinimalChance; // -> 0.01% is not worth mutating for private double crossoverMultiplier; - private String logfile; + //TODO Create directories if they do not exist private VisualizerMethods[] visualizers; - private String imageSequencePath; - private String videoPathAndFile; + private String jobName; + private String imageSequenceDirectory; + private String videoDirectory; + private String logfileDirectory; private int imageFps; private int imagesToFpsIncrease; private int imageFpsMax; @@ -147,7 +150,15 @@ public class Config { crossoverMultiplier = Double.parseDouble(this.properties.getProperty("crossoverMultiplier")); // Output settings - logfile = this.properties.getProperty("logfilePath"); + if(properties.containsKey("jobName")){ + jobName = this.properties.getProperty("jobName"); + }else{ + SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyyHHmmss"); + Date date = new Date(); + jobName = formatter.format(date); + } + + logfileDirectory = this.properties.getProperty("logfileDirectory"); String[] visualizersToUse = this.properties.getProperty("visualizerType").split(","); visualizers = new VisualizerMethods[visualizersToUse.length]; @@ -165,8 +176,8 @@ public class Config { } } - imageSequencePath = this.properties.getProperty("imageSequencePath"); - videoPathAndFile = this.properties.getProperty("videoPathAndFile"); + imageSequenceDirectory = this.properties.getProperty("imageSequenceDirectory"); + videoDirectory = this.properties.getProperty("videoDirectory"); imageFps = Integer.parseInt(this.properties.getProperty("imgFps")); imagesToFpsIncrease = Integer.parseInt(this.properties.getProperty("imagesToFpsIncrease")); imageFpsMax = Integer.parseInt(this.properties.getProperty("imgFpsMax")); @@ -245,20 +256,24 @@ public class Config { return crossoverMultiplier; } - public String getLogfile() { - return logfile; + public String getJobName() { + return jobName; + } + + public String getLogfileDirectory() { + return logfileDirectory; } public VisualizerMethods[] getVisualizers() { return visualizers; } - public String getImageSequencePath() { - return imageSequencePath; + public String getImageSequenceDirectory() { + return imageSequenceDirectory; } - public String getVideoPathAndFile() { - return videoPathAndFile; + public String getVideoDirectory() { + return videoDirectory; } public int getImageFps() { diff --git a/src/main/java/MainClasses/GeneticAlgorithm.java b/src/main/java/MainClasses/GeneticAlgorithm.java index 73725f0..543f2a9 100644 --- a/src/main/java/MainClasses/GeneticAlgorithm.java +++ b/src/main/java/MainClasses/GeneticAlgorithm.java @@ -11,15 +11,13 @@ import Mutators.SinglePoint; import Selectors.FitnessProportional; import Selectors.OnlyBest; import Selectors.Tournament; -import Visualization.Visualizers.VisualizerNESWtoConsole; -import Visualization.Visualizers.VisualizerNESWtoFile; +import Visualization.Visualizers.PrintFoldingToConsole; +import Visualization.Visualizers.PrintFoldingToFile; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; -import java.text.SimpleDateFormat; -import java.util.Date; import java.util.Random; public class GeneticAlgorithm { @@ -42,8 +40,6 @@ public class GeneticAlgorithm { Evaluator evaluator; Visualizer[] visualizers; - String jobName; - // Initialize with protein public GeneticAlgorithm (int[] protein, Config config) { this.isHydrophobic = protein; @@ -57,10 +53,6 @@ public class GeneticAlgorithm { this.fitness = new double[config.getPopulationSize()]; this.overallBestFitness = 0; - //TODO Maybe specify jobName in config - SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyyHHmmss"); - Date date = new Date(); - jobName = formatter.format(date); } private void initializeSettings() { @@ -83,10 +75,10 @@ public class GeneticAlgorithm { int j = 0; for (VisualizerMethods vm : config.getVisualizers()) { if (vm.equals(VisualizerMethods.Console)) { - this.visualizers[j] = new VisualizerNESWtoConsole(isHydrophobic, config); + this.visualizers[j] = new PrintFoldingToConsole(isHydrophobic, config); j++; } else if (vm.equals(VisualizerMethods.Image)) { - this.visualizers[j] = new VisualizerNESWtoFile(isHydrophobic, config); + this.visualizers[j] = new PrintFoldingToFile(isHydrophobic, config); j++; } } @@ -129,7 +121,10 @@ public class GeneticAlgorithm { private void clearLog() { String content = "Generation\tAverage Fitness\tBest Fitness\tOverall Best Fitness\tBonds\tOverlaps\n"; try { - Files.write(Paths.get(config.getLogfile()), content.getBytes()); + //TODO This does not belong here + Files.createDirectories(Paths.get(config.getLogfileDirectory())); + String logfilePath = config.getLogfileDirectory() + "/" + config.getJobName() + ".txt"; + Files.write(Paths.get(logfilePath), content.getBytes()); } catch (IOException e) { e.printStackTrace(); @@ -168,7 +163,8 @@ public class GeneticAlgorithm { } for (Visualizer v : this.visualizers) { - v.setFilename(String.format("%s_gen_%d.png", jobName, gen)); + String imagePath = config.getImageSequenceDirectory() + "/" + config.getJobName() + "_" + gen + ".png"; + v.setFilename(imagePath); //TODO Print real bond and overlap amount v.drawProtein(this.population[bestIndex].getVertices(), bestFitness, -1, -1, gen); } @@ -191,7 +187,8 @@ public class GeneticAlgorithm { -1); try { - Files.write(Paths.get(config.getLogfile()), log.getBytes(), StandardOpenOption.APPEND); + String logfilePath = config.getLogfileDirectory() + "/" + config.getJobName() + ".txt"; + Files.write(Paths.get(logfilePath), log.getBytes(), StandardOpenOption.APPEND); } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/MainClasses/Main.java b/src/main/java/MainClasses/Main.java index 072c9d9..e9f8f7e 100644 --- a/src/main/java/MainClasses/Main.java +++ b/src/main/java/MainClasses/Main.java @@ -20,7 +20,8 @@ public class Main { boolean imagesRefreshed = Arrays.asList(config.getVisualizers()).contains(VisualizerMethods.Image); boolean videoEnabled = Arrays.asList(config.getVisualizers()).contains(VisualizerMethods.Video); if (imagesRefreshed && videoEnabled){ - VideoCreator.createVideo(config.getImageSequencePath(), config.getVideoPathAndFile(), + String videoPath = config.getVideoDirectory() + "/" + config.getJobName() + ".mp4"; + VideoCreator.createVideo(config.getImageSequenceDirectory(), videoPath, config.getImageFps(), config.getImagesToFpsIncrease(), config.getImageFpsMax(), ga.getMaxH(), ga.getMaxW(), config.isZoom()); } diff --git a/src/main/java/Visualization/Visualizers/PrintFoldingToConsole.java b/src/main/java/Visualization/Visualizers/PrintFoldingToConsole.java index b897275..3a9b4da 100644 --- a/src/main/java/Visualization/Visualizers/PrintFoldingToConsole.java +++ b/src/main/java/Visualization/Visualizers/PrintFoldingToConsole.java @@ -13,14 +13,14 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; -public class VisualizerNESWtoConsole implements Visualizer { +public class PrintFoldingToConsole implements Visualizer { int maxHeight; int maxWidth; final int[] isHydrophobic; Config config; - public VisualizerNESWtoConsole(int[] isHydrophobic, Config config) { + public PrintFoldingToConsole(int[] isHydrophobic, Config config) { this.maxHeight = 0; this.maxWidth = 0; this.isHydrophobic = isHydrophobic; diff --git a/src/main/java/Visualization/Visualizers/PrintFoldingToFile.java b/src/main/java/Visualization/Visualizers/PrintFoldingToFile.java index ed0b7f7..787339b 100644 --- a/src/main/java/Visualization/Visualizers/PrintFoldingToFile.java +++ b/src/main/java/Visualization/Visualizers/PrintFoldingToFile.java @@ -13,7 +13,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; -public class VisualizerNESWtoFile implements Visualizer { +public class PrintFoldingToFile implements Visualizer { String folder; String filename; @@ -28,8 +28,10 @@ public class VisualizerNESWtoFile implements Visualizer { final int[] isHydrophobic; Config config; - public VisualizerNESWtoFile(int[] isHydrophobic, Config config) { - this.folder = config.getImageSequencePath(); + public PrintFoldingToFile(int[] isHydrophobic, Config config) { + //TODO This is not really needed + //this.folder = config.getImageSequenceDirectory(); + this.folder = ""; this.filename = "image.png"; // Default this.maxHeight = 0; @@ -140,7 +142,8 @@ public class VisualizerNESWtoFile implements Visualizer { if (!new File(folder).exists()) new File(folder).mkdirs(); try { - ImageIO.write(image, "png", new File(folder + File.separator + filename)); + //ImageIO.write(image, "png", new File(folder + File.separator + filename)); + ImageIO.write(image, "png", new File(filename)); } catch (IOException e) { e.printStackTrace(); System.exit(0); diff --git a/src/main/resources/genetic.properties b/src/main/resources/genetic.properties index 8bd44f3..9044afa 100644 --- a/src/main/resources/genetic.properties +++ b/src/main/resources/genetic.properties @@ -42,14 +42,16 @@ ### Output settings - # Path and filename for the log file, always active - logfilePath = log.txt # Type(s) of visualization to enable, separated with comma [console / image / video] visualizerType = image,video - # Path for the image sequence - imageSequencePath = ./visualization/series - # Path and filename for the resulting video file - videoPathAndFile = ./visualization/video.mp4 + # Name of the job, filenames will be based on this name. If left empty a timestamp is used + jobName = example1 + # Directory for the image sequence + imageSequenceDirectory = visualization/series + # Directory for the resulting video file + videoDirectory = visualization + # Directory for the log file, always active + logfileDirectory = log # Frames per second in the beginning of the video imgFps = 10 # Number of images until fps increases by one -- GitLab