diff --git a/prism/src/explicit/ECComputerDefault.java b/prism/src/explicit/ECComputerDefault.java index 324dbf16..b53639a4 100644 --- a/prism/src/explicit/ECComputerDefault.java +++ b/prism/src/explicit/ECComputerDefault.java @@ -29,7 +29,11 @@ package explicit; import java.util.ArrayList; import java.util.BitSet; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import explicit.SCCComputer.SCCMethod; @@ -52,23 +56,106 @@ public class ECComputerDefault extends ECComputer } // Methods for SCCComputer interface + // Algorithm based on the one found in Luca de Alfaro Ph.D Thesis @Override public void computeMECs() { - SCCComputer sccc = SCCComputer.createSCCComputer(SCCMethod.TARJAN, model); - sccc.computeSCCs(); + SubNondetModel submodel = null; + List L = new ArrayList(); + + BitSet initialModel = new BitSet(); + initialModel.set(0, model.getNumStates()); + L.add(initialModel); + + boolean changed = true; + while(changed) { + changed = false; + BitSet E = L.remove(0); + submodel = restrict(model, E); + List sccs = translateStates(submodel, computeSCCs(submodel)); + L = replaceEWithSCCs(L, E, sccs); + changed = canLBeChanged(L,E); + } + mecs = L; + } + + private Set processedSCCs = new HashSet(); + + private boolean canLBeChanged(List L, BitSet E) { + processedSCCs.add(E); + for(int i=0;i replaceEWithSCCs(List L, BitSet E, List sccs) { + if(sccs.size() > 0) { + List toAdd = new ArrayList(); + for(int i=0;i 0) { + L.addAll(toAdd); + } + } + return L; + } + + private SubNondetModel restrict(NondetModel model, BitSet states) { + Map actions = new HashMap(); + BitSet initialStates = new BitSet(); + initialStates.set(states.nextSetBit(0)); - List sccs = sccc.getSCCs(); + boolean changed = true; + while(changed) { + changed = false; + actions.clear(); + for(int i=0;i computeSCCs(NondetModel model) { + SCCComputer sccc = SCCComputer.createSCCComputer(SCCMethod.TARJAN, model); + sccc.computeSCCs(); + return sccc.getSCCs(); + } + + private List translateStates(SubNondetModel model, List sccs) { + List r = new ArrayList(); for(int i=0;i=0; j=set.nextSetBit(j+1)) { + set2.set(model.translateState(j)); + } } + return r; } - + @Override public List getMECs() {