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.
207 lines
5.8 KiB
207 lines
5.8 KiB
/*
|
|
* This file is part of a Java port of the program ltl2dstar
|
|
* (http://www.ltl2dstar.de/) for PRISM (http://www.prismmodelchecker.org/)
|
|
* Copyright (C) 2005-2007 Joachim Klein <j.klein@ltl2dstar.de>
|
|
* Copyright (c) 2007 Carlos Bederian
|
|
* Copyright (c) 2011- David Parker, Hongyang Qu
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program 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 this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
package jltl2dstar;
|
|
|
|
import java.io.FileNotFoundException;
|
|
import java.io.FileWriter;
|
|
import java.io.PrintStream;
|
|
import java.util.*;
|
|
|
|
import acceptance.AcceptanceRabin;
|
|
import jltl2ba.APElement;
|
|
import jltl2ba.APSet;
|
|
import prism.PrismException;
|
|
|
|
/**
|
|
* A class representing a deterministic Rabin automaton.
|
|
* <p>
|
|
* For details on the template parameters, see class DA.
|
|
* </p>
|
|
* The DRA can be considered as a Streett automaton, if
|
|
* a flag is set.
|
|
*/
|
|
public class DRA extends DA {
|
|
|
|
/** Marker, is this DRA considered as a Streett automaton? */
|
|
private boolean _isStreett;
|
|
|
|
/**
|
|
* Constructor.
|
|
* @param ap_set the underlying APSet
|
|
*/
|
|
public DRA(APSet ap_set) {
|
|
super(ap_set);
|
|
_isStreett = false;
|
|
}
|
|
|
|
public static DRA newInstance(APSet ap_set) {
|
|
return new DRA(ap_set);
|
|
}
|
|
|
|
private String typeID() {
|
|
if (isStreett()) {
|
|
return "DSA";
|
|
} else {
|
|
return "DRA";
|
|
}
|
|
}
|
|
|
|
/** Is this DRA considered as a Streett automaton? */
|
|
public boolean isStreett()
|
|
{
|
|
return _isStreett;
|
|
}
|
|
|
|
/** Consider this DRA as a Streett automaton. */
|
|
public void considerAsStreett(boolean flag)
|
|
{
|
|
_isStreett=flag;
|
|
}
|
|
|
|
|
|
/**
|
|
* Print the DRA/DSA in v2 format to the output stream.
|
|
* This function can compact the automaton, which may invalidate iterators!
|
|
*/
|
|
public void print(PrintStream out) throws PrismException {
|
|
if (!this.isCompact()) {
|
|
this.makeCompact();
|
|
}
|
|
|
|
this.print(typeID(), out);
|
|
}
|
|
|
|
/**
|
|
* Print the DRA/DSA in dot format to the output stream.
|
|
* This function can compact the automaton, which may invalidate iterators!
|
|
*/
|
|
public void printDot(PrintStream out) throws PrismException {
|
|
if (!this.isCompact()) {
|
|
this.makeCompact();
|
|
}
|
|
|
|
this.printDot(typeID(), out);
|
|
}
|
|
|
|
/**
|
|
* Print the DRA/DSA in DOT format to the output stream.
|
|
* This function can compact the automaton, which may invalidate iterators!
|
|
*/
|
|
// void print_dot(std::ostream& out)
|
|
|
|
/**
|
|
* Optimizes the acceptance condition.
|
|
* This function may delete acceptance pairs,
|
|
* which can invalidate iterators.
|
|
*/
|
|
public void optimizeAcceptanceCondition() throws PrismException {
|
|
|
|
for (Iterator<Integer> it = this.acceptance().iterator(); it.hasNext(); ) {
|
|
Integer id = it.next();
|
|
|
|
if (this.acceptance().getAcceptance_L(id) == null)
|
|
continue;
|
|
|
|
// L = L \ U
|
|
if (this.acceptance().getAcceptance_L(id).intersects(this.acceptance().getAcceptance_U(id))) {
|
|
this.acceptance().getAcceptance_L(id).andNot(this.acceptance().getAcceptance_U(id));
|
|
}
|
|
|
|
// remove if L is empty
|
|
if (this.acceptance().getAcceptance_L(id).isEmpty()) {
|
|
// no state is in L(id) -> remove
|
|
this.acceptance().removeAcceptancePair(id);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public DRA calculateUnion(DRA other, boolean trueloop_check, boolean detailed_states) throws PrismException {
|
|
if (this.isStreett() || other.isStreett()) {
|
|
throw new PrismException("Can not calculate union for Streett automata");
|
|
}
|
|
|
|
return DAUnionAlgorithm.calculateUnion(this, other, trueloop_check, detailed_states);
|
|
}
|
|
|
|
/**
|
|
* Convert the DRA from jltl2dstar to PRISM data structures.
|
|
*/
|
|
public prism.DA<BitSet,AcceptanceRabin> createPrismDRA() throws PrismException
|
|
{
|
|
int i, k, numLabels, numStates, src, dest;
|
|
List<String> apList;
|
|
BitSet bitset;
|
|
RabinAcceptance acc;
|
|
prism.DA<BitSet,AcceptanceRabin> draNew;
|
|
AcceptanceRabin accNew = new AcceptanceRabin();
|
|
|
|
numLabels = getAPSize();
|
|
numStates = size();
|
|
draNew = new prism.DA<BitSet,AcceptanceRabin>(numStates);
|
|
// Copy AP set
|
|
apList = new ArrayList<String>(numLabels);
|
|
for (i = 0; i < numLabels; i++) {
|
|
apList.add(getAPSet().getAP(i));
|
|
}
|
|
draNew.setAPList(apList);
|
|
// Copy start state
|
|
draNew.setStartState(getStartState().getName());
|
|
// Copy edges
|
|
for (i = 0; i < numStates; i++) {
|
|
DA_State cur_state = get(i);
|
|
src = cur_state.getName();
|
|
for (Map.Entry<APElement, DA_State> transition : cur_state.edges().entrySet()) {
|
|
dest = transition.getValue().getName();
|
|
bitset = new BitSet();
|
|
for (k = 0; k < numLabels; k++) {
|
|
bitset.set(k, transition.getKey().get(k));
|
|
}
|
|
draNew.addEdge(src, bitset, dest);
|
|
}
|
|
}
|
|
// Copy acceptance pairs
|
|
acc = acceptance();
|
|
for (i = 0; i < acc.size(); i++) {
|
|
// Note: Pairs (U_i,L_i) become (L_i,K_i) in PRISM's notation
|
|
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;
|
|
}
|
|
|
|
// public DRA calculateUnionStuttered(DRA other,
|
|
// StutterSensitivenessInformation stutter_information,
|
|
// boolean trueloop_check,
|
|
// boolean detailed_states) {
|
|
// if (this.isStreett() || other.isStreett()) {
|
|
// throw new PrismException("Can not calculate union for Streett automata");
|
|
// }
|
|
//
|
|
// return DAUnionAlgorithm<DRA>.calculateUnionStuttered(this, other, stutter_information, trueloop_check, detailed_states);
|
|
// }
|
|
}
|