From ab53ab36d2d79e234a211af195ff18b63ea29704 Mon Sep 17 00:00:00 2001 From: SebastianEbert <sebastian.ebert@tu-dresden.de> Date: Fri, 22 Jul 2022 18:16:03 +0200 Subject: [PATCH] fixed several bugs --- src/main/jastadd/base/Navigation.jrag | 40 ++++++++++++- .../base/distribution/DistributedPN.jadd | 4 +- src/main/jastadd/base/io/IoPN.jadd | 56 +++++++++++++++++++ src/main/jastadd/base/io/IoPN.relast | 3 +- src/main/jastadd/base/marking/Marking.jrag | 2 +- src/main/jastadd/base/marking/Marking.relast | 2 +- .../base/parsing/ToolSpecificsParser.jadd | 6 +- .../PnmlTransitionInputResolver.jadd | 55 ++++++++++++++++++ 8 files changed, 160 insertions(+), 8 deletions(-) create mode 100644 src/main/jastadd/base/resolving/PnmlTransitionInputResolver.jadd diff --git a/src/main/jastadd/base/Navigation.jrag b/src/main/jastadd/base/Navigation.jrag index adad23c..f90d77c 100644 --- a/src/main/jastadd/base/Navigation.jrag +++ b/src/main/jastadd/base/Navigation.jrag @@ -7,7 +7,9 @@ aspect Navigation { java.util.Set<Place> s = new java.util.HashSet<>(); for (Arc incomingArc : getInArcList()) { - s.add(incomingArc.getSource().asPlaceNode().place()); + if(!incomingArc.getSource().asPlaceNode().isRefPlace()){ + s.add(incomingArc.getSource().asPlaceNode().place()); + } } for (TransitionNode ref : getReferencingTransitions()) { @@ -16,6 +18,23 @@ aspect Navigation { return s; } + + syn java.util.Collection<RefPlace> TransitionNode.incomingRefPlaces() { + + java.util.Set<RefPlace> s = new java.util.HashSet<>(); + + for (Arc incomingArc : getInArcList()) { + if(incomingArc.getSource().asPlaceNode().isRefPlace()){ + s.add(incomingArc.getSource().asPlaceNode().asRefPlace()); + } + } + + for (TransitionNode ref : getReferencingTransitions()) { + s.addAll(ref.incomingRefPlaces()); + } + + return s; + } syn java.util.Collection<Place> TransitionNode.outgoingPlaces() { @@ -41,6 +60,9 @@ aspect Navigation { syn boolean PnObject.isPageNode() = false; eq Page.isPageNode() = true; + syn boolean PnObject.isPlaceObject() = false; + eq Place.isPlaceObject() = true; + syn boolean Node.isPlaceNode() = false; eq PlaceNode.isPlaceNode() = true; @@ -119,6 +141,11 @@ aspect Navigation { to PetriNet.allPlaces() for petriNet(); + coll java.util.Set<PlaceNode> PetriNet.allPlaceNodes() [new java.util.HashSet()] root PetriNet; + PlaceNode contributes this + to PetriNet.allPlaceNodes() + for petriNet(); + coll java.util.Set<Transition> PetriNet.allTransitions() [new java.util.HashSet()] root PetriNet; Transition contributes this to PetriNet.allTransitions() @@ -181,6 +208,17 @@ aspect Navigation { return null; } + syn Transition PetriNet.getTransitionById(String id) { + + for (Transition t : this.allTransitions()) { + if (t.getId().equals(id)) { + return t; + } + } + + return null; + } + syn RefTransition PetriNet.getRefTransitionFromTransitionNode(TransitionNode tNode) { if (tNode.isRefTransition()) { diff --git a/src/main/jastadd/base/distribution/DistributedPN.jadd b/src/main/jastadd/base/distribution/DistributedPN.jadd index 6aefa36..8ef3a73 100644 --- a/src/main/jastadd/base/distribution/DistributedPN.jadd +++ b/src/main/jastadd/base/distribution/DistributedPN.jadd @@ -4,7 +4,7 @@ aspect PnDistribution { syn TransitionInformation InputSignalTransition.getStaticTransitionInformation() { - if(this.getMutualTransitionInformation() == null){ + if(!this.hasMutualTransitionInformation()){ TransitionInformation tInfo = ToolSpecificsParser.getTransitionInformation(this.getToolspecificList()); return tInfo; } @@ -14,7 +14,7 @@ aspect PnDistribution { syn PlaceInformation OutputSignalPlace.getStaticPlaceInformation() { - if(this.getMutualPlaceInformation() == null){ + if(!this.hasMutualPlaceInformation()){ PlaceInformation tInfo = ToolSpecificsParser.getPlaceInformationInformation(this.getToolspecificList()); return tInfo; } diff --git a/src/main/jastadd/base/io/IoPN.jadd b/src/main/jastadd/base/io/IoPN.jadd index e6d9f22..9d6671d 100644 --- a/src/main/jastadd/base/io/IoPN.jadd +++ b/src/main/jastadd/base/io/IoPN.jadd @@ -6,6 +6,12 @@ aspect IoPnExtension{ eq Marking.getPetriNet().marking() = this; + inh BalloonMarking OutputSignalPlace.balloonMarking(); + + eq PetriNetDoc.getChild().balloonMarking() = null; + + eq BalloonMarking.getPetriNet().balloonMarking() = this; + inh Place OutputSignalBinding.containingPlace(); eq OutputSignalPlace.getOutputSignalBinding().containingPlace() = this; @@ -36,6 +42,56 @@ aspect IoPnExtension{ // updates automatically based on dependencies to the corresponding place syn String OutputSignalBinding.getOutputSignalValue(){ + OutputSignalPlace osp = this.containingPlace().asOutputSignalPlace(); + BalloonMarking marking = osp.balloonMarking(); + BalloonMarkedPlace markedPlace = marking.resolveBalloonPlaceById(this.getPlaceID()); + + JastAddList<EqualityOutputMapping> eomList = this.getEqualityOMListNoTransform(); + JastAddList<ThresholdOutputMapping> tomList = this.getThresholdOMListNoTransform(); + JastAddList<RangeOutputMapping> romList = this.getRangeOMListNoTransform(); + + // eom + int result = -1; + for (EqualityOutputMapping eom : eomList) { + if ((eom.getValue() == markedPlace.getNumBalloonMarking()) && result == -1) { + result = eom.getResult(); + break; + } + } + + // tom + if (result > -1) { + for (ThresholdOutputMapping tom : tomList) { + if (tom.getValue() <= markedPlace.getNumBalloonMarking()) { + result = tom.getResult(); + break; + } + } + } + + // rom + if (result > -1) { + for (RangeOutputMapping rom : romList) { + if ((rom.getLowerBound() <= markedPlace.getNumBalloonMarking()) && (rom.getUpperBound() >= markedPlace.getNumBalloonMarking())) { + result = rom.getResult(); + break; + } + } + } + + // 0 (disabled Signal) is default + if (result == -1) { + result = 0; + } + + String output = String.valueOf(result) + "-" + this.getOutputSignalID(); + + return output; + } + + + syn String OutputSignalBinding.getOutputSignalValueForDefaultMarking(){ + OutputSignalPlace osp = this.containingPlace().asOutputSignalPlace(); Marking marking = osp.marking(); MarkedPlace markedPlace = marking.resolvePlaceById(this.getPlaceID()); diff --git a/src/main/jastadd/base/io/IoPN.relast b/src/main/jastadd/base/io/IoPN.relast index 60241c8..2bcffec 100644 --- a/src/main/jastadd/base/io/IoPN.relast +++ b/src/main/jastadd/base/io/IoPN.relast @@ -15,5 +15,4 @@ OutputMapping; EqualityOutputMapping : OutputMapping ::= <Value:java.lang.Integer> <Result:java.lang.Integer>; ThresholdOutputMapping : OutputMapping ::= <Value:java.lang.Integer> <Result:java.lang.Integer>; -RangeOutputMapping : OutputMapping ::= <UpperBound:java.lang.Integer> <LowerBound:java.lang.Integer> <Result:java.lang.Integer>; - +RangeOutputMapping : OutputMapping ::= <UpperBound:java.lang.Integer> <LowerBound:java.lang.Integer> <Result:java.lang.Integer>; \ No newline at end of file diff --git a/src/main/jastadd/base/marking/Marking.jrag b/src/main/jastadd/base/marking/Marking.jrag index 17c5f98..eb4df0d 100644 --- a/src/main/jastadd/base/marking/Marking.jrag +++ b/src/main/jastadd/base/marking/Marking.jrag @@ -33,7 +33,7 @@ aspect Marking { syn MarkedPlace Marking.resolvePlace(Place place) = placeMap().get(place); - syn lazy java.util.Map<Place, MarkedPlace> Marking.placeMap() { + syn java.util.Map<Place, MarkedPlace> Marking.placeMap() { java.util.Map<Place, MarkedPlace> map = new java.util.HashMap<>(); for (MarkedPlace markedPlace : getPlaceList()) { map.put(markedPlace.getPlace(), markedPlace); diff --git a/src/main/jastadd/base/marking/Marking.relast b/src/main/jastadd/base/marking/Marking.relast index 487b282..aedc4d5 100644 --- a/src/main/jastadd/base/marking/Marking.relast +++ b/src/main/jastadd/base/marking/Marking.relast @@ -1,4 +1,4 @@ Marking ::= PetriNet:PetriNet Place:MarkedPlace*; MarkedPlace ::= <Marking:int>; -rel MarkedPlace.Place -> Place; +rel MarkedPlace.Place -> Place; \ No newline at end of file diff --git a/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd b/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd index e6936bc..6d25585 100644 --- a/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd +++ b/src/main/jastadd/base/parsing/ToolSpecificsParser.jadd @@ -267,7 +267,11 @@ aspect ToolSpecificsParser{ Document doc = parseToolSpecifics(toolInfos); String transitionType = getTransitionTypeFromToolSpecifics(toolInfos); - if (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC))) { + if ((transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC))) || + (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN))) || + (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_OUT))) || + (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN))) || + (transitionType != null && (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_OUT)))) { org.w3c.dom.NodeList limList = doc.getElementsByTagName(limitType); diff --git a/src/main/jastadd/base/resolving/PnmlTransitionInputResolver.jadd b/src/main/jastadd/base/resolving/PnmlTransitionInputResolver.jadd new file mode 100644 index 0000000..b5fd333 --- /dev/null +++ b/src/main/jastadd/base/resolving/PnmlTransitionInputResolver.jadd @@ -0,0 +1,55 @@ +aspect PnmlTransitionInputResolver { + + public Set<Place> Transition.resolveInputPlaces(){ + + Set<Place> inputs = (Set<Place>) this.incomingPlaces(); + Set<RefPlace> refPlaces = (Set<RefPlace>) this.incomingRefPlaces(); + + for(RefPlace rp : refPlaces){ + + Place root = null; + RefPlace iterRef = rp; + + while (root == null){ + if(iterRef.getRef().isPlace()){ + root = iterRef.getRef().asPlace(); + }else { + iterRef = rp.getRef().asRefPlace(); + } + } + + if(root != null){ + inputs.add(root); + } + } + + return inputs; + } + + public Set<Place> Transition.resolveOutputPlaces(){ + + Set<Place> outputs = (Set<Place>) this.outgoingPlaces(); + + for (Arc outgoing : this.getOutArcList()) { + if(outgoing.getTarget() != null && outgoing.getTarget().asRefPlace() != null){ + + Place root = null; + RefPlace iterRef = outgoing.getTarget().asRefPlace(); + + while (root == null){ + if(iterRef.getRef().isPlace()){ + root = iterRef.getRef().asPlace(); + }else { + iterRef = iterRef.getRef().asRefPlace(); + } + } + + if(root != null){ + outputs.add(root); + } + } + } + + return outputs; + } +} \ No newline at end of file -- GitLab