aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains
diff options
context:
space:
mode:
Diffstat (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains')
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql343
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/runner/SatelliteGeneratorMain.xtend13
2 files changed, 356 insertions, 0 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
new file mode 100644
index 00000000..9b77ef72
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql
@@ -0,0 +1,343 @@
1package hu.bme.mit.inf.dslreasoner.domains.satellite.queries
2
3import "http://www.example.org/satellite"
4
5@Constraint(severity = "error", key = {Link},
6 message = "Communication links must start from the containing element.")
7pattern communicationLinkDoesNotStartAtContainingElement(Link : DirectedCommunicationLink) {
8 CommunicatingElement.communicationLink(Element, Link);
9 DirectedCommunicationLink.source(Link, SourceComm);
10 CommunicatingElement.commSubsystem(SourceElement, SourceComm);
11 Element != SourceElement;
12}
13
14// At least two spacecraft must have the interferometry payload configured
15
16@Constraint(severity = "error", key = {Mission},
17 message = "Interferometry mission needs at least two spacecraft configured with the interferometry payload.")
18pattern notEnoughInterferometryPayloads(Mission : InterferometryMission) {
19 InterferometryMission(Mission);
20 neg find atLeastTwoInterferometryPayloads(Mission);
21}
22
23private pattern atLeastTwoInterferometryPayloads(Mission : InterferometryMission) {
24 find spacecraftWithInterferometryPayload(Mission, Spacecraft1);
25 find spacecraftWithInterferometryPayload(Mission, Spacecraft2);
26 Spacecraft1 != Spacecraft2;
27}
28
29private pattern spacecraftWithInterferometryPayload(Mission : ConstellationMission, Spacecraft : Spacecraft) {
30 ConstellationMission.spacecraft(Mission, Spacecraft);
31 Spacecraft.payload(Spacecraft, Payload);
32 InterferometryPayload(Payload);
33}
34
35// All spacecraft must have some communication path to the ground station
36
37@Constraint(severity = "error", key = {Spacecraft},
38 message = "Spacecraft has no communication path to the ground station.")
39pattern noLinkToGroundStation(Spacecraft : Spacecraft) {
40 ConstellationMission.groundStationNetwork(Mission, GroundStation);
41 ConstellationMission.spacecraft(Mission, Spacecraft);
42 neg find indirectCommunicationLink(Spacecraft, GroundStation);
43}
44
45@Constraint(severity = "error", key = {Spacecraft},
46 message = "Spacecraft has no potential communication path to the ground station.")
47pattern noPotentialLinkToGroundStation(Spacecraft : Spacecraft) {
48 ConstellationMission.groundStationNetwork(Mission, GroundStation);
49 ConstellationMission.spacecraft(Mission, Spacecraft);
50 neg find indirectLinkAllowed(Spacecraft, GroundStation);
51}
52
53private pattern indirectLinkAllowed(From : Spacecraft, To : CommunicatingElement) {
54 find linkAllowed+(From, To);
55}
56
57private pattern linkAllowed(From : Spacecraft, To : CommunicatingElement) {
58 find matchingAntenna(From, To, _);
59 neg find cubeSat3U(From);
60} or {
61 find matchingAntenna(From, To, TransceiverBand::UHF);
62 CubeSat3U(From);
63} or {
64 find matchingAntenna(From, To, _);
65 CubeSat3U(From);
66 GroundStationNetwork(To);
67}
68
69private pattern matchingAntenna(From : Spacecraft, To : CommunicatingElement, Band : TransceiverBand) {
70 CommunicatingElement.commSubsystem.band(From, Band);
71 CommunicatingElement.commSubsystem.band(To, Band);
72 CommunicatingElement.commSubsystem.gain(From, Gain);
73 CommunicatingElement.commSubsystem.gain(To, Gain);
74}
75
76private pattern cubeSat3U(Sat : CubeSat3U) {
77 CubeSat3U(Sat);
78}
79
80// No communication loops may exist
81// No spacecraft may directly communicate with itself
82
83@Constraint(severity = "error", key = {Element},
84 message = "Communication loop.")
85pattern communicationLoop(Element : CommunicatingElement) {
86 find indirectCommunicationLink(Element, Element);
87}
88
89private pattern indirectCommunicationLink(Source : CommunicatingElement, Target : CommunicatingElement) {
90 find directCommunicationLink+(Source, Target);
91}
92
93private pattern directCommunicationLink(Source : CommunicatingElement, Target : CommunicatingElement) {
94 DirectedCommunicationLink.source(Link, SourceSubsystem);
95 DirectedCommunicationLink.target(Link, TargetSubsystem);
96 CommunicatingElement.commSubsystem(Source, SourceSubsystem);
97 CommunicatingElement.commSubsystem(Target, TargetSubsystem);
98}
99
100// Source and target communication systems must be compatible.
101
102@Constraint(severity = "error", key = {Link},
103 message = "Two ends of a communication link must use the same band.")
104pattern incompatibleSourceAndTargetBand(Link : DirectedCommunicationLink) {
105 DirectedCommunicationLink.source(Link, SourceSubsystem);
106 DirectedCommunicationLink.target(Link, TargetSubsystem);
107 CommSubsystem.band(SourceSubsystem, Band);
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}
165
166// 3U CubeSats are assumed to only be able to downlink to Earth using an X-band trasmitter,
167// but cross-link using UHF
168
169@Constraint(severity = "error", key = {Sat},
170 message = "3U CubeSats can only cross-link using UHF.")
171pattern threeUCubeSatWithNonUhfCrossLink(Sat : CubeSat3U) {
172 CommunicatingElement.commSubsystem(Sat, SourceComm);
173 neg find commSubsystemBandUhf(SourceComm);
174 DirectedCommunicationLink.source(Link, SourceComm);
175 DirectedCommunicationLink.target(Link, TargetComm);
176 CommunicatingElement.commSubsystem(Target, TargetComm);
177 neg find groundStationNetwork(Target);
178}
179
180private pattern commSubsystemBandUhf(Comm : CommSubsystem) {
181 CommSubsystem.band(Comm, TransceiverBand::UHF);
182}
183
184private pattern groundStationNetwork(Network : GroundStationNetwork) {
185 GroundStationNetwork(Network);
186}
187
188// Only a Small Satellite can be configured with a Ka-band communication system
189
190@Constraint(severity = "error", key = {Spacecraft},
191 message = "Only a Small Satellite can be configured with a Ka-band communication system.")
192pattern cubeSatWithKaAntenna(Spacecraft : Spacecraft) {
193 CommunicatingElement.commSubsystem.band(Spacecraft, TransceiverBand::Ka);
194 neg find smallSat(Spacecraft);
195}
196
197pattern smallSat(Sat : SmallSat) {
198 SmallSat(Sat);
199}
200
201@QueryBasedFeature(feature = "kind")
202pattern spacecraftOfKind(Spacecraft : Spacecraft, Kind : SpacecraftKind) {
203 CubeSat3U(Spacecraft);
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//
215// Metrics
216//
217
218// Coverage
219
220pattern coverageMetric(Coverage : java Double) {
221 Coverage == sum find missionCoverage(_, #_);
222}
223
224private pattern missionCoverage(Mission : InterferometryMission, Coverage : java Double) {
225 InterferometryMission.observationTime(Mission, ObservationTime);
226 ObserverCount == count find spacecraftWithInterferometryPayload(Mission, _);
227 Coverage == eval(Math.pow(1 - 2.0 / ObserverCount, 1 + 9 * (1.0 / ObservationTime)) + 0.05 * ObservationTime / 3);
228}
229
230// Time
231
232pattern timeMetric(Time : java Double) {
233 Time == sum find missionTime(_, #_);
234}
235
236private pattern missionTime(Mission : InterferometryMission, Time : java Double) {
237 InterferometryMission.observationTime(Mission, ObservationTime);
238 TrasmitTime == sum find transmitTime(Mission, _, #_);
239 Time == eval(TrasmitTime + 60.0 * ObservationTime);
240}
241
242private pattern transmitTime(Mission : InterferometryMission, Spacecraft : Spacecraft, TransmitTime : java Double) {
243 ConstellationMission.spacecraft(Mission, Spacecraft);
244 find scienceData(Spacecraft, ScienceData);
245 IncomingData == sum find incomingData(Spacecraft, _, #_);
246 find transmitRate(Spacecraft, TransmitRate);
247 TransmitTime == eval((ScienceData + IncomingData) / (7.5 * TransmitRate));
248}
249
250private pattern incomingData(Spacecraft : Spacecraft, Source : Spacecraft, Data : java Double) {
251 find indirectCommunicationLink(Source, Spacecraft);
252 find scienceData(Source, Data);
253}
254
255private pattern scienceData(Spacecraft : Spacecraft, Data : java Double) {
256 ConstellationMission.spacecraft(Mission, Spacecraft);
257 InterferometryMission.observationTime(Mission, ObservationTime);
258 Data == eval(12.0 * ObservationTime);
259}
260
261private pattern transmitRate(Spacecraft : Spacecraft, TransmitRate : java Double) {
262 find spacecraftUplink(Spacecraft, TransceiverBand::UHF, Target);
263 Spacecraft(Target);
264 TransmitRate == 5.0;
265} or {
266 find spacecraftUplink(Spacecraft, TransceiverBand::X, Target);
267 Spacecraft(Target);
268 TransmitRate == 1.6;
269} or {
270 find spacecraftUplink(Spacecraft, TransceiverBand::X, Target);
271 GroundStationNetwork(Target);
272 TransmitRate == 0.7;
273} or {
274 find spacecraftUplink(Spacecraft, TransceiverBand::Ka, Target);
275 Spacecraft(Target);
276 TransmitRate == 220.0;
277} or {
278 find spacecraftUplink(Spacecraft, TransceiverBand::Ka, Target);
279 GroundStationNetwork(Target);
280 TransmitRate == 80.0;
281}
282
283private pattern spacecraftUplink(Spacecraft : Spacecraft, Band : TransceiverBand, Target : CommunicatingElement) {
284 CommunicatingElement.communicationLink(Spacecraft, Link);
285 DirectedCommunicationLink.source.band(Link, Band);
286 DirectedCommunicationLink.target(Link, TargetSubsystem);
287 CommunicatingElement.commSubsystem(Target, TargetSubsystem);
288}
289
290// Cost
291
292pattern costMetric(Cost : java Double) {
293 Cost == sum find missionCost(_, #_);
294}
295
296private pattern missionCost(Mission : InterferometryMission, Cost : java Double) {
297 InterferometryMission.observationTime(Mission, ObservationTime);
298 SpacecraftCost == sum find spacecraftCost(Mission, _, #_);
299 Cost == eval(SpacecraftCost + 100000.0 * ObservationTime);
300}
301
302private pattern spacecraftCost(Mission : InterferometryMission, Spacecraft : Spacecraft, Cost : java Double) {
303 ConstellationMission.spacecraft(Mission, Spacecraft);
304 find spacecraftOfKind(Spacecraft, Kind);
305 KindCount == count find spacecraftOfKind(_, Kind);
306 find basePrice(Spacecraft, BasePrice);
307 find interferometryPayloadCost(Spacecraft, InterferometryPayloadCost);
308 find additionalCommSubsystemCost(Spacecraft, AdditionalCommSubsystemCost);
309 Cost == eval(BasePrice * Math.pow(KindCount, -0.25) + InterferometryPayloadCost + AdditionalCommSubsystemCost);
310}
311
312private pattern basePrice(Spacecraft : Spacecraft, BasePrice : java Double) {
313 CubeSat3U(Spacecraft);
314 BasePrice == 250000.0;
315} or {
316 CubeSat6U(Spacecraft);
317 BasePrice == 750000.0;
318} or {
319 SmallSat(Spacecraft);
320 BasePrice == 3000000.0;
321}
322
323private pattern interferometryPayloadCost(Spacecraft : Spacecraft, Cost : java Double) {
324 find spacecraftWithInterferometryPayload(_, Spacecraft);
325 Cost == 50000.0;
326} or {
327 neg find spacecraftWithInterferometryPayload(_, Spacecraft);
328 Cost == 0.0;
329}
330
331private pattern additionalCommSubsystemCost(Spacecraft : Spacecraft, Cost : java Double) {
332 find spacecraftWithTwoCommSubsystems(Spacecraft);
333 Cost == 100000.0;
334} or {
335 neg find spacecraftWithTwoCommSubsystems(Spacecraft);
336 Cost == 0.0;
337}
338
339private pattern spacecraftWithTwoCommSubsystems(Spacecraft : Spacecraft) {
340 Spacecraft.commSubsystem(Spacecraft, Subsystem1);
341 Spacecraft.commSubsystem(Spacecraft, Subsystem2);
342 Subsystem1 != Subsystem2;
343}
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/runner/SatelliteGeneratorMain.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/runner/SatelliteGeneratorMain.xtend
new file mode 100644
index 00000000..592348e8
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/runner/SatelliteGeneratorMain.xtend
@@ -0,0 +1,13 @@
1package hu.bme.mit.inf.dslreasoner.domains.satellite.runner
2
3import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor
4
5final class SatelliteGeneratorMain {
6 private new() {
7 throw new IllegalStateException("This is a static utility class and should not be instantiated directly.")
8 }
9
10 static def void main(String[] args) {
11 println(StandaloneScriptExecutor.executeScript("configs/generation.vsconfig"))
12 }
13}