aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/queries/CpsQueries.vql
diff options
context:
space:
mode:
Diffstat (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/queries/CpsQueries.vql')
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/queries/CpsQueries.vql198
1 files changed, 198 insertions, 0 deletions
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/queries/CpsQueries.vql b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/queries/CpsQueries.vql
new file mode 100644
index 00000000..aa78dc38
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/src/hu/bme/mit/inf/dslreasoner/domains/cps/queries/CpsQueries.vql
@@ -0,0 +1,198 @@
1package hu.bme.mit.inf.dslreasoner.domains.cps.queries
2
3import "http://www.eclipse.org/emf/2002/Ecore"
4import "http://www.example.org/cps"
5
6private pattern cpsApplications(Cps : CyberPhysicalSystem, AppInstance : ApplicationInstance) {
7 CyberPhysicalSystem.applicationTypes.instances(Cps, AppInstance);
8}
9
10private pattern cpsHosts(Cps : CyberPhysicalSystem, HostInstance : HostInstance) {
11 CyberPhysicalSystem.hostTypes.instances(Cps, HostInstance);
12}
13
14private pattern totalMemory(Host : HostInstance, Memory : EInt) {
15 HostInstance.type.defaultMemory(Host, Memory);
16}
17
18private pattern totalHdd(Host : HostInstance, Hdd : EInt) {
19 HostInstance.type.defaultHdd(Host, Hdd);
20}
21
22private pattern availableMemory(Host : HostInstance, Memory : java Integer) {
23 find totalMemory(Host, TotalMemory);
24 RequiredMemory == sum find memoryRequirement(Host, _, #_);
25 Memory == eval(TotalMemory - RequiredMemory);
26}
27
28private pattern memoryRequirement(Host : HostInstance, App : ApplicationInstance, Memory : EInt) {
29 find resourceRequirement(Host, App, Req);
30 ResourceRequirement.requiredMemory(Req, Memory);
31}
32
33private pattern availableHdd(Host : HostInstance, Hdd : java Integer) {
34 find totalHdd(Host, TotalHdd);
35 RequiredHdd == sum find hddRequirement(Host, _, #_);
36 Hdd == eval(TotalHdd - RequiredHdd);
37}
38
39private pattern hddRequirement(Host : HostInstance, App : ApplicationInstance, Hdd : EInt) {
40 find resourceRequirement(Host, App, Req);
41 ResourceRequirement.requiredHdd(Req, Hdd);
42}
43
44pattern resourceRequirement(Host : HostInstance, App : ApplicationInstance, Req : ResourceRequirement) {
45 ApplicationInstance.allocatedTo(App, Host);
46 ApplicationInstance.type.requirements(App, Req);
47 HostInstance.type(Host, HostType);
48 ResourceRequirement.hostType(Req, HostType);
49}
50
51@Constraint(severity = "error", key = {Host, App},
52 message = "Application instance must be allocated to a supported host type.")
53pattern allocationWithoutResourceRequirement(Host : HostInstance, App : ApplicationInstance) {
54 ApplicationInstance.allocatedTo(App, Host);
55 neg find resourceRequirement(Host, App, _);
56}
57
58@Constraint(severity = "error", key = {Host},
59 message = "Insufficient memory available on host.")
60pattern notEnoughAvailableMemory(Host : HostInstance) {
61 find availableMemory(Host, Memory);
62 check(Memory < 0);
63}
64
65@Constraint(severity = "error", key = {Host},
66 message = "Insufficient HDD available on host.")
67pattern notEnoughAvailableHdd(Host : HostInstance) {
68 find availableHdd(Host, Hdd);
69 check(Hdd < 0);
70}
71
72@Constraint(severity = "error", key = {Req, App},
73 message = "Requirement must be satisfied by the required application type.")
74pattern instanceDoesNotSatisfyRequirement(Req : Requirement, App : ApplicationInstance) {
75 Requirement.instances(Req, App);
76 neg find satisfyingInstance(Req, App);
77}
78
79private pattern satisfyingInstance(Req : Requirement, App : ApplicationInstance) {
80 Requirement.instances(Req, App);
81 Requirement.type(Req, Type);
82 ApplicationInstance.type(App, Type);
83}
84
85@Constraint(severity = "error", key = {Req},
86 message = "Requirement is not satisfied by enough application instances.")
87pattern requirementNotSatisfied(Req : Requirement) {
88 Instances == count find satisfyingInstance(Req, _);
89 Requirement.count(Req, RequiredCount);
90 check(Instances < RequiredCount);
91}
92
93@Constraint(severity = "error", key = {Req},
94 message = "Redundant instances must not be allocated to the same host.")
95pattern redundantInstancesOnSameHost(Req : Requirement) {
96 Requirement.instances(Req, App1);
97 Requirement.instances(Req, App2);
98 App1 != App2;
99 ApplicationInstance.allocatedTo(App1, Host);
100 ApplicationInstance.allocatedTo(App2, Host);
101}
102
103//
104// Metrics
105//
106
107// Free memory
108
109pattern averageFreeMemoryMetric(Average : java Double) {
110 Average == avg find freeMemoryPercentage(_, #_);
111}
112
113private pattern freeMemoryPercentage(Host : HostInstance, Free : java Double) {
114 find totalMemory(Host, Total);
115 find availableMemory(Host, Available);
116 Free == eval((Available as double) / Total);
117}
118
119// Free HDD
120
121pattern averageFreeHddMetric(Average : java Double) {
122 Average == avg find freeHddPercentage(_, #_);
123}
124
125private pattern freeHddPercentage(Host : HostInstance, Free : java Double) {
126 find totalHdd(Host, Total);
127 find availableHdd(Host, Available);
128 Free == eval((Available as double) / Total);
129}
130
131// Total cost
132
133pattern costMetric(Cost : java Integer) {
134 Cost == sum find cpsCost(_, #_);
135}
136
137pattern cpsCost(Cps : CyberPhysicalSystem, Cost : java Integer) {
138 AppCount == count find cpsApplications(Cps, _);
139 HostCost == sum find hostInstanceCost(Cps, _, #_);
140 Cost == eval(5 * AppCount + HostCost);
141}
142
143private pattern hostInstanceCost(Cps : CyberPhysicalSystem, Host : HostInstance, Cost : EInt) {
144 find cpsHosts(Cps, Host);
145 HostInstance.type.cost(Host, Cost);
146}
147
148//
149// Transformation rule preconditions for rule-based DSE
150//
151
152pattern allocate(App : ApplicationInstance, Host : HostInstance) {
153 ApplicationInstance.type.requirements(App, Req);
154 ResourceRequirement.hostType.instances(Req, Host);
155 find unallocatedAppInstance(App);
156 find availableMemory(Host, AvailableMem);
157 find availableHdd(Host, AvailableHdd);
158 ResourceRequirement.requiredMemory(Req, RequiredMem);
159 ResourceRequirement.requiredHdd(Req, RequiredHdd);
160 check(AvailableMem >= RequiredMem);
161 check(AvailableHdd >= RequiredHdd);
162 neg ApplicationInstance.requirement.instances.allocatedTo(App, Host);
163}
164
165pattern unallocateAppInstance(App : ApplicationInstance) {
166 ApplicationInstance.allocatedTo(App, _);
167}
168
169pattern createHostInstance(HostType : HostType) {
170 find unallocatedAppInstance(App);
171 ApplicationInstance.type.requirements.hostType(App, HostType);
172}
173
174pattern removeHostInstance(HostInstance : HostInstance) {
175 neg HostInstance.applications(HostInstance, _);
176}
177
178private pattern unallocatedAppInstance(App : ApplicationInstance) {
179 neg ApplicationInstance.allocatedTo(App, _);
180}
181
182private pattern requiredAppInstances(Req : Requirement, Remaining : java Integer) {
183 Instances == count find satisfyingInstance(Req, _);
184 Requirement.count(Req, RequiredCount);
185 Remaining == eval(RequiredCount - Instances);
186}
187
188private pattern noHostToAllocateTo(App : ApplicationInstance) {
189 find unallocatedAppInstance(App);
190 neg find allocate(App, _);
191}
192
193pattern guidanceObjective(Value : java Integer) {
194 UnallocatedInstances == count find unallocatedAppInstance(_);
195 RequiredInstances == sum find requiredAppInstances(_, #_);
196 NoHostToAllocate == count find noHostToAllocateTo(_);
197 Value == eval(2 * UnallocatedInstances + 4 * RequiredInstances + NoHostToAllocate);
198}