00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGORITHMS_ACCESSIBLE_HXX
00018 # define VCSN_ALGORITHMS_ACCESSIBLE_HXX
00019
00020 # include <vaucanson/algorithms/accessible.hh>
00021
00022 # include <vaucanson/automata/concept/automata_base.hh>
00023 # include <vaucanson/automata/implementation/transpose_view.hh>
00024 # include <vaucanson/algorithms/sub_automaton.hh>
00025 # include <vaucanson/misc/usual_macros.hh>
00026
00027 # include <queue>
00028 # include <set>
00029
00030
00031 namespace vcsn {
00032
00033
00034
00035
00036
00037 template <class A_, typename Auto_>
00038 std::set<typename Auto_::hstate_t>
00039 do_accessible_states(const AutomataBase<A_>&,
00040 const Auto_& a)
00041 {
00042 AUTOMATON_TYPES(Auto_);
00043 typedef std::set<hstate_t> state_set_t;
00044
00045 std::queue<hstate_t> queue;
00046 state_set_t reachable_states;
00047
00048
00049
00050
00051 for_all_const_initial_states(i, a)
00052 {
00053 queue.push(*i);
00054 reachable_states.insert(*i);
00055 }
00056
00057
00058
00059
00060 while (!queue.empty())
00061 {
00062 hstate_t state = queue.front();
00063 queue.pop();
00064 state_set_t delta_ret;
00065 a.deltac(delta_ret, state, delta_kind::states());
00066 for_all_const_(state_set_t, j, delta_ret)
00067 {
00068 state = *j;
00069 if (reachable_states.find(state) == reachable_states.end())
00070 {
00071 reachable_states.insert(state);
00072 queue.push(state);
00073 }
00074 }
00075 }
00076 return reachable_states;
00077 }
00078
00079 template<typename A, typename T>
00080 std::set<typename automaton_traits<T>::hstate_t>
00081 accessible_states(const Element<A, T>& a)
00082 {
00083 TIMER_SCOPED ("accessible_states");
00084 return do_accessible_states(a.structure(), a);
00085 }
00086
00087 template<typename A, typename T>
00088 void
00089 accessible_here(Element<A, T>& a)
00090 {
00091 sub_automaton_here(a, accessible_states(a));
00092 }
00093
00094 template<typename A, typename T>
00095 Element<A, T>
00096 accessible(const Element<A, T>& a)
00097 {
00098 return sub_automaton(a, accessible_states(a));
00099 }
00100
00101
00102
00103
00104
00105 template <class A_, typename Auto_>
00106 std::set<typename Auto_::hstate_t>
00107 do_coaccessible_states(const AutomataBase<A_>&,
00108 const Auto_& a)
00109 {
00110 return accessible_states(transpose_view(a));
00111 }
00112
00113 template<typename A, typename T>
00114 std::set<typename automaton_traits<T>::hstate_t>
00115 coaccessible_states(const Element<A, T>& a)
00116 {
00117 return do_coaccessible_states(a.structure(), a);
00118 }
00119
00120 template<typename A, typename T>
00121 Element<A, T>
00122 coaccessible(const Element<A, T>& a)
00123 {
00124 return sub_automaton(a, coaccessible_states(a));
00125 }
00126
00127 template<typename A, typename T>
00128 void
00129 coaccessible_here(Element<A, T>& a)
00130 {
00131 sub_automaton_here(a, coaccessible_states(a));
00132 }
00133
00134 }
00135
00136 #endif // ! VCSN_ALGORITHMS_ACCESSIBLE_HXX