package rationals.transformations;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
import rationals.Automaton;
import rationals.NoSuchStateException;
import rationals.State;
import rationals.Transition;
public class ToC implements UnaryTransformation {
public Automaton transform(Automaton a) {
Automaton b = new EpsilonTransitionRemover().transform(a);
Set Ib = b.initials();
Set Tb = b.terminals();
Map /* < Set <State>, Set < State > > */ subsets = new HashMap();
Map /* < Set < State > , Map < Object, Set < State > > > */delta = new HashMap();
LinkedList l = new LinkedList();
Set /* < Set < State > > */ done = new HashSet();
l.add(Ib);
while (!l.isEmpty()) {
Set e1 = (Set) l.removeFirst();
Set sub = b.getStateFactory().stateSet();
subsets.put(e1, sub);
Iterator j = done.iterator();
while (j.hasNext()) {
Set x = (Set) j.next();
if (x.containsAll(e1) && !x.equals(e1))
((Set) subsets.get(x)).addAll(e1);
if (e1.containsAll(x) && !x.equals(e1))
sub.addAll(x);
}
done.add(e1);
delta.put(e1, new HashMap());
j = b.alphabet().iterator();
while (j.hasNext()) {
Object label = j.next();
Iterator i = e1.iterator();
Set e2 = b.getStateFactory().stateSet();
while (i.hasNext()) {
Iterator k = b.delta((State) i.next(), label).iterator();
while (k.hasNext()) {
e2.add(((Transition) k.next()).end());
}
}
((Map) delta.get(e1)).put(label, e2);
if (!done.contains(e2))
l.add(e2);
}
}
Automaton c = new Automaton();
Map corr = new HashMap();
Iterator i = done.iterator();
while (i.hasNext()) {
Set x = (Set) i.next();
if (!x.isEmpty()) {
if (!((Set) subsets.get(x)).containsAll(x)) {
boolean ini = Ib.containsAll(x);
boolean term = TransformationsToolBox
.containsATerminalState(x);
corr.put(x, c.addState(ini, term));
}
}
}
i = corr.keySet().iterator();
while (i.hasNext()) {
Set e = (Set) i.next();
Iterator j = b.alphabet().iterator();
while (j.hasNext()) {
Object lab = j.next();
Set f = (Set) ((Map) delta.get(e)).get(lab);
Iterator k = corr.keySet().iterator();
while (k.hasNext()) {
Set x = (Set) k.next();
if (f.containsAll(x)) {
try {
c.addTransition(new Transition((State) corr.get(e),
lab, (State) corr.get(x)));
} catch (NoSuchStateException z) {
}
}
}
}
}
return c;
}
}