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 AI>
00038 std::set<typename Element<A, AI>::hstate_t>
00039 do_accessible_states(const AutomataBase<A>&,
00040 const Element<A, AI>& a)
00041 {
00042 typedef Element<A, AI> auto_t;
00043 AUTOMATON_TYPES(auto_t);
00044 typedef std::set<hstate_t> state_set_t;
00045
00046 std::queue<hstate_t> queue;
00047 state_set_t reachable_states;
00048
00049
00050
00051
00052 for_all_const_initial_states(i, a)
00053 {
00054 queue.push(*i);
00055 reachable_states.insert(*i);
00056 }
00057
00058
00059
00060
00061 while (!queue.empty())
00062 {
00063 hstate_t state = queue.front();
00064 queue.pop();
00065 state_set_t delta_ret;
00066 a.deltac(delta_ret, state, delta_kind::states());
00067 for_all_const_(state_set_t, j, delta_ret)
00068 {
00069 state = *j;
00070 if (reachable_states.find(state) == reachable_states.end())
00071 {
00072 reachable_states.insert(state);
00073 queue.push(state);
00074 }
00075 }
00076 }
00077 return reachable_states;
00078 }
00079
00080 template<typename A, typename AI>
00081 std::set<typename Element<A, AI>::hstate_t>
00082 accessible_states(const Element<A, AI>& a)
00083 {
00084 TIMER_SCOPED ("accessible_states");
00085 return do_accessible_states(a.structure(), a);
00086 }
00087
00088 template<typename A, typename AI>
00089 void
00090 accessible_here(Element<A, AI>& a)
00091 {
00092 sub_automaton_here(a, accessible_states(a));
00093 }
00094
00095 template<typename A, typename AI>
00096 Element<A, AI>
00097 accessible(const Element<A, AI>& a)
00098 {
00099 return sub_automaton(a, accessible_states(a));
00100 }
00101
00102
00103
00104
00105
00106 template <class A, typename AI>
00107 std::set<typename Element<A, AI>::hstate_t>
00108 do_coaccessible_states(const AutomataBase<A>&,
00109 const Element<A, AI>& a)
00110 {
00111 return accessible_states(transpose_view(a));
00112 }
00113
00114 template<typename A, typename AI>
00115 std::set<typename Element<A, AI>::hstate_t>
00116 coaccessible_states(const Element<A, AI>& a)
00117 {
00118 return do_coaccessible_states(a.structure(), a);
00119 }
00120
00121 template<typename A, typename AI>
00122 Element<A, AI>
00123 coaccessible(const Element<A, AI>& a)
00124 {
00125 return sub_automaton(a, coaccessible_states(a));
00126 }
00127
00128 template<typename A, typename AI>
00129 void
00130 coaccessible_here(Element<A, AI>& a)
00131 {
00132 sub_automaton_here(a, coaccessible_states(a));
00133 }
00134
00135 }
00136
00137 #endif // ! VCSN_ALGORITHMS_ACCESSIBLE_HXX