From 1525fb49bb6964f5a807f129df8914de5b9b2431 Mon Sep 17 00:00:00 2001
From: Simon Ehrenstein <simon.ehrenstein@gmail.com>
Date: Wed, 6 Jan 2021 18:09:16 +0100
Subject: [PATCH] Implement search strategies

Co-authored-by: Benedikt Wetzel <stu126940@mail.uni-kiel.de>
---
 .../kotlin/theodolite/ExperimentConfig.kt     | 26 +++++++++++++++++++
 .../kotlin/theodolite/ExperimentExecutor.kt   |  9 +++++++
 .../src/main/kotlin/theodolite/Main.kt        | 24 +++++++++++++++--
 .../theodolite/strategies/BinarySearch.kt     | 10 +++++++
 .../strategies/EvenResourcesRestriction.kt    | 12 +++++++++
 .../theodolite/strategies/LinearSearch.kt     | 14 ++++++++++
 .../strategies/LowerBoundRestriction.kt       | 16 ++++++++++++
 .../restriction/CompositeRestriction.kt       |  4 +++
 .../restriction/PrimitiveRestriction.kt       |  7 +++++
 .../strategies/restriction/Restriction.kt     |  5 ++++
 .../strategies/searchstrategy/Benchmark.kt    |  7 +++++
 .../searchstrategy/SearchStrategy.kt          |  5 ++++
 12 files changed, 137 insertions(+), 2 deletions(-)
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/ExperimentConfig.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/ExperimentExecutor.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/strategies/BinarySearch.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/strategies/EvenResourcesRestriction.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/strategies/LinearSearch.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/strategies/LowerBoundRestriction.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/CompositeRestriction.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/PrimitiveRestriction.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/Restriction.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/Benchmark.kt
 create mode 100644 theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt

diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/ExperimentConfig.kt b/theodolite-quarkus/src/main/kotlin/theodolite/ExperimentConfig.kt
new file mode 100644
index 000000000..5b2fb22c0
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/ExperimentConfig.kt
@@ -0,0 +1,26 @@
+package theodolite
+
+import theodolite.strategies.SearchAlgorithm
+
+data class ExperimentConfig(
+    val useCase: Int,
+    val expId: Int,
+    val dimValues: Array<Int>,
+    val replicass: Array<Int>,
+    val partitions: Int,
+    val cpuLimit: String,
+    val memoryLimit: String,
+    val executionMinutes: Float,
+    val prometheusBaseUrl: String,
+    val reset: Boolean,
+    val namespace: String,
+    val resultPath: String,
+    val configurations: Any,
+    val restrictionStrategy: SearchAlgorithm,
+    val searchStrategy: SearchStrategy,
+    val benchmark: Any, // TODO
+    val sloChecker: Any // TODO
+) {
+
+
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/ExperimentExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/ExperimentExecutor.kt
new file mode 100644
index 000000000..9c68ca5cf
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/ExperimentExecutor.kt
@@ -0,0 +1,9 @@
+package theodolite
+
+class ExperimentExecutor(
+    val config: ExperimentConfig
+) {
+    fun run() {
+        this.config.restrictionStrategy.restrictResource();
+    }
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt b/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt
index cf6a7cb5d..d606aedd8 100644
--- a/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt
@@ -6,9 +6,29 @@ import io.quarkus.runtime.annotations.QuarkusMain
 object Main {
     @JvmStatic
     fun main(args: Array<String>) {
-        println("Running main method")
+        println("Starting Benchmarks")
 
+        val config: ExperimentConfig = ExperimentConfig(
+            exp_id = 0,
+            use_case = 1,
+            dim_values = arrayOf(1,2,3),
+            configurations = TODO(),
+            domain_restriction_strategy = TODO(),
+            cpu_limit = "1000m",
+            execution_minutes = 5f,
+            memory_limit = "4gb",
+            namespace = "default",
+            partitions = 10,
+            prometheus_base_url = "http://localhost:9090",
+            replicass = arrayOf(1,2,3),
+            reset = false,
+            result_path = "./results",
+            search_strategy = TODO(),
+            subexperiment_evaluator = TODO(),
+            subexperiment_executor = TODO()
+        )
 
-        //Quarkus.run()
+        val executor: ExperimentExecutor = ExperimentExecutor(config)
+        executor.run()
     }
 }
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/BinarySearch.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/BinarySearch.kt
new file mode 100644
index 000000000..c9fd0f498
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/BinarySearch.kt
@@ -0,0 +1,10 @@
+package theodolite.strategies
+
+import theodolite.strategies.searchstrategy.Benchmark
+import theodolite.strategies.searchstrategy.SearchStrategy
+
+class BinarySearch(benchmark: Benchmark) : SearchStrategy(benchmark) {
+    override fun findSuitableResources(load: Int, resources: List<Int>): Int {
+
+    }
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/EvenResourcesRestriction.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/EvenResourcesRestriction.kt
new file mode 100644
index 000000000..24078a23d
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/EvenResourcesRestriction.kt
@@ -0,0 +1,12 @@
+package theodolite.strategies
+
+import theodolite.strategies.restriction.CompositeRestriction
+import theodolite.strategies.restriction.Restriction
+
+class EvenResourcesRestriction(childRestriction: Restriction) : CompositeRestriction(childRestriction) {
+    override fun restrict(loads: List<Int>, resources: List<Int>) {
+        val filteredResources: List<Int> = resources.filter { x -> x % 2 == 0 };
+        this.childRestriction.restrict(loads, filteredResources);
+    }
+
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/LinearSearch.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/LinearSearch.kt
new file mode 100644
index 000000000..79938f7fa
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/LinearSearch.kt
@@ -0,0 +1,14 @@
+package theodolite.strategies
+
+import theodolite.strategies.searchstrategy.Benchmark
+import theodolite.strategies.searchstrategy.SearchStrategy
+
+class LinearSearch(benchmark: Benchmark) : SearchStrategy(benchmark) {
+
+    override fun findSuitableResources(load: Int, resources: List<Int>): Int {
+        for (res in resources) {
+            if (this.benchmark.execute(load, res)) return resources.indexOf(res);
+        }
+        return resources.size;
+    }
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/LowerBoundRestriction.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/LowerBoundRestriction.kt
new file mode 100644
index 000000000..157281a4c
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/LowerBoundRestriction.kt
@@ -0,0 +1,16 @@
+package theodolite.strategies
+
+import theodolite.strategies.restriction.PrimitiveRestriction
+import theodolite.strategies.searchstrategy.SearchStrategy
+
+class LowerBoundRestriction(searchStrategy: SearchStrategy) : PrimitiveRestriction(searchStrategy) {
+    override fun restrict(loads: List<Int>, resources: List<Int>): List<Int> {
+        val lowerBounds: MutableList<Int> = ArrayList<Int>();
+        var lowerBound = 0;
+        for (load in loads) {
+            lowerBound = this.searchStrategy.findSuitableResources(load, resources.subList(lowerBound, resources.size));
+            lowerBounds.add(lowerBound);
+        }
+        return lowerBounds;
+    }
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/CompositeRestriction.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/CompositeRestriction.kt
new file mode 100644
index 000000000..6f61dc2ad
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/CompositeRestriction.kt
@@ -0,0 +1,4 @@
+package theodolite.strategies.restriction
+
+abstract class CompositeRestriction(val childRestriction: Restriction): Restriction {
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/PrimitiveRestriction.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/PrimitiveRestriction.kt
new file mode 100644
index 000000000..0e1873ec2
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/PrimitiveRestriction.kt
@@ -0,0 +1,7 @@
+package theodolite.strategies.restriction
+
+import theodolite.strategies.searchstrategy.SearchStrategy
+
+abstract class PrimitiveRestriction(val searchStrategy: SearchStrategy): Restriction {
+
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/Restriction.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/Restriction.kt
new file mode 100644
index 000000000..4dc5ca524
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/Restriction.kt
@@ -0,0 +1,5 @@
+package theodolite.strategies.restriction
+
+interface Restriction {
+    fun restrict(loads: List<Int>, resources: List<Int>): List<Int>;
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/Benchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/Benchmark.kt
new file mode 100644
index 000000000..eb3e22a36
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/Benchmark.kt
@@ -0,0 +1,7 @@
+package theodolite.strategies.searchstrategy
+
+class Benchmark {
+    fun execute(load: Int, res: Int): Boolean {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt
new file mode 100644
index 000000000..b42e78c9e
--- /dev/null
+++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt
@@ -0,0 +1,5 @@
+package theodolite.strategies.searchstrategy
+
+abstract class SearchStrategy(val benchmark: Benchmark) {
+    abstract fun findSuitableResources(load: Int, resources: List<Int>): Int;
+}
\ No newline at end of file
-- 
GitLab