18 #ifndef VCSN_TOOLS_GEN_RANDOM_HXX
19 # define VCSN_TOOLS_GEN_RANDOM_HXX
21 # include <vaucanson/tools/gen_random.hh>
22 # include <vaucanson/misc/usual_macros.hh>
30 using namespace algebra;
36 template <
class AutoSet>
42 AUTOMATA_SET_TYPES(AutoSet);
45 unsigned max = (alpha.max_size() > ALPHABET_MAX_SIZE ?
48 unsigned nb = alea(nb_letter ? nb_letter : max);
49 for (
unsigned i = 0; i < nb; ++i)
50 alpha.insert(alpha.random_letter());
52 monoid_t monoid(alpha);
54 series_set_t series(semi, monoid);
55 automata_set_t autoset(series);
59 template <
class AutoSet>
62 unsigned input_nb_letter,
63 unsigned output_nb_letter)
65 AUTOMATA_SET_TYPES(AutoSet);
67 alphabet_t input_alpha;
68 alphabet_t output_alpha;
70 unsigned max = (input_alpha.max_size() > ALPHABET_MAX_SIZE ?
72 input_alpha.max_size());
73 unsigned nb = alea(input_nb_letter ? input_nb_letter : max);
74 for (
unsigned i = 0; i < nb; ++i)
75 input_alpha.insert(input_alpha.random_letter());
77 max = (output_alpha.max_size() > ALPHABET_MAX_SIZE ?
79 output_alpha.max_size());
80 nb = alea(output_nb_letter ? output_nb_letter : max);
81 for (
unsigned i = 0; i < nb; ++i)
82 output_alpha.insert(output_alpha.random_letter());
84 monoid_t input_monoid(input_alpha);
85 monoid_t output_monoid(output_alpha);
87 typename semiring_t::semiring_t semi;
88 semiring_t output_series(semi, output_monoid);
90 series_set_t series(output_series, input_monoid);
92 automata_set_t auto_set(series);
96 unsigned alea(
unsigned max)
98 return int (1 +
float (max) * rand() / (RAND_MAX + 1.0));
105 template <
class TAutomata,
class AutomataSetGenerator>
106 GenRandomAutomata<TAutomata, AutomataSetGenerator>::GenRandomAutomata()
114 template <
class TAutomata,
class AutomataSetGenerator>
115 TAutomata GenRandomAutomata<TAutomata, AutomataSetGenerator>::
116 empty(
unsigned nb_letter)
118 automata_set_t aset =
120 TAutomata work(aset);
124 template <
class TAutomata,
class AutomataSetGenerator>
125 TAutomata GenRandomAutomata<TAutomata, AutomataSetGenerator>::
126 empty(
const automata_set_t&
set)
136 template <
class TAutomata,
class AutomataSetGenerator>
138 generate(
unsigned nb_state,
unsigned nb_transition_,
139 unsigned istate,
unsigned fstate,
142 automata_set_t aset =
144 return generate(aset, nb_state, nb_transition_, istate, fstate);
147 template <
class TAutomata,
class AutomataSetGenerator>
150 unsigned nb_state,
unsigned nb_transition_,
151 unsigned istate,
unsigned fstate)
153 AUTOMATON_TYPES(TAutomata);
154 AUTOMATON_FREEMONOID_TYPES(TAutomata);
155 int nb_transition = nb_transition_;
157 if (nb_transition_ < nb_state - 1)
158 nb_transition = nb_state - 1;
159 if (fstate > nb_state) fstate = nb_state;
160 if (fstate <= 0) fstate = 1;
161 if (istate > nb_state) istate = nb_state;
162 if (istate <= 0) istate = 1;
166 for (
unsigned i = 0; i < nb_state; i++)
170 state_iterator prev = work.states().begin();
171 state_iterator i = prev;
173 for (; i != work.states().end(); ++i)
176 letter_t e =
set.series().monoid().alphabet().choose();
178 for (delta_iterator t(work.value(), *prev);
182 monoid_elt_t w(work.series_of(*t).structure().monoid(), e);
183 if (work.series_of(*t).get(w) != work.series().semiring().wzero_)
191 algebra::letter_traits<letter_t>::letter_to_literal(e) != work.structure().series().monoid().representation()->empty)
192 work.add_letter_transition(*prev, *i, e);
196 for (
int i = 0; i < nb_transition; i++)
198 std::set<hstate_t> dst;
199 letter_t e =
set.series().monoid().alphabet().choose();
200 hstate_t s = work.choose_state();
201 hstate_t a = work.choose_state();
202 for (delta_iterator t(work.value(), s);
206 monoid_elt_t w(work.series_of(*t).structure().monoid(), e);
207 if (work.series_of(*t).get(w) != work.series().semiring().wzero_)
208 dst.insert(work.dst_of(*t));
210 if (dst.find(a) == dst.end() &&
211 algebra::letter_traits<letter_t>::letter_to_literal(e) != work.structure().series().monoid().representation()->empty)
212 work.add_letter_transition(s, a, e);
215 work.set_initial(*work.states().begin());
217 for (
unsigned i = 1; i < istate; i++)
219 hstate_t tmp = work.choose_state();
220 while (work.is_initial(tmp))
221 tmp = work.choose_state();
222 work.set_initial(tmp);
225 work.set_final(*--work.states().end());
227 for (
unsigned i = 1; i < fstate; i++)
229 hstate_t tmp = work.choose_state();
230 while (work.is_final(tmp))
231 tmp = work.choose_state();
242 template <
class TAutomata,
class AutomataSetGenerator>
243 unsigned GenRandomAutomata<TAutomata, AutomataSetGenerator>::
244 nb_transition_circle(TAutomata work, hstate_t state)
246 AUTOMATON_TYPES(TAutomata);
249 for_all_transitions(i, work)
250 if ((work.src_of(*i) == state) && (work.dst_of(*i) == state))
256 template <class TAutomata, class AutomataSetGenerator>
257 void GenRandomAutomata<TAutomata, AutomataSetGenerator>::
258 del_transition_circle(TAutomata& work, hstate_t state)
260 AUTOMATON_TYPES(TAutomata);
262 std::list<htransition_t> to_remove;
263 for_all_transitions(i, work)
265 if ((work.src_of(*i) == state) && (work.dst_of(*i) == state))
266 to_remove.push_back(*i);
268 for_all_const_(std::list<htransition_t>, e, to_remove)
269 work.del_transition(*e);
277 template <class TAutomata, class AutomataSetGenerator>
278 TAutomata GenRandomAutomata<TAutomata, AutomataSetGenerator>::
279 generate_with_epsilon(
unsigned nb_state,
280 unsigned nb_transition,
281 unsigned nb_epsilon_min,
282 unsigned nb_epsilon_max)
284 automata_set_t aset =
286 TAutomata a = generate_with_epsilon(aset, nb_state, nb_transition,
287 nb_epsilon_min, nb_epsilon_max);
293 template <
class TAutomata,
class AutomataSetGenerator>
294 TAutomata GenRandomAutomata<TAutomata, AutomataSetGenerator>::
295 generate_with_epsilon(
const automata_set_t&
set,
297 unsigned nb_transition,
298 unsigned nb_epsilon_min,
299 unsigned nb_epsilon_max)
301 TAutomata a =
generate(
set, nb_state, nb_transition);
302 unsigned nb_eps = nb_epsilon_min + alea(nb_epsilon_max - nb_epsilon_min);
304 for (
unsigned i = 0; i < nb_eps; ++i)
306 hstate_t f = a.choose_state();
307 hstate_t t = a.choose_state();
308 a.add_spontaneous(f, t);
318 template <
class TAutomata,
class AutomataSetGenerator>
319 TAutomata GenRandomAutomata<TAutomata, AutomataSetGenerator>::
320 generate_dfa(
unsigned nb_state,
321 unsigned size_alphabet,
324 automata_set_t aset =
326 TAutomata a = generate_dfa(aset, nb_state, fstate);
332 template <
class TAutomata,
class AutomataSetGenerator>
333 TAutomata GenRandomAutomata<TAutomata, AutomataSetGenerator>::
334 generate_dfa(
const automata_set_t&
set,
338 AUTOMATON_TYPES(TAutomata);
339 AUTOMATON_FREEMONOID_TYPES(TAutomata);
340 automaton_t work(
set);
342 for (
unsigned i = 0; i < nb_state; i++)
345 for_all_states(i, work)
347 for_all_letters(j,
set.series().monoid().alphabet())
348 work.add_letter_transition(*i,work.choose_state(),*j);
349 while (nb_transition_circle(work, *i) == set.series().monoid().alphabet().size())
351 del_transition_circle(work, *i);
352 for_all_letters(j,
set.series().monoid().alphabet())
355 for (delta_iterator t(work.value(), *i);
359 monoid_elt_t w(work.series_of(*t).structure().monoid(), *j);
360 if (work.series_of(*t).get(w) != work.series().semiring().wzero_)
369 while ((s = work.choose_state()) == *i) ;
370 work.add_letter_transition(*i, s, *j);
377 work.set_initial(work.choose_state());
380 for (
unsigned i = 0; i < fstate; i++)
382 hstate_t tmp = work.choose_state();
383 while (work.is_final(tmp))
384 tmp = work.choose_state();
395 template <
class TAutomata,
class AutomataSetGenerator>
396 TAutomata GenRandomAutomata<TAutomata, AutomataSetGenerator>::
397 generate_normalized(
unsigned nb_state,
unsigned density)
399 automata_set_t aset =
401 TAutomata a = generate_normalized(aset, nb_state, density);
405 template <
class TAutomata,
class AutomataSetGenerator>
406 TAutomata GenRandomAutomata<TAutomata, AutomataSetGenerator>::
407 generate_normalized(
const automata_set_t&
set,
411 typedef typename TAutomata::state_iterator state_iterator;
412 typedef typename TAutomata::monoid_t::alphabets_elt_t alphabets_elt_t;
417 TAutomata work =
generate(
set, nb_state,
418 nb_state + alea(nb_state * density));
420 for (state_iterator i = work.states().begin(); i != work.states().end();
423 if (work.is_initial(*i))
424 work.unset_initial(*i);
425 if (work.is_final(*i))
426 work.unset_final(*i);
429 hstate_t init = work.add_state();
430 hstate_t
final = work.add_state();
432 work.set_initial(init);
433 work.set_final(
final);
435 const alphabets_elt_t&
436 alpha = work.structure().series().monoid().alphabet();
440 for (
unsigned i = 0; i < density; i++)
441 if ((tmp = work.choose_state()) != init)
442 work.add_letter_transition(init, tmp,
445 for (
unsigned i =0; i < density; i++)
446 if ((tmp = work.choose_state()) !=
final)
447 work.add_letter_transition(tmp,
final,
457 #endif // ! VCSN_TOOLS_GEN_RANDOM_HXX