Browse Source

Reinstated trimming to two SCC computer algs (Carlos).

git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@784 bbc10eb1-c90d-0410-af57-cb519fbb1720
master
Dave Parker 18 years ago
parent
commit
abc312efee
  1. 5
      prism/src/prism/SCCComputerLockstep.java
  2. 40
      prism/src/prism/SCCComputerSCCFind.java

5
prism/src/prism/SCCComputerLockstep.java

@ -75,10 +75,10 @@ public class SCCComputerLockstep implements SCCComputer
JDD.Ref(initialNodes); JDD.Ref(initialNodes);
JDD.Ref(initialEdges); JDD.Ref(initialEdges);
tasks.push(new DecompTask(initialNodes, initialEdges)); tasks.push(new DecompTask(initialNodes, initialEdges));
JDD.Ref(initialNodes);
while (!tasks.isEmpty()) { while (!tasks.isEmpty()) {
lockstep(tasks.pop()); lockstep(tasks.pop());
} }
JDD.Ref(initialNodes);
notInSCCs = JDD.And(initialNodes, JDD.Not(allSCCs)); notInSCCs = JDD.And(initialNodes, JDD.Not(allSCCs));
log.print(" BSCCs: " + sccs.size()); log.print(" BSCCs: " + sccs.size());
log.println(" Transient states: " + JDD.GetNumMintermsString(notInSCCs, rows.n())); log.println(" Transient states: " + JDD.GetNumMintermsString(notInSCCs, rows.n()));
@ -191,13 +191,12 @@ public class SCCComputerLockstep implements SCCComputer
} */ } */
// trim nodes // trim nodes
/* JDD.Ref(edges);
JDD.Ref(edges);
nodes = trim(nodes, edges); nodes = trim(nodes, edges);
JDD.Ref(nodes); JDD.Ref(nodes);
edges = JDD.Apply(JDD.TIMES, edges, nodes); edges = JDD.Apply(JDD.TIMES, edges, nodes);
JDD.Ref(nodes); JDD.Ref(nodes);
edges = JDD.Apply(JDD.TIMES, edges, JDD.PermuteVariables(nodes, rows, cols)); edges = JDD.Apply(JDD.TIMES, edges, JDD.PermuteVariables(nodes, rows, cols));
*/
// pick a starting node // pick a starting node
JDD.Ref(nodes); JDD.Ref(nodes);

40
prism/src/prism/SCCComputerSCCFind.java

@ -71,11 +71,13 @@ public class SCCComputerSCCFind implements SCCComputer
tasks = new Stack<DecompTask>(); tasks = new Stack<DecompTask>();
JDD.Ref(initialNodes); JDD.Ref(initialNodes);
JDD.Ref(initialEdges); JDD.Ref(initialEdges);
tasks.push(new DecompTask(initialNodes, initialEdges, JDD.Constant(0), JDD.Constant(0)));
JDD.Ref(initialNodes);
JDDNode trimmedNodes = trim(initialNodes, initialEdges);
JDD.Ref(initialEdges);
tasks.push(new DecompTask(trimmedNodes, initialEdges, JDD.Constant(0), JDD.Constant(0)));
while (!tasks.isEmpty()) { while (!tasks.isEmpty()) {
sccFind(tasks.pop()); sccFind(tasks.pop());
} }
JDD.Ref(initialNodes);
notInSCCs = JDD.And(initialNodes, JDD.Not(allSCCs)); notInSCCs = JDD.And(initialNodes, JDD.Not(allSCCs));
log.print(" BSCCs: " + sccs.size()); log.print(" BSCCs: " + sccs.size());
log.println(" Transient states: " + JDD.GetNumMintermsString(notInSCCs, rows.n())); log.println(" Transient states: " + JDD.GetNumMintermsString(notInSCCs, rows.n()));
@ -112,6 +114,40 @@ public class SCCComputerSCCFind implements SCCComputer
return tmp; return tmp;
} }
// Trim nodes that have no path to a node in a nontrivial SCC
// or have no path from a node in a nontrivial SCC
// Refs: result
// Derefs: nodes, edges
private JDDNode trim(JDDNode nodes, JDDNode edges) {
JDDNode old;
JDDNode current;
JDDNode img;
JDDNode pre;
int i = 1;
JDD.Ref(nodes);
current = nodes;
do {
old = current;
JDD.Ref(current);
JDD.Ref(edges);
img = image(current, edges);
JDD.Ref(current);
JDD.Ref(edges);
pre = preimage(current, edges);
current = JDD.And(current, JDD.And(img, pre));
if (prism.getVerbose()) {
log.println("Trimming pass " + i + ":");
JDD.PrintVector(current, rows);
i++;
}
} while (!current.equals(old));
JDD.Deref(nodes);
JDD.Deref(edges);
return current;
}
// Report a SCC found by SCC-Find // Report a SCC found by SCC-Find
private void report(JDDNode nodes) private void report(JDDNode nodes)
{ {

Loading…
Cancel
Save