2 changed files with 0 additions and 547 deletions
-
242prism/src/explicit/LTSSimple.java~Convert LTSExplicit to LTSSimple.
-
305prism/src/explicit/LTSSimple.java~HEAD
@ -1,242 +0,0 @@ |
|||
//============================================================================== |
|||
// |
|||
// 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) |
|||
// |
|||
//------------------------------------------------------------------------------ |
|||
// |
|||
// 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 explicit; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.BitSet; |
|||
import java.util.List; |
|||
|
|||
import prism.PrismException; |
|||
import strat.MDStrategy; |
|||
|
|||
/** |
|||
* Simple explicit-state representation of an LTS (labelled transition system). |
|||
* |
|||
* Each transition from a state is considered to be a separate (singleton) "choice", |
|||
* following the terminology in other nondeterministic explicit-state models. |
|||
*/ |
|||
public class LTSSimple extends ModelExplicit implements LTS, NondetModelSimple |
|||
{ |
|||
// Transition relation |
|||
protected List<List<Integer>> trans; |
|||
|
|||
// Statistics: total number of transitions |
|||
protected int numTransitions; |
|||
|
|||
// Constructors |
|||
|
|||
/** |
|||
* Constructor: empty LTS. |
|||
*/ |
|||
public LTSSimple() |
|||
{ |
|||
initialise(0); |
|||
} |
|||
|
|||
/** |
|||
* Constructor: new LTS with fixed number of states. |
|||
*/ |
|||
public LTSSimple(int numStates) |
|||
{ |
|||
initialise(numStates); |
|||
} |
|||
|
|||
/** |
|||
* Construct an LTS from an existing one and a state index permutation, |
|||
* i.e. in which state index i becomes index permut[i]. |
|||
*/ |
|||
public LTSSimple(LTSSimple lts, int permut[]) |
|||
{ |
|||
this(lts.getNumStates()); |
|||
copyFrom(lts, permut); |
|||
// Copy storage directly |
|||
for (int s = 0; s < numStates; s++) { |
|||
List<Integer> succs = trans.get(permut[s]); |
|||
for (int succ : lts.trans.get(s)) { |
|||
succs.add(permut[succ]); |
|||
} |
|||
} |
|||
// Copy stats too |
|||
numTransitions = lts.numTransitions; |
|||
} |
|||
|
|||
// Mutators (for ModelSimple) |
|||
|
|||
@Override |
|||
public void initialise(int numStates) |
|||
{ |
|||
super.initialise(numStates); |
|||
trans = new ArrayList<List<Integer>>(); |
|||
for (int i = 0; i < numStates; i++) { |
|||
trans.add(new ArrayList<Integer>()); |
|||
} |
|||
numTransitions = 0; |
|||
} |
|||
|
|||
@Override |
|||
public void clearState(int s) |
|||
{ |
|||
// Clear data structures and update stats |
|||
List<Integer> list = trans.get(s); |
|||
numTransitions -= list.size(); |
|||
list.clear(); |
|||
} |
|||
|
|||
@Override |
|||
public int addState() |
|||
{ |
|||
addStates(1); |
|||
return numStates - 1; |
|||
} |
|||
|
|||
@Override |
|||
public void addStates(int numToAdd) |
|||
{ |
|||
for (int i = 0; i < numToAdd; i++) { |
|||
trans.add(new ArrayList<Integer>()); |
|||
numStates++; |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void buildFromPrismExplicit(String filename) throws PrismException |
|||
{ |
|||
throw new UnsupportedOperationException(); |
|||
} |
|||
|
|||
// Mutators (other) |
|||
|
|||
public void addTransition(int s, int t) |
|||
{ |
|||
// We don't care if a transition from s to t already exists |
|||
trans.get(s).add(t); |
|||
numTransitions++; |
|||
} |
|||
|
|||
// Accessors (for Model) |
|||
|
|||
@Override |
|||
public int getNumTransitions() |
|||
{ |
|||
return numTransitions; |
|||
} |
|||
|
|||
@Override |
|||
public int getNumTransitions(int s) |
|||
{ |
|||
return getNumChoices(s); |
|||
} |
|||
|
|||
@Override |
|||
public void findDeadlocks(boolean fix) throws PrismException |
|||
{ |
|||
for (int i = 0; i < numStates; i++) { |
|||
if (trans.get(i).isEmpty()) { |
|||
addDeadlockState(i); |
|||
if (fix) { |
|||
addTransition(i, i); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void checkForDeadlocks(BitSet except) throws PrismException |
|||
{ |
|||
for (int i = 0; i < numStates; i++) { |
|||
if (trans.get(i).isEmpty() && (except == null || !except.get(i))) |
|||
throw new PrismException("Model has a deadlock in state " + i); |
|||
} |
|||
} |
|||
|
|||
// Accessors (for NondetModel) |
|||
|
|||
@Override |
|||
public int getNumChoices(int s) |
|||
{ |
|||
// one choice per successor for s |
|||
return trans.get(s).size(); |
|||
} |
|||
|
|||
@Override |
|||
public int getNumChoices() |
|||
{ |
|||
return numTransitions; |
|||
} |
|||
|
|||
@Override |
|||
public Object getAction(int s, int i) |
|||
{ |
|||
// we don't have action labels |
|||
return null; |
|||
} |
|||
|
|||
@Override |
|||
public int getNumTransitions(int s, int i) |
|||
{ |
|||
if (i < getNumChoices(s)) { |
|||
// one transition per choice |
|||
return 1; |
|||
} |
|||
throw new IllegalArgumentException(); |
|||
} |
|||
|
|||
@Override |
|||
public boolean allSuccessorsInSet(int s, int i, BitSet set) |
|||
{ |
|||
// single successor for s, i |
|||
return set.get(trans.get(s).get(i)); |
|||
} |
|||
|
|||
@Override |
|||
public boolean someSuccessorsInSet(int s, int i, BitSet set) |
|||
{ |
|||
// single successor for s, i |
|||
return set.get(trans.get(s).get(i)); |
|||
} |
|||
|
|||
@Override |
|||
public SuccessorsIterator getSuccessors(int s, int i) |
|||
{ |
|||
// single successor for s, i |
|||
return SuccessorsIterator.fromSingleton(trans.get(s).get(i)); |
|||
} |
|||
|
|||
@Override |
|||
public SuccessorsIterator getSuccessors(int s) |
|||
{ |
|||
return SuccessorsIterator.from(trans.get(s).iterator(), false); |
|||
} |
|||
|
|||
@Override |
|||
public Model constructInducedModel(MDStrategy strat) |
|||
{ |
|||
throw new UnsupportedOperationException(); |
|||
} |
|||
} |
|||
@ -1,305 +0,0 @@ |
|||
//============================================================================== |
|||
// |
|||
// 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) |
|||
// |
|||
//------------------------------------------------------------------------------ |
|||
// |
|||
// 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 explicit; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.BitSet; |
|||
import java.util.List; |
|||
|
|||
import prism.PrismException; |
|||
import strat.MDStrategy; |
|||
|
|||
/** |
|||
* Simple explicit-state representation of an LTS (labelled transition system). |
|||
* |
|||
* Each transition from a state is considered to be a separate (singleton) "choice", |
|||
* following the terminology in other nondeterministic explicit-state models. |
|||
*/ |
|||
public class LTSSimple extends ModelExplicit implements LTS, NondetModelSimple |
|||
{ |
|||
// Transition relation |
|||
protected List<List<Integer>> trans; |
|||
|
|||
// Action labels |
|||
protected ChoiceActionsSimple actions; |
|||
|
|||
// Statistics: total number of transitions |
|||
protected int numTransitions; |
|||
|
|||
// Constructors |
|||
|
|||
/** |
|||
* Constructor: empty LTS. |
|||
*/ |
|||
public LTSSimple() |
|||
{ |
|||
initialise(0); |
|||
} |
|||
|
|||
/** |
|||
* Constructor: new LTS with fixed number of states. |
|||
*/ |
|||
public LTSSimple(int numStates) |
|||
{ |
|||
initialise(numStates); |
|||
} |
|||
|
|||
/** |
|||
* Construct an LTS from an existing one. |
|||
*/ |
|||
public LTSSimple(LTSSimple lts) |
|||
{ |
|||
this(lts.getNumStates()); |
|||
copyFrom(lts); |
|||
// Copy storage directly |
|||
for (int s = 0; s < numStates; s++) { |
|||
List<Integer> succs = trans.get(s); |
|||
for (int succ : lts.trans.get(s)) { |
|||
succs.add(succ); |
|||
} |
|||
} |
|||
actions = new ChoiceActionsSimple(lts.actions); |
|||
// Copy stats too |
|||
numTransitions = lts.numTransitions; |
|||
} |
|||
|
|||
/** |
|||
* Construct an LTS from an existing one and a state index permutation, |
|||
* i.e. in which state index i becomes index permut[i]. |
|||
*/ |
|||
public LTSSimple(LTSSimple lts, int permut[]) |
|||
{ |
|||
this(lts.getNumStates()); |
|||
copyFrom(lts, permut); |
|||
// Copy storage directly |
|||
for (int s = 0; s < numStates; s++) { |
|||
List<Integer> succs = trans.get(permut[s]); |
|||
for (int succ : lts.trans.get(s)) { |
|||
succs.add(permut[succ]); |
|||
} |
|||
} |
|||
actions = new ChoiceActionsSimple(lts.actions, permut); |
|||
// Copy stats too |
|||
numTransitions = lts.numTransitions; |
|||
} |
|||
|
|||
// Mutators (for ModelSimple) |
|||
|
|||
@Override |
|||
public void initialise(int numStates) |
|||
{ |
|||
super.initialise(numStates); |
|||
trans = new ArrayList<List<Integer>>(); |
|||
for (int i = 0; i < numStates; i++) { |
|||
trans.add(new ArrayList<Integer>()); |
|||
} |
|||
actions = new ChoiceActionsSimple(); |
|||
numTransitions = 0; |
|||
} |
|||
|
|||
@Override |
|||
public void clearState(int s) |
|||
{ |
|||
// Clear data structures and update stats |
|||
List<Integer> list = trans.get(s); |
|||
numTransitions -= list.size(); |
|||
list.clear(); |
|||
actions.clearState(s); |
|||
} |
|||
|
|||
@Override |
|||
public int addState() |
|||
{ |
|||
addStates(1); |
|||
return numStates - 1; |
|||
} |
|||
|
|||
@Override |
|||
public void addStates(int numToAdd) |
|||
{ |
|||
for (int i = 0; i < numToAdd; i++) { |
|||
trans.add(new ArrayList<Integer>()); |
|||
numStates++; |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void buildFromPrismExplicit(String filename) throws PrismException |
|||
{ |
|||
throw new UnsupportedOperationException(); |
|||
} |
|||
|
|||
// Mutators (other) |
|||
|
|||
/** |
|||
* Add a transition from state {@code s} (which must exist) to state {code t}. |
|||
*/ |
|||
public void addTransition(int s, int t) |
|||
{ |
|||
// We don't care if a transition from s to t already exists |
|||
trans.get(s).add(t); |
|||
numTransitions++; |
|||
} |
|||
|
|||
/** |
|||
* Add a transition from state {@code s} (which must exist) |
|||
* to state {code t}, labelled with {@code action}. |
|||
*/ |
|||
public void addActionLabelledTransition(int s, int t, Object action) |
|||
{ |
|||
// We don't care if a transition from s to t already exists |
|||
trans.get(s).add(t); |
|||
actions.setAction(s, trans.get(s).size() - 1, action); |
|||
numTransitions++; |
|||
} |
|||
|
|||
/** |
|||
* Set the action label for choice/transition i in some state s. |
|||
* Note that i is the index of the choice/transition, not the destination. |
|||
*/ |
|||
public void setAction(int s, int i, Object action) |
|||
{ |
|||
actions.setAction(s, i, action); |
|||
} |
|||
|
|||
// Accessors (for Model) |
|||
|
|||
@Override |
|||
public int getNumTransitions() |
|||
{ |
|||
return numTransitions; |
|||
} |
|||
|
|||
@Override |
|||
public int getNumTransitions(int s) |
|||
{ |
|||
return getNumChoices(s); |
|||
} |
|||
|
|||
@Override |
|||
public void findDeadlocks(boolean fix) throws PrismException |
|||
{ |
|||
for (int i = 0; i < numStates; i++) { |
|||
if (trans.get(i).isEmpty()) { |
|||
addDeadlockState(i); |
|||
if (fix) { |
|||
addTransition(i, i); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void checkForDeadlocks(BitSet except) throws PrismException |
|||
{ |
|||
for (int i = 0; i < numStates; i++) { |
|||
if (trans.get(i).isEmpty() && (except == null || !except.get(i))) |
|||
throw new PrismException("Model has a deadlock in state " + i); |
|||
} |
|||
} |
|||
|
|||
// Accessors (for NondetModel) |
|||
|
|||
@Override |
|||
public int getNumChoices(int s) |
|||
{ |
|||
// one choice per successor for s |
|||
return trans.get(s).size(); |
|||
} |
|||
|
|||
@Override |
|||
public int getNumChoices() |
|||
{ |
|||
return numTransitions; |
|||
} |
|||
|
|||
@Override |
|||
public Object getAction(int s, int i) |
|||
{ |
|||
return actions.getAction(s, i); |
|||
} |
|||
|
|||
@Override |
|||
public boolean areAllChoiceActionsUnique() |
|||
{ |
|||
// as we don't assign action labels, they are not unique |
|||
return false; |
|||
} |
|||
|
|||
@Override |
|||
public int getNumTransitions(int s, int i) |
|||
{ |
|||
if (i < getNumChoices(s)) { |
|||
// one transition per choice |
|||
return 1; |
|||
} |
|||
throw new IllegalArgumentException(); |
|||
} |
|||
|
|||
@Override |
|||
public boolean allSuccessorsInSet(int s, int i, BitSet set) |
|||
{ |
|||
// single successor for s, i |
|||
return set.get(trans.get(s).get(i)); |
|||
} |
|||
|
|||
@Override |
|||
public boolean someSuccessorsInSet(int s, int i, BitSet set) |
|||
{ |
|||
// single successor for s, i |
|||
return set.get(trans.get(s).get(i)); |
|||
} |
|||
|
|||
@Override |
|||
public SuccessorsIterator getSuccessors(int s, int i) |
|||
{ |
|||
// single successor for s, i |
|||
return SuccessorsIterator.fromSingleton(trans.get(s).get(i)); |
|||
} |
|||
|
|||
@Override |
|||
public SuccessorsIterator getSuccessors(int s) |
|||
{ |
|||
return SuccessorsIterator.from(trans.get(s).iterator(), false); |
|||
} |
|||
|
|||
@Override |
|||
public Model constructInducedModel(MDStrategy strat) |
|||
{ |
|||
throw new UnsupportedOperationException(); |
|||
} |
|||
|
|||
// Accessors (for LTS) |
|||
|
|||
@Override |
|||
public int getSuccessor(int s, int i) |
|||
{ |
|||
return trans.get(s).get(i); |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue