From f2bb0d6a95f0d637b3afe1e4002bceb09d197a17 Mon Sep 17 00:00:00 2001
From: Marcel Becker <stu117960@mail.uni-kiel.de>
Date: Tue, 11 Jan 2022 13:33:19 +0100
Subject: [PATCH] Metric Differentiation, findSuitableLoad implemented for
 LinearSearch and FullSearch

---
 .../execution/TheodoliteExecutor.kt           | 24 ++++++++++++-------
 .../strategies/searchstrategy/BinarySearch.kt |  4 ++++
 .../strategies/searchstrategy/FullSearch.kt   | 10 ++++++++
 .../InitialGuessSearchStrategy.kt             |  4 ++++
 .../strategies/searchstrategy/LinearSearch.kt | 14 ++++++++++-
 .../searchstrategy/RestrictionSearch.kt       |  6 +++++
 .../searchstrategy/SearchStrategy.kt          | 10 ++++++++
 7 files changed, 62 insertions(+), 10 deletions(-)

diff --git a/theodolite/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt b/theodolite/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt
index a334dc8f3..becac2849 100644
--- a/theodolite/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt
+++ b/theodolite/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt
@@ -118,19 +118,25 @@ class TheodoliteExecutor(
         )
 
         val config = buildConfig()
-        //TODO: Differentiate metrics here
 
-//        when (config.metric) {
-//            "demand" -> // execute benchmarks for each load
-//            "capacity" -> // execute benchmarks for each resource amount
-//        }
-        // execute benchmarks for each load
+        //execute benchmarks for each load for the demand metric, or for each resource amount for capacity metric
         try {
-            for (load in config.loads) {
-                if (executor.run.get()) {
-                    config.searchStrategy.findSuitableResource(load, config.resources)
+            if (config.metric == "demand") {
+                //demand metric
+                for (load in config.loads) {
+                    if (executor.run.get()) {
+                        config.searchStrategy.findSuitableResource(load, config.resources)
+                    }
+                }
+            } else {
+                //capacity metric
+                for (resource in config.resources) {
+                    if (executor.run.get()) {
+                        config.searchStrategy.findSuitableLoad(resource, config.loads)
+                    }
                 }
             }
+
         } finally {
             ioHandler.writeToJSONFile(
                 config.searchStrategy.benchmarkExecutor.results,
diff --git a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt
index 28e8194c6..eaa5c0cd5 100644
--- a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt
+++ b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt
@@ -21,6 +21,10 @@ class BinarySearch(benchmarkExecutor: BenchmarkExecutor) : SearchStrategy(benchm
         return resources[result]
     }
 
+    override fun findSuitableLoad(resource: Resource, loads: List<LoadDimension>): LoadDimension? {
+        TODO("Not yet implemented")
+    }
+
     /**
      * Apply binary search.
      *
diff --git a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/FullSearch.kt b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/FullSearch.kt
index cb0dd2d8a..237124b8f 100644
--- a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/FullSearch.kt
+++ b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/FullSearch.kt
@@ -22,10 +22,20 @@ class FullSearch(benchmarkExecutor: BenchmarkExecutor) : SearchStrategy(benchmar
         for (res in resources) {
             logger.info { "Running experiment with load '${load.get()}' and resources '${res.get()}'" }
             val result = this.benchmarkExecutor.runExperiment(load, res)
+            //TODO: that actually doesnt make sense no? Shouldnt it be == null?
             if (result && minimalSuitableResources != null) {
                 minimalSuitableResources = res
             }
         }
         return minimalSuitableResources
     }
+
+    override fun findSuitableLoad(resource: Resource, loads: List<LoadDimension>): LoadDimension? {
+        var maxSuitableLoad: LoadDimension? = null
+        for (load in loads) {
+            logger.info { "Running experiment with resources '${resource.get()}' and load '${load.get()}'" }
+            if (this.benchmarkExecutor.runExperiment(load, resource)) maxSuitableLoad = load
+        }
+        return maxSuitableLoad
+    }
 }
diff --git a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/InitialGuessSearchStrategy.kt b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/InitialGuessSearchStrategy.kt
index d97fb62cc..61c42ba78 100644
--- a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/InitialGuessSearchStrategy.kt
+++ b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/InitialGuessSearchStrategy.kt
@@ -90,4 +90,8 @@ class InitialGuessSearchStrategy(benchmarkExecutor: BenchmarkExecutor, guessStra
         }
         return null
     }
+
+    override fun findSuitableLoad(resource: Resource, loads: List<LoadDimension>): LoadDimension? {
+        TODO("Not yet implemented")
+    }
 }
\ No newline at end of file
diff --git a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt
index 85deaf6fa..752b3301f 100644
--- a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt
+++ b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt
@@ -16,10 +16,22 @@ class LinearSearch(benchmarkExecutor: BenchmarkExecutor) : SearchStrategy(benchm
 
     override fun findSuitableResource(load: LoadDimension, resources: List<Resource>): Resource? {
         for (res in resources) {
-
             logger.info { "Running experiment with load '${load.get()}' and resources '${res.get()}'" }
             if (this.benchmarkExecutor.runExperiment(load, res)) return res
         }
         return null
     }
+
+    // Stops after having the first load which is not possible anymore with the current resource, maybe some later load still possible tho
+    // kinda like GuessSearchStrat case -> differentiate or is it fine like that?
+    override fun findSuitableLoad(resource: Resource, loads: List<LoadDimension>): LoadDimension? {
+        var maxSuitableLoad: LoadDimension? = null
+        for (load in loads) {
+            logger.info { "Running experiment with resources '${resource.get()}' and load '${load.get()}'" }
+            if (this.benchmarkExecutor.runExperiment(load, resource)) {
+                maxSuitableLoad = load
+            } else break
+        }
+        return maxSuitableLoad
+    }
 }
diff --git a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/RestrictionSearch.kt b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/RestrictionSearch.kt
index 776cdeba5..f09371cb4 100644
--- a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/RestrictionSearch.kt
+++ b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/RestrictionSearch.kt
@@ -27,4 +27,10 @@ class RestrictionSearch(
         }
         return this.searchStrategy.findSuitableResource(load, restrictedResources)
     }
+
+    //TODO: not sure if it makes sense but actually doing the same as for finding suitable resource with the restrictions
+    override fun findSuitableLoad(resource: Resource, loads: List<LoadDimension>): LoadDimension? {
+        //erste Zeile komisch, wird auch bei resource so gemacht aber warum? das ist doch ne liste warum also toList?
+        TODO("Not yet implemented")
+    }
 }
\ No newline at end of file
diff --git a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt
index 97c723f2c..ef366a1b2 100644
--- a/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt
+++ b/theodolite/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt
@@ -25,4 +25,14 @@ abstract class SearchStrategy(val benchmarkExecutor: BenchmarkExecutor, val gues
      * @return suitable resource for the specified load, or null if no suitable resource exists.
      */
     abstract fun findSuitableResource(load: LoadDimension, resources: List<Resource>): Resource?
+
+    /**
+     * Find biggest suitable load from the specified load list for the given resource amount.
+     *
+     * @param resource the [Resource] to be tested.
+     * @param loads List of all possible [LoadDimension]s.
+     *
+     * @return suitable load for the specified resource amount, or null if no suitable load exists.
+     */
+    abstract fun findSuitableLoad(resource: Resource, loads: List<LoadDimension>) : LoadDimension?
 }
-- 
GitLab