From 3c59a3eeba4e5db4835bacc4d000e26ade128ebf Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Tue, 17 Jul 2018 15:08:46 +0200
Subject: [PATCH] some fixes. test 5 still fails.

---
 .../jastadd/solvers/genetic/Checking.jrag     | 10 ++--
 .../mquat/solving/genetic/GeneticSolver.java  | 60 ++++++++++++++++++-
 .../solving/genetic/opt4j/Opt4jEvaluator.java |  4 +-
 .../solving/genetic/opt4j/Opt4jModule.java    | 48 ---------------
 ...nTest.java => GeneticHandwrittenTest.java} |  2 +-
 ...SolverTest.java => GeneticSolverTest.java} |  6 +-
 .../mquat/solving/HandwrittenTestSuite.java   |  2 +
 7 files changed, 70 insertions(+), 62 deletions(-)
 rename jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/{SimpleHandwrittenTest.java => GeneticHandwrittenTest.java} (74%)
 rename jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/{SimpleSolverTest.java => GeneticSolverTest.java} (89%)

diff --git a/jastadd-mquat-base/src/main/jastadd/solvers/genetic/Checking.jrag b/jastadd-mquat-base/src/main/jastadd/solvers/genetic/Checking.jrag
index 8ab4e34..fcc46c7 100644
--- a/jastadd-mquat-base/src/main/jastadd/solvers/genetic/Checking.jrag
+++ b/jastadd-mquat-base/src/main/jastadd/solvers/genetic/Checking.jrag
@@ -2,7 +2,7 @@ aspect Checking {
 
   syn int Solution.evaluateValidity() {
 
-    int faults = evaluateSoftwareCompletenessa();
+    int faults = evaluateSoftwareCompleteness();
 
     Set<Request> requestSet = new HashSet<>();
     Set<Resource> resourceSet = new HashSet<>();
@@ -54,7 +54,7 @@ aspect Checking {
 
   syn int Solution.evaluateSoftwareValidity() {
 
-    int faults = evaluateSoftwareCompletenessa();
+    int faults = evaluateSoftwareCompleteness();
 
     // check assignments
     Iterator<Assignment> assignmentIterator = this.assignmentIterator();
@@ -92,7 +92,7 @@ aspect Checking {
     return faults;
   }
 
-  syn int Solution.evaluateSoftwareCompletenessa() {
+  syn int Solution.evaluateSoftwareCompleteness() {
 
     int faults = 0;
 
@@ -102,7 +102,7 @@ aspect Checking {
     }
 
     for (Assignment assignment : getAssignmentList()) {
-      faults += assignment.evaluateSoftwareCompletenessa();
+      faults += assignment.evaluateSoftwareCompleteness();
       targets.remove(assignment.getImplementation().containingComponent());
     }
 
@@ -113,7 +113,7 @@ aspect Checking {
     return faults + targets.size();
   }
 
-  syn int Assignment.evaluateSoftwareCompletenessa() {
+  syn int Assignment.evaluateSoftwareCompleteness() {
     int faults = 0;
 
     if (getRequest() == null) {
diff --git a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticSolver.java b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticSolver.java
index bb07c44..b89bb49 100644
--- a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticSolver.java
+++ b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/GeneticSolver.java
@@ -1,13 +1,23 @@
 package de.tudresden.inf.st.mquat.solving.genetic;
 
+import de.tudresden.inf.st.mquat.generator.ScenarioDescription;
 import de.tudresden.inf.st.mquat.jastadd.model.Root;
 import de.tudresden.inf.st.mquat.jastadd.model.Solution;
 import de.tudresden.inf.st.mquat.solving.BenchmarkableSolver;
 import de.tudresden.inf.st.mquat.solving.Solver;
 import de.tudresden.inf.st.mquat.solving.SolvingException;
+import de.tudresden.inf.st.mquat.solving.genetic.opt4j.Opt4jModule;
+import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.copy.TreeCopyOperatorModule;
+import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.crossover.TreeCrossoverOperatorModule;
+import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.mutate.TreeMutateOperatorModule;
 import de.tudresden.inf.st.mquat.utils.StopWatch;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.opt4j.core.Individual;
+import org.opt4j.core.optimizer.Archive;
+import org.opt4j.core.start.Opt4JTask;
+import org.opt4j.optimizers.ea.EvolutionaryAlgorithmModule;
+import org.opt4j.viewer.ViewerModule;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -39,14 +49,58 @@ public class GeneticSolver implements BenchmarkableSolver {
   @Override
   public Solution solve(Root model) throws SolvingException {
     reset();
+
+    stopWatch = StopWatch.start();
+
+    List<Solution> solutions = new ArrayList<>();
+
     if (model.getNumRequest() == 0) {
       return Solution.emptySolutionOf(model);
     }
-    stopWatch = StopWatch.start();
 
-    List<Solution> solutions = new ArrayList<>();
 
-    // do some solvin'
+    Opt4jModule.setModel(model);
+
+    EvolutionaryAlgorithmModule ea = new EvolutionaryAlgorithmModule();
+    ea.setGenerations(1000);
+
+    // set population size
+    ea.setAlpha(50);
+
+    Opt4jModule testModule = new Opt4jModule();
+
+    TreeCrossoverOperatorModule crossover = new TreeCrossoverOperatorModule();
+    TreeMutateOperatorModule mutate = new TreeMutateOperatorModule();
+    TreeCopyOperatorModule copy = new TreeCopyOperatorModule();
+
+    ViewerModule viewer = new ViewerModule();
+    viewer.setCloseOnStop(false);
+
+    Opt4JTask task = new Opt4JTask(false);
+    task.init(ea, testModule, crossover, mutate, copy);
+//    task.init(ea, testModule, viewer, crossover, mutate, copy);
+    try {
+      task.execute();
+      Archive archive = task.getInstance(Archive.class);
+      for (Individual individual : archive) {
+        // obtain the phenotype and objective, etc. of each individual
+        Solution solution = (Solution) individual.getPhenotype();
+        if (solution.isValid()) {
+          if (solutions.isEmpty() || solution.computeObjective() < solutions.get(solutions.size() - 1).computeObjective()) {
+            Solution clone = solution.deepCopy();
+            solutions.add(clone);
+            logger.info("found a better solution with an objective of {}.", solution.computeObjective());
+          }
+        } else {
+          logger.warn("Found an invalid solution with " + solution.evaluateValidity() + " errors.");
+        }
+
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    } finally {
+      task.close();
+    }
 
     if (solutions.size() > 0) {
       lastSolution = solutions.get(solutions.size() - 1);
diff --git a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jEvaluator.java b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jEvaluator.java
index 26bfffd..d4612e7 100644
--- a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jEvaluator.java
+++ b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jEvaluator.java
@@ -12,7 +12,7 @@ public class Opt4jEvaluator implements Evaluator<Solution> {
     Objectives objectives = new Objectives();
     objectives.add("Validity Errors", Sign.MIN, phenotype.evaluateValidity() * 1000);
     objectives.add("Software Validity Errors", Sign.MIN, phenotype.evaluateSoftwareValidity() * 1000);
-    objectives.add("Structural Errors", Sign.MIN, phenotype.evaluateSoftwareCompletenessa() * 1000);
+    objectives.add("Structural Errors", Sign.MIN, phenotype.evaluateSoftwareCompleteness() * 1000);
 
     double objective = phenotype.computeObjective();
 
@@ -22,7 +22,7 @@ public class Opt4jEvaluator implements Evaluator<Solution> {
     if (phenotype.evaluateSoftwareValidity() != 0) {
       objective *= 10;
     }
-    if (phenotype.evaluateSoftwareCompletenessa() != 0) {
+    if (phenotype.evaluateSoftwareCompleteness() != 0) {
       objective *= 10;
     }
 
diff --git a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jModule.java b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jModule.java
index 86f1ebc..5fff25a 100644
--- a/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jModule.java
+++ b/jastadd-mquat-solver-genetic/src/main/java/de/tudresden/inf/st/mquat/solving/genetic/opt4j/Opt4jModule.java
@@ -1,16 +1,7 @@
 package de.tudresden.inf.st.mquat.solving.genetic.opt4j;
 
-import de.tudresden.inf.st.mquat.generator.ScenarioDescription;
 import de.tudresden.inf.st.mquat.jastadd.model.Root;
-import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.copy.TreeCopyOperatorModule;
-import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.crossover.TreeCrossoverOperatorModule;
-import de.tudresden.inf.st.mquat.solving.genetic.opt4j.custom.operator.mutate.TreeMutateOperatorModule;
-import org.opt4j.core.Individual;
-import org.opt4j.core.optimizer.Archive;
 import org.opt4j.core.problem.ProblemModule;
-import org.opt4j.core.start.Opt4JTask;
-import org.opt4j.optimizers.ea.EvolutionaryAlgorithmModule;
-import org.opt4j.viewer.ViewerModule;
 
 public class Opt4jModule extends ProblemModule {
 
@@ -24,45 +15,6 @@ public class Opt4jModule extends ProblemModule {
     Opt4jModule.model = model;
   }
 
-  public static void main(String[] args) {
-
-    final ScenarioDescription SCENARIO_DESCRIPTION = new ScenarioDescription(1, 2, 0, 0, 0, 2, 3, 1.5, 1, 1, 0);
-    de.tudresden.inf.st.mquat.generator.ScenarioGenerator sc = new de.tudresden.inf.st.mquat.generator.ScenarioGenerator(
-        SCENARIO_DESCRIPTION);
-
-    Opt4jModule.setModel(sc.generate());
-
-    EvolutionaryAlgorithmModule ea = new EvolutionaryAlgorithmModule();
-    ea.setGenerations(100000);
-
-    // set population size
-    ea.setAlpha(100);
-
-    Opt4jModule testModule = new Opt4jModule();
-
-    TreeCrossoverOperatorModule crossover = new TreeCrossoverOperatorModule();
-    TreeMutateOperatorModule mutate = new TreeMutateOperatorModule();
-    TreeCopyOperatorModule copy = new TreeCopyOperatorModule();
-
-    // testModule.setFunction(JohannesModule.Function.dtlz);
-    ViewerModule viewer = new ViewerModule();
-    viewer.isCloseOnStop();
-
-    Opt4JTask task = new Opt4JTask(false);
-    task.init(ea, testModule, viewer, crossover, mutate, copy);
-    try {
-      task.execute();
-      Archive archive = task.getInstance(Archive.class);
-      for (Individual individual : archive) {
-        // obtain the phenotype and objective, etc. of each individual
-      }
-    } catch (Exception e) {
-      e.printStackTrace();
-    } finally {
-      task.close();
-    }
-  }
-
   @Override
   protected void configure() {
     bindProblem(Opt4jCreator.class, Opt4jDecoder.class, Opt4jEvaluator.class);
diff --git a/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleHandwrittenTest.java b/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticHandwrittenTest.java
similarity index 74%
rename from jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleHandwrittenTest.java
rename to jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticHandwrittenTest.java
index 380e0ad..22271ab 100644
--- a/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleHandwrittenTest.java
+++ b/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticHandwrittenTest.java
@@ -2,7 +2,7 @@ package de.tudresden.inf.st.mquat.solving;
 
 import de.tudresden.inf.st.mquat.solving.genetic.GeneticSolver;
 
-public class SimpleHandwrittenTest extends HandwrittenTestSuite {
+public class GeneticHandwrittenTest extends HandwrittenTestSuite {
 
   @Override
   protected Solver getSolver() {
diff --git a/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleSolverTest.java b/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticSolverTest.java
similarity index 89%
rename from jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleSolverTest.java
rename to jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticSolverTest.java
index 1af1407..9cc7a26 100644
--- a/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/SimpleSolverTest.java
+++ b/jastadd-mquat-solver-genetic/src/test/java/de/tudresden/inf/st/mquat/solving/GeneticSolverTest.java
@@ -11,20 +11,20 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-public class SimpleSolverTest {
+public class GeneticSolverTest {
 
   private static Logger logger;
 
   @BeforeClass
   public static void initLogger() {
-    logger = LogManager.getLogger(SimpleSolverTest.class);
+    logger = LogManager.getLogger(GeneticSolverTest.class);
   }
 
   /**
    * tests the genetic solver with one very genetic use case
    */
   @Test
-  public void testSimpleSolver() throws SolvingException {
+  public void testGeneticSolver() throws SolvingException {
     int tlc = 1;
     int iac = 2;
     int isd = 0;
diff --git a/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/HandwrittenTestSuite.java b/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/HandwrittenTestSuite.java
index dbae9d3..7307227 100644
--- a/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/HandwrittenTestSuite.java
+++ b/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/HandwrittenTestSuite.java
@@ -14,6 +14,7 @@ import java.util.Iterator;
 
 import static org.hamcrest.core.IsEqual.equalTo;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public abstract class HandwrittenTestSuite {
   private static Logger logger;
@@ -141,6 +142,7 @@ public abstract class HandwrittenTestSuite {
   public void test_05() throws IOException, Parser.Exception, SolvingException {
     Tuple<Root, Solution> modelAndSolution = loadAndSolve("test_05.txt");
     assertValidSolution(modelAndSolution);
+    assertTrue(modelAndSolution.getSecondElement().isValid());
     Assignment configA = assertAssignment(modelAndSolution, 0, "configA0", "r0");
     Assignment configB = assertAssignment(modelAndSolution, 0, "configB0", "r1");
     Assignment configC = assertAssignment(modelAndSolution, 0, "configC0", "r4");
-- 
GitLab