diff --git a/theodolite/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt b/theodolite/src/main/kotlin/theodolite/execution/TheodoliteExecutor.kt index a334dc8f3126a23dfb913da754344d56a2cfbdcf..becac28494a34afee4ae37f207ade16e74cdaf9d 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 28e8194c699cd074026c8cb7e6f3ce4ec347023b..eaa5c0cd573bf1901241d336bf1ad2d05e0b575a 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 cb0dd2d8ab528e42e8290f59f26c8b9b32f384c7..237124b8f930d375e0bc2e88743c4b274123d015 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 d97fb62cc9d37dd50122199e5d089c491784e511..61c42ba7815a5045aaf36575e7cae0ea31e945e4 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 85deaf6fa75437199bfc560404eb5b40bb4a986a..752b3301fb985af103d8fd50a0d75b11f74aaa49 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 776cdeba513c0c396ae96cd6bec5eb1c712b3f95..f09371cb43a0b5f6a7435709ea2880e2b0706653 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 97c723f2cfe459081cbb327f6860e48319c8f4f1..ef366a1b282eaf0ea3dcdaf4a5ce792d0acc1a1b 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? }