diff --git a/src/main/java/graph/AUTGraph.java b/src/main/java/graph/AUTGraph.java index 949ecb03ab73df7d4b34663928b0fcaef0aa6c6d..bab26ef5298f3bd0de100a8c87f016939387264a 100755 --- a/src/main/java/graph/AUTGraph.java +++ b/src/main/java/graph/AUTGraph.java @@ -48,6 +48,9 @@ import java.io.BufferedReader; import java.io.StringReader; import java.util.*; +import rationals.*; +import rationals.transformations.*; + /** * Class AUTGraph * Creation : 16/09/2004 @@ -1028,6 +1031,75 @@ public class AUTGraph implements myutil.Graph { } } + public AUTGraph fromAutomaton(Automaton a) { + AUTGraph graph = new AUTGraph(); + Set<Transition<String>> trs = a.delta(); + Set<State> sts = a.states(); + + HashMap<State, Integer> mapOfStates = new HashMap<>(); + int cpt = 1; + for(State st: sts) { + if (st.isInitial()) { + mapOfStates.put(st, new Integer(0)); + } else { + mapOfStates.put(st, new Integer(cpt)); + cpt ++; + } + } + + for(Transition tr: trs) { + State s1 = tr.start(); + State s2 = tr.end(); + String label = (String)(tr.label()); + Integer i1 = mapOfStates.get(s1); + Integer i2 = mapOfStates.get(s2); + + if ((i1 != null) && (i2 != null)) { + AUTTransition trNew = new AUTTransition(i1.intValue(), label, i2.intValue()); + graph.addTransition(trNew); + } + } + + computeStates(); + + return graph; + } + + public Automaton toAutomaton() { + Automaton<String, Transition<String>, TransitionBuilder<String>> a = new Automaton<>(); + computeStates(); + + boolean initial = true; + for(AUTState s: states) { + State as = a.addState(initial, s.isTerminationState()); + s.referenceObject = as; + initial = false; + } + for(AUTTransition t: transitions) { + try { + String label = t.transition; + if (t.isTau) { + label = null; + } + a.addTransition(new Transition<String>((State) (states.get(t.origin).referenceObject), label, (State) (states.get(t + .destination) + .referenceObject))); + } catch (NoSuchStateException nsse) { } + } + + return a; + } + + public void reduceGraph() { + Automaton a = toAutomaton(); + Automaton<String, Transition<String>, TransitionBuilder<String>> b = + new EpsilonTransitionRemover<String, Transition<String>, + TransitionBuilder<String>>().transform(a); + + b = new Reducer<String, Transition<String>, TransitionBuilder<String>>().transform(b); + TraceManager.addDev("Error in reduce graph:" + b); + } + public void partitionGraph() {