/*
* (C) Copyright 2001 Arnaud Bailly (arnaud.oqube@gmail.com),
* Yves Roos (yroos@lifl.fr) and others.
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package rationals.transformations;
import rationals.Automaton;
import rationals.Builder;
import rationals.NoSuchStateException;
import rationals.State;
import rationals.Transition;
import java.util.*;
public class ToC<L, Tr extends Transition<L>, T extends Builder<L, Tr, T>> implements UnaryTransformation<L, Tr, T> {
public Automaton<L, Tr, T> transform(Automaton<L, Tr, T> 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;
}
}