Browse Source

New getIndexOfState method in prism.StateList (not tested yet).

git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@11462 bbc10eb1-c90d-0410-af57-cb519fbb1720
master
Dave Parker 10 years ago
parent
commit
fba209b7f3
  1. 7
      prism/src/prism/StateList.java
  2. 46
      prism/src/prism/StateListMTBDD.java

7
prism/src/prism/StateList.java

@ -29,6 +29,7 @@ package prism;
import java.util.List; import java.util.List;
import jdd.*; import jdd.*;
import parser.State;
import parser.Values; import parser.Values;
/** /**
@ -94,6 +95,12 @@ public interface StateList
*/ */
Values getFirstAsValues() throws PrismException; Values getFirstAsValues() throws PrismException;
/**
* Get the index of a state in the list, specified as a State object.
* Returns -1 if the state is not on the list or there is a problem with the lookup.
*/
int getIndexOfState(State state);
/** /**
* Free any memory associated with storing this list of states. * Free any memory associated with storing this list of states.
*/ */

46
prism/src/prism/StateListMTBDD.java

@ -30,6 +30,7 @@ import java.util.*;
import jdd.*; import jdd.*;
import odd.*; import odd.*;
import parser.State;
import parser.Values; import parser.Values;
import parser.VarList; import parser.VarList;
import parser.type.*; import parser.type.*;
@ -372,6 +373,51 @@ public class StateListMTBDD implements StateList
return values; return values;
} }
@Override
public int getIndexOfState(State state)
{
// Traverse BDD/ODD, top to bottom, computing index
JDDNode ptr = states;
ODDNode o = odd;
int level = 0;
int index = 0;
// Iterate through variables
int n = varList.getNumVars();
for (int i = 0; i < n; i++) {
int valInt = -1;
try {
valInt = varList.encodeToInt(i, state.varValues[i]);
} catch (PrismLangException e) {
// Problem looking up variable - bail out
return -1;
}
// Iterate through bits for this variable
int n2 = varSizes[i];
for (int j = 0; j < n2; j++) {
// Traverse BDD (need to double check state is in the set)
if (ptr.equals(JDD.ZERO)) {
return -1;
} else if (ptr.getIndex() > vars.getVarIndex(level)) {
// ptr = ptr;
} else if ((valInt & (1 << (n2-1-j))) == 0) {
ptr = ptr.getElse();
} else {
ptr.getThen();
}
level++;
// Traverse ODD (to get index)
if ((valInt & (1 << (n2-1-j))) == 0) {
o = o.getElse();
} else {
o.getThen();
index += o.getEOff();
}
}
}
return index;
}
@Override @Override
public void clear() public void clear()
{ {

Loading…
Cancel
Save