00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGORITHMS_IS_DETERMINISTIC_HXX
00018 # define VCSN_ALGORITHMS_IS_DETERMINISTIC_HXX
00019
00020 # include <vaucanson/algorithms/is_deterministic.hh>
00021 # include <vaucanson/algorithms/realtime.hh>
00022 # include <set>
00023 # include <vaucanson/misc/usual_macros.hh>
00024 # include <vaucanson/automata/concept/automata_base.hh>
00025
00026 namespace vcsn {
00027
00028
00029
00030
00031
00032 template <typename input_t>
00033 static bool
00034 is_state_deterministic (input_t& input,
00035 typename input_t::state_iterator& current_state,
00036 typename input_t::series_set_elt_t::semiring_elt_t&
00037 zero_semiring)
00038 {
00039 AUTOMATON_TYPES(input_t);
00040
00041 typedef typename series_set_elt_t::support_t support_t;
00042 typedef typename std::list<htransition_t> delta_ret_t;
00043 delta_ret_t delta_ret;
00044
00045 input.deltac(delta_ret, *current_state, delta_kind::transitions());
00046
00047 for_all_const_(delta_ret_t, j, delta_ret)
00048 {
00049 series_set_elt_t s = input.series_of(*j);
00050 typename delta_ret_t::const_iterator k = j;
00051 ++k;
00052 for (; k != delta_ret.end(); ++k)
00053 {
00054 series_set_elt_t s_ = input.series_of(*k);
00055 for_all_(support_t, supp, s.supp())
00056 if (s_.get(*supp) != zero_semiring)
00057 return false;
00058 }
00059 }
00060 return true;
00061 }
00062
00063
00064
00065
00066
00067
00068
00069 template <typename A, typename input_t>
00070 bool
00071 do_is_deterministic(const AutomataBase<A>& ,
00072 const input_t& input)
00073 {
00074 precondition(is_realtime(input));
00075
00076 AUTOMATON_TYPES(input_t);
00077 semiring_elt_t zero_semiring
00078 = input.structure().series().semiring()
00079 .zero(SELECT(typename semiring_elt_t::value_t));
00080
00081
00082 if (input.initial().size() > 1)
00083 return false;
00084
00085 for_all_const_states(i, input)
00086 if (not is_state_deterministic (input, i, zero_semiring))
00087 return false;
00088 return true;
00089 }
00090
00091
00092 template<typename A, typename T>
00093 bool
00094 is_deterministic(const Element<A, T>& a)
00095 {
00096 TIMER_SCOPED("is_deterministic");
00097 return do_is_deterministic(a.structure(), a);
00098 }
00099
00100 }
00101
00102 #endif // ! VCSN_ALGORITHMS_IS_DETERMINISTIC_HXX