Browse Source

Added option to verify PTAs in GUI (no experiments yet).

git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@2191 bbc10eb1-c90d-0410-af57-cb519fbb1720
master
Dave Parker 15 years ago
parent
commit
e9545cac7c
  1. 18
      prism/src/prism/PrismCL.java
  2. 99
      prism/src/userinterface/properties/GUIMultiProperties.java
  3. 124
      prism/src/userinterface/properties/computation/ModelCheckThread.java

18
prism/src/prism/PrismCL.java

@ -266,17 +266,17 @@ public class PrismCL
tmpLog.print(mfTmp.toString()); tmpLog.print(mfTmp.toString());
} }
// decide if model construction is necessary
// Decide if model construction is necessary
boolean doBuild = true; boolean doBuild = true;
// if explicitly disabled...
// If explicitly disabled...
if (nobuild) if (nobuild)
doBuild = false; doBuild = false;
// no need if using approximate (simulation-based) model checking...
// No need if using approximate (simulation-based) model checking...
if (simulate) if (simulate)
doBuild = false; doBuild = false;
// no need for PTA model checking (when not using digital clocks)...
else if (modulesFile.getModelType() == ModelType.PTA
&& !prism.getSettings().getString(PrismSettings.PRISM_PTA_METHOD).equals("Digital clocks"))
// No need if doing PTA model checking...
// (NB: PTA digital clocks excluded - has already been reduced to an MDP)
if (modulesFile.getModelType() == ModelType.PTA)
doBuild = false; doBuild = false;
// do model construction (if necessary) // do model construction (if necessary)
@ -396,12 +396,10 @@ public class PrismCL
// exact (non-appoximate) model checking // exact (non-appoximate) model checking
if (!simulate) { if (!simulate) {
// PTA model checking // PTA model checking
if (modulesFile.getModelType() == ModelType.PTA
&& !prism.getSettings().getString(PrismSettings.PRISM_PTA_METHOD).equals(
"Digital clocks")) {
if (modulesFile.getModelType() == ModelType.PTA) {
res = prism.modelCheckPTA(modulesFile, propertiesFile, propertiesToCheck[j]); res = prism.modelCheckPTA(modulesFile, propertiesFile, propertiesToCheck[j]);
} }
// non-PTA model checking
// Non-PTA model checking
else { else {
res = prism.modelCheck(model, propertiesFile, propertiesToCheck[j]); res = prism.modelCheck(model, propertiesFile, propertiesToCheck[j]);
} }

99
prism/src/userinterface/properties/GUIMultiProperties.java

@ -61,14 +61,15 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
public static final int WARN_INVALID_PROPS = 1; public static final int WARN_INVALID_PROPS = 1;
public static final int NEVER_INVALID_PROPS = 2; public static final int NEVER_INVALID_PROPS = 2;
//ATTRIBUTES
// ATTRIBUTES
// current model (gets updated only by event listening to GUIModel)
// Current model (gets updated only by event listening to GUIModel)
private ModulesFile parsedModel; private ModulesFile parsedModel;
private Model builtModel; private Model builtModel;
private Values lastBuildValues;
// Constants for model (updated by events or locally)
private Values mfConstants;
//state
// State
private boolean modified; private boolean modified;
private boolean modifiedSinceBuild; private boolean modifiedSinceBuild;
private boolean computing; private boolean computing;
@ -77,10 +78,9 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
private PropertiesFile parsedProperties; private PropertiesFile parsedProperties;
private ArrayList<GUIProperty> propertiesToBeVerified; private ArrayList<GUIProperty> propertiesToBeVerified;
private File activeFile; private File activeFile;
private Values lastPFConstants;
private Values lastSimulateValues;
private Values pfConstants;
//gui
// GUI
private GUIPrismFileFilter propsFilter[]; private GUIPrismFileFilter propsFilter[];
private GUIPrismFileFilter textFilter[]; private GUIPrismFileFilter textFilter[];
private JMenu propMenu; private JMenu propMenu;
@ -90,11 +90,10 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
private JScrollPane expScroller; private JScrollPane expScroller;
private JLabel fileLabel; private JLabel fileLabel;
private Vector clipboardVector; private Vector clipboardVector;
private Action newProps, openProps, saveProps, savePropsAs, insertProps, verifySelected, newProperty, editProperty, newConstant, removeConstant, newLabel, private Action newProps, openProps, saveProps, savePropsAs, insertProps, verifySelected, newProperty, editProperty, newConstant, removeConstant, newLabel,
removeLabel, newExperiment, deleteExperiment, stopExperiment, viewResults, plotResults, exportResults, simulate, details; removeLabel, newExperiment, deleteExperiment, stopExperiment, viewResults, plotResults, exportResults, simulate, details;
//current properties
// Current properties
private GUIPropertiesList propList; private GUIPropertiesList propList;
private GUIPropConstantList consTable; private GUIPropConstantList consTable;
private GUIPropLabelList labTable; private GUIPropLabelList labTable;
@ -103,7 +102,7 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
private Font displayFontFast; private Font displayFontFast;
private Color backgroundFast, warningFast; private Color backgroundFast, warningFast;
//CONSTRUCTORS
// CONSTRUCTORS
/** Creates a new instance of GUIMultiProperties */ /** Creates a new instance of GUIMultiProperties */
public GUIMultiProperties(GUIPrism pr, GUISimulator simulator) public GUIMultiProperties(GUIPrism pr, GUISimulator simulator)
@ -184,14 +183,10 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
protected void verifyAfterBuild() protected void verifyAfterBuild()
{ {
verifyAfterReceiveBuildNotification = false; verifyAfterReceiveBuildNotification = false;
// Re-enable GUI elements
propList.setEnabled(true);
consTable.setEnabled(true);
labTable.setEnabled(true);
// Start model check process // Start model check process
if (builtModel != null && parsedProperties != null && propertiesToBeVerified != null) { if (builtModel != null && parsedProperties != null && propertiesToBeVerified != null) {
Thread t = new ModelCheckThread(this, builtModel, parsedProperties, propertiesToBeVerified, lastBuildValues, lastPFConstants);
Thread t = new ModelCheckThread(this, builtModel, parsedProperties, propertiesToBeVerified, mfConstants, pfConstants);
t.setPriority(Thread.NORM_PRIORITY); t.setPriority(Thread.NORM_PRIORITY);
t.start(); t.start();
} }
@ -200,46 +195,54 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
protected void verifyAfterParse() protected void verifyAfterParse()
{ {
ArrayList<GUIProperty> validGUIProperties; ArrayList<GUIProperty> validGUIProperties;
Values buildValues;
UndefinedConstants uCon; UndefinedConstants uCon;
verifyAfterReceiveParseNotification = false; verifyAfterReceiveParseNotification = false;
// Get valid/selected properties
try { try {
// Get valid/selected properties
String propertiesString = getLabelsString() + "\n" + getConstantsString() + "\n" + propList.getValidSelectedString(); String propertiesString = getLabelsString() + "\n" + getConstantsString() + "\n" + propList.getValidSelectedString();
// Get PropertiesFile for valid/selected properties // Get PropertiesFile for valid/selected properties
parsedProperties = getPrism().parsePropertiesString(parsedModel, propertiesString); parsedProperties = getPrism().parsePropertiesString(parsedModel, propertiesString);
// And get list of corresponding GUIProperty objects // And get list of corresponding GUIProperty objects
validGUIProperties = propList.getValidSelectedProperties(); validGUIProperties = propList.getValidSelectedProperties();
} catch (PrismException e) {
error(e.getMessage());
return;
}
// Query user for undefined constant values (if required)
try {
// Query user for undefined constant values (if required)
uCon = new UndefinedConstants(parsedModel, parsedProperties); uCon = new UndefinedConstants(parsedModel, parsedProperties);
if (uCon.getMFNumUndefined() + uCon.getPFNumUndefined() > 0) { if (uCon.getMFNumUndefined() + uCon.getPFNumUndefined() > 0) {
int result = GUIConstantsPicker.defineConstantsWithDialog(this.getGUI(), uCon, lastBuildValues, lastPFConstants);
// Use previous constant values as defaults in dialog
int result = GUIConstantsPicker.defineConstantsWithDialog(this.getGUI(), uCon, mfConstants, pfConstants);
if (result != GUIConstantsPicker.VALUES_DONE) if (result != GUIConstantsPicker.VALUES_DONE)
return; return;
} }
buildValues = uCon.getMFConstantValues();
lastPFConstants = uCon.getPFConstantValues();
parsedProperties.setUndefinedConstants(lastPFConstants);
// Store model constants (even though will be stored again after build)
// Don't set in model: this will be done during build process
mfConstants = uCon.getMFConstantValues();
// Store property constants and set in file
pfConstants = uCon.getPFConstantValues();
parsedProperties.setUndefinedConstants(pfConstants);
// Store properties to be verified
propertiesToBeVerified = validGUIProperties;
// If required, trigger build then verify
if (parsedModel.getModelType() != ModelType.PTA) {
verifyAfterReceiveBuildNotification = true;
notifyEventListeners(new GUIPropertiesEvent(GUIPropertiesEvent.REQUEST_MODEL_BUILD, mfConstants));
}
// If no build required (e.g. for PTAs), just do model checking now
else {
// Start model check process
parsedModel.setUndefinedConstants(mfConstants);
if (parsedProperties != null && propertiesToBeVerified != null) {
Thread t = new ModelCheckThread(this, parsedModel, parsedProperties, propertiesToBeVerified, mfConstants, pfConstants);
t.setPriority(Thread.NORM_PRIORITY);
t.start();
}
}
} catch (PrismException e) { } catch (PrismException e) {
error(e.getMessage()); error(e.getMessage());
return; return;
} }
// Disable GUI elements in Properties tab
propList.setEnabled(false);
consTable.setEnabled(false);
// Trigger build then verify
verifyAfterReceiveBuildNotification = true;
propertiesToBeVerified = validGUIProperties;
notifyEventListeners(new GUIPropertiesEvent(GUIPropertiesEvent.REQUEST_MODEL_BUILD, buildValues));
} }
public void simulateAfterParse() public void simulateAfterParse()
@ -285,15 +288,16 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
try { try {
uCon = new UndefinedConstants(parsedModel, parsedProperties); uCon = new UndefinedConstants(parsedModel, parsedProperties);
if (uCon.getMFNumUndefined() + uCon.getPFNumUndefined() > 0) { if (uCon.getMFNumUndefined() + uCon.getPFNumUndefined() > 0) {
int result = GUIConstantsPicker.defineConstantsWithDialog(this.getGUI(), uCon, lastSimulateValues, lastPFConstants);
// Use previous constant values as defaults in dialog
int result = GUIConstantsPicker.defineConstantsWithDialog(this.getGUI(), uCon, mfConstants, pfConstants);
if (result != GUIConstantsPicker.VALUES_DONE) if (result != GUIConstantsPicker.VALUES_DONE)
return; return;
} }
lastSimulateValues = uCon.getMFConstantValues();
lastPFConstants = uCon.getPFConstantValues();
parsedModel.setUndefinedConstants(lastSimulateValues);
parsedProperties.setUndefinedConstants(lastPFConstants);
// Store model/property constants and set in files
mfConstants = uCon.getMFConstantValues();
pfConstants = uCon.getPFConstantValues();
parsedModel.setUndefinedConstants(mfConstants);
parsedProperties.setUndefinedConstants(pfConstants);
SimulationInformation info = GUISimulationPicker.defineSimulationWithDialog(this.getGUI(), parsedModel.getInitialValues(), parsedModel); SimulationInformation info = GUISimulationPicker.defineSimulationWithDialog(this.getGUI(), parsedModel.getInitialValues(), parsedModel);
if (info == null) if (info == null)
@ -308,7 +312,7 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
new GUISimulatorDistributionDialog(getGUI(), getPrism().getSimulator(), true).show(this, parsedModel, parsedProperties, validGUIProperties, new GUISimulatorDistributionDialog(getGUI(), getPrism().getSimulator(), true).show(this, parsedModel, parsedProperties, validGUIProperties,
info); info);
} else { } else {
Thread t = new SimulateModelCheckThread(this, parsedModel, parsedProperties, validGUIProperties, lastSimulateValues, lastPFConstants,
Thread t = new SimulateModelCheckThread(this, parsedModel, parsedProperties, validGUIProperties, mfConstants, pfConstants,
initialState, noIterations, maxPathLength, info); initialState, noIterations, maxPathLength, info);
t.setPriority(Thread.NORM_PRIORITY); t.setPriority(Thread.NORM_PRIORITY);
t.start(); t.start();
@ -541,8 +545,10 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
newProperty.setEnabled(!computing); newProperty.setEnabled(!computing);
editProperty.setEnabled(!computing && propList.getSelectedProperties().size() > 0); editProperty.setEnabled(!computing && propList.getSelectedProperties().size() > 0);
// constants list // constants list
consTable.setEnabled(!computing);
removeConstant.setEnabled(consTable.getSelectedRowCount() > 0); removeConstant.setEnabled(consTable.getSelectedRowCount() > 0);
// label list // label list
labTable.setEnabled(!computing);
removeLabel.setEnabled(labTable.getSelectedRowCount() > 0); removeLabel.setEnabled(labTable.getSelectedRowCount() > 0);
// newExperiment: enabled if there is exactly one prop selected and it is valid // newExperiment: enabled if there is exactly one prop selected and it is valid
@ -1032,7 +1038,7 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
} else if (me.getID() == GUIModelEvent.MODEL_BUILT) { } else if (me.getID() == GUIModelEvent.MODEL_BUILT) {
setBuiltModel(me.getModel()); setBuiltModel(me.getModel());
if (me.getBuildValues() != null) if (me.getBuildValues() != null)
lastBuildValues = me.getBuildValues();
mfConstants = me.getBuildValues();
modifiedSinceBuild = false; modifiedSinceBuild = false;
if (verifyAfterReceiveBuildNotification) if (verifyAfterReceiveBuildNotification)
verifyAfterBuild(); verifyAfterBuild();
@ -1820,7 +1826,6 @@ public class GUIMultiProperties extends GUIPlugin implements MouseListener, List
stopExperiment.putValue(Action.LONG_DESCRIPTION, "Stops the Experiment that is currently running"); stopExperiment.putValue(Action.LONG_DESCRIPTION, "Stops the Experiment that is currently running");
stopExperiment.putValue(Action.SMALL_ICON, GUIPrism.getIconFromImage("smallStop.png")); stopExperiment.putValue(Action.SMALL_ICON, GUIPrism.getIconFromImage("smallStop.png"));
stopExperiment.setEnabled(false); stopExperiment.setEnabled(false);
} }
/** /**

124
prism/src/userinterface/properties/computation/ModelCheckThread.java

@ -38,35 +38,57 @@ import userinterface.util.*;
import userinterface.properties.*; import userinterface.properties.*;
/** /**
*
* @author ug60axh
* Thread that executes model checking of a property via PRISM.
*/ */
public class ModelCheckThread extends GUIComputationThread public class ModelCheckThread extends GUIComputationThread
{ {
// Access to GUI (to send notifications etc.)
private GUIMultiProperties parent; private GUIMultiProperties parent;
// Model (in most cases, have a Model object; in others, e.g. PTA model checking,
// we just have the language-level model description, i.e. a ModulesFile).
// Currently exactly one-of m/mf is non-null
private Model m; private Model m;
private PropertiesFile prFi;
private ModulesFile mf;
// Properties file and GUI properties (these are assumed to match)
// (Also need properties file for access to constants/labels/etc.)
private PropertiesFile pf;
private ArrayList<GUIProperty> guiProps; private ArrayList<GUIProperty> guiProps;
// Values give to constants
private Values definedMFConstants; private Values definedMFConstants;
private Values definedPFConstants; private Values definedPFConstants;
/** Creates a new instance of ModelCheckThread */
public ModelCheckThread(GUIMultiProperties parent, Model m, PropertiesFile prFi, ArrayList<GUIProperty> guiProps, Values definedMFConstants, Values definedPFConstants)
/**
* Create a new instance of ModelCheckThread (where a Model has been built)
*/
public ModelCheckThread(GUIMultiProperties parent, Model m, PropertiesFile pf, ArrayList<GUIProperty> guiProps, Values definedMFConstants,
Values definedPFConstants)
{ {
super(parent); super(parent);
this.parent = parent; this.parent = parent;
this.m = m; this.m = m;
this.prFi = prFi;
this.mf = null;
this.pf = pf;
this.guiProps = guiProps; this.guiProps = guiProps;
this.definedMFConstants = definedMFConstants; this.definedMFConstants = definedMFConstants;
this.definedPFConstants = definedPFConstants; this.definedPFConstants = definedPFConstants;
} }
/**
* Create a new instance of ModelCheckThread (where no Model has been built, e.g. PTAs)
*/
public ModelCheckThread(GUIMultiProperties parent, ModulesFile mf, PropertiesFile pf, ArrayList<GUIProperty> guiProps, Values definedMFConstants,
Values definedPFConstants)
{
this(parent, (Model) null, pf, guiProps, definedMFConstants, definedPFConstants);
this.mf = mf;
}
public void run() public void run()
{ {
if(m == null) return;
//Notify user interface of the start of computation
if (m == null && mf == null)
return;
// Notify user interface of the start of computation
SwingUtilities.invokeLater(new Runnable() SwingUtilities.invokeLater(new Runnable()
{ {
public void run() public void run()
@ -76,54 +98,67 @@ public class ModelCheckThread extends GUIComputationThread
parent.notifyEventListeners(new GUIComputationEvent(GUIComputationEvent.COMPUTATION_START, parent)); parent.notifyEventListeners(new GUIComputationEvent(GUIComputationEvent.COMPUTATION_START, parent));
} }
}); });
Result result = null; Result result = null;
//Set icon for all properties to be verified to a clock
for(int i = 0; i < guiProps.size(); i++)
{
// Set icon for all properties to be verified to a clock
for (int i = 0; i < guiProps.size(); i++) {
GUIProperty gp = guiProps.get(i); GUIProperty gp = guiProps.get(i);
gp.setStatus(GUIProperty.STATUS_DOING); gp.setStatus(GUIProperty.STATUS_DOING);
parent.repaintList(); parent.repaintList();
} }
IconThread ic = new IconThread(null); IconThread ic = new IconThread(null);
for(int i = 0; i < prFi.getNumProperties(); i++)
{
// get property
// Work through list of properties
for (int i = 0; i < pf.getNumProperties(); i++) {
// Get ith property
GUIProperty gp = guiProps.get(i); GUIProperty gp = guiProps.get(i);
// animate it's clock icon
// Animate it's clock icon
ic = new IconThread(gp); ic = new IconThread(gp);
ic.start(); ic.start();
// do model checking
try
{
// Do model checking
try {
// Print info to log
logln("\n-------------------------------------------"); logln("\n-------------------------------------------");
logln("\nModel checking: " + prFi.getProperty(i));
if (definedMFConstants != null) if (definedMFConstants.getNumValues() > 0) logln("Model constants: " + definedMFConstants);
if (definedPFConstants != null) if (definedPFConstants.getNumValues() > 0) logln("Property constants: " + definedPFConstants);
result = prism.modelCheck(m, prFi, prFi.getProperty(i));
}
catch(PrismException e)
{
logln("\nModel checking: " + pf.getProperty(i));
if (definedMFConstants != null)
if (definedMFConstants.getNumValues() > 0)
logln("Model constants: " + definedMFConstants);
if (definedPFConstants != null)
if (definedPFConstants.getNumValues() > 0)
logln("Property constants: " + definedPFConstants);
// No model (PTA) case
if (m == null) {
if (mf.getModelType() != ModelType.PTA)
throw new PrismException("No model to verify");
result = prism.modelCheckPTA(mf, pf, pf.getProperty(i));
}
// Normal model checking
else {
result = prism.modelCheck(m, pf, pf.getProperty(i));
}
} catch (PrismException e) {
result = new Result(e); result = new Result(e);
error(e.getMessage()); error(e.getMessage());
} }
ic.interrupt(); ic.interrupt();
try
{
try {
ic.join(); ic.join();
} catch (InterruptedException e) {
} }
catch(InterruptedException e)
{}
//while(!ic.canContinue){} //while(!ic.canContinue){}
gp.setResult(result); gp.setResult(result);
gp.setMethodString("Verification"); gp.setMethodString("Verification");
gp.setConstants(definedMFConstants, definedPFConstants); gp.setConstants(definedMFConstants, definedPFConstants);
parent.repaintList(); parent.repaintList();
} }
// Notify user interface of the end of computation
SwingUtilities.invokeLater(new Runnable() SwingUtilities.invokeLater(new Runnable()
{ {
public void run() public void run()
@ -136,11 +171,13 @@ public class ModelCheckThread extends GUIComputationThread
}); });
} }
// Clock animation icon
class IconThread extends Thread class IconThread extends Thread
{ {
GUIProperty gp; GUIProperty gp;
ImageIcon[] images; ImageIcon[] images;
boolean canContinue = false; boolean canContinue = false;
public IconThread(GUIProperty gp) public IconThread(GUIProperty gp)
{ {
this.gp = gp; this.gp = gp;
@ -154,22 +191,19 @@ public class ModelCheckThread extends GUIComputationThread
images[6] = GUIPrism.getIconFromImage("smallClockAnim7.png"); images[6] = GUIPrism.getIconFromImage("smallClockAnim7.png");
images[7] = GUIPrism.getIconFromImage("smallClockAnim8.png"); images[7] = GUIPrism.getIconFromImage("smallClockAnim8.png");
} }
public void run() public void run()
{ {
try
{
try {
int counter = 0; int counter = 0;
while(!interrupted() && gp != null)
{
while (!interrupted() && gp != null) {
counter++; counter++;
counter = counter%8;
counter = counter % 8;
gp.setDoingImage(images[counter]); gp.setDoingImage(images[counter]);
parent.repaintList(); parent.repaintList();
sleep(150); sleep(150);
} }
}
catch(InterruptedException e)
{
} catch (InterruptedException e) {
} }
canContinue = true; canContinue = true;
} }

Loading…
Cancel
Save