context
.random_automaton
¶Generate a random automaton. The states are guaranteed to be accessible, but some may be non coaccessible.
Arguments:
num_states
:
The number of states wanted in the automata
(>0). All states will be connected, and there will be no dead
state. However, some might not be coaccessible.
density = 0.1
:
The density of the automata. This is the probability
(between 0.0 and 1.0), to add a transition between two
states. All states have at least one outgoing transition,
so \a d is considered only when adding the remaining transition.
A density of 1 means all states will be connected to each other.
num_initial = 1
:
The number of initial states wanted (0 <= num_initial <= num_states)
num_final = 1
:
The number of final states wanted (0 <= num_final <= num_states)
max_labels = generators.size()
:
The maximum number of labels per transition. Defaults to the
number of generators.
loop_chance = 0
:
The probability (between 0.0 and 1.0) for each state to have
a loop.
Caveats:
loop_change = 0
there can be loops.a
, b
and a
, which results in only two labels.import vcsn
import os
# Make sure we always get the same sequence of random automata.
os.environ["VCSN_SEED"] = "1"
b = vcsn.context('lal_char(abc), b')
b.random_automaton(3)
b.random_automaton(3)
b.random_automaton(3)
b.random_automaton(3)
Pushing the arguments to their limits guarantees the result. For instance, a full density builds a clique.
vcsn.context('lal(abc), b').random_automaton(3, density=1, max_labels=1)
All the states are initial, final, and have a loop.
vcsn.context('lal(abc), b').random_automaton(3, max_labels=1, loop_chance=1, num_initial=3, num_final=3)