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.
204 lines
4.4 KiB
204 lines
4.4 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2002-
|
|
// Authors:
|
|
// * Dave Parker <david.parker@comlab.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 simulator;
|
|
|
|
import java.util.*;
|
|
|
|
import parser.*;
|
|
import parser.ast.*;
|
|
import prism.PrismLangException;
|
|
|
|
public class ChoiceList implements Choice
|
|
{
|
|
protected String action;
|
|
// List of multiple targets and associated info
|
|
// Size of list is stored implicitly in target.length // TODO: no
|
|
// TODO: convert to arrays?
|
|
protected List<List<Update>> updates;
|
|
protected List<Double> probability;
|
|
protected List<Command> command;
|
|
|
|
public ChoiceList(int n)
|
|
{
|
|
updates = new ArrayList<List<Update>>(n);
|
|
probability = new ArrayList<Double>(n);
|
|
command = new ArrayList<Command>(n);
|
|
}
|
|
|
|
// Set methods
|
|
|
|
public void setAction(String action)
|
|
{
|
|
this.action = action;
|
|
}
|
|
|
|
public void setProbability(double probability)
|
|
{
|
|
setProbability(0, probability);
|
|
}
|
|
|
|
public void addProbability(double probability)
|
|
{
|
|
this.probability.add(probability);
|
|
}
|
|
|
|
public void setProbability(int i, double probability)
|
|
{
|
|
if (i < 0 || i >= size())
|
|
return;
|
|
this.probability.set(i, probability);
|
|
}
|
|
|
|
public void setCommand(Command command)
|
|
{
|
|
setCommand(0, command);
|
|
}
|
|
|
|
public void addCommand(Command command)
|
|
{
|
|
this.command.add(command);
|
|
}
|
|
|
|
public void setCommand(int i, Command command)
|
|
{
|
|
if (i < 0 || i >= size())
|
|
return;
|
|
this.command.set(i, command);
|
|
}
|
|
|
|
// Get methods
|
|
|
|
public String getAction()
|
|
{
|
|
return action;
|
|
}
|
|
|
|
public int size()
|
|
{
|
|
return probability.size();
|
|
}
|
|
|
|
public String getUpdateString(int i)
|
|
{
|
|
String s = "(";
|
|
for (Update up : updates.get(i))
|
|
s += up;
|
|
s += ")";
|
|
return s;
|
|
}
|
|
|
|
public State computeTarget(State oldState) throws PrismLangException
|
|
{
|
|
return computeTarget(0, oldState);
|
|
}
|
|
|
|
public void computeTarget(State oldState, State newState) throws PrismLangException
|
|
{
|
|
computeTarget(0, oldState, newState);
|
|
}
|
|
|
|
public State computeTarget(int i, State oldState) throws PrismLangException
|
|
{
|
|
if (i < 0 || i >= size())
|
|
throw new PrismLangException("Choice does not have an element " + i);
|
|
State newState = new State(oldState);
|
|
for (Update up : updates.get(i))
|
|
up.update(oldState, newState);
|
|
return newState;
|
|
}
|
|
|
|
public void computeTarget(int i, State oldState, State newState) throws PrismLangException
|
|
{
|
|
if (i < 0 || i >= size())
|
|
throw new PrismLangException("Choice does not have an element " + i);
|
|
for (Update up : updates.get(i))
|
|
up.update(oldState, newState);
|
|
}
|
|
|
|
public double getProbability()
|
|
{
|
|
return getProbability(0);
|
|
}
|
|
|
|
public double getProbability(int i)
|
|
{
|
|
if (i < 0 || i >= size())
|
|
return -1;
|
|
//throw new PrismLangException("Invalid grouped transition index " + i);
|
|
return probability.get(i);
|
|
}
|
|
|
|
public double getProbabilitySum()
|
|
{
|
|
double sum = 0.0;
|
|
for (double d : probability)
|
|
sum += d;
|
|
return sum;
|
|
}
|
|
|
|
public Command getCommand()
|
|
{
|
|
return getCommand(0);
|
|
}
|
|
|
|
public Command getCommand(int i)
|
|
{
|
|
if (i < 0 || i >= size())
|
|
return null;
|
|
//throw new PrismLangException("Invalid grouped transition index " + i);
|
|
return command.get(i);
|
|
}
|
|
|
|
public int getIndexByProbabilitySum(double x)
|
|
{
|
|
int i, n;
|
|
double d;
|
|
n = size();
|
|
i = 0;
|
|
d = 0.0;
|
|
for (i = 0; x >= d && i < n; i++) {
|
|
d += probability.get(i);
|
|
}
|
|
return i - 1;
|
|
}
|
|
|
|
public String toString()
|
|
{
|
|
int i, n;
|
|
boolean first = true;
|
|
String s = "";
|
|
n = size();
|
|
for (i = 0; i < n; i++) {
|
|
if (first)
|
|
first = false;
|
|
else
|
|
s+= " + ";
|
|
s += getProbability(i)+":"+updates.get(i);
|
|
}
|
|
return s;
|
|
}
|
|
}
|