diff options
Diffstat (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu')
2 files changed, 357 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..0207cfe3 --- /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,344 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.domains.satellite.queries | ||
2 | |||
3 | import "http://www.example.org/satellite" | ||
4 | |||
5 | @Constraint(severity = "error", key = {Link}, | ||
6 | message = "Communication links must start from the containing element.") | ||
7 | pattern 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.") | ||
18 | pattern notEnoughInterferometryPayloads(Mission : InterferometryMission) { | ||
19 | InterferometryMission(Mission); | ||
20 | neg find atLeastTwoInterferometryPayloads(Mission); | ||
21 | } | ||
22 | |||
23 | private pattern atLeastTwoInterferometryPayloads(Mission : InterferometryMission) { | ||
24 | find spacecraftWithInterferometryPayload(Mission, Spacecraft1); | ||
25 | find spacecraftWithInterferometryPayload(Mission, Spacecraft2); | ||
26 | Spacecraft1 != Spacecraft2; | ||
27 | } | ||
28 | |||
29 | private 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.") | ||
39 | pattern 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.") | ||
47 | pattern noPotentialLinkToGroundStation(Spacecraft : Spacecraft) { | ||
48 | ConstellationMission.groundStationNetwork(Mission, GroundStation); | ||
49 | ConstellationMission.spacecraft(Mission, Spacecraft); | ||
50 | neg find indirectLinkAllowed(Spacecraft, GroundStation); | ||
51 | } | ||
52 | |||
53 | private pattern indirectLinkAllowed(From : Spacecraft, To : CommunicatingElement) { | ||
54 | find linkAllowed+(From, To); | ||
55 | } | ||
56 | |||
57 | private 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 | |||
69 | private 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 | |||
76 | private 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.") | ||
85 | pattern communicationLoop(Element : CommunicatingElement) { | ||
86 | find indirectCommunicationLink(Element, Element); | ||
87 | } | ||
88 | |||
89 | private pattern indirectCommunicationLink(Source : CommunicatingElement, Target : CommunicatingElement) { | ||
90 | find directCommunicationLink+(Source, Target); | ||
91 | } | ||
92 | |||
93 | private 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.") | ||
104 | pattern 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 | |||
111 | private 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.") | ||
117 | pattern 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 | |||
124 | private 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.") | ||
132 | pattern 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 | |||
140 | private 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.") | ||
148 | pattern xAntennaGainNotMedium(Comm : CommSubsystem) { | ||
149 | CommSubsystem.band(Comm, TransceiverBand::X); | ||
150 | neg find commSubsystemGainMedium(Comm); | ||
151 | } | ||
152 | |||
153 | private 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.") | ||
161 | pattern 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.") | ||
171 | pattern 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 | |||
180 | private pattern commSubsystemBandUhf(Comm : CommSubsystem) { | ||
181 | CommSubsystem.band(Comm, TransceiverBand::UHF); | ||
182 | } | ||
183 | |||
184 | private 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.") | ||
192 | pattern cubeSatWithKaAntenna(Spacecraft : Spacecraft) { | ||
193 | CommunicatingElement.commSubsystem.band(Spacecraft, TransceiverBand::Ka); | ||
194 | neg find smallSat(Spacecraft); | ||
195 | } | ||
196 | |||
197 | pattern smallSat(Sat : SmallSat) { | ||
198 | SmallSat(Sat); | ||
199 | } | ||
200 | |||
201 | @QueryBasedFeature(feature = "kind") | ||
202 | pattern 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 | |||
220 | pattern coverageMetric(Coverage : java Double) { | ||
221 | Coverage == sum find missionCoverage(_, #_); | ||
222 | } | ||
223 | |||
224 | private 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 | |||
232 | pattern timeMetric(Time : java Double) { | ||
233 | Time == sum find missionTime(_, #_); | ||
234 | } | ||
235 | |||
236 | private 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 | |||
242 | private 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 | |||
250 | private pattern incomingData(Spacecraft : Spacecraft, Source : Spacecraft, Data : java Double) { | ||
251 | find indirectCommunicationLink(Source, Spacecraft); | ||
252 | find scienceData(Source, Data); | ||
253 | } | ||
254 | |||
255 | private 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 | |||
261 | private 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 | |||
283 | private 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 | |||
292 | pattern costMetric(Cost : java Double) { | ||
293 | Cost == sum find missionCost(_, #_); | ||
294 | } | ||
295 | |||
296 | private 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 | |||
302 | private 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 | |||
312 | private 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 | |||
323 | private 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 | |||
331 | private 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 | |||
339 | private pattern spacecraftWithTwoCommSubsystems(Spacecraft : Spacecraft) { | ||
340 | Spacecraft.commSubsystem(Spacecraft, Subsystem1); | ||
341 | Spacecraft.commSubsystem(Spacecraft, Subsystem2); | ||
342 | Subsystem1 != Subsystem2; | ||
343 | } | ||
344 | */ \ No newline at end of file | ||
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 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.domains.satellite.runner | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor | ||
4 | |||
5 | final 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 | } | ||