diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt index 591a2bc10960ddaf49bb4bbe10eea1b8258c7978..4f43e4c8cdd87d835a5d72987981253e742c5a75 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/BenchmarkExecutor.kt @@ -4,7 +4,8 @@ import theodolite.util.Benchmark import theodolite.util.LoadDimension import theodolite.util.Resource import theodolite.util.Results +import java.time.Duration -abstract class BenchmarkExecutor(val benchmark: Benchmark, val results: Results) { +abstract class BenchmarkExecutor(val benchmark: Benchmark, val results: Results, val executionDuration: Duration) { 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 index b2323b83eb9a196d5f2617c7d7b6ee0f8716af23..730be87652b42c64f1aba9b7eee54427db05fcb7 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/KafkaBenchmarkExecutor.kt @@ -4,12 +4,13 @@ import theodolite.util.Benchmark import theodolite.util.LoadDimension import theodolite.util.Resource import theodolite.util.Results +import java.time.Duration -class KafkaBenchmarkExecutor(benchmark: Benchmark, results: Results) : BenchmarkExecutor(benchmark, results) { +class KafkaBenchmarkExecutor(benchmark: Benchmark, results: Results, executionDuration: Duration) : BenchmarkExecutor(benchmark, results, executionDuration) { override fun runExperiment(load: LoadDimension, res: Resource): Boolean { benchmark.start() // wait - benchmark.stop(); + benchmark.stop() // evaluate val result = false // if success else false this.results.setResult(Pair(load, res), result) diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt index e2c56c70c2772c3ddda245f5f210a32049e3b855..b6554a6a90293954d5548a1270c8d08a0b480356 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt @@ -4,12 +4,14 @@ import theodolite.strategies.restriction.LowerBoundRestriction import theodolite.strategies.searchstrategy.CompositeStrategy import theodolite.strategies.searchstrategy.LinearSearch import theodolite.util.* +import java.time.Duration class TheodoliteExecutor() { private fun loadConfig(): Config { - val benchmark: Benchmark = KafkaBenchmark() + val benchmark: Benchmark = KafkaBenchmark(emptyMap()) val results: Results = Results() - val executor: BenchmarkExecutor = KafkaBenchmarkExecutor(benchmark, results) + val executionDuration = Duration.ofSeconds(60*5 ) + val executor: BenchmarkExecutor = KafkaBenchmarkExecutor(benchmark, results, executionDuration) val restrictionStrategy = LowerBoundRestriction(results) val searchStrategy = LinearSearch(executor, results) @@ -17,7 +19,8 @@ class TheodoliteExecutor() { 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) + compositeStrategy = CompositeStrategy(executor, searchStrategy, restrictionStrategies = setOf(restrictionStrategy), results = results), + executionDuration = executionDuration ) } 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 1ce43d7bb2c73faf2e0ca418f1e574082dd2d1ed..a1e1c8f3f112519fa46ccbe139e07ba7a591223b 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt @@ -20,7 +20,7 @@ class BinarySearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : Sea throw IllegalArgumentException() } if (lower == upper ) { - if (this.benchmarkExecutor.runExperiment(load, resources[upper])) return upper; + if (this.benchmarkExecutor.runExperiment(load, resources[lower])) return lower; else { if (lower + 1 == resources.size) return - 1 return lower + 1; diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt index f757128a2bf1ca997fbe6f777f6bfb9de37cf776..c4cb2be1715ad0387aa7d90d1a45eb708e9bfba2 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Benchmark.kt @@ -1,9 +1,8 @@ package theodolite.util // todo: needs cluster and resource config -interface Benchmark { +abstract class Benchmark(val config: Map<String, Any>) { + abstract fun start(); - fun start(); - - fun stop(); + abstract 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 index 7dff743661d7d19b421de46874f2f70c5e76ec42..6fb680c0ae0dfeb80418f98093494386eda97fb4 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Config.kt @@ -3,11 +3,13 @@ package theodolite.util import theodolite.strategies.restriction.RestrictionStrategy import theodolite.strategies.searchstrategy.CompositeStrategy import theodolite.strategies.searchstrategy.SearchStrategy +import java.time.Duration data class Config( val loads: List<LoadDimension>, val resources: List<Resource>, - val compositeStrategy: CompositeStrategy + val compositeStrategy: CompositeStrategy, + val executionDuration: Duration ) { } \ 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 index fdbb1cc932c33b076404db682d43763d88fc6398..3ed499bf6f4f2dfc16b7af6c297be424ac2ba8a7 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/KafkaBenchmark.kt @@ -1,6 +1,6 @@ package theodolite.util -class KafkaBenchmark: Benchmark { +class KafkaBenchmark(config: Map<String, Any>): Benchmark(config) { override fun start() { TODO("Not yet implemented") diff --git a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt index ce031ddb101008e518f8bace40c315dca3a60530..0f9b1b850b9963aa9e9851f963e4f02abcf09924 100644 --- a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt +++ b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt @@ -8,6 +8,8 @@ import theodolite.strategies.searchstrategy.BinarySearch import theodolite.strategies.restriction.LowerBoundRestriction import theodolite.strategies.searchstrategy.CompositeStrategy import theodolite.execution.TestBenchmarkExecutor +import theodolite.strategies.restriction.RestrictionStrategy +import theodolite.strategies.searchstrategy.SearchStrategy import theodolite.util.* @QuarkusTest @@ -75,6 +77,34 @@ class CompositeStrategyTest { assertEquals(actual, expected) } + @Test + fun testEnd2EndBinarySearch2() { + val mockResults = arrayOf( + arrayOf( true , true , true , true , true , true , true, true), + arrayOf( false, false, true , true , true , true , true, true), + arrayOf( false, false, true , true , true , true , true, true), + arrayOf( false, false, false, true , true , true , true, true), + arrayOf( false, false, false, false, true , true , true, true), + arrayOf( false, false, false, false, false, false, true, true), + arrayOf( false, false, false, false, false, false, false, true) + ) + val mockLoads: List<LoadDimension> = (0..6).map{number -> LoadDimension(number)} + val mockResources: List<Resource> = (0..7).map{number -> Resource(number)} + 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, 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,7).map{ x -> Resource(x)}) + for(load in mockLoads) { + actual.add(strategy.findSuitableResources(load, mockResources)) + } + + assertEquals(actual, expected) + } } \ No newline at end of file