17 #ifndef VCSN_ALGORITHMS_IS_DETERMINISTIC_HXX
18 # define VCSN_ALGORITHMS_IS_DETERMINISTIC_HXX
23 # include <vaucanson/misc/usual_macros.hh>
24 # include <vaucanson/automata/concept/automata_base.hh>
32 template <
typename input_t>
34 is_state_deterministic (input_t& input,
35 typename input_t::state_iterator& current_state,
36 typename input_t::series_set_elt_t::semiring_elt_t&
39 AUTOMATON_TYPES(input_t);
41 typedef typename series_set_elt_t::support_t support_t;
42 typedef typename std::list<htransition_t> delta_ret_t;
43 delta_ret_t delta_ret;
46 for (delta_iterator j(input.value(), *current_state);
49 delta_ret.push_back(*j);
50 for_all_const_(delta_ret_t, j, delta_ret)
52 series_set_elt_t s = input.series_of(*j);
53 typename delta_ret_t::const_iterator k = j;
55 for (; k != delta_ret.end(); ++k)
57 series_set_elt_t s_ = input.series_of(*k);
58 for_all_(support_t, supp, s.supp())
59 if (s_.get(*supp) != zero_semiring)
72 template <
typename A,
typename AI>
74 do_is_deterministic(
const AutomataBase<A>&,
75 const Element<A, AI>& input)
79 typedef Element<A, AI> automaton_t;
80 AUTOMATON_TYPES(automaton_t);
81 semiring_elt_t zero_semiring
82 = input.structure().series().semiring()
83 .zero(
SELECT(
typename semiring_elt_t::value_t));
86 if (input.initial().size() > 1)
89 for_all_const_states(i, input)
90 if (not is_state_deterministic (input, i, zero_semiring))
96 template<typename A, typename AI>
100 BENCH_TASK_SCOPED(
"is_deterministic");
101 return do_is_deterministic(a.structure(), a);
106 #endif // ! VCSN_ALGORITHMS_IS_DETERMINISTIC_HXX