diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt b/theodolite-quarkus/src/main/kotlin/theodolite/execution/TestBenchmarkExecutor.kt index 9fd2453c1d7d516a671fb09e18a7041e4abf05a7..65cb4220300a43f14bdac7637c5e79e34f691d46 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 73792f3ce63d3808df657bc155d7ca6420723fa2..6f71a949e47739bc01916e042e2625e89a215785 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 bf04156283b7291bd84180ed8a3f5715f68a1503..60a6eccfb37e5941455f3fc33876092a2317276a 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 d238bc955c03c07d8c56a2b0a03b15881c0c7284..32cfe2191ee4e9d640fcc271ddcc596920296575 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 e69ee0bad1c2df5f8677fd7e6743cf69910cab8d..7a100e5abb600ea976fe35b11076b55a6e58b25b 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 919689ed925fd331ee4afa8d2c65e170d637f320..6381f9e6280bcf0dff93c6a58004b2fa668adc4f 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 48749978475c63c3fb667e92054654c5f9a9260c..7e151ef6f3cfaf16a48c43f7369bbfc8041e9295 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 84de466a86ecd094d905a2b8203cce663f0802fb..6a3953b6be6f8964ed7fb9cfbd6e92053b8b886c 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 1a4107612b8007346300c480a269b885369cc8aa..01e303ceb49637b9a094174c4d785c1defbac95d 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 0fa48dafc416900930ed9e398a865e7ca0dae36c..c9ab93992e73cbf9655ddb585c96308529ce3b9b 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)})