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

logical clauses for input signal eval

parent 66b26339
No related branches found
No related tags found
No related merge requests found
Showing
with 546 additions and 10 deletions
......@@ -30,6 +30,11 @@ idea.module.generatedSourceDirs += file('src/gen/java')
sourceSets.main.java.srcDir "src/gen/java"
jar.manifest.attributes('Main-Class': 'de.tudresden.inf.st.pnml.Main')
configurations {
myBeaver
}
dependencies {
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jackson_version}"
implementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
......@@ -53,10 +58,13 @@ dependencies {
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
myBeaver group: 'net.sf.beaver', name: 'beaver-ant', version: '0.9.11'
jastadd2 "org.jastadd:jastadd:2.3.4"
}
// Default run configuration
run {
mainClassName = 'de.tudresden.inf.st.pnml.Main'
standardInput = System.in
......@@ -116,13 +124,41 @@ task relastToJastAdd(type: JavaExec) {
"--file",
relastFile,
"./src/main/jastadd/marking/Marking.relast",
"./src/main/jastadd/io/IoPN.relast"
"./src/main/jastadd/io/IoPN.relast",
"./src/main/jastadd/clauses/expressions.relast"
}
task generateBeaver(type: JavaExec) {
inputs.files {
project.file("src/main/jastadd/clauses/Parser.beaver")
}
outputs.dir {
// This closure is needed to delay reading the genDir setting.
project.file("src/gen/java/de/tudresden/inf/st/pnml/jastadd/parser")
}
classpath = configurations.myBeaver
main = 'beaver.comp.run.Make'
doFirst {
def outdir = project.file("src/gen/java/de/tudresden/inf/st/pnml/jastadd/parser")
if (!outdir.isDirectory()) {
outdir.mkdirs()
}
def inputFile = project.file("src/main/jastadd/clauses/Parser.beaver")
args ([ '-d', outdir.path, '-t', '-c', '-w', inputFile.path ])
}
}
// Third phase: JastAdd -> Java (using JastAdd Gradle plugin)
jastadd {
configureModuleBuild()
modules {
module("pnml") {
java {
......@@ -143,6 +179,7 @@ jastadd {
scanner {
include "src/main/jastadd/PnmlScanner.flex"
include "src/main/jastadd/clauses/expressions.flex"
}
parser {
......@@ -174,6 +211,6 @@ jastadd {
// Workflow configuration for phases
relastToJastAdd.dependsOn ecoreToRelast
generateAst.dependsOn relastToJastAdd
compileJava.dependsOn generateBeaver
//// always run jastadd
//jastadd.outputs.upToDateWhen {false}
%header {:
package de.tudresden.inf.st.pnml.jastadd.parser;
import de.tudresden.inf.st.pnml.jastadd.model.*; :};
%terminals AND;
%terminals OR;
%terminals NOT;
%terminals VARIABLE;
%typeof goal = "expressions";
%typeof exp = "Exp";
%goal goal;
goal =
exp.exp {: return new Symbol(new Root(exp)); :}
;
exp =
exp.a AND.AND exp.b {: return new Symbol(new AndExp(a, b)); :}
| exp.a OR.OR exp.b {: return new Symbol(new OrExp(a, b)); :}
| NOT.NOT exp.exp {: return new Symbol(new NotExp(exp)); :}
| VARIABLE.v {: return new Symbol(new Var(((String)v.value))); :}
;
package de.tudresden.inf.st.pnml.jastadd.scanner;
import de.tudresden.inf.st.pnml.jastadd.parser.Parser.Terminals;
%%
%public
%final
%class ExpressionScanner
%extends beaver.Scanner
%type beaver.Symbol
%function nextToken
%yylexthrow beaver.Scanner.Exception
%line
%column
%{
private beaver.Symbol sym(short id) {
return new beaver.Symbol(id, yyline + 1, yycolumn + 1, yylength(), yytext());
}
%}
WhiteSpace = [ ] | \t | \f
NewLine = \n | \r | \r\n
Variable = [:jletter:][:jletterdigit:]*
%%
// discard whitespace information
{WhiteSpace} { }
// token definitions
"AND" { return sym(Terminals.AND); }
"OR" { return sym(Terminals.OR); }
"NOT" { return sym(Terminals.NOT); }
{Variable} { return sym(Terminals.VARIABLE); }
<<EOF>> { return sym(Terminals.EOF); }
import de.tudresden.inf.st.data.ClauseValuesDefinition;
aspect SignalExpressions {
syn String ASTNode.printExp();
syn boolean Exp.eval(ClauseValuesDefinition defs);
eq ASTNode.printExp() = "";
eq Root.printExp() {
String result = "";
result += getExp().printExp();
return result;
}
eq AndExp.printExp() = getA().printExp() + " AND " + getB().printExp();
eq OrExp.printExp() = getA().printExp() + " OR " + getB().printExp();
eq Var.printExp() = getName();
eq NotExp.printExp() = "NOT " + getExp().printExp();
eq AndExp.eval(ClauseValuesDefinition defs) = getA().eval(defs) && getB().eval(defs);
eq OrExp.eval(ClauseValuesDefinition defs) = getA().eval(defs) || getB().eval(defs);
eq Var.eval(ClauseValuesDefinition defs) = defs.getDef(this.getName());
eq NotExp.eval(ClauseValuesDefinition defs) = !getExp().eval(defs);
}
\ No newline at end of file
Root ::= Exp ;
abstract Exp ;
abstract UnaryExp:Exp ::= Exp ;
abstract BinExp:Exp ::= A:Exp B:Exp ;
AndExp:BinExp ;
OrExp:BinExp ;
Var:Exp ::= <Name:String> ;
NotExp:UnaryExp ;
......@@ -35,4 +35,8 @@ aspect PnDistribution {
syn lazy String RefTransition.getSubnet() {
return de.tudresden.inf.st.pnml.ToolSpecificsParser.getSubnetFromToolSpecifics(this.getToolspecificList());
}
syn lazy Root InputSignalTransition.getInputSignalClause(){
return de.tudresden.inf.st.pnml.ToolSpecificsParser.getClauseFromToolSpecifics(this.getToolspecificList());
}
}
\ No newline at end of file
......@@ -8,7 +8,7 @@ DefaultTransitionInformation : TransitionInformation;
PlaceInformation ::= <Location:String> <Type:String> <SubNet:String> <Instance:String>;
InputSignalTransition : Transition ::= /StaticInputSignalBinding:InputSignalBinding*/ MutualInputSignalBinding:InputSignalBinding* /StaticTransitionInformation:TransitionInformation/ [MutualTransitionInformation:TransitionInformation];
InputSignalTransition : Transition ::= /StaticInputSignalBinding:InputSignalBinding*/ MutualInputSignalBinding:InputSignalBinding* /StaticTransitionInformation:TransitionInformation/ [MutualTransitionInformation:TransitionInformation] /InputSignalClause:Root/;
OutputSignalPlace : Place ::= /OutputSignalBinding*/ /StaticPlaceInformation:PlaceInformation/ [MutualPlaceInformation:PlaceInformation];
OutputMapping;
......@@ -16,3 +16,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>;
......@@ -64,4 +64,6 @@ public final class PnmlConstants {
public static final String RESULT_KEY = "result";
public static final String UPPER_BOUND_KEY = "upperbound";
public static final String LOWER_BOUND_KEY = "lowerbound";
public static final String CLAUSE_KEY = "inputsignalclause";
}
package de.tudresden.inf.st.data;
import java.util.HashMap;
public class ClauseValuesDefinition {
private HashMap<String, Boolean> defs;
public ClauseValuesDefinition(){
defs = new HashMap<String, Boolean>();
}
public HashMap<String, Boolean> getDefs() {
return defs;
}
public Boolean getDef(String id) {
return defs.get(id);
}
public void addDef(String id, Boolean def) {
defs.put(id, def);
}
}
......@@ -19,13 +19,13 @@ public class Main {
String inputPath = (args.length > 0) ? args[0] : null;
if(inputPath == null){
logger.error("No model found on given input path.");
return;
}
// if(inputPath == null){
// logger.error("No model found on given input path.");
// return;
// }
//List<PetriNet> petriNets = PnmlParser.parsePnml("src/main/nets/refNet2.pnml");
List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath);
List<PetriNet> petriNets = PnmlParser.parsePnml("src/main/nets/inputSignalNet.pnml");
// List<PetriNet> petriNets = PnmlParser.parsePnml(inputPath);
List<List<PetriNet>> disconnectedPetriNets = new ArrayList<>();
// petriNets.forEach(pn -> disconnectedPetriNets.add(GlobalToLocalNetsPostProcessor.disconnectNets(pn)));
......
package de.tudresden.inf.st.pnml;
import beaver.Symbol;
import de.tudresden.inf.st.constants.PnmlConstants;
import de.tudresden.inf.st.pnml.jastadd.model.*;
......@@ -16,11 +17,38 @@ import org.xml.sax.SAXException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import de.tudresden.inf.st.pnml.jastadd.scanner.ExpressionScanner;
import de.tudresden.inf.st.pnml.jastadd.parser.Parser;
public class ToolSpecificsParser {
private static final Logger logger = LoggerFactory.getLogger(ToolSpecificsParser.class);
public static Root getClauseFromToolSpecifics(JastAddList<ToolInfo> toolInfos) {
if (toolInfos.getNumChild() > 0) {
try {
Document doc = parseToolSpecifics(toolInfos);
NodeList locationList = doc.getElementsByTagName(PnmlConstants.CLAUSE_KEY);
if (locationList.getLength() > 0 && locationList.item(0) != null) {
String content = locationList.item(0).getTextContent();
StringReader reader = new StringReader(content);
ExpressionScanner scanner = new ExpressionScanner(reader);
Parser parser = new Parser();
return ((Root) parser.parse(scanner));
}
} catch (ParserConfigurationException | SAXException | IOException | beaver.Parser.Exception e) {
logger.error(e.getMessage());
}
}
return new Root();
}
public static String getLocationFromToolSpecifics(JastAddList<ToolInfo> toolInfos) {
if (toolInfos.getNumChild() > 0) {
......
......@@ -2,6 +2,7 @@ package de.tudresden.inf.st.postprocessing;
import de.tudresden.inf.st.constants.PnmlConstants;
import de.tudresden.inf.st.copy.CopyPrimitiveElements;
import de.tudresden.inf.st.data.ClauseValuesDefinition;
import de.tudresden.inf.st.data.Tuple3;
import de.tudresden.inf.st.pnml.jastadd.model.*;
import org.slf4j.Logger;
......@@ -222,6 +223,10 @@ public class PostProcessingUtils {
logger.info("--- Transition: " + t.getId());
}
if(t.asInputSignalTransition().getInputSignalClause() != null && t.asInputSignalTransition().getInputSignalClause().getNumChild() > 0){
logger.info("------ Clause: " + t.asInputSignalTransition().getInputSignalClause().printExp());
}
for (Place p : t.asInputSignalTransition().incomingPlaces()) {
logger.info("------ Inputplace: " + p.getName().getText() + " subnet: " + p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet() + " ---------");
......
<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.1">
</toolspecific>
<page id="g-E2D0-BCF68-1">
<place id="p1">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="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>
<transition id="t1">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
<!-- <location>channel</location>
<subnet>channel</subnet>-->
<location>node-1</location>
<subnet>subnet-1</subnet>
<type>discreteTransitionType</type>
<!-- <topic>sampleTopic</topic>
<inputlimit>10</inputlimit>
<outputlimit>10</outputlimit>-->
<inputsignalbindings>
<inputsignalbinding>
<transitionID>t1</transitionID>
<inputsignalID>is1</inputsignalID>
<initialvalue>1</initialvalue>
</inputsignalbinding>
<inputsignalbinding>
<transitionID>t1</transitionID>
<inputsignalID>is2</inputsignalID>
<initialvalue>1</initialvalue>
</inputsignalbinding>
</inputsignalbindings>
<inputsignalclause>is1 AND NOT is2</inputsignalclause>
</toolspecific>
<name>
<text>t1</text>
<graphics>
<offset x="0" y="0"/>
</graphics>
</name>
<graphics>
<position x="300" y="50"/>
</graphics>
</transition>
<arc id="arc-p1-t1" source="p1" target="t1">
</arc>
</page>
</net>
</pnml>
\ No newline at end of file
<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>
<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>
<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>p1</text>
<graphics>
<offset x="0" y="-10" />
</graphics>
</name>
<initialMarking>
<text>1</text>
</initialMarking>
<graphics>
<position x="635" y="90"/>
</graphics>
</place>
<place id="p3">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>node-1</location>
<type>discretePlaceType</type>
<outputsignalbindings>
<outputsignalbinding>
<placeID>p3</placeID>
<outputsignalID>os5</outputsignalID>
<initialvalue>4</initialvalue> <!-- -1 = undefined -->
<outputmappings>
<equal>
<value>1</value>
<result>1</result>
</equal>
<threshold>
<value>2</value>
<result>0</result>
</threshold>
</outputmappings>
</outputsignalbinding>
</outputsignalbindings>
</toolspecific>
<name>
<text>p3</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>discreteTransitionType</type>
<inputsignalbindings>
<inputsignalbinding>
<transitionID>t1</transitionID>
<inputsignalID>is1</inputsignalID>
<initialvalue>1</initialvalue>
</inputsignalbinding>
<inputsignalbinding>
<transitionID>t1</transitionID>
<inputsignalID>is3</inputsignalID>
<initialvalue>1</initialvalue>
</inputsignalbinding>
</inputsignalbindings>
</toolspecific>
<name>
<text>t0</text>
<graphics>
<offset x="0" y="0" />
</graphics>
</name>
<graphics>
<position x="300" y="50"/>
</graphics>
</transition>
<transition id="t2">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>node-1</location>
<type>discreteTransitionType</type>
<inputsignalbindings>
<inputsignalbinding>
<transitionID>t2</transitionID>
<inputsignalID>is2</inputsignalID>
<initialvalue>0</initialvalue>
</inputsignalbinding>
<inputsignalbinding>
<transitionID>t2</transitionID>
<inputsignalID>is5</inputsignalID>
<initialvalue>0</initialvalue>
</inputsignalbinding>
</inputsignalbindings>
<inputsignalclause>is2 AND NOT is5</inputsignalclause>
</toolspecific>
<name>
<text>t1</text>
<graphics>
<offset x="0" y="0" />
</graphics>
</name>
<graphics>
<position x="285" y="205"/>
</graphics>
</transition>
<transition id="t3">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>node-1</location>
<type>unlimitedChannelOutType</type>
<topic>c1</topic>
<inputsignalbindings>
<inputsignalbinding>
<transitionID>t3</transitionID>
<inputsignalID>is3</inputsignalID>
<initialvalue>1</initialvalue>
</inputsignalbinding>
</inputsignalbindings>
</toolspecific>
<name>
<text>t3</text>
<graphics>
<offset x="0" y="0" />
</graphics>
</name>
<graphics>
<position x="265" y="205"/>
</graphics>
</transition>
<transition id="t4">
<toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
<location>node-1</location>
<type>unlimitedChannelInType</type>
<topic>c1</topic>
<inputsignalbindings>
<inputsignalbinding>
<transitionID>t4</transitionID>
<inputsignalID>is4</inputsignalID>
<initialvalue>1</initialvalue>
</inputsignalbinding>
</inputsignalbindings>
</toolspecific>
<name>
<text>t4</text>
<graphics>
<offset x="0" y="0" />
</graphics>
</name>
<graphics>
<position x="205" y="205"/>
</graphics>
</transition>
<arc id="arc-t2-p1" source="t2" target="p1">
</arc>
<arc id="arc-p2-t2" source="p2" target="t2">
</arc>
<arc id="arc-t1-p2" source="t1" target="p2">
</arc>
<arc id="arc-p1-t1" source="p1" target="t1">
</arc>
<arc id="arc-p1-t3" source="p1" target="t3">
</arc>
<arc id="arc-t4-p3" source="t4" target="p3">
</arc>
</page>
</net>
</pnml>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment