From b21af04ea821c3daa9ce8a6d26c63e9cd198f9a5 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Sat, 8 Jun 2019 19:17:34 -0400 Subject: Trying to simplify Satellite case study --- .../domains/satellite/mdeo/CostObjective.xtend | 13 + .../mdeo/ExcludedOptimisationInterpreter.xtend | 85 +++++ .../satellite/mdeo/LocalSearchEngineManager.xtend | 31 ++ .../mdeo/MetricBasedGuidanceFunction.xtend | 47 +++ .../satellite/mdeo/PatternMatchConstraint.xtend | 29 ++ .../satellite/mdeo/SatelliteMdeOptimiserMain.xtend | 52 +++ .../domains/satellite/mdeo/satellite.mopt | 35 ++ .../domains/satellite/queries/SatelliteQueries.vql | 378 +++++++++------------ .../satellite/runner/SatelliteGeneratorMain.xtend | 4 +- 9 files changed, 463 insertions(+), 211 deletions(-) create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/CostObjective.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/ExcludedOptimisationInterpreter.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/LocalSearchEngineManager.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/MetricBasedGuidanceFunction.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/PatternMatchConstraint.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/SatelliteMdeOptimiserMain.xtend create mode 100644 Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt (limited to 'Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains') 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..3a8688e9 --- /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 @@ +package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.CostMetric + +class CostObjective extends MetricBasedGuidanceFunction { + new() { + super(CostMetric.instance) + } + + override getName() { + "Cost" + } +} diff --git a/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/ExcludedOptimisationInterpreter.xtend b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/ExcludedOptimisationInterpreter.xtend new file mode 100644 index 00000000..ddf5748e --- /dev/null +++ b/Domains/hu.bme.mit.inf.dslreasoner.domains.satellite/src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/ExcludedOptimisationInterpreter.xtend @@ -0,0 +1,85 @@ +package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo + +import java.util.Properties +import org.moeaframework.Executor +import org.moeaframework.Instrumenter +import org.moeaframework.algorithm.PeriodicAction +import org.moeaframework.core.TerminationCondition +import org.moeaframework.core.spi.AlgorithmFactory +import uk.ac.kcl.inf.mdeoptimiser.interfaces.cli.Run +import uk.ac.kcl.inf.mdeoptimiser.languages.mopt.Optimisation +import uk.ac.kcl.inf.mdeoptimiser.languages.mopt.SolverSpec +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.OptimisationInterpreter +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.executor.SolutionGenerator +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.moea.MoeaOptimisation +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.moea.algorithms.MoeaOptimisationAlgorithmProvider +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.moea.instrumentation.PopulationCollector +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.moea.problem.MoeaOptimisationProblem +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.operators.adaptation.MutationStepSizeStrategyFactory +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.output.MDEOBatch + +class ExcludedMoeaOptimisation extends MoeaOptimisation { + SolutionGenerator solutionGenerator + Instrumenter algorithmStepSizeInstrumenter + + override execute(SolverSpec solverSpec, SolutionGenerator solutionGenerator) { + this.solutionGenerator = solutionGenerator + super.execute(solverSpec, solutionGenerator) + } + + override Instrumenter runOptimisation(SolverSpec solverSpec, Properties optimisationProperties) { + val algorithmFactory = new AlgorithmFactory + algorithmFactory.addProvider(new MoeaOptimisationAlgorithmProvider) + + algorithmStepSizeInstrumenter = new Instrumenter().addExcludedPackage("org.eclipse").withProblemClass( + MoeaOptimisationProblem, solutionGenerator).attachApproximationSetCollector().attachElapsedTimeCollector(). + attachPopulationSizeCollector.attach(new PopulationCollector()).withFrequency(1).withFrequencyType( + PeriodicAction.FrequencyType.STEPS) + + var stepSizeStrategy = new MutationStepSizeStrategyFactory(solverSpec.algorithm, algorithmStepSizeInstrumenter). + strategy + + solutionGenerator.setMutationStepSizeStrategy(stepSizeStrategy) + + // TODO: Place this in a better location. + // Exclude JDK packages from Instrumenter + this.algorithmStepSizeInstrumenter.addExcludedPackage("jdk") + + new Executor().usingAlgorithmFactory(algorithmFactory).withAlgorithm(solverSpec.algorithm.name) // Initialize problem with our solution generator + .withProblemClass(MoeaOptimisationProblem, solutionGenerator).withProperties(optimisationProperties). + withInstrumenter(algorithmStepSizeInstrumenter).withTerminationCondition( + optimisationProperties.get("terminationCondition") as TerminationCondition).run() + + return algorithmStepSizeInstrumenter + } +} + +class ExcludedOptimisationInterpreter extends OptimisationInterpreter { + val Optimisation model + + new(String projectPath, Optimisation model) { + super(projectPath, model) + this.model = model + } + + override start() { + // This model provider loads the model given by the user in the DSL + var solutionGenerator = new SolutionGenerator(model, getBreedingOperators, getMutationOperators, + getModelProvider, getMetamodel); + + return new ExcludedMoeaOptimisation().execute(model.solver, solutionGenerator) + } + +} + +class ExcludedRun extends Run { + override runBatch(String moptProjectPath, Optimisation optimisationModel, Integer batch, boolean singleBatch) { + val optimisationInterpreter = new ExcludedOptimisationInterpreter(moptProjectPath, optimisationModel); + val startTime = System.nanoTime(); + val optimisationOutcome = optimisationInterpreter.start(); + val endTime = System.nanoTime(); + val experimentDuration = ((endTime - startTime) / 1000000); + val generatedRules = optimisationInterpreter.getRulegenOperators(); + return new MDEOBatch(batch, experimentDuration, optimisationOutcome, generatedRules, singleBatch); + } +} 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 @@ +package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo + +import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.SatelliteQueries +import java.util.WeakHashMap +import org.eclipse.emf.ecore.EObject +import org.eclipse.viatra.query.runtime.api.AdvancedViatraQueryEngine +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine +import org.eclipse.viatra.query.runtime.api.ViatraQueryEngineOptions +import org.eclipse.viatra.query.runtime.emf.EMFScope +import org.eclipse.viatra.query.runtime.localsearch.matcher.integration.LocalSearchHints + +class LocalSearchEngineManager { + public static val INSTANCE = new LocalSearchEngineManager + + val WeakHashMap engineMap = new WeakHashMap + + private new() { + } + + def getEngine(EObject eObject) { + engineMap.computeIfAbsent(eObject) [ + val scope = new EMFScope(it) + val localSearchHints = LocalSearchHints.^default.build + val options = ViatraQueryEngineOptions.defineOptions.withDefaultHint(localSearchHints).withDefaultBackend( + localSearchHints.queryBackendFactory).build + val engine = AdvancedViatraQueryEngine.on(scope, options) + SatelliteQueries.instance.prepare(engine) + engine + ] + } +} 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 @@ +package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo + +import org.eclipse.viatra.query.runtime.api.IPatternMatch +import org.eclipse.viatra.query.runtime.api.IQuerySpecification +import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution + +abstract class MetricBasedGuidanceFunction implements IGuidanceFunction { + val IQuerySpecification> querySpecification + + protected new(IQuerySpecification> querySpecification) { + this.querySpecification = querySpecification + if (querySpecification.parameters.size != 1) { + throw new IllegalArgumentException("Metric must have a single parameter") + } + } + + override computeFitness(Solution model) { + val value = getMetricValue(model) + computeFitness(value) + } + + protected def double computeFitness(double metricValue) { + metricValue + } + + private def getMetricValue(Solution solution) { + val model = solution.model + val queryEngine = LocalSearchEngineManager.INSTANCE.getEngine(model) + val matcher = querySpecification.getMatcher(queryEngine) + val iterator = matcher.allMatches.iterator + if (!iterator.hasNext) { + throw new IllegalStateException("Too few matches") + } + val objectValue = iterator.next.get(0) + if (objectValue instanceof Number) { + val doubleValue = objectValue.doubleValue + if (iterator.hasNext) { + throw new IllegalStateException("Too many matches") + } + doubleValue + } else { + throw new IllegalStateException("Metric value must be a number") + } + } +} 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 @@ +package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo + +import com.google.common.collect.ImmutableList +import hu.bme.mit.inf.dslreasoner.domains.satellite.queries.SatelliteQueries +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.IGuidanceFunction +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution + +class PatternMatchConstraint implements IGuidanceFunction { + static val CONSTRAINT_ANNOTATION_NAME = "Constraint" + + val queries = ImmutableList.copyOf(SatelliteQueries.instance.specifications.filter [ + allAnnotations.exists[name == CONSTRAINT_ANNOTATION_NAME] + ]) + + override getName() { + "PatternMatch" + } + + override computeFitness(Solution solution) { + val model = solution.model + val queryEngine = LocalSearchEngineManager.INSTANCE.getEngine(model) + var int matchCount = 0 + for (query : queries) { + val matcher = query.getMatcher(queryEngine) + matchCount += matcher.countMatches + } + matchCount + } +} 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..c5a30f94 --- /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,52 @@ +package hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo + +import java.io.BufferedReader +import java.io.BufferedWriter +import java.io.FileReader +import java.io.FileWriter +import java.util.Map +import org.eclipse.emf.ecore.EPackage +import org.eclipse.emf.ecore.resource.Resource +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl +import satellite.SatellitePackage +import uk.ac.kcl.inf.mdeoptimiser.languages.MoptStandaloneSetup + +class SatelliteMdeOptimiserMain { + static val PROJECT_PATH = "." + static val MOPT_PATH = "src/hu/bme/mit/inf/dslreasoner/domains/satellite/mdeo/satellite.mopt" + + private new() { + new IllegalStateException("This is a static utility class and should not be instantiated directly.") + } + + public static def void main(String[] args) { + Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put(Resource.Factory.Registry.DEFAULT_EXTENSION, + new XMIResourceFactoryImpl) + EPackage.Registry.INSTANCE.put(SatellitePackage.eNS_URI, SatellitePackage.eINSTANCE) + fixupHenshinModel("model/satellite.henshin", "model/satellite_fixup.henshin", + #{"satellite.ecore" -> SatellitePackage.eNS_URI}) + val injector = new MoptStandaloneSetup().createInjectorAndDoEMFRegistration(); + injector.getInstance(ExcludedRun).run(PROJECT_PATH, MOPT_PATH) + } + + private def static void fixupHenshinModel(String originalPath, String outputPath, Map remapMap) { + val reader = new BufferedReader(new FileReader(originalPath)) + try { + val writer = new BufferedWriter(new FileWriter(outputPath)) + try { + var String line + while ((line = reader.readLine) !== null) { + for (entry : remapMap.entrySet) { + line = line.replace(entry.key, entry.value) + } + writer.write(line) + writer.write("\n") + } + } finally { + writer.close + } + } finally { + reader.close + } + } +} 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..138ea309 --- /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,35 @@ +problem { + basepath + metamodel + model <../inputs/SatelliteInstance.xmi> +} + +goal { + objective Cost minimise java { "hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo.CostObjective" } + constraint PatternMatch java { "hu.bme.mit.inf.dslreasoner.domains.satellite.mdeo.PatternMatchConstraint" } +} + +search { + mutate using unit "addCubeSat3U" +// mutate { "CubeSat3U" } +// mutate { "CubeSat6U" } +// mutate { "SmallSat" } +// mutate { "InterferometryPayload" } +// mutate { "CommSubsystem" } +// mutate { "DirectedCommunicationLink" } +} + +solver { + optimisation provider moea algorithm NSGAII { + variation: mutation + population: 25 + mutation.step: 3 + mutation.strategy: random + } + + termination { + time: 120 + } + + batches 1 +} \ 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 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 } private pattern linkAllowed(From : Spacecraft, To : CommunicatingElement) { - find matchingAntenna(From, To, _); + find matchingAntenna(From, To); neg find cubeSat3U(From); } or { - find matchingAntenna(From, To, TransceiverBand::UHF); + find matchingAntenna(From, To); CubeSat3U(From); } or { - find matchingAntenna(From, To, _); + find matchingAntenna(From, To); CubeSat3U(From); GroundStationNetwork(To); } -private pattern matchingAntenna(From : Spacecraft, To : CommunicatingElement, Band : TransceiverBand) { - CommunicatingElement.commSubsystem.band(From, Band); - CommunicatingElement.commSubsystem.band(To, Band); - CommunicatingElement.commSubsystem.gain(From, Gain); - CommunicatingElement.commSubsystem.gain(To, Gain); +private pattern matchingAntenna(From : Spacecraft, To : CommunicatingElement) { + CommunicatingElement.commSubsystem(From, FromSys); + CommunicatingElement.commSubsystem(To, ToSys); + find matchingCommSubsystem(FromSys, ToSys); +} + +private pattern matchingCommSubsystem(From : CommSubsystem, To : CommSubsystem) { + UHFCommSubsystem(From); + UHFCommSubsystem(To); +} or { + XCommSubsystem(From); + XCommSubsystem(To); +} or { + KaCommSubsystem(From); + KaCommSubsystem(To); } private pattern cubeSat3U(Sat : CubeSat3U) { CubeSat3U(Sat); } +private pattern cubeSat6U(Sat : CubeSat6U) { + CubeSat6U(Sat); +} + // No communication loops may exist // No spacecraft may directly communicate with itself @@ -104,63 +118,7 @@ private pattern directCommunicationLink(Source : CommunicatingElement, Target : pattern incompatibleSourceAndTargetBand(Link : DirectedCommunicationLink) { DirectedCommunicationLink.source(Link, SourceSubsystem); DirectedCommunicationLink.target(Link, TargetSubsystem); - CommSubsystem.band(SourceSubsystem, Band); - neg find commSubsystemBand(TargetSubsystem, Band); -} - -private pattern commSubsystemBand(Comm : CommSubsystem, Band : TransceiverBand) { - CommSubsystem.band(Comm, Band); -} - -@Constraint(severity = "error", key = {Link}, - message = "Two ends of a communication link must use the same antenna gain.") -pattern incompatibleSourceAndTargetGain(Link : DirectedCommunicationLink) { - DirectedCommunicationLink.source(Link, SourceSubsystem); - DirectedCommunicationLink.target(Link, TargetSubsystem); - CommSubsystem.gain(SourceSubsystem, Gain); - neg find commSubsystemGain(TargetSubsystem, Gain); -} - -private pattern commSubsystemGain(Comm : CommSubsystem, Gain : AntennaGain) { - CommSubsystem.gain(Comm, Gain); -} - -// UHF-band transmitters may only be combined with a low gain antenna - -@Constraint(severity = "error", key = {Comm}, - message = "UHF transceiver must be combined with a low gain antenna.") -pattern uhfAntennaGainNotLow(Comm : CommSubsystem) { - CommSubsystem.band(Comm, TransceiverBand::UHF); - // VIATRA will fail to infer a type constraint for the virtual variable introduced - // when an enum literal appears in a negative pattern call, so we use a helper pattern - // instead of neg find commSubsystemGain(Comm, AntennaGain::LOW); - neg find commSubsystemGainLow(Comm); -} - -private pattern commSubsystemGainLow(Comm : CommSubsystem) { - CommSubsystem.gain(Comm, AntennaGain::LOW); -} - -// X-band transmitters may only be combined with a medium gain antenna - -@Constraint(severity = "error", key = {Comm}, - message = "X-band transceiver must be combined with a medium gain antenna.") -pattern xAntennaGainNotMedium(Comm : CommSubsystem) { - CommSubsystem.band(Comm, TransceiverBand::X); - neg find commSubsystemGainMedium(Comm); -} - -private pattern commSubsystemGainMedium(Comm : CommSubsystem) { - CommSubsystem.gain(Comm, AntennaGain::MEDIUM); -} - -// Ka-band transmitters may only be combined with a medium or high gain antenna - -@Constraint(severity = "error", key = {Comm}, - message = "Ka-band transceiver must be combined with a medium or high gain antenna.") -pattern kaAntennaGainLow(Comm : CommSubsystem) { - CommSubsystem.band(Comm, TransceiverBand::Ka); - CommSubsystem.gain(Comm, AntennaGain::LOW); + neg find matchingCommSubsystem(SourceSubsystem, TargetSubsystem); } // 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) { neg find groundStationNetwork(Target); } -private pattern commSubsystemBandUhf(Comm : CommSubsystem) { - CommSubsystem.band(Comm, TransceiverBand::UHF); +private pattern commSubsystemBandUhf(Comm : UHFCommSubsystem) { + UHFCommSubsystem(Comm); } private pattern groundStationNetwork(Network : GroundStationNetwork) { @@ -190,7 +148,8 @@ private pattern groundStationNetwork(Network : GroundStationNetwork) { @Constraint(severity = "error", key = {Spacecraft}, message = "Only a Small Satellite can be configured with a Ka-band communication system.") pattern cubeSatWithKaAntenna(Spacecraft : Spacecraft) { - CommunicatingElement.commSubsystem.band(Spacecraft, TransceiverBand::Ka); + CommunicatingElement.commSubsystem(Spacecraft, Comm); + KaCommSubsystem(Comm); neg find smallSat(Spacecraft); } @@ -198,146 +157,147 @@ pattern smallSat(Sat : SmallSat) { SmallSat(Sat); } -@QueryBasedFeature(feature = "kind") -pattern spacecraftOfKind(Spacecraft : Spacecraft, Kind : SpacecraftKind) { - CubeSat3U(Spacecraft); - Kind == SpacecraftKind::CubeSat3U; -} or { - CubeSat6U(Spacecraft); - Kind == SpacecraftKind::CubeSat6U; -} or { - SmallSat(Spacecraft); - Kind == SpacecraftKind::SmallSat; -} - - +//// +//// Metrics +//// // -// Metrics +//// Coverage // - -// Coverage - -pattern coverageMetric(Coverage : java Double) { - Coverage == sum find missionCoverage(_, #_); -} - -private pattern missionCoverage(Mission : InterferometryMission, Coverage : java Double) { - InterferometryMission.observationTime(Mission, ObservationTime); - ObserverCount == count find spacecraftWithInterferometryPayload(Mission, _); - Coverage == eval(Math.pow(1 - 2.0 / ObserverCount, 1 + 9 * (1.0 / ObservationTime)) + 0.05 * ObservationTime / 3); -} - -// Time - -pattern timeMetric(Time : java Double) { - Time == sum find missionTime(_, #_); -} - -private pattern missionTime(Mission : InterferometryMission, Time : java Double) { - InterferometryMission.observationTime(Mission, ObservationTime); - TrasmitTime == sum find transmitTime(Mission, _, #_); - Time == eval(TrasmitTime + 60.0 * ObservationTime); -} - -private pattern transmitTime(Mission : InterferometryMission, Spacecraft : Spacecraft, TransmitTime : java Double) { - ConstellationMission.spacecraft(Mission, Spacecraft); - find scienceData(Spacecraft, ScienceData); - IncomingData == sum find incomingData(Spacecraft, _, #_); - find transmitRate(Spacecraft, TransmitRate); - TransmitTime == eval((ScienceData + IncomingData) / (7.5 * TransmitRate)); -} - -private pattern incomingData(Spacecraft : Spacecraft, Source : Spacecraft, Data : java Double) { - find indirectCommunicationLink(Source, Spacecraft); - find scienceData(Source, Data); -} - -private pattern scienceData(Spacecraft : Spacecraft, Data : java Double) { - ConstellationMission.spacecraft(Mission, Spacecraft); - InterferometryMission.observationTime(Mission, ObservationTime); - Data == eval(12.0 * ObservationTime); -} - -private pattern transmitRate(Spacecraft : Spacecraft, TransmitRate : java Double) { - find spacecraftUplink(Spacecraft, TransceiverBand::UHF, Target); - Spacecraft(Target); - TransmitRate == 5.0; -} or { - find spacecraftUplink(Spacecraft, TransceiverBand::X, Target); - Spacecraft(Target); - TransmitRate == 1.6; -} or { - find spacecraftUplink(Spacecraft, TransceiverBand::X, Target); - GroundStationNetwork(Target); - TransmitRate == 0.7; -} or { - find spacecraftUplink(Spacecraft, TransceiverBand::Ka, Target); - Spacecraft(Target); - TransmitRate == 220.0; -} or { - find spacecraftUplink(Spacecraft, TransceiverBand::Ka, Target); - GroundStationNetwork(Target); - TransmitRate == 80.0; -} - -private pattern spacecraftUplink(Spacecraft : Spacecraft, Band : TransceiverBand, Target : CommunicatingElement) { - CommunicatingElement.communicationLink(Spacecraft, Link); - DirectedCommunicationLink.source.band(Link, Band); - DirectedCommunicationLink.target(Link, TargetSubsystem); - CommunicatingElement.commSubsystem(Target, TargetSubsystem); -} - -// Cost - -pattern costMetric(Cost : java Double) { - Cost == sum find missionCost(_, #_); -} - -private pattern missionCost(Mission : InterferometryMission, Cost : java Double) { - InterferometryMission.observationTime(Mission, ObservationTime); - SpacecraftCost == sum find spacecraftCost(Mission, _, #_); - Cost == eval(SpacecraftCost + 100000.0 * ObservationTime); -} - -private pattern spacecraftCost(Mission : InterferometryMission, Spacecraft : Spacecraft, Cost : java Double) { - ConstellationMission.spacecraft(Mission, Spacecraft); - find spacecraftOfKind(Spacecraft, Kind); - KindCount == count find spacecraftOfKind(_, Kind); - find basePrice(Spacecraft, BasePrice); - find interferometryPayloadCost(Spacecraft, InterferometryPayloadCost); - find additionalCommSubsystemCost(Spacecraft, AdditionalCommSubsystemCost); - Cost == eval(BasePrice * Math.pow(KindCount, -0.25) + InterferometryPayloadCost + AdditionalCommSubsystemCost); -} - -private pattern basePrice(Spacecraft : Spacecraft, BasePrice : java Double) { - CubeSat3U(Spacecraft); - BasePrice == 250000.0; -} or { - CubeSat6U(Spacecraft); - BasePrice == 750000.0; -} or { - SmallSat(Spacecraft); - BasePrice == 3000000.0; -} - -private pattern interferometryPayloadCost(Spacecraft : Spacecraft, Cost : java Double) { - find spacecraftWithInterferometryPayload(_, Spacecraft); - Cost == 50000.0; -} or { - neg find spacecraftWithInterferometryPayload(_, Spacecraft); - Cost == 0.0; -} - -private pattern additionalCommSubsystemCost(Spacecraft : Spacecraft, Cost : java Double) { - find spacecraftWithTwoCommSubsystems(Spacecraft); - Cost == 100000.0; -} or { - neg find spacecraftWithTwoCommSubsystems(Spacecraft); - Cost == 0.0; -} - -private pattern spacecraftWithTwoCommSubsystems(Spacecraft : Spacecraft) { - Spacecraft.commSubsystem(Spacecraft, Subsystem1); - Spacecraft.commSubsystem(Spacecraft, Subsystem2); - Subsystem1 != Subsystem2; -} +//pattern coverageMetric(Coverage : java Double) { +// Coverage == sum find missionCoverage(_, #_); +//} +// +//private pattern missionCoverage(Mission : InterferometryMission, Coverage : java Double) { +// InterferometryMission.observationTime(Mission, ObservationTime); +// ObserverCount == count find spacecraftWithInterferometryPayload(Mission, _); +// Coverage == eval(Math.pow(1 - 2.0 / ObserverCount, 1 + 9 * (1.0 / ObservationTime)) + 0.05 * ObservationTime / 3); +//} +// +//// Time +// +//pattern timeMetric(Time : java Double) { +// Time == sum find missionTime(_, #_); +//} +// +//private pattern missionTime(Mission : InterferometryMission, Time : java Double) { +// InterferometryMission.observationTime(Mission, ObservationTime); +// TrasmitTime == sum find transmitTime(Mission, _, #_); +// Time == eval(TrasmitTime + 60.0 * ObservationTime); +//} +// +//private pattern transmitTime(Mission : InterferometryMission, Spacecraft : Spacecraft, TransmitTime : java Double) { +// ConstellationMission.spacecraft(Mission, Spacecraft); +// find scienceData(Spacecraft, ScienceData); +// IncomingData == sum find incomingData(Spacecraft, _, #_); +// find transmitRate(Spacecraft, TransmitRate); +// TransmitTime == eval((ScienceData + IncomingData) / (7.5 * TransmitRate)); +//} +// +//private pattern incomingData(Spacecraft : Spacecraft, Source : Spacecraft, Data : java Double) { +// find indirectCommunicationLink(Source, Spacecraft); +// find scienceData(Source, Data); +//} +// +//private pattern scienceData(Spacecraft : Spacecraft, Data : java Double) { +// ConstellationMission.spacecraft(Mission, Spacecraft); +// InterferometryMission.observationTime(Mission, ObservationTime); +// Data == eval(12.0 * ObservationTime); +//} +// +//private pattern transmitRate(Spacecraft : Spacecraft, TransmitRate : java Double) { +// find spacecraftUplink(Spacecraft, Comm, Target); +// UHFCommSubsystem(Comm); +// Spacecraft(Target); +// TransmitRate == 5.0; +//} or { +// find spacecraftUplink(Spacecraft, Comm, Target); +// XCommSubsystem(Comm); +// Spacecraft(Target); +// TransmitRate == 1.6; +//} or { +// find spacecraftUplink(Spacecraft, Comm, Target); +// XCommSubsystem(Comm); +// GroundStationNetwork(Target); +// TransmitRate == 0.7; +//} or { +// find spacecraftUplink(Spacecraft, Comm, Target); +// KaCommSubsystem(Comm); +// Spacecraft(Target); +// TransmitRate == 220.0; +//} or { +// find spacecraftUplink(Spacecraft, Comm, Target); +// KaCommSubsystem(Comm); +// GroundStationNetwork(Target); +// TransmitRate == 80.0; +//} +// +//private pattern spacecraftUplink(Spacecraft : Spacecraft, TargetSubsystem : CommSubsystem, Target : CommunicatingElement) { +// CommunicatingElement.communicationLink(Spacecraft, Link); +// DirectedCommunicationLink.target(Link, TargetSubsystem); +// CommunicatingElement.commSubsystem(Target, TargetSubsystem); +//} +// +//// Cost +// +//pattern costMetric(Cost : java Double) { +// Cost == sum find missionCost(_, #_); +//} +// +//private pattern missionCost(Mission : InterferometryMission, Cost : java Double) { +// InterferometryMission.observationTime(Mission, ObservationTime); +// SpacecraftCost == sum find spacecraftCost(Mission, _, #_); +// Cost == eval(SpacecraftCost + 100000.0 * ObservationTime); +//} +// +//private pattern spacecraftCost(Mission : InterferometryMission, Spacecraft : Spacecraft, Cost : java Double) { +// ConstellationMission.spacecraft(Mission, Spacecraft); +// find spacecraftOfKindCount(Spacecraft, KindCount); +// find basePrice(Spacecraft, BasePrice); +// find interferometryPayloadCost(Spacecraft, InterferometryPayloadCost); +// find additionalCommSubsystemCost(Spacecraft, AdditionalCommSubsystemCost); +// Cost == eval(BasePrice * Math.pow(KindCount, -0.25) + InterferometryPayloadCost + AdditionalCommSubsystemCost); +//} +// +//private pattern spacecraftOfKindCount(Sat : Spacecraft, Count : java Integer) { +// CubeSat3U(Sat); +// Count == count find cubeSat3U(_); +//} or { +// CubeSat6U(Sat); +// Count == count find cubeSat6U(_); +//} or { +// SmallSat(Sat); +// Count == count find smallSat(_); +//} +// +//private pattern basePrice(Spacecraft : Spacecraft, BasePrice : java Double) { +// CubeSat3U(Spacecraft); +// BasePrice == 250000.0; +//} or { +// CubeSat6U(Spacecraft); +// BasePrice == 750000.0; +//} or { +// SmallSat(Spacecraft); +// BasePrice == 3000000.0; +//} +// +//private pattern interferometryPayloadCost(Spacecraft : Spacecraft, Cost : java Double) { +// find spacecraftWithInterferometryPayload(_, Spacecraft); +// Cost == 50000.0; +//} or { +// neg find spacecraftWithInterferometryPayload(_, Spacecraft); +// Cost == 0.0; +//} +// +//private pattern additionalCommSubsystemCost(Spacecraft : Spacecraft, Cost : java Double) { +// find spacecraftWithTwoCommSubsystems(Spacecraft); +// Cost == 100000.0; +//} or { +// neg find spacecraftWithTwoCommSubsystems(Spacecraft); +// Cost == 0.0; +//} +// +//private pattern spacecraftWithTwoCommSubsystems(Spacecraft : Spacecraft) { +// Spacecraft.commSubsystem(Spacecraft, Subsystem1); +// Spacecraft.commSubsystem(Spacecraft, Subsystem2); +// Subsystem1 != Subsystem2; +//} \ 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 index 592348e8..3d2cbbc7 100644 --- 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 @@ -6,8 +6,8 @@ final class SatelliteGeneratorMain { private new() { throw new IllegalStateException("This is a static utility class and should not be instantiated directly.") } - - static def void main(String[] args) { + + public static def void main(String[] args) { println(StandaloneScriptExecutor.executeScript("configs/generation.vsconfig")) } } -- cgit v1.2.3-70-g09d2