Browse Source

Refactor: switch from prism.DRA<BitSet> to prism.DA<BitSet, AcceptanceRabin>. Changes access to the Rabin pairs. [Joachim Klein]

git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@9578 bbc10eb1-c90d-0410-af57-cb519fbb1720
master
Dave Parker 11 years ago
parent
commit
c00ffea7d8
  1. 7
      prism/src/explicit/DTMCModelChecker.java
  2. 26
      prism/src/explicit/LTLModelChecker.java
  3. 7
      prism/src/explicit/MDPModelChecker.java
  4. 22
      prism/src/jltl2dstar/DRA.java
  5. 4
      prism/src/jltl2dstar/LTL2Rabin.java
  6. 29
      prism/src/prism/LTL2RabinLibrary.java
  7. 51
      prism/src/prism/LTLModelChecker.java
  8. 30
      prism/src/prism/MultiObjModelChecker.java
  9. 15
      prism/src/prism/NondetModelChecker.java
  10. 5
      prism/src/prism/ProbModelChecker.java

7
prism/src/explicit/DTMCModelChecker.java

@ -32,9 +32,10 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Vector; import java.util.Vector;
import acceptance.AcceptanceRabin;
import parser.ast.Expression; import parser.ast.Expression;
import parser.type.TypeDouble; import parser.type.TypeDouble;
import prism.DRA;
import prism.DA;
import prism.Pair; import prism.Pair;
import prism.PrismComponent; import prism.PrismComponent;
import prism.PrismException; import prism.PrismException;
@ -64,7 +65,7 @@ public class DTMCModelChecker extends ProbModelChecker
LTLModelChecker mcLtl; LTLModelChecker mcLtl;
StateValues probsProduct, probs; StateValues probsProduct, probs;
Expression ltl; Expression ltl;
DRA<BitSet> dra;
DA<BitSet,AcceptanceRabin> dra;
Model modelProduct; Model modelProduct;
DTMCModelChecker mcProduct; DTMCModelChecker mcProduct;
long time; long time;
@ -86,7 +87,7 @@ public class DTMCModelChecker extends ProbModelChecker
time = System.currentTimeMillis(); time = System.currentTimeMillis();
dra = LTLModelChecker.convertLTLFormulaToDRA(ltl); dra = LTLModelChecker.convertLTLFormulaToDRA(ltl);
int draSize = dra.size(); int draSize = dra.size();
mainLog.println("DRA has " + dra.size() + " states, " + dra.getNumAcceptancePairs() + " pairs.");
mainLog.println("DRA has " + dra.size() + " states, " + dra.getAcceptance().getSizeStatistics() + ".");
time = System.currentTimeMillis() - time; time = System.currentTimeMillis() - time;
mainLog.println("Time for Rabin translation: " + time / 1000.0 + " seconds."); mainLog.println("Time for Rabin translation: " + time / 1000.0 + " seconds.");
// If required, export DRA // If required, export DRA

26
prism/src/explicit/LTLModelChecker.java

