diff options
author | Ed Willink | 2017-02-11 09:42:13 +0000 |
---|---|---|
committer | Ed Willink | 2017-02-11 17:05:41 +0000 |
commit | 207462552d1e9a905097fc475dc742139fa96a7a (patch) | |
tree | be9450f4d261e0469656e9ab7d0ff96a07e6820e | |
parent | f079ab89bcb687d25b76a20d2c62f61fc587c248 (diff) | |
download | org.eclipse.qvtd-207462552d1e9a905097fc475dc742139fa96a7a.tar.gz org.eclipse.qvtd-207462552d1e9a905097fc475dc742139fa96a7a.tar.xz org.eclipse.qvtd-207462552d1e9a905097fc475dc742139fa96a7a.zip |
Simple PL2SC init ok
5 files changed, 89 insertions, 211 deletions
diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java index ab98f743f..3e3c4d0cd 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/QVTrCompilerTests.java @@ -310,7 +310,7 @@ public class QVTrCompilerTests extends LoadTestCase // AbstractTransformer.INVOCATIONS.setState(true); // QVTm2QVTp.PARTITIONING.setState(true); // QVTr2QVTc.VARIABLES.setState(true); -// QVTp2QVTs.REGION_ORDER.setState(true); + // QVTp2QVTs.REGION_ORDER.setState(true); MyQVT myQVT = new MyQVT("forward2reverse"); try { Class<? extends Transformer> txClass = myQVT.buildTransformation("forward2reverse", @@ -468,7 +468,7 @@ public class QVTrCompilerTests extends LoadTestCase // AbstractTransformer.EXCEPTIONS.setState(true); // AbstractTransformer.INVOCATIONS.setState(true); // QVTm2QVTp.PARTITIONING.setState(true); -// QVTp2QVTs.REGION_ORDER.setState(true); + // QVTp2QVTs.REGION_ORDER.setState(true); MyQVT myQVT = new MyQVT("iterated2iterated"); myQVT.addUsedGenPackage("org.eclipse.emf.ecore/model/Ecore.genmodel", "//ecore"); try { @@ -491,6 +491,35 @@ public class QVTrCompilerTests extends LoadTestCase } @Test + public void testQVTrCompiler_PN2SC_CG() throws Exception { + // Splitter.GROUPS.setState(true); + // Splitter.RESULT.setState(true); + // Splitter.STAGES.setState(true); + // AbstractTransformer.EXCEPTIONS.setState(true); + // AbstractTransformer.INVOCATIONS.setState(true); + // QVTm2QVTp.PARTITIONING.setState(true); + MyQVT myQVT = new MyQVT("pn2sc"); + try { + Class<? extends Transformer> txClass = myQVT.buildTransformation("pn2sc", "PetriNet2StateChart.qvtr", "sc", + "http://www.eclipse.org/qvtd/xtext/qvtrelation/tests/pn2sc/PNtoSC", false);//, + // "SeqMM.SeqMMPackage", "PSeqToStm.PSeqToStmPackage"); + // + myQVT.createGeneratedExecutor(txClass); + myQVT.loadInput("pn", "testcase0-in.petrinet"); + myQVT.executeTransformation(); + myQVT.saveOutput("sc", "testcase0-out_CG.statechart", "testcase0-out.statechart", null); + // + // myQVT.createGeneratedExecutor(txClass); + // myQVT.loadInput("seqDgm", "SeqUM.xmi"); + // myQVT.executeTransformation(); + // myQVT.saveOutput("stm", "StmcUM_CG.xmi", "StmcUM_expected.xmi", null); + } + finally { + myQVT.dispose(); + } + } + + @Test public void testQVTrCompiler_SeqToStm() throws Exception { // AbstractTransformer.EXCEPTIONS.setState(true); // AbstractTransformer.INVOCATIONS.setState(true); diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/PetriNet2StateChart.qvtr b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/PetriNet2StateChart.qvtr index 98361d91c..7ab7824ba 100644 --- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/PetriNet2StateChart.qvtr +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/PetriNet2StateChart.qvtr @@ -16,34 +16,35 @@ package org::eclipse::qvtd::xtext::qvtrelation::tests::pn2sc { * Transform a PetriNet into a StateChart. * See: https://github.com/louismrose/ttc_pn2sc/ and https://arxiv.org/pdf/1312.0342.pdf */ - transformation PetriNet2StateChart(pn:pnMM, pn1:pnMM, sc1:scMM, pn2:pnMM, sc2:scMM, sc:scMM) + transformation PetriNet2StateChart(pn:pnMM, sc:scMM) { - key scMM::AND{contains}; - key scMM::OR{contains}; - - top relation Net2StateChart { + top relation Init_Net2StateChart { domain pn net : Net {}; enforce domain sc statechart : Statechart { - topState = ts : AND {} + topState = ts : AND { + name = 'top' + } }; } - top relation Place2Basic { + top relation Init_Place2Basic { sc : scMM::Statechart; topState : scMM::AND; + placeName : String; domain pn p : Place { cnet = net : Net{} , - name = placeName : String{} + name = placeName }; enforce domain sc b : Basic { name = placeName, rcontains = o : OR { + name = placeName.replaceFirst('E','O'), rcontains = topState } { topState = sc.topState } }; when { - Net2StateChart(net, sc); + Init_Net2StateChart(net, sc); } } @@ -71,223 +72,49 @@ package org::eclipse::qvtd::xtext::qvtrelation::tests::pn2sc { } } */ - top relation Transition2HyperEdge { + top relation Init_Transition2HyperEdge { + sc : scMM::Statechart; + topState : scMM::AND; + transitionName : String; domain pn t : Transition { - name = transitionName : String{} + cnet = net : Net{} , + name = transitionName }; enforce domain sc e : HyperEdge { - name = transitionName - }; + name = transitionName, + rcontains = topState + }{ topState = sc.topState }; + when { + Init_Net2StateChart(net, sc); + } } - top relation Transition2HyperEdge_Content { -- no need to do both bidirectionals - domain pn postp:Place { - pret = t:Transition{} + top relation Init_Transition2HyperEdge_Post { + domain pn prep:Place { + postt = t:Transition{} }; enforce domain sc rnext:State { - rnext = e:HyperEdge{} + next = e:HyperEdge{} }; when { - Place2Basic(postp, rnext); - Transition2HyperEdge(t, e); + Init_Place2Basic(prep, rnext); + Init_Transition2HyperEdge(t, e); } } - - top relation Roots2Roots { - domain pn1 fromNet : Net{}; - domain sc1 fromTopState : AND{Statechart = fromStatechart : Statechart{}}; - enforce domain pn2 toNet : Net{}; - enforce domain sc2 toTopState : AND{Statechart = toStatechart : Statechart{}}; - } - - /** - * Return the maximal Set of Places that can be ANDed with a given Place. - * An AND of shared post-Transitions is preferred to an AND of shared pre-Transitions. - * Returns an empty Set if no AND is possible. - */ - query getAndSet(place : pnMM::Place) : OrderedSet(pnMM::Place) { - let preTransitions = place.pret->asOrderedSet() in - let postTransitions = place.postt->asOrderedSet() in - let prePostPlaces = preTransitions.postp->asOrderedSet() in - let postPrePlaces = postTransitions.prep->asOrderedSet() in - if postPrePlaces->forAll(p | p.postt = postTransitions) and prePostPlaces->forAll(p | p.pret->includesAll(preTransitions)) then postPrePlaces - elseif prePostPlaces->forAll(p | p.pret = preTransitions) and postPrePlaces->forAll(p | p.postt->includesAll(postTransitions)) then prePostPlaces - else OrderedSet{} - endif - } - - /** - * Return the first pair of Places that can be ORed with a given Place. - * Within a region of eligible OR candidates, only the first candidate is - * considered. This avoids complexity with overlapping concurrent ORs at the expense of - * only resolving one OR per candidate region per pass. Returns an empty Set if this - * place is not part of the firsr candidate. - */ - query getOrPair(place : pnMM::Place) : OrderedSet(pnMM::Place) { - let preTransitions = place.pret->asOrderedSet() in - let postTransitions = place.postt->asOrderedSet() in - let prePostPlaces = preTransitions.postp->asOrderedSet() in - let postPrePlaces = postTransitions.prep->asOrderedSet() in - if postPrePlaces->forAll(p | p.postt = postTransitions) and prePostPlaces->forAll(p | p.pret->includesAll(preTransitions)) then postPrePlaces - elseif prePostPlaces->forAll(p | p.pret = preTransitions) and postPrePlaces->forAll(p | p.postt->includesAll(postTransitions)) then prePostPlaces - else OrderedSet{} - endif - } - top relation PlaceState2PlaceState { - fromNet : pnMM::Net[1]; - fromTopState : scMM::AND[1]; - toNet : pnMM::Net[1]; - toTopState : scMM::AND[1]; - domain pn1 fromPlace:Place{ - cnet = fromNet - }; - domain sc1 fromState:State{ - rcontains = fromTopState + top relation Init_Transition2HyperEdge_Pre { + domain pn postp:Place { + pret = t:Transition{} + }; + enforce domain sc next:State { + rnext = e:HyperEdge{} }; - enforce domain pn2 - toPlace:Place{ - cnet = toNet - }; - enforce domain sc2 - toState:State{ - rcontains = toTopState - }; when { - Roots2Roots(fromNet, fromTopState, toNet, toTopState); + Init_Place2Basic(postp, next); + Init_Transition2HyperEdge(t, e); } } - top relation PlaceState2AndPlaceState overrides PlaceState2PlaceState{ - fromNet : pnMM::Net[1]; - fromTopState : scMM::AND[1]; --- fromParentState : scMM::State[1]; - toNet : pnMM::Net[1]; - toTopState : scMM::AND[1]; --- toParentState : scMM::State[1]; - fromPlaces : OrderedSet(pnMM::Place)[1] = getAndSet(fromPlace); - toAndState : scMM::AND[1]; - domain pn1 - fromPlace:Place{ - cnet = fromNet - }; - domain sc1 - fromState:State{ - rcontains = fromTopState - }; - enforce domain pn2 - toPlace:Place{ - cnet = toNet - }; - enforce domain sc2 - toOrState:OR{ - rcontains = toTopState, - contains = toAndState - }; - when { - fromPlaces->notEmpty(); - Roots2Roots(fromNet, fromTopState, toNet, toTopState); --- AndPlaces2AndPlaceStates(fromPlaces, toPlace, toStates); - AndPlaces2AndState(fromPlaces, toAndState); - } - } - - relation AndPlaces2AndState { - domain pn1 - fromPlaces : OrderedSet(Place){fromPlace:Place{} ++ _}; --- domain pn2 --- toPlace:Place{}; - enforce domain sc2 - toState:AND{ - contains = toStates : OrderedSet(State){aState:State{} ++ _} - }; - when { - fromPlaces->indexOf(fromPlace) = toStates->indexOf(toState); - Places2States(fromPlaces, toStates); - Place2State(fromPlace, aState); - } - } - - relation Places2States { - domain pn1 - places : OrderedSet(Place){place:Place{} ++ _}; - domain sc1 - states : OrderedSet(State){state:State{} ++ _}; - when { - Place2State(place, state); - } - } - - relation Place2State { - domain pn1 place:Place{}; - enforce domain sc2 state:State{}; - } - - - top relation PlaceState2OrPlaceState overrides PlaceState2PlaceState{ - fromNet : pnMM::Net[1]; - fromTopState : scMM::AND[1]; --- fromParentState : scMM::State[1]; - toNet : pnMM::Net[1]; - toTopState : scMM::AND[1]; --- toParentState : scMM::State[1]; - orPlaces : OrderedSet(pnMM::Place)[1] = getOrPair(fromPlace); - orStates : OrderedSet(scMM::State)[1]; - domain pn1 - fromPlace:Place{ - cnet = fromNet - }; - domain sc1 - fromState:State{ - rcontains = fromTopState - }; - enforce domain pn2 - toPlace:Place{ - cnet = toNet - }; - enforce domain sc2 - toState:OR{ --- rcontains = toParentState, - rcontains = toTopState, - contains = orStates - }; - when { - orPlaces->notEmpty(); - Roots2Roots(fromNet, fromTopState, toNet, toTopState); - Places2States(orPlaces, orStates); - } - } - - -/* top relation CreateAND { - otherTtoPs:OrderedSet(pnMM::Place); - domain pnsc1 - pTot:PlaceToTransition{ - place = q:Place{}, - transition = t:Transition{ - TransitionToPlace = :OrderedSet(TransitionToPlace){r:Place{} ++ otherTtoPs} - } - } - { - pn_qs->forAll(pret = pn_q1.pret) and - pn_qs->forAll(postt = pn_q1.postt) - }; - enforce domain pnsc2 - pn_t_out:Transition{ - prep = pn_qs:Set(Place){pn_q1:Place{} ++ pn_qs} - } - { - pn_qs->forAll(pret = pn_q1.pret) and - pn_qs->forAll(postt = pn_q1.postt) - }; - pn_p:Place{}, - sc_p:OR{ - contains = sc_a:AND{ --- contains = sc_a_qs:Sequence(State){sc_q1,sc_q2 ++ _} - } - }; - } */ - /*retype Place to Basic migrate Place { var container = new SC!OR; diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-in.petrinet b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-in.petrinet new file mode 100644 index 000000000..efde3009a --- /dev/null +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-in.petrinet @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<pnet:Net xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" + xmlns:pnet="http://uam.es/PetriNets" + xsi:schemaLocation="http://uam.es/PetriNets ../PetriNets.ecore" + xmi:id="$29"> + <places xmi:id="$27" name="E10" pret="$6"/> + <places xmi:id="$0" name="E9" postt="$6"/> + <transitions xmi:id="$6" name="E17" prep="$0" postp="$27"/> +</pnet:Net> diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-out.statechart b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-out.statechart new file mode 100644 index 000000000..eb4b2d1cb --- /dev/null +++ b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase0-out.statechart @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<schart:Statechart xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:schart="http://uam.es/StateCharts" + xsi:schemaLocation="http://uam.es/StateCharts java://org.eclipse.qvtd.xtext.qvtrelation.tests.pn2sc.statecharts.statechartsPackage"> + <topState name="top"> + <contains xsi:type="schart:OR" name="O10"> + <contains xsi:type="schart:Basic" name="E10" rnext="#//@topState/@contains.2"/> + </contains> + <contains xsi:type="schart:OR" name="O9"> + <contains xsi:type="schart:Basic" name="E9" next="#//@topState/@contains.2"/> + </contains> + <contains xsi:type="schart:HyperEdge" name="E17" next="#//@topState/@contains.0/@contains.0" rnext="#//@topState/@contains.1/@contains.0"/> + </topState> +</schart:Statechart> diff --git a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase01.png b/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase01.png Binary files differdeleted file mode 100644 index 42284e975..000000000 --- a/tests/org.eclipse.qvtd.xtext.qvtrelation.tests/src/org/eclipse/qvtd/xtext/qvtrelation/tests/pn2sc/samples/testcase01.png +++ /dev/null |