From 661cd61a50ac9b199ef55f16c89212b1837d81fa Mon Sep 17 00:00:00 2001 From: "stu126940@mail.uni-kiel.de" <stu126940@mail.uni-kiel.de> Date: Fri, 22 Jan 2021 11:16:06 +0100 Subject: [PATCH] save benchmark results, add notes as comments --- .../execution/TestBenchmarkExecutor.kt | 1 + .../restriction/LowerBoundRestriction.kt | 6 ++++-- .../restriction/RestrictionStrategy.kt | 2 +- .../strategies/searchstrategy/BinarySearch.kt | 3 ++- .../searchstrategy/CompositeStrategy.kt | 9 +++++---- .../strategies/searchstrategy/LinearSearch.kt | 10 ++++++++-- .../searchstrategy/SearchStrategy.kt | 3 ++- .../kotlin/theodolite/util/LoadDimension.kt | 4 ++-- .../main/kotlin/theodolite/util/Results.kt | 20 +++++++++++++++++-- .../theodolite/CompositeStrategyTest.kt | 12 +++++------ 10 files changed, 49 insertions(+), 21 deletions(-) diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt index 9fd2453c1..65cb42203 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt @@ -7,6 +7,7 @@ import theodolite.util.Resource class TestBenchmarkExecutor(val mockResults: Array<Array<Boolean>>): BenchmarkExecutor { 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()] } } \ 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 73792f3ce..6f71a949e 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/LowerBoundRestriction.kt @@ -3,10 +3,12 @@ package theodolite.strategies.restriction import theodolite.util.Results import theodolite.util.LoadDimension import theodolite.util.Resource +import kotlin.math.max -class LowerBoundRestriction(results: Results, loads: List<LoadDimension>) : RestrictionStrategy(results, loads) { +class LowerBoundRestriction(results: Results) : RestrictionStrategy(results) { override fun next(load: LoadDimension, resources: List<Resource>): List<Resource> { - var lowerBound: Resource? = this.results.getRequiredInstances(load) + val maxLoad: LoadDimension? = this.results.getMaxBenchmarkedLoad(load) + var lowerBound: Resource? = this.results.getRequiredInstances(maxLoad) if(lowerBound == null) { lowerBound = Resource(0) // TODO handle the null case } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/RestrictionStrategy.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/RestrictionStrategy.kt index bf0415628..60a6eccfb 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/RestrictionStrategy.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/restriction/RestrictionStrategy.kt @@ -4,6 +4,6 @@ import theodolite.util.Results import theodolite.util.LoadDimension import theodolite.util.Resource -abstract class RestrictionStrategy(val results: Results, val loads: List<LoadDimension>) { +abstract class RestrictionStrategy(val results: Results) { public abstract fun next(load: LoadDimension, resources: List<Resource>): List<Resource>; } \ No newline at end of file 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 d238bc955..32cfe2191 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/BinarySearch.kt @@ -3,9 +3,10 @@ package theodolite.strategies.searchstrategy import theodolite.execution.BenchmarkExecutor import theodolite.util.LoadDimension import theodolite.util.Resource +import theodolite.util.Results import java.lang.IllegalArgumentException -class BinarySearch(benchmarkExecutor: BenchmarkExecutor) : SearchStrategy(benchmarkExecutor) { +class BinarySearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : SearchStrategy(benchmarkExecutor, results) { override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? { val result = search(load, resources, 0, resources.size - 1) if( result == -1 ) { 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 e69ee0bad..7a100e5ab 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/CompositeStrategy.kt @@ -4,14 +4,15 @@ import theodolite.execution.BenchmarkExecutor import theodolite.strategies.restriction.RestrictionStrategy import theodolite.util.LoadDimension import theodolite.util.Resource +import theodolite.util.Results -class CompositeStrategy(benchmarkExecutor: BenchmarkExecutor, val searchStrategy: SearchStrategy, val restrictionStrategies: List<RestrictionStrategy>) : SearchStrategy(benchmarkExecutor) { +class CompositeStrategy(benchmarkExecutor: BenchmarkExecutor, val searchStrategy: SearchStrategy, val restrictionStrategies: List<RestrictionStrategy>, results: Results) : SearchStrategy(benchmarkExecutor, results) { override fun findSuitableResources(load: LoadDimension,resources: List<Resource>): Resource? { - var restrictedResources: List<Resource> = resources + var restricted = resources for (strategy in this.restrictionStrategies) { - restrictedResources.intersect(strategy.next(load, resources)) + restricted = restricted.intersect(strategy.next(load, resources)).toList() // erstellt das eine liste oder verändert das die liste? } - return this.searchStrategy.findSuitableResources(load, restrictedResources) + return this.searchStrategy.findSuitableResources(load, restricted) } } \ 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 919689ed9..6381f9e62 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/LinearSearch.kt @@ -3,12 +3,18 @@ package theodolite.strategies.searchstrategy import theodolite.execution.BenchmarkExecutor import theodolite.util.LoadDimension import theodolite.util.Resource +import theodolite.util.Results -class LinearSearch(benchmarkExecutor: BenchmarkExecutor) : SearchStrategy(benchmarkExecutor) { +class LinearSearch(benchmarkExecutor: BenchmarkExecutor, results: Results) : SearchStrategy(benchmarkExecutor, results) { override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? { for (res in resources) { - if (this.benchmarkExecutor.runExperiment(load, res)) return res; + if (this.benchmarkExecutor.runExperiment(load, res)) { + this.results.setResult(Pair(load, res), true) + return res + } else { + this.results.setResult(Pair(load, res), false) + } } return null; } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt index 487499784..7e151ef6f 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/strategies/searchstrategy/SearchStrategy.kt @@ -3,7 +3,8 @@ package theodolite.strategies.searchstrategy import theodolite.execution.BenchmarkExecutor import theodolite.util.LoadDimension import theodolite.util.Resource +import theodolite.util.Results -abstract class SearchStrategy(val benchmarkExecutor: BenchmarkExecutor) { +abstract class SearchStrategy(val benchmarkExecutor: BenchmarkExecutor, val results: Results) { abstract fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource?; } \ No newline at end of file diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/util/LoadDimension.kt b/theodolite-quarkus/src/main/kotlin/theodolite/util/LoadDimension.kt index 84de466a8..6a3953b6b 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/util/LoadDimension.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/LoadDimension.kt @@ -1,6 +1,6 @@ package theodolite.util -class LoadDimension(val number: Int) { +class LoadDimension(val number: Int) { // data class ? public fun get(): Int { return this.number; } @@ -14,4 +14,4 @@ class LoadDimension(val number: Int) { override fun hashCode(): Int { return this.get().hashCode() } -} \ 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 1a4107612..01e303ceb 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/util/Results.kt @@ -6,7 +6,7 @@ import kotlin.math.exp class Results { // load, instances - private val results: MutableMap<Pair<LoadDimension, Resource>, Boolean> = mutableMapOf() + private val results: MutableMap<Pair<LoadDimension, Resource>, Boolean> = mutableMapOf() // multi map guava public fun setResult(experiment: Pair<LoadDimension, Resource>, successful: Boolean) { this.results.put(experiment, successful) @@ -16,7 +16,7 @@ class Results { return this.results.get(experiment) } - public fun getRequiredInstances(load: LoadDimension): Resource? { + public fun getRequiredInstances(load: LoadDimension?): Resource? { var requiredInstances: Resource? = null; for(experiment in results) { if(experiment.key.first == load && experiment.value){ @@ -29,4 +29,20 @@ class Results { } return requiredInstances } + + public fun getMaxBenchmarkedLoad(load: LoadDimension): LoadDimension? { + var maxBenchmarkedLoad: LoadDimension = LoadDimension(0) + for(experiment in results) { + if (experiment.value) { + if(experiment.key.first.get() <= load.get()) { + if (experiment.value && maxBenchmarkedLoad == null) { + maxBenchmarkedLoad = experiment.key.first + } else if (experiment.value && maxBenchmarkedLoad.get() < experiment.key.first.get()) { + maxBenchmarkedLoad = experiment.key.first + } + } + } + } + return maxBenchmarkedLoad + } } \ 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 0fa48dafc..c9ab93992 100644 --- a/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt +++ b/theodolite-quarkus/src/test/kotlin/theodolite/CompositeStrategyTest.kt @@ -29,10 +29,10 @@ 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 linearSearch: LinearSearch = LinearSearch(benchmarkExecutor); val results: Results = Results(); - val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results, mockLoads); - val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, linearSearch, listOf(lowerBoundRestriction)) + val linearSearch: LinearSearch = LinearSearch(benchmarkExecutor, results); + val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results); + val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, linearSearch, listOf(lowerBoundRestriction), results) val actual: ArrayList<Resource?> = ArrayList<Resource?>() val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)}) @@ -59,10 +59,10 @@ 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 binarySearch: BinarySearch = BinarySearch(benchmarkExecutor); val results: Results = Results(); - val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results, mockLoads); - val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, binarySearch, listOf(lowerBoundRestriction)) + 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 actual: ArrayList<Resource?> = ArrayList<Resource?>() val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)}) -- GitLab