@ -36,8 +36,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Vector; import java.util.Vector;
import acceptance.AcceptanceRabin;
import common.IterableStateSet; import common.IterableStateSet;
import parser.ast.Expression; import parser.ast.Expression;
import parser.ast.ExpressionBinaryOp; import parser.ast.ExpressionBinaryOp;
import parser.ast.ExpressionLabel; import parser.ast.ExpressionLabel;
@ -45,7 +45,7 @@ import parser.ast.ExpressionTemporal;
import parser.ast.ExpressionUnaryOp; import parser.ast.ExpressionUnaryOp;
import parser.type.TypeBool; import parser.type.TypeBool;
import parser.type.TypePathBool; import parser.type.TypePathBool;
import prism.DRA;
import prism.DA;
import prism.LTL2RabinLibrary; import prism.LTL2RabinLibrary;
import prism.Pair; import prism.Pair;
import prism.PrismComponent; import prism.PrismComponent;
@ -68,7 +68,7 @@ public class LTLModelChecker extends PrismComponent
* Convert an LTL formula into a DRA. The LTL formula is represented as a PRISM Expression, * Convert an LTL formula into a DRA. The LTL formula is represented as a PRISM Expression,
* in which atomic propositions are represented by ExpressionLabel objects. * in which atomic propositions are represented by ExpressionLabel objects.
*/ */
public static DRA<BitSet> convertLTLFormulaToDRA(Expression ltl) throws PrismException
public static DA<BitSet,AcceptanceRabin> convertLTLFormulaToDRA(Expression ltl) throws PrismException
{ {
return LTL2RabinLibrary.convertLTLFormulaToDRA(ltl); return LTL2RabinLibrary.convertLTLFormulaToDRA(ltl);
} }
@ -135,7 +135,7 @@ public class LTLModelChecker extends PrismComponent
* @param statesOfInterest the set of states for which values should be calculated (null = all states) * @param statesOfInterest the set of states for which values should be calculated (null = all states)
* @return The product DTMC and a list of each of its states (s,q), encoded as (s * draSize + q) * @return The product DTMC and a list of each of its states (s,q), encoded as (s * draSize + q)
*/ */
public Pair<Model, int[]> constructProductMC(DRA<BitSet> dra, DTMC dtmc, Vector<BitSet> labelBS, BitSet statesOfInterest) throws PrismException
public Pair<Model, int[]> constructProductMC(DA<BitSet,AcceptanceRabin> dra, DTMC dtmc, Vector<BitSet> labelBS, BitSet statesOfInterest) throws PrismException
{ {
DTMCSimple prodModel = new DTMCSimple(); DTMCSimple prodModel = new DTMCSimple();
@ -226,7 +226,7 @@ public class LTLModelChecker extends PrismComponent
* @param statesOfInterest the set of states for which values should be calculated (null = all states) * @param statesOfInterest the set of states for which values should be calculated (null = all states)
* @return The product MDP and a list of each of its states (s,q), encoded as (s * draSize + q) * @return The product MDP and a list of each of its states (s,q), encoded as (s * draSize + q)
*/ */
public Pair<NondetModel, int[]> constructProductMDP(DRA<BitSet> dra, MDP mdp, Vector<BitSet> labelBS, BitSet statesOfInterest) throws PrismException
public Pair<NondetModel, int[]> constructProductMDP(DA<BitSet,AcceptanceRabin> dra, MDP mdp, Vector<BitSet> labelBS, BitSet statesOfInterest) throws PrismException
{ {
MDPSimple prodModel = new MDPSimple(); MDPSimple prodModel = new MDPSimple();
@ -320,7 +320,7 @@ public class LTLModelChecker extends PrismComponent
* @param model The model * @param model The model
* @param invMap The map returned by the constructProduct method(s) * @param invMap The map returned by the constructProduct method(s)
*/ */
public BitSet findAcceptingBSCCsForRabin(DRA<BitSet> dra, Model model, int invMap[]) throws PrismException
public BitSet findAcceptingBSCCsForRabin(DA<BitSet,AcceptanceRabin> dra, Model model, int invMap[]) throws PrismException
{ {
// Compute bottom strongly connected components (BSCCs) // Compute bottom strongly connected components (BSCCs)
SCCComputer sccComputer = SCCComputer.createSCCComputer(this, model); SCCComputer sccComputer = SCCComputer.createSCCComputer(this, model);
@ -328,7 +328,7 @@ public class LTLModelChecker extends PrismComponent
List<BitSet> bsccs = sccComputer.getBSCCs(); List<BitSet> bsccs = sccComputer.getBSCCs();
int draSize = dra.size(); int draSize = dra.size();
int numAcceptancePairs = dra.getNumAcceptancePairs();
int numAcceptancePairs = dra.getAcceptance().size();
BitSet result = new BitSet(); BitSet result = new BitSet();
for (BitSet bscc : bsccs) { for (BitSet bscc : bsccs) {
@ -337,8 +337,8 @@ public class LTLModelChecker extends PrismComponent
boolean isLEmpty = true; boolean isLEmpty = true;
boolean isKEmpty = true; boolean isKEmpty = true;
BitSet L = dra.getAcceptanceL(acceptancePair);
BitSet K = dra.getAcceptanceK(acceptancePair);
BitSet L = dra.getAcceptance().get(acceptancePair).getL();
BitSet K = dra.getAcceptance().get(acceptancePair).getK();
for (int state = bscc.nextSetBit(0); state != -1; state = bscc.nextSetBit(state + 1)) { for (int state = bscc.nextSetBit(0); state != -1; state = bscc.nextSetBit(state + 1)) {
int draState = invMap[state] % draSize; int draState = invMap[state] % draSize;
isLEmpty &= !L.get(draState); isLEmpty &= !L.get(draState);
@ -362,16 +362,16 @@ public class LTLModelChecker extends PrismComponent
* @param model The model * @param model The model
* @param invMap The map returned by the constructProduct method(s) * @param invMap The map returned by the constructProduct method(s)
*/ */
public BitSet findAcceptingECStatesForRabin(DRA<BitSet> dra, NondetModel model, int invMap[]) throws PrismException
public BitSet findAcceptingECStatesForRabin(DA<BitSet,AcceptanceRabin> dra, NondetModel model, int invMap[]) throws PrismException
{ {
BitSet allAcceptingStates = new BitSet(); BitSet allAcceptingStates = new BitSet();
int numStates = model.getNumStates(); int numStates = model.getNumStates();
int draSize = dra.size(); int draSize = dra.size();
// Go through the DRA acceptance pairs (L_i, K_i) // Go through the DRA acceptance pairs (L_i, K_i)
for (int i = 0; i < dra.getNumAcceptancePairs(); i++) {
for (int i = 0; i < dra.getAcceptance().size(); i++) {
// Find model states *not* satisfying L_i // Find model states *not* satisfying L_i
BitSet bitsetLi = dra.getAcceptanceL(i);
BitSet bitsetLi = dra.getAcceptance().get(i).getL();
BitSet statesLi_not = new BitSet(); BitSet statesLi_not = new BitSet();
for (int s = 0; s < numStates; s++) { for (int s = 0; s < numStates; s++) {
if (!bitsetLi.get(invMap[s] % draSize)) { if (!bitsetLi.get(invMap[s] % draSize)) {
@ -386,7 +386,7 @@ public class LTLModelChecker extends PrismComponent
ecComputer.computeMECStates(statesLi_not); ecComputer.computeMECStates(statesLi_not);
List<BitSet> mecs = ecComputer.getMECStates(); List<BitSet> mecs = ecComputer.getMECStates();
// Check with MECs contain a K_i state // Check with MECs contain a K_i state
BitSet bitsetKi = dra.getAcceptanceK(i);
BitSet bitsetKi = dra.getAcceptance().get(i).getK();
for (BitSet mec : mecs) { for (BitSet mec : mecs) {
for (int s = mec.nextSetBit(0); s != -1; s = mec.nextSetBit(s + 1)) { for (int s = mec.nextSetBit(0); s != -1; s = mec.nextSetBit(s + 1)) {
if (bitsetKi.get(invMap[s] % draSize)) { if (bitsetKi.get(invMap[s] % draSize)) {

7
prism/src/explicit/MDPModelChecker.java

@ -32,8 +32,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Vector; import java.util.Vector;
import acceptance.AcceptanceRabin;
import parser.ast.Expression; import parser.ast.Expression;
import prism.DRA;
import prism.DA;
import prism.Pair; import prism.Pair;
import prism.PrismComponent; import prism.PrismComponent;
import prism.PrismDevNullLog; import prism.PrismDevNullLog;
@ -67,7 +68,7 @@ public class MDPModelChecker extends ProbModelChecker
LTLModelChecker mcLtl; LTLModelChecker mcLtl;
StateValues probsProduct, probs; StateValues probsProduct, probs;
Expression ltl; Expression ltl;
DRA<BitSet> dra;
DA<BitSet,AcceptanceRabin> dra;
NondetModel modelProduct; NondetModel modelProduct;
MDPModelChecker mcProduct; MDPModelChecker mcProduct;
long time; long time;
@ -94,7 +95,7 @@ public class MDPModelChecker extends ProbModelChecker
time = System.currentTimeMillis(); time = System.currentTimeMillis();
dra = LTLModelChecker.convertLTLFormulaToDRA(ltl); dra = LTLModelChecker.convertLTLFormulaToDRA(ltl);
int draSize = dra.size(); int draSize = dra.size();
mainLog.println("DRA has " + dra.size() + " states, " + dra.getNumAcceptancePairs() + " pairs.");
mainLog.println("DRA has " + dra.size() + " states, " + dra.getAcceptance().getSizeStatistics() + ".");
time = System.currentTimeMillis() - time; time = System.currentTimeMillis() - time;
mainLog.println("Time for Rabin translation: " + time / 1000.0 + " seconds."); mainLog.println("Time for Rabin translation: " + time / 1000.0 + " seconds.");
// If required, export DRA // If required, export DRA

22
prism/src/jltl2dstar/DRA.java

@ -26,9 +26,9 @@ import java.io.FileWriter;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.*; import java.util.*;
import acceptance.AcceptanceRabin;
import jltl2ba.APElement; import jltl2ba.APElement;
import jltl2ba.APSet; import jltl2ba.APSet;
import prism.PrismException; import prism.PrismException;
/** /**
@ -146,17 +146,18 @@ public class DRA extends DA {
/** /**
* Convert the DRA from jltl2dstar to PRISM data structures. * Convert the DRA from jltl2dstar to PRISM data structures.
*/ */
public prism.DRA<BitSet> createPrismDRA() throws PrismException
public prism.DA<BitSet,AcceptanceRabin> createPrismDRA() throws PrismException
{ {
int i, k, numLabels, numStates, src, dest; int i, k, numLabels, numStates, src, dest;
List<String> apList; List<String> apList;
BitSet bitset, bitset2;
BitSet bitset;
RabinAcceptance acc; RabinAcceptance acc;
prism.DRA<BitSet> draNew;
prism.DA<BitSet,AcceptanceRabin> draNew;
AcceptanceRabin accNew = new AcceptanceRabin();
numLabels = getAPSize(); numLabels = getAPSize();
numStates = size(); numStates = size();
draNew = new prism.DRA<BitSet>(numStates);
draNew = new prism.DA<BitSet,AcceptanceRabin>(numStates);
// Copy AP set // Copy AP set
apList = new ArrayList<String>(numLabels); apList = new ArrayList<String>(numLabels);
for (i = 0; i < numLabels; i++) { for (i = 0; i < numLabels; i++) {
@ -181,14 +182,15 @@ public class DRA extends DA {
// Copy acceptance pairs // Copy acceptance pairs
acc = acceptance(); acc = acceptance();
for (i = 0; i < acc.size(); i++) { for (i = 0; i < acc.size(); i++) {
bitset = new BitSet();
bitset.or(acc.getAcceptance_U(i));
bitset2 = new BitSet();
bitset2.or(acc.getAcceptance_L(i));
// Note: Pairs (U_i,L_i) become (L_i,K_i) in PRISM's notation // Note: Pairs (U_i,L_i) become (L_i,K_i) in PRISM's notation
draNew.addAcceptancePair(bitset, bitset2);
BitSet newL = (BitSet)acc.getAcceptance_U(i).clone();
BitSet newK = (BitSet)acc.getAcceptance_L(i).clone();
AcceptanceRabin.RabinPair pair = new AcceptanceRabin.RabinPair(newL, newK);
accNew.add(pair);
} }
draNew.setAcceptance(accNew);
return draNew; return draNew;
} }

4
prism/src/jltl2dstar/LTL2Rabin.java

@ -27,9 +27,11 @@ import prism.PrismException;
import java.util.BitSet; import java.util.BitSet;
import acceptance.AcceptanceRabin;
public class LTL2Rabin { public class LTL2Rabin {
public static prism.DRA<BitSet> ltl2rabin(SimpleLTL ltlFormula) throws PrismException {
public static prism.DA<BitSet,AcceptanceRabin> ltl2rabin(SimpleLTL ltlFormula) throws PrismException {
SimpleLTL ltl = ltlFormula.simplify(); SimpleLTL ltl = ltlFormula.simplify();
return ltl2rabin(ltl, ltl.getAPs()).createPrismDRA(); return ltl2rabin(ltl, ltl.getAPs()).createPrismDRA();
} }

29
prism/src/prism/LTL2RabinLibrary.java

@ -29,6 +29,8 @@ package prism;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import acceptance.AcceptanceRabin;
import acceptance.AcceptanceRabin.RabinPair;
import jltl2dstar.*; import jltl2dstar.*;
import parser.ast.*; import parser.ast.*;
import parser.visitor.ASTTraverse; import parser.visitor.ASTTraverse;
@ -65,7 +67,7 @@ public class LTL2RabinLibrary
* Convert an LTL formula into a DRA. The LTL formula is represented as a PRISM Expression, * Convert an LTL formula into a DRA. The LTL formula is represented as a PRISM Expression,
* in which atomic propositions are represented by ExpressionLabel objects. * in which atomic propositions are represented by ExpressionLabel objects.
*/ */
public static DRA<BitSet> convertLTLFormulaToDRA(Expression ltl) throws PrismException
public static DA<BitSet, AcceptanceRabin> convertLTLFormulaToDRA(Expression ltl) throws PrismException
{ {
// Get list of labels appearing // Get list of labels appearing
labels = new ArrayList<String>(); labels = new ArrayList<String>();
@ -104,17 +106,19 @@ public class LTL2RabinLibrary
* Create a DRA from a string, e.g.: * Create a DRA from a string, e.g.:
* "2 states (start 0), 1 labels: 0-{0}->1 0-{}->0 1-{0}->1 1-{}->0; 1 acceptance pairs: ({},{1})" * "2 states (start 0), 1 labels: 0-{0}->1 0-{}->0 1-{0}->1 1-{}->0; 1 acceptance pairs: ({},{1})"
*/ */
private static DRA<BitSet> createDRAFromString(String s, List<String> labels) throws PrismException
private static DA<BitSet,AcceptanceRabin> createDRAFromString(String s, List<String> labels) throws PrismException
{ {
int ptr = 0, i, j, k, n, from, to; int ptr = 0, i, j, k, n, from, to;
String bs; String bs;
prism.DRA<BitSet> draNew;
DA<BitSet,AcceptanceRabin> draNew;
AcceptanceRabin acceptance = new AcceptanceRabin();
try { try {
// Num states // Num states
j = s.indexOf("states", ptr); j = s.indexOf("states", ptr);
n = Integer.parseInt(s.substring(0, j).trim()); n = Integer.parseInt(s.substring(0, j).trim());
draNew = new prism.DRA<BitSet>(n);
draNew = new DA<BitSet,AcceptanceRabin>(n);
draNew.setAcceptance(acceptance);
draNew.setAPList(labels); draNew.setAPList(labels);
// Start state // Start state
i = s.indexOf("start", j) + 6; i = s.indexOf("start", j) + 6;
@ -141,7 +145,9 @@ public class LTL2RabinLibrary
while (i != -1) { while (i != -1) {
j = s.indexOf("},{", i); j = s.indexOf("},{", i);
k = s.indexOf("})", j); k = s.indexOf("})", j);
draNew.addAcceptancePair(createBitSetFromString(s.substring(i + 2, j)), createBitSetFromString(s.substring(j + 3, k)));
BitSet L = createBitSetFromString(s.substring(i + 2, j));
BitSet K = createBitSetFromString(s.substring(j + 3, k));
acceptance.add(new AcceptanceRabin.RabinPair(L,K));
i = s.indexOf("({", k); i = s.indexOf("({", k);
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
@ -170,15 +176,16 @@ public class LTL2RabinLibrary
} }
// Example: manual creation of DRA for: !(F ("L0"&(X "L1"))) // Example: manual creation of DRA for: !(F ("L0"&(X "L1")))
public static DRA<BitSet> draForNotFaCb(String l0, String l1) throws PrismException
public static DA<BitSet,AcceptanceRabin> draForNotFaCb(String l0, String l1) throws PrismException
{ {
int numStates; int numStates;
List<String> apList; List<String> apList;
prism.DRA<BitSet> draNew;
DA<BitSet,AcceptanceRabin> draNew;
// 4 states (start 3), 2 labels: 0-{1}->0 0-{0, 1}->1 0-{}->0 0-{0}->1 1-{1}->2 1-{0, 1}->2 1-{}->0 1-{0}->1 2-{1}->2 2-{0, 1}->2 2-{}->2 2-{0}->2 3-{1}->0 3-{0, 1}->1 3-{}->0 3-{0}->1; 1 acceptance pairs: ({2},{0, 1}) // 4 states (start 3), 2 labels: 0-{1}->0 0-{0, 1}->1 0-{}->0 0-{0}->1 1-{1}->2 1-{0, 1}->2 1-{}->0 1-{0}->1 2-{1}->2 2-{0, 1}->2 2-{}->2 2-{0}->2 3-{1}->0 3-{0, 1}->1 3-{}->0 3-{0}->1; 1 acceptance pairs: ({2},{0, 1})
numStates = 4; numStates = 4;
draNew = new prism.DRA<BitSet>(numStates);
draNew = new DA<BitSet,AcceptanceRabin>(numStates);
draNew.setAcceptance(new AcceptanceRabin());
// AP set // AP set
apList = new ArrayList<String>(2); apList = new ArrayList<String>(2);
apList.add(l0); apList.add(l0);
@ -219,7 +226,7 @@ public class LTL2RabinLibrary
BitSet bitsetK = new BitSet(); BitSet bitsetK = new BitSet();
bitsetK.set(01); bitsetK.set(01);
bitsetK.set(1); bitsetK.set(1);
draNew.addAcceptancePair(bitsetL, bitsetK);
draNew.getAcceptance().add(new AcceptanceRabin.RabinPair(bitsetL, bitsetK));
return draNew; return draNew;
} }
@ -241,9 +248,9 @@ public class LTL2RabinLibrary
System.out.println(ltl); System.out.println(ltl);
System.out.println(expr.toString()); System.out.println(expr.toString());
System.out.println(ltl.equals(expr.toString())); System.out.println(ltl.equals(expr.toString()));
DRA<BitSet> dra1 = jltl2dstar.LTL2Rabin.ltl2rabin(expr.convertForJltl2ba());
DA<BitSet,AcceptanceRabin> dra1 = jltl2dstar.LTL2Rabin.ltl2rabin(expr.convertForJltl2ba());
System.out.println(dra1); System.out.println(dra1);
DRA<BitSet> dra2 = convertLTLFormulaToDRA(expr);
DA<BitSet,AcceptanceRabin> dra2 = convertLTLFormulaToDRA(expr);
System.out.println(dra2); System.out.println(dra2);
System.out.println(dra1.toString().equals(dra2.toString())); System.out.println(dra1.toString().equals(dra2.toString()));
//dra2.printDot(new PrintStream(new File("dra"))); //dra2.printDot(new PrintStream(new File("dra")));

51
prism/src/prism/LTLModelChecker.java

@ -32,6 +32,7 @@ import java.util.BitSet;
import java.util.List; import java.util.List;
import java.util.Vector; import java.util.Vector;
import acceptance.AcceptanceRabin;
import jdd.JDD; import jdd.JDD;
import jdd.JDDNode; import jdd.JDDNode;
import jdd.JDDVars; import jdd.JDDVars;
@ -63,7 +64,7 @@ public class LTLModelChecker extends PrismComponent
* Convert an LTL formula into a DRA. The LTL formula is represented as a PRISM Expression, * Convert an LTL formula into a DRA. The LTL formula is represented as a PRISM Expression,
* in which atomic propositions are represented by ExpressionLabel objects. * in which atomic propositions are represented by ExpressionLabel objects.
*/ */
public static DRA<BitSet> convertLTLFormulaToDRA(Expression ltl) throws PrismException
public static DA<BitSet,AcceptanceRabin> convertLTLFormulaToDRA(Expression ltl) throws PrismException
{ {
return LTL2RabinLibrary.convertLTLFormulaToDRA(ltl); return LTL2RabinLibrary.convertLTLFormulaToDRA(ltl);
} }
@ -129,7 +130,7 @@ public class LTLModelChecker extends PrismComponent
* @param model The DTMC/CTMC * @param model The DTMC/CTMC
* @param labelDDs BDDs giving the set of states for each AP in the DRA * @param labelDDs BDDs giving the set of states for each AP in the DRA
*/ */
public ProbModel constructProductMC(DRA<BitSet> dra, ProbModel model, Vector<JDDNode> labelDDs) throws PrismException
public ProbModel constructProductMC(DA<BitSet,AcceptanceRabin> dra, ProbModel model, Vector<JDDNode> labelDDs) throws PrismException
{ {
return constructProductMC(dra, model, labelDDs, null, null, true); return constructProductMC(dra, model, labelDDs, null, null, true);
} }
@ -142,7 +143,7 @@ public class LTLModelChecker extends PrismComponent
* @param draDDRowVarsCopy (Optionally) empty JDDVars object to obtain copy of DD row vars for DRA * @param draDDRowVarsCopy (Optionally) empty JDDVars object to obtain copy of DD row vars for DRA
* @param draDDColVarsCopy (Optionally) empty JDDVars object to obtain copy of DD col vars for DRA * @param draDDColVarsCopy (Optionally) empty JDDVars object to obtain copy of DD col vars for DRA
*/ */
public ProbModel constructProductMC(DRA<BitSet> dra, ProbModel model, Vector<JDDNode> labelDDs, JDDVars draDDRowVarsCopy, JDDVars draDDColVarsCopy)
public ProbModel constructProductMC(DA<BitSet,AcceptanceRabin> dra, ProbModel model, Vector<JDDNode> labelDDs, JDDVars draDDRowVarsCopy, JDDVars draDDColVarsCopy)
throws PrismException throws PrismException
{ {
return constructProductMC(dra, model, labelDDs, draDDRowVarsCopy, draDDColVarsCopy, true); return constructProductMC(dra, model, labelDDs, draDDRowVarsCopy, draDDColVarsCopy, true);
@ -158,7 +159,7 @@ public class LTLModelChecker extends PrismComponent
* @param allInit Do we assume that all states of the original model are initial states? * @param allInit Do we assume that all states of the original model are initial states?
* (just for the purposes of reachability) * (just for the purposes of reachability)
*/ */
public ProbModel constructProductMC(DRA<BitSet> dra, ProbModel model, Vector<JDDNode> labelDDs, JDDVars draDDRowVarsCopy, JDDVars draDDColVarsCopy,
public ProbModel constructProductMC(DA<BitSet,AcceptanceRabin> dra, ProbModel model, Vector<JDDNode> labelDDs, JDDVars draDDRowVarsCopy, JDDVars draDDColVarsCopy,
boolean allInit) throws PrismException boolean allInit) throws PrismException
{ {
// Existing model - dds, vars, etc. // Existing model - dds, vars, etc.
@ -329,7 +330,7 @@ public class LTLModelChecker extends PrismComponent
* @param model The MDP * @param model The MDP
* @param labelDDs BDDs giving the set of states for each AP in the DRA * @param labelDDs BDDs giving the set of states for each AP in the DRA
*/ */
public NondetModel constructProductMDP(DRA<BitSet> dra, NondetModel model, Vector<JDDNode> labelDDs) throws PrismException
public NondetModel constructProductMDP(DA<BitSet,AcceptanceRabin> dra, NondetModel model, Vector<JDDNode> labelDDs) throws PrismException
{ {
return constructProductMDP(dra, model, labelDDs, null, null, true, null); return constructProductMDP(dra, model, labelDDs, null, null, true, null);
} }
@ -342,7 +343,7 @@ public class LTLModelChecker extends PrismComponent
* @param draDDRowVarsCopy (Optionally) empty JDDVars object to obtain copy of DD row vars for DRA * @param draDDRowVarsCopy (Optionally) empty JDDVars object to obtain copy of DD row vars for DRA
* @param draDDColVarsCopy (Optionally) empty JDDVars object to obtain copy of DD col vars for DRA * @param draDDColVarsCopy (Optionally) empty JDDVars object to obtain copy of DD col vars for DRA
*/ */
public NondetModel constructProductMDP(DRA<BitSet> dra, NondetModel model, Vector<JDDNode> labelDDs, JDDVars draDDRowVarsCopy, JDDVars draDDColVarsCopy)
public NondetModel constructProductMDP(DA<BitSet,AcceptanceRabin> dra, NondetModel model, Vector<JDDNode> labelDDs, JDDVars draDDRowVarsCopy, JDDVars draDDColVarsCopy)
throws PrismException throws PrismException
{ {
return constructProductMDP(dra, model, labelDDs, draDDRowVarsCopy, draDDColVarsCopy, true, null); return constructProductMDP(dra, model, labelDDs, draDDRowVarsCopy, draDDColVarsCopy, true, null);
@ -360,7 +361,7 @@ public class LTLModelChecker extends PrismComponent
* @param init The initial state(s) (of the original model) used to build the product; * @param init The initial state(s) (of the original model) used to build the product;
* if null; we just take the existing initial states from model.getStart(). * if null; we just take the existing initial states from model.getStart().
*/ */
public NondetModel constructProductMDP(DRA<BitSet> dra, NondetModel model, Vector<JDDNode> labelDDs, JDDVars draDDRowVarsCopy, JDDVars draDDColVarsCopy,
public NondetModel constructProductMDP(DA<BitSet,AcceptanceRabin> dra, NondetModel model, Vector<JDDNode> labelDDs, JDDVars draDDRowVarsCopy, JDDVars draDDColVarsCopy,
boolean allInit, JDDNode init) throws PrismException boolean allInit, JDDNode init) throws PrismException
{ {
// Existing model - dds, vars, etc. // Existing model - dds, vars, etc.
@ -551,7 +552,7 @@ public class LTLModelChecker extends PrismComponent
* So the BDD is over column variables for model states (permuted from those found in the BDDs in * So the BDD is over column variables for model states (permuted from those found in the BDDs in
* {@code labelDDs}) and row/col variables for the DRA (from {@code draDDRowVars}, {@code draDDColVars}). * {@code labelDDs}) and row/col variables for the DRA (from {@code draDDRowVars}, {@code draDDColVars}).
*/ */
public JDDNode buildTransMask(DRA<BitSet> dra, Vector<JDDNode> labelDDs, JDDVars allDDRowVars, JDDVars allDDColVars, JDDVars draDDRowVars,
public JDDNode buildTransMask(DA<BitSet,AcceptanceRabin> dra, Vector<JDDNode> labelDDs, JDDVars allDDRowVars, JDDVars allDDColVars, JDDVars draDDRowVars,
JDDVars draDDColVars) JDDVars draDDColVars)
{ {
JDDNode draMask, label, exprBDD, transition; JDDNode draMask, label, exprBDD, transition;
@ -595,7 +596,7 @@ public class LTLModelChecker extends PrismComponent
* So the BDD is over row variables for model states (as found in the BDDs in {@code labelDDs}) * So the BDD is over row variables for model states (as found in the BDDs in {@code labelDDs})
* and row variables for the DRA (from {@code draDDRowVars}). * and row variables for the DRA (from {@code draDDRowVars}).
*/ */
public JDDNode buildStartMask(DRA<BitSet> dra, Vector<JDDNode> labelDDs, JDDVars draDDRowVars)
public JDDNode buildStartMask(DA<BitSet,AcceptanceRabin> dra, Vector<JDDNode> labelDDs, JDDVars draDDRowVars)
{ {
JDDNode startMask, label, exprBDD, dest, tmp; JDDNode startMask, label, exprBDD, dest, tmp;
int i, j, k, numAPs, numEdges; int i, j, k, numAPs, numEdges;
@ -636,9 +637,9 @@ public class LTLModelChecker extends PrismComponent
* the set L_i from the i-th pair (L_i,K_i) of the acceptance condition for a DRA. * the set L_i from the i-th pair (L_i,K_i) of the acceptance condition for a DRA.
* @param complement If true, build the complement of the set L_i instead * @param complement If true, build the complement of the set L_i instead
*/ */
public JDDNode buildLStatesForRabinPair(JDDVars draDDRowVars, DRA<BitSet> dra, int i, boolean complement)
public JDDNode buildLStatesForRabinPair(JDDVars draDDRowVars, DA<BitSet,AcceptanceRabin> dra, int i, boolean complement)
{ {
BitSet bitsetLi = dra.getAcceptanceL(i);
BitSet bitsetLi = dra.getAcceptance().get(i).getL();
JDDNode statesLi = JDD.Constant(0); JDDNode statesLi = JDD.Constant(0);
for (int j = 0; j < dra.size(); j++) { for (int j = 0; j < dra.size(); j++) {
if (bitsetLi.get(j) ^ complement) { if (bitsetLi.get(j) ^ complement) {
@ -652,9 +653,9 @@ public class LTLModelChecker extends PrismComponent
* Build a (referenced) BDD over variables {@code draDDRowVars} representing * Build a (referenced) BDD over variables {@code draDDRowVars} representing
* the set K_i from the i-th pair (L_i,K_i) of the acceptance condition for a DRA. * the set K_i from the i-th pair (L_i,K_i) of the acceptance condition for a DRA.
*/ */
public JDDNode buildKStatesForRabinPair(JDDVars draDDRowVars, DRA<BitSet> dra, int i)
public JDDNode buildKStatesForRabinPair(JDDVars draDDRowVars, DA<BitSet,AcceptanceRabin> dra, int i)
{ {
BitSet bitsetKi = dra.getAcceptanceK(i);
BitSet bitsetKi = dra.getAcceptance().get(i).getK();
JDDNode statesKi = JDD.Constant(0); JDDNode statesKi = JDD.Constant(0);
for (int j = 0; j < dra.size(); j++) { for (int j = 0; j < dra.size(); j++) {
if (bitsetKi.get(j)) { if (bitsetKi.get(j)) {
@ -672,7 +673,7 @@ public class LTLModelChecker extends PrismComponent
* @param model The model * @param model The model
* @return A referenced BDD for the union of all states in accepting BSCCs * @return A referenced BDD for the union of all states in accepting BSCCs
*/ */
public JDDNode findAcceptingBSCCsForRabin(DRA<BitSet> dra, ProbModel model, JDDVars draDDRowVars, JDDVars draDDColVars) throws PrismException
public JDDNode findAcceptingBSCCsForRabin(DA<BitSet,AcceptanceRabin> dra, ProbModel model, JDDVars draDDRowVars, JDDVars draDDColVars) throws PrismException
{ {
JDDNode allAcceptingStates; JDDNode allAcceptingStates;
List<JDDNode> vectBSCCs; List<JDDNode> vectBSCCs;
@ -688,7 +689,7 @@ public class LTLModelChecker extends PrismComponent
// Build BDDs for !L_i and K_i // Build BDDs for !L_i and K_i
ArrayList<JDDNode> statesL_not = new ArrayList<JDDNode>(); ArrayList<JDDNode> statesL_not = new ArrayList<JDDNode>();
ArrayList<JDDNode> statesK = new ArrayList<JDDNode>(); ArrayList<JDDNode> statesK = new ArrayList<JDDNode>();
for (i = 0; i < dra.getNumAcceptancePairs(); i++) {
for (i = 0; i < dra.getAcceptance().size(); i++) {
statesL_not.add(buildLStatesForRabinPair(draDDRowVars, dra, i, true)); statesL_not.add(buildLStatesForRabinPair(draDDRowVars, dra, i, true));
statesK.add(buildKStatesForRabinPair(draDDRowVars, dra, i)); statesK.add(buildKStatesForRabinPair(draDDRowVars, dra, i));
} }
@ -696,7 +697,7 @@ public class LTLModelChecker extends PrismComponent
// Go through the BSCCs // Go through the BSCCs
for (JDDNode bscc : vectBSCCs) { for (JDDNode bscc : vectBSCCs) {
// Go through the DRA acceptance pairs (L_i, K_i) // Go through the DRA acceptance pairs (L_i, K_i)
for (i = 0; i < dra.getNumAcceptancePairs(); i++) {
for (i = 0; i < dra.getAcceptance().size(); i++) {
// Check each BSCC for inclusion in !L_i and intersection with K_i // Check each BSCC for inclusion in !L_i and intersection with K_i
if (JDD.IsContainedIn(bscc, statesL_not.get(i)) && JDD.AreInterecting(bscc, statesK.get(i))) { if (JDD.IsContainedIn(bscc, statesL_not.get(i)) && JDD.AreInterecting(bscc, statesK.get(i))) {
// This BSCC is accepting: add and move on onto next one // This BSCC is accepting: add and move on onto next one
@ -726,7 +727,7 @@ public class LTLModelChecker extends PrismComponent
* @param fairness Consider fairness? * @param fairness Consider fairness?
* @return A referenced BDD for the union of all states in accepting MECs * @return A referenced BDD for the union of all states in accepting MECs
*/ */
public JDDNode findAcceptingECStatesForRabin(DRA<BitSet> dra, NondetModel model, JDDVars draDDRowVars, JDDVars draDDColVars, boolean fairness)
public JDDNode findAcceptingECStatesForRabin(DA<BitSet,AcceptanceRabin> dra, NondetModel model, JDDVars draDDRowVars, JDDVars draDDColVars, boolean fairness)
throws PrismException throws PrismException
{ {
JDDNode acceptingStates = null, allAcceptingStates, acceptanceVector_L_not, acceptanceVector_K, candidateStates; JDDNode acceptingStates = null, allAcceptingStates, acceptanceVector_L_not, acceptanceVector_K, candidateStates;
@ -734,13 +735,13 @@ public class LTLModelChecker extends PrismComponent
allAcceptingStates = JDD.Constant(0); allAcceptingStates = JDD.Constant(0);
if (dra.getNumAcceptancePairs() > 1) {
if (dra.getAcceptance().size() > 1) {
acceptanceVector_L_not = JDD.Constant(0); acceptanceVector_L_not = JDD.Constant(0);
acceptanceVector_K = JDD.Constant(0); acceptanceVector_K = JDD.Constant(0);
ArrayList<JDDNode> statesLnot = new ArrayList<JDDNode>(); ArrayList<JDDNode> statesLnot = new ArrayList<JDDNode>();
ArrayList<JDDNode> statesK = new ArrayList<JDDNode>(); ArrayList<JDDNode> statesK = new ArrayList<JDDNode>();
for (i = 0; i < dra.getNumAcceptancePairs(); i++) {
for (i = 0; i < dra.getAcceptance().size(); i++) {
JDDNode tmpLnot = buildLStatesForRabinPair(draDDRowVars, dra, i, true); JDDNode tmpLnot = buildLStatesForRabinPair(draDDRowVars, dra, i, true);
JDDNode tmpK = buildKStatesForRabinPair(draDDRowVars, dra, i); JDDNode tmpK = buildKStatesForRabinPair(draDDRowVars, dra, i);
statesLnot.add(tmpLnot); statesLnot.add(tmpLnot);
@ -763,7 +764,7 @@ public class LTLModelChecker extends PrismComponent
JDD.Deref(acceptanceVector_K); JDD.Deref(acceptanceVector_K);
JDD.Deref(candidateStates); JDD.Deref(candidateStates);
for (i = 0; i < dra.getNumAcceptancePairs(); i++) {
for (i = 0; i < dra.getAcceptance().size(); i++) {
// build the acceptance vectors L_i and K_i // build the acceptance vectors L_i and K_i
acceptanceVector_L_not = statesLnot.get(i); acceptanceVector_L_not = statesLnot.get(i);
acceptanceVector_K = statesK.get(i); acceptanceVector_K = statesK.get(i);
@ -813,7 +814,7 @@ public class LTLModelChecker extends PrismComponent
JDD.Deref(ec); JDD.Deref(ec);
} else { } else {
// Go through the DRA acceptance pairs (L_i, K_i) // Go through the DRA acceptance pairs (L_i, K_i)
for (i = 0; i < dra.getNumAcceptancePairs(); i++) {
for (i = 0; i < dra.getAcceptance().size(); i++) {
// Build BDDs for !L_i and K_i // Build BDDs for !L_i and K_i
JDDNode statesLi_not = buildLStatesForRabinPair(draDDRowVars, dra, i, true); JDDNode statesLi_not = buildLStatesForRabinPair(draDDRowVars, dra, i, true);
JDDNode statesK_i = buildKStatesForRabinPair(draDDRowVars, dra, i); JDDNode statesK_i = buildKStatesForRabinPair(draDDRowVars, dra, i);
@ -856,7 +857,7 @@ public class LTLModelChecker extends PrismComponent
return allAcceptingStates; return allAcceptingStates;
} }
public JDDNode findMultiAcceptingStates(DRA<BitSet> dra, NondetModel model, JDDVars draDDRowVars, JDDVars draDDColVars, boolean fairness,
public JDDNode findMultiAcceptingStates(DA<BitSet,AcceptanceRabin> dra, NondetModel model, JDDVars draDDRowVars, JDDVars draDDColVars, boolean fairness,
List<JDDNode> allecs, List<JDDNode> statesH, List<JDDNode> statesL) throws PrismException List<JDDNode> allecs, List<JDDNode> statesH, List<JDDNode> statesL) throws PrismException
{ {
JDDNode acceptingStates = null, allAcceptingStates, candidateStates; JDDNode acceptingStates = null, allAcceptingStates, candidateStates;
@ -867,7 +868,7 @@ public class LTLModelChecker extends PrismComponent
// for each acceptance pair (H_i, L_i) in the DRA, build H'_i = S x H_i // for each acceptance pair (H_i, L_i) in the DRA, build H'_i = S x H_i
// and compute the maximal ECs in H'_i // and compute the maximal ECs in H'_i
for (i = 0; i < dra.getNumAcceptancePairs(); i++) {
for (i = 0; i < dra.getAcceptance().size(); i++) {
// build the acceptance vectors H_i and L_i // build the acceptance vectors H_i and L_i
acceptanceVector_H = statesH.get(i); acceptanceVector_H = statesH.get(i);
acceptanceVector_L = statesL.get(i); acceptanceVector_L = statesL.get(i);
@ -920,7 +921,7 @@ public class LTLModelChecker extends PrismComponent
return allAcceptingStates; return allAcceptingStates;
} }
public void findMultiConflictAcceptingStates(DRA<BitSet>[] dra, NondetModel model, JDDVars[] draDDRowVars, JDDVars[] draDDColVars, List<JDDNode> targetDDs,
public void findMultiConflictAcceptingStates(DA<BitSet,AcceptanceRabin>[] dra, NondetModel model, JDDVars[] draDDRowVars, JDDVars[] draDDColVars, List<JDDNode> targetDDs,
List<List<JDDNode>> allstatesH, List<List<JDDNode>> allstatesL, List<JDDNode> combinations, List<List<Integer>> combinationIDs) List<List<JDDNode>> allstatesH, List<List<JDDNode>> allstatesL, List<JDDNode> combinations, List<List<Integer>> combinationIDs)
throws PrismException throws PrismException
{ {
@ -961,7 +962,7 @@ public class LTLModelChecker extends PrismComponent
} }
} }
private void computeCombinations(DRA<BitSet>[] dra, NondetModel model, JDDVars[] draDDRowVars, JDDVars[] draDDColVars, List<JDDNode> targetDDs,
private void computeCombinations(DA<BitSet,AcceptanceRabin>[] dra, NondetModel model, JDDVars[] draDDRowVars, JDDVars[] draDDColVars, List<JDDNode> targetDDs,
List<List<JDDNode>> allstatesH, List<List<JDDNode>> allstatesL, List<queueElement> queue, int sp) throws PrismException List<List<JDDNode>> allstatesH, List<List<JDDNode>> allstatesL, List<queueElement> queue, int sp) throws PrismException
{ {
queueElement e = queue.get(sp); queueElement e = queue.get(sp);

30
prism/src/prism/MultiObjModelChecker.java

@ -35,15 +35,13 @@ import java.util.BitSet;
import java.util.List; import java.util.List;
import java.util.Vector; import java.util.Vector;
import acceptance.AcceptanceRabin;
import parser.ast.Expression; import parser.ast.Expression;
import parser.ast.RelOp; import parser.ast.RelOp;
import dv.DoubleVector; import dv.DoubleVector;
import mtbdd.PrismMTBDD; import mtbdd.PrismMTBDD;
import sparse.NDSparseMatrix; import sparse.NDSparseMatrix;
import sparse.PrismSparse; import sparse.PrismSparse;
import jdd.JDD; import jdd.JDD;
import jdd.JDDNode; import jdd.JDDNode;
import jdd.JDDVars; import jdd.JDDVars;
@ -67,7 +65,7 @@ public class MultiObjModelChecker extends PrismComponent
} }
//TODO: dra's element is changed here, not neat. //TODO: dra's element is changed here, not neat.
protected NondetModel constructDRAandProductMulti(NondetModel model, LTLModelChecker mcLtl, ModelChecker modelChecker, Expression ltl, int i, DRA<BitSet> dra[], Operator operator,
protected NondetModel constructDRAandProductMulti(NondetModel model, LTLModelChecker mcLtl, ModelChecker modelChecker, Expression ltl, int i, DA<BitSet,AcceptanceRabin> dra[], Operator operator,
Expression targetExpr, JDDVars draDDRowVars, JDDVars draDDColVars, JDDNode ddStateIndex) throws PrismException Expression targetExpr, JDDVars draDDRowVars, JDDVars draDDColVars, JDDNode ddStateIndex) throws PrismException
{ {
// Model check maximal state formulas // Model check maximal state formulas
@ -82,7 +80,7 @@ public class MultiObjModelChecker extends PrismComponent
mainLog.println("\nBuilding deterministic Rabin automaton (for " + ltl + ")..."); mainLog.println("\nBuilding deterministic Rabin automaton (for " + ltl + ")...");
long l = System.currentTimeMillis(); long l = System.currentTimeMillis();
dra[i] = LTLModelChecker.convertLTLFormulaToDRA(ltl); dra[i] = LTLModelChecker.convertLTLFormulaToDRA(ltl);
mainLog.print("DRA has " + dra[i].size() + " states, " + ", " + dra[i].getNumAcceptancePairs() + " pairs.");
mainLog.print("DRA has " + dra[i].size() + " states, " + ", " + dra[i].getAcceptance().getSizeStatistics()+".");
l = System.currentTimeMillis() - l; l = System.currentTimeMillis() - l;
mainLog.println("Time for Rabin translation: " + l / 1000.0 + " seconds."); mainLog.println("Time for Rabin translation: " + l / 1000.0 + " seconds.");
// If required, export DRA // If required, export DRA
@ -165,7 +163,7 @@ public class MultiObjModelChecker extends PrismComponent
//computes accepting end component for the Rabin automaton dra. //computes accepting end component for the Rabin automaton dra.
//Vojta: in addition to calling a method which does the computation //Vojta: in addition to calling a method which does the computation
//there are some other bits which I don't currently understand //there are some other bits which I don't currently understand
protected JDDNode computeAcceptingEndComponent(DRA<BitSet> dra, NondetModel modelProduct, JDDVars draDDRowVars, JDDVars draDDColVars,
protected JDDNode computeAcceptingEndComponent(DA<BitSet,AcceptanceRabin> dra, NondetModel modelProduct, JDDVars draDDRowVars, JDDVars draDDColVars,
List<JDDNode> allecs, List<JDDNode> statesH, List<JDDNode> statesL, //Vojta: at the time of writing this I have no idea what these two parameters do, so I don't know how to call them List<JDDNode> allecs, List<JDDNode> statesH, List<JDDNode> statesL, //Vojta: at the time of writing this I have no idea what these two parameters do, so I don't know how to call them
LTLModelChecker mcLtl, boolean conflictformulaeGtOne, String name) throws PrismException LTLModelChecker mcLtl, boolean conflictformulaeGtOne, String name) throws PrismException
{ {
@ -186,7 +184,7 @@ public class MultiObjModelChecker extends PrismComponent
} }
protected void removeNonZeroMecsForMax(NondetModel modelProduct, LTLModelChecker mcLtl, List<JDDNode> rewardsIndex, OpsAndBoundsList opsAndBounds, protected void removeNonZeroMecsForMax(NondetModel modelProduct, LTLModelChecker mcLtl, List<JDDNode> rewardsIndex, OpsAndBoundsList opsAndBounds,
int numTargets, DRA<BitSet> dra[], JDDVars draDDRowVars[], JDDVars draDDColVars[]) throws PrismException
int numTargets, DA<BitSet,AcceptanceRabin> dra[], JDDVars draDDRowVars[], JDDVars draDDColVars[]) throws PrismException
{ {
List<JDDNode> mecs = mcLtl.findMECStates(modelProduct, modelProduct.getReach()); List<JDDNode> mecs = mcLtl.findMECStates(modelProduct, modelProduct.getReach());
JDDNode removedActions = JDD.Constant(0); JDDNode removedActions = JDD.Constant(0);
@ -230,7 +228,7 @@ public class MultiObjModelChecker extends PrismComponent
Vector<JDDNode> tmptargetDDs = new Vector<JDDNode>(); Vector<JDDNode> tmptargetDDs = new Vector<JDDNode>();
List<JDDNode> tmpmultitargetDDs = new ArrayList<JDDNode>(); List<JDDNode> tmpmultitargetDDs = new ArrayList<JDDNode>();
List<Integer> tmpmultitargetIDs = new ArrayList<Integer>(); List<Integer> tmpmultitargetIDs = new ArrayList<Integer>();
ArrayList<DRA<BitSet>> tmpdra = new ArrayList<DRA<BitSet>>();
ArrayList<DA<BitSet,AcceptanceRabin>> tmpdra = new ArrayList<DA<BitSet,AcceptanceRabin>>();
ArrayList<JDDVars> tmpdraDDRowVars = new ArrayList<JDDVars>(); ArrayList<JDDVars> tmpdraDDRowVars = new ArrayList<JDDVars>();
ArrayList<JDDVars> tmpdraDDColVars = new ArrayList<JDDVars>(); ArrayList<JDDVars> tmpdraDDColVars = new ArrayList<JDDVars>();
int count = 0; int count = 0;
@ -244,7 +242,7 @@ public class MultiObjModelChecker extends PrismComponent
} }
if (count > 0) { if (count > 0) {
// TODO: distinguish whether rtarget is empty // TODO: distinguish whether rtarget is empty
DRA newdra[] = new DRA[count];
DA<BitSet,AcceptanceRabin> newdra[] = new DA[count];
tmpdra.toArray(newdra); tmpdra.toArray(newdra);
JDDVars newdraDDRowVars[] = new JDDVars[count]; JDDVars newdraDDRowVars[] = new JDDVars[count];
tmpdraDDRowVars.toArray(newdraDDRowVars); tmpdraDDRowVars.toArray(newdraDDRowVars);
@ -298,11 +296,11 @@ public class MultiObjModelChecker extends PrismComponent
//TODO is conflictformulae actually just no of prob? //TODO is conflictformulae actually just no of prob?
protected void checkConflictsInObjectives(NondetModel modelProduct, LTLModelChecker mcLtl, int conflictformulae, int numTargets, protected void checkConflictsInObjectives(NondetModel modelProduct, LTLModelChecker mcLtl, int conflictformulae, int numTargets,
OpsAndBoundsList opsAndBounds, DRA<BitSet> dra[], JDDVars draDDRowVars[], JDDVars draDDColVars[], List<JDDNode> targetDDs,
OpsAndBoundsList opsAndBounds, DA<BitSet,AcceptanceRabin> dra[], JDDVars draDDRowVars[], JDDVars draDDColVars[], List<JDDNode> targetDDs,
List<ArrayList<JDDNode>> allstatesH, List<ArrayList<JDDNode>> allstatesL, List<JDDNode> multitargetDDs, List<Integer> multitargetIDs) List<ArrayList<JDDNode>> allstatesH, List<ArrayList<JDDNode>> allstatesL, List<JDDNode> multitargetDDs, List<Integer> multitargetIDs)
throws PrismException throws PrismException
{ {
DRA[] tmpdra = new DRA[conflictformulae];
DA<BitSet,AcceptanceRabin>[] tmpdra = new DA[conflictformulae];
JDDVars[] tmpdraDDRowVars = new JDDVars[conflictformulae]; JDDVars[] tmpdraDDRowVars = new JDDVars[conflictformulae];
JDDVars[] tmpdraDDColVars = new JDDVars[conflictformulae]; JDDVars[] tmpdraDDColVars = new JDDVars[conflictformulae];
List<JDDNode> tmptargetDDs = new ArrayList<JDDNode>(conflictformulae); List<JDDNode> tmptargetDDs = new ArrayList<JDDNode>(conflictformulae);
@ -350,7 +348,7 @@ public class MultiObjModelChecker extends PrismComponent
} }
} }
protected void findTargetStates(NondetModel modelProduct, LTLModelChecker mcLtl, int numTargets, int conflictformulae, boolean reachExpr[], DRA dra[],
protected void findTargetStates(NondetModel modelProduct, LTLModelChecker mcLtl, int numTargets, int conflictformulae, boolean reachExpr[], DA<BitSet,AcceptanceRabin> dra[],
JDDVars draDDRowVars[], JDDVars draDDColVars[], List<JDDNode> targetDDs, List<JDDNode> multitargetDDs, List<Integer> multitargetIDs) JDDVars draDDRowVars[], JDDVars draDDColVars[], List<JDDNode> targetDDs, List<JDDNode> multitargetDDs, List<Integer> multitargetIDs)
throws PrismException throws PrismException
{ {
@ -366,14 +364,14 @@ public class MultiObjModelChecker extends PrismComponent
if (!reachExpr[i]) { if (!reachExpr[i]) {
ArrayList<JDDNode> statesH = new ArrayList<JDDNode>(); ArrayList<JDDNode> statesH = new ArrayList<JDDNode>();
ArrayList<JDDNode> statesL = new ArrayList<JDDNode>(); ArrayList<JDDNode> statesL = new ArrayList<JDDNode>();
for (int k = 0; k < dra[i].getNumAcceptancePairs(); k++) {
for (int k = 0; k < dra[i].getAcceptance().size(); k++) {
JDDNode tmpH = JDD.Constant(0); JDDNode tmpH = JDD.Constant(0);
JDDNode tmpL = JDD.Constant(0); JDDNode tmpL = JDD.Constant(0);
for (j = 0; j < dra[i].size(); j++) { for (j = 0; j < dra[i].size(); j++) {
if (!dra[i].getAcceptanceL(k).get(j)) {
if (!dra[i].getAcceptance().get(k).getL().get(j)) {
tmpH = JDD.SetVectorElement(tmpH, draDDRowVars[i], j, 1.0); tmpH = JDD.SetVectorElement(tmpH, draDDRowVars[i], j, 1.0);
} }
if (dra[i].getAcceptanceK(k).get(j)) {
if (dra[i].getAcceptance().get(k).getK().get(j)) {
tmpL = JDD.SetVectorElement(tmpL, draDDRowVars[i], j, 1.0); tmpL = JDD.SetVectorElement(tmpL, draDDRowVars[i], j, 1.0);
} }
} }
@ -455,7 +453,7 @@ public class MultiObjModelChecker extends PrismComponent
// check if there are conflicts in objectives // check if there are conflicts in objectives
if (conflictformulae > 1) { if (conflictformulae > 1) {
DRA[] tmpdra = new DRA[conflictformulae];
DA<BitSet,AcceptanceRabin>[] tmpdra = new DA[conflictformulae];
JDDVars[] tmpdraDDRowVars = new JDDVars[conflictformulae]; JDDVars[] tmpdraDDRowVars = new JDDVars[conflictformulae];
JDDVars[] tmpdraDDColVars = new JDDVars[conflictformulae]; JDDVars[] tmpdraDDColVars = new JDDVars[conflictformulae];
List<JDDNode> tmptargetDDs = new ArrayList<JDDNode>(conflictformulae); List<JDDNode> tmptargetDDs = new ArrayList<JDDNode>(conflictformulae);

15
prism/src/prism/NondetModelChecker.java

@ -33,6 +33,7 @@ import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.*; import java.util.*;
import acceptance.AcceptanceRabin;
import odd.ODDUtils; import odd.ODDUtils;
import jdd.*; import jdd.*;
@ -271,7 +272,7 @@ public class NondetModelChecker extends NonProbModelChecker
MultiObjModelChecker mcMo; MultiObjModelChecker mcMo;
LTLModelChecker mcLtl; LTLModelChecker mcLtl;
Expression[] ltl; Expression[] ltl;
DRA<BitSet>[] dra;
DA<BitSet,AcceptanceRabin>[] dra;
// State index info // State index info
// Misc // Misc
boolean negateresult = false; boolean negateresult = false;
@ -320,7 +321,7 @@ public class NondetModelChecker extends NonProbModelChecker
// Create arrays to store LTL/DRA info // Create arrays to store LTL/DRA info
ltl = new Expression[numObjectives]; ltl = new Expression[numObjectives];
dra = new DRA[numObjectives];
dra = new DA[numObjectives];
draDDRowVars = new JDDVars[numObjectives]; draDDRowVars = new JDDVars[numObjectives];
draDDColVars = new JDDVars[numObjectives]; draDDColVars = new JDDVars[numObjectives];
@ -380,14 +381,14 @@ public class NondetModelChecker extends NonProbModelChecker
if (opsAndBounds.isProbabilityObjective(i)) { if (opsAndBounds.isProbabilityObjective(i)) {
ArrayList<JDDNode> statesH = new ArrayList<JDDNode>(); ArrayList<JDDNode> statesH = new ArrayList<JDDNode>();
ArrayList<JDDNode> statesL = new ArrayList<JDDNode>(); ArrayList<JDDNode> statesL = new ArrayList<JDDNode>();
for (int k = 0; k < dra[i].getNumAcceptancePairs(); k++) {
for (int k = 0; k < dra[i].getAcceptance().size(); k++) {
JDDNode tmpH = JDD.Constant(0); JDDNode tmpH = JDD.Constant(0);
JDDNode tmpL = JDD.Constant(0); JDDNode tmpL = JDD.Constant(0);
for (int j = 0; j < dra[i].size(); j++) { for (int j = 0; j < dra[i].size(); j++) {
if (!dra[i].getAcceptanceL(k).get(j)) {
if (!dra[i].getAcceptance().get(k).getL().get(j)) {
tmpH = JDD.SetVectorElement(tmpH, draDDRowVars[i], j, 1.0); tmpH = JDD.SetVectorElement(tmpH, draDDRowVars[i], j, 1.0);
} }
if (dra[i].getAcceptanceK(k).get(j)) {
if (dra[i].getAcceptance().get(k).getK().get(j)) {
tmpL = JDD.SetVectorElement(tmpL, draDDRowVars[i], j, 1.0); tmpL = JDD.SetVectorElement(tmpL, draDDRowVars[i], j, 1.0);
} }
} }
@ -943,7 +944,7 @@ public class NondetModelChecker extends NonProbModelChecker
StateValues probsProduct = null, probs = null; StateValues probsProduct = null, probs = null;
Expression ltl; Expression ltl;
Vector<JDDNode> labelDDs; Vector<JDDNode> labelDDs;
DRA<BitSet> dra;
DA<BitSet,AcceptanceRabin> dra;
NondetModel modelProduct; NondetModel modelProduct;
NondetModelChecker mcProduct; NondetModelChecker mcProduct;
JDDNode startMask; JDDNode startMask;
@ -978,7 +979,7 @@ public class NondetModelChecker extends NonProbModelChecker
mainLog.println("\nBuilding deterministic Rabin automaton (for " + ltl + ")..."); mainLog.println("\nBuilding deterministic Rabin automaton (for " + ltl + ")...");
l = System.currentTimeMillis(); l = System.currentTimeMillis();
dra = LTLModelChecker.convertLTLFormulaToDRA(ltl); dra = LTLModelChecker.convertLTLFormulaToDRA(ltl);
mainLog.println("DRA has " + dra.size() + " states, " + dra.getNumAcceptancePairs() + " pairs.");
mainLog.println("DRA has " + dra.size() + " states, " + dra.getAcceptance().getSizeStatistics()+".");
l = System.currentTimeMillis() - l; l = System.currentTimeMillis() - l;
mainLog.println("Time for Rabin translation: " + l / 1000.0 + " seconds."); mainLog.println("Time for Rabin translation: " + l / 1000.0 + " seconds.");
// If required, export DRA // If required, export DRA

5
prism/src/prism/ProbModelChecker.java

@ -34,6 +34,7 @@ import java.util.BitSet;
import java.util.List; import java.util.List;
import java.util.Vector; import java.util.Vector;
import acceptance.AcceptanceRabin;
import jdd.JDD; import jdd.JDD;
import jdd.JDDNode; import jdd.JDDNode;
import jdd.JDDVars; import jdd.JDDVars;
@ -492,7 +493,7 @@ public class ProbModelChecker extends NonProbModelChecker
StateValues probsProduct = null, probs = null; StateValues probsProduct = null, probs = null;
Expression ltl; Expression ltl;
Vector<JDDNode> labelDDs; Vector<JDDNode> labelDDs;
DRA<BitSet> dra;
DA<BitSet,AcceptanceRabin> dra;
ProbModel modelProduct; ProbModel modelProduct;
ProbModelChecker mcProduct; ProbModelChecker mcProduct;
JDDNode startMask; JDDNode startMask;
@ -516,7 +517,7 @@ public class ProbModelChecker extends NonProbModelChecker
mainLog.println("\nBuilding deterministic Rabin automaton (for " + ltl + ")..."); mainLog.println("\nBuilding deterministic Rabin automaton (for " + ltl + ")...");
l = System.currentTimeMillis(); l = System.currentTimeMillis();
dra = LTLModelChecker.convertLTLFormulaToDRA(ltl); dra = LTLModelChecker.convertLTLFormulaToDRA(ltl);
mainLog.println("DRA has " + dra.size() + " states, " + dra.getNumAcceptancePairs() + " pairs.");
mainLog.println("DRA has " + dra.size() + " states, " + dra.getAcceptance().getSizeStatistics()+".");
l = System.currentTimeMillis() - l; l = System.currentTimeMillis() - l;
mainLog.println("Time for Rabin translation: " + l / 1000.0 + " seconds."); mainLog.println("Time for Rabin translation: " + l / 1000.0 + " seconds.");
// If required, export DRA // If required, export DRA

Loading…
Cancel
Save