diff --git a/prism/src/mtbdd/PrismMTBDD.java b/prism/src/mtbdd/PrismMTBDD.java index 0860ba5c..937a1f3b 100644 --- a/prism/src/mtbdd/PrismMTBDD.java +++ b/prism/src/mtbdd/PrismMTBDD.java @@ -133,66 +133,239 @@ public class PrismMTBDD // reachability based stuff //------------------------------------------------------------------------------ - // reachability private static native long PM_Reachability(long trans01, long rv, int nrv, long cv, int ncv, long start); + /** + * Reachability computation, computes the set Post*(start). + *
+ * Note: For non-deterministic models, take the transition matrix + * with the non-deterministic choices removed, i.e., getTransReln(). + * + *
[ REFS: result, DEREFS: none ] + * @param trans01 the 0/1-transition matrix of the model (over rows, cols) + * @param rows the row variables of the model + * @param cols the col variables of the model + * @param start the starting states for the reachability computation + * @return the set of states that can be reached from start + */ public static JDDNode Reachability(JDDNode trans01, JDDVars rows, JDDVars cols, JDDNode start) { + if (jdd.SanityJDD.enabled) { + jdd.SanityJDD.checkIsZeroOneMTBDD(trans01); + jdd.SanityJDD.checkIsDDOverVars(trans01, rows, cols); + + jdd.SanityJDD.checkIsStateSet(start, rows); + } + long ptr = PM_Reachability(trans01.ptr(), rows.array(), rows.n(), cols.array(), cols.n(), start.ptr()); - //if (ptr == 0) throw new PrismException(getErrorMessage()); return JDD.ptrToNode(ptr); } - - // pctl until probability 1 precomputation (probabilistic/dtmc) + private static native long PM_Prob1(long trans01, long reach, long rv, int nrv, long cv, int ncv, long b1, long b2, long no); - public static JDDNode Prob1(JDDNode trans01, JDDNode reach,JDDVars rows, JDDVars cols, JDDNode b1, JDDNode b2, JDDNode no)// throws PrismException - { + /** + * PCTL until probability 1 precomputation (probabilistic/dtmc) + * + *
[ REFS: result, DEREFS: none ] + * @param trans01 the 0/1-transition matrix of the DTMC (trans01, over rows, cols) + * @param reach the set of reachable states in the DTMC + * @param rows the row variables of the model + * @param cols the col variables of the model + * @param b1 the set of b1 states (needs to be contained in reach) + * @param b2 the set of b2 states (needs to be contained in reach) + * @param no the set of states with 'P[ b1 U b2 ] = 0' + * @return the set of states with 'P[ b1 U b2 ] = 1' + */ + public static JDDNode Prob1(JDDNode trans01, JDDNode reach, JDDVars rows, JDDVars cols, JDDNode b1, JDDNode b2, JDDNode no)// throws PrismException + { + if (jdd.SanityJDD.enabled) { + jdd.SanityJDD.checkIsZeroOneMTBDD(trans01); + jdd.SanityJDD.checkIsDDOverVars(trans01, rows, cols); + + jdd.SanityJDD.checkIsStateSet(reach, rows); + + jdd.SanityJDD.checkIsStateSet(b1, rows); + jdd.SanityJDD.checkIsContainedIn(b1, reach); + + jdd.SanityJDD.checkIsStateSet(b2, rows); + jdd.SanityJDD.checkIsContainedIn(b2, reach); + + jdd.SanityJDD.checkIsStateSet(no, rows); + jdd.SanityJDD.checkIsContainedIn(no, reach); + } + long ptr = PM_Prob1(trans01.ptr(), reach.ptr(), rows.array(), rows.n(), cols.array(), cols.n(), b1.ptr(), b2.ptr(), no.ptr()); - //if (ptr == 0) throw new PrismException(getErrorMessage()); return JDD.ptrToNode(ptr); } - - // pctl until probability 0 precomputation (probabilistic/dtmc) + private static native long PM_Prob0(long trans01, long reach, long rv, int nrv, long cv, int ncv, long b1, long b2); + /** + * PCTL until probability 0 precomputation (probabilistic/dtmc) + * + *
[ REFS: result, DEREFS: none ] + * @param trans01 the 0/1-transition matrix of the DTMC (trans01, over rows, cols) + * @param reach the set of reachable states in the DTMC + * @param rows the row variables of the model + * @param cols the col variables of the model + * @param b1 the set of b1 states (needs to be contained in reach) + * @param b2 the set of b2 states (needs to be contained in reach) + * @return the set of states with 'P[ b1 U b2 ] = 0' + */ public static JDDNode Prob0(JDDNode trans01, JDDNode reach, JDDVars rows, JDDVars cols, JDDNode b1, JDDNode b2)// throws PrismException { + if (jdd.SanityJDD.enabled) { + jdd.SanityJDD.checkIsZeroOneMTBDD(trans01); + jdd.SanityJDD.checkIsDDOverVars(trans01, rows, cols); + + jdd.SanityJDD.checkIsStateSet(reach, rows); + + jdd.SanityJDD.checkIsStateSet(b1, rows); + jdd.SanityJDD.checkIsContainedIn(b1, reach); + + jdd.SanityJDD.checkIsStateSet(b2, rows); + jdd.SanityJDD.checkIsContainedIn(b2, reach); + } + long ptr = PM_Prob0(trans01.ptr(), reach.ptr(), rows.array(), rows.n(), cols.array(), cols.n(), b1.ptr(), b2.ptr()); - //if (ptr == 0) throw new PrismException(getErrorMessage()); return JDD.ptrToNode(ptr); } - - // pctl until probability 1 precomputation - there exists (nondeterministic/mdp) + private static native long PM_Prob1E(long trans01, long reach, long rv, int nrv, long cv, int ncv, long ndv, int nndv, long b1, long b2, long no); + /** + * PCTL until probability 1 precomputation - there exists (nondeterministic/mdp). + * + *
[ REFS: result, DEREFS: none ] + * @param trans01 the 0/1-transition matrix of the MDP (trans01, over rows, cols, nd) + * @param reach the set of reachable states in the MDP + * @param rows the row variables of the model + * @param cols the col variables of the model + * @param nd the nondeterministic choice variables of the model + * @param b1 the set of b1 states (needs to be contained in reach) + * @param b2 the set of b2 states (needs to be contained in reach) + * @param no the set of states with 'for all strategies P[ b1 U b2 ] = 0' (needs to be contained in reach) + * @return the set of states with 'there exists a strategy with P[ b1 U b2 ] = 1' + */ public static JDDNode Prob1E(JDDNode trans01, JDDNode reach, JDDVars rows, JDDVars cols, JDDVars nd, JDDNode b1, JDDNode b2, JDDNode no)// throws PrismException { + if (jdd.SanityJDD.enabled) { + jdd.SanityJDD.checkIsZeroOneMTBDD(trans01); + jdd.SanityJDD.checkIsDDOverVars(trans01, rows, cols, nd); + + jdd.SanityJDD.checkIsStateSet(reach, rows); + + jdd.SanityJDD.checkIsStateSet(b1, rows); + jdd.SanityJDD.checkIsContainedIn(b1, reach); + + jdd.SanityJDD.checkIsStateSet(b2, rows); + jdd.SanityJDD.checkIsContainedIn(b2, reach); + + jdd.SanityJDD.checkIsStateSet(no, rows); + jdd.SanityJDD.checkIsContainedIn(no, reach); + } + long ptr = PM_Prob1E(trans01.ptr(), reach.ptr(), rows.array(), rows.n(), cols.array(), cols.n(), nd.array(), nd.n(), b1.ptr(), b2.ptr(), no.ptr()); - //if (ptr == 0) throw new PrismException(getErrorMessage()); return JDD.ptrToNode(ptr); } - - // pctl until probability 1 precomputation - for all (nondeterministic/mdp) + private static native long PM_Prob1A(long trans01, long reach, long mask, long rv, int nrv, long cv, int ncv, long ndv, int nndv, long no, long b2); + /** + * PCTL until probability 1 precomputation - for all (nondeterministic/mdp). + * + *
[ REFS: result, DEREFS: none ] + * @param trans01 the 0/1-transition matrix of the MDP (trans01, over rows, cols, nd) + * @param reach the set of reachable states in the model + * @param nondetMask nondetMask of the model + * @param rows the row variables of the model + * @param cols the col variables of the model + * @param nd the nondeterministic choice variables of the model + * @param no the set of states with 'there exists a strategy for P[ b1 U b2 ] = 0' (needs to be contained in reach) + * @param b2 the set of b2 states (needs to be contained in reach) + * @return the set of states with 'for all strategies P[ b1 U b2 ] = 1' + */ public static JDDNode Prob1A(JDDNode trans01, JDDNode reach, JDDNode nondetMask, JDDVars rows, JDDVars cols, JDDVars nd, JDDNode no, JDDNode b2)// throws PrismException { + if (jdd.SanityJDD.enabled) { + jdd.SanityJDD.checkIsZeroOneMTBDD(trans01); + jdd.SanityJDD.checkIsDDOverVars(trans01, rows, cols, nd); + + jdd.SanityJDD.checkIsDDOverVars(nondetMask, rows, nd); + + jdd.SanityJDD.checkIsStateSet(reach, rows); + + jdd.SanityJDD.checkIsStateSet(b2, rows); + jdd.SanityJDD.checkIsContainedIn(b2, reach); + + jdd.SanityJDD.checkIsStateSet(no, rows); + jdd.SanityJDD.checkIsContainedIn(no, reach); + } long ptr = PM_Prob1A(trans01.ptr(), reach.ptr(), nondetMask.ptr(), rows.array(), rows.n(), cols.array(), cols.n(), nd.array(), nd.n(), no.ptr(), b2.ptr()); - //if (ptr == 0) throw new PrismException(getErrorMessage()); return JDD.ptrToNode(ptr); } - - // pctl until probability 0 precomputation - there exists (nondeterministic/mdp) + private static native long PM_Prob0E(long trans01, long reach, long mask, long rv, int nrv, long cv, int ncv, long ndv, int nndv, long b1, long b2); + /** + * PCTL until probability 0 precomputation - there exists (nondeterministic/mdp). + * + *
[ REFS: result, DEREFS: none ] + * @param trans01 the 0/1-transition matrix of the MDP (trans01, over rows, cols, nd) + * @param reach the set of reachable states in the model + * @param nondetMask nondetMask of the model + * @param rows the row variables of the model + * @param cols the col variables of the model + * @param nd the nondeterministic choice variables of the model + * @param b1 the set of b1 states (needs to be contained in reach) + * @param b2 the set of b2 states (needs to be contained in reach) + * @return the set of states with 'there exists a strategy with P[ b1 U b2 ] = 0' + */ public static JDDNode Prob0E(JDDNode trans01, JDDNode reach, JDDNode nondetMask, JDDVars rows, JDDVars cols, JDDVars nd, JDDNode b1, JDDNode b2)// throws PrismException { + if (jdd.SanityJDD.enabled) { + jdd.SanityJDD.checkIsZeroOneMTBDD(trans01); + jdd.SanityJDD.checkIsDDOverVars(trans01, rows, cols, nd); + + jdd.SanityJDD.checkIsDDOverVars(nondetMask, rows, nd); + + jdd.SanityJDD.checkIsStateSet(reach, rows); + + jdd.SanityJDD.checkIsStateSet(b1, rows); + jdd.SanityJDD.checkIsContainedIn(b1, reach); + + jdd.SanityJDD.checkIsStateSet(b2, rows); + jdd.SanityJDD.checkIsContainedIn(b2, reach); + } + long ptr = PM_Prob0E(trans01.ptr(), reach.ptr(), nondetMask.ptr(), rows.array(), rows.n(), cols.array(), cols.n(), nd.array(), nd.n(), b1.ptr(), b2.ptr()); - //if (ptr == 0) throw new PrismException(getErrorMessage()); return JDD.ptrToNode(ptr); } - - // pctl until probability 0 precomputation - for all (nondeterministic/mdp) + private static native long PM_Prob0A(long trans01, long reach, long rv, int nrv, long cv, int ncv, long ndv, int nndv, long b1, long b2); + /** + * PCTL until probability 0 precomputation - for all (nondeterministic/mdp). + * + *
[ REFS: result, DEREFS: none ] + * @param trans01 the 0/1-transition matrix of the MDP (trans01, over rows, cols, nd) + * @param reach the set of reachable states in the model + * @param rows the row variables of the model + * @param cols the col variables of the model + * @param nd the nondeterministic choice variables of the model + * @param b1 the set of b1 states (needs to be contained in reach) + * @param b2 the set of b2 states (needs to be contained in reach) + * @return the set of states with 'for all strategies P[ b1 U b2 ] = 0' + */ public static JDDNode Prob0A(JDDNode trans01, JDDNode reach, JDDVars rows, JDDVars cols, JDDVars nd, JDDNode b1, JDDNode b2)// throws PrismException { + if (jdd.SanityJDD.enabled) { + jdd.SanityJDD.checkIsZeroOneMTBDD(trans01); + jdd.SanityJDD.checkIsDDOverVars(trans01, rows, cols, nd); + + jdd.SanityJDD.checkIsStateSet(reach, rows); + + jdd.SanityJDD.checkIsStateSet(b1, rows); + jdd.SanityJDD.checkIsContainedIn(b1, reach); + + jdd.SanityJDD.checkIsStateSet(b2, rows); + jdd.SanityJDD.checkIsContainedIn(b2, reach); + } + long ptr = PM_Prob0A(trans01.ptr(), reach.ptr(), rows.array(), rows.n(), cols.array(), cols.n(), nd.array(), nd.n(), b1.ptr(), b2.ptr()); - //if (ptr == 0) throw new PrismException(getErrorMessage()); return JDD.ptrToNode(ptr); }