Skip to content
Snippets Groups Projects
Commit 6c7088da authored by Sebastian Ebert's avatar Sebastian Ebert
Browse files

firing of normal transitions

parent be02f282
Branches
No related tags found
No related merge requests found
Showing
with 280 additions and 11 deletions
...@@ -108,7 +108,7 @@ def ecoreInputFiles = [ecoreFile] ...@@ -108,7 +108,7 @@ def ecoreInputFiles = [ecoreFile]
def ecoreOutputFiles = [ecoreRelastAspect, def ecoreOutputFiles = [ecoreRelastAspect,
ecoreRelastGrammar] ecoreRelastGrammar]
def relastInputFiles = [ecoreRelastGrammar, './src/main/jastadd/base/marking/Marking.relast', './src/main/jastadd/engine/balloonMarking/BalloonMarking.relast', './src/main/jastadd/base/io/IoPN.relast', './src/main/jastadd/base/clauses/expressions.relast'] def relastInputFiles = [ecoreRelastGrammar, './src/main/jastadd/base/marking/Marking.relast', './src/main/jastadd/engine/balloonMarking/BalloonMarking.relast', './src/main/jastadd/engine/balloonMarking/BalloonExecution.relast', './src/main/jastadd/base/io/IoPN.relast', './src/main/jastadd/base/clauses/expressions.relast']
def relastOutputFiles = ['src/gen/jastadd/pnml/placeTransition.ast', 'src/gen/jastadd/pnml/placeTransition.jadd'] def relastOutputFiles = ['src/gen/jastadd/pnml/placeTransition.ast', 'src/gen/jastadd/pnml/placeTransition.jadd']
task ecoreToRelast(type: JavaExec) { task ecoreToRelast(type: JavaExec) {
......
aspect BalloonExecution { aspect BalloonExecution {
public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
if(enabledBalloonTransitions().isEmpty()) return Optional.empty();
List<BalloonToken> inToken = new ArrayList<>();
// take a token from each incoming place
for(Place place : transition.incomingPlaces()){
BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
Random rand = new Random();
int randVal = rand.nextInt(bmp.getNumBalloonMarking());
BalloonToken bt = bmp.getBalloonMarking(randVal);
inToken.add(bt);
bmp.getBalloonMarking(randVal).removeSelf();
}
BalloonTransition balloonTransition = callbackStorage.resolveBalloonTransition(transition);
BalloonToken result = de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken, balloonTransition.getBalloonCallbacks());
// place a token in each outgoing place
for(Place place : transition.outgoingPlaces()){
BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
bmp.getBalloonMarkingList().add(result);
}
if (requireFlush) {
// flush the entire marking tree
this.flushTreeCache();
}
return Optional.of(this);
}
public Optional<BalloonMarking> BalloonMarking.fireTopicSubscriberTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
return null;
}
public Optional<BalloonMarking> BalloonMarking.fireServiceClientTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
return null;
}
public BalloonCallbackStorage PetriNet.initializeCallbackStorage() {
BalloonCallbackStorage storage = new BalloonCallbackStorage();
storage.setPetriNet(this);
for (Transition transition : allTransitions()){
if(transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) {
BalloonTransition balloonTransition = new BalloonTransition();
balloonTransition.setTransition(transition);
storage.addTransition(balloonTransition);
}
}
return storage;
}
syn BalloonTransition BalloonCallbackStorage.resolveBalloonTransition(Transition transition) = execMap().get(transition);
syn lazy java.util.Map<Transition, BalloonTransition> BalloonCallbackStorage.execMap() {
java.util.Map<Transition, BalloonTransition> map = new java.util.HashMap<>();
for (BalloonTransition balloonTransition : getTransitionList()) {
map.put(balloonTransition.getTransition(), balloonTransition);
}
return map;
}
} }
\ No newline at end of file
BalloonCallbackStorage ::= PetriNet:PetriNet Transition:BalloonTransition*;
BalloonTransition ::= <BalloonCallbacks:java.util.List<de.tudresden.inf.st.pnml.engine.execution.TransitionCallback>>;
rel BalloonTransition.Transition -> Transition;
\ No newline at end of file
aspect BalloonMarking { aspect BalloonMarking {
public BalloonMarking PetriNet.initialBalloonMarking(PetriNet pn) throws IOException, SAXException, ParserConfigurationException { eq BalloonCallbackStorage.getPetriNet().marking() = null;
eq BalloonMarking.getPetriNet().marking() = null;
public BalloonMarking PetriNet.initializeBalloonMarking() throws IOException, SAXException, ParserConfigurationException {
BalloonMarking marking = new BalloonMarking(); BalloonMarking marking = new BalloonMarking();
marking.setPetriNet(pn); marking.setPetriNet(this);
for (Place place : allPlaces()) { for (Place place : allPlaces()) {
...@@ -16,12 +20,14 @@ aspect BalloonMarking { ...@@ -16,12 +20,14 @@ aspect BalloonMarking {
token.setValue(val); token.setValue(val);
markedPlace.getBalloonMarkingList().add(token); markedPlace.getBalloonMarkingList().add(token);
} }
marking.addPlace(markedPlace);
} }
return marking; return marking;
} }
syn BalloonMarkedPlace BalloonMarking.resolvePlace(Place place) = balloonPlaceMap().get(place); syn BalloonMarkedPlace BalloonMarking.resolveBalloonPlace(Place place) = balloonPlaceMap().get(place);
syn lazy java.util.Map<Place, BalloonMarkedPlace> BalloonMarking.balloonPlaceMap() { syn lazy java.util.Map<Place, BalloonMarkedPlace> BalloonMarking.balloonPlaceMap() {
...@@ -33,7 +39,7 @@ aspect BalloonMarking { ...@@ -33,7 +39,7 @@ aspect BalloonMarking {
return map; return map;
} }
syn BalloonMarkedPlace BalloonMarking.resolvePlaceById(String placeID) { syn BalloonMarkedPlace BalloonMarking.resolveBalloonPlaceById(String placeID) {
for (BalloonMarkedPlace markedPlace : getPlaceList()) { for (BalloonMarkedPlace markedPlace : getPlaceList()) {
if(markedPlace.getPlace().getId().equals(placeID)){ if(markedPlace.getPlace().getId().equals(placeID)){
...@@ -46,13 +52,13 @@ aspect BalloonMarking { ...@@ -46,13 +52,13 @@ aspect BalloonMarking {
syn java.util.List<String> BalloonMarking.marking(Place place) { syn java.util.List<String> BalloonMarking.marking(Place place) {
java.util.List<String> marking = new ArrayList<>(); java.util.List<String> marking = new ArrayList<>();
for(BalloonToken bt : resolvePlace(place).getBalloonMarkingList()){ for(BalloonToken bt : resolveBalloonPlace(place).getBalloonMarkingList()){
marking.add(bt.getValue()); marking.add(bt.getValue());
} }
return marking; return marking;
} }
syn boolean BalloonMarking.isEnabled(Transition t) { syn boolean BalloonMarking.isBalloonEnabled(Transition t) {
for (Place place : t.incomingPlaces()) { for (Place place : t.incomingPlaces()) {
if (marking(place).size() == 0) return false; if (marking(place).size() == 0) return false;
...@@ -63,13 +69,13 @@ aspect BalloonMarking { ...@@ -63,13 +69,13 @@ aspect BalloonMarking {
syn boolean BalloonMarking.isDead() { syn boolean BalloonMarking.isDead() {
for (Transition transition : getPetriNet().allTransitions()) { for (Transition transition : getPetriNet().allTransitions()) {
if (isEnabled(transition)) return false; if (isBalloonEnabled(transition)) return false;
} }
return true; return true;
} }
syn java.util.Set<Transition> BalloonMarking.enabledTransitions() syn java.util.Set<Transition> BalloonMarking.enabledBalloonTransitions()
= getPetriNet().allTransitions().stream() = getPetriNet().allTransitions().stream()
.filter(t -> isEnabled(t)) .filter(t -> isBalloonEnabled(t))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
\ No newline at end of file
aspect BalloonPrinting {
syn String BalloonMarking.print() {
StringBuilder b = new StringBuilder();
b.append("Marking for Petri net '").append(getPetriNet().name()).append("':\n");
for (BalloonMarkedPlace place : getPlaceList()) {
b.append(" ").append(place.getPlace().name()).append(": \n");
for(BalloonToken bt : place.getBalloonMarkingList()){
b.append(bt.getValue()).append("\n");
}
}
b.append("Transitions for Petri net '").append(getPetriNet().name()).append("':\n");
for (Transition trans : getPetriNet().allTransitions()) {
b.append(" ").append(trans.name()).append(": ").append(isBalloonEnabled(trans)?"true":"false").append("\n");
}
return b.toString();
}
}
\ No newline at end of file
package de.tudresden.inf.st.pnml.engine;
import de.tudresden.inf.st.pnml.engine.execution.DefaultFinalTransitionCallback;
import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback;
import de.tudresden.inf.st.pnml.jastadd.model.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-2.pnml";
PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
BalloonMarking bm = petriNet.initializeBalloonMarking();
BalloonCallbackStorage bcs = petriNet.initializeCallbackStorage();
TransitionCallback tc = new DefaultFinalTransitionCallback("default_final_cb", 1);
List<TransitionCallback> tcl = new ArrayList<>();
tcl.add(tc);
System.out.println("----- BEFORE -----");
System.out.println(bm.print());
for(Transition t : petriNet.allTransitions()){
bcs.resolveBalloonTransition(t).setBalloonCallbacks(tcl);
}
for(Transition t : petriNet.allTransitions()){
if(bm.isBalloonEnabled(t)){
bm.fireTransition(t, bcs, false);
break;
}
}
System.out.println("----- AFTER -----");
System.out.println(bm.print());
}
}
package de.tudresden.inf.st.pnml.engine.execution;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
import java.util.ArrayList;
import java.util.List;
public class DefaultFinalTransitionCallback extends TransitionCallback{
public DefaultFinalTransitionCallback(String id, int priority) {
super(id, priority);
}
@Override
public List<BalloonToken> processToken(List<BalloonToken> tokens) {
List<BalloonToken> tl = new ArrayList<>();
tl.add(tokens.get(0));
return tl;
}
}
\ No newline at end of file
package de.tudresden.inf.st.pnml.engine.execution;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
import java.util.List;
public class DefaultTransitionCallback extends TransitionCallback{
public DefaultTransitionCallback(String id, int priority) {
super(id, priority);
}
@Override
public List<BalloonToken> processToken(List<BalloonToken> tokens) {
return tokens;
}
}
package de.tudresden.inf.st.pnml.engine.execution;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public abstract class TransitionCallback {
protected static final Logger logger = LoggerFactory.getLogger(TransitionCallback.class);
private String id;
private int priority;
public TransitionCallback(String id, int priority) {
this.id = id;
this.priority = priority;
}
public String getId() {
return id;
}
public int getPriority() {
return priority;
}
public List<BalloonToken> processToken(List<BalloonToken> tokens) {
return tokens;
}
}
package de.tudresden.inf.st.pnml.engine.execution;
import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Automatically sort and call the callbacks.
*/
public class TransitionCallbackExecutor {
protected static final Logger logger = LoggerFactory.getLogger(TransitionCallbackExecutor.class);
public static final BalloonToken execute(List<BalloonToken> inTokens, List<TransitionCallback> callbacks){
List<TransitionCallback> callbacksSorted = new ArrayList<>();
List<BalloonToken> outTokens = new ArrayList<>();
outTokens.addAll(inTokens);
callbacks.addAll(callbacks);
Collections.sort(callbacksSorted, Comparator.comparingInt(TransitionCallback::getPriority));
for(int i = 0; i < callbacksSorted.size(); i++){
if(i < callbacksSorted.size() - 1){
outTokens = callbacksSorted.get(i).processToken(outTokens);
} else {
outTokens = new ArrayList<>();
outTokens.add(callbacksSorted.get(i).processToken(outTokens).get(0));
}
}
if(outTokens.size() != 1){
logger.error("Error! Wrong output token size.");
}
logger.info("Created new output token: " + outTokens.get(0));
return outTokens.get(0);
}
}
...@@ -21,7 +21,7 @@ public class BalloonTokenParsing { ...@@ -21,7 +21,7 @@ public class BalloonTokenParsing {
List<String> marking = new ArrayList<>(); List<String> marking = new ArrayList<>();
for (ToolInfo ti : place.getToolspecifics()) { for (ToolInfo ti : place.getToolspecifics()) {
if (ti.getFormattedXMLBuffer().lastIndexOf(BalloonConstants.BALLOON_MARKING) == -1) { if (ti.getFormattedXMLBuffer().lastIndexOf(BalloonConstants.BALLOON_MARKING) != -1) {
StringBuffer toolInfoStringBuffer = ti.getFormattedXMLBuffer(); StringBuffer toolInfoStringBuffer = ti.getFormattedXMLBuffer();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment