Commit f9029858 authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

org: Update results to new output

The dotty output changed to be horizontal, and also
the acceptance sets are now numbers.

* doc/org/dstar2tgba.org, doc/org/ltl2tgba.org, doc/org/ltl2tgta.org,
doc/org/satmin.org: Adjust these four.
parent f8802003
......@@ -74,17 +74,18 @@ dstar2tgba -B fagfb
#+RESULTS:
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="1"]
1 -> 2 [label="a\n"]
1 -> 1 [label="!a\n"]
2 [label="2", peripheries=2]
2 -> 2 [label="b\n{Acc[1]}"]
2 -> 3 [label="!b\n{Acc[1]}"]
3 [label="3"]
3 -> 2 [label="b\n"]
3 -> 3 [label="!b\n"]
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="!a"]
0 -> 1 [label="a"]
1 [label="1", peripheries=2]
1 -> 1 [label="b"]
1 -> 2 [label="!b"]
2 [label="2"]
2 -> 1 [label="b"]
2 -> 2 [label="!b"]
}
#+end_example
......@@ -97,17 +98,18 @@ dstar2tgba -B fagfb | sed 's/\\/\\\\/'
#+RESULTS: fagfb2ba
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="1"]
1 -> 2 [label="a\\n"]
1 -> 1 [label="!a\\n"]
2 [label="2", peripheries=2]
2 -> 2 [label="b\\n{Acc[1]}"]
2 -> 3 [label="!b\\n{Acc[1]}"]
3 [label="3"]
3 -> 2 [label="b\\n"]
3 -> 3 [label="!b\\n"]
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="!a"]
0 -> 1 [label="a"]
1 [label="1", peripheries=2]
1 -> 1 [label="b"]
1 -> 2 [label="!b"]
2 [label="2"]
2 -> 1 [label="b"]
2 -> 2 [label="!b"]
}
#+end_example
......@@ -127,8 +129,8 @@ dstar2tgba -s fagfb
never {
T0_init:
if
:: ((a)) -> goto accept_S2
:: ((!(a))) -> goto T0_init
:: ((a)) -> goto accept_S2
fi;
accept_S2:
if
......@@ -199,15 +201,16 @@ dstar2tgba gfagfb
#+RESULTS:
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 1 [label="1"]
1 [label="1"]
1 -> 2 [label="1\n"]
2 [label="2"]
2 -> 2 [label="a & b\n{Acc[\"1\"], Acc[\"0\"]}"]
2 -> 2 [label="b & !a\n{Acc[\"1\"]}"]
2 -> 2 [label="a & !b\n{Acc[\"0\"]}"]
2 -> 2 [label="!a & !b\n"]
1 -> 1 [label="!a & !b"]
1 -> 1 [label="a & !b\n{0}"]
1 -> 1 [label="!a & b\n{1}"]
1 -> 1 [label="a & b\n{0,1}"]
}
#+end_example
......@@ -218,15 +221,16 @@ dstar2tgba gfagfb | sed 's/\\/\\\\/g'
#+RESULTS: gfagfb2ba
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 1 [label="1"]
1 [label="1"]
1 -> 2 [label="1\\n"]
2 [label="2"]
2 -> 2 [label="a & b\\n{Acc[\\"1\\"], Acc[\\"0\\"]}"]
2 -> 2 [label="b & !a\\n{Acc[\\"1\\"]}"]
2 -> 2 [label="a & !b\\n{Acc[\\"0\\"]}"]
2 -> 2 [label="!a & !b\\n"]
1 -> 1 [label="!a & !b"]
1 -> 1 [label="a & !b\\n{0}"]
1 -> 1 [label="!a & b\\n{1}"]
1 -> 1 [label="a & b\\n{0,1}"]
}
#+end_example
......@@ -293,25 +297,36 @@ dstar2tgba --help | sed -n '/Optimization level:/,/^$/p' | sed '1d;$d'
For instance using =-a --low= will skip any optional post-processing,
should you find =dstar2tgba= too slow.
Finally, the output format can be changed with the following options:
Finally, the output format can be changed with the following
[[file:oaout.org][common ouput options]]:
#+BEGIN_SRC sh :results verbatim :exports results
dstar2tgba --help | sed -n '/Output format:/,/^$/p' | sed '1d;$d'
#+END_SRC
#+RESULTS:
: -8, --utf8 enable UTF-8 characters in output (ignored with
: --lbtt or --spin)
: --dot GraphViz's format (default)
: --lbtt[=t] LBTT's format (add =t to force transition-based
: acceptance even on Büchi automata)
: -s, --spin Spin neverclaim (implies --ba)
: --spot SPOT's format
: --stats=FORMAT output statistics about the automaton
#+begin_example
-8, --utf8 enable UTF-8 characters in output (ignored with
--lbtt or --spin)
--dot[=c|h|n|N|s|t|v] GraphViz's format (default). Add letters to chose
(c) circular nodes, (h) horizontal layout, (v)
vertical layout, (n) with name, (N) without name,
(s) with SCCs, (t) always transition-based
acceptance.
-H, --hoaf[=s|t|m|l] Output the automaton in HOA format. Add letters
to select (s) state-based acceptance, (t)
transition-based acceptance, (m) mixed acceptance,
(l) single-line output
--lbtt[=t] LBTT's format (add =t to force transition-based
acceptance even on Büchi automata)
--name=FORMAT set the name of the output automaton
-s, --spin Spin neverclaim (implies --ba)
--spot SPOT's format
--stats=FORMAT output statistics about the automaton
#+end_example
The =--stats= options can output statistics about the input and the
output automaton, so it can be useful to search for particular
pattern.
For instance here is a complex command that will
1. generate an infinite stream of random LTL formulas with [[file:randltl.org][=randltl=]],
......@@ -333,7 +348,7 @@ output (Büchi) automaton, =%d=, whether the output automaton is
deterministic, and =%p= whether the automaton is complete.
#+BEGIN_SRC sh :results verbatim :exports both
randltl -n -1 --tree-size=10..15 a b c |
randltl -n -1 --tree-size=10..14 a b c |
ltlfilt --remove-wm -r -u --size-min=3 |
head -n 10 |
while read f; do
......@@ -346,26 +361,26 @@ done
#+RESULTS:
#+begin_example
F(a | !b)
DRA: 2st.; BA: 2st.; det.? 1; complete? 1
Fa | (Xc U (c & Xc))
DRA: 5st.; BA: 5st.; det.? 1; complete? 1
X(((!b & XGc) | (b & XF!c)) U (!a & ((!b & XGc) | (b & XF!c))))
DRA: 8st.; BA: 7st.; det.? 1; complete? 0
!b | !a
c U (c & (a | b | (Xc U (a & Xc))))
DRA: 3st.; BA: 2st.; det.? 1; complete? 0
F!a
DRA: 2st.; BA: 2st.; det.? 1; complete? 1
F(Ga R (b | Ga))
DRA: 10st.; BA: 10st.; det.? 0; complete? 0
!c U (!c & !a)
!b | F!c
DRA: 3st.; BA: 3st.; det.? 1; complete? 1
(!a R F!b) R !b
DRA: 6st.; BA: 5st.; det.? 1; complete? 0
b U !c
DRA: 3st.; BA: 2st.; det.? 1; complete? 0
!c | FGb
DRA: 4st.; BA: 5st.; det.? 0; complete? 0
G(c U a)
GFc
DRA: 3st.; BA: 3st.; det.? 1; complete? 1
(F!c U a) R !a
DRA: 6st.; BA: 5st.; det.? 1; complete? 0
b | G!b
DRA: 4st.; BA: 3st.; det.? 1; complete? 0
c & Gb
DRA: 3st.; BA: 2st.; det.? 1; complete? 0
!a R (!c & (!a | (F!b U (!a & F!b))))
DRA: 5st.; BA: 4st.; det.? 1; complete? 0
F(a & !b & G!c)
DRA: 2st.; BA: 3st.; det.? 0; complete? 0
GF!c
DRA: 3st.; BA: 3st.; det.? 1; complete? 1
#+end_example
An important point you should be aware of when comparing these numbers
......
......@@ -20,14 +20,15 @@ ltl2tgba -f 'Fa & GFb'
#+RESULTS:
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
rankdir=LR
I [label="", style=invis, width=0]
I -> 1
0 [label="0"]
0 -> 0 [label="b\n{0}"]
0 -> 0 [label="!b"]
1 [label="1"]
1 -> 1 [label="!a\n"]
1 -> 2 [label="a\n"]
2 [label="2"]
2 -> 2 [label="b\n{Acc[b]}"]
2 -> 2 [label="!b\n"]
1 -> 0 [label="a"]
1 -> 1 [label="!a"]
}
#+end_example
......@@ -54,14 +55,15 @@ ltl2tgba "Fa & GFb" | sed 's/\\/\\\\/'
#+RESULTS: dotex
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
rankdir=LR
I [label="", style=invis, width=0]
I -> 1
0 [label="0"]
0 -> 0 [label="b\\n{0}"]
0 -> 0 [label="!b"]
1 [label="1"]
1 -> 2 [label="a\\n"]
1 -> 1 [label="!a\\n"]
2 [label="2"]
2 -> 2 [label="b\\n{Acc[b]}"]
2 -> 2 [label="!b\\n"]
1 -> 0 [label="a"]
1 -> 1 [label="!a"]
}
#+end_example
......@@ -72,17 +74,17 @@ $txt
#+RESULTS:
[[file:dotex.png]]
The string between braces, =Acc[b]=, represents an acceptance set (its
actual name is not really important): any transition labeled by
=Acc[b]= belongs to the =Acc[b]= acceptance set. You may have many
transitions in the same acceptance set, and a transition may also
belong to multiple acceptance sets. An infinite path through this
automaton is accepting iff it visit each acceptance set infinitely
often. Therefore, in the above example, any accepted path will
/necessarily/ leave the initial state after a finite amount of steps,
and then it will verify the property =b= infinitely often. It is also
possible that an automaton do not use any acceptance set at all, in
which any run is accepting.
The string between braces, ={0}=, represents the sets of acceptance
sets a transition belongs to. In this case, there is only one
acceptance set, called =0=, containing a single transition. You may
have many transitions in the same acceptance set, and a transition may
also belong to multiple acceptance sets. An infinite path through
this automaton is accepting iff it visit each acceptance set
infinitely often. Therefore, in the above example, any accepted path
will /necessarily/ leave the initial state after a finite amount of
steps, and then it will verify the property =b= infinitely often. It
is also possible that an automaton do not use any acceptance set at
all, in which any run is accepting.
Here is a TGBA with multiple acceptance sets (we omit the call to
=dot= to render the output of =ltl2tgba= from now on):
......@@ -91,30 +93,36 @@ Here is a TGBA with multiple acceptance sets (we omit the call to
ltl2tgba 'GFa & GFb'
#+END_SRC
#+RESULTS:
: digraph G {
: 0 [label="", style=invis, height=0]
: 0 -> 1
: 1 [label="1"]
: 1 -> 1 [label="a & b\n{Acc[b], Acc[a]}"]
: 1 -> 1 [label="b & !a\n{Acc[b]}"]
: 1 -> 1 [label="a & !b\n{Acc[a]}"]
: 1 -> 1 [label="!b & !a\n"]
: }
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\n{0,1}"]
0 -> 0 [label="!a & !b"]
0 -> 0 [label="!a & b\n{1}"]
0 -> 0 [label="a & !b\n{0}"]
}
#+end_example
#+NAME: dotex2
#+BEGIN_SRC sh :results verbatim :exports none
ltl2tgba "GFa & GFb" | sed 's/\\/\\\\/'
#+END_SRC
#+RESULTS: dotex2
: digraph G {
: 0 [label="", style=invis, height=0]
: 0 -> 1
: 1 [label="1"]
: 1 -> 1 [label="a & b\\n{Acc[b], Acc[a]}"]
: 1 -> 1 [label="b & !a\\n{Acc[b]}"]
: 1 -> 1 [label="a & !b\\n{Acc[a]}"]
: 1 -> 1 [label="!b & !a\\n"]
: }
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\\n{0,1}"]
0 -> 0 [label="!a & !b"]
0 -> 0 [label="!a & b\\n{1}"]
0 -> 0 [label="a & !b\\n{0}"]
}
#+end_example
#+BEGIN_SRC dot :file dotex2.png :cmdline -Tpng :var txt=dotex2 :exports results
$txt
......@@ -122,9 +130,9 @@ $txt
#+RESULTS:
[[file:dotex2.png]]
The above TGBA has two acceptance sets: =Acc[a]= and =Acc[b]=.
The position of these acceptance sets ensures that =a= and =b= atomic
proposition must be true infinitely often.
The above TGBA has two acceptance sets: =0= and =1=. The position of
these acceptance sets ensures that atomic propositions =a= and =b= must
be true infinitely often.
A Büchi automaton for the previous formula can be obtained with the
=-B= option:
......@@ -135,19 +143,20 @@ ltl2tgba -B 'GFa & GFb'
#+RESULTS:
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0", peripheries=2]
1 -> 1 [label="a & b\n{Acc[1]}"]
1 -> 2 [label="b & !a\n{Acc[1]}"]
1 -> 3 [label="!b\n{Acc[1]}"]
2 [label="1"]
2 -> 1 [label="a\n"]
2 -> 2 [label="!a\n"]
3 [label="2"]
3 -> 1 [label="a & b\n"]
3 -> 2 [label="b & !a\n"]
3 -> 3 [label="!b\n"]
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 0 [label="a & b"]
0 -> 1 [label="!b"]
0 -> 2 [label="!a & b"]
1 [label="1"]
1 -> 0 [label="a & b"]
1 -> 1 [label="!b"]
1 -> 2 [label="!a & b"]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="!a"]
}
#+end_example
......@@ -158,19 +167,20 @@ ltl2tgba -B 'GFa & GFb' | sed 's/\\/\\\\/'
#+RESULTS: dotex2ba
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0", peripheries=2]
1 -> 1 [label="a & b\\n{Acc[1]}"]
1 -> 2 [label="b & !a\\n{Acc[1]}"]
1 -> 3 [label="!b\\n{Acc[1]}"]
2 [label="1"]
2 -> 1 [label="a\\n"]
2 -> 2 [label="!a\\n"]
3 [label="2"]
3 -> 1 [label="a & b\\n"]
3 -> 2 [label="b & !a\\n"]
3 -> 3 [label="!b\\n"]
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 0 [label="a & b"]
0 -> 1 [label="!b"]
0 -> 2 [label="!a & b"]
1 [label="1"]
1 -> 0 [label="a & b"]
1 -> 1 [label="!b"]
1 -> 2 [label="!a & b"]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="!a"]
}
#+end_example
......@@ -182,25 +192,93 @@ $txt
Although accepting states in the Büchi automaton are pictured with
double-lines, internally this automaton is still handled as a TGBA
with a single acceptance set =Acc[1]= such that the transitions
with a single acceptance set such that the transitions
leaving the state are either all accepting, or all non-accepting.
This is the reason why the =Acc[1]= sets are still shown in the
output: it shows that a Büchi automaton is (a special case of) a TGBA.
You can see this underlying TGBA if you pass the =--dot=t= option
(the =t= requests the use of transition-based acceptance at it
is done internally):
Various options controls the output format of =ltl2tgba=:
#+BEGIN_SRC sh :results verbatim :exports code
ltl2tgba --dot=t -B 'GFa & GFb'
#+END_SRC
#+RESULTS:
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\n{0}"]
0 -> 1 [label="!b\n{0}"]
0 -> 2 [label="!a & b\n{0}"]
1 [label="1"]
1 -> 0 [label="a & b"]
1 -> 1 [label="!b"]
1 -> 2 [label="!a & b"]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="!a"]
}
#+end_example
#+NAME: dotex2ba-t
#+BEGIN_SRC sh :results verbatim :exports none
ltl2tgba --dot=t -B 'GFa & GFb' | sed 's/\\/\\\\/'
#+END_SRC
#+RESULTS: dotex2ba-t
#+begin_example
digraph G {
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\\n{0}"]
0 -> 1 [label="!b\\n{0}"]
0 -> 2 [label="!a & b\\n{0}"]
1 [label="1"]
1 -> 0 [label="a & b"]
1 -> 1 [label="!b"]
1 -> 2 [label="!a & b"]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="!a"]
}
#+end_example
#+BEGIN_SRC dot :file dotex2ba-t.png :cmdline -Tpng :var txt=dotex2ba-t :exports results
$txt
#+END_SRC
#+RESULTS:
[[file:dotex2ba-t.png]]
As already discussed on the page about [[file:oaut.org][common output options]], various
options controls the output format of =ltl2tgba=:
#+BEGIN_SRC sh :results verbatim :exports results
ltl2tgba --help | sed -n '/Output format:/,/^$/p' | sed '1d;$d'
#+END_SRC
#+RESULTS:
: -8, --utf8 enable UTF-8 characters in output (ignored with
: --lbtt or --spin)
: --dot GraphViz's format (default)
: --lbtt LBTT's format
: -s, --spin Spin neverclaim (implies --ba)
: --spot SPOT's format
: --stats=FORMAT output statistics about the automaton
#+begin_example
-8, --utf8 enable UTF-8 characters in output (ignored with
--lbtt or --spin)
--dot[=c|h|n|N|s|t|v] GraphViz's format (default). Add letters to chose
(c) circular nodes, (h) horizontal layout, (v)
vertical layout, (n) with name, (N) without name,
(s) with SCCs, (t) always transition-based
acceptance.
-H, --hoaf[=s|t|m|l] Output the automaton in HOA format. Add letters
to select (s) state-based acceptance, (t)
transition-based acceptance, (m) mixed acceptance,
(l) single-line output
--lbtt[=t] LBTT's format (add =t to force transition-based
acceptance even on Büchi automata)
--name=FORMAT set the name of the output automaton
-q, --quiet suppress all normal output
-s, --spin Spin neverclaim (implies --ba)
--spot SPOT's format
--stats=FORMAT output statistics about the automaton
#+end_example
Option =-8= can be used to improve the readability of the output
if your system can display UTF-8 correctly.
......@@ -211,19 +289,20 @@ ltl2tgba -B8 'GFa & GFb'
#+RESULTS:
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0", peripheries=2]
1 -> 1 [label="a∧b\n{Acc[1]}"]
1 -> 2 [label="b∧a̅\n{Acc[1]}"]
1 -> 3 [label="b̅\n{Acc[1]}"]
2 [label="1"]
2 -> 1 [label="a\n"]
2 -> 2 [label="a̅\n"]
3 [label="2"]
3 -> 1 [label="a∧b\n"]
3 -> 2 [label="b∧a̅\n"]
3 -> 3 [label="b̅\n"]
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 0 [label="a∧b"]
0 -> 1 [label="b̅"]
0 -> 2 [label="a̅∧b"]
1 [label="1"]
1 -> 0 [label="a∧b"]
1 -> 1 [label="b̅"]
1 -> 2 [label="a̅∧b"]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="a̅"]
}
#+end_example
......@@ -234,19 +313,20 @@ ltl2tgba -B8 "GFa & GFb" | sed 's/\\/\\\\/'
#+RESULTS: dotex2ba8
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="0", peripheries=2]
1 -> 1 [label="a∧b\\n{Acc[1]}"]
1 -> 2 [label="b∧a̅\\n{Acc[1]}"]
1 -> 3 [label="b̅\\n{Acc[1]}"]
2 [label="1"]
2 -> 1 [label="a\\n"]
2 -> 2 [label="a̅\\n"]
3 [label="2"]
3 -> 1 [label="a∧b\\n"]
3 -> 2 [label="b∧a̅\\n"]
3 -> 3 [label="b̅\\n"]
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 0 [label="a∧b"]
0 -> 1 [label="b̅"]
0 -> 2 [label="a̅∧b"]
1 [label="1"]
1 -> 0 [label="a∧b"]
1 -> 1 [label="b̅"]
1 -> 2 [label="a̅∧b"]
2 [label="2"]
2 -> 0 [label="a"]
2 -> 2 [label="a̅"]
}
#+end_example
......@@ -272,19 +352,19 @@ never { /* G(Fa & Fb) */
accept_init:
if
:: ((a) && (b)) -> goto accept_init
:: ((b) && (!((a)))) -> goto T0_S2
:: ((!((b)))) -> goto T0_S3
:: ((!(b))) -> goto T0_S2
:: ((!(a)) && (b)) -> goto T0_S3
fi;
T0_S2:
if
:: ((a)) -> goto accept_init
:: ((!((a)))) -> goto T0_S2
:: ((a) && (b)) -> goto accept_init
:: ((!(b))) -> goto T0_S2
:: ((!(a)) && (b)) -> goto T0_S3
fi;
T0_S3:
if
:: ((a) && (b)) -> goto accept_init
:: ((b) && (!((a)))) -> goto T0_S2
:: ((!((b)))) -> goto T0_S3
:: ((a)) -> goto accept_init
:: ((!(a))) -> goto T0_S3
fi;
}
#+end_example
......@@ -348,18 +428,19 @@ ltl2tgba 'Ga|Gb|Gc'
#+RESULTS:
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="1"]
1 -> 2 [label="b\n"]
1 -> 3 [label="c\n"]
1 -> 4 [label="a\n"]
2 [label="2"]
2 -> 2 [label="b\n"]
3 [label="3"]
3 -> 3 [label="c\n"]
4 [label="4"]
4 -> 4 [label="a\n"]
rankdir=LR
I [label="", style=invis, width=0]
I -> 0
0 [label="0", peripheries=2]
0 -> 1 [label="a"]
0 -> 2 [label="b"]
0 -> 3 [label="c"]
1 [label="1", peripheries=2]
1 -> 1 [label="a"]
2 [label="2", peripheries=2]
2 -> 2 [label="b"]
3 [label="3", peripheries=2]
3 -> 3 [label="c"]
}
#+end_example
......@@ -370,18 +451,19 @@ ltl2tgba "Ga|Gb|Gc" | sed 's/\\/\\\\/'
#+RESULTS: gagbgc1
#+begin_example
digraph G {
0 [label="", style=invis, height=0]
0 -> 1
1 [label="1"]