aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src
diff options
context:
space:
mode:
Diffstat (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src')
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/CostObjective.xtend13
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/LocalSearchEngineManager.xtend31
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/MetricBasedGuidanceFunction.xtend47
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/PatternMatchConstraint.xtend29
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/SatelliteMdeOptimiserMain.xtend51
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt36
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/queries/SatelliteQueries.vql303
-rw-r--r--Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/runner/SatelliteGeneratorMain.xtend13
8 files changed, 523 insertions, 0 deletions
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/CostObjective.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/CostObjective.xtend
new file mode 100644
index 00000000..43b2902f
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/CostObjective.xtend
@@ -0,0 +1,13 @@
1package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo
2
3//import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.CostMetric
4//
5//class CostObjective extends MetricBasedGuidanceFunction {
6// new() {
7// super(CostMetric.instance)
8// }
9//
10// override getName() {
11// "Cost"
12// }
13//}
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/LocalSearchEngineManager.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/LocalSearchEngineManager.xtend
new file mode 100644
index 00000000..ee7f0060
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/LocalSearchEngineManager.xtend
@@ -0,0 +1,31 @@
1package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo
2
3import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.SatelliteQueries
4import java.util.WeakHashMap
5import org.eclipse.emf.ecore.EObject
6import org.eclipse.viatra.query.runtime.api.AdvancedViatraQueryEngine
7import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine
8import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions
9import org.eclipse.viatra.query.runtime.emf.EMFScope
10import org.eclipse.viatra.query.runtime.localsearch.matcher.integration.LocalSearchHints
11
12class LocalSearchEngineManager {
13 public static val INSTANCE = new LocalSearchEngineManager
14
15 val WeakHashMap<EObject, ViatraQueryEngine> engineMap = new WeakHashMap
16
17 private new() {
18 }
19
20 def getEngine(EObject eObject) {
21 engineMap.computeIfAbsent(eObject) [
22 val scope = new EMFScope(it)
23 val localSearchHints = LocalSearchHints.^default.build
24 val options = ViatraQueryEngineOptions.defineOptions.withDefaultHint(localSearchHints).withDefaultBackend(
25 localSearchHints.queryBackendFactory).build
26 val engine = AdvancedViatraQueryEngine.on(scope, options)
27 SatelliteQueries.instance.prepare(engine)
28 engine
29 ]
30 }
31}
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/MetricBasedGuidanceFunction.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/MetricBasedGuidanceFunction.xtend
new file mode 100644
index 00000000..1529794f
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/MetricBasedGuidanceFunction.xtend
@@ -0,0 +1,47 @@
1package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo
2
3import org.eclipse.viatra.query.runtime.api.IPatternMatch
4import org.eclipse.viatra.query.runtime.api.IQuerySpecification
5import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher
6import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction
7import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution
8
9abstract class MetricBasedGuidanceFunction implements IGuidanceFunction {
10 val IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> querySpecification
11
12 protected new(IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> querySpecification) {
13 this.querySpecification = querySpecification
14 if (querySpecification.parameters.size != 1) {
15 throw new IllegalArgumentException("Metric must have a single parameter")
16 }
17 }
18
19 override computeFitness(Solution model) {
20 val value = getMetricValue(model)
21 computeFitness(value)
22 }
23
24 protected def double computeFitness(double metricValue) {
25 metricValue
26 }
27
28 private def getMetricValue(Solution solution) {
29 val model = solution.model
30 val queryEngine = LocalSearchEngineManager.INSTANCE.getEngine(model)
31 val matcher = querySpecification.getMatcher(queryEngine)
32 val iterator = matcher.allMatches.iterator
33 if (!iterator.hasNext) {
34 throw new IllegalStateException("Too few matches")
35 }
36 val objectValue = iterator.next.get(0)
37 if (objectValue instanceof Number) {
38 val doubleValue = objectValue.doubleValue
39 if (iterator.hasNext) {
40 throw new IllegalStateException("Too many matches")
41 }
42 doubleValue
43 } else {
44 throw new IllegalStateException("Metric value must be a number")
45 }
46 }
47}
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/PatternMatchConstraint.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/PatternMatchConstraint.xtend
new file mode 100644
index 00000000..b238e64f
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/PatternMatchConstraint.xtend
@@ -0,0 +1,29 @@
1package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo
2
3import com.google.common.collect.ImmutableList
4import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.SatelliteQueries
5import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction
6import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution
7
8class PatternMatchConstraint implements IGuidanceFunction {
9 static val CONSTRAINT_ANNOTATION_NAME = "Constraint"
10
11 val queries = ImmutableList.copyOf(SatelliteQueries.instance.specifications.filter [
12 allAnnotations.exists[name == CONSTRAINT_ANNOTATION_NAME]
13 ])
14
15 override getName() {
16 "PatternMatch"
17 }
18
19 override computeFitness(Solution solution) {
20 val model = solution.model
21 val queryEngine = LocalSearchEngineManager.INSTANCE.getEngine(model)
22 var int matchCount = 0
23 for (query : queries) {
24 val matcher = query.getMatcher(queryEngine)
25 matchCount += matcher.countMatches
26 }
27 matchCount
28 }
29}
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/SatelliteMdeOptimiserMain.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/SatelliteMdeOptimiserMain.xtend
new file mode 100644
index 00000000..58034c43
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/SatelliteMdeOptimiserMain.xtend
@@ -0,0 +1,51 @@
1package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo
2
3import java.io.BufferedReader
4import java.io.BufferedWriter
5import java.io.FileReader
6import java.io.FileWriter
7import java.util.Map
8import org.eclipse.emf.ecore.EPackage
9import org.eclipse.emf.ecore.resource.Resource
10import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
11import satellite.SatellitePackage
12import uk.ac.kcl.inf.mdeoptimiser.interfaces.cli.Run
13
14class SatelliteMdeOptimiserMain {
15 static val PROJECT_PATH = "."
16 static val MOPT_PATH = "src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt"
17
18 private new() {
19 new IllegalStateException("This is a static utility class and should not be instantiated directly.")
20 }
21
22 public static def void main(String[] args) {
23 Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put(Resource.Factory.Registry.DEFAULT_EXTENSION,
24 new XMIResourceFactoryImpl)
25 EPackage.Registry.INSTANCE.put(SatellitePackage.eNS_URI, SatellitePackage.eINSTANCE)
26 fixupHenshinModel("model/satellite.henshin", "model/satellite_fixup.henshin",
27 #{"satellite.ecore" -> SatellitePackage.eNS_URI})
28 Run.main(#["-p", PROJECT_PATH, "-m", MOPT_PATH])
29 }
30
31 private def static void fixupHenshinModel(String originalPath, String outputPath, Map<String, String> remapMap) {
32 val reader = new BufferedReader(new FileReader(originalPath))
33 try {
34 val writer = new BufferedWriter(new FileWriter(outputPath))
35 try {
36 var String line
37 while ((line = reader.readLine) !== null) {
38 for (entry : remapMap.entrySet) {
39 line = line.replace(entry.key, entry.value)
40 }
41 writer.write(line)
42 writer.write("\n")
43 }
44 } finally {
45 writer.close
46 }
47 } finally {
48 reader.close
49 }
50 }
51}
diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt
new file mode 100644
index 00000000..e9bd1a64
--- /dev/null
+++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt
@@ -0,0 +1,36 @@
1problem {
2 basepath <model>
3 metamodel <satellite.SatellitePackage>
4 model <../inputs/SatelliteInstance.xmi>
5}
6
7goal {
8 objective Cost minimise java { "hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo.CostObjective" }
9 constraint PatternMatch java { "hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo.PatternMatchConstraint" }
10}
11
12search {
13// mutate using <satellite_fixup.henshin> unit "addCubeSat3U"
14 mutate { "CubeSat3U" }
15 mutate { "CubeSat6U" }
16 mutate { "SmallSat" }
17 mutate { "InterferometryPayload" }
18 mutate { "UHFCommSubsystem" }
19 mutate { "XCommSubsystem" }
20 mutate { "KaCommSubsystem" }
21}
22
23solver {
24 optimisation provider moea algorithm NSGAII {
25 variation: mutation
26 population: 25
27 mutation.step: 3
28 mutation.strategy: random
29 }
30
31 termination {
32 time: 120
33 }
34
35 batches 1
36} \ 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/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..c7135562
--- /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,303 @@
1package hu.bme.mit.inf.dslreasoner.domains.satellite.queries
2
3import "http://www.example.org/satellite"
4
5@Constraint(severity = "error", key = {Element},
6 message = "A communicating element may not have two transmitting communication subsystems..")
7pattern communicationLinkDoesNotStartAtContainingElement(Element : CommunicatingElement) {
8 find transmittingCommSubsystem(Element, Comm1);
9 find transmittingCommSubsystem(Element, Comm2);
10 Comm1 != Comm2;
11}
12
13private pattern transmittingCommSubsystem(Element : CommunicatingElement, Comm : CommSubsystem) {
14 CommunicatingElement.commSubsystem(Element, Comm);
15 CommSubsystem.target(Comm, _);
16}
17
18// At least two spacecraft must have the interferometry payload configured
19
20@Constraint(severity = "error", key = {Mission},
21 message = "Interferometry mission needs at least two spacecraft configured with the interferometry payload.")
22pattern notEnoughInterferometryPayloads(Mission : InterferometryMission) {
23 InterferometryMission(Mission);
24 neg find atLeastTwoInterferometryPayloads(Mission);
25}
26
27private pattern atLeastTwoInterferometryPayloads(Mission : InterferometryMission) {
28 find spacecraftWithInterferometryPayload(Mission, Spacecraft1);
29 find spacecraftWithInterferometryPayload(Mission, Spacecraft2);
30 Spacecraft1 != Spacecraft2;
31}
32
33private pattern spacecraftWithInterferometryPayload(Mission : ConstellationMission, Spacecraft : Spacecraft) {
34 ConstellationMission.spacecraft(Mission, Spacecraft);
35 Spacecraft.payload(Spacecraft, Payload);
36 InterferometryPayload(Payload);
37}
38
39// All spacecraft must have some communication path to the ground station
40
41@Constraint(severity = "error", key = {Spacecraft},
42 message = "Spacecraft has no communication path to the ground station.")
43pattern noLinkToGroundStation(Spacecraft : Spacecraft) {
44 ConstellationMission.groundStationNetwork(Mission, GroundStation);
45 ConstellationMission.spacecraft(Mission, Spacecraft);
46 neg find indirectCommunicationLink(Spacecraft, GroundStation);
47}
48
49@Constraint(severity = "error", key = {Spacecraft},
50 message = "Spacecraft has no potential communication path to the ground station.")
51pattern noPotentialLinkToGroundStation(Spacecraft : Spacecraft) {
52 ConstellationMission.groundStationNetwork(Mission, GroundStation);
53 ConstellationMission.spacecraft(Mission, Spacecraft);
54 neg find indirectLinkAllowed(Spacecraft, GroundStation);
55}
56
57private pattern indirectLinkAllowed(From : Spacecraft, To : CommunicatingElement) {
58 find linkAllowed+(From, To);
59}
60
61private pattern linkAllowed(From : Spacecraft, To : CommunicatingElement) {
62 find matchingAntenna(From, To);
63 neg find cubeSat3U(From);
64} or {
65 find matchingAntenna(From, To);
66 CubeSat3U(From);
67} or {
68 find matchingAntenna(From, To);
69 CubeSat3U(From);
70 GroundStationNetwork(To);
71}
72
73private pattern matchingAntenna(From : Spacecraft, To : CommunicatingElement) {
74 CommunicatingElement.commSubsystem(From, FromSys);
75 CommunicatingElement.commSubsystem(To, ToSys);
76 find matchingCommSubsystem(FromSys, ToSys);
77}
78
79private pattern matchingCommSubsystem(From : CommSubsystem, To : CommSubsystem) {
80 UHFCommSubsystem(From);
81 UHFCommSubsystem(To);
82} or {
83 XCommSubsystem(From);
84 XCommSubsystem(To);
85} or {
86 KaCommSubsystem(From);
87 KaCommSubsystem(To);
88}
89
90private pattern cubeSat3U(Sat : CubeSat3U) {
91 CubeSat3U(Sat);
92}
93
94private pattern cubeSat6U(Sat : CubeSat6U) {
95 CubeSat6U(Sat);
96}
97
98// No communication loops may exist
99// No spacecraft may directly communicate with itself
100
101@Constraint(severity = "error", key = {Element},
102 message = "Communication loop.")
103pattern communicationLoop(Element : CommunicatingElement) {
104 find indirectCommunicationLink(Element, Element);
105}
106
107private pattern indirectCommunicationLink(Source : CommunicatingElement, Target : CommunicatingElement) {
108 find directCommunicationLink+(Source, Target);
109}
110
111private pattern directCommunicationLink(Source : CommunicatingElement, Target : CommunicatingElement) {
112 CommSubsystem.target(SourceSubsystem, TargetSubsystem);
113 CommunicatingElement.commSubsystem(Source, SourceSubsystem);
114 CommunicatingElement.commSubsystem(Target, TargetSubsystem);
115}
116
117// Source and target communication systems must be compatible.
118
119@Constraint(severity = "error", key = {SourceSubsystem},
120 message = "Two ends of a communication link must use the same band.")
121pattern incompatibleSourceAndTargetBand(SourceSubsystem : CommSubsystem) {
122 CommSubsystem.target(SourceSubsystem, TargetSubsystem);
123 neg find matchingCommSubsystem(SourceSubsystem, TargetSubsystem);
124}
125
126// 3U CubeSats are assumed to only be able to downlink to Earth using an X-band trasmitter,
127// but cross-link using UHF
128
129@Constraint(severity = "error", key = {Sat},
130 message = "3U CubeSats can only cross-link using UHF.")
131pattern threeUCubeSatWithNonUhfCrossLink(Sat : CubeSat3U) {
132 CommunicatingElement.commSubsystem(Sat, SourceComm);
133 neg find commSubsystemBandUhf(SourceComm);
134 CommSubsystem.target(SourceComm, TargetComm);
135 CommunicatingElement.commSubsystem(Target, TargetComm);
136 neg find groundStationNetwork(Target);
137}
138
139private pattern commSubsystemBandUhf(Comm : UHFCommSubsystem) {
140 UHFCommSubsystem(Comm);
141}
142
143private pattern groundStationNetwork(Network : GroundStationNetwork) {
144 GroundStationNetwork(Network);
145}
146
147// Only a Small Satellite can be configured with a Ka-band communication system
148
149@Constraint(severity = "error", key = {Spacecraft},
150 message = "Only a Small Satellite can be configured with a Ka-band communication system.")
151pattern cubeSatWithKaAntenna(Spacecraft : Spacecraft) {
152 CommunicatingElement.commSubsystem(Spacecraft, Comm);
153 KaCommSubsystem(Comm);
154 neg find smallSat(Spacecraft);
155}
156
157pattern smallSat(Sat : SmallSat) {
158 SmallSat(Sat);
159}
160
161////
162//// Metrics
163////
164//
165//// Coverage
166//
167//pattern coverageMetric(Coverage : java Double) {
168// Coverage == sum find missionCoverage(_, #_);
169//}
170//
171//private pattern missionCoverage(Mission : InterferometryMission, Coverage : java Double) {
172// InterferometryMission.observationTime(Mission, ObservationTime);
173// ObserverCount == count find spacecraftWithInterferometryPayload(Mission, _);
174// Coverage == eval(Math.pow(1 - 2.0 / ObserverCount, 1 + 9 * (1.0 / ObservationTime)) + 0.05 * ObservationTime / 3);
175//}
176//
177//// Time
178//
179//pattern timeMetric(Time : java Double) {
180// Time == sum find missionTime(_, #_);
181//}
182//
183//private pattern missionTime(Mission : InterferometryMission, Time : java Double) {
184// InterferometryMission.observationTime(Mission, ObservationTime);
185// TrasmitTime == sum find transmitTime(Mission, _, #_);
186// Time == eval(TrasmitTime + 60.0 * ObservationTime);
187//}
188//
189//private pattern transmitTime(Mission : InterferometryMission, Spacecraft : Spacecraft, TransmitTime : java Double) {
190// ConstellationMission.spacecraft(Mission, Spacecraft);
191// find scienceData(Spacecraft, ScienceData);
192// IncomingData == sum find incomingData(Spacecraft, _, #_);
193// find transmitRate(Spacecraft, TransmitRate);
194// TransmitTime == eval((ScienceData + IncomingData) / (7.5 * TransmitRate));
195//}
196//
197//private pattern incomingData(Spacecraft : Spacecraft, Source : Spacecraft, Data : java Double) {
198// find indirectCommunicationLink(Source, Spacecraft);
199// find scienceData(Source, Data);
200//}
201//
202//private pattern scienceData(Spacecraft : Spacecraft, Data : java Double) {
203// ConstellationMission.spacecraft(Mission, Spacecraft);
204// InterferometryMission.observationTime(Mission, ObservationTime);
205// Data == eval(12.0 * ObservationTime);
206//}
207//
208//private pattern transmitRate(Spacecraft : Spacecraft, TransmitRate : java Double) {
209// find spacecraftUplink(Spacecraft, Comm, Target);
210// UHFCommSubsystem(Comm);
211// Spacecraft(Target);
212// TransmitRate == 5.0;
213//} or {
214// find spacecraftUplink(Spacecraft, Comm, Target);
215// XCommSubsystem(Comm);
216// Spacecraft(Target);
217// TransmitRate == 1.6;
218//} or {
219// find spacecraftUplink(Spacecraft, Comm, Target);
220// XCommSubsystem(Comm);
221// GroundStationNetwork(Target);
222// TransmitRate == 0.7;
223//} or {
224// find spacecraftUplink(Spacecraft, Comm, Target);
225// KaCommSubsystem(Comm);
226// Spacecraft(Target);
227// TransmitRate == 220.0;
228//} or {
229// find spacecraftUplink(Spacecraft, Comm, Target);
230// KaCommSubsystem(Comm);
231// GroundStationNetwork(Target);
232// TransmitRate == 80.0;
233//}
234//
235//private pattern spacecraftUplink(Spacecraft : Spacecraft, TargetSubsystem : CommSubsystem, Target : CommunicatingElement) {
236// CommunicatingElement.commSubsystem.target(Spacecraft, TargetSubsystem);
237// CommunicatingElement.commSubsystem(Target, TargetSubsystem);
238//}
239//
240//// Cost
241//
242//pattern costMetric(Cost : java Double) {
243// Cost == sum find missionCost(_, #_);
244//}
245//
246//private pattern missionCost(Mission : InterferometryMission, Cost : java Double) {
247// InterferometryMission.observationTime(Mission, ObservationTime);
248// SpacecraftCost == sum find spacecraftCost(Mission, _, #_);
249// Cost == eval(SpacecraftCost + 100000.0 * ObservationTime);
250//}
251//
252//private pattern spacecraftCost(Mission : InterferometryMission, Spacecraft : Spacecraft, Cost : java Double) {
253// ConstellationMission.spacecraft(Mission, Spacecraft);
254// find spacecraftOfKindCount(Spacecraft, KindCount);
255// find basePrice(Spacecraft, BasePrice);
256// find interferometryPayloadCost(Spacecraft, InterferometryPayloadCost);
257// find additionalCommSubsystemCost(Spacecraft, AdditionalCommSubsystemCost);
258// Cost == eval(BasePrice * Math.pow(KindCount, -0.25) + InterferometryPayloadCost + AdditionalCommSubsystemCost);
259//}
260//
261//private pattern spacecraftOfKindCount(Sat : Spacecraft, Count : java Integer) {
262// CubeSat3U(Sat);
263// Count == count find cubeSat3U(_);
264//} or {
265// CubeSat6U(Sat);
266// Count == count find cubeSat6U(_);
267//} or {
268// SmallSat(Sat);
269// Count == count find smallSat(_);
270//}
271//
272//private pattern basePrice(Spacecraft : Spacecraft, BasePrice : java Double) {
273// CubeSat3U(Spacecraft);
274// BasePrice == 250000.0;
275//} or {
276// CubeSat6U(Spacecraft);
277// BasePrice == 750000.0;
278//} or {
279// SmallSat(Spacecraft);
280// BasePrice == 3000000.0;
281//}
282//
283//private pattern interferometryPayloadCost(Spacecraft : Spacecraft, Cost : java Double) {
284// find spacecraftWithInterferometryPayload(_, Spacecraft);
285// Cost == 50000.0;
286//} or {
287// neg find spacecraftWithInterferometryPayload(_, Spacecraft);
288// Cost == 0.0;
289//}
290//
291//private pattern additionalCommSubsystemCost(Spacecraft : Spacecraft, Cost : java Double) {
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//}
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..3d2cbbc7
--- /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 public static def void main(String[] args) {
11 println(StandaloneScriptExecutor.executeScript("configs/generation.vsconfig"))
12 }
13}