diff --git a/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractHandwrittenTestSuite.java b/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractHandwrittenTestSuite.java index 7f7999f90613c30b40d57d3d05412cd3591a26c3..b1b6c575f3109d05c08b57b5fe307945b08c3557 100644 --- a/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractHandwrittenTestSuite.java +++ b/jastadd-mquat-solver/src/test/java/de/tudresden/inf/st/mquat/solving/AbstractHandwrittenTestSuite.java @@ -66,5 +66,14 @@ public abstract class AbstractHandwrittenTestSuite extends HandwrittenTestSuite assertComponentRequirement(config_0i0m0,"other", config_1i0m0); } + @Test + public void test_02_abstract() throws IOException, Parser.Exception, SolvingException { + Tuple<Root, Solution> modelAndSolution = loadAndSolve("test_02_abstract.txt", 3); + assertValidSolution(modelAndSolution); + Assignment config_0i0m0 = assertAssignment(modelAndSolution.getSecondElement(), "rq1", "config_0i0m0", "r0"); + Assignment config_1i0m0 = assertAssignment(modelAndSolution.getSecondElement(), "rq1", "config_1i0m0", "r1"); + assertComponentRequirement(config_0i0m0,"other", config_1i0m0); + } + } diff --git a/jastadd-mquat-solver/src/test/resources/test_02_abstract.txt b/jastadd-mquat-solver/src/test/resources/test_02_abstract.txt new file mode 100644 index 0000000000000000000000000000000000000000..04c382a4e444fef59abbb07841ab34aec6048fde --- /dev/null +++ b/jastadd-mquat-solver/src/test/resources/test_02_abstract.txt @@ -0,0 +1,123 @@ +// One request, two simple components, first requires second one +// Using metaparameter size in clauses +// Expected solution +// Request0: +// config_0i0m0 -> r0 + cpu0_0 +// config_1i0m0 -> r1 + cpu0_1 + +container resource type ComputeNode { + resource type CPU { + property frequency [Hz] + property load [%] + } + property flops [ops/s] +} +resource r0a:ComputeNode { + resource cpu0_0:CPU { + frequency = 2930 + load = 30 + } + flops = 293000 +} +resource r0b:ComputeNode { + resource cpu0_0:CPU { + frequency = 2930 + load = 30 + } + flops = 293000 +} +resource r0c:ComputeNode { + resource cpu0_0:CPU { + frequency = 2930 + load = 30 + } + flops = 293000 +} +resource r0d:ComputeNode { + resource cpu0_0:CPU { + frequency = 2930 + load = 30 + } + flops = 293000 +} +resource r0e:ComputeNode { + resource cpu0_0:CPU { + frequency = 2930 + load = 30 + } + flops = 293000 +} +resource r1:ComputeNode { + resource cpu1_0:CPU { + frequency = 930 + load = 10 + } + flops = 93000 +} +meta size +property energy [J] +property quality [%] + +component c0 { + using property quality + contract config_0i0m0 { + // can run only on r0 + requires component other of type c1 + requires resource compute_resource_0 of type ComputeNode with { + cpu_1 of type CPU + } + requiring other.quality >= 95 + requiring compute_resource_0.cpu_1.frequency >= 2159 + providing quality = 300 + providing energy = ((0.59*(size^2))+(0.89*compute_resource_0.flops)) + } + contract config_0i0m1 { + // not satisfied at all + requires component other of type c1 + requires resource compute_resource_0 of type ComputeNode with { + cpu_1 of type CPU + } + requiring other.quality >= 95 + requiring compute_resource_0.cpu_1.frequency >= 14159 + providing quality = 90 + providing energy = ((0.11*(size^2))+(0.94*compute_resource_0.flops)) + } +} + +component c1 { + using property quality + contract config_1i0m0 { + // can run on both, r0 and r1 + requires resource compute_resource_0 of type ComputeNode with { + cpu_1 of type CPU + } + requiring compute_resource_0.cpu_1.load <= (80 * size) + // fulfills c0 requirement + providing quality = 1004 + providing energy = ((0.45*(size^2))+(0.34*compute_resource_0.flops)) + } + contract config_1i0m1 { + // could run on r1 + requires resource compute_resource_0 of type ComputeNode with { + cpu_1 of type CPU + } + requiring compute_resource_0.cpu_1.load <= (20 * size) + // does not fulfill c0 requirement + providing quality = 3 + providing energy = ((0.25*(size^2))+(0.34*compute_resource_0.flops)) + } + contract config_1i0m2 { + // not satisfied at all + requires resource compute_resource_0 of type ComputeNode with { + cpu_1 of type CPU + } + requiring compute_resource_0.cpu_1.load <= (1 * size) + providing quality = 200 + providing energy = ((0.02*(size^2))+(0.71*compute_resource_0.flops)) + } +} +request rq1 for c0 { + meta size = 1 + requiring quality >= 35 +} +minimize sum(energy)