UP | HOME

autdo

Table of Contents

autdo runs ω-automata through one or more external tools, providing Spot's standard automaton input and output interface. It is the automaton counterpart of ltldo.

Example

The following command runs autfilt and autfilt --complement on a set of automata and outputs the results in HOA format as one-liners (-Hl).

ltl2tgba 'Ga' 'Fb' | autdo -Hl 'autfilt %H>%O' 'autfilt --complement %H>%O'
HOA: v1 name: "Ga" States: 1 Start: 0 AP: 1 "a" acc-name: all Acceptance: 0 t properties: trans-labels explicit-labels state-acc deterministic stutter-invariant very-weak --BODY-- State: 0 [0] 0 --END--
HOA: v1 States: 2 Start: 0 AP: 1 "a" acc-name: co-Buchi Acceptance: 1 Fin(0) properties: trans-labels explicit-labels state-acc complete deterministic stutter-invariant very-weak --BODY-- State: 0 {0} [0] 0 [!0] 1 State: 1 [t] 1 --END--
HOA: v1 name: "Fb" States: 2 Start: 1 AP: 1 "b" acc-name: Buchi Acceptance: 1 Inf(0) properties: trans-labels explicit-labels state-acc complete deterministic stutter-invariant terminal very-weak --BODY-- State: 0 {0} [t] 0 State: 1 [0] 0 [!0] 1 --END--
HOA: v1 States: 2 Start: 1 AP: 1 "b" acc-name: co-Buchi Acceptance: 1 Fin(0) properties: trans-labels explicit-labels state-acc complete deterministic stutter-invariant very-weak --BODY-- State: 0 {0} [t] 0 State: 1 [0] 0 [!0] 1 --END--

The result is one line per input and per tool, so four lines total.

The above command specifies the %H (filename for the input automaton in HOA format) and %O (filename for the output automaton in any supported format) explicitly, however since autdo knows about autfilt, the %H>%O part will be automatically added if omitted.

ltl2tgba 'Ga' 'Fb' | autdo -Hl 'autfilt' 'autfilt --complement'
HOA: v1 name: "Ga" States: 1 Start: 0 AP: 1 "a" acc-name: all Acceptance: 0 t properties: trans-labels explicit-labels state-acc deterministic stutter-invariant very-weak --BODY-- State: 0 [0] 0 --END--
HOA: v1 States: 2 Start: 0 AP: 1 "a" acc-name: co-Buchi Acceptance: 1 Fin(0) properties: trans-labels explicit-labels state-acc complete deterministic stutter-invariant very-weak --BODY-- State: 0 {0} [0] 0 [!0] 1 State: 1 [t] 1 --END--
HOA: v1 name: "Fb" States: 2 Start: 1 AP: 1 "b" acc-name: Buchi Acceptance: 1 Inf(0) properties: trans-labels explicit-labels state-acc complete deterministic stutter-invariant terminal very-weak --BODY-- State: 0 {0} [t] 0 State: 1 [0] 0 [!0] 1 --END--
HOA: v1 States: 2 Start: 1 AP: 1 "b" acc-name: co-Buchi Acceptance: 1 Fin(0) properties: trans-labels explicit-labels state-acc complete deterministic stutter-invariant very-weak --BODY-- State: 0 {0} [t] 0 State: 1 [0] 0 [!0] 1 --END--

Syntax for specifying tools to call

The syntax for specifying how a tool should be called is the same as in autcross. Namely, the following sequences are available.

%%                         a single %
%H,%S,%L                   filename for the input automaton in (H) HOA, (S)
                           Spin's neverclaim, or (L) LBTT's format
%M, %[val]M                the name of the input automaton, with an optional
                           default value
%O                         filename for the automaton output in HOA, never
                           claim, LBTT, or ltl2dstar's format

Contrarily to autcross, it is not mandatory to specify an output filename using one of the sequence for that last line. For instance, we could simply run an automaton through cat to compare different output syntaxes:

ltl2tgba 'Ga' | autdo 'cat %H %S %L'
HOA: v1
name: "Ga"
States: 1
Start: 0
AP: 1 "a"
acc-name: all
Acceptance: 0 t
properties: trans-labels explicit-labels state-acc deterministic
properties: stutter-invariant very-weak
--BODY--
State: 0
[0] 0
--END--
never { /* Ga */
accept_init:
  if
  :: (a) -> goto accept_init
  fi;
}

1 0
0 1 -1
0 "a"
-1

To simplify the use of some known tools, a set of predefined shorthands are available. Those can be listed with the --list-shorthands option.

autdo --list-shorthands
If a COMMANDFMT does not use any %-sequence, and starts with one of
the following regexes, then the string on the right is appended.

  autfilt                                  %H>%O
  dra2dpa                                  <%H>%O
  dstar2tgba                               %H>%O
  kofola                                   %H>%O
  ltl2dstar                                -B %H %O
  nba2l?dpa                                <%H>%O
  seminator                                %H>%O
  owl.* (ngba2ldba|nba(2dpa|2det|sim)|aut2parity|gfg-minimization)\b <%H>%O

Any {name} and directory component is skipped for the purpose of
matching those prefixes.  So for instance
  '{AF} ~/mytools/autfilt-2.4 --remove-fin'
will be changed into
  '{AF} ~/mytools/autfilt-2.4 --remove-fin %H>%O'

Computing statistics, and running as a portfolio

autdo implements the common output options of other tools producing automata. This include the --stats option for printing statistics instead of automata.

Here is an example where we compare the output of autfilt -G -D (determinization to any acceptance condition) and ltl2dstar (determinisation to Rabin acceptance).

ltl2tgba -B 'FGa | FGb' '(Ga -> Fb) & FGc' 'G(a -> Fb) & FGc' | \
  autdo 'autfilt -G -D' 'ltl2dstar' \
        --stats='%M: %K: %S->%s states, %T->%t trans, %A->%a colors'
F(Ga | Gb): autfilt -G -D: 3->3 states, 12->12 trans, 1->1 colors
F(Ga | Gb): ltl2dstar: 3->14 states, 12->56 trans, 1->6 colors
FGc & F(!a | b): autfilt -G -D: 3->2 states, 27->16 trans, 1->1 colors
FGc & F(!a | b): ltl2dstar: 3->3 states, 27->24 trans, 1->2 colors
FGc & G(!a | Fb): autfilt -G -D: 4->4 states, 29->32 trans, 1->2 colors
FGc & G(!a | Fb): ltl2dstar: 4->4 states, 29->32 trans, 1->2 colors

As with autcross, an upper-case specifier like %S usually refers to the input file, while %s refers to the output file.

Instead of outputting all results, autdo can be configured to output only the smallest automaton obtained for each input:

ltl2tgba -B 'FGa | FGb' '(Ga -> Fb) & FGc' 'G(a -> Fb) & FGc' | \
  autdo 'autfilt -G -D' 'ltl2dstar' \
        --smallest \
        --stats='%M: %K: %S->%s states, %T->%t trans, %A->%a colors'
F(Ga | Gb): autfilt -G -D: 3->3 states, 12->12 trans, 1->1 colors
FGc & F(!a | b): autfilt -G -D: 3->2 states, 27->16 trans, 1->1 colors
FGc & G(!a | Fb): autfilt -G -D: 4->4 states, 29->32 trans, 1->2 colors

Therefore, autdo --smallest proc1 proc2 proc3... acts like a portfolio of automata processors, always returning the smallest produced automaton.

The sorting criterion can be specified using --smallest or --greatest, optionally followed by a format string with %-sequences. The default criterion is %s,%e, so the number of states will be compared first, and in case of equality the number of edges.

Controlling and measuring time

The run time of each command can be restricted with the -T NUM option. The argument is the maximum number of seconds that each command is allowed to run.

When a timeout occurs a warning is printed on stderr, and no automaton (or statistic) is output by autdo for this specific pair of command/automaton. The processing then continue with other automata and tools. Timeouts are not considered as errors, so they have no effect on the exit status of autdo. This behavior can be changed with option --fail-on-timeout, in which case timeouts are considered as errors.

For each command (that does not terminate with a timeout) the runtime can be printed using the %r escape sequence. This makes autdo an alternative to autcross for running benchmarks without any verification.