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