aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kris7topher@gmail.com>2019-06-08 19:17:34 -0400
committerLibravatar Kristóf Marussy <kris7topher@gmail.com>2019-06-08 19:17:34 -0400
commitb21af04ea821c3daa9ce8a6d26c63e9cd198f9a5 (patch)
tree4be566b25415ca97cb007b5da7d89f216ef515b2 /Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql
parentMerge remote-tracking branch 'origin/master' into kris (diff)
downloadVIATRA-Generator-b21af04ea821c3daa9ce8a6d26c63e9cd198f9a5.tar.gz
VIATRA-Generator-b21af04ea821c3daa9ce8a6d26c63e9cd198f9a5.tar.zst
VIATRA-Generator-b21af04ea821c3daa9ce8a6d26c63e9cd198f9a5.zip
Trying to simplify Satellite case study
Diffstat (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql')
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql378
1 files changed, 169 insertions, 209 deletions
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql
index 9b77ef72..557c1172 100644
--- a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql
@@ -55,28 +55,42 @@ private pattern indirectLinkAllowed(From : Spacecraft, To : CommunicatingElement
55} 55}
56 56
57private pattern linkAllowed(From : Spacecraft, To : CommunicatingElement) { 57private pattern linkAllowed(From : Spacecraft, To : CommunicatingElement) {
58 find matchingAntenna(From, To, _); 58 find matchingAntenna(From, To);
59 neg find cubeSat3U(From); 59 neg find cubeSat3U(From);
60} or { 60} or {
61 find matchingAntenna(From, To, TransceiverBand::UHF); 61 find matchingAntenna(From, To);
62 CubeSat3U(From); 62 CubeSat3U(From);
63} or { 63} or {
64 find matchingAntenna(From, To, _); 64 find matchingAntenna(From, To);
65 CubeSat3U(From); 65 CubeSat3U(From);
66 GroundStationNetwork(To); 66 GroundStationNetwork(To);
67} 67}
68 68
69private pattern matchingAntenna(From : Spacecraft, To : CommunicatingElement, Band : TransceiverBand) { 69private pattern matchingAntenna(From : Spacecraft, To : CommunicatingElement) {
70 CommunicatingElement.commSubsystem.band(From, Band); 70 CommunicatingElement.commSubsystem(From, FromSys);
71 CommunicatingElement.commSubsystem.band(To, Band); 71 CommunicatingElement.commSubsystem(To, ToSys);
72 CommunicatingElement.commSubsystem.gain(From, Gain); 72 find matchingCommSubsystem(FromSys, ToSys);
73 CommunicatingElement.commSubsystem.gain(To, Gain); 73}
74
75private pattern matchingCommSubsystem(From : CommSubsystem, To : CommSubsystem) {
76 UHFCommSubsystem(From);
77 UHFCommSubsystem(To);
78} or {
79 XCommSubsystem(From);
80 XCommSubsystem(To);
81} or {
82 KaCommSubsystem(From);
83 KaCommSubsystem(To);
74} 84}
75 85
76private pattern cubeSat3U(Sat : CubeSat3U) { 86private pattern cubeSat3U(Sat : CubeSat3U) {
77 CubeSat3U(Sat); 87 CubeSat3U(Sat);
78} 88}
79 89
90private pattern cubeSat6U(Sat : CubeSat6U) {
91 CubeSat6U(Sat);
92}
93
80// No communication loops may exist 94// No communication loops may exist
81// No spacecraft may directly communicate with itself 95// No spacecraft may directly communicate with itself
82 96
@@ -104,63 +118,7 @@ private pattern directCommunicationLink(Source : CommunicatingElement, Target :
104pattern incompatibleSourceAndTargetBand(Link : DirectedCommunicationLink) { 118pattern incompatibleSourceAndTargetBand(Link : DirectedCommunicationLink) {
105 DirectedCommunicationLink.source(Link, SourceSubsystem); 119 DirectedCommunicationLink.source(Link, SourceSubsystem);
106 DirectedCommunicationLink.target(Link, TargetSubsystem); 120 DirectedCommunicationLink.target(Link, TargetSubsystem);
107 CommSubsystem.band(SourceSubsystem, Band); 121 neg find matchingCommSubsystem(SourceSubsystem, TargetSubsystem);
108 neg find commSubsystemBand(TargetSubsystem, Band);
109}
110
111private pattern commSubsystemBand(Comm : CommSubsystem, Band : TransceiverBand) {
112 CommSubsystem.band(Comm, Band);
113}
114
115@Constraint(severity = "error", key = {Link},
116 message = "Two ends of a communication link must use the same antenna gain.")
117pattern incompatibleSourceAndTargetGain(Link : DirectedCommunicationLink) {
118 DirectedCommunicationLink.source(Link, SourceSubsystem);
119 DirectedCommunicationLink.target(Link, TargetSubsystem);
120 CommSubsystem.gain(SourceSubsystem, Gain);
121 neg find commSubsystemGain(TargetSubsystem, Gain);
122}
123
124private pattern commSubsystemGain(Comm : CommSubsystem, Gain : AntennaGain) {
125 CommSubsystem.gain(Comm, Gain);
126}
127
128// UHF-band transmitters may only be combined with a low gain antenna
129
130@Constraint(severity = "error", key = {Comm},
131 message = "UHF transceiver must be combined with a low gain antenna.")
132pattern uhfAntennaGainNotLow(Comm : CommSubsystem) {
133 CommSubsystem.band(Comm, TransceiverBand::UHF);
134 // VIATRA will fail to infer a type constraint for the virtual variable introduced
135 // when an enum literal appears in a negative pattern call, so we use a helper pattern
136 // instead of neg find commSubsystemGain(Comm, AntennaGain::LOW);
137 neg find commSubsystemGainLow(Comm);
138}
139
140private pattern commSubsystemGainLow(Comm : CommSubsystem) {
141 CommSubsystem.gain(Comm, AntennaGain::LOW);
142}
143
144// X-band transmitters may only be combined with a medium gain antenna
145
146@Constraint(severity = "error", key = {Comm},
147 message = "X-band transceiver must be combined with a medium gain antenna.")
148pattern xAntennaGainNotMedium(Comm : CommSubsystem) {
149 CommSubsystem.band(Comm, TransceiverBand::X);
150 neg find commSubsystemGainMedium(Comm);
151}
152
153private pattern commSubsystemGainMedium(Comm : CommSubsystem) {
154 CommSubsystem.gain(Comm, AntennaGain::MEDIUM);
155}
156
157// Ka-band transmitters may only be combined with a medium or high gain antenna
158
159@Constraint(severity = "error", key = {Comm},
160 message = "Ka-band transceiver must be combined with a medium or high gain antenna.")
161pattern kaAntennaGainLow(Comm : CommSubsystem) {
162 CommSubsystem.band(Comm, TransceiverBand::Ka);
163 CommSubsystem.gain(Comm, AntennaGain::LOW);
164} 122}
165 123
166// 3U CubeSats are assumed to only be able to downlink to Earth using an X-band trasmitter, 124// 3U CubeSats are assumed to only be able to downlink to Earth using an X-band trasmitter,
@@ -177,8 +135,8 @@ pattern threeUCubeSatWithNonUhfCrossLink(Sat : CubeSat3U) {
177 neg find groundStationNetwork(Target); 135 neg find groundStationNetwork(Target);
178} 136}
179 137
180private pattern commSubsystemBandUhf(Comm : CommSubsystem) { 138private pattern commSubsystemBandUhf(Comm : UHFCommSubsystem) {
181 CommSubsystem.band(Comm, TransceiverBand::UHF); 139 UHFCommSubsystem(Comm);
182} 140}
183 141
184private pattern groundStationNetwork(Network : GroundStationNetwork) { 142private pattern groundStationNetwork(Network : GroundStationNetwork) {
@@ -190,7 +148,8 @@ private pattern groundStationNetwork(Network : GroundStationNetwork) {
190@Constraint(severity = "error", key = {Spacecraft}, 148@Constraint(severity = "error", key = {Spacecraft},
191 message = "Only a Small Satellite can be configured with a Ka-band communication system.") 149 message = "Only a Small Satellite can be configured with a Ka-band communication system.")
192pattern cubeSatWithKaAntenna(Spacecraft : Spacecraft) { 150pattern cubeSatWithKaAntenna(Spacecraft : Spacecraft) {
193 CommunicatingElement.commSubsystem.band(Spacecraft, TransceiverBand::Ka); 151 CommunicatingElement.commSubsystem(Spacecraft, Comm);
152 KaCommSubsystem(Comm);
194 neg find smallSat(Spacecraft); 153 neg find smallSat(Spacecraft);
195} 154}
196 155
@@ -198,146 +157,147 @@ pattern smallSat(Sat : SmallSat) {
198 SmallSat(Sat); 157 SmallSat(Sat);
199} 158}
200 159
201@QueryBasedFeature(feature = "kind") 160////
202pattern spacecraftOfKind(Spacecraft : Spacecraft, Kind : SpacecraftKind) { 161//// Metrics
203 CubeSat3U(Spacecraft); 162////
204 Kind == SpacecraftKind::CubeSat3U;
205} or {
206 CubeSat6U(Spacecraft);
207 Kind == SpacecraftKind::CubeSat6U;
208} or {
209 SmallSat(Spacecraft);
210 Kind == SpacecraftKind::SmallSat;
211}
212
213
214// 163//
215// Metrics 164//// Coverage
216// 165//
217 166//pattern coverageMetric(Coverage : java Double) {
218// Coverage 167// Coverage == sum find missionCoverage(_, #_);
219 168//}
220pattern coverageMetric(Coverage : java Double) { 169//
221 Coverage == sum find missionCoverage(_, #_); 170//private pattern missionCoverage(Mission : InterferometryMission, Coverage : java Double) {
222} 171// InterferometryMission.observationTime(Mission, ObservationTime);
223 172// ObserverCount == count find spacecraftWithInterferometryPayload(Mission, _);
224private pattern missionCoverage(Mission : InterferometryMission, Coverage : java Double) { 173// Coverage == eval(Math.pow(1 - 2.0 / ObserverCount, 1 + 9 * (1.0 / ObservationTime)) + 0.05 * ObservationTime / 3);
225 InterferometryMission.observationTime(Mission, ObservationTime); 174//}
226 ObserverCount == count find spacecraftWithInterferometryPayload(Mission, _); 175//
227 Coverage == eval(Math.pow(1 - 2.0 / ObserverCount, 1 + 9 * (1.0 / ObservationTime)) + 0.05 * ObservationTime / 3); 176//// Time
228} 177//
229 178//pattern timeMetric(Time : java Double) {
230// Time 179// Time == sum find missionTime(_, #_);
231 180//}
232pattern timeMetric(Time : java Double) { 181//
233 Time == sum find missionTime(_, #_); 182//private pattern missionTime(Mission : InterferometryMission, Time : java Double) {
234} 183// InterferometryMission.observationTime(Mission, ObservationTime);
235 184// TrasmitTime == sum find transmitTime(Mission, _, #_);
236private pattern missionTime(Mission : InterferometryMission, Time : java Double) { 185// Time == eval(TrasmitTime + 60.0 * ObservationTime);
237 InterferometryMission.observationTime(Mission, ObservationTime); 186//}
238 TrasmitTime == sum find transmitTime(Mission, _, #_); 187//
239 Time == eval(TrasmitTime + 60.0 * ObservationTime); 188//private pattern transmitTime(Mission : InterferometryMission, Spacecraft : Spacecraft, TransmitTime : java Double) {
240} 189// ConstellationMission.spacecraft(Mission, Spacecraft);
241 190// find scienceData(Spacecraft, ScienceData);
242private pattern transmitTime(Mission : InterferometryMission, Spacecraft : Spacecraft, TransmitTime : java Double) { 191// IncomingData == sum find incomingData(Spacecraft, _, #_);
243 ConstellationMission.spacecraft(Mission, Spacecraft); 192// find transmitRate(Spacecraft, TransmitRate);
244 find scienceData(Spacecraft, ScienceData); 193// TransmitTime == eval((ScienceData + IncomingData) / (7.5 * TransmitRate));
245 IncomingData == sum find incomingData(Spacecraft, _, #_); 194//}
246 find transmitRate(Spacecraft, TransmitRate); 195//
247 TransmitTime == eval((ScienceData + IncomingData) / (7.5 * TransmitRate)); 196//private pattern incomingData(Spacecraft : Spacecraft, Source : Spacecraft, Data : java Double) {
248} 197// find indirectCommunicationLink(Source, Spacecraft);
249 198// find scienceData(Source, Data);
250private pattern incomingData(Spacecraft : Spacecraft, Source : Spacecraft, Data : java Double) { 199//}
251 find indirectCommunicationLink(Source, Spacecraft); 200//
252 find scienceData(Source, Data); 201//private pattern scienceData(Spacecraft : Spacecraft, Data : java Double) {
253} 202// ConstellationMission.spacecraft(Mission, Spacecraft);
254 203// InterferometryMission.observationTime(Mission, ObservationTime);
255private pattern scienceData(Spacecraft : Spacecraft, Data : java Double) { 204// Data == eval(12.0 * ObservationTime);
256 ConstellationMission.spacecraft(Mission, Spacecraft); 205//}
257 InterferometryMission.observationTime(Mission, ObservationTime); 206//
258 Data == eval(12.0 * ObservationTime); 207//private pattern transmitRate(Spacecraft : Spacecraft, TransmitRate : java Double) {
259} 208// find spacecraftUplink(Spacecraft, Comm, Target);
260 209// UHFCommSubsystem(Comm);
261private pattern transmitRate(Spacecraft : Spacecraft, TransmitRate : java Double) { 210// Spacecraft(Target);
262 find spacecraftUplink(Spacecraft, TransceiverBand::UHF, Target); 211// TransmitRate == 5.0;
263 Spacecraft(Target); 212//} or {
264 TransmitRate == 5.0; 213// find spacecraftUplink(Spacecraft, Comm, Target);
265} or { 214// XCommSubsystem(Comm);
266 find spacecraftUplink(Spacecraft, TransceiverBand::X, Target); 215// Spacecraft(Target);
267 Spacecraft(Target); 216// TransmitRate == 1.6;
268 TransmitRate == 1.6; 217//} or {
269} or { 218// find spacecraftUplink(Spacecraft, Comm, Target);
270 find spacecraftUplink(Spacecraft, TransceiverBand::X, Target); 219// XCommSubsystem(Comm);
271 GroundStationNetwork(Target); 220// GroundStationNetwork(Target);
272 TransmitRate == 0.7; 221// TransmitRate == 0.7;
273} or { 222//} or {
274 find spacecraftUplink(Spacecraft, TransceiverBand::Ka, Target); 223// find spacecraftUplink(Spacecraft, Comm, Target);
275 Spacecraft(Target); 224// KaCommSubsystem(Comm);
276 TransmitRate == 220.0; 225// Spacecraft(Target);
277} or { 226// TransmitRate == 220.0;
278 find spacecraftUplink(Spacecraft, TransceiverBand::Ka, Target); 227//} or {
279 GroundStationNetwork(Target); 228// find spacecraftUplink(Spacecraft, Comm, Target);
280 TransmitRate == 80.0; 229// KaCommSubsystem(Comm);
281} 230// GroundStationNetwork(Target);
282 231// TransmitRate == 80.0;
283private pattern spacecraftUplink(Spacecraft : Spacecraft, Band : TransceiverBand, Target : CommunicatingElement) { 232//}
284 CommunicatingElement.communicationLink(Spacecraft, Link); 233//
285 DirectedCommunicationLink.source.band(Link, Band); 234//private pattern spacecraftUplink(Spacecraft : Spacecraft, TargetSubsystem : CommSubsystem, Target : CommunicatingElement) {
286 DirectedCommunicationLink.target(Link, TargetSubsystem); 235// CommunicatingElement.communicationLink(Spacecraft, Link);
287 CommunicatingElement.commSubsystem(Target, TargetSubsystem); 236// DirectedCommunicationLink.target(Link, TargetSubsystem);
288} 237// CommunicatingElement.commSubsystem(Target, TargetSubsystem);
289 238//}
290// Cost 239//
291 240//// Cost
292pattern costMetric(Cost : java Double) { 241//
293 Cost == sum find missionCost(_, #_); 242//pattern costMetric(Cost : java Double) {
294} 243// Cost == sum find missionCost(_, #_);
295 244//}
296private pattern missionCost(Mission : InterferometryMission, Cost : java Double) { 245//
297 InterferometryMission.observationTime(Mission, ObservationTime); 246//private pattern missionCost(Mission : InterferometryMission, Cost : java Double) {
298 SpacecraftCost == sum find spacecraftCost(Mission, _, #_); 247// InterferometryMission.observationTime(Mission, ObservationTime);
299 Cost == eval(SpacecraftCost + 100000.0 * ObservationTime); 248// SpacecraftCost == sum find spacecraftCost(Mission, _, #_);
300} 249// Cost == eval(SpacecraftCost + 100000.0 * ObservationTime);
301 250//}
302private pattern spacecraftCost(Mission : InterferometryMission, Spacecraft : Spacecraft, Cost : java Double) { 251//
303 ConstellationMission.spacecraft(Mission, Spacecraft); 252//private pattern spacecraftCost(Mission : InterferometryMission, Spacecraft : Spacecraft, Cost : java Double) {
304 find spacecraftOfKind(Spacecraft, Kind); 253// ConstellationMission.spacecraft(Mission, Spacecraft);
305 KindCount == count find spacecraftOfKind(_, Kind); 254// find spacecraftOfKindCount(Spacecraft, KindCount);
306 find basePrice(Spacecraft, BasePrice); 255// find basePrice(Spacecraft, BasePrice);
307 find interferometryPayloadCost(Spacecraft, InterferometryPayloadCost); 256// find interferometryPayloadCost(Spacecraft, InterferometryPayloadCost);
308 find additionalCommSubsystemCost(Spacecraft, AdditionalCommSubsystemCost); 257// find additionalCommSubsystemCost(Spacecraft, AdditionalCommSubsystemCost);
309 Cost == eval(BasePrice * Math.pow(KindCount, -0.25) + InterferometryPayloadCost + AdditionalCommSubsystemCost); 258// Cost == eval(BasePrice * Math.pow(KindCount, -0.25) + InterferometryPayloadCost + AdditionalCommSubsystemCost);
310} 259//}
311 260//
312private pattern basePrice(Spacecraft : Spacecraft, BasePrice : java Double) { 261//private pattern spacecraftOfKindCount(Sat : Spacecraft, Count : java Integer) {
313 CubeSat3U(Spacecraft); 262// CubeSat3U(Sat);
314 BasePrice == 250000.0; 263// Count == count find cubeSat3U(_);
315} or { 264//} or {
316 CubeSat6U(Spacecraft); 265// CubeSat6U(Sat);
317 BasePrice == 750000.0; 266// Count == count find cubeSat6U(_);
318} or { 267//} or {
319 SmallSat(Spacecraft); 268// SmallSat(Sat);
320 BasePrice == 3000000.0; 269// Count == count find smallSat(_);
321} 270//}
322 271//
323private pattern interferometryPayloadCost(Spacecraft : Spacecraft, Cost : java Double) { 272//private pattern basePrice(Spacecraft : Spacecraft, BasePrice : java Double) {
324 find spacecraftWithInterferometryPayload(_, Spacecraft); 273// CubeSat3U(Spacecraft);
325 Cost == 50000.0; 274// BasePrice == 250000.0;
326} or { 275//} or {
327 neg find spacecraftWithInterferometryPayload(_, Spacecraft); 276// CubeSat6U(Spacecraft);
328 Cost == 0.0; 277// BasePrice == 750000.0;
329} 278//} or {
330 279// SmallSat(Spacecraft);
331private pattern additionalCommSubsystemCost(Spacecraft : Spacecraft, Cost : java Double) { 280// BasePrice == 3000000.0;
332 find spacecraftWithTwoCommSubsystems(Spacecraft); 281//}
333 Cost == 100000.0; 282//
334} or { 283//private pattern interferometryPayloadCost(Spacecraft : Spacecraft, Cost : java Double) {
335 neg find spacecraftWithTwoCommSubsystems(Spacecraft); 284// find spacecraftWithInterferometryPayload(_, Spacecraft);
336 Cost == 0.0; 285// Cost == 50000.0;
337} 286//} or {
338 287// neg find spacecraftWithInterferometryPayload(_, Spacecraft);
339private pattern spacecraftWithTwoCommSubsystems(Spacecraft : Spacecraft) { 288// Cost == 0.0;
340 Spacecraft.commSubsystem(Spacecraft, Subsystem1); 289//}
341 Spacecraft.commSubsystem(Spacecraft, Subsystem2); 290//
342 Subsystem1 != Subsystem2; 291//private pattern additionalCommSubsystemCost(Spacecraft : Spacecraft, Cost : java Double) {
343} 292// find spacecraftWithTwoCommSubsystems(Spacecraft);
293// Cost == 100000.0;
294//} or {
295// neg find spacecraftWithTwoCommSubsystems(Spacecraft);
296// Cost == 0.0;
297//}
298//
299//private pattern spacecraftWithTwoCommSubsystems(Spacecraft : Spacecraft) {
300// Spacecraft.commSubsystem(Spacecraft, Subsystem1);
301// Spacecraft.commSubsystem(Spacecraft, Subsystem2);
302// Subsystem1 != Subsystem2;
303//} \ No newline at end of file