Browse Source

automata.finite: deduplicate toDot()

accumulation
Sascha Wunderlich 9 years ago
committed by Sascha Wunderlich
parent
commit
d3ba0c5d29
  1. 35
      prism/src/automata/finite/DeterministicFiniteAutomaton.java
  2. 4
      prism/src/automata/finite/Edge.java
  3. 37
      prism/src/automata/finite/FiniteAutomaton.java
  4. 1
      prism/src/automata/finite/MultiEdge.java
  5. 37
      prism/src/automata/finite/NondeterministicFiniteAutomaton.java
  6. 10
      prism/src/automata/finite/SingleEdge.java

35
prism/src/automata/finite/DeterministicFiniteAutomaton.java

@ -172,39 +172,4 @@ public class DeterministicFiniteAutomaton<Symbol> extends FiniteAutomaton<Symbol
}
}
}
/**
* Generate a representation in GraphViz's dot format.
* States are black, red when accepting, blue when initial and violet when both.
* @return
*/
public String toDot() {
StringBuffer result = new StringBuffer();
result.append("digraph G {\n");
for(State state : states) {
String color = "black";
if (isAcceptingState(state)) { color = "red"; }
if (isInitialState(state)) { color = "blue"; }
if (isAcceptingState(state) && isInitialState(state)) { color = "violet"; }
result.append(state
+ "[shape=box, color=" + color + ","
+ " label=" + state + "]\n");
}
for(SingleEdge<Symbol> edge : edges) {
String sourceLabel = edge.getSource().toString();
String symLabel = "\"" + edge.getLabel() + "\"";
State sink = edge.getSink();
String sinkLabel = "\"" + sink + "\"";
result.append(sourceLabel
+ " -> " + sinkLabel
+ "[label=" + symLabel + "];\n");
}
result.append("}");
return result.toString();
}
}

4
prism/src/automata/finite/Edge.java

@ -1,5 +1,7 @@
package automata.finite;
import java.util.Set;
public abstract class Edge<Symbol> {
protected State source;
protected EdgeLabel<Symbol> label;
@ -8,6 +10,8 @@ public abstract class Edge<Symbol> {
return source;
}
public abstract Set<State> getSinks();
public EdgeLabel<Symbol> getLabel() {
return label;
}

37
prism/src/automata/finite/FiniteAutomaton.java

@ -459,4 +459,41 @@ public abstract class FiniteAutomaton<Symbol, E extends Edge<Symbol>> implements
return result.toString();
}
/**
* Generate a representation in GraphViz's dot format.
* States are black, red when accepting, blue when initial and violet when both.
* @return
*/
public String toDot() {
StringBuffer result = new StringBuffer();
result.append("digraph G {\n");
for(State state : states) {
String color = "black";
String stateLabel = "\"" + state + "\"";
if (isAcceptingState(state)) { color = "red"; }
if (isInitialState(state)) { color = "blue"; }
if (isAcceptingState(state) && isInitialState(state)) { color = "violet"; }
result.append(stateLabel
+ "[shape=box, color=" + color + ","
+ " label=" + stateLabel + "]\n");
}
for(Edge<Symbol> edge : edges) {
String sourceLabel = "\"" + edge.getSource() + "\"";
String symLabel = "\"" + edge.getLabel() + "\"";
for(State sink : edge.getSinks()) {
String sinkLabel = "\"" + sink + "\"";
result.append(sourceLabel
+ " -> " + sinkLabel
+ "[label=" + symLabel + "];\n");
}
}
result.append("}");
return result.toString();
}
}

1
prism/src/automata/finite/MultiEdge.java

@ -12,6 +12,7 @@ public class MultiEdge<Symbol> extends Edge<Symbol> {
this.sinks = sinks;
}
@Override
public HashSet<State> getSinks() {
return sinks;
}

37
prism/src/automata/finite/NondeterministicFiniteAutomaton.java

@ -443,41 +443,4 @@ public class NondeterministicFiniteAutomaton<Symbol> extends FiniteAutomaton<Sym
return dfa;
};
/**
* Generate a representation in GraphViz's dot format.
* States are black, red when accepting, blue when initial and violet when both.
* @return
*/
public String toDot() {
StringBuffer result = new StringBuffer();
result.append("digraph G {\n");
for(State state : states) {
String color = "black";
if (isAcceptingState(state)) { color = "red"; }
if (isInitialState(state)) { color = "blue"; }
if (isAcceptingState(state) && isInitialState(state)) { color = "violet"; }
result.append(state
+ "[shape=box, color=" + color + ","
+ " label=" + state + "]\n");
}
for(MultiEdge<Symbol> edge : edges) {
String sourceLabel = edge.getSource().toString();
String symLabel = "\"" + edge.getLabel() + "\"";
for(State sink : edge.getSinks()) {
String sinkLabel = "\"" + sink + "\"";
result.append(sourceLabel
+ " -> " + sinkLabel
+ "[label=" + symLabel + "];\n");
}
}
result.append("}");
return result.toString();
}
}

10
prism/src/automata/finite/SingleEdge.java

@ -1,5 +1,7 @@
package automata.finite;
import java.util.HashSet;
public class SingleEdge<Symbol> extends Edge<Symbol> {
private State sink;
@ -14,6 +16,13 @@ public class SingleEdge<Symbol> extends Edge<Symbol> {
return sink;
}
@Override
public HashSet<State> getSinks() {
HashSet<State> ret = new HashSet<State>();
ret.add(getSink());
return ret;
}
public void setSink(State sink) {
this.sink = sink;
}
@ -61,4 +70,5 @@ public class SingleEdge<Symbol> extends Edge<Symbol> {
return false;
}
}
}
Loading…
Cancel
Save