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

work on parser, clean up

parent d28ecede
No related branches found
No related tags found
No related merge requests found
aspect Graphviz {
syn String PetriNet.toDot() {
StringBuffer b = new StringBuffer();
b.append("digraph \"").append(name()).append("\" {\n")
.append(" rankdir=LR;\n")
.append(" center=true; margin=1;\n")
.append("\n")
.append(" subgraph places {\n")
.append(" node [shape=circle,fixedsize=true,label=\"\", height=.3,width=.3];\n");
for (Place place : allPlaces()) {
b.append(" ").append(place.dotId()).append(" [");
if (place.hasName()) b.append("xlabel=\"").append(place.name()).append("\", ");
b.append("label=\"").append("0").append("\"];\n");
}
b.append(" }\n\n");
b.append(" subgraph transitions {\n")
.append(" node [shape=rect,height=0.4,width=.4];\n");
for (Transition transition : allTransitions()) {
b.append(" ").append(transition.dotId()).append(" [");
if (transition.hasName()) b.append("label=\"").append(transition.name()).append("\"");
b.append("]\n");
}
b.append(" }\n\n");
for (Arc arc : allArcs()) {
b.append(" ").append(arc.getSource().dotId()).append("->").append(arc.getTarget().dotId()).append(";\n");
}
b.append("}\n");
return b.toString();
}
syn String PetriNet.dotId() = "\"" + getId().replaceAll("\"", "\\\"") + "\"";
syn String PnObject.dotId() = "\"" + getId().replaceAll("\"", "\\\"") + "\"";
}
...@@ -8,6 +8,14 @@ aspect PnDistribution { ...@@ -8,6 +8,14 @@ aspect PnDistribution {
return de.tudresden.inf.st.pnml.ToolSpecificsParser.getTransitionTypeFromToolSpecifics(this.getToolspecificList()); return de.tudresden.inf.st.pnml.ToolSpecificsParser.getTransitionTypeFromToolSpecifics(this.getToolspecificList());
} }
syn lazy String Transition.topic(){
return de.tudresden.inf.st.pnml.ToolSpecificsParser.getTopic(this.getToolspecificList());
}
syn lazy String Transition.subnetInfo(){
return de.tudresden.inf.st.pnml.ToolSpecificsParser.getTransitionSubnetInfo(this.getToolspecificList());
}
syn lazy String Place.location() { syn lazy String Place.location() {
return de.tudresden.inf.st.pnml.ToolSpecificsParser.getLocationFromToolSpecifics(this.getToolspecificList()); return de.tudresden.inf.st.pnml.ToolSpecificsParser.getLocationFromToolSpecifics(this.getToolspecificList());
} }
...@@ -16,15 +24,15 @@ aspect PnDistribution { ...@@ -16,15 +24,15 @@ aspect PnDistribution {
return de.tudresden.inf.st.pnml.ToolSpecificsParser.getPlaceTypeFromToolSpecifics(this.getToolspecificList()); return de.tudresden.inf.st.pnml.ToolSpecificsParser.getPlaceTypeFromToolSpecifics(this.getToolspecificList());
} }
syn lazy Boolean Transition.isLimitedChannelTransition() { syn lazy String Place.subnetInfo(){
return de.tudresden.inf.st.pnml.ToolSpecificsParser.isLimitedChannelTransitionType(this.getToolspecificList()); return de.tudresden.inf.st.pnml.ToolSpecificsParser.getPlaceSubnetInfo(this.getToolspecificList());
} }
syn lazy int Transition.channelLimit() { syn lazy Integer Transition.inputLimit(){
return de.tudresden.inf.st.pnml.ToolSpecificsParser.getLimitedChannelTransitionValue(this.getToolspecificList()); return de.tudresden.inf.st.pnml.ToolSpecificsParser.getTransitionOutputLimit(this.getToolspecificList());
} }
syn lazy String Transition.getTopic(){ syn lazy Integer Transition.outputLimit(){
return de.tudresden.inf.st.pnml.ToolSpecificsParser.getTopic(this.getToolspecificList()); return de.tudresden.inf.st.pnml.ToolSpecificsParser.getTransitionInputLimit(this.getToolspecificList());
} }
} }
\ No newline at end of file
import de.tudresden.inf.st.pnml.PnmlConstants;
aspect Execution {
public boolean Marking.fireInPlace() {
return fireInPlace(new Random());
}
public boolean Marking.fireInPlace(java.util.Random random) {
return fireInPlace(random, true).isPresent();
}
public Optional<Marking> Marking.fireTransition(Transition transition, boolean requireFlush) {
if(transition.type().equals(PnmlConstants.TRANSITION_TYPE_DISCRETE)){
transition.incomingPlaces().forEach(place -> this.resolvePlace(place).setMarking(this.resolvePlace(place).getMarking()-1));
transition.outgoingPlaces().forEach(place -> this.resolvePlace(place).setMarking(this.resolvePlace(place).getMarking()+1));
if (requireFlush) {
this.flushTreeCache();
}
return Optional.of(this);
}
return null;
}
public Optional<Marking> Marking.fireChannelTransitionOutput(Transition transition, boolean requireFlush) {
if(transition.type().equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_OUT)
|| transition.type().equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_UNLIMITED_OUT)){
transition.incomingPlaces().forEach(place -> this.resolvePlace(place).setMarking(this.resolvePlace(place).getMarking()-1));
if (requireFlush) {
this.flushTreeCache();
}
return Optional.of(this);
}
return null;
}
public Optional<Marking> Marking.fireChannelTransitionInput(Transition transition, boolean requireFlush) {
if(transition.type().equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_IN)
|| transition.type().equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_UNLIMITED_IN)){
transition.outgoingPlaces().forEach(place -> this.resolvePlace(place).setMarking(this.resolvePlace(place).getMarking()+1));
if (requireFlush) {
this.flushTreeCache();
}
return Optional.of(this);
}
return null;
}
private Optional<Marking> Marking.fireInPlace(java.util.Random random, boolean requireFlush) {
if(enabledTransitions().isEmpty()) return Optional.empty();
// select a random transition
Transition transition = enabledTransitions().stream()
.sorted((t1, t2) -> t1.getId().compareTo(t2.getId()))
.skip(random.nextInt(enabledTransitions().size()))
.findFirst().get();
// take a token from each incoming place
transition.incomingPlaces().forEach(place -> this.resolvePlace(place).setMarking(this.resolvePlace(place).getMarking()-1));
// place a token in each outgoing place
transition.outgoingPlaces().forEach(place -> this.resolvePlace(place).setMarking(this.resolvePlace(place).getMarking()+1));
if (requireFlush) {
// flush the entire marking tree
this.flushTreeCache();
}
return Optional.of(this);
}
public java.util.Collection<Place> Marking.collectIncomingPlace(Transition transition){
return transition.incomingPlaces();
}
public java.util.Collection<Place> Marking.collectOutgoingPlace(Transition transition){
return transition.outgoingPlaces();
}
public Optional<Marking> Marking.fire() {
return fire(new Random());
}
public Optional<Marking> Marking.fire(java.util.Random random) {
return treeCopyNoTransform().fireInPlace(random, false);
}
}
...@@ -5,14 +5,7 @@ public final class PnmlConstants { ...@@ -5,14 +5,7 @@ public final class PnmlConstants {
public static final String TRANSITION_TYPE_DISCRETE = "discreteTransitionType"; public static final String TRANSITION_TYPE_DISCRETE = "discreteTransitionType";
public static final String TRANSITION_TYPE_CONTINUOUS = "continuousTransitionType"; public static final String TRANSITION_TYPE_CONTINUOUS = "continuousTransitionType";
public static final String TRANSITION_TYPE_CHANNEL_AC = "acChannelTransitionType"; public static final String TRANSITION_TYPE_TOPIC = "topicTransitionType";
public static final String TRANSITION_TYPE_CHANNEL_NOT_AC = "notAcChannelTransitionType";
public static final String TRANSITION_TYPE_CHANNEL_ACK_AC = "ackAcChannelTransitionType";
public static final String TRANSITION_TYPE_CHANNEL_LIMITED_IN = "limitedChannelInType";
public static final String TRANSITION_TYPE_CHANNEL_UNLIMITED_IN = "unlimitedChannelInType";
public static final String TRANSITION_TYPE_CHANNEL_LIMITED_OUT = "limitedChannelOutType";
public static final String TRANSITION_TYPE_CHANNEL_UNLIMITED_OUT = "unlimitedChannelOutType";
public static final String PLACE_TYPE_DISCRETE = "discretePlaceType"; public static final String PLACE_TYPE_DISCRETE = "discretePlaceType";
public static final String PLACE_TYPE_CONTINUOUS = "continuousPlaceType"; public static final String PLACE_TYPE_CONTINUOUS = "continuousPlaceType";
......
...@@ -49,11 +49,7 @@ public class ToolSpecificsParser { ...@@ -49,11 +49,7 @@ public class ToolSpecificsParser {
if (typeList.getLength() > 0 && typeList.item(0) != null) { if (typeList.getLength() > 0 && typeList.item(0) != null) {
String type = typeList.item(0).getTextContent(); String type = typeList.item(0).getTextContent();
if (type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_AC) || type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_ACK_AC) || if (!type.equals(PnmlConstants.TRANSITION_TYPE_CONTINUOUS) || type.equals(PnmlConstants.TRANSITION_TYPE_DISCRETE) || type.equals(PnmlConstants.TRANSITION_TYPE_TOPIC)) {
type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_NOT_AC) || !type.equals(PnmlConstants.TRANSITION_TYPE_CONTINUOUS)
|| type.equals(PnmlConstants.TRANSITION_TYPE_DISCRETE) || type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_IN)
|| type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_UNLIMITED_IN)|| type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_OUT)
|| type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_UNLIMITED_OUT)) {
return type; return type;
} else { } else {
logger.error("Error: Invalid transition type configured."); logger.error("Error: Invalid transition type configured.");
...@@ -92,29 +88,6 @@ public class ToolSpecificsParser { ...@@ -92,29 +88,6 @@ public class ToolSpecificsParser {
return ""; return "";
} }
public static Boolean isLimitedChannelTransitionType(JastAddList<ToolInfo> toolInfos) {
if (toolInfos.getNumChild() > 0) {
try {
Document doc = parseToolSpecifics(toolInfos);
NodeList typeList = doc.getElementsByTagName(PnmlConstants.TYPE_KEY);
if (typeList.getLength() > 0 && typeList.item(0) != null) {
String type = typeList.item(0).getTextContent();
if ( type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_IN) || type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_UNLIMITED_IN)
|| type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_OUT) || type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_UNLIMITED_OUT)) {
return true;
} else {
return false;
}
}
} catch (ParserConfigurationException | SAXException | IOException e) {
logger.error(e.getMessage());
}
}
return false;
}
public static String getTopic(JastAddList<ToolInfo> toolInfos) { public static String getTopic(JastAddList<ToolInfo> toolInfos) {
if (toolInfos.getNumChild() > 0) { if (toolInfos.getNumChild() > 0) {
...@@ -128,8 +101,7 @@ public class ToolSpecificsParser { ...@@ -128,8 +101,7 @@ public class ToolSpecificsParser {
String type = typeList.item(0).getTextContent(); String type = typeList.item(0).getTextContent();
if ( type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_IN) || type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_UNLIMITED_IN) if (type.equals(PnmlConstants.TRANSITION_TYPE_TOPIC)) {
|| type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_OUT) || type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_UNLIMITED_OUT)) {
return topicList.item(0).getTextContent(); return topicList.item(0).getTextContent();
} }
} }
...@@ -142,28 +114,20 @@ public class ToolSpecificsParser { ...@@ -142,28 +114,20 @@ public class ToolSpecificsParser {
return null; return null;
} }
public static int getLimitedChannelTransitionValue(JastAddList<ToolInfo> toolInfos) { public static String getTransitionSubnetInfo(JastAddList<ToolInfo> toolInfos){
return "";
if (toolInfos.getNumChild() > 0) {
try {
Document doc = parseToolSpecifics(toolInfos);
NodeList typeList = doc.getElementsByTagName(PnmlConstants.TYPE_KEY);
if (typeList.getLength() > 0 && typeList.item(0) != null) {
String type = typeList.item(0).getTextContent();
if (type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_IN) || type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_IN)
||type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_IN) ||type.equals(PnmlConstants.TRANSITION_TYPE_CHANNEL_LIMITED_IN)) {
NodeList boundList = doc.getElementsByTagName(PnmlConstants.LIMIT_KEY);
return Integer.valueOf(boundList.item(0).getTextContent());
} else {
return -1;
}
} }
} catch (ParserConfigurationException | SAXException | IOException e) {
logger.error(e.getMessage()); public static String getPlaceSubnetInfo(JastAddList<ToolInfo> toolInfos){
return "";
} }
public static int getTransitionOutputLimit(JastAddList<ToolInfo> toolInfos) {
return 0;
} }
return -1;
public static int getTransitionInputLimit(JastAddList<ToolInfo> toolInfos) {
return 0;
} }
private static Document parseToolSpecifics(JastAddList<ToolInfo> toolInfos) throws ParserConfigurationException, SAXException, IOException { private static Document parseToolSpecifics(JastAddList<ToolInfo> toolInfos) throws ParserConfigurationException, SAXException, IOException {
......
<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
<net id="n-E2D0-BCF46-0" type ="http://www.pnml.org/version-2009/grammar/ptnet">
<name>
<text>minimal</text>
</name>
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
</toolspecific>
<page id="g-E2D0-BCF68-1">
<place id="p1">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>node-1</location>
<subnet>subnet-1</subnet>
<type>discretePlaceType</type>
<outputsignalbindings>
<outputsignalbinding>
<placeID>p1</placeID>
<outputsignalID>os2</outputsignalID>
<initialvalue>1</initialvalue> <!-- -1 = undefined -->
<outputmappings>
<equal>
<value>1</value>
<result>3</result>
</equal>
<equal>
<value>0</value>
<result>2</result>
</equal>
<threshold>
<value>6</value>
<result>0</result>
</threshold>
<range>
<upperbound>5</upperbound>
<lowerbound>3</lowerbound>
<result>1</result>
</range>
</outputmappings>
</outputsignalbinding>
</outputsignalbindings>
</toolspecific>
<name>
<text>p1</text>
<graphics>
<offset x="0" y="-10" />
</graphics>
</name>
<initialMarking>
<text>1</text>
</initialMarking>
<graphics>
<position x="30" y="50"/>
</graphics>
</place>
<place id="p2">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>node-1</location>
<subnet>subnet-1</subnet>
<type>discretePlaceType</type>
<outputsignalbindings>
<outputsignalbinding>
<placeID>p2</placeID>
<outputsignalID>os1</outputsignalID>
<initialvalue>4</initialvalue> <!-- -1 = undefined -->
<outputmappings>
<equal>
<value>1</value>
<result>1</result>
</equal>
<threshold>
<value>6</value>
<result>0</result>
</threshold>
<range>
<upperbound>5</upperbound>
<lowerbound>3</lowerbound>
<result>1</result>
</range>
</outputmappings>
</outputsignalbinding>
</outputsignalbindings>
</toolspecific>
<name>
<text>p2</text>
<graphics>
<offset x="0" y="-10" />
</graphics>
</name>
<initialMarking>
<text>1</text>
</initialMarking>
<graphics>
<position x="635" y="90"/>
</graphics>
</place>
<transition id="t1">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>node-1</location>
<type>topicTransitionType</type>
<inputlimit>10</inputlimit>
<outputlimit>10</outputlimit>
<inputsignalbindings>
<inputsignalbinding>
<transitionID>t1</transitionID>
<inputsignalID>is1</inputsignalID>
<initialvalue>1</initialvalue>
</inputsignalbinding>
</inputsignalbindings>
</toolspecific>
<name>
<text>t1</text>
<graphics>
<offset x="0" y="0" />
</graphics>
</name>
<graphics>
<position x="300" y="50"/>
</graphics>
</transition>
<arc id="arc-t2-p1" source="p1" target="t1">
</arc>
<arc id="arc-p2-t2" source="t1" target="p2">
</arc>
</page>
</net>
</pnml>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment