Browse Source
too slow
too slow
git-svn-id: https://www.prismmodelchecker.org/svn/prism/prism/trunk@6622 bbc10eb1-c90d-0410-af57-cb519fbb1720master
8 changed files with 31 additions and 496 deletions
-
14prism/src/explicit/CTMCSimple.java
-
5prism/src/explicit/DTMC.java
-
6prism/src/explicit/DTMCEmbeddedSimple.java
-
6prism/src/explicit/DTMCFromMDPMemorylessAdversary.java
-
78prism/src/explicit/DTMCSimple.java
-
6prism/src/explicit/DTMCUniformisedSimple.java
-
83prism/src/explicit/StateAction.java
-
329prism/src/explicit/StateActionDistribution.java
@ -1,83 +0,0 @@ |
|||
//============================================================================== |
|||
// |
|||
// Copyright (c) 2002- |
|||
// Authors: |
|||
// * Dave Parker <david.parker@comlab.ox.ac.uk> (University of Oxford) |
|||
// * Ernst Moritz Hahn <emhahn@cs.ox.ac.uk> (University of 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 explicit; |
|||
|
|||
/** |
|||
* Stores a state-action entry. |
|||
*/ |
|||
public final class StateAction |
|||
{ |
|||
final int state; |
|||
final Object action; |
|||
|
|||
StateAction(int state, Object action) |
|||
{ |
|||
this.state = state; |
|||
this.action = action; |
|||
} |
|||
|
|||
int getState() |
|||
{ |
|||
return state; |
|||
} |
|||
|
|||
Object getAction() |
|||
{ |
|||
return action; |
|||
} |
|||
|
|||
@Override |
|||
public boolean equals(Object obj) |
|||
{ |
|||
if (!(obj instanceof StateAction)) { |
|||
return false; |
|||
} |
|||
|
|||
StateAction other = (StateAction) obj; |
|||
if (this.state != other.state) { |
|||
return false; |
|||
} |
|||
if ((this.action == null) != (other.action == null)) { |
|||
return false; |
|||
} |
|||
if (this.action == null) { |
|||
return true; |
|||
} |
|||
return (this.action.equals(other.action)); |
|||
} |
|||
|
|||
@Override |
|||
public int hashCode() |
|||
{ |
|||
if (null != action) { |
|||
return state * 23 + action.hashCode(); |
|||
} else { |
|||
return state; |
|||
} |
|||
} |
|||
} |
|||
@ -1,329 +0,0 @@ |
|||
//============================================================================== |
|||
// |
|||
// Copyright (c) 2002- |
|||
// Authors: |
|||
// * Dave Parker <david.parker@comlab.ox.ac.uk> (University of Oxford) |
|||
// * Ernst Moritz Hahn <emhahn@cs.ox.ac.uk> (University of 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 explicit; |
|||
|
|||
import java.util.BitSet; |
|||
import java.util.HashMap; |
|||
import java.util.HashSet; |
|||
import java.util.Iterator; |
|||
import java.util.Map; |
|||
import java.util.Set; |
|||
import java.util.Map.Entry; |
|||
|
|||
import prism.PrismUtils; |
|||
|
|||
/** |
|||
* Stores a distributions over a state-action pairs. |
|||
*/ |
|||
public class StateActionDistribution implements Iterable<Entry<StateAction,Double>> |
|||
{ |
|||
private HashMap<StateAction,Double> map; |
|||
|
|||
/** |
|||
* Create an empty distribution. |
|||
*/ |
|||
public StateActionDistribution() |
|||
{ |
|||
clear(); |
|||
} |
|||
|
|||
/** |
|||
* Copy constructor. |
|||
*/ |
|||
public StateActionDistribution(StateActionDistribution distr) |
|||
{ |
|||
this(); |
|||
Iterator<Entry<StateAction,Double>> i = distr.iterator(); |
|||
while (i.hasNext()) { |
|||
Map.Entry<StateAction,Double> e = i.next(); |
|||
add(e.getKey(), e.getValue()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Construct a distribution from an existing one and a state index permutation, |
|||
* i.e. in which state index i becomes index permut[i]. |
|||
* Note: have to build the new distributions from scratch anyway to do this, |
|||
* so may as well provide this functionality as a constructor. |
|||
*/ |
|||
public StateActionDistribution(StateActionDistribution distr, int permut[]) |
|||
{ |
|||
this(); |
|||
Iterator<Entry<StateAction,Double>> i = distr.iterator(); |
|||
while (i.hasNext()) { |
|||
Map.Entry<StateAction,Double> e = i.next(); |
|||
StateAction oldStateAction = e.getKey(); |
|||
StateAction newStateAction = new StateAction(permut[oldStateAction.getState()], oldStateAction.getAction()); |
|||
add(newStateAction, e.getValue()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Get probability for state state/action 0. |
|||
* |
|||
* @param state state to get probability of |
|||
* @return probability |
|||
*/ |
|||
public double get(int state) |
|||
{ |
|||
return get(state, null); |
|||
} |
|||
|
|||
/** |
|||
* Get the probability for state/action pair |
|||
*/ |
|||
public double get(int state, Object action) |
|||
{ |
|||
StateAction entry = new StateAction(state, action); |
|||
return get(entry); |
|||
} |
|||
|
|||
/** |
|||
* Get the probability for given entry |
|||
*/ |
|||
public double get(StateAction entry) |
|||
{ |
|||
Double d; |
|||
d = (Double) map.get(entry); |
|||
return d==null ? 0.0 : d.doubleValue(); |
|||
} |
|||
|
|||
@Override |
|||
public Iterator<Entry<StateAction, Double>> iterator() |
|||
{ |
|||
return map.entrySet().iterator(); |
|||
} |
|||
|
|||
/** |
|||
* Clear all entries of the distribution. |
|||
*/ |
|||
public void clear() |
|||
{ |
|||
map = new HashMap<StateAction,Double>(); |
|||
} |
|||
|
|||
public boolean add(int state, double prob) |
|||
{ |
|||
return add(state, null, prob); |
|||
} |
|||
|
|||
/** |
|||
* Add 'prob' to the probability for given state and action. |
|||
* Return boolean indicating whether or not there was already |
|||
* non-zero probability for this state (i.e. false denotes new transition). |
|||
*/ |
|||
public boolean add(int state, Object action, double prob) |
|||
{ |
|||
StateAction entry = new StateAction(state, action); |
|||
return add(entry, prob); |
|||
} |
|||
|
|||
public boolean add(StateAction entry, double prob) |
|||
{ |
|||
Double d = (Double) map.get(entry); |
|||
if (d == null) { |
|||
map.put(entry, prob); |
|||
return false; |
|||
} else { |
|||
set(entry, d + prob); |
|||
return true; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* Set the probability for state/action to prob. |
|||
*/ |
|||
public void set(int state, Object action, double prob) |
|||
{ |
|||
StateAction entry = new StateAction(state, action); |
|||
set(entry, prob); |
|||
} |
|||
|
|||
public void set(int state, double prob) { |
|||
set(state, null, prob); |
|||
} |
|||
|
|||
public void set(StateAction entry, double prob) |
|||
{ |
|||
if (prob == 0.0) |
|||
map.remove(entry); |
|||
else |
|||
map.put(entry, prob); |
|||
} |
|||
|
|||
/** |
|||
* Returns true if index j is in the support of the distribution. |
|||
*/ |
|||
public boolean contains(int state, Object action) |
|||
{ |
|||
StateAction entry = new StateAction(state, action); |
|||
return map.get(entry) != null; |
|||
} |
|||
|
|||
public boolean contains(int state) |
|||
{ |
|||
return contains(state, null); |
|||
} |
|||
|
|||
/** |
|||
* Returns true if all states in the support of the distribution are in the set. |
|||
*/ |
|||
public boolean isSubsetOf(BitSet set) |
|||
{ |
|||
Iterator<Entry<StateAction,Double>> i = iterator(); |
|||
while (i.hasNext()) { |
|||
Map.Entry<StateAction,Double> e = i.next(); |
|||
if (!set.get(((StateAction) e.getKey()).getState())) |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
/** |
|||
* Get the support of the distribution. |
|||
*/ |
|||
public Set<Integer> getSupport() |
|||
{ |
|||
HashSet<Integer> support = new HashSet<Integer>(); |
|||
for (StateAction stateAction : map.keySet()) { |
|||
support.add(stateAction.getState()); |
|||
} |
|||
return support; |
|||
} |
|||
|
|||
/** |
|||
* Returns true if the distribution is empty. |
|||
*/ |
|||
public boolean isEmpty() |
|||
{ |
|||
return map.isEmpty(); |
|||
} |
|||
|
|||
/** |
|||
* Get the size of the support of the distribution. |
|||
*/ |
|||
public int size() |
|||
{ |
|||
return map.size(); |
|||
} |
|||
|
|||
/** |
|||
* Get the sum of the probabilities in the distribution. |
|||
*/ |
|||
public double sum() |
|||
{ |
|||
double d = 0.0; |
|||
Iterator<Entry<StateAction,Double>> i = iterator(); |
|||
while (i.hasNext()) { |
|||
Map.Entry<StateAction,Double> e = i.next(); |
|||
d += e.getValue(); |
|||
} |
|||
return d; |
|||
} |
|||
|
|||
/** |
|||
* Get the sum of all the probabilities in the distribution except for state j. |
|||
*/ |
|||
public double sumAllBut(int j) |
|||
{ |
|||
double d = 0.0; |
|||
Iterator<Entry<StateAction,Double>> i = iterator(); |
|||
while (i.hasNext()) { |
|||
Map.Entry<StateAction,Double> e = i.next(); |
|||
if (e.getKey().getState() != j) |
|||
d += e.getValue(); |
|||
} |
|||
return d; |
|||
} |
|||
|
|||
/** |
|||
* Create a new distribution, based on a mapping from the state indices |
|||
* used in this distribution to a different set of state indices. |
|||
*/ |
|||
public StateActionDistribution map(int map[]) |
|||
{ |
|||
StateActionDistribution distrNew = new StateActionDistribution(); |
|||
Iterator<Entry<StateAction,Double>> i = iterator(); |
|||
while (i.hasNext()) { |
|||
Map.Entry<StateAction,Double> e = i.next(); |
|||
StateAction oldStateAction = e.getKey(); |
|||
StateAction newStateAction = new StateAction(map[oldStateAction.getState()], oldStateAction.getAction()); |
|||
distrNew.add(newStateAction, e.getValue()); |
|||
} |
|||
return distrNew; |
|||
} |
|||
|
|||
@Override |
|||
public boolean equals(Object o) |
|||
{ |
|||
Double d1, d2; |
|||
StateActionDistribution d = (StateActionDistribution) o; |
|||
if (d.size() != size()) |
|||
return false; |
|||
Iterator<Entry<StateAction,Double>> i = iterator(); |
|||
while (i.hasNext()) { |
|||
Map.Entry<StateAction,Double> e = i.next(); |
|||
d1 = e.getValue(); |
|||
d2 = d.map.get(e.getKey()); |
|||
if (d2 == null || !PrismUtils.doublesAreClose(d1, d2, 1e-12, false)) |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
@Override |
|||
public int hashCode() |
|||
{ |
|||
// Simple hash code |
|||
return map.size(); |
|||
} |
|||
|
|||
@Override |
|||
public String toString() |
|||
{ |
|||
return map.toString(); |
|||
} |
|||
|
|||
public boolean containsOneOf(BitSet set) |
|||
{ |
|||
for (StateAction stateAction : map.keySet()) { |
|||
if (set.get(stateAction.getState())); |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
public Distribution toDistribution() |
|||
{ |
|||
Distribution result = new Distribution(); |
|||
for (Entry<StateAction, Double> entry : map.entrySet()) { |
|||
result.add(entry.getKey().getState(), entry.getValue()); |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue