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 for (delta_iterator j(a.value(), state); ! j.done(); j.next())
00067 delta_ret.insert(a.dst_of(*j));
00068 for_all_const_(state_set_t, j, delta_ret)
00069 {
00070 state = *j;
00071 if (reachable_states.find(state) == reachable_states.end())
00072 {
00073 reachable_states.insert(state);
00074 queue.push(state);
00075 }
00076 }
00077 }
00078 return reachable_states;
00079 }
00080
00081 template<typename A, typename AI>
00082 std::set<typename Element<A, AI>::hstate_t>
00083 accessible_states(const Element<A, AI>& a)
00084 {
00085 BENCH_TASK_SCOPED("accessible_states");
00086 return do_accessible_states(a.structure(), a);
00087 }
00088
00089 template<typename A, typename AI>
00090 void
00091 accessible_here(Element<A, AI>& a)
00092 {
00093 sub_automaton_here(a, accessible_states(a));
00094 }
00095
00096 template<typename A, typename AI>
00097 Element<A, AI>
00098 accessible(const Element<A, AI>& a)
00099 {
00100 return sub_automaton(a, accessible_states(a));
00101 }
00102
00103
00104
00105
00106
00107 template <class A, typename AI>
00108 std::set<typename Element<A, AI>::hstate_t>
00109 do_coaccessible_states(const AutomataBase<A>&,
00110 const Element<A, AI>& a)
00111 {
00112 return accessible_states(transpose_view(a));
00113 }
00114
00115 template<typename A, typename AI>
00116 std::set<typename Element<A, AI>::hstate_t>
00117 coaccessible_states(const Element<A, AI>& a)
00118 {
00119 return do_coaccessible_states(a.structure(), a);
00120 }
00121
00122 template<typename A, typename AI>
00123 Element<A, AI>
00124 coaccessible(const Element<A, AI>& a)
00125 {
00126 return sub_automaton(a, coaccessible_states(a));
00127 }
00128
00129 template<typename A, typename AI>
00130 void
00131 coaccessible_here(Element<A, AI>& a)
00132 {
00133 sub_automaton_here(a, coaccessible_states(a));
00134 }
00135
00136 }
00137
00138 #endif // ! VCSN_ALGORITHMS_ACCESSIBLE_HXX