diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt b/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt index 26d1f112ddb927ffd51df994874a30ea1a458db6..63de4f5004cf883da95430e1524223f63acc5475 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/Main.kt @@ -1,11 +1,13 @@ package theodolite import io.quarkus.runtime.annotations.QuarkusMain +import theodolite.execution.TheodoliteExecutor @QuarkusMain object Main { @JvmStatic fun main(args: Array<String>) { - println("Starting Benchmarks") + val theodolite = TheodoliteExecutor(); + theodolite.run() } } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt index e6ffc016552fbea01dbd124c1df1056ada681af3..591a2bc10960ddaf49bb4bbe10eea1b8258c7978 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt @@ -1,8 +1,10 @@ package theodolite.execution +import theodolite.util.Benchmark import theodolite.util.LoadDimension import theodolite.util.Resource +import theodolite.util.Results -interface BenchmarkExecutor { - fun runExperiment(load: LoadDimension, res: Resource): Boolean; +abstract class BenchmarkExecutor(val benchmark: Benchmark, val results: Results) { + abstract fun runExperiment(load: LoadDimension, res: Resource): Boolean; } \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt new file mode 100644 index 0000000000000000000000000000000000000000..b2323b83eb9a196d5f2617c7d7b6ee0f8716af23 --- /dev/null +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt @@ -0,0 +1,18 @@ +package theodolite.execution + +import theodolite.util.Benchmark +import theodolite.util.LoadDimension +import theodolite.util.Resource +import theodolite.util.Results + +class KafkaBenchmarkExecutor(benchmark: Benchmark, results: Results) : BenchmarkExecutor(benchmark, results) { + override fun runExperiment(load: LoadDimension, res: Resource): Boolean { + benchmark.start() + // wait + benchmark.stop(); + // evaluate + val result = false // if success else false + this.results.setResult(Pair(load, res), result) + return result; + } +} \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt index 65cb4220300a43f14bdac7637c5e79e34f691d46..d98ba3fb190732d03b9c74ac651ee0496c11ad58 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt @@ -1,13 +1,20 @@ package theodolite.execution import theodolite.execution.BenchmarkExecutor +import theodolite.util.Benchmark import theodolite.util.LoadDimension import theodolite.util.Resource +import theodolite.util.Results -class TestBenchmarkExecutor(val mockResults: Array<Array<Boolean>>): BenchmarkExecutor { +class TestBenchmarkExecutor(private val mockResults: Array<Array<Boolean>>, benchmark: Benchmark, results: Results): + BenchmarkExecutor(benchmark, results) { override fun runExperiment(load: LoadDimension, res: Resource): Boolean { - System.out.println("load :" + load.get().toString() + ", res: " + res.get().toString()) - return this.mockResults[load.get()][res.get()] + val result = this.mockResults[load.get()][res.get()] + + System.out.println("load :" + load.get().toString() + ", res: " + res.get().toString() + ", res: " + result) + + this.results.setResult(Pair(load, res), result) + return result; } } \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt new file mode 100644 index 0000000000000000000000000000000000000000..e2c56c70c2772c3ddda245f5f210a32049e3b855 --- /dev/null +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt @@ -0,0 +1,34 @@ +package theodolite.execution + +import theodolite.strategies.restriction.LowerBoundRestriction +import theodolite.strategies.searchstrategy.CompositeStrategy +import theodolite.strategies.searchstrategy.LinearSearch +import theodolite.util.* + +class TheodoliteExecutor() { + private fun loadConfig(): Config { + val benchmark: Benchmark = KafkaBenchmark() + val results: Results = Results() + val executor: BenchmarkExecutor = KafkaBenchmarkExecutor(benchmark, results) + + val restrictionStrategy = LowerBoundRestriction(results) + val searchStrategy = LinearSearch(executor, results) + + return Config( + loads = (0..6).map{ number -> LoadDimension(number) }, + resources = (0..6).map{ number -> Resource(number) }, + compositeStrategy = CompositeStrategy(executor, searchStrategy, restrictionStrategies = setOf(restrictionStrategy), results = results) + ) + } + + fun run() { + // read or get benchmark config + val config = this.loadConfig() + + // execute benchmarks for each load + for(load in config.loads) { + config.compositeStrategy.findSuitableResources(load, config.resources) + } + + } +} \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt index 6f71a949e47739bc01916e042e2625e89a215785..fb3574e57053436019a9c74cdc4d82e71268bcf5 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt @@ -3,14 +3,13 @@ package theodolite.strategies.restriction import theodolite.util.Results import theodolite.util.LoadDimension import theodolite.util.Resource -import kotlin.math.max class LowerBoundRestriction(results: Results) : RestrictionStrategy(results) { override fun next(load: LoadDimension, resources: List<Resource>): List<Resource> { val maxLoad: LoadDimension? = this.results.getMaxBenchmarkedLoad(load) - var lowerBound: Resource? = this.results.getRequiredInstances(maxLoad) + var lowerBound: Resource? = this.results.getMinRequiredInstances(maxLoad) if(lowerBound == null) { - lowerBound = Resource(0) // TODO handle the null case + lowerBound = resources.get(0) } return resources.filter{x -> x.get() >= lowerBound.get()} } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt index 32cfe2191ee4e9d640fcc271ddcc596920296575..1ce43d7bb2c73faf2e0ca418f1e574082dd2d1ed 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt @@ -26,10 +26,11 @@ class BinarySearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : Sea return lower + 1; } } else { + // (true, true), (false, true), (false, false) // (false, false, false, true, false, true, false, true) val mid = (upper + lower) / 2 if (this.benchmarkExecutor.runExperiment(load, resources[mid])) { if (mid == lower) { - return search(load, resources, lower, lower ); + return lower } return search(load, resources, lower, mid - 1 ); } else { diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt index 7a100e5abb600ea976fe35b11076b55a6e58b25b..ed8750083881f72a091c0acd923ef7c46ff79db7 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt @@ -6,13 +6,13 @@ import theodolite.util.LoadDimension import theodolite.util.Resource import theodolite.util.Results -class CompositeStrategy(benchmarkExecutor: BenchmarkExecutor, val searchStrategy: SearchStrategy, val restrictionStrategies: List<RestrictionStrategy>, results: Results) : SearchStrategy(benchmarkExecutor, results) { +class CompositeStrategy(benchmarkExecutor: BenchmarkExecutor, val searchStrategy: SearchStrategy, val restrictionStrategies: Set<RestrictionStrategy>, results: Results) : SearchStrategy(benchmarkExecutor, results) { - override fun findSuitableResources(load: LoadDimension,resources: List<Resource>): Resource? { - var restricted = resources + override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? { + var restrictedResources = resources.toList() for (strategy in this.restrictionStrategies) { - restricted = restricted.intersect(strategy.next(load, resources)).toList() // erstellt das eine liste oder verändert das die liste? + restrictedResources = restrictedResources.intersect(strategy.next(load, resources)).toList() } - return this.searchStrategy.findSuitableResources(load, restricted) + return this.searchStrategy.findSuitableResources(load, restrictedResources) } } \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt index 6381f9e6280bcf0dff93c6a58004b2fa668adc4f..37fa4ca41678c285bb4fb6a86633dedecb78ba03 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt @@ -9,12 +9,7 @@ class LinearSearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : Sea override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? { for (res in resources) { - if (this.benchmarkExecutor.runExperiment(load, res)) { - this.results.setResult(Pair(load, res), true) - return res - } else { - this.results.setResult(Pair(load, res), false) - } + if (this.benchmarkExecutor.runExperiment(load, res)) return res } return null; } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt new file mode 100644 index 0000000000000000000000000000000000000000..f757128a2bf1ca997fbe6f777f6bfb9de37cf776 --- /dev/null +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt @@ -0,0 +1,9 @@ +package theodolite.util + +// todo: needs cluster and resource config +interface Benchmark { + + fun start(); + + fun stop(); +} \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt new file mode 100644 index 0000000000000000000000000000000000000000..7dff743661d7d19b421de46874f2f70c5e76ec42 --- /dev/null +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt @@ -0,0 +1,13 @@ +package theodolite.util + +import theodolite.strategies.restriction.RestrictionStrategy +import theodolite.strategies.searchstrategy.CompositeStrategy +import theodolite.strategies.searchstrategy.SearchStrategy + +data class Config( + val loads: List<LoadDimension>, + val resources: List<Resource>, + val compositeStrategy: CompositeStrategy +) { + +} \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt new file mode 100644 index 0000000000000000000000000000000000000000..fdbb1cc932c33b076404db682d43763d88fc6398 --- /dev/null +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt @@ -0,0 +1,13 @@ +package theodolite.util + +class KafkaBenchmark: Benchmark { + + override fun start() { + TODO("Not yet implemented") + } + + override fun stop() { + TODO("Not yet implemented") + } + +} \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt index 01e303ceb49637b9a094174c4d785c1defbac95d..a2e2cddb19d6485d5206489234f446bbf425d1d8 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt @@ -16,8 +16,10 @@ class Results { return this.results.get(experiment) } - public fun getRequiredInstances(load: LoadDimension?): Resource? { - var requiredInstances: Resource? = null; + public fun getMinRequiredInstances(load: LoadDimension?): Resource? { + if (this.results.isEmpty()) return Resource(Int.MIN_VALUE) + + var requiredInstances: Resource? = Resource(Int.MAX_VALUE) for(experiment in results) { if(experiment.key.first == load && experiment.value){ if(requiredInstances == null) { @@ -31,13 +33,13 @@ class Results { } public fun getMaxBenchmarkedLoad(load: LoadDimension): LoadDimension? { - var maxBenchmarkedLoad: LoadDimension = LoadDimension(0) + var maxBenchmarkedLoad: LoadDimension? = null; for(experiment in results) { if (experiment.value) { if(experiment.key.first.get() <= load.get()) { - if (experiment.value && maxBenchmarkedLoad == null) { + if (maxBenchmarkedLoad == null) { maxBenchmarkedLoad = experiment.key.first - } else if (experiment.value && maxBenchmarkedLoad.get() < experiment.key.first.get()) { + } else if (maxBenchmarkedLoad.get() < experiment.key.first.get()) { maxBenchmarkedLoad = experiment.key.first } } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt new file mode 100644 index 0000000000000000000000000000000000000000..e95c2070f9954e2c1800750da121288236880d81 --- /dev/null +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/TestBenchmark.kt @@ -0,0 +1,11 @@ +package theodolite.util + +class TestBenchmark: Benchmark { + override fun start() { + TODO("Not yet implemented") + } + + override fun stop() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt index c9ab93992e73cbf9655ddb585c96308529ce3b9b..ce031ddb101008e518f8bace40c315dca3a60530 100644 --- a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt +++ b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt @@ -8,9 +8,7 @@ import theodolite.strategies.searchstrategy.BinarySearch import theodolite.strategies.restriction.LowerBoundRestriction import theodolite.strategies.searchstrategy.CompositeStrategy import theodolite.execution.TestBenchmarkExecutor -import theodolite.util.LoadDimension -import theodolite.util.Resource -import theodolite.util.Results +import theodolite.util.* @QuarkusTest class CompositeStrategyTest { @@ -28,11 +26,12 @@ class CompositeStrategyTest { ) val mockLoads: List<LoadDimension> = (0..6).map{number -> LoadDimension(number)} val mockResources: List<Resource> = (0..6).map{number -> Resource(number)} - val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults) val results: Results = Results(); + val benchmark = TestBenchmark() + val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults, benchmark, results) val linearSearch: LinearSearch = LinearSearch(benchmarkExecutor, results); val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results); - val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, linearSearch, listOf(lowerBoundRestriction), results) + val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, linearSearch, setOf(lowerBoundRestriction), results) val actual: ArrayList<Resource?> = ArrayList<Resource?>() val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)}) @@ -58,11 +57,12 @@ class CompositeStrategyTest { ) val mockLoads: List<LoadDimension> = (0..6).map{number -> LoadDimension(number)} val mockResources: List<Resource> = (0..6).map{number -> Resource(number)} - val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults) val results: Results = Results(); + val benchmark = TestBenchmark() + val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults, benchmark, results) val binarySearch: BinarySearch = BinarySearch(benchmarkExecutor, results); val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results); - val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, binarySearch, listOf(lowerBoundRestriction), results) // sets instead of lists + val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, binarySearch, setOf(lowerBoundRestriction), results) // sets instead of lists val actual: ArrayList<Resource?> = ArrayList<Resource?>() val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)})