Browse Source

Tidy up of export-to-Dot functionality, plus new "dot" option for exporting strategy (explicit engine only, currently).

git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@8110 bbc10eb1-c90d-0410-af57-cb519fbb1720
master
Dave Parker 12 years ago
parent
commit
21748bcaa4
  1. 28
      prism/src/explicit/DTMCExplicit.java
  2. 6
      prism/src/explicit/MDP.java
  3. 90
      prism/src/explicit/MDPExplicit.java
  4. 10
      prism/src/explicit/Model.java
  5. 28
      prism/src/explicit/ModelExplicit.java
  6. 8
      prism/src/explicit/NondetModel.java
  7. 52
      prism/src/explicit/STPGAbstrSimple.java
  8. 274
      prism/src/explicit/SubNondetModel.java
  9. 12
      prism/src/param/ParamModel.java
  10. 14
      prism/src/prism/Prism.java
  11. 2
      prism/src/prism/PrismCL.java
  12. 6
      prism/src/strat/MDStrategyArray.java
  13. 19
      prism/src/strat/MDStrategyIV.java
  14. 5
      prism/src/strat/Strategy.java

28
prism/src/explicit/DTMCExplicit.java

@ -96,27 +96,21 @@ public abstract class DTMCExplicit extends ModelExplicit implements DTMC
}
@Override
public void exportToDotFile(String filename, BitSet mark) throws PrismException
public void exportToDotFile(PrismLog out, BitSet mark)
{
int i;
try {
FileWriter out = new FileWriter(filename);
out.write("digraph " + getModelType() + " {\nsize=\"8,5\"\nnode [shape=box];\n");
for (i = 0; i < numStates; i++) {
if (mark != null && mark.get(i))
out.write(i + " [style=filled fillcolor=\"#cccccc\"]\n");
Iterator<Map.Entry<Integer, Double>> iter = getTransitionsIterator(i);
while (iter.hasNext()) {
Map.Entry<Integer, Double> e = iter.next();
out.write(i + " -> " + e.getKey() + " [ label=\"");
out.write(e.getValue() + "\" ];\n");
}
out.print("digraph " + getModelType() + " {\nsize=\"8,5\"\nnode [shape=box];\n");
for (i = 0; i < numStates; i++) {
if (mark != null && mark.get(i))
out.print(i + " [style=filled fillcolor=\"#cccccc\"]\n");
Iterator<Map.Entry<Integer, Double>> iter = getTransitionsIterator(i);
while (iter.hasNext()) {
Map.Entry<Integer, Double> e = iter.next();
out.print(i + " -> " + e.getKey() + " [ label=\"");
out.print(e.getValue() + "\" ];\n");
}
out.write("}\n");
out.close();
} catch (IOException e) {
throw new PrismException("Could not write " + getModelType() + " to file \"" + filename + "\"" + e);
}
out.print("}\n");
}
@Override

6
prism/src/explicit/MDP.java

@ -31,7 +31,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import prism.PrismException;
import explicit.rewards.MCRewards;
import explicit.rewards.MDPRewards;
@ -277,9 +276,4 @@ public interface MDP extends NondetModel
* @param dest Vector to write result to.
*/
public void mvMultRight(int[] states, int[] strat, double[] source, double[] dest);
/**
* Export to a dot file, highlighting states in 'mark' and choices for a (memoryless) strategy.
*/
public void exportToDotFileWithStrat(String filename, BitSet mark, int strat[]) throws PrismException;
}

90
prism/src/explicit/MDPExplicit.java

@ -108,75 +108,63 @@ public abstract class MDPExplicit extends ModelExplicit implements MDP
}
@Override
public void exportToDotFile(String filename, BitSet mark) throws PrismException
public void exportToDotFile(PrismLog out, BitSet mark)
{
int i, j, numChoices;
String nij;
Object action;
try {
FileWriter out = new FileWriter(filename);
out.write("digraph " + getModelType() + " {\nsize=\"8,5\"\nnode [shape=box];\n");
for (i = 0; i < numStates; i++) {
if (mark != null && mark.get(i))
out.write(i + " [style=filled fillcolor=\"#cccccc\"]\n");
numChoices = getNumChoices(i);
for (j = 0; j < numChoices; j++) {
action = getAction(i, j);
nij = "n" + i + "_" + j;
out.write(i + " -> " + nij + " [ arrowhead=none,label=\"" + j);
if (action != null)
out.write(":" + action);
out.write("\" ];\n");
out.write(nij + " [ shape=point,width=0.1,height=0.1,label=\"\" ];\n");
Iterator<Map.Entry<Integer, Double>> iter = getTransitionsIterator(i, j);
while (iter.hasNext()) {
Map.Entry<Integer, Double> e = iter.next();
out.write(nij + " -> " + e.getKey() + " [ label=\"" + e.getValue() + "\" ];\n");
}
out.print("digraph " + getModelType() + " {\nsize=\"8,5\"\nnode [shape=box];\n");
for (i = 0; i < numStates; i++) {
if (mark != null && mark.get(i))
out.print(i + " [style=filled fillcolor=\"#cccccc\"]\n");
numChoices = getNumChoices(i);
for (j = 0; j < numChoices; j++) {
action = getAction(i, j);
nij = "n" + i + "_" + j;
out.print(i + " -> " + nij + " [ arrowhead=none,label=\"" + j);
if (action != null)
out.print(":" + action);
out.print("\" ];\n");
out.print(nij + " [ shape=point,width=0.1,height=0.1,label=\"\" ];\n");
Iterator<Map.Entry<Integer, Double>> iter = getTransitionsIterator(i, j);
while (iter.hasNext()) {
Map.Entry<Integer, Double> e = iter.next();
out.print(nij + " -> " + e.getKey() + " [ label=\"" + e.getValue() + "\" ];\n");
}
}
out.write("}\n");
out.close();
} catch (IOException e) {
throw new PrismException("Could not write " + getModelType() + " to file \"" + filename + "\"" + e);
}
out.print("}\n");
}
@Override
public void exportToDotFileWithStrat(String filename, BitSet mark, int strat[]) throws PrismException
public void exportToDotFileWithStrat(PrismLog out, BitSet mark, int strat[])
{
int i, j, numChoices;
String nij;
Object action;
String style;
try {
FileWriter out = new FileWriter(filename);
out.write("digraph " + getModelType() + " {\nsize=\"8,5\"\nnode [shape=box];\n");
for (i = 0; i < numStates; i++) {
if (mark != null && mark.get(i))
out.write(i + " [style=filled fillcolor=\"#cccccc\"]\n");
numChoices = getNumChoices(i);
for (j = 0; j < numChoices; j++) {
style = (strat[i] == j) ? ",color=\"#ff0000\",fontcolor=\"#ff0000\"" : "";
action = getAction(i, j);
nij = "n" + i + "_" + j;
out.write(i + " -> " + nij + " [ arrowhead=none,label=\"" + j);
if (action != null)
out.write(":" + action);
out.write("\"" + style + " ];\n");
out.write(nij + " [ shape=point,height=0.1,label=\"\"" + style + " ];\n");
Iterator<Map.Entry<Integer, Double>> iter = getTransitionsIterator(i, j);
while (iter.hasNext()) {
Map.Entry<Integer, Double> e = iter.next();
out.write(nij + " -> " + e.getKey() + " [ label=\"" + e.getValue() + "\"" + style + " ];\n");
}
out.print("digraph " + getModelType() + " {\nsize=\"8,5\"\nnode [shape=box];\n");
for (i = 0; i < numStates; i++) {
if (mark != null && mark.get(i))
out.print(i + " [style=filled fillcolor=\"#cccccc\"]\n");
numChoices = getNumChoices(i);
for (j = 0; j < numChoices; j++) {
style = (strat[i] == j) ? ",color=\"#ff0000\",fontcolor=\"#ff0000\"" : "";
action = getAction(i, j);
nij = "n" + i + "_" + j;
out.print(i + " -> " + nij + " [ arrowhead=none,label=\"" + j);
if (action != null)
out.print(":" + action);
out.print("\"" + style + " ];\n");
out.print(nij + " [ shape=point,height=0.1,label=\"\"" + style + " ];\n");
Iterator<Map.Entry<Integer, Double>> iter = getTransitionsIterator(i, j);
while (iter.hasNext()) {
Map.Entry<Integer, Double> e = iter.next();
out.print(nij + " -> " + e.getKey() + " [ label=\"" + e.getValue() + "\"" + style + " ];\n");
}
}
out.write("}\n");
out.close();
} catch (IOException e) {
throw new PrismException("Could not write " + getModelType() + " to file \"" + filename + "\"" + e);
}
out.print("}\n");
}
@Override

10
prism/src/explicit/Model.java

@ -203,6 +203,16 @@ public interface Model
*/
public void exportToDotFile(String filename, BitSet mark) throws PrismException;
/**
* Export to a dot file.
*/
public void exportToDotFile(PrismLog out);
/**
* Export to a dot file, highlighting states in 'mark'.
*/
public void exportToDotFile(PrismLog out, BitSet mark);
/**
* Export to a equivalent PRISM language model description.
*/

28
prism/src/explicit/ModelExplicit.java

@ -288,21 +288,13 @@ public abstract class ModelExplicit implements Model
@Override
public void exportToPrismExplicitTra(String filename) throws PrismException
{
PrismLog tmpLog = new PrismFileLog(filename);
if (!tmpLog.ready()) {
throw new PrismException("Could not open file \"" + filename + "\" for output");
}
exportToPrismExplicitTra(tmpLog);
exportToPrismExplicitTra(PrismFileLog.create(filename));
}
@Override
public void exportToPrismExplicitTra(File file) throws PrismException
{
PrismLog tmpLog = new PrismFileLog(file.getPath());
if (!tmpLog.ready()) {
throw new PrismException("Could not open file \"" + file + "\" for output");
}
exportToPrismExplicitTra(new PrismFileLog(file.getPath()));
exportToPrismExplicitTra(PrismFileLog.create(file.getPath()));
}
@Override
@ -311,11 +303,23 @@ public abstract class ModelExplicit implements Model
@Override
public void exportToDotFile(String filename) throws PrismException
{
exportToDotFile(filename, null);
exportToDotFile(PrismFileLog.create(filename), null);
}
@Override
public void exportToDotFile(String filename, BitSet mark) throws PrismException
{
exportToDotFile(PrismFileLog.create(filename), mark);
}
@Override
public void exportToDotFile(PrismLog out)
{
exportToDotFile(out, null);
}
@Override
public abstract void exportToDotFile(String filename, BitSet mark) throws PrismException;
public abstract void exportToDotFile(PrismLog out, BitSet mark);
@Override
public abstract void exportToPrismLanguage(String filename) throws PrismException;

8
prism/src/explicit/NondetModel.java

@ -30,6 +30,9 @@ import java.util.BitSet;
import java.util.Iterator;
import java.util.Map.Entry;
import prism.PrismException;
import prism.PrismLog;
import strat.MDStrategy;
/**
@ -91,4 +94,9 @@ public interface NondetModel extends Model
* @param strat (Memoryless) strategy to use
*/
public Model constructInducedModel(MDStrategy strat);
/**
* Export to a dot file, highlighting states in 'mark' and choices for a (memoryless) strategy.
*/
public void exportToDotFileWithStrat(PrismLog out, BitSet mark, int strat[]);
}

52
prism/src/explicit/STPGAbstrSimple.java

@ -394,41 +394,41 @@ public class STPGAbstrSimple extends ModelExplicit implements STPG, NondetModelS
}
@Override
public void exportToDotFile(String filename, BitSet mark) throws PrismException
public void exportToDotFile(PrismLog out, BitSet mark)
{
int i, j, k;
String nij, nijk;
try {
FileWriter out = new FileWriter(filename);
out.write("digraph " + getModelType() + " {\nsize=\"8,5\"\nnode [shape=box];\n");
for (i = 0; i < numStates; i++) {
if (mark != null && mark.get(i))
out.write(i + " [style=filled fillcolor=\"#cccccc\"]\n");
j = -1;
for (DistributionSet distrs : trans.get(i)) {
j++;
nij = "n" + i + "_" + j;
out.write(i + " -> " + nij + " [ arrowhead=none,label=\"" + j + "\" ];\n");
out.write(nij + " [ shape=circle,width=0.1,height=0.1,label=\"\" ];\n");
k = -1;
for (Distribution distr : distrs) {
k++;
nijk = "n" + i + "_" + j + "_" + k;
out.write(nij + " -> " + nijk + " [ arrowhead=none,label=\"" + k + "\" ];\n");
out.write(nijk + " [ shape=point,label=\"\" ];\n");
for (Map.Entry<Integer, Double> e : distr) {
out.write(nijk + " -> " + e.getKey() + " [ label=\"" + e.getValue() + "\" ];\n");
}
out.print("digraph " + getModelType() + " {\nsize=\"8,5\"\nnode [shape=box];\n");
for (i = 0; i < numStates; i++) {
if (mark != null && mark.get(i))
out.print(i + " [style=filled fillcolor=\"#cccccc\"]\n");
j = -1;
for (DistributionSet distrs : trans.get(i)) {
j++;
nij = "n" + i + "_" + j;
out.print(i + " -> " + nij + " [ arrowhead=none,label=\"" + j + "\" ];\n");
out.print(nij + " [ shape=circle,width=0.1,height=0.1,label=\"\" ];\n");
k = -1;
for (Distribution distr : distrs) {
k++;
nijk = "n" + i + "_" + j + "_" + k;
out.print(nij + " -> " + nijk + " [ arrowhead=none,label=\"" + k + "\" ];\n");
out.print(nijk + " [ shape=point,label=\"\" ];\n");
for (Map.Entry<Integer, Double> e : distr) {
out.print(nijk + " -> " + e.getKey() + " [ label=\"" + e.getValue() + "\" ];\n");
}
}
}
out.write("}\n");
out.close();
} catch (IOException e) {
throw new PrismException("Could not write " + getModelType() + " to file \"" + filename + "\"" + e);
}
out.print("}\n");
}
@Override
public void exportToDotFileWithStrat(PrismLog out, BitSet mark, int strat[])
{
throw new RuntimeException("Not yet supported");
}
@Override
public void exportToPrismLanguage(String filename) throws PrismException
{

274
prism/src/explicit/SubNondetModel.java

@ -44,113 +44,125 @@ import prism.PrismException;
import prism.PrismLog;
import strat.MDStrategy;
/*
/**
* Class for creating a sub-model of any NondetModel, please note the translate* methods
* used to translate between state ids for model and sub-model. Created sub-model will have new
* state numbering from 0 to number of states in the sub model.
*
*/
public class SubNondetModel implements NondetModel {
public class SubNondetModel implements NondetModel
{
private NondetModel model = null;
private BitSet states = null;
private Map<Integer,BitSet> actions = null;
private Map<Integer, BitSet> actions = null;
private BitSet initialStates = null;
private List<State> statesList = null;
private Map<Integer,Integer> stateLookupTable = new HashMap<Integer,Integer>();
private Map<Integer,Map<Integer,Integer>> actionLookupTable = new HashMap<Integer,Map<Integer,Integer>>();
private Map<Integer,Integer> inverseStateLookupTable = new HashMap<Integer,Integer>();
private Map<Integer, Integer> stateLookupTable = new HashMap<Integer, Integer>();
private Map<Integer, Map<Integer, Integer>> actionLookupTable = new HashMap<Integer, Map<Integer, Integer>>();
private Map<Integer, Integer> inverseStateLookupTable = new HashMap<Integer, Integer>();
private int numTransitions = 0;
private int maxNumChoices = 0;
private int numChoices = 0;
public SubNondetModel(NondetModel model, BitSet states, Map<Integer,BitSet> actions, BitSet initialStates) {
public SubNondetModel(NondetModel model, BitSet states, Map<Integer, BitSet> actions, BitSet initialStates)
{
this.model = model;
this.states = states;
this.actions = actions;
this.initialStates = initialStates;
generateStatistics();
generateLookupTable(states, actions);
}
@Override
public ModelType getModelType() {
public ModelType getModelType()
{
return model.getModelType();
}
@Override
public int getNumStates() {
public int getNumStates()
{
return states.cardinality();
}
@Override
public int getNumInitialStates() {
public int getNumInitialStates()
{
return initialStates.cardinality();
}
@Override
public Iterable<Integer> getInitialStates() {
public Iterable<Integer> getInitialStates()
{
List<Integer> is = new ArrayList<Integer>();
for(int i=initialStates.nextSetBit(0); i>=0; i=initialStates.nextSetBit(i+1)) {
for (int i = initialStates.nextSetBit(0); i >= 0; i = initialStates.nextSetBit(i + 1)) {
is.add(translateState(i));
}
return is;
}
@Override
public int getFirstInitialState() {
public int getFirstInitialState()
{
return translateState(initialStates.nextSetBit(0));
}
@Override
public boolean isInitialState(int i) {
public boolean isInitialState(int i)
{
return initialStates.get(translateState(i));
}
@Override
public int getNumDeadlockStates() {
public int getNumDeadlockStates()
{
throw new UnsupportedOperationException();
}
@Override
public Iterable<Integer> getDeadlockStates() {
public Iterable<Integer> getDeadlockStates()
{
throw new UnsupportedOperationException();
}
@Override
public StateValues getDeadlockStatesList() {
public StateValues getDeadlockStatesList()
{
throw new UnsupportedOperationException();
}
@Override
public int getFirstDeadlockState() {
public int getFirstDeadlockState()
{
throw new UnsupportedOperationException();
}
@Override
public boolean isDeadlockState(int i) {
public boolean isDeadlockState(int i)
{
throw new UnsupportedOperationException();
}
@Override
public List<State> getStatesList() {
public List<State> getStatesList()
{
//We use lazy generation because in many cases the state list is not
//needed
if(statesList == null) {
if (statesList == null) {
statesList = generateSubStateList(states);
}
return statesList;
}
private List<State> generateSubStateList(BitSet states) {
private List<State> generateSubStateList(BitSet states)
{
List<State> statesList = new ArrayList<State>();
for(int i=0;i<model.getNumStates();i++) {
if(states.get(i)) {
for (int i = 0; i < model.getNumStates(); i++) {
if (states.get(i)) {
statesList.add(model.getStatesList().get(i));
}
}
@ -158,29 +170,33 @@ public class SubNondetModel implements NondetModel {
}
@Override
public Values getConstantValues() {
public Values getConstantValues()
{
throw new UnsupportedOperationException();
}
@Override
public BitSet getLabelStates(String name) {
public BitSet getLabelStates(String name)
{
throw new UnsupportedOperationException();
}
@Override
public int getNumTransitions() {
public int getNumTransitions()
{
return numTransitions;
}
@Override
public Iterator<Integer> getSuccessorsIterator(int s) {
public Iterator<Integer> getSuccessorsIterator(int s)
{
s = translateState(s);
List<Integer> succ = new ArrayList<Integer>();
for(int i=0;i<model.getNumChoices(s);i++) {
if(actions.get(s).get(i)) {
Iterator<Entry<Integer,Double>> it = model.getTransitionsIterator(s,i);
while(it.hasNext()) {
for (int i = 0; i < model.getNumChoices(s); i++) {
if (actions.get(s).get(i)) {
Iterator<Entry<Integer, Double>> it = model.getTransitionsIterator(s, i);
while (it.hasNext()) {
int succc = it.next().getKey();
succ.add(inverseTranslateState(succc));
}
@ -188,114 +204,148 @@ public class SubNondetModel implements NondetModel {
}
return succ.iterator();
}
@Override
public boolean isSuccessor(int s1, int s2) {
public boolean isSuccessor(int s1, int s2)
{
s1 = translateState(s1);
s2 = translateState(s2);
return model.isSuccessor(s1, s2);
}
@Override
public boolean allSuccessorsInSet(int s, BitSet set) {
public boolean allSuccessorsInSet(int s, BitSet set)
{
throw new UnsupportedOperationException();
}
@Override
public boolean someSuccessorsInSet(int s, BitSet set) {
public boolean someSuccessorsInSet(int s, BitSet set)
{
throw new UnsupportedOperationException();
}
@Override
public void findDeadlocks(boolean fix) throws PrismException {
public void findDeadlocks(boolean fix) throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public void checkForDeadlocks() throws PrismException {
public void checkForDeadlocks() throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public void checkForDeadlocks(BitSet except) throws PrismException {
public void checkForDeadlocks(BitSet except) throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public void exportToPrismExplicit(String baseFilename)
throws PrismException {
public void exportToPrismExplicit(String baseFilename) throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public void exportToPrismExplicitTra(String filename) throws PrismException {
public void exportToPrismExplicitTra(String filename) throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public void exportToPrismExplicitTra(File file) throws PrismException {
public void exportToPrismExplicitTra(File file) throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public void exportToPrismExplicitTra(PrismLog log) {
public void exportToPrismExplicitTra(PrismLog log)
{
throw new UnsupportedOperationException();
}
@Override
public void exportToDotFile(String filename) throws PrismException {
public void exportToDotFile(String filename) throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public void exportToDotFile(String filename, BitSet mark)
throws PrismException {
public void exportToDotFile(String filename, BitSet mark) throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public void exportToPrismLanguage(String filename) throws PrismException {
public void exportToDotFile(PrismLog out)
{
throw new UnsupportedOperationException();
}
@Override
public void exportStates(int exportType, VarList varList, PrismLog log)
throws PrismException {
public void exportToDotFile(PrismLog out, BitSet mark)
{
throw new UnsupportedOperationException();
}
@Override
public String infoString() {
public void exportToDotFileWithStrat(PrismLog out, BitSet mark, int strat[])
{
throw new UnsupportedOperationException();
}
@Override
public void exportToPrismLanguage(String filename) throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public void exportStates(int exportType, VarList varList, PrismLog log) throws PrismException
{
throw new UnsupportedOperationException();
}
@Override
public String infoString()
{
throw new UnsupportedOperationException();
}
@Override
public String infoStringTable() {
public String infoStringTable()
{
throw new UnsupportedOperationException();
}
@Override
public int getNumChoices(int s) {
public int getNumChoices(int s)
{
s = translateState(s);
return actions.get(s).cardinality();
}
@Override
public int getMaxNumChoices() {
public int getMaxNumChoices()
{
return maxNumChoices;
}
@Override
public int getNumChoices() {
public int getNumChoices()
{
return numChoices;
}
@Override
public Object getAction(int s, int i) {
public Object getAction(int s, int i)
{
s = translateState(s);
i = translateAction(s, i);
return model.getAction(s, i);
}
@ -306,7 +356,8 @@ public class SubNondetModel implements NondetModel {
}
@Override
public boolean allSuccessorsInSet(int s, int i, BitSet set) {
public boolean allSuccessorsInSet(int s, int i, BitSet set)
{
s = translateState(s);
i = translateAction(s, i);
set = translateSet(set);
@ -315,37 +366,41 @@ public class SubNondetModel implements NondetModel {
}
@Override
public boolean someSuccessorsInSet(int s, int i, BitSet set) {
public boolean someSuccessorsInSet(int s, int i, BitSet set)
{
s = translateState(s);
i = translateAction(s, i);
set = translateSet(set);
return model.someSuccessorsInSet(s, i, set);
}
private BitSet translateSet(BitSet set) {
private BitSet translateSet(BitSet set)
{
BitSet translatedBitSet = new BitSet();
for (int i = set.nextSetBit(0); i >= 0; i = set.nextSetBit(i+1)) {
translatedBitSet.set(translateState(i));
}
return translatedBitSet;
for (int i = set.nextSetBit(0); i >= 0; i = set.nextSetBit(i + 1)) {
translatedBitSet.set(translateState(i));
}
return translatedBitSet;
}
private void generateStatistics() {
for(int i=0;i<model.getNumStates();i++) {
if(states.get(i)) {
private void generateStatistics()
{
for (int i = 0; i < model.getNumStates(); i++) {
if (states.get(i)) {
numTransitions += getTransitions(i);
numChoices += actions.get(i).cardinality();
maxNumChoices = Math.max(maxNumChoices, model.getNumChoices(i));
}
}
}
private int getTransitions(int state) {
private int getTransitions(int state)
{
int transitions = 0;
for(int i=0;i<model.getNumChoices(state);i++) {
Iterator<Entry<Integer,Double>> it = model.getTransitionsIterator(state, i);
while(it.hasNext()) {
for (int i = 0; i < model.getNumChoices(state); i++) {
Iterator<Entry<Integer, Double>> it = model.getTransitionsIterator(state, i);
while (it.hasNext()) {
it.next();
transitions += 1;
}
@ -354,51 +409,56 @@ public class SubNondetModel implements NondetModel {
}
@Override
public Iterator<Entry<Integer, Double>> getTransitionsIterator(int s, int i) {
public Iterator<Entry<Integer, Double>> getTransitionsIterator(int s, int i)
{
s = translateState(s);
i = translateAction(s, i);
Map<Integer,Double> distrs = new HashMap<Integer, Double>();
Iterator<Entry<Integer,Double>> it = model.getTransitionsIterator(s, i);
while(it.hasNext()) {
Map<Integer, Double> distrs = new HashMap<Integer, Double>();
Iterator<Entry<Integer, Double>> it = model.getTransitionsIterator(s, i);
while (it.hasNext()) {
Entry<Integer, Double> e = it.next();
int succ = inverseTranslateState(e.getKey());
distrs.put(succ, e.getValue());
}
return distrs.entrySet().iterator();
}
@Override
public Model constructInducedModel(MDStrategy strat)
{
throw new RuntimeException("Not implemented");
}
private void generateLookupTable(BitSet states, Map<Integer,BitSet> actions) {
for(int i=0;i < model.getNumStates();i++) {
if(states.get(i)) {
private void generateLookupTable(BitSet states, Map<Integer, BitSet> actions)
{
for (int i = 0; i < model.getNumStates(); i++) {
if (states.get(i)) {
inverseStateLookupTable.put(i, stateLookupTable.size());
stateLookupTable.put(stateLookupTable.size(),i);
Map<Integer,Integer> r = new HashMap<Integer,Integer>();
for(int j=0;j<model.getNumChoices(i);j++) {
if(actions.get(i).get(j)) {
r.put(r.size(),j);
stateLookupTable.put(stateLookupTable.size(), i);
Map<Integer, Integer> r = new HashMap<Integer, Integer>();
for (int j = 0; j < model.getNumChoices(i); j++) {
if (actions.get(i).get(j)) {
r.put(r.size(), j);
}
}
actionLookupTable.put(actionLookupTable.size(),r);
actionLookupTable.put(actionLookupTable.size(), r);
}
}
}
public int translateState(int s) {
public int translateState(int s)
{
return stateLookupTable.get(s);
}
private int inverseTranslateState(int s) {
private int inverseTranslateState(int s)
{
return inverseStateLookupTable.get(s);
}
public int translateAction(int s, int i) {
public int translateAction(int s, int i)
{
return actionLookupTable.get(s).get(i);
}
}

12
prism/src/param/ParamModel.java

@ -195,6 +195,18 @@ final class ParamModel extends ModelExplicit
throw new UnsupportedOperationException();
}
@Override
public void exportToDotFile(PrismLog out)
{
throw new UnsupportedOperationException();
}
@Override
public void exportToDotFile(PrismLog out, BitSet mark)
{
throw new UnsupportedOperationException();
}
@Override
public void exportToPrismLanguage(String filename) throws PrismException
{

14
prism/src/prism/Prism.java

@ -155,7 +155,7 @@ public class Prism extends PrismComponent implements PrismSettingsListener
// Options for type of strategy export
public enum StrategyExportType {
ACTIONS, INDICES, INDUCED_MODEL;
ACTIONS, INDICES, INDUCED_MODEL, DOT_FILE;
public String description()
{
switch (this) {
@ -165,6 +165,8 @@ public class Prism extends PrismComponent implements PrismSettingsListener
return "as indices";
case INDUCED_MODEL:
return "as an induced model";
case DOT_FILE:
return "as a dot file";
default:
return this.toString();
}
@ -2158,7 +2160,9 @@ public class Prism extends PrismComponent implements PrismSettingsListener
currentModelExpl.exportToPrismExplicitTra(tmpLog);
break;
case Prism.EXPORT_MATLAB:
throw new PrismException("Export not yet supported");
case Prism.EXPORT_DOT:
currentModelExpl.exportToDotFile(tmpLog);
case Prism.EXPORT_MRMC:
case Prism.EXPORT_ROWS:
case Prism.EXPORT_DOT_STATES:
@ -2997,6 +3001,9 @@ public class Prism extends PrismComponent implements PrismSettingsListener
case INDUCED_MODEL:
strat.exportInducedModel(tmpLog);
break;
case DOT_FILE:
strat.exportDotFile(tmpLog);
break;
}
if (file != null)
tmpLog.close();
@ -3475,10 +3482,7 @@ public class Prism extends PrismComponent implements PrismSettingsListener
// create new file log or use main log
PrismLog tmpLog;
if (file != null) {
tmpLog = new PrismFileLog(file.getPath(), append);
if (!tmpLog.ready()) {
throw new PrismException("Could not open file \"" + file + "\" for output");
}
tmpLog = PrismFileLog.create(file.getPath(), append);
} else {
tmpLog = mainLog;
}

2
prism/src/prism/PrismCL.java

@ -1825,6 +1825,8 @@ public class PrismCL implements PrismModelListener
exportStratType = StrategyExportType.INDICES;
else if (optVal.equals("induced"))
exportStratType = StrategyExportType.INDUCED_MODEL;
else if (optVal.equals("dot"))
exportStratType = StrategyExportType.DOT_FILE;
else
throw new PrismException("Unknown value \"" + optVal + "\" provided for \"type\" option of -exportstrat");
}

6
prism/src/strat/MDStrategyArray.java

@ -103,6 +103,12 @@ public class MDStrategyArray extends MDStrategy
dtmcInd.exportToPrismExplicitTra(out);
}
@Override
public void exportDotFile(PrismLog out)
{
model.exportToDotFileWithStrat(out, null, choices);
}
@Override
public void clear()
{

19
prism/src/strat/MDStrategyIV.java

@ -26,9 +26,12 @@
package strat;
import java.io.FileNotFoundException;
import java.util.List;
import prism.Model;
import prism.Prism;
import prism.PrismException;
import prism.PrismLog;
import dv.IntegerVector;
@ -42,7 +45,7 @@ public class MDStrategyIV extends MDStrategy
// Other model info
private int numStates;
private List<String> actions;
// Array storing MD strategy (action index for each state)
// Array storing MD strategy: *action* index (not choice index) for each state
private IntegerVector iv;
/**
@ -106,6 +109,20 @@ public class MDStrategyIV extends MDStrategy
{
// TODO
}
@Override
public void exportDotFile(PrismLog out)
{
try {
model.exportToFile(Prism.EXPORT_DOT, true, new java.io.File("a.dot"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (PrismException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void clear()

5
prism/src/strat/Strategy.java

@ -54,6 +54,11 @@ public interface Strategy
*/
public void exportInducedModel(PrismLog out);
/**
* Export the strategy to a dot file (of the model showing the strategy).
*/
public void exportDotFile(PrismLog out);
/**
* Initialise the strategy, based on an initial model state.
* @param s Initial state of the model

Loading…
Cancel
Save