Browse Source
add AcceptanceBuchi as acceptance type
add AcceptanceBuchi as acceptance type
git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@11191 bbc10eb1-c90d-0410-af57-cb519fbb1720master
3 changed files with 355 additions and 0 deletions
-
227prism/src/acceptance/AcceptanceBuchi.java
-
127prism/src/acceptance/AcceptanceBuchiDD.java
-
1prism/src/acceptance/AcceptanceType.java
@ -0,0 +1,227 @@ |
|||||
|
//============================================================================== |
||||
|
// |
||||
|
// Copyright (c) 2016- |
||||
|
// Authors: |
||||
|
// * Joachim Klein <klein@tcs.inf.tu-dresden.de> (TU Dresden) |
||||
|
// |
||||
|
//------------------------------------------------------------------------------ |
||||
|
// |
||||
|
// 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 acceptance; |
||||
|
|
||||
|
import java.io.PrintStream; |
||||
|
import java.util.BitSet; |
||||
|
|
||||
|
import prism.PrismException; |
||||
|
import prism.PrismNotSupportedException; |
||||
|
import jdd.JDDVars; |
||||
|
|
||||
|
/** |
||||
|
* A Büchi acceptance condition (based on BitSet state sets). |
||||
|
* The acceptance is defined via a set of "accepting" states |
||||
|
* (sometimes also called final states) and is accepting if |
||||
|
* "infinitely often an accepting state is visited" |
||||
|
*/ |
||||
|
public class AcceptanceBuchi implements AcceptanceOmega |
||||
|
{ |
||||
|
/** The set of goal states */ |
||||
|
private BitSet acceptingStates = new BitSet(); |
||||
|
|
||||
|
/** Constructor (no accepting states) */ |
||||
|
public AcceptanceBuchi() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
/** Constructor (set accepting states) */ |
||||
|
public AcceptanceBuchi(BitSet acceptingStates) |
||||
|
{ |
||||
|
this.acceptingStates = acceptingStates; |
||||
|
} |
||||
|
|
||||
|
/** Get the accepting state set */ |
||||
|
public BitSet getAcceptingStates() |
||||
|
{ |
||||
|
return acceptingStates; |
||||
|
} |
||||
|
|
||||
|
/** Set the accepting state set */ |
||||
|
public void setAcceptingStates(BitSet acceptingStates) |
||||
|
{ |
||||
|
this.acceptingStates = acceptingStates; |
||||
|
} |
||||
|
|
||||
|
/** Make a copy of the acceptance condition. */ |
||||
|
public AcceptanceBuchi clone() |
||||
|
{ |
||||
|
return new AcceptanceBuchi((BitSet)acceptingStates.clone()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean isBSCCAccepting(BitSet bscc_states) |
||||
|
{ |
||||
|
return bscc_states.intersects(acceptingStates); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get the Rabin acceptance condition that is the equivalent of this Buchi condition. |
||||
|
*/ |
||||
|
public AcceptanceRabin toRabin(int numStates) |
||||
|
{ |
||||
|
AcceptanceRabin rabin = new AcceptanceRabin(); |
||||
|
rabin.add(new AcceptanceRabin.RabinPair(new BitSet(), (BitSet) acceptingStates.clone())); |
||||
|
return rabin; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get the Streett acceptance condition that is the equivalent of this Buchi condition. |
||||
|
*/ |
||||
|
public AcceptanceStreett toStreett(int numStates) |
||||
|
{ |
||||
|
AcceptanceStreett streett = new AcceptanceStreett(); |
||||
|
BitSet allStates = new BitSet(); |
||||
|
allStates.set(0, numStates); |
||||
|
streett.add(new AcceptanceStreett.StreettPair(allStates, (BitSet) acceptingStates.clone())); |
||||
|
return streett; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get a Rabin acceptance condition that is the complement of this condition, i.e., |
||||
|
* any word that is accepted by this condition is rejected by the returned Rabin condition. |
||||
|
* |
||||
|
* @param numStates the number of states in the underlying model / automaton (needed for complementing BitSets) |
||||
|
* @return the complement Rabin acceptance condition |
||||
|
*/ |
||||
|
public AcceptanceRabin complementToRabin(int numStates) |
||||
|
{ |
||||
|
AcceptanceRabin rabin = new AcceptanceRabin(); |
||||
|
BitSet allStates = new BitSet(); |
||||
|
allStates.set(0, numStates); |
||||
|
rabin.add(new AcceptanceRabin.RabinPair((BitSet) acceptingStates.clone(), allStates)); |
||||
|
return rabin; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get a Streett acceptance condition that is the complement of this condition, i.e., |
||||
|
* any word that is accepted by this condition is rejected by the returned Streett condition. |
||||
|
* <br> |
||||
|
* Relies on the fact that once the goal states have been reached, all subsequent states |
||||
|
* are goal states. |
||||
|
* |
||||
|
* @param numStates the number of states in the underlying model / automaton (needed for complementing BitSets) |
||||
|
* @return the complement Streett acceptance condition |
||||
|
*/ |
||||
|
public AcceptanceStreett complementToStreett(int numStates) |
||||
|
{ |
||||
|
AcceptanceStreett streett = new AcceptanceStreett(); |
||||
|
streett.add(new AcceptanceStreett.StreettPair((BitSet) acceptingStates.clone(), new BitSet())); |
||||
|
return streett; |
||||
|
} |
||||
|
|
||||
|
/** Complement this acceptance condition, return as AcceptanceGeneric. */ |
||||
|
public AcceptanceGeneric complementToGeneric() |
||||
|
{ |
||||
|
return toAcceptanceGeneric().complementToGeneric(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public AcceptanceOmega complement(int numStates, AcceptanceType... allowedAcceptance) throws PrismException |
||||
|
{ |
||||
|
if (AcceptanceType.contains(allowedAcceptance, AcceptanceType.RABIN)) { |
||||
|
return complementToRabin(numStates); |
||||
|
} else if (AcceptanceType.contains(allowedAcceptance, AcceptanceType.STREETT)) { |
||||
|
return complementToStreett(numStates); |
||||
|
} else if (AcceptanceType.contains(allowedAcceptance, AcceptanceType.GENERIC)) { |
||||
|
return complementToGeneric(); |
||||
|
} |
||||
|
throw new PrismNotSupportedException("Can not complement " + getTypeName() + " acceptance to a supported acceptance type"); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void lift(LiftBitSet lifter) |
||||
|
{ |
||||
|
acceptingStates=lifter.lift(acceptingStates); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public AcceptanceBuchiDD toAcceptanceDD(JDDVars ddRowVars) |
||||
|
{ |
||||
|
return new AcceptanceBuchiDD(this, ddRowVars); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public AcceptanceGeneric toAcceptanceGeneric() |
||||
|
{ |
||||
|
return new AcceptanceGeneric(AcceptanceGeneric.ElementType.INF, (BitSet) acceptingStates.clone()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getSignatureForState(int i) |
||||
|
{ |
||||
|
return acceptingStates.get(i) ? "!" : " "; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getSignatureForStateHOA(int stateIndex) |
||||
|
{ |
||||
|
if (acceptingStates.get(stateIndex)) { |
||||
|
return "{0}"; |
||||
|
} else { |
||||
|
return ""; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Returns a textual representation of this acceptance condition. */ |
||||
|
@Override |
||||
|
public String toString() |
||||
|
{ |
||||
|
return acceptingStates.toString(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getSizeStatistics() |
||||
|
{ |
||||
|
return acceptingStates.cardinality()+" accepting states"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public AcceptanceType getType() |
||||
|
{ |
||||
|
return AcceptanceType.BUCHI; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getTypeAbbreviated() |
||||
|
{ |
||||
|
return "B"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getTypeName() |
||||
|
{ |
||||
|
return "Buchi"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void outputHOAHeader(PrintStream out) |
||||
|
{ |
||||
|
out.println("acc-name: Buchi"); |
||||
|
out.println("Acceptance: 1 Inf(0)"); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,127 @@ |
|||||
|
//============================================================================== |
||||
|
// |
||||
|
//Copyright (c) 2016- |
||||
|
//Authors: |
||||
|
// * Joachim Klein <klein@tcs.inf.tu-dresden.de> (TU Dresden) |
||||
|
// * Dave Parker <d.a.parker@cs.bham.ac.uk> (University of Birmingham/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 acceptance; |
||||
|
|
||||
|
import common.IterableBitSet; |
||||
|
import jdd.JDD; |
||||
|
import jdd.JDDNode; |
||||
|
import jdd.JDDVars; |
||||
|
|
||||
|
/** |
||||
|
* A Büchi acceptance condition (based on JDD state sets). |
||||
|
* The acceptance is defined via a set of "accepting" states |
||||
|
* (sometimes also called final states) and is accepting if |
||||
|
* "infinitely often an accepting state is visited" |
||||
|
*/ |
||||
|
public class AcceptanceBuchiDD implements AcceptanceOmegaDD |
||||
|
{ |
||||
|
/** The accepting states */ |
||||
|
private JDDNode acceptingStates; |
||||
|
|
||||
|
/** |
||||
|
* Constructor, set acceptingStates. |
||||
|
* Becomes owner of the references of acceptingStates. |
||||
|
*/ |
||||
|
public AcceptanceBuchiDD(JDDNode acceptingStates) |
||||
|
{ |
||||
|
this.acceptingStates = acceptingStates; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Constructor, from a BitSet-based AcceptanceBuchi. |
||||
|
* |
||||
|
* @param acceptance the BitSet-based acceptance condition |
||||
|
* @param ddRowVars JDDVars of the row variables corresponding to the bits in the bit set |
||||
|
*/ |
||||
|
public AcceptanceBuchiDD(AcceptanceBuchi acceptance, JDDVars ddRowVars) |
||||
|
{ |
||||
|
acceptingStates = JDD.Constant(0); |
||||
|
// get BDD based on the acceptingState bit set |
||||
|
for (int i : IterableBitSet.getSetBits(acceptance.getAcceptingStates())) { |
||||
|
acceptingStates = JDD.SetVectorElement(acceptingStates, ddRowVars, i, 1.0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** Get a referenced copy of the state set of the accepting states. |
||||
|
* <br>[ REFS: <i>result</i>, DEREFS: <i>none</i> ] |
||||
|
*/ |
||||
|
public JDDNode getAcceptingStates() |
||||
|
{ |
||||
|
JDD.Ref(acceptingStates); |
||||
|
return acceptingStates; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Set the accepting states. |
||||
|
* Becomes owner of the reference to acceptingStates. |
||||
|
*/ |
||||
|
public void setAcceptingStates(JDDNode acceptingStates) |
||||
|
{ |
||||
|
clear(); |
||||
|
this.acceptingStates = acceptingStates; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean isBSCCAccepting(JDDNode bscc_states) |
||||
|
{ |
||||
|
return JDD.AreIntersecting(acceptingStates, bscc_states); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getSizeStatistics() |
||||
|
{ |
||||
|
return "one set of accepting states"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public AcceptanceType getType() |
||||
|
{ |
||||
|
return AcceptanceType.BUCHI; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getTypeAbbreviated() |
||||
|
{ |
||||
|
return "B"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String getTypeName() |
||||
|
{ |
||||
|
return "Buchi"; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void clear() |
||||
|
{ |
||||
|
if (acceptingStates != null) { |
||||
|
JDD.Deref(acceptingStates); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue