diff --git a/src/main/jastadd/flatter/transforms/SignalTransforms.jadd b/src/main/jastadd/flatter/transforms/SignalTransforms.jadd index fc91a03ac5222925a18cf825a9a600c6b3a6fb28..e1cdcb51d5c02d797c1d565f02a9237f1d772cdb 100644 --- a/src/main/jastadd/flatter/transforms/SignalTransforms.jadd +++ b/src/main/jastadd/flatter/transforms/SignalTransforms.jadd @@ -1,6 +1,6 @@ aspect SignalTransforms { - syn PetriNet PetriNet.transformSingleUseSignals(){ + syn PetriNet PetriNet.transformSingleUseSignals(boolean withOutPlaces){ Map<String, List<DinerosTransition>> signalMapping = TransformationUtils.getSignalToUsageMapping(this); @@ -11,69 +11,22 @@ aspect SignalTransforms { Place placeTrue = this.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_TRUE + "-" + entry.getKey()); Place placeFalse = this.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_FALSE + "-" + entry.getKey()); - int usageCount = 0; + int inUsageCount = 0; for (DinerosTransition dt : entry.getValue()) { for (Place p : dt.incomingPlaces()) { - if (!p.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { - if (usageCount == 0) { - System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + toTrue.getId()); - TransformationUtils.createAndIncludeBidirectionalArc(this.getPage(0), p, toTrue); - - System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + toFalse.getId()); - TransformationUtils.createAndIncludeBidirectionalArc(this.getPage(0), p, toFalse); - } else { - DinerosTransition newToTrue = PrimitiveTemplates.getDinerosTransition(); - long millis = System.currentTimeMillis(); - newToTrue.setId(toTrue.getId() + "-" + usageCount + "-" + millis); - newToTrue.getName().setText(newToTrue.getId()); - DinerosTransition newToFalse = PrimitiveTemplates.getDinerosTransition(); - newToFalse.setId(toFalse.getId() + "-" + usageCount + "-" + millis); - newToFalse.getName().setText(newToFalse.getId()); - this.getPage(0).addObject(newToTrue); - this.getPage(0).addObject(newToFalse); - - for(Place tip : toTrue.incomingPlaces()){ - if (tip.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { - System.out.println("Relink 1: " + newToTrue.getId()); - TransformationUtils.createAndIncludeArc(this.getPage(0), tip, newToTrue); - } - } - - for(Place top : toTrue.outgoingPlaces()){ - if (top.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { - System.out.println("Relink 2: " + newToTrue.getId()); - TransformationUtils.createAndIncludeArc(this.getPage(0), newToTrue, top); - } - } - - for(Place tip : toFalse.incomingPlaces()){ - if (tip.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { - System.out.println("Relink 3: " + newToFalse.getId()); - TransformationUtils.createAndIncludeArc(this.getPage(0), tip, newToFalse); - } - } + TransformationUtils.createNewSignalLinkage(this.getPage(0), toTrue, toFalse, placeTrue, placeFalse, inUsageCount, p, "-IN", true); + } + inUsageCount++; + } - for(Place top : toFalse.outgoingPlaces()){ - if (top.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { - System.out.println("Relink 4: " + newToFalse.getId()); - TransformationUtils.createAndIncludeArc(this.getPage(0), newToFalse, top); - } + if(withOutPlaces){ + int outUsageCount=0; + for(DinerosTransition dt:entry.getValue()){ + for(Place p:dt.outgoingPlaces()){ + TransformationUtils.createNewSignalLinkage(this.getPage(0),toTrue,toFalse,placeTrue,placeFalse,outUsageCount,p,"-OUT", false); } - - TransformationUtils.createAndIncludeArc(this.getPage(0), placeTrue, newToFalse); - TransformationUtils.createAndIncludeArc(this.getPage(0), newToFalse, placeFalse); - TransformationUtils.createAndIncludeArc(this.getPage(0), placeFalse, newToTrue); - TransformationUtils.createAndIncludeArc(this.getPage(0), newToTrue, placeTrue); - - System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + newToTrue.getId()); - TransformationUtils.createAndIncludeBidirectionalArc(this.getPage(0), p, newToTrue); - - System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + newToFalse.getId()); - TransformationUtils.createAndIncludeBidirectionalArc(this.getPage(0), p, newToFalse); - } + outUsageCount++; } - } - usageCount++; } } return this; diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java index 1a3dfcc65da017526470c2fe967cf565ca3e8c80..0e5c0b3f31ada5aaf0665f7eb7264c0c894a6e0e 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java @@ -25,19 +25,23 @@ public class Main { public static void main(String[] args) throws InvalidIDException, InterruptedException, IOException, Parser.Exception { - String configPath = (args.length > 1) ? args[1] : null; - String pnmlPath = (args.length > 0) ? args[0] : null; - // "/home/sebastian/git/dineros-public/dineros/pnml-relast-apps/robotic-sorting/rpn-models/full-models" + - // "/sorting-wf-synced-safe-sensor-grpn.pnml"; // + String configPath = (args.length > 1) ? args[5] : null; + String pnmlPath = (args.length > 0) ? args[4] : null; - boolean flagInhibitor = Boolean.parseBoolean(args[2]); - boolean flagSignal = Boolean.parseBoolean(args[3]); - boolean flagPurge = Boolean.parseBoolean(args[4]); - doFlattening(configPath, pnmlPath, flagInhibitor, flagSignal, flagPurge); + boolean flagInhibitor = Boolean.parseBoolean(args[0]); + boolean flagSignal = Boolean.parseBoolean(args[1]); + boolean flagPurge = Boolean.parseBoolean(args[2]); + boolean flagOverrideInstanceCount = Boolean.parseBoolean(args[3]); + boolean flagOutArcs = false; + boolean flagNoSignal = false; + + doFlattening(configPath, pnmlPath, flagInhibitor, flagSignal, flagPurge, flagOverrideInstanceCount, flagOutArcs, flagNoSignal, null); } - private static void doFlattening(String configPath, String pnmlPath, boolean flagInhibitor, boolean flagSignal, boolean flagPurge) + private static void doFlattening(String configPath, String pnmlPath, boolean flagInhibitor, + boolean flagSignal, boolean flagPurge, boolean flagOverrideInstanceCount, + boolean flagOutArcs, boolean flagNoSignal, String outputPath) throws InvalidIDException, IOException, InterruptedException, Parser.Exception { if (pnmlPath == null) { @@ -61,11 +65,11 @@ public class Main { serviceGraph.init(petriNet); Map<String, PnObject> addedInstanceObjects = new HashMap<>(); - TransformationUtils.transformPrototypePagesRecursive(petriNet.getPage(0), null, petriNet, serviceGraph, addedInstanceObjects); + TransformationUtils.transformPrototypePagesRecursive(petriNet.getPage(0), null, + petriNet, serviceGraph, addedInstanceObjects, flagOverrideInstanceCount); petriNet.flushAttrAndCollectionCache(); // [STAGE 2] Transform topic transitions - for(DinerosTransition dt : petriNet.allDinerosTransitions()){ if(dt.canTransformTopicTransition()){ Page topicTransformedPage = dt.transformTopicElement(bounds, flagInhibitor, flagPurge); @@ -93,21 +97,23 @@ public class Main { } } - // [STAGE 4] Transform signals - Page signalValuePage = new Page(); - signalValuePage.setId(PnmlConstants.SIGNAL_VALUE_PAGE_ID); - petriNet.addPage(signalValuePage); - petriNet.transformSignalElements(signalValuePage); - petriNet.flushTreeCache(); - petriNet.flushAttrAndCollectionCache(); + if(!flagNoSignal) { + // [STAGE 4] Transform signals + Page signalValuePage = new Page(); + signalValuePage.setId(PnmlConstants.SIGNAL_VALUE_PAGE_ID); + petriNet.addPage(signalValuePage); + petriNet.transformSignalElements(signalValuePage); + petriNet.flushTreeCache(); + petriNet.flushAttrAndCollectionCache(); - for(DinerosTransition dt : petriNet.allDinerosTransitions()){ - Page dtClausePage = dt.getStaticTransitionInformation().asSignalTransitionInformation() - .getClause().transformClauseElement(dt, petriNet); - petriNet.addPage(dtClausePage); - } + for (DinerosTransition dt : petriNet.allDinerosTransitions()) { + Page dtClausePage = dt.getStaticTransitionInformation().asSignalTransitionInformation() + .getClause().transformClauseElement(dt, petriNet); + petriNet.addPage(dtClausePage); + } - petriNet.flushTreeCache(); + petriNet.flushTreeCache(); + } // [STAGE 5] make sure that we have a valid marking System.out.println("[FLATTENER] Checking marking."); @@ -120,8 +126,6 @@ public class Main { } } - // printNet(petriNet, true, false); - // [STAGE 6] remove references / pages System.out.println("[FLATTENER] Breaking references and pages."); for(Page p : petriNet.allPages()){ @@ -134,11 +138,13 @@ public class Main { // [STAGE 7] Postprocessing System.out.println("[FLATTENER] Running postprocessing."); if(flagSignal) { - petriNet.transformSingleUseSignals(); + petriNet.transformSingleUseSignals(flagOutArcs); petriNet.flushAttrAndCollectionCache(); petriNet.flushTreeCache(); } + printNet(petriNet, false, false); + // [STAGE 8] export flatted net to pnml System.out.println("[FLATTENER] Exporting to pnml."); String exportId = UUID.randomUUID().toString(); @@ -153,7 +159,14 @@ public class Main { // resolve inhibitor arcs System.out.println("[FLATTENER] Including inhibitor arcs into net format."); - String inhibitorTargetPath = homeDirectory + "/temp/net/" + fid + "-flatted-inh-" + exportId + ".net"; + String inhibitorTargetPath; + + if(outputPath != null){ + inhibitorTargetPath = outputPath; + } else { + inhibitorTargetPath = homeDirectory + "/temp/net/" + fid + "-flatted-inh-" + exportId + ".net"; + } + ndrioProxy.pnml2net(pnmlExportPath, ndrioTargetPath); ndrioProxy.includeInhibitorArcs(petriNet, ndrioTargetPath, inhibitorTargetPath); diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/TransformationUtils.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/TransformationUtils.java index 67f7f675d71ee0ac2ff10ad4e0b9639fdcda2bef..633146dcced072ac4691e2761a3855205f704d1d 100644 --- a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/TransformationUtils.java +++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/TransformationUtils.java @@ -3,6 +3,8 @@ package de.tudresden.inf.st.pnml.flatter.transform; import beaver.Parser; import de.tudresden.inf.st.pnml.flatter.analysis.TinaUtils; import de.tudresden.inf.st.pnml.flatter.graph.ServiceGraph; +import de.tudresden.inf.st.pnml.flatter.template.PrimitiveTemplates; +import de.tudresden.inf.st.pnml.flatter.template.TemplateConstants; import de.tudresden.inf.st.pnml.flatter.tina.NdrioProxy; import de.tudresden.inf.st.pnml.jastadd.model.*; import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException; @@ -250,24 +252,28 @@ public class TransformationUtils { return null; } - public static void transformPrototypePagesRecursive(Page page, Page parentPage, PetriNet petriNet, ServiceGraph serviceGraph, Map<String, PnObject> addedObjects){ + public static void transformPrototypePagesRecursive(Page page, Page parentPage, + PetriNet petriNet, ServiceGraph serviceGraph, + Map<String, PnObject> addedObjects, boolean flagOverrideInstanceCount){ if(page.canTransformPrototypePage()){ System.out.println("[INFO] Transforming page: " + page.getId()); Page transformedPage; - if(serviceGraph.isPotentiallyCyclic(page.getServiceName())){ + if(serviceGraph.isPotentiallyCyclic(page.getServiceName()) && !flagOverrideInstanceCount){ System.out.println("[WARNING] Detected potentially cyclic service call on: " + page.getServiceName()); System.out.println("[WARNING] Falling back to user defined thread number for: " + page.getServiceName()); - System.out.println("#Objects before: " + addedObjects.size()); transformedPage = page.transformPrototypePage(petriNet,-1, addedObjects); - System.out.println("#Objects after: " + addedObjects.size()); - } else { + } else if(!serviceGraph.isPotentiallyCyclic(page.getServiceName()) && !flagOverrideInstanceCount) { int numInstances = getTransitionByServiceName(petriNet, page.getServiceName()).getStaticTransitionInformation().asServiceTransitionInformation().getNumClientChannel(); transformedPage = page.transformPrototypePage(petriNet, numInstances, addedObjects); System.out.println("[INFO] Transforming prototype page: " + page.getServiceName() + " to " + numInstances + " instances."); + } else { + System.out.println("[WARNING] OverrideInstanceCount flag is used: " + page.getServiceName()); + System.out.println("[WARNING] Falling back to user defined thread number for: " + page.getServiceName()); + transformedPage = page.transformPrototypePage(petriNet,-1, addedObjects); } if(parentPage == null){ @@ -297,7 +303,7 @@ public class TransformationUtils { } for(Page iterPage : subPages){ - transformPrototypePagesRecursive(iterPage, page, petriNet, serviceGraph, addedObjects); + transformPrototypePagesRecursive(iterPage, page, petriNet, serviceGraph, addedObjects, flagOverrideInstanceCount); } } @@ -463,4 +469,69 @@ public class TransformationUtils { } } } + + public static void createNewSignalLinkage(Page page, Transition toTrue, Transition toFalse, + Place placeTrue, Place placeFalse, int usageCount, + Place p, String suffix, boolean usageCountFlag) { + if (!p.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { + if (usageCount == 0 && usageCountFlag) { + System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + toTrue.getId()); + TransformationUtils.createAndIncludeBidirectionalArc(page, p, toTrue); + + System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + toFalse.getId()); + TransformationUtils.createAndIncludeBidirectionalArc(page, p, toFalse); + } + + if(usageCount > 0 || !usageCountFlag){ + DinerosTransition newToTrue = PrimitiveTemplates.getDinerosTransition(); + long millis = System.currentTimeMillis(); + newToTrue.setId(toTrue.getId() + "-" + usageCount + "-" + millis + suffix); + newToTrue.getName().setText(newToTrue.getId()); + DinerosTransition newToFalse = PrimitiveTemplates.getDinerosTransition(); + newToFalse.setId(toFalse.getId() + "-" + usageCount + "-" + millis + suffix); + newToFalse.getName().setText(newToFalse.getId()); + page.addObject(newToTrue); + page.addObject(newToFalse); + + for(Place tip : toTrue.incomingPlaces()){ + if (tip.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { + System.out.println("Relink 1: " + newToTrue.getId()); + TransformationUtils.createAndIncludeArc(page, tip, newToTrue); + } + } + + for(Place top : toTrue.outgoingPlaces()){ + if (top.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { + System.out.println("Relink 2: " + newToTrue.getId()); + TransformationUtils.createAndIncludeArc(page, newToTrue, top); + } + } + + for(Place tip : toFalse.incomingPlaces()){ + if (tip.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { + System.out.println("Relink 3: " + newToFalse.getId()); + TransformationUtils.createAndIncludeArc(page, tip, newToFalse); + } + } + + for(Place top : toFalse.outgoingPlaces()){ + if (top.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) { + System.out.println("Relink 4: " + newToFalse.getId()); + TransformationUtils.createAndIncludeArc(page, newToFalse, top); + } + } + + TransformationUtils.createAndIncludeArc(page, placeTrue, newToFalse); + TransformationUtils.createAndIncludeArc(page, newToFalse, placeFalse); + TransformationUtils.createAndIncludeArc(page, placeFalse, newToTrue); + TransformationUtils.createAndIncludeArc(page, newToTrue, placeTrue); + + System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + newToTrue.getId()); + TransformationUtils.createAndIncludeBidirectionalArc(page, p, newToTrue); + + System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + newToFalse.getId()); + TransformationUtils.createAndIncludeBidirectionalArc(page, p, newToFalse); + } + } + } }