public static void splitMixedPlaces(PetriNet net) { // perform node splitting (places) Collection<Place> ps = new ArrayList<Place>(net.getPlaces()); Iterator<Place> places = ps.iterator(); while (places.hasNext()) { Place place = places.next(); if (net.getPredecessors(place).size() > 1 && net.getSuccessors(place).size() > 1) { Place newP = addPlace(net); Transition newT = addTransition(net); relinkOutgoingArcs(net, place, newP); net.addFlow(place, newT); net.addFlow(newT, newP); } } }
public static void relinkOutgoingArcs(PetriNet net, Node from, Node to) { for (Flow f : net.getFlowRelation()) { if (f.getSource().equals(from)) { net.addFlow(to, f.getTarget()); net.removeEdge(f); } } }
public static void isolateTransitions(PetriNet net) { Collection<Transition> ts = new ArrayList<Transition>(net.getTransitions()); Iterator<Transition> transitions = ts.iterator(); while (transitions.hasNext()) { Transition transition = transitions.next(); if (net.getPredecessors(transition).size() > 1) { Place newP = addPlace(net); Transition newT = addTransition(net); relinkIncomingArcs(net, transition, newT); net.addFlow(newT, newP); net.addFlow(newP, transition); } if (net.getSuccessors(transition).size() > 1) { Place newP = addPlace(net); Transition newT = addTransition(net); relinkOutgoingArcs(net, transition, newT); net.addFlow(transition, newP); net.addFlow(newP, newT); } } }