private TransitionGraph<Role> mirror(final TransitionGraph<Role> tg) { final Map<State<Role>, State<Role>> newStates = new HashMap<>(); final TransitionGraph<Role> mirror = new TransitionGraph<>(); final State<Role> oldInitialState = tg.getInitialState(); final State<Role> newFinalState = copyState(oldInitialState, mirror, newStates); mirror.addFinalState(newFinalState); final Set<State<Role>> oldFinalStates = tg.getFinalStates(); State<Role> newInitialState = null; if (oldFinalStates.size() == 1) { final State<Role> oldFinalState = oldFinalStates.iterator().next(); newInitialState = newStates.get(oldFinalState); } else { newInitialState = mirror.newState(); for (final State<Role> oldFinalState : oldFinalStates) mirror.addTransition(newInitialState, newStates.get(oldFinalState)); } mirror.setInitialState(newInitialState); return mirror; }
private TransitionGraph<Role> mirror(final TransitionGraph<Role> tg) { final Map<State<Role>, State<Role>> newStates = new HashMap<>(); final TransitionGraph<Role> mirror = new TransitionGraph<>(); final State<Role> oldInitialState = tg.getInitialState(); final State<Role> newFinalState = copyState(oldInitialState, mirror, newStates); mirror.addFinalState(newFinalState); final Set<State<Role>> oldFinalStates = tg.getFinalStates(); State<Role> newInitialState = null; if (oldFinalStates.size() == 1) { final State<Role> oldFinalState = oldFinalStates.iterator().next(); newInitialState = newStates.get(oldFinalState); } else { newInitialState = mirror.newState(); for (final State<Role> oldFinalState : oldFinalStates) mirror.addTransition(newInitialState, newStates.get(oldFinalState)); } mirror.setInitialState(newInitialState); return mirror; }
private State<Role> copyState(final State<Role> oldState, final TransitionGraph<Role> newTG, final Map<State<Role>, State<Role>> newStates) { State<Role> newState = newStates.get(oldState); if (newState == null) { newState = newTG.newState(); newStates.put(oldState, newState); for (final Transition<Role> t : oldState.getTransitions()) { final State<Role> oldTo = t.getTo(); final State<Role> newFrom = copyState(oldTo, newTG, newStates); if (t.isEpsilon()) newTG.addTransition(newFrom, newState); else newTG.addTransition(newFrom, t.getName().getInverse(), newState); } } return newState; } }
private State<Role> copyState(final State<Role> oldState, final TransitionGraph<Role> newTG, final Map<State<Role>, State<Role>> newStates) { State<Role> newState = newStates.get(oldState); if (newState == null) { newState = newTG.newState(); newStates.put(oldState, newState); for (final Transition<Role> t : oldState.getTransitions()) { final State<Role> oldTo = t.getTo(); final State<Role> newFrom = copyState(oldTo, newTG, newStates); if (t.isEpsilon()) newTG.addTransition(newFrom, newState); else newTG.addTransition(newFrom, t.getName().getInverse(), newState); } } return newState; } }