/** Constructor. */ public PTAModelChecker(Prism prism, ModulesFile modulesFile, PropertiesFile propertiesFile) throws PrismException { this.prism = prism; mainLog = prism.getMainLog(); this.modulesFile = modulesFile; this.propertiesFile = propertiesFile; // Get combined constant values from model/properties constantValues = new Values(); constantValues.addValues(modulesFile.getConstantValues()); if (propertiesFile != null) constantValues.addValues(propertiesFile.getConstantValues()); // Build a combined label list and expand any constants // (note labels in model are ignored (removed) during PTA translation so need to store here) labelList = new LabelList(); for (int i = 0; i < modulesFile.getLabelList().size(); i++) { labelList.addLabel( modulesFile.getLabelList().getLabelNameIdent(i), modulesFile.getLabelList().getLabel(i).deepCopy()); } for (int i = 0; i < propertiesFile.getLabelList().size(); i++) { labelList.addLabel( propertiesFile.getLabelList().getLabelNameIdent(i), propertiesFile.getLabelList().getLabel(i).deepCopy()); } labelList = (LabelList) labelList.replaceConstants(constantValues); // Build mapping from all (original model) variables to non-clocks only int numVars = modulesFile.getNumVars(); nonClockVarMap = new int[numVars]; int count = 0; for (int i = 0; i < numVars; i++) { if (modulesFile.getVarType(i) instanceof TypeClock) { nonClockVarMap[i] = -1; } else { nonClockVarMap[i] = count++; } } }
/** * Determine which locations in the PTA satisfy a (Boolean) expression. Note: This is rather * inefficiently at the moment. TODO: potentially use explicit.StateMC on dummy model eventually */ private BitSet checkLocationExpression(Expression expr) throws PrismException { int i, n; BitSet res; // Labels - expand and recurse // (note: currently not used - these are expanded earlier) if (expr instanceof ExpressionLabel) { ExpressionLabel exprLabel = (ExpressionLabel) expr; if (exprLabel.getName().equals("deadlock")) throw new PrismException("The \"deadlock\" label is not yet supported for PTAs"); if (exprLabel.getName().equals("init")) throw new PrismException("The \"init\" label is not yet supported for PTAs"); i = labelList.getLabelIndex(exprLabel.getName()); if (i == -1) throw new PrismException("Unknown label \"" + exprLabel.getName() + "\" in property"); // Check recursively return checkLocationExpression(labelList.getLabel(i)); } // Other expressions... else { List<Object> states; // Object[] state; states = pta.getLocationNameList(); n = states.size(); res = new BitSet(n); for (i = 0; i < n; i++) { // state = (Object[])states.get(i); State state = (State) states.get(i); if (expr.evaluateBoolean(state, nonClockVarMap)) { res.set(i); } } } return res; }