@ -2,10 +2,12 @@ package prism;
import java.util.BitSet ;
import explicit.SCCComputer ;
import acceptance.AcceptanceOmega ;
import acceptance.AcceptanceRabin ;
import acceptance.AcceptanceReach ;
import acceptance.AcceptanceType ;
import acceptance.AcceptanceRabin.RabinPair ;
public class DASimplifyAcceptance
{
@ -15,13 +17,25 @@ public class DASimplifyAcceptance
* Note that the passed parameter { @code da } may be destroyed by this function .
* @param da the DA to be simplified ( may be destroyed )
* @param allowedAcceptance the allowed acceptance types
* @return
* /
public static DA < BitSet , ? extends AcceptanceOmega > simplifyAcceptance ( DA < BitSet , ? extends AcceptanceOmega > da , AcceptanceType . . . allowedAcceptance ) {
@SuppressWarnings ( "unchecked" )
public static DA < BitSet , ? extends AcceptanceOmega > simplifyAcceptance ( DA < BitSet , ? extends AcceptanceOmega > da , AcceptanceType . . . allowedAcceptance )
throws PrismException
{
/ / Simplifications for DRAs
if ( da . getAcceptance ( ) instanceof AcceptanceRabin ) {
DA < BitSet , AcceptanceRabin > dra = ( DA < BitSet , AcceptanceRabin > ) da ;
if ( AcceptanceType . contains ( allowedAcceptance , AcceptanceType . REACH ) & &
isDFA ( dra ) ) {
/ / K_i states that do not occur in a ( non - trivial ) SCC of the DRA may as well be removed
SCCComputer sccComp = explicit . SCCComputer . createSCCComputer ( null , new LTSFromDA ( da ) ) ;
sccComp . computeBSCCs ( ) ;
BitSet trivial = sccComp . getNotInSCCs ( ) ;
for ( RabinPair pair : dra . getAcceptance ( ) ) {
if ( pair . getK ( ) . intersects ( trivial ) ) {
pair . getK ( ) . andNot ( trivial ) ;
}
}
/ / See if the DRA is actually a DFA
if ( AcceptanceType . contains ( allowedAcceptance , AcceptanceType . REACH ) & & isDFA ( dra ) ) {
/ / we can switch to AcceptanceReach
AcceptanceReach reachAcceptance = new AcceptanceReach ( getDFAGoalStatesForRabin ( dra . getAcceptance ( ) ) ) ;
DA . switchAcceptance ( dra , reachAcceptance ) ;