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.
217 lines
5.5 KiB
217 lines
5.5 KiB
/*
|
|
* This file is part of a Java port of the program ltl2dstar
|
|
* (http://www.ltl2dstar.de/) for PRISM (http://www.prismmodelchecker.org/)
|
|
* Copyright (C) 2005-2007 Joachim Klein <j.klein@ltl2dstar.de>
|
|
* Copyright (c) 2007 Carlos Bederian
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program 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 this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
package jltl2dstar;
|
|
|
|
import java.util.*;
|
|
|
|
import jltl2ba.APElement;
|
|
import jltl2ba.APSet;
|
|
import jltl2ba.MyBitSet;
|
|
import jltl2ba.MyBitSet.MyBitSetIterator;
|
|
|
|
|
|
/** @file
|
|
* Provides class NBA_State for storing a state of a nondeterministic Büchi automaton.
|
|
*/
|
|
|
|
/**
|
|
* A state of a deterministic omega-automaton.
|
|
* For a description of the template parameters, see class NBA.
|
|
*/
|
|
public class NBA_State implements Iterable<Map.Entry<APElement,MyBitSet>> {
|
|
|
|
/** The automaton */
|
|
private NBA _graph;
|
|
|
|
/** Is this state accepting */
|
|
boolean _isFinal;
|
|
|
|
/** A description. */
|
|
String _description;
|
|
|
|
/** The EdgeManager*/
|
|
EdgeManager _edge_manager;
|
|
|
|
|
|
/**
|
|
* Constructor.
|
|
* @param graph The automaton (NBA) that contains this state.
|
|
*/
|
|
public NBA_State(NBA graph)
|
|
{
|
|
_graph = graph;
|
|
_isFinal = false;
|
|
_edge_manager = new EdgeManager(this, graph.getAPSet());
|
|
_description = "";
|
|
}
|
|
|
|
|
|
/**
|
|
* Add an edge from this state to the other state
|
|
* @param label the label for the edge
|
|
* @param state the target state
|
|
*/
|
|
public void addEdge(APElement label, NBA_State state) {
|
|
_edge_manager.addEdge(label, state);
|
|
}
|
|
|
|
|
|
/**
|
|
* Add edge(s) from this state to the other state
|
|
* @param monom an APMonom for the label(s)
|
|
* @param to_state the target state
|
|
*/
|
|
public void addEdge(APMonom monom, NBA_State to_state) {
|
|
_edge_manager.addEdge(monom, to_state);
|
|
}
|
|
|
|
/**
|
|
* Add edge(s) from this state to the other state
|
|
* @param monom an APMonom for the label(s)
|
|
* @param to_state the target state
|
|
*/
|
|
public void addEdges(APElement monom, MyBitSet to_states) {
|
|
_edge_manager.addEdges(monom, to_states);
|
|
}
|
|
|
|
/**
|
|
* Get the target states of the labeled edge.
|
|
* @return a pointer to a BitSet with the indizes of the target states.
|
|
*/
|
|
public MyBitSet getEdge(APElement label) {
|
|
return _edge_manager.getEdge(label);
|
|
}
|
|
|
|
/** Get the name (index) of this state. */
|
|
public int getName() {
|
|
return _graph.getIndexForState(this);
|
|
}
|
|
|
|
// FIXME: operator<<
|
|
|
|
/** Is this state accepting (final)? */
|
|
public boolean isFinal()
|
|
{
|
|
return _isFinal;
|
|
}
|
|
|
|
/** Set the value of the final flag for this state */
|
|
public void setFinal(boolean f) {
|
|
_isFinal=f;
|
|
_graph.getFinalStates().set(_graph.getIndexForState(this), f);
|
|
}
|
|
|
|
// FIXME: ForEachSuccessor
|
|
// FIXME: edge_to_bitset_iterator
|
|
// FIXME: successor_iterator
|
|
|
|
/** Set the description for this state. */
|
|
public void setDescription(String s) {
|
|
_description = s;
|
|
}
|
|
|
|
/** Get the description for this state. */
|
|
String getDescription() {
|
|
return _description;
|
|
}
|
|
|
|
/** Check if this state has a description. */
|
|
public boolean hasDescription() {
|
|
return (_description.length() != 0);
|
|
}
|
|
|
|
/** Get the automaton owning this state. */
|
|
public NBA getGraph()
|
|
{
|
|
return _graph;
|
|
}
|
|
|
|
public Iterator<Map.Entry<APElement,MyBitSet>> iterator()
|
|
{
|
|
return _edge_manager.getEdgeContainer().entrySet().iterator();
|
|
}
|
|
|
|
public Iterator<Integer> successorIterator()
|
|
{
|
|
MyBitSet successors = new MyBitSet(_graph.getStateCount());
|
|
for (MyBitSet dest : _edge_manager.getEdgeContainer().values()) {
|
|
successors.or(dest);
|
|
}
|
|
return new MyBitSet.MyBitSetIterator(successors);
|
|
}
|
|
|
|
/** The EdgeManager for the NBA_State */
|
|
public static class EdgeManager {
|
|
|
|
/** The state owning this EdgeManager */
|
|
private NBA_State _state;
|
|
/** The EdgeContainer */
|
|
private HashMap<APElement, MyBitSet> _container;
|
|
private int _apset_size;
|
|
|
|
/**
|
|
* Constructor.
|
|
* @param state the NBA_State owning this EdgeManager
|
|
* @param apset the underlying APSet
|
|
*/
|
|
public EdgeManager(NBA_State state, APSet apset)
|
|
{
|
|
_apset_size = apset.size();
|
|
_state = state;
|
|
_container = new HashMap<APElement, MyBitSet>();
|
|
}
|
|
|
|
/** Get the target states */
|
|
public MyBitSet getEdge(APElement label) {
|
|
if (_container.get(label) == null)
|
|
_container.put(label, new MyBitSet(_apset_size));
|
|
return _container.get(label);
|
|
}
|
|
|
|
public void addEdges(APElement label, MyBitSet to)
|
|
{
|
|
_container.put(label, to);
|
|
}
|
|
|
|
/** Add an edge. */
|
|
public void addEdge(APElement label, NBA_State state) {
|
|
if (_container.get(label) == null)
|
|
_container.put(label, new MyBitSet(_apset_size));
|
|
_container.get(label).set(state.getName());
|
|
}
|
|
|
|
/** Add an edge. */
|
|
public void addEdge(APMonom label, NBA_State state) {
|
|
APSet ap_set = _state.getGraph().getAPSet();
|
|
|
|
for (Iterator<APElement> it = label.APElementIterator(ap_set); it.hasNext(); ) {
|
|
APElement cur = it.next();
|
|
addEdge(cur, state);
|
|
// System.out.println("State " + _state.getName() + " added edge to " + state.getName() + " through " + cur);
|
|
}
|
|
}
|
|
|
|
/** Get the EdgeContainer. */
|
|
public HashMap<APElement, MyBitSet> getEdgeContainer() {
|
|
return _container;
|
|
}
|
|
}
|
|
}
|