From 8d82de9bf1fd2d2a86511375a4e2d4aab4b8e367 Mon Sep 17 00:00:00 2001 From: Firew Siyoum Date: Tue, 29 Jan 2013 00:02:16 +0100 Subject: [PATCH 1/8] Scenario analysis refactoring. --- .../analysis/network/ExplorationState.java | 86 ++- .../analysis/network/McdfNetworkAnalysis.java | 2 +- .../network/NetworkClassifierOutput.java | 61 +- .../network/ScenarioAwareNetworkAnalysis.java | 307 ++++++++-- .../ScenarioAwareStateExploration.java | 542 +++++++++++++++--- .../analysis/network/ScenarioFSM.java | 3 +- .../analysis/network/ScenarioGraph.java | 31 +- .../network/SneakyNetworkAnalyzer.java | 29 + 8 files changed, 881 insertions(+), 180 deletions(-) diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ExplorationState.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ExplorationState.java index dedfcd6..0de430f 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ExplorationState.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ExplorationState.java @@ -36,6 +36,7 @@ package org.caltoopia.analysis.network; +import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -46,6 +47,8 @@ import org.caltoopia.analysis.air.ActorInstance; import org.caltoopia.analysis.air.State; import org.caltoopia.analysis.air.Transition; +import org.caltoopia.analysis.network.ScenarioAwareNetworkAnalysis.ControlTokensPerAction; +import org.caltoopia.analysis.network.ScenarioAwareStateExploration.ControlTokenFSMState; import org.caltoopia.analysis.network.ScenarioFSM.ScenarioFSMState; import org.caltoopia.analysis.util.collections.CartesianProduct; import org.caltoopia.analysis.util.collections.Pair; @@ -65,6 +68,8 @@ public class ExplorationState{ //a tuple of FSM states of detector actors, exactly one fsm state per detector private Map detectorStatesTuple = new HashMap(); + public Set stateTuple = new HashSet(); + //the set of all possible transition combinations from 'detectorStatesTuple' private List>> transitionTuples = new ArrayList>>(); @@ -84,6 +89,12 @@ public ExplorationState(Map s, String n){ name = n; } + //constructor + public ExplorationState(Set s, String n){ + stateTuple = s; + name = n; + } + public String getName(){ return name; } @@ -182,7 +193,7 @@ public static Set>> traverseTransitions(Map< * @return a matching scenario graph if it exists or null otherwise. */ public static ScenarioGraph findScenarioGraph(ScenarioGraph scenarioGraph, - Set scenarioGraphs){ + Set scenarioGraphs, boolean flag){ boolean exists = false; for(ScenarioGraph sg: scenarioGraphs){ exists = true; @@ -202,9 +213,19 @@ public static ScenarioGraph findScenarioGraph(ScenarioGraph scenarioGraph, } } } - - if(exists) - return sg; + + //check if the control tokens are the same + if(flag){ + if(exists){ + if(ScenarioAwareNetworkAnalysis.AreControlTokensEqual( + sg.getControlTokens(), scenarioGraph.getControlTokens())){ + return sg; + } + } + } + else + if(exists) + return sg; } return null; } @@ -281,23 +302,62 @@ public static ExplorationState findVistedState(Set exploration return null; } + //TODO: use a hash implementation of a faster search + /** + * finds the ExplorationState by its detectorStatesTuple from a given set of states. + * a detectorStatesTuple leads to exactly one ExplorationSstate by construction. + * hence, the first matching ExplorationState is returned. + * @param explorationStates + * @param detectorStatesTuple + * @return the ExplorationState of a given detectorStatesTuple if it exists or null otherwise. + */ + public static ExplorationState findVistedState(List explorationStates, + Set detectorStatesTuple){ + for(ExplorationState explorationState: explorationStates){ + if(explorationState.stateTuple.size()==detectorStatesTuple.size()){ + boolean found = true; + for(ControlTokenFSMState c: explorationState.stateTuple){ + if(!detectorStatesTuple.contains(c)){ + found = false; + break; + } + } + if(found) + return explorationState; + } + } + return null; + } + + /** + * prints the combination of detector actor FSM states + * that define this ExplorationState + */ + public void printActorStateTuple(PrintStream out){ + out.println("ExplorationState: "+name); + for(Map.Entry e: detectorStatesTuple.entrySet()){ + out.println(e.getKey()+"-->"+e.getValue().getOriginalStateTag()); + } + out.println(); + } + /** * prints the exploration state to a given stream * @param s */ - public void print(Stream s){ - s.println("ExplorationState: "+name); + public void print(PrintStream out){ + out.println("ExplorationState: "+name); - s.print("\tPreceeding states: "); + out.print("\tPreceeding states: "); for(ExplorationState statePair: incidentStates){ - s.print(statePair.name+" "); + out.print(statePair.name+" "); } - s.println(); - s.print("\t ScenarioGraphs: "); + out.println(); + out.print("\t ScenarioGraphs: "); for(ScenarioGraph sg: scenarioGraphs){ - s.print(sg.getName()+" "); - sg.print(s); + out.print(sg.getName()+" "); + sg.print(out); } - s.println(); + out.println(); } } \ No newline at end of file diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/McdfNetworkAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/McdfNetworkAnalysis.java index f6b1a8e..6167241 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/McdfNetworkAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/McdfNetworkAnalysis.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.network; import java.util.ArrayList; @@ -223,3 +222,4 @@ public boolean isModeControlledDataflow(){ return true; } } + diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java index cd443da..b4cf103 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.network; import java.io.File; @@ -147,7 +146,7 @@ public void printAttributes(Stream s){ for(String attribute: attributes.keySet()){ s.print(" "+attribute+"=\""+attributes.get(attribute)+"\""); } - if(childNodes.isEmpty()) + if(childNodes.isEmpty() && value == null) s.print("/>"); else s.print(">"); @@ -156,7 +155,7 @@ public void printAttributes(Stream s){ } public void printValue(Stream s){ - if(value!=null) + if(value != null) s.print(value); } @@ -167,7 +166,7 @@ public void printChildNodes(Stream s){ } public void closeTag(Stream s){ - if(!childNodes.isEmpty()){ + if(!childNodes.isEmpty() || value != null){ s.println(""); } } @@ -539,7 +538,7 @@ public void printSaXML(Network network, ScenarioAwareNetworkAnalysis analysis) { applicationNode.addXMLNode(fsmsadfPropertiesNode); XMLNode fsmNode = new XMLNode("fsm"); - fsmNode.addAttribute("initialstate", "InitialState"); + fsmNode.addAttribute("initialstate", "State_0"); applicationNode.addXMLNode(fsmNode); for(ScenarioGraph scenarioGraph: analysis.getScenarioFSM().getScenarioGraphs()){ @@ -579,11 +578,13 @@ public void printSaXML(Network network, ScenarioAwareNetworkAnalysis analysis) { for(Connection c: network.getIncidentConnections(p)){ XMLNode portNode = new XMLNode("port"); if(p.getDirection()==Direction.IN){ - portNode.addAttribute("name", p.getName()+"_from_"+c.getProducerPort().getActor().getInstanceName()); + portNode.addAttribute("name", p.getName()+"_from_"+ + c.getProducerPort().getActor().getInstanceName()); portNode.addAttribute("type", "in"); } else{ - portNode.addAttribute("name", p.getName()+"_to_"+c.getConsumerPort().getActor().getInstanceName()); + portNode.addAttribute("name", p.getName()+"_to_"+ + c.getConsumerPort().getActor().getInstanceName()); portNode.addAttribute("type", "out"); } portNode.addAttribute("rate", scenario.getPortRate(p).toString()); @@ -598,28 +599,46 @@ public void printSaXML(Network network, ScenarioAwareNetworkAnalysis analysis) { //add each connection for(Connection c: network.getConnections()){ XMLNode connectionNode = new XMLNode("channel"); + ActorInstance srcA = c.getProducerPort().getActor(); + ActorInstance dstA = c.getConsumerPort().getActor(); //if source and destination actors are in the scenario graph - if(scenarioGraph.getActors().containsKey(c.getProducerPort().getActor()) && - scenarioGraph.getActors().containsKey(c.getConsumerPort().getActor())){ + if(scenarioGraph.getActors().containsKey(srcA) && + scenarioGraph.getActors().containsKey(dstA)){ //if the corresponding actions of the source and destination actors have //non-zero rates in the connecting ports of this connection - ScenarioAwareActorAnalysis.Scenario spSrc = - scenarioGraph.getActors().get(c.getProducerPort().getActor()); - ScenarioAwareActorAnalysis.Scenario spDst = - scenarioGraph.getActors().get(c.getConsumerPort().getActor()); + ScenarioAwareActorAnalysis.Scenario spSrc = scenarioGraph.getActors().get(srcA); + ScenarioAwareActorAnalysis.Scenario spDst = scenarioGraph.getActors().get(dstA); if(spSrc.getPortRates().containsKey(c.getProducerPort()) && spDst.getPortRates().containsKey(c.getConsumerPort())){ if(spSrc.getPortRate(c.getProducerPort()).intValue() > 0 && spDst.getPortRate(c.getConsumerPort()).intValue() > 0){ - connectionNode.addAttribute("name", c.getProducerPort().getActor().getInstanceName()+ - "2"+c.getConsumerPort().getActor().getInstanceName()); - connectionNode.addAttribute("srcActor", c.getProducerPort().getActor().getInstanceName()); - connectionNode.addAttribute("srcPort", c.getProducerPort().getName()+"_to_"+c.getConsumerPort().getActor().getInstanceName()); - connectionNode.addAttribute("dstActor", c.getConsumerPort().getActor().getInstanceName()); - connectionNode.addAttribute("dstPort", c.getConsumerPort().getName()+"_from_"+c.getProducerPort().getActor().getInstanceName()); - connectionNode.addAttribute("initialTokens", "0"); + connectionNode.addAttribute("name", srcA.getInstanceName()+ + "2"+ dstA.getInstanceName()); + connectionNode.addAttribute("srcActor", srcA.getInstanceName()); + connectionNode.addAttribute("srcPort", c.getProducerPort().getName()+"_to_"+dstA.getInstanceName()); + connectionNode.addAttribute("dstActor", dstA.getInstanceName()); + connectionNode.addAttribute("dstPort", c.getConsumerPort().getName()+"_from_"+ srcA.getInstanceName()); + + if(srcA.hasImplementation()){ + if(analysis.getScenarioAwareActorAnalysis(srcA).getScenarioAwareActorInstanceType()== + ScenarioAwareActorAnalysis.ScenarioAwareActorInstanceType.SA_STATIC){ + if(analysis.getConnectionAnalysis(c).getInitialTokenSize()==null) + try { + throw new Exception("has no connection analysis."); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + connectionNode.addAttribute("initialTokens", + analysis.getConnectionAnalysis(c).getInitialTokenSize().toString()); + } + else + connectionNode.addAttribute("initialTokens","0"); + } + else + connectionNode.addAttribute("initialTokens","0"); scenarioGraphNode.addXMLNode(connectionNode); } } @@ -714,3 +733,5 @@ public void printSaXML(Network network, ScenarioAwareNetworkAnalysis analysis) { sdf3Root.printXMLNode(s); } } + + diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java index 4605095..6a41fab 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java @@ -36,6 +36,7 @@ package org.caltoopia.analysis.network; +import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -66,6 +67,7 @@ import org.caltoopia.ast2ir.Stream; public class ScenarioAwareNetworkAnalysis extends GenericNetworkAnalysis { + /** * represents a control token of produced by a detector actor. */ @@ -168,10 +170,33 @@ public Map getControlTokens(){ return controlTokens; } - public void print(Stream stream){ - stream.println("\t"+detectorActor.getInstanceName()+"\t"+detectorAction.getName()); + /** + * tests if a given control token is the same as + * this control token. + * @param c + * @return + */ + public boolean equals(ControlTokensPerAction c){ + if(this.detectorActor!=c.detectorActor) + return false; + + if(this.detectorAction!=c.detectorAction) + return false; + + if(this.controlTokens.size()!= c.controlTokens.size()) + return false; + for(Map.Entry e: controlTokens.entrySet()){ - stream.println("\t\t"+e.getKey()+"\t"+e.getValue().longValue()); + if(c.getControlTokens().get(e.getKey())!=e.getValue()) + return false; + } + return true; + } + + public void print(PrintStream out){ + out.println("\t"+detectorActor.getInstanceName()+"\t"+detectorAction.getName()); + for(Map.Entry e: controlTokens.entrySet()){ + out.println("\t\t"+e.getKey()+"\t"+e.getValue().longValue()); } } }; @@ -186,9 +211,15 @@ public void print(Stream stream){ //scenario FSM private ScenarioFSM fsm = new ScenarioFSM(); + //path to additional resources and files + private String resourcePath; + //constructor public ScenarioAwareNetworkAnalysis(Network n, NetworkAnalysis na) { + //Generic network analyis constructor super(n,na); + + //Instantiate scenario-aware actor analysis objects ActorAnalyzer actorAnalyzer=new SneakyActorAnalyzer(); for (ActorInstance actor: network.getActors()) { if (actor.hasImplementation()) { @@ -219,15 +250,20 @@ public ScenarioAwareNetworkAnalysis(Network n, NetworkAnalysis na) { //Set connection types and detector actors for(Connection connection: network.getConnections()){ + //if the destination actor has implementation if(connection.getConsumerPort().getActor().hasImplementation()){ - PortAnalysis dstPortAnalysis = getScenarioAwarePortAnalysis(connection.getConsumerPort()); - if (dstPortAnalysis.getPortType()==PortType.CONTROL){ + PortAnalysis pAnalysis = null; + pAnalysis = getScenarioAwarePortAnalysis(connection.getConsumerPort()); + //if consumer port is a control port, we have a control channel + if (pAnalysis.getPortType()==PortType.CONTROL){ getConnectionAnalysis(connection).setConnectionType(ConnectionType.CONTROL); - //If a control port is found, the producer actor is automatically a detector actor. + //the producer actor is automatically a detector actor ActorInstance srcActor = connection.getProducerPort().getActor(); if(srcActor.hasImplementation()){ - ScenarioAwareActorAnalysis actorAnalysis = getScenarioAwareActorAnalysis(srcActor); - actorAnalysis.setScenarioAwareActorInstanceType(ScenarioAwareActorInstanceType.SA_DETECTOR); + ScenarioAwareActorAnalysis aAnalysis = null; + aAnalysis = getScenarioAwareActorAnalysis(srcActor); + aAnalysis.setScenarioAwareActorInstanceType( + ScenarioAwareActorInstanceType.SA_DETECTOR); } } else{ @@ -236,9 +272,27 @@ public ScenarioAwareNetworkAnalysis(Network n, NetworkAnalysis na) { } } + + setResourcePath("/home/firew/CAL_applications/RVC_MPEG4_SP_Decoder"); + + // state-space exploration object to construct the FSM stateSpaceExploration = new ScenarioAwareStateExploration(this); - fsm = stateSpaceExploration.constructScenarioFSM(); + fsm = stateSpaceExploration.constructScenarioFSM2(); + } + + /** + * @return path to additional files and resources + */ + public String getResourcePath(){ + return resourcePath; + } + + /** + * @param path : the path to additional files and resources + */ + public void setResourcePath(String path){ + resourcePath = path; } //get the fsm @@ -255,6 +309,7 @@ public ScenarioAwareActorAnalysis getScenarioAwareActorAnalysis(ActorInstance ac return mScenarioAwareActorMap.get(actor); } + /** * @param portInstance * @return the scenario-aware port analysis object of the given port instance @@ -298,7 +353,7 @@ public Set getScenarioAwareDetectorActors(){ public List getDynamicActors(){ List dataDependentActors = new ArrayList(); for (ActorInstance actor: network.getActors()) { - ScenarioAwareActorInstanceType actorType= + ScenarioAwareActorInstanceType actorType = getScenarioAwareActorAnalysis(actor).getScenarioAwareActorInstanceType(); if(actorType==ScenarioAwareActorInstanceType.SA_DYNAMIC){ dataDependentActors.add(actor); @@ -306,6 +361,23 @@ public List getDynamicActors(){ } return dataDependentActors; } + + /** + * @return the list of scenario-aware detector actors of the network + */ + public List getDetectorActors(){ + List detectorActors = new ArrayList(); + for (ActorInstance actor: network.getActors()) { + if(actor.hasImplementation()){ + ScenarioAwareActorInstanceType actorType = + getScenarioAwareActorAnalysis(actor).getScenarioAwareActorInstanceType(); + if(actorType==ScenarioAwareActorInstanceType.SA_DETECTOR){ + detectorActors.add(actor); + } + } + } + return detectorActors; + } /** * @return true if a FSM-SADF network can be extracted from the network @@ -315,7 +387,7 @@ public boolean isScenarioAwareDataflowGraph(){ for (ActorInstance actor: network.getActors()) { if(actor.hasImplementation()) if(getScenarioAwareActorAnalysis(actor).getScenarioAwareActorInstanceType() - ==ScenarioAwareActorInstanceType.UNCLASSIFIED){ + == ScenarioAwareActorInstanceType.UNCLASSIFIED){ return false; } } @@ -350,6 +422,7 @@ public ActorInstance getSourceActor(){ */ public void constructScenarioThroughAnnotations(ActorInstance actor){ ScenarioAwareActorAnalysis actorAnalysis = getScenarioAwareActorAnalysis(actor); + String msg; try{ if(actorAnalysis.isTypeAnnotated()){ String scenarios = actor.getAnnotationArgumentValue("ActorProperty","Scenarios"); @@ -360,45 +433,56 @@ public void constructScenarioThroughAnnotations(ActorInstance actor){ for(String scenarioString: scenarios.split(";")){ scenario = actorAnalysis.new Scenario(); for(String properties: scenarioString.split(",")){ - String propertyPair[] = properties.split("="); - if(propertyPair[0].trim().equalsIgnoreCase("SCENARIO")){ - String scenarioSpecifications = propertyPair[1]; - for(String scenarioSpecification: scenarioSpecifications.split("\\+")){ - String scenarioSpecificationPair[] = scenarioSpecification.split(":"); - String actorAndPortName[] = scenarioSpecificationPair[0].split("\\."); - ActorInstance detector = this.getActorInstance(actorAndPortName[0].trim()); - if (detector==null) - throw new NullPointerException("Scenario tag error. Actor '"+actorAndPortName[0].trim()+ - "' does not exist."); - PortInstance port = detector.getPort(actorAndPortName[1]); - if (port == null) - throw new NullPointerException("Scenario tag error. Actor '"+actorAndPortName[0].trim()+ - "' does have port '"+actorAndPortName[1]+"'."); + String prop[] = properties.split("="); + if(prop[0].trim().equalsIgnoreCase("SCENARIO")){ + String scenarioSpecs = prop[1]; + for(String scenarioSpec: scenarioSpecs.split("\\+")){ + String scenarioSpecPair[] = scenarioSpec.split(":"); + String actorAndPort[] = scenarioSpecPair[0].split("\\."); + ActorInstance det = this.getActorInstance(actorAndPort[0].trim()); + if (det==null){ + msg = "Scenario tag error. Actor '"; + msg += actorAndPort[0].trim() + "' does not exist."; + throw new NullPointerException(msg); + } + PortInstance port = det.getPort(actorAndPort[1]); + if (port == null){ + msg = "Scenario tag error. Actor '"; + msg += actorAndPort[0].trim()+"' does have port '"; + msg += actorAndPort[1]+"'."; + throw new NullPointerException(msg); + } InputLookAhead ila = new VanillaInputLookAhead(port,0); - UnionOfDisjointIntervals intervals = parseIntervals(scenarioSpecificationPair[1]); - if(intervals==null) - throw new NullPointerException("Scenario tag error. Parsing interval '"+scenarioSpecificationPair[1]+"'"); - scenario.addInputLookAheadInterval(ila,intervals); + UnionOfDisjointIntervals it = parseIntervals(scenarioSpecPair[1]); + if(it==null){ + msg = "Scenario tag error. Parsing interval '"; + msg += scenarioSpecPair[1]+"'"; + throw new NullPointerException(msg); + } + scenario.addInputLookAheadInterval(ila,it); } } //find WCET - else if (propertyPair[0].trim().equalsIgnoreCase("WCET")){ - scenario.setExecutionTime(Integer.parseInt(propertyPair[1].trim())); + else if (prop[0].trim().equalsIgnoreCase("WCET")){ + scenario.setExecutionTime(Integer.parseInt(prop[1].trim())); } // otherwise it must be a port else{ - if(actorAnalysis.getPortAnalysis(propertyPair[0].trim()) != null){ - if(actorAnalysis.getPortAnalysis(propertyPair[0].trim()).getPortInstance() != null){ - scenario.setPortRate(actorAnalysis.getPortAnalysis(propertyPair[0].trim()).getPortInstance(), - Integer.parseInt(propertyPair[1].trim())); + if(actorAnalysis.getPortAnalysis(prop[0].trim()) != null){ + if(actorAnalysis.getPortAnalysis(prop[0].trim()).getPortInstance() != null){ + scenario.setPortRate( + actorAnalysis.getPortAnalysis(prop[0].trim()).getPortInstance(), + Integer.parseInt(prop[1].trim())); + } + else{ + msg = "Scenario tag error. Port '"; + msg += prop[0].trim() + "' does not exist"; + throw new NullPointerException(msg); } - else - throw new NullPointerException("Scenario tag error. Port '"+propertyPair[0].trim()+ - "' does not exist"); } else throw new NullPointerException("Scenario tag error. Port analysis for port '"+ - propertyPair[0].trim()+ "' does not exist."); + prop[0].trim()+ "' does not exist."); } } actorAnalysis.addScenario(scenario); @@ -418,12 +502,14 @@ else if (propertyPair[0].trim().equalsIgnoreCase("WCET")){ * @param transitionTuple * @return the set of all possible control token combinations */ - public Set> getControlTokensPerActions(Set> transitionTuple){ + public Set> getControlTokensPerActions( + Set> transitionTuple){ List> sTokens = new ArrayList>(); for(Pair tPair: transitionTuple){ ActorInstance detector = tPair.getFirst(); Action detectorAction = tPair.getSecond().getAction(); - Set sta = getScenarioOfDetectorAction(detector, detectorAction); + Set sta = null; + sta = getControlTokensOfAction(detector, detectorAction); if(sta!=null) sTokens.add(sta); } @@ -461,7 +547,15 @@ else if(s.length==2 && Long.parseLong(s[0].trim()) >= 0 return intervals; } - public ScenarioGraph constructScenarioGraph(ActorInstance source, Set> transitionTuple, + /** + * constructs a scenario graph from a given set of control tokens. + * @param source + * @param transitionTuple + * @param sTokens + * @return + */ + public ScenarioGraph constructScenarioGraph(ActorInstance source, + Set> transitionTuple, Set sTokens){ if(sTokens.isEmpty()){ return null; @@ -484,7 +578,8 @@ public ScenarioGraph constructScenarioGraph(ActorInstance source, Set filterActionScenarioTokens(Set actionScenarioTokens, ScenarioGraph sg){ - Set filteredSet = new HashSet(actionScenarioTokens); - for(ControlTokensPerAction ast: actionScenarioTokens){ + /** + * constructs a scenario graph from a given set of control tokens. + * @param source + * @param transitionTuple + * @param sTokens + * @return + */ + public ScenarioGraph constructScenarioGraph(ActorInstance source, Set sTokens){ + if(sTokens.isEmpty()){ + return null; + } + +// if(!stateSpaceExploration.controlTokensExist(transitionTuple, sTokens)){ +// return null; +// } + + String name = null; + for(ControlTokensPerAction sta: sTokens){ + name+= sta.getControlTokens().toString(); + } + ScenarioGraph sg = new ScenarioGraph(name); + + List visitedActors = new ArrayList(); + List actorsQueue = new ArrayList(); + actorsQueue.add(source); + while(!actorsQueue.isEmpty()){ + ActorInstance actor = actorsQueue.remove(0); + if(!visitedActors.contains(actor)){ + visitedActors.add(actor); + ScenarioAwareActorAnalysis.Scenario sp = null; + sp = stateSpaceExploration.getScenario(actor, sTokens); + if(sp != null){ + sg.getActors().put(actor, sp); + for(PortInstance p: actor.getOutputPorts()){ + if(sp.getPortRate(p) > 0){ + for(Connection c: this.getNetwork().getIncidentConnections(p)){ + ActorInstance a = c.getConsumerPort().getActor(); + if(!actorsQueue.contains(a)){ + actorsQueue.add(a); + } + } + } + } + } + } + } + + if(sg.getActors().size() == 0) + return null; + + sg.setControlTokens(filterControlTokens(sTokens,sg)); + return sg; + } + /** + * removes control tokens produced by actors that do not + * exist in a given scenario graph. + * @param acTokens + * @param sg + * @return a set of control tokens + */ + public static Set filterControlTokens( + Set acTokens, ScenarioGraph sg){ + Set filteredSet = null; + filteredSet = new HashSet(acTokens); + for(ControlTokensPerAction ast: acTokens){ ActorInstance actor = ast.getDetectorActor(); if(!sg.getActors().containsKey(actor)) filteredSet.add(ast); - } - + } return filteredSet; } + /** * Each detector action produces a set of control tokens. This information * is obtained from the action annotation. @@ -551,12 +708,13 @@ public static Set filterActionScenarioTokens(Set getScenarioOfDetectorAction(ActorInstance detector, Action action){ + public Set getControlTokensOfAction(ActorInstance detector, Action action){ + String msg = ""; try{ //if it has ControlToken annotated types, parse if(action.hasAnnotation("ActionProperty")){ if (action.getAnnotationArgumentValue("ActionProperty", "ScenarioTokens")!=null){ - Set scenarioTokenActions = new HashSet(); + Set acToknes = new HashSet(); String s = action.getAnnotationArgumentValue("ActionProperty", "ScenarioTokens"); List>> tokenRanges = new ArrayList>>(); @@ -573,9 +731,12 @@ else if(str.length==2 && Long.parseLong(str[0].trim()) >= 0 && Long.parseLong(str[1].trim()) >= 0){ intervals.add(Long.parseLong(str[0].trim()), Long.parseLong(str[1].trim())); } - else - throw new NullPointerException("Scenario tag error. Syntax error for scenario interval '" - +interval+"'."); + else{ + msg = "Scenario tag error. "; + msg += "Syntax error for scenario interval '"; + msg += interval + "'."; + throw new NullPointerException( msg ); + } } Set> tokenRange = new HashSet>(); @@ -589,13 +750,16 @@ else if(str.length==2 && Long.parseLong(str[0].trim()) >= 0 for(Set> str: CartesianProduct.cartesianProduct(tokenRanges)){ ControlTokensPerAction sta = new ControlTokensPerAction(detector, action); for(Pair e: str){ - if(sta.getControlTokens().containsKey(e.getFirst())) - throw new Exception("getScenarioOfDetectorAction: duplicate entry for a scenario token detected."); + if(sta.getControlTokens().containsKey(e.getFirst())){ + msg = "getScenarioOfDetectorAction: "; + msg += "duplicate entry for a scenario token detected."; + throw new Exception( msg ); + } sta.getControlTokens().put(e.getFirst(), e.getSecond()); } - scenarioTokenActions.add(sta); + acToknes.add(sta); } - return scenarioTokenActions; + return acToknes; } } }catch(Exception e){ @@ -604,4 +768,31 @@ else if(str.length==2 && Long.parseLong(str[0].trim()) >= 0 } return null; } + + /** + * checks if two sets of control token are the same. + * @param f : first set of control tokens + * @param s : second set of control tokens + * @return true if the two sets are the same + */ + public static boolean AreControlTokensEqual(Set f, + Set s){ + if(f.size() != s.size()) + return false; + + for(ControlTokensPerAction cf: f){ + boolean found = false; + for(ControlTokensPerAction cs: s){ + if(cf.equals(cs)){ + found = true; + break; + } + } + if(!found) + return false; + } + + return true; + } } + diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java index b3c66ce..6934ca0 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java @@ -33,9 +33,10 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.network; +import java.io.File; +import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -43,6 +44,9 @@ import java.util.Map; import java.util.Set; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.caltoopia.analysis.actor.ScenarioAwareActorAnalysis; import org.caltoopia.analysis.actor.ScenarioAwareActorAnalysis.ScenarioAwareActorInstanceType; import org.caltoopia.analysis.air.Action; @@ -65,9 +69,110 @@ import org.caltoopia.analysis.util.collections.Pair; import org.caltoopia.analysis.util.collections.UnionOfDisjointIntervals; import org.caltoopia.ast2ir.Stream; +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; public class ScenarioAwareStateExploration { + public class ControlTokenFSMState{ + public String name; + public ActorInstance detectorActor = null; + public Action action = null; + public Map controlTokens = new HashMap(); + public Set transitions = new HashSet(); + public ControlTokenFSMState(String n, ActorInstance d){ + name = n; + detectorActor = d; + } + + public void print(PrintStream stream){ + stream.println("\t\tState: "+name); + for(Map.Entry e: controlTokens.entrySet()){ + stream.println("\t\t\tControlToken: "+e.getKey()+", Value: "+e.getValue()); + } + + for(String s: transitions){ + stream.println("\t\t\tTransits to: "+s); + } + } + } + + /** + * control token transition + */ + public class DetectorFSM{ + public ActorInstance detectorActor; + public String initialState; + public Set states = new HashSet(); + + public DetectorFSM(ActorInstance i){ + detectorActor = i; + } + + public ControlTokenFSMState getState(String n){ + for(ControlTokenFSMState s: states){ + if(s.name.equals(n)) + return s; + } + return null; + } + + public ControlTokenFSMState getInitialState(){ + return getState(initialState); + } + + public void print(PrintStream stream){ + stream.println("Detector: "+detectorActor.getInstanceName()); + stream.println("\tIntialState: "+initialState); + for(ControlTokenFSMState s: states){ + s.print(stream); + } + } + } + + /** + * control token transition + */ + public class ControlTokenTransition{ + + private Pair srcControlToken; + + private Pair dstControlToken; + + public ControlTokenTransition(String ss, Long sl, String ds, Long dl){ + setSrcControlToken(ss, sl); + setDstControlToken(ds, dl); + } + + private void setSrcControlToken(String s, Long l){ + srcControlToken = new Pair(s,l); + } + + private void setDstControlToken(String s, Long l){ + dstControlToken = new Pair(s,l); + } + + public Pair getSrcControlToken(){ + return srcControlToken; + } + + public Pair getDstControlToken(){ + return dstControlToken; + } + + public boolean equals(ControlTokenTransition t){ + if(!getSrcControlToken().equals(t.getSrcControlToken())) + return false; + if(!getDstControlToken().equals(t.getDstControlToken())) + return false; + return true; + } + } + /* * number of eliminated scenario graph due to duplication * or non-existence @@ -80,6 +185,13 @@ public class ScenarioAwareStateExploration { //control tokens of the network private Set controlTokens = new HashSet(); + //detector fsm + private List detectorFSMs = new ArrayList(); + + //non-existing control token transitions + private List nonExistingTokenTransitions = + new ArrayList(); + //the scenario FSM to be constructed private ScenarioFSM scenarioFSM = new ScenarioFSM(); @@ -87,6 +199,8 @@ public class ScenarioAwareStateExploration { public ScenarioAwareStateExploration(ScenarioAwareNetworkAnalysis a){ analysis = a; populateControlTokens(); + populateDetectorFSMs(); + printDetectorFSMs(System.out); } public ScenarioAwareNetworkAnalysis getAnalysis(){ @@ -104,6 +218,13 @@ public void printNetworkControlTokens(Stream stream){ } } + //print network control tokens + public void printDetectorFSMs(PrintStream stream){ + for(DetectorFSM d : detectorFSMs){ + d.print(stream); + } + } + /** * searches a control token by name and detector actor * @param name - name of the control token @@ -221,6 +342,42 @@ public boolean controlTokensExist(Set> tr, return true; } + /** + * checks if a combination of control tokens exist + * @param tr: a combination of fsm transitions + * @param ctActions: a combination of control tokens + * @return true if the combination exists or false otherwise + */ + public boolean stateTupleExist(Set stateTuple){ + Set ctActions = new HashSet(); + for(ControlTokenFSMState cs: stateTuple){ + ControlTokensPerAction t = analysis.new ControlTokensPerAction(cs.detectorActor, cs.action); + t.setControlTokens(cs.controlTokens); + ctActions.add(t); + } + + for(ControlTokenFSMState state: stateTuple){ + Action action = state.action; + if(action.hasGuard()){ + Guard guard = action.getGuard(); + Map modeSet + = guard.matchScenarioAwareGuard(); + if (modeSet == null) + continue; + //each input look-ahead must be satisfied + for(InputLookAhead lookAhead: modeSet.keySet()){ + PortInstance detectorPort = lookAhead.getPort(); + if(!isIntervalInActionScenarioTokens(detectorPort, + modeSet.get(lookAhead), ctActions)){ + eliminatedScenarioGraphs++; + return false; + } + } + } + } + return true; + } + /** * constructs a set of scenario graphs from a given set of combinations of * control tokens. Each combination defines a unique scenario graph. @@ -352,38 +509,42 @@ public ScenarioFSM constructScenarioFSM(){ //the set of detector actors Set dActors = analysis.getScenarioAwareDetectorActors(); - //a queue of combinations of transitions to be analyzed - List>> ttQueue = null; + //a queue of a combination of transitions to be analyzed + List>> ttQueue = null; ttQueue = new ArrayList>>(); try{ ActorInstance source = analysis.getSourceActor(); + if(source==null){ - String message = "constructScenarioFSM: no source actor found."; - message += "Use annotation: @ActorProperty(Source=\"true\")"; - throw new NullPointerException(message); + String msg = "constructScenarioFSM: no source actor found."; + msg += "Use annotation: @ActorProperty(Source=\"true\")"; + throw new NullPointerException(msg); } - // initialStateSpaceState = the initial states of detector actors - Map s0 = new HashMap(); + //initialExplorationState = the set of the initial states of detector actors + Map ieState = new HashMap(); for(ActorInstance d: dActors){ - s0.put(d,d.getImplementation().getSchedule().getInitialState()); + ieState.put(d,d.getImplementation().getSchedule().getInitialState()); } - ExplorationState state = new ExplorationState(s0, "InitialState"); + ExplorationState state = new ExplorationState(ieState, "InitialState"); //Find all possible transitions of the initialStateSpaceState - for(Set> s: ExplorationState.traverseTransitions(s0)){ + for(Set> s: + ExplorationState.traverseTransitions(ieState)){ ttQueue.add(s); - state.getTransitionTuples().add(s); + state.addTransitionTuple(s); } visitedStates.add(state); + state.printActorStateTuple(System.out); while(!ttQueue.isEmpty()){ - //take a transition from the queue + //take a combination of transitions from the queue Set> tt = ttQueue.remove(0); - //find the parent exploration state of the transition - ExplorationState statett = ExplorationState.findExplorationStateOfTransition(visitedStates, tt); + //find the exploration state of the combination of transitions + ExplorationState statett = null; + statett = ExplorationState.findExplorationStateOfTransition(visitedStates, tt); if(statett==null){ String msg = "constructScenarioFSM:transition has no state"; throw new NullPointerException(msg); @@ -393,18 +554,18 @@ public ScenarioFSM constructScenarioFSM(){ //Find the set of ControlTokensPerActions produced by each detector actor for(Pair transition: tt){ - Set sta = analysis.getScenarioOfDetectorAction( + Set cta = analysis.getControlTokensOfAction( transition.getFirst(), transition.getSecond().getAction()); - if(sta!=null){ - sTokens.add(sta); + if(cta != null){ + sTokens.add(cta); } newState.put(transition.getFirst(), transition.getSecond().getTargetState()); } - Set> staSet = CartesianProduct.cartesianProduct(sTokens); - Set sgs = constructScenarioGraphs(source, tt, staSet); + Set> ctaSet = CartesianProduct.cartesianProduct(sTokens); + Set sgs = constructScenarioGraphs(source, tt, ctaSet); if(!sgs.isEmpty()){ for(ScenarioGraph sg: sgs){ - if(ExplorationState.findScenarioGraph(sg, statett.getScenarioGraphs())==null) + if(ExplorationState.findScenarioGraph(sg, statett.getScenarioGraphs(), false)==null) statett.getScenarioGraphs().add(sg); else eliminatedScenarioGraphs++; @@ -421,6 +582,11 @@ public ScenarioFSM constructScenarioFSM(){ newEState.addTransitionTuple(s); } visitedStates.add(newEState); + System.out.println("From .."); + statett.printActorStateTuple(System.out); + System.out.println("To .."); + newEState.printActorStateTuple(System.out); + System.out.println("---------"); } else{ existingState.addIncidentState(statett); @@ -479,37 +645,37 @@ private Set getZeroGraphStates(Set states){ * @param visitedStates */ private void generateFSMStates(Set visitedStates){ + String str; //Create FSM states and scenario graphs - for(ExplorationState sp: visitedStates){ - for(ScenarioGraph sg: sp.getScenarioGraphs()){ - //if new scenario graph, add to the list + for(ExplorationState eState: visitedStates){ + for(ScenarioGraph sGraph: eState.getScenarioGraphs()){ //create new FSM state - String name = "State_"+scenarioFSM.getScenarioFSMStates().size(); - ScenarioFSMState fsmState = scenarioFSM.new ScenarioFSMState(name); - ScenarioGraph existingSg = null; - existingSg = ExplorationState.findScenarioGraph(sg, scenarioFSM.getScenarioGraphs()); - if(existingSg==null){ - String n = "ScenarioGraph_"+scenarioFSM.getScenarioGraphs().size(); - sg.setName(n); - fsmState.setScenarioGraph(sg); - scenarioFSM.addScenarioGraphs(sg); + str = eState.getName(); + ScenarioFSMState fsmState = scenarioFSM.new ScenarioFSMState(str); + ScenarioGraph existingSGraph = null; + existingSGraph = ExplorationState.findScenarioGraph(sGraph, scenarioFSM.getScenarioGraphs(), false); + //if new scenario graph, add to the list + if(existingSGraph==null){ + str = "ScenarioGraph_"+scenarioFSM.getScenarioGraphs().size(); + sGraph.setName(str); + fsmState.setScenarioGraph(sGraph); + scenarioFSM.addScenarioGraph(sGraph); } else{ - sg.setName(existingSg.getName()); - fsmState.setScenarioGraph(existingSg); - for(Set t: sg.getControlTokens()) - existingSg.addControlToken(t); + //change the name of the g + sGraph.setName(existingSGraph.getName()); + fsmState.setScenarioGraph(existingSGraph); } - sp.addScenarioFSMState(fsmState); + eState.addScenarioFSMState(fsmState); scenarioFSM.addScenarioFSMState(fsmState); } } - //create initial state with just a random scenario graph - ScenarioFSMState spfsmState = scenarioFSM.new ScenarioFSMState("InitialState"); - spfsmState.setScenarioGraph(scenarioFSM.getScenarioGraphs().iterator().next()); - scenarioFSM.addScenarioFSMState(spfsmState); +// //create initial state with just a random scenario graph (for the time-being) +// ScenarioFSMState initialFsmState = scenarioFSM.new ScenarioFSMState("InitialState"); +// initialFsmState.setScenarioGraph(scenarioFSM.getScenarioGraphs().iterator().next()); +// scenarioFSM.addScenarioFSMState(initialFsmState); } /** @@ -517,40 +683,76 @@ private void generateFSMStates(Set visitedStates){ * @param visitedStates */ private void generateFSMTransitions(Set visitedStates){ + String str; //Create FSM transitions - for(ExplorationState sp: visitedStates){ - //Add a transition from every FSM state of every incidentState to - //every FSM state of this state - if(sp.getName().equals("InitialState")){ - for(ScenarioFSMState targetFSMState: sp.getScenarioFSMStates()){ - String n = "Transition"+scenarioFSM.getScenarioFSMTransitions().size(); - ScenarioFSMTransition fsmTransition = scenarioFSM.new ScenarioFSMTransition(n); - fsmTransition.setSourceState(scenarioFSM.getState("InitialState")); - fsmTransition.setTargetState(targetFSMState); - if(fsmTransition.getSourceState()==null || fsmTransition.getTargetState()==null){ - String msg = "constructScenarioFSM: transition has no source/target state."; - throw new NullPointerException(msg); - } - if(!scenarioFSM.transitionExists(fsmTransition)) - scenarioFSM.addScenarioFSMTransition(fsmTransition); - } - } + for(ExplorationState eState: visitedStates){ - for(ExplorationState spInc: sp.getIncidentStates()){ - for(ScenarioFSMState srcFSMState: spInc.getScenarioFSMStates()){ - for(ScenarioFSMState targetFSMState: sp.getScenarioFSMStates()){ - String n = "Transition"+scenarioFSM.getScenarioFSMTransitions().size(); - ScenarioFSMTransition fsmTransition = scenarioFSM.new ScenarioFSMTransition(n); + //connect the initial state of the scenario FSM with + //every FSM state of the initial exploration state +// if(eState.getName().equals("InitialState")){ +// for(ScenarioFSMState targetFSMState: eState.getScenarioFSMStates()){ +// str = "Transition"+scenarioFSM.getScenarioFSMTransitions().size(); +// ScenarioFSMTransition fsmTransition = scenarioFSM.new ScenarioFSMTransition(str); +// fsmTransition.setSourceState(scenarioFSM.getState("InitialState")); +// fsmTransition.setTargetState(targetFSMState); +// if(fsmTransition.getSourceState()==null || fsmTransition.getTargetState()==null){ +// str = "generateFSMTransitions: transition has no source/target state."; +// throw new NullPointerException(str); +// } +// if(!scenarioFSM.transitionExists(fsmTransition)){ +// scenarioFSM.addScenarioFSMTransition(fsmTransition); +// } +// else{ +// str = "generateFSMTransitions: duplicated transitions detected."; +// throw new NullPointerException(str); +// } +// } +// } + + //add a transition from every FSM state of every incidentState to + //every FSM state of the current state + for(ExplorationState ieState: eState.getIncidentStates()){ + for(ScenarioFSMState srcFSMState: ieState.getScenarioFSMStates()){ + for(ScenarioFSMState targetFSMState: eState.getScenarioFSMStates()){ + str = "Transition"+scenarioFSM.getScenarioFSMTransitions().size(); + ScenarioFSMTransition fsmTransition = scenarioFSM.new ScenarioFSMTransition(str); fsmTransition.setSourceState(srcFSMState); fsmTransition.setTargetState(targetFSMState); - if(!scenarioFSM.transitionExists(fsmTransition)) + ScenarioGraph srcG = srcFSMState.getScenarioGraph(); + ScenarioGraph dstG = targetFSMState.getScenarioGraph(); + //check for non-existing token transition + if(!scenarioFSM.transitionExists(fsmTransition)){ scenarioFSM.addScenarioFSMTransition(fsmTransition); + } + else{ + str = "generateFSMTransitions: duplicated transitions detected."; + throw new NullPointerException(str); + } + } } } } } + public boolean isNonExistingTokenTransition( + Set f, Set s){ + for(ControlTokensPerAction cf: f){ + for(ControlTokensPerAction cs: s){ + for(Map.Entry ef: cf.getControlTokens().entrySet()){ + for(Map.Entry es: cs.getControlTokens().entrySet()){ + ControlTokenTransition ctt = new ControlTokenTransition( + ef.getKey(), ef.getValue(),es.getKey(), es.getValue()); + for(ControlTokenTransition t: nonExistingTokenTransitions){ + if(ctt.equals(t)) + return true; + } + } + } + } + } + return false; + } /** * populates the control tokens of the network. Each control token has a name, * a parent detector actor and a list of (broadcast) control ports. Hence, all @@ -582,11 +784,24 @@ private void populateControlTokens(){ throw new NullPointerException(msg); } controlToken.addControlPort(pi); - } - + } controlTokens.add(controlToken); } } + + if (actor.getAnnotationArgumentValue("ActorProperty", "Filters")!=null){ + String s = actor.getAnnotationArgumentValue("ActorProperty", "Filters"); + for(String t: s.split(";")){ + String st[] = t.split("-"); + String srcSt[] = st[0].split(":"); + String dstSt[] = st[1].split(":"); + ControlTokenTransition ct = new ControlTokenTransition( + srcSt[0].trim(), Long.parseLong(srcSt[1].trim()), + dstSt[0].trim(), Long.parseLong(dstSt[1].trim())); + nonExistingTokenTransitions.add(ct); + } + } + } //Otherwise, assume all output ports belong to the same token type if(!hasAnnotation){ @@ -604,4 +819,197 @@ private void populateControlTokens(){ } } } + + private void populateDetectorFSMs(){ + for(ActorInstance dActor: analysis.getDetectorActors()){ + String filePath = analysis.getResourcePath()+File.separator+ + dActor.getInstanceName()+".fsm"; + DetectorFSM detectorFSM = new DetectorFSM(dActor); + Document document; + DocumentBuilderFactory factory = + DocumentBuilderFactory.newInstance(); + factory.setIgnoringElementContentWhitespace(true); + try { + DocumentBuilder builder = factory.newDocumentBuilder(); + document = builder.parse(new File(filePath)); + if(document.getDocumentElement().getTagName().equalsIgnoreCase("fsm")){ + NamedNodeMap fsmAttributes = document.getDocumentElement().getAttributes(); + Node initialStateNode = fsmAttributes.getNamedItem("initialState"); + if(initialStateNode==null) + throw new Exception("No initial state in FSM"); + detectorFSM.initialState = initialStateNode.getNodeValue(); + + NodeList nodes = document.getDocumentElement().getChildNodes(); + for (int i=0; i statesQueue = new ArrayList(); + + List visitedStates = new ArrayList(); + + //the set of detector actors + Set dActors = analysis.getScenarioAwareDetectorActors(); + + try{ + ActorInstance source = analysis.getSourceActor(); + + if(source==null){ + String msg = "constructScenarioFSM: no source actor found."; + msg += "Use annotation: @ActorProperty(Source=\"true\")"; + throw new NullPointerException(msg); + } + + //initialExplorationState = the set of the initial states of detector actors + Set ieState = new HashSet(); + for(ActorInstance d: dActors){ + ieState.add(getDetectorFSM(d).getInitialState()); + } + + ExplorationState state = new ExplorationState(ieState, "EState"); + + statesQueue.add(state); + + while(!statesQueue.isEmpty()){ + //take a combination of transitions from the queue + ExplorationState tt = statesQueue.remove(0); + + //find the exploration state of the combination of transitions + ExplorationState existingState = ExplorationState.findVistedState(visitedStates, tt.stateTuple); + if(existingState != null){ + for(ExplorationState es: tt.getIncidentStates()) + existingState.addIncidentState(es); + } + else{ + + tt.setName("State_"+visitedStates.size()); + visitedStates.add(tt); + + Set sTokens = new HashSet(); + Set> nextStates = new HashSet>(); + + List> targetStatesList = new ArrayList>(); + + for(ControlTokenFSMState cs: tt.stateTuple){ + Set targetStates = new HashSet(); + ControlTokensPerAction t = analysis.new ControlTokensPerAction(cs.detectorActor, cs.action); + t.setControlTokens(cs.controlTokens); + sTokens.add(t); + + for(String trans: cs.transitions){ + targetStates.add(this.getDetectorFSM(cs.detectorActor).getState(trans)); + } + targetStatesList.add(targetStates); + } + + nextStates = CartesianProduct.cartesianProduct(targetStatesList); + + ScenarioGraph sgs = analysis.constructScenarioGraph(source, sTokens); + if(sgs!=null){ + tt.getScenarioGraphs().add(sgs); + } + else + throw new Exception("ExplorationState has no scenario graph"); + + for(Set st: nextStates){ + if(stateTupleExist(st)){ + ExplorationState newEState = new ExplorationState(st,"EState"); + newEState.addIncidentState(tt); + statesQueue.add(newEState); + } + } + } + } + + Set visitedStatesSet = new HashSet(); + visitedStatesSet.addAll(visitedStates); + + //Remove all Exploration States which have no ScenarioGraphs + visitedStatesSet.removeAll(getZeroGraphStates(visitedStatesSet)); + + if(visitedStatesSet.size() == 0){ + throw new Exception("constructScenarioFSM: No valid exploration states found."); + } + + //generate the FSM states + generateFSMStates(visitedStatesSet); + + //generate the FSM transitions + generateFSMTransitions(visitedStatesSet); + + for(ExplorationState s: visitedStatesSet){ + s.print(System.out); + } + + System.out.println(scenarioFSM.getScenarioFSMStates().size() + " FSM States, " + + scenarioFSM.getScenarioFSMTransitions().size() + " FSM Transtions, " + + scenarioFSM.getScenarioGraphs().size() + " scenario graphs," + + eliminatedScenarioGraphs + " eliminated graphs"); + } + catch(Exception e){ + System.out.println(e.getMessage()); + System.exit(1); + } + + return scenarioFSM; + } } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioFSM.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioFSM.java index ad3fe6a..fd3eef3 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioFSM.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioFSM.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.network; import java.util.HashSet; @@ -152,7 +151,7 @@ public void addScenarioFSMTransition(ScenarioFSMTransition transition){ fsmTransitions.add(transition); } - public void addScenarioGraphs(ScenarioGraph graph){ + public void addScenarioGraph(ScenarioGraph graph){ scenarioGraphs.add(graph); } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioGraph.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioGraph.java index 8b5f5d8..672161e 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioGraph.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioGraph.java @@ -33,9 +33,9 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.network; +import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -69,7 +69,7 @@ public class ScenarioGraph{ private Map connectionsMap = new HashMap(); //The set of control-control-token tuples that define this scenario - private Set> controlTokens = new HashSet>(); + private Set controlTokens = new HashSet(); //constructor public ScenarioGraph(String n){ @@ -102,15 +102,10 @@ public void addConnection(Connection c, Integer t){ } //set control tokens - public void setControlTokens(Set> c){ + public void setControlTokens(Set c){ controlTokens = c; } - //add control token - public void addControlToken(Set c){ - controlTokens.add(c); - } - //get name of the graph public String getName(){ return name; @@ -127,28 +122,26 @@ public Map getConnections(){ } //get control tokens - public Set> getControlTokens(){ + public Set getControlTokens(){ return controlTokens; } - public void print(Stream stream){ - stream.println("\tScenarioGraph: "+name+ ", actors: "+ actorsMap.size()); + public void print(PrintStream out){ + out.println("\tScenarioGraph: "+name+ ", actors: "+ actorsMap.size()); if(controlTokens!=null){ - stream.println("ControlTokens: "); - for(Set sta: controlTokens){ - stream.println("ControlTokensTuple: "); - for(ControlTokensPerAction ta: sta){ - ta.print(stream); + out.println("ControlTokens: "); + out.println("ControlTokensTuple: "); + for(ControlTokensPerAction ta: controlTokens){ + ta.print(out); } - } } for(Map.Entry e: actorsMap.entrySet()){ if(e.getValue().getTransition()!=null) - stream.println("\t\t"+e.getKey().getInstanceName()+" "+e.getValue().getTransition().getAction().getName()); + out.println("\t\t"+e.getKey().getInstanceName()+" "+e.getValue().getTransition().getAction().getName()); else - stream.println("\t\t"+e.getKey().getInstanceName()); + out.println("\t\t"+e.getKey().getInstanceName()); } } } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/SneakyNetworkAnalyzer.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/SneakyNetworkAnalyzer.java index 0e04751..1800ab3 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/SneakyNetworkAnalyzer.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/SneakyNetworkAnalyzer.java @@ -34,6 +34,34 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* + * Copyright (c) 2012, Ericsson AB + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the Ericsson AB nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ package org.caltoopia.analysis.network; import java.util.ArrayList; @@ -197,3 +225,4 @@ public List getUnclassifiedActors(){ return unclassifiedActors; } } + From 59421ccc12b46c6bda90a8964b10c3ccceb55b06 Mon Sep 17 00:00:00 2001 From: Firew Siyoum Date: Tue, 29 Jan 2013 00:18:53 +0100 Subject: [PATCH 2/8] Minor fixes in analysis. --- .../analysis/actor/ActionAnalysis.java | 1 - .../analysis/actor/ActorAnalysis.java | 60 ++++++++----------- .../analysis/actor/ActorAnalyzer.java | 60 ++++++++----------- .../analysis/actor/ActorClassifierOutput.java | 6 +- .../analysis/actor/ConnectionAnalysis.java | 7 +-- .../analysis/actor/GenericActorAnalysis.java | 1 - .../analysis/actor/LoopedFiringSequence.java | 1 - .../analysis/actor/McdfActorAnalysis.java | 1 - .../analysis/actor/PortAnalysis.java | 2 + .../actor/ScenarioAwareActorAnalysis.java | 13 ++-- .../analysis/actor/SneakyActorAnalyzer.java | 60 ++++++++----------- .../analysis/actor/StaticActorSchedule.java | 1 - .../analysis/actor/StaticFiringSequence.java | 1 - .../analysis/actor/TrivialFiringSequence.java | 1 - 14 files changed, 93 insertions(+), 122 deletions(-) diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActionAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActionAnalysis.java index 9c25123..6476b1f 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActionAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActionAnalysis.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.util.Map; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorAnalysis.java index 3550081..65f5441 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorAnalysis.java @@ -1,39 +1,31 @@ -/* - * Copyright (c) Ericsson AB, 2013 +/* + * Copyright (c) 2012, Ericsson AB * All rights reserved. - * - * License terms: - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions and - * the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * * Neither the name of the copyright holder nor the names - * of its contributors may be used to endorse or promote - * products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the Ericsson AB nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.util.Collection; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorAnalyzer.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorAnalyzer.java index 7d7ee99..873b47d 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorAnalyzer.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorAnalyzer.java @@ -1,39 +1,31 @@ -/* - * Copyright (c) Ericsson AB, 2013 +/* + * Copyright (c) 2012, Ericsson AB * All rights reserved. - * - * License terms: - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions and - * the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * * Neither the name of the copyright holder nor the names - * of its contributors may be used to endorse or promote - * products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the Ericsson AB nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import org.caltoopia.analysis.air.ActorImplementation; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorClassifierOutput.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorClassifierOutput.java index 9b8183c..6718d8d 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorClassifierOutput.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ActorClassifierOutput.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.io.PrintStream; @@ -82,8 +81,9 @@ public void print(GenericActorAnalysis analysis) { } else { - if (!actor.hasImplementation()) - mOut.print("extern/unknown implementation, "); + if (!actor.hasImplementation()){ + mOut.print("extern/unknown implementation"); + } mOut.println("actor not analyzed"); } } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ConnectionAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ConnectionAnalysis.java index 594f85c..24eacd7 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ConnectionAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ConnectionAnalysis.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import org.caltoopia.analysis.air.Connection; @@ -49,7 +48,7 @@ public enum ConnectionType { private Connection connection; private ConnectionType type = ConnectionType.UNCLASSIFIED; - private Integer initialTokens; + private Integer initialTokens = new Integer(0); private Integer tokenSize; @@ -58,7 +57,6 @@ public ConnectionAnalysis(Connection c, GenericActorAnalysis srcActorAnalysis){ connection = c; //Assign initial tokens - initialTokens = null; if(srcActorAnalysis!=null){ if (srcActorAnalysis.hasStaticSchedule() && srcActorAnalysis.getStaticSchedule().hasTransientPhase()) { @@ -71,8 +69,7 @@ public ConnectionAnalysis(Connection c, GenericActorAnalysis srcActorAnalysis){ } } } - else - initialTokens = new Integer(0); + //Assign token size tokenSize = new Integer(1); diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java index e4843c6..a79f05b 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.util.Collection; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/LoopedFiringSequence.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/LoopedFiringSequence.java index 85cb793..4d429ab 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/LoopedFiringSequence.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/LoopedFiringSequence.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.util.AbstractList; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/McdfActorAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/McdfActorAnalysis.java index ec481de..070ee90 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/McdfActorAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/McdfActorAnalysis.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.util.ArrayList; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/PortAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/PortAnalysis.java index 3446e45..a658c3c 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/PortAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/PortAnalysis.java @@ -35,9 +35,11 @@ */ package org.caltoopia.analysis.actor; + import java.util.Iterator; import java.util.List; import java.util.Map; + import org.caltoopia.analysis.air.Action; import org.caltoopia.analysis.air.ActorImplementation; import org.caltoopia.analysis.air.Guard; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ScenarioAwareActorAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ScenarioAwareActorAnalysis.java index 6e80dc3..7584421 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ScenarioAwareActorAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ScenarioAwareActorAnalysis.java @@ -33,13 +33,15 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; + +import org.caltoopia.analysis.actor.GenericActorAnalysis.AnnotatedActionProperty; +import org.caltoopia.analysis.actor.McdfActorAnalysis.McdfActorInstanceType; import org.caltoopia.analysis.actor.PortAnalysis.PortType; import org.caltoopia.analysis.air.Action; import org.caltoopia.analysis.air.ActorInstance; @@ -50,6 +52,7 @@ import org.caltoopia.analysis.air.PortSignature; import org.caltoopia.analysis.air.State; import org.caltoopia.analysis.air.Transition; +import org.caltoopia.analysis.air.PortInstance.Direction; import org.caltoopia.analysis.util.collections.UnionOfDisjointIntervals; import org.caltoopia.ast2ir.Stream; @@ -513,7 +516,9 @@ public void constructDynamicScenarios(){ //Add to the list of scenario properties scenarios.add(scenario); - + guardedTransitions.add(transition); + } + } //Update for the next state State dstState = transition.getTargetState(); if(!visitedStates.contains(dstState)){ @@ -522,9 +527,7 @@ public void constructDynamicScenarios(){ transitionsQueue.add(t); } } - guardedTransitions.add(transition); - } - } + } } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/SneakyActorAnalyzer.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/SneakyActorAnalyzer.java index 09abf06..1399e04 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/SneakyActorAnalyzer.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/SneakyActorAnalyzer.java @@ -1,39 +1,31 @@ -/* - * Copyright (c) Ericsson AB, 2013 +/* + * Copyright (c) 2012, Ericsson AB * All rights reserved. - * - * License terms: - * - * Redistribution and use in source and binary forms, - * with or without modification, are permitted provided - * that the following conditions are met: - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions and - * the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * * Neither the name of the copyright holder nor the names - * of its contributors may be used to endorse or promote - * products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the Ericsson AB nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY + * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.util.ArrayList; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/StaticActorSchedule.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/StaticActorSchedule.java index f4e6a31..d841047 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/StaticActorSchedule.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/StaticActorSchedule.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; public class StaticActorSchedule { diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/StaticFiringSequence.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/StaticFiringSequence.java index 7ed778a..3984d87 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/StaticFiringSequence.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/StaticFiringSequence.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.util.List; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/TrivialFiringSequence.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/TrivialFiringSequence.java index 59ba9c8..d05fda5 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/TrivialFiringSequence.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/TrivialFiringSequence.java @@ -33,7 +33,6 @@ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package org.caltoopia.analysis.actor; import java.util.Collections; From ec8d7dafb34bed0f88d3421164c8d9e120df6e6e Mon Sep 17 00:00:00 2001 From: Firew Siyoum Date: Tue, 29 Jan 2013 01:30:43 +0100 Subject: [PATCH 3/8] action schedule construction from xml files added for detector actors in scenario analysis. --- .../caltoopia/analysis/network/GenericNetworkAnalysis.java | 2 +- .../analysis/network/ScenarioAwareNetworkAnalysis.java | 4 ++-- .../src/org/caltoopia/analysis/test/Analysis.java | 2 +- .../src/org/caltoopia/analysis/test/TestSneakyClassifier.java | 2 +- .../src/org/caltoopia/codegen/CPrinter.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/GenericNetworkAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/GenericNetworkAnalysis.java index d6415f0..5577f50 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/GenericNetworkAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/GenericNetworkAnalysis.java @@ -227,7 +227,7 @@ else if(isCycloStaticDaflowGraph()){ } public String getExecutionTimeAsString(ActorInstance actor){ - String executionTime = ""; + String executionTime = getGenericActorAnalysis(actor).getExecutionTime().toString(); List executionTimes = null; if(getGenericActorAnalysis(actor).isTypeAnnotated()) executionTimes = getAnnotatedExecutionTime(actor); diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java index 6a41fab..a4308a3 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java @@ -215,7 +215,7 @@ public void print(PrintStream out){ private String resourcePath; //constructor - public ScenarioAwareNetworkAnalysis(Network n, NetworkAnalysis na) { + public ScenarioAwareNetworkAnalysis(Network n, NetworkAnalysis na, String actionSchedulePAth) { //Generic network analyis constructor super(n,na); @@ -273,7 +273,7 @@ public ScenarioAwareNetworkAnalysis(Network n, NetworkAnalysis na) { } - setResourcePath("/home/firew/CAL_applications/RVC_MPEG4_SP_Decoder"); + setResourcePath(actionSchedulePAth); // state-space exploration object to construct the FSM stateSpaceExploration = new ScenarioAwareStateExploration(this); diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/test/Analysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/test/Analysis.java index 397de81..6518d08 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/test/Analysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/test/Analysis.java @@ -150,7 +150,7 @@ else if(analysis.isCycloStaticDaflowGraph()){ case 3: case 6: ScenarioAwareNetworkAnalysis saAnalysis= - new ScenarioAwareNetworkAnalysis(network, mNetworkAnalyzer.analyze(network)); + new ScenarioAwareNetworkAnalysis(network, mNetworkAnalyzer.analyze(network), session.getWorkingDirectory()); mNetworkOutput.setOutputFolder(session.getOutputFolder()); if(saAnalysis.isScenarioAwareDataflowGraph()){ mNetworkOutput.printSaXML(network,saAnalysis); diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/test/TestSneakyClassifier.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/test/TestSneakyClassifier.java index 26758a6..8d21f62 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/test/TestSneakyClassifier.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/test/TestSneakyClassifier.java @@ -121,7 +121,7 @@ public void testSANetwork(String args[]) { ActorDirectory.initCompilation(mFrontEnd.getCompilationSession()); Network network=mFrontEnd.elaborate(); ScenarioAwareNetworkAnalysis saAnalysis= - new ScenarioAwareNetworkAnalysis(network, mNetworkAnalyzer.analyze(network)); + new ScenarioAwareNetworkAnalysis(network, mNetworkAnalyzer.analyze(network), args[4]); mNetworkOutput.setOutputFolder(mFrontEnd.getOutputFolder()); //Print actor instance types for (ActorInstance actor: network.getActors()) { diff --git a/org.caltoopia.frontend/src/org/caltoopia/codegen/CPrinter.java b/org.caltoopia.frontend/src/org/caltoopia/codegen/CPrinter.java index 6a7ea60..5be54af 100644 --- a/org.caltoopia.frontend/src/org/caltoopia/codegen/CPrinter.java +++ b/org.caltoopia.frontend/src/org/caltoopia/codegen/CPrinter.java @@ -578,7 +578,7 @@ public Stream caseActor(Actor actor) { s.println(actorId + " *thisActor=(" + actorId + "*) pBase;"); int executionTime=1; for (org.caltoopia.ir.Annotation a : actor.getAnnotations()) { - if (a.getName().equals("CALSim")) { + if (a.getName().equals("ActorProperty")) { for (org.caltoopia.ir.AnnotationArgument arg : a.getArguments()) { if (arg.getId().equals("WCET")) { executionTime=(Integer.parseInt(arg.getValue())); From 9108170409886994ffa41f8f21a912b25f764ac5 Mon Sep 17 00:00:00 2001 From: Firew Siyoum Date: Tue, 29 Jan 2013 14:02:45 +0100 Subject: [PATCH 4/8] Minor fixes in scenario analysis. --- .../network/ScenarioAwareNetworkAnalysis.java | 20 ++++++++-------- .../ScenarioAwareStateExploration.java | 24 ++++++++++++------- .../test/PluginAnalysisNetworkView.java | 2 +- .../visual/test/TestNetworkView.java | 4 ++-- .../test/TestScenarioAwareNetworkView.java | 8 ++++--- 5 files changed, 34 insertions(+), 24 deletions(-) diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java index a4308a3..bbdd336 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java @@ -401,19 +401,19 @@ public boolean isScenarioAwareDataflowGraph(){ } /** - * It is assumed that there is one source actor in the network. - * @return the source actor of the network. It returns null if + * @return the source actors of the network. It returns null if * there is no source actor. */ - public ActorInstance getSourceActor(){ + public List getSourceActors(){ + List srcs = new ArrayList(); for(ActorInstance actor: network.getActors()){ if(actor.hasImplementation()){ if(getScenarioAwareActorAnalysis(actor).isSource()){ - return actor; + srcs.add(actor); } } } - return null; + return srcs; } /** @@ -554,7 +554,7 @@ else if(s.length==2 && Long.parseLong(s[0].trim()) >= 0 * @param sTokens * @return */ - public ScenarioGraph constructScenarioGraph(ActorInstance source, + public ScenarioGraph constructScenarioGraph(List sources, Set> transitionTuple, Set sTokens){ if(sTokens.isEmpty()){ @@ -573,9 +573,9 @@ public ScenarioGraph constructScenarioGraph(ActorInstance source, List visitedActors = new ArrayList(); List actorsQueue = new ArrayList(); - actorsQueue.add(source); + actorsQueue.addAll(sources); while(!actorsQueue.isEmpty()){ - ActorInstance actor = actorsQueue.remove(0); + ActorInstance actor = actorsQueue.remove(0); if(!visitedActors.contains(actor)){ visitedActors.add(actor); ScenarioAwareActorAnalysis.Scenario sp = null; @@ -635,7 +635,7 @@ public ScenarioGraph constructScenarioGraph(ActorInstance source, * @param sTokens * @return */ - public ScenarioGraph constructScenarioGraph(ActorInstance source, Set sTokens){ + public ScenarioGraph constructScenarioGraph(List sources, Set sTokens){ if(sTokens.isEmpty()){ return null; } @@ -652,7 +652,7 @@ public ScenarioGraph constructScenarioGraph(ActorInstance source, Set visitedActors = new ArrayList(); List actorsQueue = new ArrayList(); - actorsQueue.add(source); + actorsQueue.addAll(sources); while(!actorsQueue.isEmpty()){ ActorInstance actor = actorsQueue.remove(0); if(!visitedActors.contains(actor)){ diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java index 6934ca0..ba83008 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java @@ -48,6 +48,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import org.caltoopia.analysis.actor.ScenarioAwareActorAnalysis; +import org.caltoopia.analysis.actor.GenericActorAnalysis.ActorInstanceType; import org.caltoopia.analysis.actor.ScenarioAwareActorAnalysis.ScenarioAwareActorInstanceType; import org.caltoopia.analysis.air.Action; import org.caltoopia.analysis.air.ActorInstance; @@ -386,13 +387,13 @@ public boolean stateTupleExist(Set stateTuple){ * @param ctActions: a set of combinations of control tokens * @return a set of ScenarioGraph, possibly empty. */ - public Set constructScenarioGraphs(ActorInstance source, + public Set constructScenarioGraphs(List sources, Set> tr, Set> ctActions){ Set scenarioGraphs = new HashSet(); for(Set st: ctActions){ - ScenarioGraph g = analysis.constructScenarioGraph(source, tr, st); + ScenarioGraph g = analysis.constructScenarioGraph(sources, tr, st); if(g!=null){ //check if it is not duplicate boolean exists = false; @@ -447,6 +448,13 @@ public ScenarioAwareActorAnalysis.Scenario getScenario(ActorInstance actor, return aa.getScenarios().get(0); } + if(type == ScenarioAwareActorInstanceType.SA_DETECTOR){ + //check if the detector actor is static + if(aa.getActorInstanceType()==ActorInstanceType.SINGLE_RATE_STATIC || + aa.getActorInstanceType()==ActorInstanceType.MULTI_RATE_STATIC){ + return aa.getScenarios().get(0); + } + } //If an actor is scenario_aware_dynamic, test each of its scenarios for(ScenarioAwareActorAnalysis.Scenario s: aa.getScenarios()){ boolean match = false; @@ -514,9 +522,9 @@ public ScenarioFSM constructScenarioFSM(){ ttQueue = new ArrayList>>(); try{ - ActorInstance source = analysis.getSourceActor(); + List sources = analysis.getSourceActors(); - if(source==null){ + if(sources.size()==0){ String msg = "constructScenarioFSM: no source actor found."; msg += "Use annotation: @ActorProperty(Source=\"true\")"; throw new NullPointerException(msg); @@ -562,7 +570,7 @@ public ScenarioFSM constructScenarioFSM(){ newState.put(transition.getFirst(), transition.getSecond().getTargetState()); } Set> ctaSet = CartesianProduct.cartesianProduct(sTokens); - Set sgs = constructScenarioGraphs(source, tt, ctaSet); + Set sgs = constructScenarioGraphs(sources, tt, ctaSet); if(!sgs.isEmpty()){ for(ScenarioGraph sg: sgs){ if(ExplorationState.findScenarioGraph(sg, statett.getScenarioGraphs(), false)==null) @@ -911,9 +919,9 @@ public ScenarioFSM constructScenarioFSM2(){ Set dActors = analysis.getScenarioAwareDetectorActors(); try{ - ActorInstance source = analysis.getSourceActor(); + List sources = analysis.getSourceActors(); - if(source==null){ + if(sources.size()==0){ String msg = "constructScenarioFSM: no source actor found."; msg += "Use annotation: @ActorProperty(Source=\"true\")"; throw new NullPointerException(msg); @@ -963,7 +971,7 @@ public ScenarioFSM constructScenarioFSM2(){ nextStates = CartesianProduct.cartesianProduct(targetStatesList); - ScenarioGraph sgs = analysis.constructScenarioGraph(source, sTokens); + ScenarioGraph sgs = analysis.constructScenarioGraph(sources, sTokens); if(sgs!=null){ tt.getScenarioGraphs().add(sgs); } diff --git a/org.caltoopia.visual/src/org/caltoopia/visual/test/PluginAnalysisNetworkView.java b/org.caltoopia.visual/src/org/caltoopia/visual/test/PluginAnalysisNetworkView.java index 08caa7e..15167b6 100644 --- a/org.caltoopia.visual/src/org/caltoopia/visual/test/PluginAnalysisNetworkView.java +++ b/org.caltoopia.visual/src/org/caltoopia/visual/test/PluginAnalysisNetworkView.java @@ -373,7 +373,7 @@ public void classify() { NetworkView view=getNetworkView(); SneakyNetworkAnalyzer mNetworkAnalyzer=new SneakyNetworkAnalyzer(); ScenarioAwareNetworkAnalysis scenarioAwareAnalysis= - new ScenarioAwareNetworkAnalysis(network, mNetworkAnalyzer.analyze(network)); + new ScenarioAwareNetworkAnalysis(network, mNetworkAnalyzer.analyze(network), session.getWorkingDirectory()); for (ActorInstance actor: network.getActors()) { ScenarioAwareActorAnalysis actorAnalysis=scenarioAwareAnalysis.getScenarioAwareActorAnalysis(actor); diff --git a/org.caltoopia.visual/src/org/caltoopia/visual/test/TestNetworkView.java b/org.caltoopia.visual/src/org/caltoopia/visual/test/TestNetworkView.java index aa02c2a..d4fc9dd 100644 --- a/org.caltoopia.visual/src/org/caltoopia/visual/test/TestNetworkView.java +++ b/org.caltoopia.visual/src/org/caltoopia/visual/test/TestNetworkView.java @@ -49,7 +49,7 @@ public class TestNetworkView { private TestFrontEnd mFrontEnd; private Network mNetwork; - + public String pathToDetectorFSMs; public TestNetworkView() { mFrontEnd=TestFrontEnd.createStandAlone(); } @@ -58,7 +58,7 @@ public void test(String args[]) { if (mFrontEnd.parseCommandLine(args)) { ActorDirectory.initCompilation(mFrontEnd.getCompilationSession()); mNetwork=mFrontEnd.elaborate(); - + pathToDetectorFSMs = args[4]; if (mNetwork!=null) { // Create user interface on the event-dispatching thread. try { diff --git a/org.caltoopia.visual/src/org/caltoopia/visual/test/TestScenarioAwareNetworkView.java b/org.caltoopia.visual/src/org/caltoopia/visual/test/TestScenarioAwareNetworkView.java index 61023b5..b4728b0 100644 --- a/org.caltoopia.visual/src/org/caltoopia/visual/test/TestScenarioAwareNetworkView.java +++ b/org.caltoopia.visual/src/org/caltoopia/visual/test/TestScenarioAwareNetworkView.java @@ -73,7 +73,7 @@ public class TestScenarioAwareNetworkView extends TestNetworkView { protected void test(Network network) { mxGraph graph=new mxGraph(); NetworkView view=new NetworkView(graph); - NetworkController ctrl=new ScenarioAwareNetworkController(view); + NetworkController ctrl=new ScenarioAwareNetworkController(view, this.pathToDetectorFSMs); view.setPreferredSize(new Dimension(800,600)); ctrl.setNetwork(network); @@ -83,8 +83,10 @@ protected void test(Network network) { private class ScenarioAwareNetworkController extends NetworkController { - public ScenarioAwareNetworkController(NetworkView view) { + String detectorFSMPath; + public ScenarioAwareNetworkController(NetworkView view, String p) { super(view); + detectorFSMPath = p; } public void classify() { @@ -92,7 +94,7 @@ public void classify() { NetworkView view=getNetworkView(); SneakyNetworkAnalyzer mNetworkAnalyzer=new SneakyNetworkAnalyzer(); ScenarioAwareNetworkAnalysis scenarioAwareAnalysis= - new ScenarioAwareNetworkAnalysis(network, mNetworkAnalyzer.analyze(network)); + new ScenarioAwareNetworkAnalysis(network, mNetworkAnalyzer.analyze(network), detectorFSMPath); for (ActorInstance actor: network.getActors()) { ScenarioAwareActorAnalysis actorAnalysis=scenarioAwareAnalysis.getScenarioAwareActorAnalysis(actor); From 373aaae3f1ef68811cda1d0ab42c447bb88f77c2 Mon Sep 17 00:00:00 2001 From: Firew Siyoum Date: Tue, 29 Jan 2013 17:28:11 +0100 Subject: [PATCH 5/8] bug fix in IR2CIR. --- .../src/org/caltoopia/codegen/IR2CIR.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/org.caltoopia.frontend/src/org/caltoopia/codegen/IR2CIR.java b/org.caltoopia.frontend/src/org/caltoopia/codegen/IR2CIR.java index 7e9e056..cf02438 100644 --- a/org.caltoopia.frontend/src/org/caltoopia/codegen/IR2CIR.java +++ b/org.caltoopia.frontend/src/org/caltoopia/codegen/IR2CIR.java @@ -1701,6 +1701,9 @@ public EObject caseGuard(Guard guard) { } } } + //TODO: check with Harald if this fixes the problem. + List decl = new ArrayList(); + decl.clear(); for (PortPeek p : guard.getPeeks()) { doSwitch(p); VariableReference var = p.getVariable(); @@ -1709,6 +1712,7 @@ public EObject caseGuard(Guard guard) { if(UtilIR.isList(var.getDeclaration().getType())) { //Need to allocate the top list since the tokens are stored as individual tokens UtilIR.tag(d, "shallowHeapMgmt", true); + decl.add(d); } else { UtilIR.tag(d, "inhibitHeapMgmt", true); } @@ -1755,6 +1759,8 @@ public EObject caseGuard(Guard guard) { } } } + //TODO: check with Harald if this is okay for the CPrint malloc bug. + insertHeapManagment(body,true,decl,body.getStatements()); insertHeapManagment(body,true,guard.getDeclarations(),body.getStatements()); leave(); return guard; From 56dfacea89a283f54a2fa464722a349866e17eb1 Mon Sep 17 00:00:00 2001 From: Firew Siyoum Date: Thu, 31 Jan 2013 00:21:28 +0100 Subject: [PATCH 6/8] Minor fixes for simulation backend. --- .../src/org/caltoopia/cli/Cal2C.java | 12 ++++++++++-- .../src/org/caltoopia/codegen/IrXmlPrinter.java | 15 +++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/org.caltoopia.frontend/src/org/caltoopia/cli/Cal2C.java b/org.caltoopia.frontend/src/org/caltoopia/cli/Cal2C.java index 21240f5..4e4220c 100644 --- a/org.caltoopia.frontend/src/org/caltoopia/cli/Cal2C.java +++ b/org.caltoopia.frontend/src/org/caltoopia/cli/Cal2C.java @@ -284,7 +284,7 @@ public void generate(String topNetwork, CompilationSession session, SimulationSe //Print the elaborated network boolean errPrint=session.getOutputFolder().contains("ecshdgn"); //So Harald get the err prints and none else new IrVariableAnnotation(errPrint).caseNetwork(session.getElaboratedNetwork()); - new IrXmlPrinter(session.getOutputFolder()).caseNetwork(session.getElaboratedNetwork()); + new IrXmlPrinter(session.getOutputFolder(), systemc).caseNetwork(session.getElaboratedNetwork()); //Transform the elaborated top network cir.doSwitch(session.getElaboratedNetwork()); @@ -317,7 +317,7 @@ public void generate(String topNetwork, CompilationSession session, SimulationSe out.println("Writing '" + file + "'"); AbstractActor actorInstantiated = Instantiator.instantiate(instance, session.getElaboratedNetwork()); new IrVariableAnnotation(errPrint).doSwitch(actorInstantiated); - new IrXmlPrinter(session.getOutputFolder()).doSwitch(actorInstantiated); + new IrXmlPrinter(session.getOutputFolder(), systemc).doSwitch(actorInstantiated); new CPrinter(file, null, session.getElaboratedNetwork(), cir, systemc, env, debugPrint).doSwitch(instance); sourceFiles.add(nsName + "__" + instance.getName() + ".c"); //String dotFile = session.getOutputFolder() + File.separator + nsName + "__" + instance.getName() + ".dot"; @@ -408,6 +408,14 @@ public void generate(String topNetwork, CompilationSession session, SimulationSe config.println("RUNTIME_ROOT = " + session.getRuntimePath()); if(systemc){ config.println("CALSIM_ROOT = " + simulationSession.calsimPath); + if(!env.includePaths.isEmpty()) { + config.print("SOURCES_DIR = "); + String str = env.includePaths.split(" *, *")[0]; + if(!str.trim().isEmpty()) { + config.print(str.trim()); + } + config.println(); + } config.println("CALLIB_HOME = " + session.getOutputFolder()); config.println("CALLIB = " + nsName.toLowerCase()); } diff --git a/org.caltoopia.frontend/src/org/caltoopia/codegen/IrXmlPrinter.java b/org.caltoopia.frontend/src/org/caltoopia/codegen/IrXmlPrinter.java index f07d1fd..032f2b2 100644 --- a/org.caltoopia.frontend/src/org/caltoopia/codegen/IrXmlPrinter.java +++ b/org.caltoopia.frontend/src/org/caltoopia/codegen/IrXmlPrinter.java @@ -120,6 +120,8 @@ public class IrXmlPrinter extends IrSwitch { Stream s; String folder; + boolean calsim = false; + Map inputPortMap = new HashMap(); Map outputPortMap = new HashMap(); @@ -129,6 +131,11 @@ public class IrXmlPrinter extends IrSwitch { public IrXmlPrinter(String folder) { this.folder = folder; } + + public IrXmlPrinter(String folder, boolean c) { + this.folder = folder; + this.calsim = c; + } public void run(Namespace ns) { caseNamespace(ns); @@ -205,9 +212,9 @@ public Stream caseNetwork(Network network) { PortInstance source = ((Point2PointConnection) c).getSource(); PortInstance target = ((Point2PointConnection) c).getTarget(); s.print(" Date: Thu, 21 Mar 2013 17:34:45 +0100 Subject: [PATCH 7/8] changes in analysis --- .../analysis/actor/GenericActorAnalysis.java | 9 + .../actor/ScenarioAwareActorAnalysis.java | 18 + .../analysis/network/ExplorationState.java | 49 +- .../network/GenericNetworkAnalysis.java | 13 + .../analysis/network/McdfNetworkAnalysis.java | 1 - .../network/NetworkClassifierOutput.java | 71 +- .../network/ScenarioAwareNetworkAnalysis.java | 418 +-------- .../ScenarioAwareStateExploration.java | 799 +++++++++++------- .../analysis/network/ScenarioGraph.java | 18 +- .../network/SneakyNetworkAnalyzer.java | 6 +- .../util/collections/CartesianProduct.java | 41 +- 11 files changed, 721 insertions(+), 722 deletions(-) diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java index a79f05b..c9e724a 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java @@ -96,6 +96,7 @@ protected class AnnotatedActionProperty{ protected List annotatedActionProperties = new ArrayList(); private Integer executionTime = null; private Integer stateSize = null; + private Integer id = new Integer(0); private boolean typeAnnotated = false; public GenericActorAnalysis(ActorInstance actor, ActorAnalysis delegate) { @@ -223,6 +224,14 @@ protected void setExecutionTime(Integer t){ } + public Integer getId(){ + return id; + } + + public void setId(Integer t){ + id = t; + } + public Integer getStateSize(){ return stateSize; } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ScenarioAwareActorAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ScenarioAwareActorAnalysis.java index 7584421..d412930 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ScenarioAwareActorAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/ScenarioAwareActorAnalysis.java @@ -229,6 +229,9 @@ public void print(Stream stream){ //flags if this actor is the source actor of the network private Boolean source = new Boolean(false); + //flags if this actor is going to be skip in extraction + private Boolean ignore = new Boolean(false); + /** * constructs a ScenarioAwareActorAnalysis object * It sets the actor instance type either from annotation or @@ -268,6 +271,13 @@ else if(type.equalsIgnoreCase("sa_detector")){ source = Boolean.TRUE; } + //check if this actor is a source actor + String ign = getActor().getAnnotationArgumentValue("ActorProperty","Ignore"); + if(ign!=null){ + if (ign.trim().equalsIgnoreCase("true")) + ignore = Boolean.TRUE; + } + //if actor is not type-annotated, classify the actor by analysis if(!isTypeAnnotated()){ if(isScenarioAwareStaticActor()) @@ -294,6 +304,14 @@ public boolean isSource(){ return source.booleanValue(); } + /** + * checks if this actor is to be ignored + * @return true if actor is ignored or false, otherwise. + */ + public boolean isActorIgnored(){ + return ignore.booleanValue(); + } + /** * gets the possible scenarios of the actor * @return diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ExplorationState.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ExplorationState.java index 0de430f..6d1fb8b 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ExplorationState.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ExplorationState.java @@ -47,16 +47,14 @@ import org.caltoopia.analysis.air.ActorInstance; import org.caltoopia.analysis.air.State; import org.caltoopia.analysis.air.Transition; -import org.caltoopia.analysis.network.ScenarioAwareNetworkAnalysis.ControlTokensPerAction; -import org.caltoopia.analysis.network.ScenarioAwareStateExploration.ControlTokenFSMState; +import org.caltoopia.analysis.network.ScenarioAwareStateExploration.FiringNode; import org.caltoopia.analysis.network.ScenarioFSM.ScenarioFSMState; import org.caltoopia.analysis.util.collections.CartesianProduct; import org.caltoopia.analysis.util.collections.Pair; -import org.caltoopia.ast2ir.Stream; /** * represents a state of the state-space exploration. A state is uniquely defined - * by a tuple of FSM states of detector actors ('detectorStatesTuple'). The tuple has exactly + * by a tuple of firings of detector actors ('detectorStatesTuple'). The tuple has exactly * one state from each detector actor. All other member variables such the set of * scenario graphs, the set of fsm states and the set of transition tuples can be * generated from the 'detectorStatesTuple'. @@ -68,7 +66,7 @@ public class ExplorationState{ //a tuple of FSM states of detector actors, exactly one fsm state per detector private Map detectorStatesTuple = new HashMap(); - public Set stateTuple = new HashSet(); + public Set configuration = new HashSet(); //the set of all possible transition combinations from 'detectorStatesTuple' private List>> transitionTuples = @@ -90,8 +88,8 @@ public ExplorationState(Map s, String n){ } //constructor - public ExplorationState(Set s, String n){ - stateTuple = s; + public ExplorationState(Set s, String n){ + configuration = s; name = n; } @@ -163,6 +161,35 @@ public void addScenarioFSMState(ScenarioFSMState state){ scenarioFsmStates.add(state); } + public String getConfigurationAsString(){ + String conf="[ "; + for(FiringNode f: configuration){ + conf+="(" + f.detectorActor.getInstanceName()+"," +f.firing.getName()+") "; + } + conf+="]"; + return conf; + } + + public static String getConfigurationAsString(Set confg){ + String conf="[ "; + for(FiringNode f: confg){ + conf+="(" + f.detectorActor.getInstanceName()+"," +f.firing.getName()+") "; + } + conf+="]"; + return conf; + } + + public static boolean areEqual(Set confg1, Set confg2){ + for(FiringNode f1: confg1){ + for(FiringNode f2: confg2){ + if(f1.detectorActor==f2.detectorActor){ + if(f1.firing!=f2.firing) + return false; + } + } + } + return true; + } /** * traverses all possible transition combinations at a given detectorStatesTuple * @param dStates @@ -217,7 +244,7 @@ public static ScenarioGraph findScenarioGraph(ScenarioGraph scenarioGraph, //check if the control tokens are the same if(flag){ if(exists){ - if(ScenarioAwareNetworkAnalysis.AreControlTokensEqual( + if(ControlTokensPerAction.AreControlTokensEqual( sg.getControlTokens(), scenarioGraph.getControlTokens())){ return sg; } @@ -312,11 +339,11 @@ public static ExplorationState findVistedState(Set exploration * @return the ExplorationState of a given detectorStatesTuple if it exists or null otherwise. */ public static ExplorationState findVistedState(List explorationStates, - Set detectorStatesTuple){ + Set detectorStatesTuple){ for(ExplorationState explorationState: explorationStates){ - if(explorationState.stateTuple.size()==detectorStatesTuple.size()){ + if(explorationState.configuration.size()==detectorStatesTuple.size()){ boolean found = true; - for(ControlTokenFSMState c: explorationState.stateTuple){ + for(FiringNode c: explorationState.configuration){ if(!detectorStatesTuple.contains(c)){ found = false; break; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/GenericNetworkAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/GenericNetworkAnalysis.java index 5577f50..f5b17a2 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/GenericNetworkAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/GenericNetworkAnalysis.java @@ -45,6 +45,7 @@ import org.caltoopia.analysis.air.Action; import org.caltoopia.analysis.air.ActorInstance; import org.caltoopia.analysis.air.Connection; +import org.caltoopia.analysis.actor.ActionAnalysis; import org.caltoopia.analysis.actor.PortAnalysis; import org.caltoopia.analysis.actor.ConnectionAnalysis; import org.caltoopia.analysis.actor.GenericActorAnalysis; @@ -244,4 +245,16 @@ else if(actor.hasImplementation()) } return executionTime; } + + public String getExecutionTimeAsString(ActorInstance actor, Action action){ + GenericActorAnalysis gaa = getGenericActorAnalysis(actor); + String execTime = gaa.getExecutionTime().toString(); + if(action!=null){ + ActionAnalysis aa = gaa.getActionAnalysis(action); + if(aa!=null) + return aa.getExecutionTime().toString(); + + } + return execTime; + } } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/McdfNetworkAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/McdfNetworkAnalysis.java index 6167241..b02aae8 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/McdfNetworkAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/McdfNetworkAnalysis.java @@ -42,7 +42,6 @@ import org.caltoopia.analysis.actor.ActorAnalyzer; import org.caltoopia.analysis.actor.ConnectionAnalysis; -import org.caltoopia.analysis.actor.GenericActorAnalysis; import org.caltoopia.analysis.actor.PortAnalysis; import org.caltoopia.analysis.actor.SneakyActorAnalyzer; import org.caltoopia.analysis.actor.ConnectionAnalysis.ConnectionType; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java index b4cf103..aca192f 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java @@ -41,10 +41,8 @@ import java.util.List; import java.util.ArrayList; -import org.caltoopia.analysis.actor.McdfActorAnalysis; import org.caltoopia.analysis.actor.ScenarioAwareActorAnalysis; import org.caltoopia.analysis.actor.McdfActorAnalysis.McdfActorInstanceType; -import org.caltoopia.analysis.actor.GenericActorAnalysis.ActorInstanceType; import org.caltoopia.analysis.network.GenericNetworkAnalysis; import org.caltoopia.analysis.network.McdfNetworkAnalysis; import org.caltoopia.analysis.network.ScenarioFSM.ScenarioFSMState; @@ -555,14 +553,18 @@ public void printSaXML(Network network, ScenarioAwareNetworkAnalysis analysis) { XMLNode actorNode = new XMLNode("actor"); actorNode.addAttribute("name", actor.getInstanceName()); String type=""; - if(scenario.getTransition()==null){ + + if(analysis.getScenarioAwareActorAnalysis(actor).getScenarioAwareActorInstanceType()== + ScenarioAwareActorAnalysis.ScenarioAwareActorInstanceType.SA_DETECTOR) + { + type = "detector"; + } + else if(scenario.getTransition()==null){ if(analysis.getScenarioAwareActorAnalysis(actor).getScenarioAwareActorInstanceType()== ScenarioAwareActorAnalysis.ScenarioAwareActorInstanceType.SA_STATIC){ type = "static"; }else if(analysis.getScenarioAwareActorAnalysis(actor).getScenarioAwareActorInstanceType()== - ScenarioAwareActorAnalysis.ScenarioAwareActorInstanceType.SA_DYNAMIC || - analysis.getScenarioAwareActorAnalysis(actor).getScenarioAwareActorInstanceType()== - ScenarioAwareActorAnalysis.ScenarioAwareActorInstanceType.SA_DETECTOR) + ScenarioAwareActorAnalysis.ScenarioAwareActorInstanceType.SA_DYNAMIC) { if(analysis.getScenarioAwareActorAnalysis(actor).isTypeAnnotated()){ type = "annotated_dynamic"; @@ -572,6 +574,7 @@ public void printSaXML(Network network, ScenarioAwareNetworkAnalysis analysis) { else type = scenario.getTransition().getAction().getName(); actorNode.addAttribute("type", type); + actorNode.addAttribute("index", analysis.getGenericActorAnalysis(actor).getId().toString()); for(PortInstance p: actor.getPorts()){ if(scenario.getPortRates().containsKey(p)){ if(scenario.getPortRate(p).intValue() > 0){ @@ -677,16 +680,6 @@ public void printSaXML(Network network, ScenarioAwareNetworkAnalysis analysis) { fsmsadfDefaultPropertiesNode.addXMLNode(actorPropertiesNode); } - //add scenarios - XMLNode scenariosNode = new XMLNode("scenarios"); - fsmsadfPropertiesNode.addXMLNode(scenariosNode); - for(ScenarioGraph scenarioGraph: analysis.getScenarioFSM().getScenarioGraphs()){ - XMLNode scenarioNode = new XMLNode("scenario"); - scenarioNode.addAttribute("name", scenarioGraph.getName()); - scenarioNode.addAttribute("graph", scenarioGraph.getName()); - scenariosNode.addXMLNode(scenarioNode); - } - //add properties of each connection for(Connection c: network.getConnections()){ if(!c.getProducerPort().getActor().hasImplementation() || @@ -701,6 +694,52 @@ public void printSaXML(Network network, ScenarioAwareNetworkAnalysis analysis) { fsmsadfDefaultPropertiesNode.addXMLNode(connectionPropertyNode); } + //add scenarios + XMLNode scenariosNode = new XMLNode("scenarios"); + fsmsadfPropertiesNode.addXMLNode(scenariosNode); + for(ScenarioGraph scenarioGraph: analysis.getScenarioFSM().getScenarioGraphs()){ + XMLNode scenarioNode = new XMLNode("scenario"); + scenarioNode.addAttribute("name", scenarioGraph.getName()); + scenarioNode.addAttribute("graph", scenarioGraph.getName()); + scenariosNode.addXMLNode(scenarioNode); + + //add each actor + for(Map.Entry a: + scenarioGraph.getActors().entrySet()){ + ActorInstance actor = a.getKey(); + ScenarioAwareActorAnalysis.Scenario scenario = a.getValue(); + + if(!actor.hasImplementation()) + continue; + XMLNode actorPropertiesNode = new XMLNode("actorProperties"); + actorPropertiesNode.addAttribute("actor", actor.getInstanceName()); + //add processor + XMLNode processorNode = new XMLNode("processor"); + processorNode.addAttribute("type", "arm"); + processorNode.addAttribute("default", "true"); + + //add execution time + XMLNode executionTimeNode = new XMLNode("executionTime"); + + Action action=null; + if(scenario.getTransition()!=null) + action = scenario.getTransition().getAction(); + executionTimeNode.addAttribute("time", analysis.getExecutionTimeAsString(actor, action)); + processorNode.addXMLNode(executionTimeNode); + + //add memory + XMLNode memoryNode = new XMLNode("memory"); + XMLNode stateSizeNode = new XMLNode("stateSize"); + stateSizeNode.addAttribute("max", analysis.getGenericActorAnalysis(actor).getStateSize().toString()); + memoryNode.addXMLNode(stateSizeNode); + processorNode.addXMLNode(memoryNode); + + actorPropertiesNode.addXMLNode(processorNode); + scenarioNode.addXMLNode(actorPropertiesNode); + } + } + + //add timing constraints XMLNode graphPropertiesNode = new XMLNode("graphProperties"); XMLNode timingConstraintsNode = new XMLNode("timeConstraints"); diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java index bbdd336..05bbae1 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java @@ -36,7 +36,6 @@ package org.caltoopia.analysis.network; -import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -52,161 +51,23 @@ import org.caltoopia.analysis.actor.ScenarioAwareActorAnalysis.ScenarioAwareActorInstanceType; import org.caltoopia.analysis.actor.PortAnalysis.PortType; import org.caltoopia.analysis.actor.ScenarioAwareActorAnalysis; -import org.caltoopia.analysis.air.Action; import org.caltoopia.analysis.air.ActorImplementation; import org.caltoopia.analysis.air.ActorInstance; import org.caltoopia.analysis.air.Connection; import org.caltoopia.analysis.air.InputLookAhead; import org.caltoopia.analysis.air.Network; import org.caltoopia.analysis.air.PortInstance; -import org.caltoopia.analysis.air.Transition; import org.caltoopia.analysis.iradapter.VanillaInputLookAhead; -import org.caltoopia.analysis.util.collections.CartesianProduct; -import org.caltoopia.analysis.util.collections.Pair; +import org.caltoopia.analysis.network.ScenarioAwareStateExploration.FiringNode; import org.caltoopia.analysis.util.collections.UnionOfDisjointIntervals; -import org.caltoopia.ast2ir.Stream; public class ScenarioAwareNetworkAnalysis extends GenericNetworkAnalysis { - /** - * represents a control token of produced by a detector actor. - */ - public class ControlToken{ - //the detector actor - private ActorInstance detectorActor; - - //the token name as given by annotation in the CAL actor - private String tokenName; - - //the list of control ports that produce this control token - private List controlPorts = new ArrayList(); - - //constructor - public ControlToken(ActorInstance a, String t){ - detectorActor = a; - tokenName = t; - } - - public void setDetectorActor(ActorInstance a){ - detectorActor = a; - } - - public void setName(String name){ - tokenName = name; - } - - public void setControlPorts( List p){ - controlPorts = p; - } - - public ActorInstance getDetectorActor(){ - return detectorActor; - } - - public String getName(){ - return tokenName; - } - - public List getControlPorts(){ - return controlPorts; - } - - public void addControlPort( PortInstance p){ - controlPorts.add(p); - } - - //print to a stream - void print(Stream stream){ - stream.println("DetectorActor: "+detectorActor.getInstanceName()); - stream.println("\tTokenName: "+tokenName); - stream.print("\tContorlPorts: "); - for(PortInstance p: controlPorts){ - stream.print(p.getName()+" "); - } - stream.println(); - } - }; - - /** - * represents the control tokens produced by an action of a detector actor. - * A control token is identified by a name given by annotation in the CAL action - */ - public class ControlTokensPerAction{ - //the detector actor - private ActorInstance detectorActor = null; - - //the action - private Action detectorAction; - - //the list of control tokens and their corresponding values - private Map controlTokens= new HashMap(); - - public ControlTokensPerAction(ActorInstance actor, Action action){ - detectorActor = actor; - detectorAction = action; - }; - - public void setDetectorActor(ActorInstance a){ - detectorActor = a; - } - - public void setDetectorAction(Action a){ - detectorAction = a; - } - - public void setControlTokens(Map c){ - controlTokens = c; - } - - public ActorInstance getDetectorActor(){ - return detectorActor; - } - - public Action getDetectorAction(){ - return detectorAction; - } - - public Map getControlTokens(){ - return controlTokens; - } - - /** - * tests if a given control token is the same as - * this control token. - * @param c - * @return - */ - public boolean equals(ControlTokensPerAction c){ - if(this.detectorActor!=c.detectorActor) - return false; - - if(this.detectorAction!=c.detectorAction) - return false; - - if(this.controlTokens.size()!= c.controlTokens.size()) - return false; - - for(Map.Entry e: controlTokens.entrySet()){ - if(c.getControlTokens().get(e.getKey())!=e.getValue()) - return false; - } - return true; - } - - public void print(PrintStream out){ - out.println("\t"+detectorActor.getInstanceName()+"\t"+detectorAction.getName()); - for(Map.Entry e: controlTokens.entrySet()){ - out.println("\t\t"+e.getKey()+"\t"+e.getValue().longValue()); - } - } - }; - - //scenario-aware actor analysis objects per actor - private Map mScenarioAwareActorMap= + private Map mScenarioAwareActorMap = new HashMap(); - ScenarioAwareStateExploration stateSpaceExploration = null; + ScenarioAwareStateExploration confSpaceExploration = null; //scenario FSM private ScenarioFSM fsm = new ScenarioFSM(); @@ -216,7 +77,7 @@ public void print(PrintStream out){ //constructor public ScenarioAwareNetworkAnalysis(Network n, NetworkAnalysis na, String actionSchedulePAth) { - //Generic network analyis constructor + //Generic network analysis constructor super(n,na); //Instantiate scenario-aware actor analysis objects @@ -276,9 +137,34 @@ public ScenarioAwareNetworkAnalysis(Network n, NetworkAnalysis na, String action setResourcePath(actionSchedulePAth); // state-space exploration object to construct the FSM - stateSpaceExploration = new ScenarioAwareStateExploration(this); + confSpaceExploration = new ScenarioAwareStateExploration(this); + + // construct FSM + confSpaceExploration.constructCompleteFSM(); + - fsm = stateSpaceExploration.constructScenarioFSM2(); + //TODO: Debug print - remove later + List states = confSpaceExploration.constructConfigurationSpace(); + for(ExplorationState s: states){ + //s.print(System.out); + Set> ctt = confSpaceExploration.getTuplesOfControlTokens(s.configuration); + for(FiringNode firing: s.configuration){ + System.out.print(firing.firing.getName()+" "); + } + System.out.println(); + System.out.print(ctt.size()+" tuples and "); + System.out.println(s.getScenarioGraphs().size()+" scenario graphs "); + + //check if every state is an + } + System.out.println(states.size()+" configurations found."); + + fsm = confSpaceExploration.getScenarioFSM(); + System.out.println(fsm.getScenarioFSMStates().size() + " FSM States, " + + fsm.getScenarioFSMTransitions().size() + " FSM Transtions, " + + fsm.getScenarioGraphs().size() + " scenario graphs," + + confSpaceExploration.getNumberOfEliminatedScenarioGraphs() + " eliminated graphs"); + // End of debug print } /** @@ -453,7 +339,7 @@ public void constructScenarioThroughAnnotations(ActorInstance actor){ throw new NullPointerException(msg); } InputLookAhead ila = new VanillaInputLookAhead(port,0); - UnionOfDisjointIntervals it = parseIntervals(scenarioSpecPair[1]); + UnionOfDisjointIntervals it = ControlToken.parseIntervals(scenarioSpecPair[1]); if(it==null){ msg = "Scenario tag error. Parsing interval '"; msg += scenarioSpecPair[1]+"'"; @@ -495,73 +381,21 @@ else if (prop[0].trim().equalsIgnoreCase("WCET")){ } } - /** - * computes the set all possible tuples of ControlTokenPerAction that are possible at a - * given transitionTuple. A tuple of ControlTokenPerAction has exactly one control token - * per detector actor. - * @param transitionTuple - * @return the set of all possible control token combinations - */ - public Set> getControlTokensPerActions( - Set> transitionTuple){ - List> sTokens = new ArrayList>(); - for(Pair tPair: transitionTuple){ - ActorInstance detector = tPair.getFirst(); - Action detectorAction = tPair.getSecond().getAction(); - Set sta = null; - sta = getControlTokensOfAction(detector, detectorAction); - if(sta!=null) - sTokens.add(sta); - } - - return CartesianProduct.cartesianProduct(sTokens); - } - - /** - * parses a 'string' and generates a union of disjoint intervals. - * 'string' must consist of sub-strings separated by a slash(/): - * string = sub-string1/sub-string2/sub-string3 - * A sub-string can only be either a numeric letter (e.g. 2) or - * hyphen separated two numeric letters (e.g. 4-7 ). - * Example: The string 2/4-7/13/8-9 produces the union of intervals - * given by {[2,2],[4-9],[13-13]} - * @param string - * @return UnionOfDisjointIntervals if the input string is valid. - * It returns null otherwise. - */ - public UnionOfDisjointIntervals parseIntervals(String string){ - UnionOfDisjointIntervals intervals = new UnionOfDisjointIntervals(); - for(String interval: string.split("/")){ - String s[] = interval.split("-"); - - if(s.length==1 && Long.parseLong(s[0].trim()) >= 0){ - intervals.add(Long.parseLong(s[0].trim()), Long.parseLong(s[0].trim())); - } - else if(s.length==2 && Long.parseLong(s[0].trim()) >= 0 - && Long.parseLong(s[1].trim()) >= 0){ - intervals.add(Long.parseLong(s[0].trim()), Long.parseLong(s[1].trim())); - } - else - return null; - } - return intervals; - } /** - * constructs a scenario graph from a given set of control tokens. - * @param source - * @param transitionTuple - * @param sTokens - * @return + * extracts a scenario given a tupleOfControlTokens + * @param source: source actors + * @param sTokens: tupleOfControlTokens + * @return ScenarioGraph: a SDF graph of a scenario */ public ScenarioGraph constructScenarioGraph(List sources, - Set> transitionTuple, - Set sTokens){ + Set configuration, + Set sTokens){ if(sTokens.isEmpty()){ return null; } - if(!stateSpaceExploration.controlTokensExist(transitionTuple, sTokens)){ + if(!confSpaceExploration.controlTokensExist(configuration, sTokens)){ return null; } @@ -575,11 +409,12 @@ public ScenarioGraph constructScenarioGraph(List sources, List actorsQueue = new ArrayList(); actorsQueue.addAll(sources); while(!actorsQueue.isEmpty()){ - ActorInstance actor = actorsQueue.remove(0); + ActorInstance actor = actorsQueue.remove(0); if(!visitedActors.contains(actor)){ visitedActors.add(actor); ScenarioAwareActorAnalysis.Scenario sp = null; - sp = stateSpaceExploration.getScenario(actor, sTokens); + if(!getScenarioAwareActorAnalysis(actor).isActorIgnored()) + sp = confSpaceExploration.getScenario(actor, sTokens); if(sp != null){ sg.getActors().put(actor, sp); for(PortInstance p: actor.getOutputPorts()){ @@ -599,7 +434,7 @@ public ScenarioGraph constructScenarioGraph(List sources, if(sg.getActors().size() == 0) return null; - sg.setControlTokens(filterControlTokens(sTokens,sg)); + sg.setControlTokens(ControlTokensPerAction.filterControlTokens(sTokens,sg)); //add each connection for(Connection c: this.getNetwork().getConnections()){ @@ -627,172 +462,5 @@ public ScenarioGraph constructScenarioGraph(List sources, } return sg; } - - /** - * constructs a scenario graph from a given set of control tokens. - * @param source - * @param transitionTuple - * @param sTokens - * @return - */ - public ScenarioGraph constructScenarioGraph(List sources, Set sTokens){ - if(sTokens.isEmpty()){ - return null; - } - -// if(!stateSpaceExploration.controlTokensExist(transitionTuple, sTokens)){ -// return null; -// } - - String name = null; - for(ControlTokensPerAction sta: sTokens){ - name+= sta.getControlTokens().toString(); - } - ScenarioGraph sg = new ScenarioGraph(name); - - List visitedActors = new ArrayList(); - List actorsQueue = new ArrayList(); - actorsQueue.addAll(sources); - while(!actorsQueue.isEmpty()){ - ActorInstance actor = actorsQueue.remove(0); - if(!visitedActors.contains(actor)){ - visitedActors.add(actor); - ScenarioAwareActorAnalysis.Scenario sp = null; - sp = stateSpaceExploration.getScenario(actor, sTokens); - if(sp != null){ - sg.getActors().put(actor, sp); - for(PortInstance p: actor.getOutputPorts()){ - if(sp.getPortRate(p) > 0){ - for(Connection c: this.getNetwork().getIncidentConnections(p)){ - ActorInstance a = c.getConsumerPort().getActor(); - if(!actorsQueue.contains(a)){ - actorsQueue.add(a); - } - } - } - } - } - } - } - - if(sg.getActors().size() == 0) - return null; - - sg.setControlTokens(filterControlTokens(sTokens,sg)); - return sg; - } - /** - * removes control tokens produced by actors that do not - * exist in a given scenario graph. - * @param acTokens - * @param sg - * @return a set of control tokens - */ - public static Set filterControlTokens( - Set acTokens, ScenarioGraph sg){ - Set filteredSet = null; - filteredSet = new HashSet(acTokens); - for(ControlTokensPerAction ast: acTokens){ - ActorInstance actor = ast.getDetectorActor(); - if(!sg.getActors().containsKey(actor)) - filteredSet.add(ast); - } - return filteredSet; - } - - /** - * Each detector action produces a set of control tokens. This information - * is obtained from the action annotation. - * @param detector - * @param action - * @return a set of control tokens produced by the detector action. It returns - * null if the detector action is not annotated. - */ - public Set getControlTokensOfAction(ActorInstance detector, Action action){ - String msg = ""; - try{ - //if it has ControlToken annotated types, parse - if(action.hasAnnotation("ActionProperty")){ - if (action.getAnnotationArgumentValue("ActionProperty", "ScenarioTokens")!=null){ - Set acToknes = new HashSet(); - String s = action.getAnnotationArgumentValue("ActionProperty", "ScenarioTokens"); - List>> tokenRanges = - new ArrayList>>(); - for(String t: s.split(";")){ - String st[] = t.split(":"); - UnionOfDisjointIntervals intervals = new UnionOfDisjointIntervals(); - for(String interval: st[1].split("/")){ - String str[] = interval.split("-"); - - if(str.length==1 && Long.parseLong(str[0].trim()) >= 0){ - intervals.add(Long.parseLong(str[0].trim()), Long.parseLong(str[0].trim())); - } - else if(str.length==2 && Long.parseLong(str[0].trim()) >= 0 - && Long.parseLong(str[1].trim()) >= 0){ - intervals.add(Long.parseLong(str[0].trim()), Long.parseLong(str[1].trim())); - } - else{ - msg = "Scenario tag error. "; - msg += "Syntax error for scenario interval '"; - msg += interval + "'."; - throw new NullPointerException( msg ); - } - } - Set> tokenRange = new - HashSet>(); - for(Long scenario: intervals.asSet()){ - tokenRange.add(new Pair(st[0].trim(), scenario)); - } - tokenRanges.add(tokenRange); - } - - - for(Set> str: CartesianProduct.cartesianProduct(tokenRanges)){ - ControlTokensPerAction sta = new ControlTokensPerAction(detector, action); - for(Pair e: str){ - if(sta.getControlTokens().containsKey(e.getFirst())){ - msg = "getScenarioOfDetectorAction: "; - msg += "duplicate entry for a scenario token detected."; - throw new Exception( msg ); - } - sta.getControlTokens().put(e.getFirst(), e.getSecond()); - } - acToknes.add(sta); - } - return acToknes; - } - } - }catch(Exception e){ - System.out.println(e.getMessage()); - System.exit(1); - } - return null; - } - - /** - * checks if two sets of control token are the same. - * @param f : first set of control tokens - * @param s : second set of control tokens - * @return true if the two sets are the same - */ - public static boolean AreControlTokensEqual(Set f, - Set s){ - if(f.size() != s.size()) - return false; - - for(ControlTokensPerAction cf: f){ - boolean found = false; - for(ControlTokensPerAction cs: s){ - if(cf.equals(cs)){ - found = true; - break; - } - } - if(!found) - return false; - } - - return true; - } } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java index ba83008..9d40180 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java @@ -57,20 +57,16 @@ import org.caltoopia.analysis.air.InputLookAhead; import org.caltoopia.analysis.air.PortInstance; import org.caltoopia.analysis.air.PortSignature; -import org.caltoopia.analysis.air.State; import org.caltoopia.analysis.air.Transition; -import org.caltoopia.analysis.iradapter.CaltoopiaNetwork; import org.caltoopia.analysis.network.ScenarioAwareNetworkAnalysis; -import org.caltoopia.analysis.network.ScenarioAwareNetworkAnalysis.ControlToken; -import org.caltoopia.analysis.network.ScenarioAwareNetworkAnalysis.ControlTokensPerAction; +import org.caltoopia.analysis.network.ControlToken; +import org.caltoopia.analysis.network.ControlTokensPerAction; import org.caltoopia.analysis.network.ScenarioFSM.ScenarioFSMState; import org.caltoopia.analysis.network.ScenarioFSM.ScenarioFSMTransition; import org.caltoopia.analysis.util.collections.CartesianProduct; -import org.caltoopia.analysis.util.collections.Interval; import org.caltoopia.analysis.util.collections.Pair; import org.caltoopia.analysis.util.collections.UnionOfDisjointIntervals; import org.caltoopia.ast2ir.Stream; -import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; @@ -79,24 +75,27 @@ public class ScenarioAwareStateExploration { - public class ControlTokenFSMState{ + public class FiringNode{ public String name; public ActorInstance detectorActor = null; - public Action action = null; - public Map controlTokens = new HashMap(); - public Set transitions = new HashSet(); - public ControlTokenFSMState(String n, ActorInstance d){ + public Action firing = null; + public Map controlTokens = + new HashMap(); + public Set outGoingTransitions = new HashSet(); + public FiringNode(String n, ActorInstance d){ name = n; detectorActor = d; } public void print(PrintStream stream){ stream.println("\t\tState: "+name); - for(Map.Entry e: controlTokens.entrySet()){ - stream.println("\t\t\tControlToken: "+e.getKey()+", Value: "+e.getValue()); + for(Map.Entry e: + controlTokens.entrySet()){ + stream.println("\t\t\tControlToken: "+ + e.getKey()+", Value: "+e.getValue().toString()); } - for(String s: transitions){ + for(String s: outGoingTransitions){ stream.println("\t\t\tTransits to: "+s); } } @@ -105,31 +104,31 @@ public void print(PrintStream stream){ /** * control token transition */ - public class DetectorFSM{ + public class FiringSchedule{ public ActorInstance detectorActor; - public String initialState; - public Set states = new HashSet(); + public String initialFiring; + public Set firings = new HashSet(); - public DetectorFSM(ActorInstance i){ + public FiringSchedule(ActorInstance i){ detectorActor = i; } - public ControlTokenFSMState getState(String n){ - for(ControlTokenFSMState s: states){ + public FiringNode getFiring(String n){ + for(FiringNode s: firings){ if(s.name.equals(n)) return s; } return null; } - public ControlTokenFSMState getInitialState(){ - return getState(initialState); + public FiringNode getInitialFiring(){ + return getFiring(initialFiring); } public void print(PrintStream stream){ stream.println("Detector: "+detectorActor.getInstanceName()); - stream.println("\tIntialState: "+initialState); - for(ControlTokenFSMState s: states){ + stream.println("\tIntialFiring: "+initialFiring); + for(FiringNode s: firings){ s.print(stream); } } @@ -178,7 +177,7 @@ public boolean equals(ControlTokenTransition t){ * number of eliminated scenario graph due to duplication * or non-existence */ - private int eliminatedScenarioGraphs = 0; + private int numberOfEliminatedScenarioGraphs = 0; //the scenario-aware network analysis object private ScenarioAwareNetworkAnalysis analysis = null; @@ -187,7 +186,7 @@ public boolean equals(ControlTokenTransition t){ private Set controlTokens = new HashSet(); //detector fsm - private List detectorFSMs = new ArrayList(); + private List firingSchedules = new ArrayList(); //non-existing control token transitions private List nonExistingTokenTransitions = @@ -201,7 +200,6 @@ public ScenarioAwareStateExploration(ScenarioAwareNetworkAnalysis a){ analysis = a; populateControlTokens(); populateDetectorFSMs(); - printDetectorFSMs(System.out); } public ScenarioAwareNetworkAnalysis getAnalysis(){ @@ -212,6 +210,14 @@ public void setAnalysis(ScenarioAwareNetworkAnalysis a){ analysis = a; } + public ScenarioFSM getScenarioFSM(){ + return scenarioFSM; + } + + public int getNumberOfEliminatedScenarioGraphs(){ + return numberOfEliminatedScenarioGraphs; + } + //print network control tokens public void printNetworkControlTokens(Stream stream){ for(ControlToken s : controlTokens){ @@ -221,7 +227,7 @@ public void printNetworkControlTokens(Stream stream){ //print network control tokens public void printDetectorFSMs(PrintStream stream){ - for(DetectorFSM d : detectorFSMs){ + for(FiringSchedule d : firingSchedules){ d.print(stream); } } @@ -309,7 +315,7 @@ public boolean isIntervalInControlTokensPerAction(PortInstance port, } } } - } + } return false; } @@ -319,10 +325,10 @@ public boolean isIntervalInControlTokensPerAction(PortInstance port, * @param ctActions: a combination of control tokens * @return true if the combination exists or false otherwise */ - public boolean controlTokensExist(Set> tr, + public boolean controlTokensExist(Set configuration, Set ctActions){ - for(Pair transition: tr){ - Action action = transition.getSecond().getAction(); + for(FiringNode firingNode: configuration){ + Action action = firingNode.firing; if(action.hasGuard()){ Guard guard = action.getGuard(); Map modeSet @@ -334,7 +340,7 @@ public boolean controlTokensExist(Set> tr, PortInstance detectorPort = lookAhead.getPort(); if(!isIntervalInActionScenarioTokens(detectorPort, modeSet.get(lookAhead), ctActions)){ - eliminatedScenarioGraphs++; + numberOfEliminatedScenarioGraphs++; return false; } } @@ -343,34 +349,152 @@ public boolean controlTokensExist(Set> tr, return true; } + /** - * checks if a combination of control tokens exist - * @param tr: a combination of fsm transitions - * @param ctActions: a combination of control tokens - * @return true if the combination exists or false otherwise + * returns the all possible tuples of control tokens of a configuration + * @param configuration: a tuple of firings */ - public boolean stateTupleExist(Set stateTuple){ - Set ctActions = new HashSet(); - for(ControlTokenFSMState cs: stateTuple){ - ControlTokensPerAction t = analysis.new ControlTokensPerAction(cs.detectorActor, cs.action); - t.setControlTokens(cs.controlTokens); - ctActions.add(t); + public Set> getTuplesOfControlTokens(Set configuration){ + String msg = ""; + //a list of tuples of control tokens + List> listOfControlTokens = new ArrayList>(); + Set> tuplesOfConfiguration = new HashSet>(); + try{ + for(FiringNode firingNode: configuration){ + //set of tuples of control tokens of one firing + Set controlTokensOfFiring = new HashSet(); + + Map controlTokens = firingNode.controlTokens; + List>> tokenRanges = new ArrayList>>(); + for(Map.Entry e: controlTokens.entrySet()){ + Set> tokenRange = new HashSet>(); + for(Long scenario: e.getValue().asSet()){ + tokenRange.add(new Pair(e.getKey().trim(), scenario)); + } + tokenRanges.add(tokenRange); + } + + for(Set> str: CartesianProduct.cartesianProduct(tokenRanges)){ + ControlTokensPerAction sta = new ControlTokensPerAction(firingNode.detectorActor, firingNode.firing); + for(Pair e: str){ + if(sta.getControlTokens().containsKey(e.getFirst())){ + msg = "nonExistingConfiguration: "; + msg += "duplicate entry of a control token in ControlTokensPerAction detected."; + throw new Exception( msg ); + } + sta.addControlToken(e.getFirst(),e.getSecond()); + } + controlTokensOfFiring.add(sta); + } + if(controlTokensOfFiring.size()>0) + listOfControlTokens.add(controlTokensOfFiring); + } + tuplesOfConfiguration = CartesianProduct.cartesianProduct(listOfControlTokens); + } + catch(Exception e){ + System.out.println(e.getMessage()); + System.exit(1); } - for(ControlTokenFSMState state: stateTuple){ - Action action = state.action; + return tuplesOfConfiguration; + } + + /** + * checks if a configuration exists + * @param configuration: a tuple of firings + * @return true if the configuration exists or false otherwise + */ + public boolean isDetectorFiringEnabled(FiringNode firingNode, Set configuration){ + Set> tuplesOfControlTokens = getTuplesOfControlTokens(configuration); + Action action = firingNode.firing; + if(action.hasGuard()){ + Guard guard = action.getGuard(); + Map modeSet + = guard.matchScenarioAwareGuard(); + // If an action does not have a scenario-aware guard, skip it. + // The rationale is the following. If a firing does not have, + // a scenario-aware guard, then it is not driven by another detector actor. + // Thus, the firing is independent and for the sake of conservativeness, + // it is assumed 'active'. If the firing has a scenario-aware guard, then + // it will be checked later if it is driven by a detector actor. + if (modeSet == null){ + return true; + } + + //Otherwise, each input look-ahead of the guard must be satisfied + for(InputLookAhead lookAhead: modeSet.keySet()){ + PortInstance detectorPort = lookAhead.getPort(); + PortInstance producerPort = null; + ActorInstance act = detectorPort.getActor(); + if(analysis.getScenarioAwareActorAnalysis(act).isTypeAnnotated()) + producerPort = detectorPort; + else{ + //port is input and it has only one incident connection + Connection c = analysis.getNetwork().getIncidentConnections(detectorPort).iterator().next(); + producerPort = c.getProducerPort(); + } + boolean exists = false; + + for(Set ctTuple : tuplesOfControlTokens){ + //Check if one of the ctActions satisfy the port's requirement + for(ControlTokensPerAction ctAction: ctTuple){ + if(ctAction.getDetectorActor()!=producerPort.getActor()) + continue; + + Action detectorAction = ctAction.getDetectorAction(); + PortSignature ps = detectorAction.getPortSignature(); + if(ps.getPortRate(producerPort) > 0) + exists = true; + break; + } + + if(exists) + break; + } + if(!exists) + return false; + } + } + + return true; + } + + /** + * checks if a configuration exists + * @param configuration: a tuple of firings + * @return true if the configuration exists or false otherwise + */ + public boolean existentConfiguration(Set configuration){ + Set> tuplesOfControlTokens = getTuplesOfControlTokens(configuration); + for(FiringNode firingNode: configuration){ + Action action = firingNode.firing; if(action.hasGuard()){ Guard guard = action.getGuard(); Map modeSet = guard.matchScenarioAwareGuard(); - if (modeSet == null) - continue; - //each input look-ahead must be satisfied + // If an action does not have a scenario-aware guard, skip it. + // The rationale is the following. If a firing does not have, + // a scenario-aware guard, then it is not driven by another detector actor. + // Thus, the firing is independent and for the sake of conservativeness, + // it is assumed 'active'. If the firing has a scenario-aware guard, then + // it will be checked later if it is driven by a detector actor. + if (modeSet == null){ + continue; + } + + //Otherwise, each input look-ahead of the guard must be satisfied for(InputLookAhead lookAhead: modeSet.keySet()){ PortInstance detectorPort = lookAhead.getPort(); - if(!isIntervalInActionScenarioTokens(detectorPort, - modeSet.get(lookAhead), ctActions)){ - eliminatedScenarioGraphs++; + boolean exists = false; + //at least one of the tupelOfControlTokens should exist + for(Set ctTuple : tuplesOfControlTokens){ + if(isIntervalInActionScenarioTokens(detectorPort, + modeSet.get(lookAhead), ctTuple)){ + exists = true; + break; + } + } + if(!exists){ return false; } } @@ -388,12 +512,12 @@ public boolean stateTupleExist(Set stateTuple){ * @return a set of ScenarioGraph, possibly empty. */ public Set constructScenarioGraphs(List sources, - Set> tr, + Set configuration, Set> ctActions){ Set scenarioGraphs = new HashSet(); for(Set st: ctActions){ - ScenarioGraph g = analysis.constructScenarioGraph(sources, tr, st); + ScenarioGraph g = analysis.constructScenarioGraph(sources, configuration, st); if(g!=null){ //check if it is not duplicate boolean exists = false; @@ -498,135 +622,7 @@ public ScenarioAwareActorAnalysis.Scenario getScenario(ActorInstance actor, return null; } - /** - * constructs the FSM using a state-space exploration. A state of the - * exploration (ExplorationState) is a map that assigns each detector - * one of its 'CAL FSM state'. Exploration terminates when all possible - * ExplorationStates are found. Every ExplorationState may have multiple - * combinations of transitions possible. Each combination of transitions - * corresponds to a unique combination of actions that comprises one-action - * per detector. Each combination of actions may further define multiple - * combinations of control tokens. Each combination of control tokens - * defines exactly one scenario graph of the network. - * @return - */ - public ScenarioFSM constructScenarioFSM(){ - //the set of visited states - Set visitedStates = new HashSet(); - - //the set of detector actors - Set dActors = analysis.getScenarioAwareDetectorActors(); - - //a queue of a combination of transitions to be analyzed - List>> ttQueue = null; - ttQueue = new ArrayList>>(); - - try{ - List sources = analysis.getSourceActors(); - - if(sources.size()==0){ - String msg = "constructScenarioFSM: no source actor found."; - msg += "Use annotation: @ActorProperty(Source=\"true\")"; - throw new NullPointerException(msg); - } - - //initialExplorationState = the set of the initial states of detector actors - Map ieState = new HashMap(); - for(ActorInstance d: dActors){ - ieState.put(d,d.getImplementation().getSchedule().getInitialState()); - } - ExplorationState state = new ExplorationState(ieState, "InitialState"); - - //Find all possible transitions of the initialStateSpaceState - for(Set> s: - ExplorationState.traverseTransitions(ieState)){ - ttQueue.add(s); - state.addTransitionTuple(s); - } - visitedStates.add(state); - state.printActorStateTuple(System.out); - - while(!ttQueue.isEmpty()){ - //take a combination of transitions from the queue - Set> tt = ttQueue.remove(0); - - //find the exploration state of the combination of transitions - ExplorationState statett = null; - statett = ExplorationState.findExplorationStateOfTransition(visitedStates, tt); - if(statett==null){ - String msg = "constructScenarioFSM:transition has no state"; - throw new NullPointerException(msg); - } - List> sTokens = new ArrayList>(); - Map newState = new HashMap(); - - //Find the set of ControlTokensPerActions produced by each detector actor - for(Pair transition: tt){ - Set cta = analysis.getControlTokensOfAction( - transition.getFirst(), transition.getSecond().getAction()); - if(cta != null){ - sTokens.add(cta); - } - newState.put(transition.getFirst(), transition.getSecond().getTargetState()); - } - Set> ctaSet = CartesianProduct.cartesianProduct(sTokens); - Set sgs = constructScenarioGraphs(sources, tt, ctaSet); - if(!sgs.isEmpty()){ - for(ScenarioGraph sg: sgs){ - if(ExplorationState.findScenarioGraph(sg, statett.getScenarioGraphs(), false)==null) - statett.getScenarioGraphs().add(sg); - else - eliminatedScenarioGraphs++; - } - } - - //If a newStateSpaceState is found, put it in the list of visited states. - ExplorationState existingState = ExplorationState.findVistedState(visitedStates, newState); - if(existingState==null){ - ExplorationState newEState = new ExplorationState(newState, "EState"+visitedStates.size()); - newEState.addIncidentState(statett); - for(Set> s:ExplorationState.traverseTransitions(newState)){ - ttQueue.add(s); - newEState.addTransitionTuple(s); - } - visitedStates.add(newEState); - System.out.println("From .."); - statett.printActorStateTuple(System.out); - System.out.println("To .."); - newEState.printActorStateTuple(System.out); - System.out.println("---------"); - } - else{ - existingState.addIncidentState(statett); - } - } - - //Remove all Exploration States which have no ScenarioGraphs - visitedStates.removeAll(getZeroGraphStates(visitedStates)); - - if(visitedStates.size() == 0){ - throw new Exception("constructScenarioFSM: No valid exploration states found."); - } - - //generate the FSM states - generateFSMStates(visitedStates); - - //generate the FSM transitions - generateFSMTransitions(visitedStates); - - System.out.println(scenarioFSM.getScenarioFSMStates().size() + " FSM States, " + - scenarioFSM.getScenarioFSMTransitions().size() + " FSM Transtions, " + - scenarioFSM.getScenarioGraphs().size() + " scenario graphs," + - eliminatedScenarioGraphs + " eliminated graphs"); - } - catch(Exception e){ - System.out.println(e.getMessage()); - System.exit(1); - } - - return scenarioFSM; - } - + /** * searches states that have no ScenarioGraphs * @param states: a set of ExplorationStates to be tested @@ -652,19 +648,21 @@ private Set getZeroGraphStates(Set states){ * generates scenario FSM states from a given set of ExplorationStates * @param visitedStates */ - private void generateFSMStates(Set visitedStates){ + private void generateCompleteFSMStates(Set visitedStates){ String str; //Create FSM states and scenario graphs for(ExplorationState eState: visitedStates){ for(ScenarioGraph sGraph: eState.getScenarioGraphs()){ //create new FSM state - str = eState.getName(); + str = "State_"+Integer.toString(scenarioFSM.getScenarioFSMStates().size()); ScenarioFSMState fsmState = scenarioFSM.new ScenarioFSMState(str); ScenarioGraph existingSGraph = null; - existingSGraph = ExplorationState.findScenarioGraph(sGraph, scenarioFSM.getScenarioGraphs(), false); + existingSGraph = ExplorationState.findScenarioGraph(sGraph, + scenarioFSM.getScenarioGraphs(), false); //if new scenario graph, add to the list if(existingSGraph==null){ - str = "ScenarioGraph_"+scenarioFSM.getScenarioGraphs().size(); + //str = "ScenarioGraph_"+scenarioFSM.getScenarioGraphs().size(); + str = sGraph.getControlTokensAsString(); sGraph.setName(str); fsmState.setScenarioGraph(sGraph); scenarioFSM.addScenarioGraph(sGraph); @@ -680,10 +678,50 @@ private void generateFSMStates(Set visitedStates){ } } + //create initial state with just a random scenario graph (for the time-being) + ScenarioFSMState initialFsmState = scenarioFSM.new ScenarioFSMState("InitialState"); + initialFsmState.setScenarioGraph(scenarioFSM.getScenarioGraphs().iterator().next()); + scenarioFSM.addScenarioFSMState(initialFsmState); + } + + /** + * generates scenario FSM states from a given set of ExplorationStates + * @param visitedStates + */ + private void generateConservativeFSMStates(Set visitedStates){ + String str; + //Create FSM states and scenario graphs + for(ExplorationState eState: visitedStates){ + for(ScenarioGraph sGraph: eState.getScenarioGraphs()){ + //create new FSM state + str = eState.getName(); + ScenarioGraph existingSGraph = null; + existingSGraph = ExplorationState.findScenarioGraph(sGraph, + scenarioFSM.getScenarioGraphs(), false); + //if new scenario graph, add to the list + if(existingSGraph==null){ + str = "State_"+Integer.toString(scenarioFSM.getScenarioFSMStates().size()); + ScenarioFSMState fsmState = scenarioFSM.new ScenarioFSMState(str); + str = sGraph.getControlTokensAsString(); + sGraph.setName(str); + fsmState.setScenarioGraph(sGraph); + scenarioFSM.addScenarioGraph(sGraph); + eState.addScenarioFSMState(fsmState); + scenarioFSM.addScenarioFSMState(fsmState); + } + else{ + //change the name of the g + sGraph.setName(existingSGraph.getName()); + ScenarioFSMState fsmState = scenarioFSM.getState(existingSGraph); + eState.addScenarioFSMState(fsmState); + } + } + } + // //create initial state with just a random scenario graph (for the time-being) -// ScenarioFSMState initialFsmState = scenarioFSM.new ScenarioFSMState("InitialState"); -// initialFsmState.setScenarioGraph(scenarioFSM.getScenarioGraphs().iterator().next()); -// scenarioFSM.addScenarioFSMState(initialFsmState); + ScenarioFSMState initialFsmState = scenarioFSM.new ScenarioFSMState("InitialState"); + initialFsmState.setScenarioGraph(scenarioFSM.getScenarioGraphs().iterator().next()); + scenarioFSM.addScenarioFSMState(initialFsmState); } /** @@ -697,25 +735,25 @@ private void generateFSMTransitions(Set visitedStates){ //connect the initial state of the scenario FSM with //every FSM state of the initial exploration state -// if(eState.getName().equals("InitialState")){ -// for(ScenarioFSMState targetFSMState: eState.getScenarioFSMStates()){ -// str = "Transition"+scenarioFSM.getScenarioFSMTransitions().size(); -// ScenarioFSMTransition fsmTransition = scenarioFSM.new ScenarioFSMTransition(str); -// fsmTransition.setSourceState(scenarioFSM.getState("InitialState")); -// fsmTransition.setTargetState(targetFSMState); -// if(fsmTransition.getSourceState()==null || fsmTransition.getTargetState()==null){ -// str = "generateFSMTransitions: transition has no source/target state."; -// throw new NullPointerException(str); -// } -// if(!scenarioFSM.transitionExists(fsmTransition)){ -// scenarioFSM.addScenarioFSMTransition(fsmTransition); -// } -// else{ -// str = "generateFSMTransitions: duplicated transitions detected."; -// throw new NullPointerException(str); -// } -// } -// } + if(eState.getName().equals("InitialState")){ + for(ScenarioFSMState targetFSMState: eState.getScenarioFSMStates()){ + str = "Transition"+scenarioFSM.getScenarioFSMTransitions().size(); + ScenarioFSMTransition fsmTransition = scenarioFSM.new ScenarioFSMTransition(str); + fsmTransition.setSourceState(scenarioFSM.getState("InitialState")); + fsmTransition.setTargetState(targetFSMState); + if(fsmTransition.getSourceState()==null || fsmTransition.getTargetState()==null){ + str = "generateFSMTransitions: transition has no source/target state."; + throw new NullPointerException(str); + } + if(!scenarioFSM.transitionExists(fsmTransition)){ + scenarioFSM.addScenarioFSMTransition(fsmTransition); + } + else{ + str = "generateFSMTransitions: duplicated transitions detected."; + throw new NullPointerException(str); + } + } + } //add a transition from every FSM state of every incidentState to //every FSM state of the current state @@ -732,10 +770,10 @@ private void generateFSMTransitions(Set visitedStates){ if(!scenarioFSM.transitionExists(fsmTransition)){ scenarioFSM.addScenarioFSMTransition(fsmTransition); } - else{ - str = "generateFSMTransitions: duplicated transitions detected."; - throw new NullPointerException(str); - } +// else{ +// str = "generateFSMTransitions: duplicated transitions detected."; +// throw new NullPointerException(str); +// } } } @@ -761,6 +799,8 @@ public boolean isNonExistingTokenTransition( } return false; } + + /** * populates the control tokens of the network. Each control token has a name, * a parent detector actor and a list of (broadcast) control ports. Hence, all @@ -782,7 +822,7 @@ private void populateControlTokens(){ hasAnnotation = true; for(String t: s.split(";")){ String st[] = t.split(":"); - ControlToken controlToken = analysis.new ControlToken(actor, st[0].trim()); + ControlToken controlToken = new ControlToken(actor, st[0].trim()); //Add common ports for(String p: st[1].split(",")){ PortInstance pi = actor.getPort(p.trim()); @@ -797,6 +837,7 @@ private void populateControlTokens(){ } } + // the 'Filters' tag specifies, non-existing token transitions if (actor.getAnnotationArgumentValue("ActorProperty", "Filters")!=null){ String s = actor.getAnnotationArgumentValue("ActorProperty", "Filters"); for(String t: s.split(";")){ @@ -813,7 +854,7 @@ private void populateControlTokens(){ } //Otherwise, assume all output ports belong to the same token type if(!hasAnnotation){ - ControlToken controlToken = analysis.new ControlToken(actor, "default"); + ControlToken controlToken = new ControlToken(actor, "d"); for(PortInstance pi: actor.getOutputPorts()){ controlToken.addControlPort(pi); } @@ -831,8 +872,8 @@ private void populateControlTokens(){ private void populateDetectorFSMs(){ for(ActorInstance dActor: analysis.getDetectorActors()){ String filePath = analysis.getResourcePath()+File.separator+ - dActor.getInstanceName()+".fsm"; - DetectorFSM detectorFSM = new DetectorFSM(dActor); + dActor.getInstanceName()+".sched"; + FiringSchedule firingSchedule = new FiringSchedule(dActor); Document document; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); @@ -840,36 +881,35 @@ private void populateDetectorFSMs(){ try { DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.parse(new File(filePath)); - if(document.getDocumentElement().getTagName().equalsIgnoreCase("fsm")){ + if(document.getDocumentElement().getTagName().equalsIgnoreCase("firingSchedule")){ NamedNodeMap fsmAttributes = document.getDocumentElement().getAttributes(); - Node initialStateNode = fsmAttributes.getNamedItem("initialState"); - if(initialStateNode==null) - throw new Exception("No initial state in FSM"); - detectorFSM.initialState = initialStateNode.getNodeValue(); + Node initialFiringNode = fsmAttributes.getNamedItem("initialnode"); + if(initialFiringNode==null) + throw new Exception("No initial node in firing schedule"); + firingSchedule.initialFiring = initialFiringNode.getNodeValue(); NodeList nodes = document.getDocumentElement().getChildNodes(); for (int i=0; i statesQueue = new ArrayList(); + /** + * prints possible scenario configurations and the tuples of control tokens of + * each scenario configuration. + */ + public void printScenarioConfigurations(){ + //the set of detector actors + Set dActors = analysis.getScenarioAwareDetectorActors(); + + List> setOfSetsOfFirings = new ArrayList>(); + for(ActorInstance detector : dActors){ + Set firings = new HashSet(); + for(Action action : detector.getImplementation().getActions()){ + firings.add(action); + } + System.out.println(detector.getInstanceName()+" has "+firings.size()+" firings."); + setOfSetsOfFirings.add(firings); + } + + Set> configurations = CartesianProduct.cartesianProduct(setOfSetsOfFirings); + System.out.println(configurations.size()+" configurations found!"); + for(Set configuration: configurations){ + for(Action action: configuration){ + System.out.print(action.getName()+" "); + } + System.out.println(); + } + } + + /** + * Extracts scenarios and constructs the FSM using the firing schedules + * of detector actors. The firing schedules are constructed from file. + * The FSM is constructed through state-space exploration. A state is + * uniquely identified by a scenario configuration, which is a tuple of + * detector actor firings. + * @return + */ + public List constructConfigurationSpace(){ + + //a list of states to be visited + List statesToBeVisited = new ArrayList(); + //a list of visited states List visitedStates = new ArrayList(); //the set of detector actors - Set dActors = analysis.getScenarioAwareDetectorActors(); + Set detectorActors = analysis.getScenarioAwareDetectorActors(); try{ + //list of source actors List sources = analysis.getSourceActors(); if(sources.size()==0){ @@ -927,97 +1008,201 @@ public ScenarioFSM constructScenarioFSM2(){ throw new NullPointerException(msg); } - //initialExplorationState = the set of the initial states of detector actors - Set ieState = new HashSet(); - for(ActorInstance d: dActors){ - ieState.add(getDetectorFSM(d).getInitialState()); - } - - ExplorationState state = new ExplorationState(ieState, "EState"); - - statesQueue.add(state); + //initialExplorationState:= set of the initial firings of detector actors + Set ieState = new HashSet(); + for(ActorInstance d: detectorActors){ + ieState.add(getFiringSchedule(d).getInitialFiring()); + } + ExplorationState initialState = new ExplorationState(ieState, "InitialState"); + statesToBeVisited.add(initialState); - while(!statesQueue.isEmpty()){ - //take a combination of transitions from the queue - ExplorationState tt = statesQueue.remove(0); + //as long as there are states to visited + while(!statesToBeVisited.isEmpty()){ - //find the exploration state of the combination of transitions - ExplorationState existingState = ExplorationState.findVistedState(visitedStates, tt.stateTuple); + //pick a state + ExplorationState state = statesToBeVisited.remove(0); + + //test if the configuration of the state has already been visited + ExplorationState existingState = null; + existingState = ExplorationState.findVistedState(visitedStates, state.configuration); + + // if already visited, update only the list of incident states of the + // existing state if(existingState != null){ - for(ExplorationState es: tt.getIncidentStates()) + for(ExplorationState es: state.getIncidentStates()){ existingState.addIncidentState(es); + } } else{ + // if the configuration is new, create a new state + state.setName("State_"+visitedStates.size()); + visitedStates.add(state); + System.out.println(state.getConfigurationAsString()); - tt.setName("State_"+visitedStates.size()); - visitedStates.add(tt); - - Set sTokens = new HashSet(); - Set> nextStates = new HashSet>(); - - List> targetStatesList = new ArrayList>(); - - for(ControlTokenFSMState cs: tt.stateTuple){ - Set targetStates = new HashSet(); - ControlTokensPerAction t = analysis.new ControlTokensPerAction(cs.detectorActor, cs.action); - t.setControlTokens(cs.controlTokens); - sTokens.add(t); - - for(String trans: cs.transitions){ - targetStates.add(this.getDetectorFSM(cs.detectorActor).getState(trans)); + //a list of target firings of each firing of the configuration + List> targetFiringsList = new ArrayList>(); + for(FiringNode firingNode: state.configuration){ + Set targetFirings = new HashSet(); + for(String transition: firingNode.outGoingTransitions){ + targetFirings.add( + getFiringSchedule(firingNode.detectorActor).getFiring(transition)); } - targetStatesList.add(targetStates); + targetFiringsList.add(targetFirings); } + + Set> nextConfigurations = computeNextConfigurations(state.configuration, targetFiringsList); - nextStates = CartesianProduct.cartesianProduct(targetStatesList); - - ScenarioGraph sgs = analysis.constructScenarioGraph(sources, sTokens); - if(sgs!=null){ - tt.getScenarioGraphs().add(sgs); + boolean deadEnd = true; + for(Set nextConfiguration: nextConfigurations){ + //System.out.print("Testing: "+ExplorationState.getConfigurationAsString(nextConfiguration)); + if(existentConfiguration(nextConfiguration)){ + ExplorationState newEState = new ExplorationState(nextConfiguration,"EState"); + newEState.addIncidentState(state); + statesToBeVisited.add(newEState); + deadEnd = false; + //System.out.println(" -- exists."); + } + //else + //System.out.println(" -- does not exist."); + } + + + //Find the tuplesOfControlTokens of the configuration + Set> ctaSet = getTuplesOfControlTokens(state.configuration); + Set sgs = constructScenarioGraphs(sources, state.configuration, ctaSet); + if(!sgs.isEmpty()){ + for(ScenarioGraph sg: sgs){ + if(ExplorationState.findScenarioGraph(sg, state.getScenarioGraphs(), false)==null) + state.addScenarioGraph(sg); + else + numberOfEliminatedScenarioGraphs++; + } } - else - throw new Exception("ExplorationState has no scenario graph"); - for(Set st: nextStates){ - if(stateTupleExist(st)){ - ExplorationState newEState = new ExplorationState(st,"EState"); - newEState.addIncidentState(tt); - statesQueue.add(newEState); + if(deadEnd){ + if(state.getScenarioGraphs().size() > 0){ + //System.out.println(state.getConfigurationAsString()); + System.out.println("\t\t\t --- DeadEnd"); } - } + } } } + } + catch(Exception e){ + System.out.println(e.getMessage()); + System.exit(1); + } - Set visitedStatesSet = new HashSet(); - visitedStatesSet.addAll(visitedStates); + return visitedStates; + } + + + /** + * constructs the complete FSM. The set of states of the + * complete FSM comprises a state for each scenario graph + * of each scenario configuration. The set of transitions + * comprises a transition between any two FSM states of two + * connected scenario configurations. + * @param states + */ + public void constructCompleteFSM(){ + Set states = new HashSet(); + states.addAll(constructConfigurationSpace()); + try{ + //Remove all Exploration States which have no ScenarioGraphs + states.removeAll(getZeroGraphStates(states)); - //Remove all Exploration States which have no ScenarioGraphs - visitedStatesSet.removeAll(getZeroGraphStates(visitedStatesSet)); - - if(visitedStatesSet.size() == 0){ - throw new Exception("constructScenarioFSM: No valid exploration states found."); - } + if(states.size() == 0){ + throw new Exception("constructCompleteFSM: No states found."); + } + + //generate the FSM states + generateCompleteFSMStates(states); - //generate the FSM states - generateFSMStates(visitedStatesSet); - - //generate the FSM transitions - generateFSMTransitions(visitedStatesSet); - - for(ExplorationState s: visitedStatesSet){ - s.print(System.out); + //generate the FSM transitions + generateFSMTransitions(states); + + }catch(Exception e){ + System.out.println(e.getMessage()); + System.exit(1); } - System.out.println(scenarioFSM.getScenarioFSMStates().size() + " FSM States, " + - scenarioFSM.getScenarioFSMTransitions().size() + " FSM Transtions, " + - scenarioFSM.getScenarioGraphs().size() + " scenario graphs," + - eliminatedScenarioGraphs + " eliminated graphs"); - } - catch(Exception e){ + } + + /** + * constructs the complete FSM. The set of states of the + * complete FSM comprises a state for each scenario graph + * of each scenario configuration. The set of transitions + * comprises a transition between any two FSM states of two + * connected scenario configurations. + * @param states + */ + public void constructConservativeFSM(){ + Set states = new HashSet(); + states.addAll(constructConfigurationSpace()); + try{ + //Remove all Exploration States which have no ScenarioGraphs + states.removeAll(getZeroGraphStates(states)); + + if(states.size() == 0){ + throw new Exception("constructCompleteFSM: No states found."); + } + + //generate the FSM states + generateConservativeFSMStates(states); + + //generate the FSM transitions + generateFSMTransitions(states); + + }catch(Exception e){ System.out.println(e.getMessage()); System.exit(1); } + } + + + public Set> computeNextConfigurations(Set currentConfiguration, + List> targetFiringsList){ + Set> nextConfigurations = new HashSet>(); + for(Set nextConfiguration: CartesianProduct.cartesianProduct(targetFiringsList)){ + System.out.println("Testing: "+ExplorationState.getConfigurationAsString(nextConfiguration)); + if(existentConfiguration(nextConfiguration)){ + Set newConfiguration = new HashSet(); + for(FiringNode firingNode: nextConfiguration){ + //if firing is not enabled, revert the transition + if(!isDetectorFiringEnabled(firingNode, nextConfiguration)){ + //find the firing in the current configuration + for(FiringNode cfiringNode: currentConfiguration){ + if(cfiringNode.detectorActor==firingNode.detectorActor){ + //replace it with the current firing + newConfiguration.add(cfiringNode); + break; + } + } + } + else + newConfiguration.add(firingNode); + } + System.out.println("ATesting: "+ExplorationState.getConfigurationAsString(newConfiguration)); + nextConfigurations.add(newConfiguration); + } + } - return scenarioFSM; + //remove redundant configurations + Set> nextUniqueConfigurations = new HashSet>(); + for(Set nextConfiguration: nextConfigurations){ + // check if nextConfiguration is not redundant + boolean exists = false; + for(Set nextConfigurationUnique: nextUniqueConfigurations){ + if(ExplorationState.areEqual(nextConfiguration, nextConfigurationUnique)){ + exists = true; + break; + } + } + + if(!exists) + nextUniqueConfigurations.add(nextConfiguration); + } + return nextUniqueConfigurations; } } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioGraph.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioGraph.java index 672161e..04c8d7e 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioGraph.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioGraph.java @@ -36,21 +36,15 @@ package org.caltoopia.analysis.network; import java.io.PrintStream; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; import org.caltoopia.analysis.actor.ScenarioAwareActorAnalysis; import org.caltoopia.analysis.air.ActorInstance; import org.caltoopia.analysis.air.Connection; -import org.caltoopia.analysis.air.PortInstance; -import org.caltoopia.analysis.air.Transition; -import org.caltoopia.analysis.network.ScenarioAwareNetworkAnalysis.ControlTokensPerAction; -import org.caltoopia.analysis.util.collections.Pair; -import org.caltoopia.ast2ir.Stream; +import org.caltoopia.analysis.network.ControlTokensPerAction; /** *The ScenarioGraph class encapsulates a Synchronous Dataflow (SDF) @@ -126,6 +120,16 @@ public Set getControlTokens(){ return controlTokens; } + //get control tokens as string + public String getControlTokensAsString(){ + String ct = ""; + for(ControlTokensPerAction cta: controlTokens){ + if(cta.getControlTokens().size()>0) + ct += cta.toString(); + } + return ct; + } + public void print(PrintStream out){ out.println("\tScenarioGraph: "+name+ ", actors: "+ actorsMap.size()); if(controlTokens!=null){ diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/SneakyNetworkAnalyzer.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/SneakyNetworkAnalyzer.java index 1800ab3..c308b4b 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/SneakyNetworkAnalyzer.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/SneakyNetworkAnalyzer.java @@ -112,12 +112,14 @@ class SneakyNetworkAnalysis implements NetworkAnalysis { public SneakyNetworkAnalysis(Network n){ network = n; - ActorAnalyzer actorAnalyzer=new SneakyActorAnalyzer(); + ActorAnalyzer actorAnalyzer=new SneakyActorAnalyzer(); + int id = 0; for (ActorInstance actor: network.getActors()) { GenericActorAnalysis analysis = null; if (actor.hasImplementation()) { ActorImplementation actorImpl=actor.getImplementation(); - analysis=new GenericActorAnalysis(actor,actorAnalyzer.analyze(actorImpl)); + analysis=new GenericActorAnalysis(actor,actorAnalyzer.analyze(actorImpl)); + analysis.setId(new Integer(id++)); }else{ analysis=new GenericActorAnalysis(actor,null); } diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/util/collections/CartesianProduct.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/util/collections/CartesianProduct.java index 877698e..d7592d9 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/util/collections/CartesianProduct.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/util/collections/CartesianProduct.java @@ -36,10 +36,14 @@ package org.caltoopia.analysis.util.collections; +import java.util.ArrayList; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; +import com.google.common.collect.Sets; + public class CartesianProduct { /** * performs a Cartesian product of a list of sets of objects. @@ -61,17 +65,23 @@ else if (objects.size() == 1){ } return setOfSets; } - return _cartesianProduct(0, objects); + return _cartesianProduct(0,objects); } - + /** + * Recursive implementation of Cartesian product of a list of sets + * @param index: recursion depth + * @param sets: a list of sets + * @return + */ private static Set> _cartesianProduct(int index, List> sets) { Set> ret = new HashSet>(); if (index == sets.size()) { ret.add(new HashSet()); } else { for (T object : sets.get(index)) { - for (Set set : _cartesianProduct(index+1, sets)) { + Set> cartProduct = _cartesianProduct(index+1, sets); + for (Set set : cartProduct) { set.add(object); ret.add(set); } @@ -79,4 +89,29 @@ private static Set> _cartesianProduct(int index, List> sets) { } return ret; } + + /** + * Iterative implementation of Cartesian product of a list of sets + * @param sets: a list of sets + * @return Cartesian product + */ + private static Set> _cartesianProduct(List> sets) { + Set> ret = new HashSet>(); + ret.add(new HashSet()); + int index = sets.size()-1; + while(index >= 0){ + Set> tempret = new HashSet>(); + for(T object : sets.get(index)){ + for (Set set : ret) { + Set sett = new HashSet(set); + sett.add(object); + tempret.add(sett); + } + } + ret.clear(); + ret.addAll(tempret); + index--; + } + return ret; + } } From d333af4b1580ca9b37981351bf7676fffed211ae Mon Sep 17 00:00:00 2001 From: Firew Siyoum Date: Mon, 22 Apr 2013 16:13:08 +0200 Subject: [PATCH 8/8] updates in scenario-aware analysis. --- .../analysis/actor/GenericActorAnalysis.java | 2 +- .../analysis/network/ControlToken.java | 98 +++++++ .../network/ControlTokensPerAction.java | 243 ++++++++++++++++++ .../network/NetworkClassifierOutput.java | 89 ++++++- .../network/ScenarioAwareNetworkAnalysis.java | 6 +- .../ScenarioAwareStateExploration.java | 66 ++--- 6 files changed, 445 insertions(+), 59 deletions(-) create mode 100644 org.caltoopia.analysis/src/org/caltoopia/analysis/network/ControlToken.java create mode 100644 org.caltoopia.analysis/src/org/caltoopia/analysis/network/ControlTokensPerAction.java diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java index c9e724a..2a6944d 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/actor/GenericActorAnalysis.java @@ -104,7 +104,7 @@ public GenericActorAnalysis(ActorInstance actor, ActorAnalysis delegate) { actorAnalysis=delegate; mActorType = ActorInstanceType.UNCLASSIFIED; - stateSize = new Integer(0); + stateSize = new Integer(1); executionTime = new Integer(0); for(PortInstance portInstance : mActor.getPorts()){ PortAnalysis portAnalysis = new PortAnalysis(portInstance); diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ControlToken.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ControlToken.java new file mode 100644 index 0000000..0c84706 --- /dev/null +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ControlToken.java @@ -0,0 +1,98 @@ +package org.caltoopia.analysis.network; + +import java.util.ArrayList; +import java.util.List; + +import org.caltoopia.analysis.air.ActorInstance; +import org.caltoopia.analysis.air.PortInstance; +import org.caltoopia.analysis.util.collections.UnionOfDisjointIntervals; +import org.caltoopia.ast2ir.Stream; + +/** + * represents a control token of produced by a detector actor. + */ +public class ControlToken{ + //the detector actor + private ActorInstance detectorActor; + + //the token name as given by annotation in the CAL actor + private String tokenName; + + //the list of control ports that produce this control token + private List controlPorts = new ArrayList(); + + //constructor + public ControlToken(ActorInstance a, String t){ + detectorActor = a; + tokenName = t; + } + + public void setDetectorActor(ActorInstance a){ + detectorActor = a; + } + + public void setName(String name){ + tokenName = name; + } + + public void setControlPorts( List p){ + controlPorts = p; + } + + public ActorInstance getDetectorActor(){ + return detectorActor; + } + + public String getName(){ + return tokenName; + } + + public List getControlPorts(){ + return controlPorts; + } + + public void addControlPort( PortInstance p){ + controlPorts.add(p); + } + + //print to a stream + void print(Stream stream){ + stream.println("DetectorActor: "+detectorActor.getInstanceName()); + stream.println("\tTokenName: "+tokenName); + stream.print("\tContorlPorts: "); + for(PortInstance p: controlPorts){ + stream.print(p.getName()+" "); + } + stream.println(); + } + + /** + * parses a 'string' and generates a union of disjoint intervals. + * 'string' must consist of sub-strings separated by a slash(/): + * string = sub-string1/sub-string2/sub-string3 + * A sub-string can only be either a numeric letter (e.g. 2) or + * hyphen separated two numeric letters (e.g. 4-7 ). + * Example: The string 2/4-7/13/8-9 produces the union of intervals + * given by {[2,2],[4-9],[13-13]} + * @param string + * @return UnionOfDisjointIntervals if the input string is valid. + * It returns null otherwise. + */ + public static UnionOfDisjointIntervals parseIntervals(String string){ + UnionOfDisjointIntervals intervals = new UnionOfDisjointIntervals(); + for(String interval: string.split("/")){ + String s[] = interval.split("-"); + + if(s.length==1 && Long.parseLong(s[0].trim()) >= 0){ + intervals.add(Long.parseLong(s[0].trim()), Long.parseLong(s[0].trim())); + } + else if(s.length==2 && Long.parseLong(s[0].trim()) >= 0 + && Long.parseLong(s[1].trim()) >= 0){ + intervals.add(Long.parseLong(s[0].trim()), Long.parseLong(s[1].trim())); + } + else + return null; + } + return intervals; + } +}; \ No newline at end of file diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ControlTokensPerAction.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ControlTokensPerAction.java new file mode 100644 index 0000000..c9ed0d6 --- /dev/null +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ControlTokensPerAction.java @@ -0,0 +1,243 @@ +package org.caltoopia.analysis.network; + +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.caltoopia.analysis.air.Action; +import org.caltoopia.analysis.air.ActorInstance; +import org.caltoopia.analysis.air.Transition; +import org.caltoopia.analysis.network.ControlTokensPerAction; +import org.caltoopia.analysis.util.collections.CartesianProduct; +import org.caltoopia.analysis.util.collections.Pair; +import org.caltoopia.analysis.util.collections.UnionOfDisjointIntervals; + +/** + * represents the control tokens produced by an action of a detector actor. + * A control token is identified by a name given by annotation in the CAL action + */ +public class ControlTokensPerAction{ + //the detector actor + private ActorInstance detectorActor = null; + + //the action + private Action detectorAction; + + //the list of control tokens and their corresponding values + private Map controlTokens= new HashMap(); + + public ControlTokensPerAction(ActorInstance actor, Action action){ + detectorActor = actor; + detectorAction = action; + }; + + public void setDetectorActor(ActorInstance a){ + detectorActor = a; + } + + public void setDetectorAction(Action a){ + detectorAction = a; + } + + public void setControlTokens(Map c){ + controlTokens = c; + } + + public void addControlToken(String key, Long value){ + controlTokens.put(key, value); + } + + public ActorInstance getDetectorActor(){ + return detectorActor; + } + + public Action getDetectorAction(){ + return detectorAction; + } + + public Map getControlTokens(){ + return controlTokens; + } + + public String toString(){ + String cta = ""; + for(Map.Entry e: controlTokens.entrySet()){ + cta += e.getKey(); + cta += "_"; + cta += e.getValue(); + cta += "_"; + } + return cta; + } + + /** + * tests if a given control token is the same as + * this control token. + * @param c + * @return + */ + public boolean equals(ControlTokensPerAction c){ + if(this.detectorActor!=c.detectorActor) + return false; + + if(this.detectorAction!=c.detectorAction) + return false; + + if(this.controlTokens.size()!= c.controlTokens.size()) + return false; + + for(Map.Entry e: controlTokens.entrySet()){ + if(c.getControlTokens().get(e.getKey())!=e.getValue()) + return false; + } + return true; + } + + public void print(PrintStream out){ + out.println("\t"+detectorActor.getInstanceName()+"\t"+detectorAction.getName()); + for(Map.Entry e: controlTokens.entrySet()){ + out.println("\t\t"+e.getKey()+"\t"+e.getValue().longValue()); + } + } + + /** + * Each detector action produces a set of control tokens. This information + * is obtained from the action annotation. + * @param detector + * @param action + * @return a set of control tokens produced by the detector action. It returns + * null if the detector action is not annotated. + */ + public static Set getControlTokensOfAction(ActorInstance detector, Action action){ + String msg = ""; + try{ + //if it has ControlToken annotated types, parse + if(action.hasAnnotation("ActionProperty")){ + if (action.getAnnotationArgumentValue("ActionProperty", "ScenarioTokens")!=null){ + Set acToknes = new HashSet(); + String s = action.getAnnotationArgumentValue("ActionProperty", "ScenarioTokens"); + List>> tokenRanges = + new ArrayList>>(); + for(String t: s.split(";")){ + String st[] = t.split(":"); + UnionOfDisjointIntervals intervals = new UnionOfDisjointIntervals(); + for(String interval: st[1].split("/")){ + String str[] = interval.split("-"); + + if(str.length==1 && Long.parseLong(str[0].trim()) >= 0){ + intervals.add(Long.parseLong(str[0].trim()), Long.parseLong(str[0].trim())); + } + else if(str.length==2 && Long.parseLong(str[0].trim()) >= 0 + && Long.parseLong(str[1].trim()) >= 0){ + intervals.add(Long.parseLong(str[0].trim()), Long.parseLong(str[1].trim())); + } + else{ + msg = "Scenario tag error. "; + msg += "Syntax error for scenario interval '"; + msg += interval + "'."; + throw new NullPointerException( msg ); + } + } + Set> tokenRange = new + HashSet>(); + for(Long scenario: intervals.asSet()){ + tokenRange.add(new Pair(st[0].trim(), scenario)); + } + tokenRanges.add(tokenRange); + } + + + for(Set> str: CartesianProduct.cartesianProduct(tokenRanges)){ + ControlTokensPerAction sta = new ControlTokensPerAction(detector, action); + for(Pair e: str){ + if(sta.getControlTokens().containsKey(e.getFirst())){ + msg = "getScenarioOfDetectorAction: "; + msg += "duplicate entry for a scenario token detected."; + throw new Exception( msg ); + } + sta.getControlTokens().put(e.getFirst(), e.getSecond()); + } + acToknes.add(sta); + } + return acToknes; + } + } + }catch(Exception e){ + System.out.println(e.getMessage()); + System.exit(1); + } + return null; + } + + /** + * computes the set all possible tuples of ControlTokenPerAction that are possible at a + * given transitionTuple. A tuple of ControlTokenPerAction has exactly one control token + * per detector actor. + * @param transitionTuple + * @return the set of all possible control token combinations + */ + public static Set> getControlTokensPerActions( + Set> transitionTuple){ + List> sTokens = new ArrayList>(); + for(Pair tPair: transitionTuple){ + ActorInstance detector = tPair.getFirst(); + Action detectorAction = tPair.getSecond().getAction(); + Set sta = null; + sta = getControlTokensOfAction(detector, detectorAction); + if(sta!=null) + sTokens.add(sta); + } + + return CartesianProduct.cartesianProduct(sTokens); + } + + /** + * removes control tokens produced by actors that do not + * exist in a given scenario graph. + * @param acTokens + * @param sg + * @return a set of control tokens + */ + public static Set filterControlTokens( + Set acTokens, ScenarioGraph sg){ + Set filteredSet = null; + filteredSet = new HashSet(acTokens); + for(ControlTokensPerAction ast: acTokens){ + ActorInstance actor = ast.getDetectorActor(); + if(!sg.getActors().containsKey(actor)) + filteredSet.add(ast); + } + return filteredSet; + } + + + /** + * checks if two sets of control token are the same. + * @param f : first set of control tokens + * @param s : second set of control tokens + * @return true if the two sets are the same + */ + public static boolean AreControlTokensEqual(Set f, + Set s){ + if(f.size() != s.size()) + return false; + + for(ControlTokensPerAction cf: f){ + boolean found = false; + for(ControlTokensPerAction cs: s){ + if(cf.equals(cs)){ + found = true; + break; + } + } + if(!found) + return false; + } + + return true; + } +}; diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java index aca192f..1094681 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/NetworkClassifierOutput.java @@ -596,10 +596,25 @@ else if(scenario.getTransition()==null){ } } } + //add self-edge ports + XMLNode selfInPortNode = new XMLNode("port"); + selfInPortNode.addAttribute("name","selfIn"); + selfInPortNode.addAttribute("type", "in"); + selfInPortNode.addAttribute("rate", "1"); + actorNode.addXMLNode(selfInPortNode); + + + XMLNode selfOutPortNode = new XMLNode("port"); + selfOutPortNode.addAttribute("name","selfOut"); + selfOutPortNode.addAttribute("type", "out"); + selfOutPortNode.addAttribute("rate", "1"); + actorNode.addXMLNode(selfOutPortNode); + scenarioGraphNode.addXMLNode(actorNode); } //add each connection + Map addedChannels = new HashMap(); for(Connection c: network.getConnections()){ XMLNode connectionNode = new XMLNode("channel"); ActorInstance srcA = c.getProducerPort().getActor(); @@ -616,9 +631,19 @@ else if(scenario.getTransition()==null){ if(spSrc.getPortRates().containsKey(c.getProducerPort()) && spDst.getPortRates().containsKey(c.getConsumerPort())){ if(spSrc.getPortRate(c.getProducerPort()).intValue() > 0 && - spDst.getPortRate(c.getConsumerPort()).intValue() > 0){ - connectionNode.addAttribute("name", srcA.getInstanceName()+ - "2"+ dstA.getInstanceName()); + spDst.getPortRate(c.getConsumerPort()).intValue() > 0){ + + String channelName = srcA.getInstanceName()+"2"+ dstA.getInstanceName(); + + if(addedChannels.containsKey(channelName)){ + Integer value = addedChannels.get(channelName) + 1; + addedChannels.put(channelName, value); + channelName+=value.toString(); + } + else + addedChannels.put(channelName, new Integer(0)); + + connectionNode.addAttribute("name", channelName); connectionNode.addAttribute("srcActor", srcA.getInstanceName()); connectionNode.addAttribute("srcPort", c.getProducerPort().getName()+"_to_"+dstA.getInstanceName()); connectionNode.addAttribute("dstActor", dstA.getInstanceName()); @@ -647,6 +672,22 @@ else if(scenario.getTransition()==null){ } } } + + //add self-edges + //add each actor + for(Map.Entry a: + scenarioGraph.getActors().entrySet()){ + ActorInstance actor = a.getKey(); + XMLNode connectionNode = new XMLNode("channel"); + connectionNode.addAttribute("name", actor.getInstanceName()+ + "2"+ actor.getInstanceName()); + connectionNode.addAttribute("srcActor", actor.getInstanceName()); + connectionNode.addAttribute("srcPort", "selfOut"); + connectionNode.addAttribute("dstActor", actor.getInstanceName()); + connectionNode.addAttribute("dstPort", "selfIn"); + connectionNode.addAttribute("initialTokens","1"); + scenarioGraphNode.addXMLNode(connectionNode); + } } @@ -671,9 +712,9 @@ else if(scenario.getTransition()==null){ //add memory XMLNode memoryNode = new XMLNode("memory"); - XMLNode stateSizeNode = new XMLNode("stateSize"); - stateSizeNode.addAttribute("max", analysis.getGenericActorAnalysis(actor).getStateSize().toString()); - memoryNode.addXMLNode(stateSizeNode); + memoryNode.addAttribute("size", analysis.getGenericActorAnalysis(actor).getStateSize().toString()); + memoryNode.addAttribute("name", "state"); + memoryNode.addAttribute("type", "data"); processorNode.addXMLNode(memoryNode); actorPropertiesNode.addXMLNode(processorNode); @@ -681,19 +722,41 @@ else if(scenario.getTransition()==null){ } //add properties of each connection + Map addedChannels = new HashMap(); for(Connection c: network.getConnections()){ if(!c.getProducerPort().getActor().hasImplementation() || !c.getConsumerPort().getActor().hasImplementation()) continue; + String channelName = c.getProducerPort().getActor().getInstanceName()+"2"+c.getConsumerPort().getActor().getInstanceName(); + if(addedChannels.containsKey(channelName)){ + Integer value = addedChannels.get(channelName) + 1; + addedChannels.put(channelName, value); + channelName+=value.toString(); + } + else + addedChannels.put(channelName, new Integer(0)); XMLNode connectionPropertyNode = new XMLNode("channelProperties"); - connectionPropertyNode.addAttribute("channel", c.getProducerPort().getActor().getInstanceName()+ - "2"+c.getConsumerPort().getActor().getInstanceName()); + connectionPropertyNode.addAttribute("channel", channelName); XMLNode tokenSizeNode = new XMLNode("tokenSize"); - tokenSizeNode.addAttribute("size", Integer.toString(analysis.getConnectionAnalysis(c).getTokenSize())); + tokenSizeNode.addAttribute("sz", Integer.toString(analysis.getConnectionAnalysis(c).getTokenSize())); connectionPropertyNode.addXMLNode(tokenSizeNode); fsmsadfDefaultPropertiesNode.addXMLNode(connectionPropertyNode); + } + //add self-edges + //add each actor + for(ActorInstance actor: network.getActors()){ + XMLNode connectionPropertyNode = new XMLNode("channelProperties"); + connectionPropertyNode.addAttribute("channel", actor.getInstanceName()+ + "2"+actor.getInstanceName()); + XMLNode tokenSizeNode = new XMLNode("tokenSize"); + tokenSizeNode.addAttribute("sz", "1"); + connectionPropertyNode.addXMLNode(tokenSizeNode); + fsmsadfDefaultPropertiesNode.addXMLNode(connectionPropertyNode); + } + + //add scenarios XMLNode scenariosNode = new XMLNode("scenarios"); fsmsadfPropertiesNode.addXMLNode(scenariosNode); @@ -729,9 +792,9 @@ else if(scenario.getTransition()==null){ //add memory XMLNode memoryNode = new XMLNode("memory"); - XMLNode stateSizeNode = new XMLNode("stateSize"); - stateSizeNode.addAttribute("max", analysis.getGenericActorAnalysis(actor).getStateSize().toString()); - memoryNode.addXMLNode(stateSizeNode); + memoryNode.addAttribute("size", analysis.getGenericActorAnalysis(actor).getStateSize().toString()); + memoryNode.addAttribute("name", "state"); + memoryNode.addAttribute("type", "data"); processorNode.addXMLNode(memoryNode); actorPropertiesNode.addXMLNode(processorNode); @@ -744,7 +807,7 @@ else if(scenario.getTransition()==null){ XMLNode graphPropertiesNode = new XMLNode("graphProperties"); XMLNode timingConstraintsNode = new XMLNode("timeConstraints"); XMLNode throughputNode = new XMLNode("throughput"); - throughputNode.addValue("0.000003"); + throughputNode.addValue("0.0000178"); timingConstraintsNode.addXMLNode(throughputNode); graphPropertiesNode.addXMLNode(timingConstraintsNode); fsmsadfPropertiesNode.addXMLNode(graphPropertiesNode); diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java index 05bbae1..ebc5b06 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareNetworkAnalysis.java @@ -140,24 +140,26 @@ public ScenarioAwareNetworkAnalysis(Network n, NetworkAnalysis na, String action confSpaceExploration = new ScenarioAwareStateExploration(this); // construct FSM - confSpaceExploration.constructCompleteFSM(); + confSpaceExploration.constructConservativeFSM(); //TODO: Debug print - remove later List states = confSpaceExploration.constructConfigurationSpace(); + int sumOfTuples = 0; for(ExplorationState s: states){ //s.print(System.out); Set> ctt = confSpaceExploration.getTuplesOfControlTokens(s.configuration); for(FiringNode firing: s.configuration){ System.out.print(firing.firing.getName()+" "); } + sumOfTuples+=ctt.size(); System.out.println(); System.out.print(ctt.size()+" tuples and "); System.out.println(s.getScenarioGraphs().size()+" scenario graphs "); //check if every state is an } - System.out.println(states.size()+" configurations found."); + System.out.println(states.size()+" configurations and " + sumOfTuples +" tuples found."); fsm = confSpaceExploration.getScenarioFSM(); System.out.println(fsm.getScenarioFSMStates().size() + " FSM States, " + diff --git a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java index 9d40180..956def9 100644 --- a/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java +++ b/org.caltoopia.analysis/src/org/caltoopia/analysis/network/ScenarioAwareStateExploration.java @@ -678,10 +678,10 @@ private void generateCompleteFSMStates(Set visitedStates){ } } - //create initial state with just a random scenario graph (for the time-being) - ScenarioFSMState initialFsmState = scenarioFSM.new ScenarioFSMState("InitialState"); - initialFsmState.setScenarioGraph(scenarioFSM.getScenarioGraphs().iterator().next()); - scenarioFSM.addScenarioFSMState(initialFsmState); +// //create initial state with just a random scenario graph (for the time-being) +// ScenarioFSMState initialFsmState = scenarioFSM.new ScenarioFSMState("State0_Init"); +// initialFsmState.setScenarioGraph(scenarioFSM.getScenarioGraphs().iterator().next()); +// scenarioFSM.addScenarioFSMState(initialFsmState); } /** @@ -691,7 +691,7 @@ private void generateCompleteFSMStates(Set visitedStates){ private void generateConservativeFSMStates(Set visitedStates){ String str; //Create FSM states and scenario graphs - for(ExplorationState eState: visitedStates){ + for(ExplorationState eState: visitedStates){ for(ScenarioGraph sGraph: eState.getScenarioGraphs()){ //create new FSM state str = eState.getName(); @@ -718,10 +718,11 @@ private void generateConservativeFSMStates(Set visitedStates){ } } -// //create initial state with just a random scenario graph (for the time-being) - ScenarioFSMState initialFsmState = scenarioFSM.new ScenarioFSMState("InitialState"); - initialFsmState.setScenarioGraph(scenarioFSM.getScenarioGraphs().iterator().next()); - scenarioFSM.addScenarioFSMState(initialFsmState); +// //TODO: This is temporary: create an initial fsm state and +// //assign it a random scenario graph +// ScenarioFSMState initialFsmState = scenarioFSM.new ScenarioFSMState("State0_Init"); +// initialFsmState.setScenarioGraph(scenarioFSM.getScenarioGraphs().iterator().next()); +// scenarioFSM.addScenarioFSMState(initialFsmState); } /** @@ -736,10 +737,10 @@ private void generateFSMTransitions(Set visitedStates){ //connect the initial state of the scenario FSM with //every FSM state of the initial exploration state if(eState.getName().equals("InitialState")){ - for(ScenarioFSMState targetFSMState: eState.getScenarioFSMStates()){ + for(ScenarioFSMState targetFSMState: eState.getScenarioFSMStates()){ str = "Transition"+scenarioFSM.getScenarioFSMTransitions().size(); ScenarioFSMTransition fsmTransition = scenarioFSM.new ScenarioFSMTransition(str); - fsmTransition.setSourceState(scenarioFSM.getState("InitialState")); + fsmTransition.setSourceState(scenarioFSM.getState("State0_Init")); fsmTransition.setTargetState(targetFSMState); if(fsmTransition.getSourceState()==null || fsmTransition.getTargetState()==null){ str = "generateFSMTransitions: transition has no source/target state."; @@ -747,11 +748,7 @@ private void generateFSMTransitions(Set visitedStates){ } if(!scenarioFSM.transitionExists(fsmTransition)){ scenarioFSM.addScenarioFSMTransition(fsmTransition); - } - else{ - str = "generateFSMTransitions: duplicated transitions detected."; - throw new NullPointerException(str); - } + } } } @@ -764,17 +761,10 @@ private void generateFSMTransitions(Set visitedStates){ ScenarioFSMTransition fsmTransition = scenarioFSM.new ScenarioFSMTransition(str); fsmTransition.setSourceState(srcFSMState); fsmTransition.setTargetState(targetFSMState); - ScenarioGraph srcG = srcFSMState.getScenarioGraph(); - ScenarioGraph dstG = targetFSMState.getScenarioGraph(); //check for non-existing token transition if(!scenarioFSM.transitionExists(fsmTransition)){ scenarioFSM.addScenarioFSMTransition(fsmTransition); - } -// else{ -// str = "generateFSMTransitions: duplicated transitions detected."; -// throw new NullPointerException(str); -// } - + } } } } @@ -1052,18 +1042,12 @@ public List constructConfigurationSpace(){ Set> nextConfigurations = computeNextConfigurations(state.configuration, targetFiringsList); - boolean deadEnd = true; for(Set nextConfiguration: nextConfigurations){ - //System.out.print("Testing: "+ExplorationState.getConfigurationAsString(nextConfiguration)); if(existentConfiguration(nextConfiguration)){ ExplorationState newEState = new ExplorationState(nextConfiguration,"EState"); newEState.addIncidentState(state); statesToBeVisited.add(newEState); - deadEnd = false; - //System.out.println(" -- exists."); } - //else - //System.out.println(" -- does not exist."); } @@ -1078,13 +1062,6 @@ public List constructConfigurationSpace(){ numberOfEliminatedScenarioGraphs++; } } - - if(deadEnd){ - if(state.getScenarioGraphs().size() > 0){ - //System.out.println(state.getConfigurationAsString()); - System.out.println("\t\t\t --- DeadEnd"); - } - } } } } @@ -1145,7 +1122,7 @@ public void constructConservativeFSM(){ states.removeAll(getZeroGraphStates(states)); if(states.size() == 0){ - throw new Exception("constructCompleteFSM: No states found."); + throw new Exception("constructConservativeFSM: No states found."); } //generate the FSM states @@ -1161,11 +1138,14 @@ public void constructConservativeFSM(){ } - public Set> computeNextConfigurations(Set currentConfiguration, - List> targetFiringsList){ + public Set> computeNextConfigurations( + Set currentConfiguration, + List> targetFiringsList){ + Set> nextConfigurations = new HashSet>(); - for(Set nextConfiguration: CartesianProduct.cartesianProduct(targetFiringsList)){ - System.out.println("Testing: "+ExplorationState.getConfigurationAsString(nextConfiguration)); + for(Set nextConfiguration: + CartesianProduct.cartesianProduct(targetFiringsList)){ + //System.out.println("Testing: "+ExplorationState.getConfigurationAsString(nextConfiguration)); if(existentConfiguration(nextConfiguration)){ Set newConfiguration = new HashSet(); for(FiringNode firingNode: nextConfiguration){ @@ -1183,7 +1163,7 @@ public Set> computeNextConfigurations(Set currentCon else newConfiguration.add(firingNode); } - System.out.println("ATesting: "+ExplorationState.getConfigurationAsString(newConfiguration)); + //System.out.println("ATesting: "+ExplorationState.getConfigurationAsString(newConfiguration)); nextConfigurations.add(newConfiguration); } }