aboutsummaryrefslogtreecommitdiffstats
path: root/Domains/hu.bme.mit.inf.dslreasoner.domains.cps/xtend-gen/hu/bme/mit/inf/dslreasoner/domains/cps/dse/RuleBasedCpsSolver.java
blob: fd3487523c341540a18e3d36fafe382f1583cb87 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package hu.bme.mit.inf.dslreasoner.domains.cps.dse;

import hu.bme.mit.inf.dslreasoner.domains.cps.ApplicationInstance;
import hu.bme.mit.inf.dslreasoner.domains.cps.CpsFactory;
import hu.bme.mit.inf.dslreasoner.domains.cps.CpsPackage;
import hu.bme.mit.inf.dslreasoner.domains.cps.CyberPhysicalSystem;
import hu.bme.mit.inf.dslreasoner.domains.cps.HostInstance;
import hu.bme.mit.inf.dslreasoner.domains.cps.dse.CpsStateCoder;
import hu.bme.mit.inf.dslreasoner.domains.cps.queries.Allocate;
import hu.bme.mit.inf.dslreasoner.domains.cps.queries.AverageFreeHddMetric;
import hu.bme.mit.inf.dslreasoner.domains.cps.queries.AverageFreeMemoryMetric;
import hu.bme.mit.inf.dslreasoner.domains.cps.queries.CostMetric;
import hu.bme.mit.inf.dslreasoner.domains.cps.queries.CreateHostInstance;
import hu.bme.mit.inf.dslreasoner.domains.cps.queries.GuidanceObjective;
import hu.bme.mit.inf.dslreasoner.domains.cps.queries.RequirementNotSatisfied;
import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.CompositeDirectionalThresholdObjective;
import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveKind;
import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.ObjectiveThreshold;
import hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner.optimization.QueryBasedObjective;
import java.util.Collection;
import java.util.function.Consumer;
import org.eclipse.emf.common.util.EList;
import org.eclipse.viatra.dse.api.DesignSpaceExplorer;
import org.eclipse.viatra.dse.api.Solution;
import org.eclipse.viatra.dse.evolutionary.EvolutionaryStrategy;
import org.eclipse.viatra.dse.evolutionary.EvolutionaryStrategyBuilder;
import org.eclipse.viatra.dse.objectives.Fitness;
import org.eclipse.viatra.transformation.runtime.emf.rules.batch.BatchTransformationRuleFactory;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.InputOutput;

@SuppressWarnings("all")
public class RuleBasedCpsSolver {
  @Extension
  private final BatchTransformationRuleFactory _batchTransformationRuleFactory = new BatchTransformationRuleFactory();
  
  @Extension
  private final CpsFactory _cpsFactory = CpsFactory.eINSTANCE;
  
  public void solve(final CyberPhysicalSystem problem) {
    final DesignSpaceExplorer dse = new DesignSpaceExplorer();
    dse.addMetaModelPackage(CpsPackage.eINSTANCE);
    dse.setInitialModel(problem.eResource().getResourceSet());
    final Consumer<RequirementNotSatisfied.Match> _function = (RequirementNotSatisfied.Match it) -> {
      final ApplicationInstance app = this._cpsFactory.createApplicationInstance();
      EList<ApplicationInstance> _instances = it.getReq().getType().getInstances();
      _instances.add(app);
      EList<ApplicationInstance> _instances_1 = it.getReq().getInstances();
      _instances_1.add(app);
    };
    dse.addTransformationRule(this._batchTransformationRuleFactory.<RequirementNotSatisfied.Match, RequirementNotSatisfied.Matcher>createRule(RequirementNotSatisfied.instance()).action(_function).build());
    final Consumer<Allocate.Match> _function_1 = (Allocate.Match it) -> {
      ApplicationInstance _app = it.getApp();
      _app.setAllocatedTo(it.getHost());
    };
    dse.addTransformationRule(this._batchTransformationRuleFactory.<Allocate.Match, Allocate.Matcher>createRule(Allocate.instance()).action(_function_1).build());
    final Consumer<CreateHostInstance.Match> _function_2 = (CreateHostInstance.Match it) -> {
      EList<HostInstance> _instances = it.getHostType().getInstances();
      HostInstance _createHostInstance = this._cpsFactory.createHostInstance();
      _instances.add(_createHostInstance);
    };
    dse.addTransformationRule(this._batchTransformationRuleFactory.<CreateHostInstance.Match, CreateHostInstance.Matcher>createRule(CreateHostInstance.instance()).action(_function_2).build());
    GuidanceObjective _instance = GuidanceObjective.instance();
    ObjectiveThreshold.Inclusive _inclusive = new ObjectiveThreshold.Inclusive(0);
    QueryBasedObjective _queryBasedObjective = new QueryBasedObjective(_instance, ObjectiveKind.LOWER_IS_BETTER, _inclusive, 0);
    AverageFreeMemoryMetric _instance_1 = AverageFreeMemoryMetric.instance();
    ObjectiveThreshold.Inclusive _inclusive_1 = new ObjectiveThreshold.Inclusive(0.75);
    QueryBasedObjective _queryBasedObjective_1 = new QueryBasedObjective(_instance_1, ObjectiveKind.LOWER_IS_BETTER, _inclusive_1, 0);
    AverageFreeHddMetric _instance_2 = AverageFreeHddMetric.instance();
    ObjectiveThreshold.Inclusive _inclusive_2 = new ObjectiveThreshold.Inclusive(0.75);
    QueryBasedObjective _queryBasedObjective_2 = new QueryBasedObjective(_instance_2, ObjectiveKind.LOWER_IS_BETTER, _inclusive_2, 0);
    CompositeDirectionalThresholdObjective _compositeDirectionalThresholdObjective = new CompositeDirectionalThresholdObjective("Composite", _queryBasedObjective, _queryBasedObjective_1, _queryBasedObjective_2);
    dse.addObjective(_compositeDirectionalThresholdObjective);
    CostMetric _instance_3 = CostMetric.instance();
    QueryBasedObjective _queryBasedObjective_3 = new QueryBasedObjective(_instance_3, ObjectiveKind.LOWER_IS_BETTER, 
      ObjectiveThreshold.NO_THRESHOLD, 0);
    dse.addObjective(_queryBasedObjective_3);
    dse.setMaxNumberOfThreads(1);
    CpsStateCoder.Factory _factory = new CpsStateCoder.Factory();
    dse.setStateCoderFactory(_factory);
    final EvolutionaryStrategy strategy = EvolutionaryStrategyBuilder.createNsga2Strategy(25);
    dse.startExplorationWithTimeout(strategy, ((2 * 60) * 1000));
    Collection<Solution> _solutions = dse.getSolutions();
    for (final Solution solution : _solutions) {
      Object _stateCode = solution.getStateCode();
      String _plus = ("Found solution: " + _stateCode);
      String _plus_1 = (_plus + " ");
      Fitness _fitness = solution.getArbitraryTrajectory().getFitness();
      String _plus_2 = (_plus_1 + _fitness);
      InputOutput.<String>println(_plus_2);
    }
  }
}