diff options
Diffstat (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src')
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 @@ | |||
1 | package 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 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo | ||
2 | |||
3 | import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.SatelliteQueries | ||
4 | import java.util.WeakHashMap | ||
5 | import org.eclipse.emf.ecore.EObject | ||
6 | import org.eclipse.viatra.query.runtime.api.AdvancedViatraQueryEngine | ||
7 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine | ||
8 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions | ||
9 | import org.eclipse.viatra.query.runtime.emf.EMFScope | ||
10 | import org.eclipse.viatra.query.runtime.localsearch.matcher.integration.LocalSearchHints | ||
11 | |||
12 | class 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 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo | ||
2 | |||
3 | import org.eclipse.viatra.query.runtime.api.IPatternMatch | ||
4 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification | ||
5 | import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher | ||
6 | import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction | ||
7 | import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution | ||
8 | |||
9 | abstract 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 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo | ||
2 | |||
3 | import com.google.common.collect.ImmutableList | ||
4 | import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.SatelliteQueries | ||
5 | import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction | ||
6 | import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution | ||
7 | |||
8 | class 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 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo | ||
2 | |||
3 | import java.io.BufferedReader | ||
4 | import java.io.BufferedWriter | ||
5 | import java.io.FileReader | ||
6 | import java.io.FileWriter | ||
7 | import java.util.Map | ||
8 | import org.eclipse.emf.ecore.EPackage | ||
9 | import org.eclipse.emf.ecore.resource.Resource | ||
10 | import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl | ||
11 | import satellite.SatellitePackage | ||
12 | import uk.ac.kcl.inf.mdeoptimiser.interfaces.cli.Run | ||
13 | |||
14 | class 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 @@ | |||
1 | problem { | ||
2 | basepath <model> | ||
3 | metamodel <satellite.SatellitePackage> | ||
4 | model <../inputs/SatelliteInstance.xmi> | ||
5 | } | ||
6 | |||
7 | goal { | ||
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 | |||
12 | search { | ||
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 | |||
23 | solver { | ||
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 @@ | |||
1 | package hu.bme.mit.inf.dslreasoner.domains.satellite.queries | ||
2 | |||
3 | import "http://www.example.org/satellite" | ||
4 | |||
5 | @Constraint(severity = "error", key = {Element}, | ||
6 | message = "A communicating element may not have two transmitting communication subsystems..") | ||
7 | pattern communicationLinkDoesNotStartAtContainingElement(Element : CommunicatingElement) { | ||
8 | find transmittingCommSubsystem(Element, Comm1); | ||
9 | find transmittingCommSubsystem(Element, Comm2); | ||
10 | Comm1 != Comm2; | ||
11 | } | ||
12 | |||
13 | private 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.") | ||
22 | pattern notEnoughInterferometryPayloads(Mission : InterferometryMission) { | ||
23 | InterferometryMission(Mission); | ||
24 | neg find atLeastTwoInterferometryPayloads(Mission); | ||
25 | } | ||
26 | |||
27 | private pattern atLeastTwoInterferometryPayloads(Mission : InterferometryMission) { | ||
28 | find spacecraftWithInterferometryPayload(Mission, Spacecraft1); | ||
29 | find spacecraftWithInterferometryPayload(Mission, Spacecraft2); | ||
30 | Spacecraft1 != Spacecraft2; | ||
31 | } | ||
32 | |||
33 | private 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.") | ||
43 | pattern 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.") | ||
51 | pattern noPotentialLinkToGroundStation(Spacecraft : Spacecraft) { | ||
52 | ConstellationMission.groundStationNetwork(Mission, GroundStation); | ||
53 | ConstellationMission.spacecraft(Mission, Spacecraft); | ||
54 | neg find indirectLinkAllowed(Spacecraft, GroundStation); | ||
55 | } | ||
56 | |||
57 | private pattern indirectLinkAllowed(From : Spacecraft, To : CommunicatingElement) { | ||
58 | find linkAllowed+(From, To); | ||
59 | } | ||
60 | |||
61 | private 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 | |||
73 | private pattern matchingAntenna(From : Spacecraft, To : CommunicatingElement) { | ||
74 | CommunicatingElement.commSubsystem(From, FromSys); | ||
75 | CommunicatingElement.commSubsystem(To, ToSys); | ||
76 | find matchingCommSubsystem(FromSys, ToSys); | ||
77 | } | ||
78 | |||
79 | private 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 | |||
90 | private pattern cubeSat3U(Sat : CubeSat3U) { | ||
91 | CubeSat3U(Sat); | ||
92 | } | ||
93 | |||
94 | private 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.") | ||
103 | pattern communicationLoop(Element : CommunicatingElement) { | ||
104 | find indirectCommunicationLink(Element, Element); | ||
105 | } | ||
106 | |||
107 | private pattern indirectCommunicationLink(Source : CommunicatingElement, Target : CommunicatingElement) { | ||
108 | find directCommunicationLink+(Source, Target); | ||
109 | } | ||
110 | |||
111 | private 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.") | ||
121 | pattern 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.") | ||
131 | pattern 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 | |||
139 | private pattern commSubsystemBandUhf(Comm : UHFCommSubsystem) { | ||
140 | UHFCommSubsystem(Comm); | ||
141 | } | ||
142 | |||
143 | private 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.") | ||
151 | pattern cubeSatWithKaAntenna(Spacecraft : Spacecraft) { | ||
152 | CommunicatingElement.commSubsystem(Spacecraft, Comm); | ||
153 | KaCommSubsystem(Comm); | ||
154 | neg find smallSat(Spacecraft); | ||
155 | } | ||
156 | |||
157 | pattern 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 @@ | |||
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 | public static def void main(String[] args) { | ||
11 | println(StandaloneScriptExecutor.executeScript("configs/generation.vsconfig")) | ||
12 | } | ||
13 | } | ||