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.
179 lines
3.8 KiB
179 lines
3.8 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 pta;
|
|
|
|
import java.io.*;
|
|
import java.util.*;
|
|
|
|
import prism.PrismException;
|
|
|
|
public class Transition
|
|
{
|
|
// Parent PTA
|
|
private PTA parent;
|
|
// Source location
|
|
private int src;
|
|
// Action label ("" = tau)
|
|
private String action;
|
|
// Guard - currently a conjunction of constraints
|
|
private Set<Constraint> guard;
|
|
// Edges
|
|
private int numEdges;
|
|
private ArrayList<Edge> edges;
|
|
|
|
/**
|
|
* Create an empty transition.
|
|
* @param parent Parent PTA
|
|
* @param src Source location index
|
|
* @param action Synchronising action ("" if none)
|
|
*/
|
|
public Transition(PTA parent, int src, String action)
|
|
{
|
|
this.parent = parent;
|
|
this.src = src;
|
|
this.action = action;
|
|
guard = new LinkedHashSet<Constraint>();
|
|
numEdges = 0;
|
|
edges = new ArrayList<Edge>();
|
|
}
|
|
|
|
/**
|
|
* Copy constructor.
|
|
*/
|
|
public Transition(Transition tr)
|
|
{
|
|
this(tr.parent, tr.src, tr.action);
|
|
for (Constraint c : tr.guard) {
|
|
addGuardConstraint(new Constraint(c));
|
|
}
|
|
for (Edge e : tr.edges) {
|
|
addEdge(new Edge(e));
|
|
}
|
|
}
|
|
|
|
public void addGuardConstraint(Constraint c)
|
|
{
|
|
guard.add(c);
|
|
parent.recomputeMaxClockConstraint(c);
|
|
}
|
|
|
|
public Edge addEdge(double prob, int dest)
|
|
{
|
|
Edge e = new Edge(this, prob, dest);
|
|
edges.add(e);
|
|
numEdges++;
|
|
return e;
|
|
}
|
|
|
|
public void addEdge(Edge e)
|
|
{
|
|
e.setParent(this);
|
|
edges.add(e);
|
|
numEdges++;
|
|
}
|
|
|
|
public void setParent(PTA parent)
|
|
{
|
|
this.parent = parent;
|
|
}
|
|
|
|
public PTA getParent()
|
|
{
|
|
return parent;
|
|
}
|
|
|
|
public String getAction()
|
|
{
|
|
return action;
|
|
}
|
|
|
|
public int getSource()
|
|
{
|
|
return src;
|
|
}
|
|
|
|
public Iterable<Constraint> getGuardConstraints()
|
|
{
|
|
return guard;
|
|
}
|
|
|
|
public int getNumEdges()
|
|
{
|
|
return edges.size();
|
|
}
|
|
|
|
public List<Edge> getEdges()
|
|
{
|
|
return edges;
|
|
}
|
|
|
|
/**
|
|
* Perform some basic syntactic checks.
|
|
*/
|
|
public void check() throws PrismException
|
|
{
|
|
// Check edges
|
|
// Also check that total probability is 1 (ish)
|
|
double prob = 0.0;
|
|
double err = 1e-10;
|
|
for (Edge e : edges) {
|
|
e.check();
|
|
prob += e.getProbability();
|
|
}
|
|
if (prob < 1.0-err || prob > 1.0+err)
|
|
throw new PrismException("Non-1 probability ("+prob+") for PTA transition \""+this+"\"");
|
|
}
|
|
|
|
public String toString()
|
|
{
|
|
boolean first;
|
|
String s = "";
|
|
s += parent.getLocationName(src) + " -";
|
|
if (action != null)
|
|
s += action + ":";
|
|
s += Constraint.toStringList(parent, guard);
|
|
s += "-> ";
|
|
first = true;
|
|
for (Edge e : edges) {
|
|
if (first)
|
|
first = false;
|
|
else
|
|
s += " + ";
|
|
s += e;
|
|
}
|
|
return s;
|
|
}
|
|
|
|
public void writeToDesFile(Writer out) throws PrismException, IOException
|
|
{
|
|
out.write("\t[\n");
|
|
for (Edge e : edges) {
|
|
e.writeToDesFile(out, ((action == null || "".equals(action)) ? "" : action + "||"), guard);
|
|
}
|
|
out.write("\t]\n");
|
|
}
|
|
}
|