Skip to content
Snippets Groups Projects
Commit 661cd61a authored by Benedikt Wetzel's avatar Benedikt Wetzel
Browse files

save benchmark results, add notes as comments

parent d3fbe901
No related branches found
No related tags found
4 merge requests!159Re-implementation of Theodolite with Kotlin/Quarkus,!157Update Graal Image in CI pipeline,!83WIP: Re-implementation of Theodolite with Kotlin/Quarkus,!78Resolve "Implement Quarkus/Kotlin protype"
This commit is part of merge request !78. Comments created here will be created in the context of that merge request.
Showing
with 49 additions and 21 deletions
...@@ -7,6 +7,7 @@ import theodolite.util.Resource ...@@ -7,6 +7,7 @@ import theodolite.util.Resource
class TestBenchmarkExecutor(val mockResults: Array<Array<Boolean>>): BenchmarkExecutor { class TestBenchmarkExecutor(val mockResults: Array<Array<Boolean>>): BenchmarkExecutor {
override fun runExperiment(load: LoadDimension, res: Resource): Boolean { 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()] return this.mockResults[load.get()][res.get()]
} }
} }
\ No newline at end of file
...@@ -3,10 +3,12 @@ package theodolite.strategies.restriction ...@@ -3,10 +3,12 @@ package theodolite.strategies.restriction
import theodolite.util.Results import theodolite.util.Results
import theodolite.util.LoadDimension import theodolite.util.LoadDimension
import theodolite.util.Resource 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> { 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) { if(lowerBound == null) {
lowerBound = Resource(0) // TODO handle the null case lowerBound = Resource(0) // TODO handle the null case
} }
......
...@@ -4,6 +4,6 @@ import theodolite.util.Results ...@@ -4,6 +4,6 @@ import theodolite.util.Results
import theodolite.util.LoadDimension import theodolite.util.LoadDimension
import theodolite.util.Resource 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>; public abstract fun next(load: LoadDimension, resources: List<Resource>): List<Resource>;
} }
\ No newline at end of file
...@@ -3,9 +3,10 @@ package theodolite.strategies.searchstrategy ...@@ -3,9 +3,10 @@ package theodolite.strategies.searchstrategy
import theodolite.execution.BenchmarkExecutor import theodolite.execution.BenchmarkExecutor
import theodolite.util.LoadDimension import theodolite.util.LoadDimension
import theodolite.util.Resource import theodolite.util.Resource
import theodolite.util.Results
import java.lang.IllegalArgumentException 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? { override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? {
val result = search(load, resources, 0, resources.size - 1) val result = search(load, resources, 0, resources.size - 1)
if( result == -1 ) { if( result == -1 ) {
......
...@@ -4,14 +4,15 @@ import theodolite.execution.BenchmarkExecutor ...@@ -4,14 +4,15 @@ import theodolite.execution.BenchmarkExecutor
import theodolite.strategies.restriction.RestrictionStrategy import theodolite.strategies.restriction.RestrictionStrategy
import theodolite.util.LoadDimension import theodolite.util.LoadDimension
import theodolite.util.Resource 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? { override fun findSuitableResources(load: LoadDimension,resources: List<Resource>): Resource? {
var restrictedResources: List<Resource> = resources var restricted = resources
for (strategy in this.restrictionStrategies) { 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
...@@ -3,12 +3,18 @@ package theodolite.strategies.searchstrategy ...@@ -3,12 +3,18 @@ package theodolite.strategies.searchstrategy
import theodolite.execution.BenchmarkExecutor import theodolite.execution.BenchmarkExecutor
import theodolite.util.LoadDimension import theodolite.util.LoadDimension
import theodolite.util.Resource 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? { override fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource? {
for (res in resources) { 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; return null;
} }
......
...@@ -3,7 +3,8 @@ package theodolite.strategies.searchstrategy ...@@ -3,7 +3,8 @@ package theodolite.strategies.searchstrategy
import theodolite.execution.BenchmarkExecutor import theodolite.execution.BenchmarkExecutor
import theodolite.util.LoadDimension import theodolite.util.LoadDimension
import theodolite.util.Resource 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?; abstract fun findSuitableResources(load: LoadDimension, resources: List<Resource>): Resource?;
} }
\ No newline at end of file
package theodolite.util package theodolite.util
class LoadDimension(val number: Int) { class LoadDimension(val number: Int) { // data class ?
public fun get(): Int { public fun get(): Int {
return this.number; return this.number;
} }
...@@ -14,4 +14,4 @@ class LoadDimension(val number: Int) { ...@@ -14,4 +14,4 @@ class LoadDimension(val number: Int) {
override fun hashCode(): Int { override fun hashCode(): Int {
return this.get().hashCode() return this.get().hashCode()
} }
} }
\ No newline at end of file
...@@ -6,7 +6,7 @@ import kotlin.math.exp ...@@ -6,7 +6,7 @@ import kotlin.math.exp
class Results { class Results {
// load, instances // 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) { public fun setResult(experiment: Pair<LoadDimension, Resource>, successful: Boolean) {
this.results.put(experiment, successful) this.results.put(experiment, successful)
...@@ -16,7 +16,7 @@ class Results { ...@@ -16,7 +16,7 @@ class Results {
return this.results.get(experiment) return this.results.get(experiment)
} }
public fun getRequiredInstances(load: LoadDimension): Resource? { public fun getRequiredInstances(load: LoadDimension?): Resource? {
var requiredInstances: Resource? = null; var requiredInstances: Resource? = null;
for(experiment in results) { for(experiment in results) {
if(experiment.key.first == load && experiment.value){ if(experiment.key.first == load && experiment.value){
...@@ -29,4 +29,20 @@ class Results { ...@@ -29,4 +29,20 @@ class Results {
} }
return requiredInstances 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
...@@ -29,10 +29,10 @@ class CompositeStrategyTest { ...@@ -29,10 +29,10 @@ class CompositeStrategyTest {
val mockLoads: List<LoadDimension> = (0..6).map{number -> LoadDimension(number)} val mockLoads: List<LoadDimension> = (0..6).map{number -> LoadDimension(number)}
val mockResources: List<Resource> = (0..6).map{number -> Resource(number)} val mockResources: List<Resource> = (0..6).map{number -> Resource(number)}
val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults) val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults)
val linearSearch: LinearSearch = LinearSearch(benchmarkExecutor);
val results: Results = Results(); val results: Results = Results();
val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results, mockLoads); val linearSearch: LinearSearch = LinearSearch(benchmarkExecutor, results);
val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, linearSearch, listOf(lowerBoundRestriction)) val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results);
val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, linearSearch, listOf(lowerBoundRestriction), results)
val actual: ArrayList<Resource?> = ArrayList<Resource?>() val actual: ArrayList<Resource?> = ArrayList<Resource?>()
val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)}) val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)})
...@@ -59,10 +59,10 @@ class CompositeStrategyTest { ...@@ -59,10 +59,10 @@ class CompositeStrategyTest {
val mockLoads: List<LoadDimension> = (0..6).map{number -> LoadDimension(number)} val mockLoads: List<LoadDimension> = (0..6).map{number -> LoadDimension(number)}
val mockResources: List<Resource> = (0..6).map{number -> Resource(number)} val mockResources: List<Resource> = (0..6).map{number -> Resource(number)}
val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults) val benchmarkExecutor: TestBenchmarkExecutor = TestBenchmarkExecutor(mockResults)
val binarySearch: BinarySearch = BinarySearch(benchmarkExecutor);
val results: Results = Results(); val results: Results = Results();
val lowerBoundRestriction: LowerBoundRestriction = LowerBoundRestriction(results, mockLoads); val binarySearch: BinarySearch = BinarySearch(benchmarkExecutor, results);
val strategy: CompositeStrategy = CompositeStrategy(benchmarkExecutor, binarySearch, listOf(lowerBoundRestriction)) 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 actual: ArrayList<Resource?> = ArrayList<Resource?>()
val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)}) val expected: ArrayList<Resource?> = ArrayList(listOf(0,2,2,3,4,6).map{ x -> Resource(x)})
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment