You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1173 lines
39 KiB

//==============================================================================
//
// Copyright (c) 2002-
// Authors:
// * Andrew Hinton <ug60axh@cs.bham.ac.uk> (University of Birmingham)
// * Dave Parker <david.parker@comlab.ox.ac.uk> (University of Oxford, formerly University of Birmingham)
// * Vincent Nimal <vincent.nimal@comlab.ox.ac.uk> (University of Oxford)
//
//------------------------------------------------------------------------------
//
// This file is part of PRISM.
//
// PRISM is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// PRISM is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with PRISM; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
//==============================================================================
package userinterface;
import java.util.*;
import java.util.List;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import parser.*;
import parser.ast.*;
import parser.type.*;
import prism.*;
import simulator.method.*;
/**
* GUISimulationPicker is a dialog to collect the details required for
* approximate (simulation-based) model checking: initial state, max path length,
* simulation method + parameters, etc.
*/
public class GUISimulationPicker extends javax.swing.JDialog implements KeyListener
{
// Default serial version ID
private static final long serialVersionUID = 1L;
//STATICS
public static final int NO_VALUES = 0;
public static final int VALUES_DONE = 1;
public static final int CANCELLED = 2;
public static SimulationInformation lastSimulationInformation = null;
//ATTRIBUTES
private GUIPrism gui;
private ModulesFile modulesFile;
private SimulationInformation information;
private boolean cancelled = true;
private JTable initValuesTable;
private DefineValuesTable initValuesModel;
// Last valid contents of text boxes
private String lastWidth;
private String lastConf;
private String lastNumSamples;
private boolean atLeastOneRwd;
private boolean atLeastOneQuant;
// Variables declaration - do not modify//GEN-BEGIN:variables
// Note: this code has now been modified manually; form is no longer used.
javax.swing.JTextField widthField;
javax.swing.JComboBox selectSimulationMethod;
javax.swing.JComboBox automaticCalculateCombo;
private javax.swing.JButton cancelButton;
javax.swing.JTextField confidenceField;
javax.swing.JTextField numberToDecide;
//private javax.swing.JCheckBox distributedCheck;
javax.swing.JTextField numSamplesField;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabelSSM;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel10;
private javax.swing.JPanel jPanel11;
private javax.swing.JPanel jPanel12;
private javax.swing.JPanel jPanel13;
private javax.swing.JPanel jPanel14;
private javax.swing.JPanel jPanel15;
private javax.swing.JPanel jPanel16;
private javax.swing.JPanel jPanel17;
private javax.swing.JPanel jPanel18;
private javax.swing.JPanel jPanel19;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel20;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private javax.swing.JPanel jPanel7;
private javax.swing.JPanel jPanel8;
private javax.swing.JPanel jPanel9;
private javax.swing.JButton okayButton;
javax.swing.JTextField pathLengthField;
javax.swing.JPanel topPanel;
javax.swing.JCheckBox useDefaultInitialCheck;
// End of variables declaration//GEN-END:variables
/**
* Create a new GUIConstantsPicker dialog to define info for simulation-based property checking.
* @param parent Parent GUI window
* @param exprs The properties to be checked (note: constants may not be defined)
* @param modulesFile The model that will be simulated (for initial state info)
* @param titleExtra Optional string to append to dialog (null if not needed)
* @throws PrismException if there is a problem getting initial state info from the model.
*/
public GUISimulationPicker(GUIPrism parent, List<Expression> exprs, ModulesFile modulesFile, String titleExtra) throws PrismException
{
super(parent, "Simulation Parameters" + ((titleExtra != null) ? (" - " + titleExtra) : ""), true);
this.gui = parent;
this.modulesFile = modulesFile;
// See if there are any reward props in the list to be checked
atLeastOneRwd = false;
for (Expression expr : exprs) {
if (expr instanceof ExpressionReward) {
atLeastOneRwd = true;
break;
}
}
// See if there are any quantitative (=?) props in the list to be checked
atLeastOneQuant = false;
for (Expression expr : exprs) {
if (Expression.isQuantitative(expr)) {
atLeastOneQuant = true;
break;
}
}
// Create a SimulationInformation object to store info in this dialog,
// (or re-use last one if user prefers to do that)
PrismSettings settings = parent.getPrism().getSettings();
if (lastSimulationInformation == null || settings.getString(PrismSettings.SIMULATOR_FIELD_CHOICE).equals("Always use defaults")) {
lastSimulationInformation = new SimulationInformation(settings);
// Pick a default method (CI for quantitative, SPRT for bounded)
lastSimulationInformation.setMethod(atLeastOneQuant ? SimulationInformation.Method.CI : SimulationInformation.Method.SPRT);
}
// Make sure method choice is valid (if remembered)
if (atLeastOneRwd && lastSimulationInformation.getMethod() == SimulationInformation.Method.APMC) {
lastSimulationInformation.setMethod(SimulationInformation.Method.CI);
}
if (atLeastOneQuant && lastSimulationInformation.getMethod() == SimulationInformation.Method.SPRT) {
lastSimulationInformation.setMethod(SimulationInformation.Method.CI);
}
lastSimulationInformation.setPropReward(atLeastOneRwd);
lastWidth = "" + lastSimulationInformation.getWidth();
lastConf = "" + lastSimulationInformation.getConfidence();
lastNumSamples = "" + lastSimulationInformation.getNumSamples();
// create "initial state" table
initValuesModel = new DefineValuesTable();
initValuesTable = new GreyableJTable();
initValuesTable.setModel(initValuesModel);
initValuesTable.setSelectionMode(DefaultListSelectionModel.SINGLE_INTERVAL_SELECTION);
initValuesTable.setCellSelectionEnabled(true);
// set up simulation information based on previous info (or defaults - see above)
information = lastSimulationInformation;
// currently, we deliberately do not recall the last initial state used
// since it may no longer be valid due to changes in the model
information.setInitialState(null);
// initialise
initComponents();
this.getRootPane().setDefaultButton(okayButton);
initTable();
initValues();
widthField.addKeyListener(this);
confidenceField.addKeyListener(this);
numSamplesField.addKeyListener(this);
doEnablesAndCalculations(true);
setResizable(false);
pack();
setLocationRelativeTo(getParent()); // centre
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
* Note: this code has now been modified manually; form is no longer used.
*/
private void initComponents()//GEN-BEGIN:initComponents
{
java.awt.GridBagConstraints gridBagConstraints;
jPanel6 = new javax.swing.JPanel();
okayButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
jPanel7 = new javax.swing.JPanel();
jPanel1 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
jPanel3 = new javax.swing.JPanel();
jPanel4 = new javax.swing.JPanel();
jPanel5 = new javax.swing.JPanel();
topPanel = new javax.swing.JPanel();
jPanel10 = new javax.swing.JPanel();
jPanel8 = new javax.swing.JPanel();
jPanel9 = new javax.swing.JPanel();
jLabelSSM = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
jLabel7 = new javax.swing.JLabel();
jPanel11 = new javax.swing.JPanel();
jPanel12 = new javax.swing.JPanel();
selectSimulationMethod = new javax.swing.JComboBox(); // new
automaticCalculateCombo = new javax.swing.JComboBox();
jPanel13 = new javax.swing.JPanel();
widthField = new javax.swing.JTextField();
confidenceField = new javax.swing.JTextField();
numberToDecide = new javax.swing.JTextField();
numSamplesField = new javax.swing.JTextField();
jPanel14 = new javax.swing.JPanel();
jPanel15 = new javax.swing.JPanel();
jPanel16 = new javax.swing.JPanel();
jLabel2 = new javax.swing.JLabel();
jPanel17 = new javax.swing.JPanel();
pathLengthField = new javax.swing.JTextField();
jPanel18 = new javax.swing.JPanel();
jPanel19 = new javax.swing.JPanel();
jPanel20 = new javax.swing.JPanel();
//distributedCheck = new javax.swing.JCheckBox();
useDefaultInitialCheck = new javax.swing.JCheckBox();
addWindowListener(new java.awt.event.WindowAdapter()
{
public void windowClosing(java.awt.event.WindowEvent evt)
{
closeDialog(evt);
}
});
jPanel6.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));
okayButton.setText("Okay");
okayButton.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
okayButtonActionPerformed(evt);
}
});
jPanel6.add(okayButton);
cancelButton.setText("Cancel");
cancelButton.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
cancelButtonActionPerformed(evt);
}
});
jPanel6.add(cancelButton);
getContentPane().add(jPanel6, java.awt.BorderLayout.SOUTH);
jPanel7.setLayout(new java.awt.BorderLayout());
jPanel1.setLayout(new java.awt.GridBagLayout());
jPanel1.setBorder(new javax.swing.border.TitledBorder("Initial state"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
jPanel1.add(jPanel2, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
jPanel1.add(jPanel3, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
jPanel1.add(jPanel4, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
jPanel1.add(jPanel5, gridBagConstraints);
useDefaultInitialCheck.setText("Use default initial state");
useDefaultInitialCheck.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
useDefaultInitialCheckActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
jPanel1.add(useDefaultInitialCheck, gridBagConstraints);
topPanel.setLayout(new java.awt.BorderLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
jPanel1.add(topPanel, gridBagConstraints);
jPanel7.add(jPanel1, java.awt.BorderLayout.CENTER);
jPanel10.setLayout(new javax.swing.BoxLayout(jPanel10, javax.swing.BoxLayout.Y_AXIS));
jPanel8.setLayout(new java.awt.GridBagLayout());
jPanel8.setBorder(new javax.swing.border.TitledBorder("Sampling parameters"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
jPanel8.add(jPanel9, gridBagConstraints);
jLabelSSM.setText("Simulation method:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
jPanel8.add(jLabelSSM, gridBagConstraints);
jLabel4.setText("Automatically calculate:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
jPanel8.add(jLabel4, gridBagConstraints);
jLabel5.setText("Width:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 6;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
jPanel8.add(jLabel5, gridBagConstraints);
jLabel6.setText("Confidence:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 7;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
jPanel8.add(jLabel6, gridBagConstraints);
jLabel7.setText("Number of samples:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 8;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
jPanel8.add(jLabel7, gridBagConstraints);
jPanel11.setPreferredSize(new java.awt.Dimension(10, 5));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 5;
jPanel8.add(jPanel11, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 3;
jPanel8.add(jPanel12, gridBagConstraints);
// Populate simulation method choices
Vector<String> methods = new Vector<String>();
methods.add("CI");
methods.add("ACI");
if (!atLeastOneRwd)
methods.add("APMC");
if (!atLeastOneQuant)
methods.add("SPRT");
selectSimulationMethod.setModel(new javax.swing.DefaultComboBoxModel(methods));
selectSimulationMethod.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
selectSimulationMethodActionPerformed(evt);
}
});
automaticCalculateCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { }));
automaticCalculateCombo.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
automaticCalculateComboActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
jPanel8.add(selectSimulationMethod, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
jPanel8.add(automaticCalculateCombo, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 5;
gridBagConstraints.gridy = 0;
jPanel8.add(jPanel13, gridBagConstraints);
widthField.setPreferredSize(new java.awt.Dimension(65, 20));
widthField.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
widthFieldActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 6;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
jPanel8.add(widthField, gridBagConstraints);
confidenceField.setPreferredSize(new java.awt.Dimension(60, 20));
confidenceField.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
confidenceFieldActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 7;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
jPanel8.add(confidenceField, gridBagConstraints);
numSamplesField.setPreferredSize(new java.awt.Dimension(60, 20));
numSamplesField.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
numSamplesFieldActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 8;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
jPanel8.add(numSamplesField, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 9;
jPanel8.add(jPanel14, gridBagConstraints);
jPanel10.add(jPanel8);
jPanel15.setLayout(new java.awt.GridBagLayout());
jPanel15.setBorder(new javax.swing.border.TitledBorder("Path parameters"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
jPanel15.add(jPanel16, gridBagConstraints);
jLabel2.setText("Maximum path length:");
jLabel2.setPreferredSize(new java.awt.Dimension(150, 15));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
jPanel15.add(jLabel2, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
jPanel15.add(jPanel17, gridBagConstraints);
pathLengthField.setPreferredSize(new java.awt.Dimension(158, 20));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
jPanel15.add(pathLengthField, gridBagConstraints);
jPanel18.setPreferredSize(new java.awt.Dimension(118, 10));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = 2;
jPanel15.add(jPanel18, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 6;
gridBagConstraints.gridy = 0;
jPanel15.add(jPanel19, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
jPanel15.add(jPanel20, gridBagConstraints);
//distributedCheck.setText("Distributed?");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
//jPanel15.add(distributedCheck, gridBagConstraints);
jPanel10.add(jPanel15);
jPanel7.add(jPanel10, java.awt.BorderLayout.EAST);
getContentPane().add(jPanel7, java.awt.BorderLayout.CENTER);
pack();
}//GEN-END:initComponents
private void numSamplesFieldActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_numSamplesFieldActionPerformed
{//GEN-HEADEREND:event_numSamplesFieldActionPerformed
doEnablesAndCalculations(false);
}//GEN-LAST:event_numSamplesFieldActionPerformed
private void confidenceFieldActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_confidenceFieldActionPerformed
{//GEN-HEADEREND:event_confidenceFieldActionPerformed
doEnablesAndCalculations(false);
}//GEN-LAST:event_confidenceFieldActionPerformed
private void widthFieldActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_approximationFieldActionPerformed
{//GEN-HEADEREND:event_widthFieldActionPerformed
doEnablesAndCalculations(false);
}//GEN-LAST:event_widthFieldActionPerformed
private void selectSimulationMethodActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_automaticCalculateComboActionPerformed
{//GEN-HEADEREND:event_selectSimulationMethodActionPerformed
doChangeSimulationMethod();
}//GEN-LAST:event_selectSimulationMethodActionPerformed
private void automaticCalculateComboActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_automaticCalculateComboActionPerformed
{//GEN-HEADEREND:event_automaticCalculateComboActionPerformed
doEnablesAndCalculations(true);
}//GEN-LAST:event_automaticCalculateComboActionPerformed
private static boolean isValidDoubleOrEmpty(String s)
{
if (s.isEmpty())
return true;
try {
Double.parseDouble(s);
} catch (NumberFormatException e) {
return false;
}
return true;
}
private void doChangeSimulationMethod()
{
// Remember choice for "Automatically calculate"
int automaticCalculateComboIndex = automaticCalculateCombo.getSelectedIndex();
// Store method, change text labels, and
// populate "Automatically calculate" choices based on method
information.setMethodByName((String) selectSimulationMethod.getSelectedItem());
switch (information.getMethod()) {
case CI:
jLabel5.setText("Width:");
jLabel6.setText("Confidence:");
automaticCalculateCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Width", "Confidence", "Number of samples" }));
break;
case ACI:
jLabel5.setText("Width:");
jLabel6.setText("Confidence:");
automaticCalculateCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Width", "Confidence", "Number of samples" }));
break;
case APMC:
jLabel5.setText("Approximation:");
jLabel6.setText("Confidence:");
automaticCalculateCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Approximation", "Confidence", "Number of samples" }));
break;
case SPRT:
jLabel5.setText("Indifference:");
jLabel6.setText("Type I/II error:");
automaticCalculateCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Number of samples" }));
break;
}
// Restore choice for "Automatically calculate"
// (unless empty list, indicated by -1 indexx, which means this the initial setup)
if (automaticCalculateComboIndex != -1) {
// If choice invalid due to list size change, reset to 0
if (automaticCalculateComboIndex > automaticCalculateCombo.getItemCount() - 1)
automaticCalculateComboIndex = 0;
automaticCalculateCombo.setSelectedIndex(automaticCalculateComboIndex);
}
}
/**
* Update dialog after a change in one of the controls.
* Enable/disable text fields as necessary.
* Compute new value for unknown fields.
* @param autoChange indicates that the "method" or "auto calc" has changed
*/
private void doEnablesAndCalculations(boolean autoChange)
{
double width, confidence;
int numSamples;
// Save valid values for later
if (isValidDoubleOrEmpty(confidenceField.getText()))
lastConf = confidenceField.getText();
if (isValidDoubleOrEmpty(numSamplesField.getText()))
lastNumSamples = numSamplesField.getText();
if (isValidDoubleOrEmpty(widthField.getText()))
lastWidth = widthField.getText();
// Store current unknown parameter
information.setUnknownByName((String) automaticCalculateCombo.getSelectedItem());
// Enable all text fields (then disable some below)
widthField.setEnabled(true);
confidenceField.setEnabled(true);
numSamplesField.setEnabled(true);
switch (information.getMethod()) {
case CI:
case ACI:
switch (information.getUnknown()) {
case WIDTH:
widthField.setEnabled(false);
widthField.setText("Unknown before sim.");
widthField.setCaretPosition(0);
// If method changes, display last valid values
if (autoChange) {
numSamplesField.setText(lastNumSamples);
numSamplesField.setCaretPosition(0);
confidenceField.setText(lastConf);
confidenceField.setCaretPosition(0);
}
break;
case CONFIDENCE:
confidenceField.setEnabled(false);
confidenceField.setText("Unknown before sim.");
confidenceField.setCaretPosition(0);
// If method changes, display last valid values
if (autoChange) {
widthField.setText(lastWidth);
widthField.setCaretPosition(0);
numSamplesField.setText(lastNumSamples);
numSamplesField.setCaretPosition(0);
}
break;
case NUM_SAMPLES:
numSamplesField.setEnabled(false);
numSamplesField.setText("Unknown before sim.");
numSamplesField.setCaretPosition(0);
// If method changes, display last valid values
if (autoChange) {
widthField.setText(lastWidth);
widthField.setCaretPosition(0);
confidenceField.setText(lastConf);
confidenceField.setCaretPosition(0);
}
break;
}
break;
case APMC:
switch (information.getUnknown()) {
case WIDTH:
widthField.setEnabled(false);
try {
confidence = Double.parseDouble(confidenceField.getText());
numSamples = Integer.parseInt(numSamplesField.getText());
if (confidence > 0 && confidence < 1 && numSamples > 0) {
widthField.setText("" + (new APMCapproximation(confidence, numSamples)).getMissingParameter());
widthField.setCaretPosition(0);
}
} catch (NumberFormatException e) {
// Any problems, don't update text field
} catch (PrismException e) {
// Any problems, don't update text field
}
// If method changes, display last valid values
if (autoChange) {
numSamplesField.setText(lastNumSamples);
numSamplesField.setCaretPosition(0);
confidenceField.setText(lastConf);
confidenceField.setCaretPosition(0);
}
break;
case CONFIDENCE:
confidenceField.setEnabled(false);
try {
width = Double.parseDouble(widthField.getText());
numSamples = Integer.parseInt(numSamplesField.getText());
if (width > 0 && numSamples > 0) {
try {
confidenceField.setText("" + (new APMCconfidence(width, numSamples)).getMissingParameter());
confidenceField.setCaretPosition(0);
} catch (PrismException e) {
// Catch this error to set helpful message
confidenceField.setText("Incr. approx/samples");
confidenceField.setCaretPosition(0);
}
}
} catch (NumberFormatException e) {
// Any problems, don't update text field
}
// If method changes, display last valid values
if (autoChange) {
widthField.setText(lastWidth);
widthField.setCaretPosition(0);
numSamplesField.setText(lastNumSamples);
numSamplesField.setCaretPosition(0);
}
break;
case NUM_SAMPLES:
numSamplesField.setEnabled(false);
try {
width = Double.parseDouble(widthField.getText());
confidence = Double.parseDouble(confidenceField.getText());
if (width > 0 && confidence > 0 && confidence < 1) {
numSamplesField.setText("" + (new APMCiterations(confidence, width)).getMissingParameter());
numSamplesField.setCaretPosition(0);
}
} catch (NumberFormatException e) {
// Any problems, don't update text field
} catch (PrismException e) {
// Any problems, don't update text field
}
// If method changes, display last valid values
if (autoChange) {
widthField.setText(lastWidth);
widthField.setCaretPosition(0);
confidenceField.setText(lastConf);
confidenceField.setCaretPosition(0);
}
break;
}
break;
case SPRT:
numSamplesField.setEnabled(false);
numSamplesField.setText("Unknown before sim.");
numSamplesField.setCaretPosition(0);
// If method changes, display last valid values
if (autoChange) {
widthField.setText(lastWidth);
widthField.setCaretPosition(0);
confidenceField.setText(lastConf);
confidenceField.setCaretPosition(0);
}
break;
}
}
private void initTable()
{
JScrollPane sp = new JScrollPane();
sp.setViewportView(initValuesTable);
topPanel.add(sp);
topPanel.setPreferredSize(new Dimension(300, 300));
}
/**
* Populate dialog using 'information' field.
*/
private void initValues()
{
// Use default initial state?
// (currently always the case on initialisation)
if (information.getInitialState() == null) {
// Tick box
useDefaultInitialCheck.setSelected(true);
// Put variable names in table, but no values
for (int i = 0; i < modulesFile.getNumVars(); i++) {
initValuesModel.addValue(new Value(modulesFile.getVarName(i), modulesFile.getVarType(i), null));
}
// Disable table
if (initValuesTable.getCellEditor() != null)
initValuesTable.getCellEditor().stopCellEditing();
initValuesTable.getSelectionModel().clearSelection();
initValuesTable.setEnabled(false);
} else {
// Untick box
useDefaultInitialCheck.setSelected(false);
// Set up table (from information)
// Need to add to add some validity checks here if re-enabled
for (int i = 0; i < modulesFile.getNumVars(); i++) {
initValuesModel.addValue(new Value(modulesFile.getVarName(i), modulesFile.getVarType(i), information.getInitialState().getValue(i)));
}
initValuesTable.setEnabled(true);
}
// populate parameter text boxes
widthField.setText("" + information.getWidth());
widthField.setCaretPosition(0);
confidenceField.setText("" + information.getConfidence());
confidenceField.setCaretPosition(0);
numSamplesField.setText("" + information.getNumSamples());
numSamplesField.setCaretPosition(0);
// note: do this after above "setText"s because it triggers a doEnablesAndCalculations()
selectSimulationMethod.setSelectedItem(information.getMethodName());
automaticCalculateCombo.setSelectedItem(information.getUnknownName());
pathLengthField.setText("" + information.getMaxPathLength());
//distributedCheck.setSelected(information.isDistributed());
}
/**
* Create a new GUIConstantsPicker dialog to define info for simulation-based property checking.
* @param parent Parent GUI window
* @param exprs The properties to be checked (note: constants may not be defined)
* @param modulesFile The model that will be simulated (for initial state info)
* @param titleExtra Optional string to append to dialog (null if not needed)
* @throws PrismException if there is a problem getting initial state info from the model.
*/
public static SimulationInformation defineSimulationWithDialog(GUIPrism parent, List<Expression> exprs, ModulesFile modulesFile, String titleExtra)
throws PrismException
{
return new GUISimulationPicker(parent, exprs, modulesFile, titleExtra).defineValues();
}
/**
* Create a new GUIConstantsPicker dialog to define info for simulation-based property checking.
* @param parent Parent GUI window
* @param expr The property to be checked (note: constants may not be defined)
* @param modulesFile The model that will be simulated (for initial state info)
* @param titleExtra Optional string to append to dialog (null if not needed)
* @throws PrismException if there is a problem getting initial state info from the model.
*/
public static SimulationInformation defineSimulationWithDialog(GUIPrism parent, Expression expr, ModulesFile modulesFile, String titleExtra)
throws PrismException
{
List<Expression> exprs = new ArrayList<Expression>(1);
exprs.add(expr);
return new GUISimulationPicker(parent, exprs, modulesFile, titleExtra).defineValues();
}
public SimulationInformation defineValues()
{
setVisible(true);
if (cancelled)
return null;
else
return information;
}
private void okayButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_okayButtonActionPerformed
{//GEN-HEADEREND:event_okayButtonActionPerformed
int i;
doEnablesAndCalculations(false);
if (initValuesTable.getCellEditor() != null)
initValuesTable.getCellEditor().stopCellEditing();
String parameter = "";
try {
// Check (editable) simulation parameters are ok, store in SimulationInformation
if (widthField.isEnabled()) {
parameter = jLabel5.getText().substring(0, jLabel5.getText().length() - 1);
double width = Double.parseDouble(widthField.getText());
if (width <= 0) {
gui.errorDialog("Parameter \"" + parameter + "\" most be positive");
return;
}
information.setWidth(width);
}
if (confidenceField.isEnabled()) {
parameter = jLabel6.getText().substring(0, jLabel6.getText().length() - 1);
double confidence = Double.parseDouble(confidenceField.getText());
if (confidence <= 0 || confidence >= 1) {
gui.errorDialog("Parameter \"" + parameter + "\" most be between 0 and 1");
return;
}
information.setConfidence(confidence);
}
if (numSamplesField.isEnabled()) {
parameter = "Number of samples";
int numSamples = Integer.parseInt(numSamplesField.getText());
if (numSamples <= 0) {
gui.errorDialog("Parameter \"" + parameter + "\" most be positive");
return;
}
information.setNumSamples(numSamples);
}
// Create SimulationMethod object, just to check parameters are ok
try {
information.createSimulationMethod().computeMissingParameterBeforeSim();
} catch (PrismException e) {
gui.errorDialog(e.getMessage());
return;
}
// Check/store max path length
parameter = "Maximum path length";
long maxPathLength = Long.parseLong(pathLengthField.getText());
if (maxPathLength <= 0) {
gui.errorDialog("Parameter \"" + parameter + "\" most be positive");
return;
}
information.setMaxPathLength(maxPathLength);
// Store initial state
if (useDefaultInitialCheck.isSelected()) {
information.setInitialState(null);
} else {
Values newInitState = new Values();
for (i = 0; i < initValuesModel.getNumValues(); i++) {
parameter = initValuesModel.getValue(i).name;
Object parameterValue = null;
if (initValuesModel.getValue(i).type instanceof TypeBool) {
String bool = initValuesModel.getValue(i).value.toString();
if (!(bool.equals("true") || bool.equals("false")))
throw new NumberFormatException();
parameterValue = new Boolean(bool);
} else if (initValuesModel.getValue(i).type instanceof TypeInt) {
parameterValue = new Integer(initValuesModel.getValue(i).value.toString());
} else {
throw new NumberFormatException();
}
newInitState.addValue(parameter, parameterValue);
}
information.setInitialState(newInitState);
}
//information.setDistributed(distributedCheck.isSelected());
cancelled = false;
lastSimulationInformation = information;
dispose();
} catch (NumberFormatException e) {
gui.errorDialog("Invalid value entered for parameter \"" + parameter + "\"");
}
}//GEN-LAST:event_okayButtonActionPerformed
private void useDefaultInitialCheckActionPerformed(java.awt.event.ActionEvent evt)
{
// If ticking...
if (useDefaultInitialCheck.isSelected()) {
// Clear values in table
for (int i = 0; i < modulesFile.getNumVars(); i++) {
initValuesModel.getValue(i).value = null;
}
// Disable table
if (initValuesTable.getCellEditor() != null)
initValuesTable.getCellEditor().stopCellEditing();
initValuesTable.getSelectionModel().clearSelection();
initValuesTable.setEnabled(false);
}
// If unticking
else {
// Set up table (based on default initial state)
try {
State defaultInitialState = modulesFile.getDefaultInitialState();
if (defaultInitialState == null)
throw new PrismException("");
for (int i = 0; i < modulesFile.getNumVars(); i++) {
initValuesModel.getValue(i).value = defaultInitialState.varValues[i];
}
} catch (PrismException e) {
// In case of error, clear values
for (int i = 0; i < modulesFile.getNumVars(); i++) {
initValuesModel.getValue(i).value = null;
}
}
initValuesTable.setEnabled(true);
}
}
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cancelButtonActionPerformed
{//GEN-HEADEREND:event_cancelButtonActionPerformed
dispose();
}//GEN-LAST:event_cancelButtonActionPerformed
/** Closes the dialog */
private void closeDialog(java.awt.event.WindowEvent evt)//GEN-FIRST:event_closeDialog
{
setVisible(false);
dispose();
}//GEN-LAST:event_closeDialog
public void keyPressed(KeyEvent e)
{
}
public void keyReleased(KeyEvent e)
{
doEnablesAndCalculations(false);
}
public void keyTyped(KeyEvent e)
{
}
class DefineValuesTable extends AbstractTableModel
{
ArrayList<Value> values;
public DefineValuesTable()
{
values = new ArrayList<Value>();
}
public void addValue(Value v)
{
values.add(v);
fireTableRowsInserted(values.size() - 1, values.size() - 1);
}
public int getNumValues()
{
return values.size();
}
public Value getValue(int i)
{
return values.get(i);
}
public int getColumnCount()
{
return 3;
}
public int getRowCount()
{
return values.size();
}
public Object getValueAt(int rowIndex, int columnIndex)
{
Value v = values.get(rowIndex);
switch (columnIndex) {
case 0:
return v.name;
case 1:
return v.type.getTypeString();
case 2:
return v.value == null ? "" : v.value.toString();
default:
return "";
}
}
public String getColumnName(int columnIndex)
{
switch (columnIndex) {
case 0:
return "Name";
case 1:
return "Type";
case 2:
return "Value";
default:
return "";
}
}
public boolean isCellEditable(int rowIndex, int columnIndex)
{
if (columnIndex == 2)
return true;
else
return false;
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{
if (columnIndex == 2) {
Value v = values.get(rowIndex);
String s = (String) aValue;
v.value = s;
fireTableCellUpdated(rowIndex, columnIndex);
}
}
public String toString()
{
String str = "";
for (int i = 0; i < values.size(); i++) {
Value c = values.get(i);
str += c.toString();
if (i != values.size() - 1)
str += ",";
}
return str;
}
}
class Value
{
String name;
parser.type.Type type;
Object value;
public Value(String name, parser.type.Type type, Object value)
{
this.name = name;
this.type = type;
this.value = value;
}
public String toString()
{
return name + "=" + value;
}
}
public class GreyableJTable extends JTable
{
private static final long serialVersionUID = 1L;
private TableCellRenderer tableCellRenderer = new TableCellRenderer()
{
private static final long serialVersionUID = 1L;
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = GreyableJTable.super.getCellRenderer(row, column).getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
c.setEnabled(table != null && table.isEnabled());
return c;
}
};
public TableCellRenderer getCellRenderer(int row, int column)
{
return tableCellRenderer;
}
}
}