postproc: add simul-max and wdba-det-max options
* NEWS, bin/spot-x.cc: Document them. * spot/twaalgos/postproc.cc, spot/twaalgos/postproc.hh: Implement them. * tests/python/stutter-inv.ipynb: Adjust result. * tests/core/minusx.test: Add test case.
This commit is contained in:
parent
a814334342
commit
69c821154c
6 changed files with 125 additions and 60 deletions
25
NEWS
25
NEWS
|
|
@ -79,6 +79,31 @@ New in spot 2.9.4.dev (not yet released)
|
||||||
- print_dot() will display states from player 1 using a diamond
|
- print_dot() will display states from player 1 using a diamond
|
||||||
shape.
|
shape.
|
||||||
|
|
||||||
|
- spot::postproc has two extra configuration variables that are meant
|
||||||
|
to speedup the processing of large automata.
|
||||||
|
|
||||||
|
simul-max Number of states above which simulation-based
|
||||||
|
reductions are skipped. Defaults to 512. Set to 0
|
||||||
|
to disable. This also applies to the
|
||||||
|
simulation-based optimization of the
|
||||||
|
determinization algorithm.
|
||||||
|
wdba-det-max Maximum number of additional states allowed in
|
||||||
|
intermediate steps of WDBA-minimization. If the
|
||||||
|
number of additional states reached in the
|
||||||
|
powerset construction or in the followup products
|
||||||
|
exceeds this value, WDBA-minimization is aborted.
|
||||||
|
Defaults to 4096. Set to 0 to disable. This limit
|
||||||
|
is ignored when -D used or when det-max-states is
|
||||||
|
set.
|
||||||
|
|
||||||
|
The reason for disabling simulation-based reduction above 512
|
||||||
|
states is that the current implementation uses one BDD variable
|
||||||
|
per state, and makes a number of BDD operations that is quadratic
|
||||||
|
in the number of states. Similarly, WDBA-mininimization is used
|
||||||
|
with --small in the off chance that it might produce a smaller
|
||||||
|
automaton, but we should not waste too much space and time trying
|
||||||
|
that.
|
||||||
|
|
||||||
Python:
|
Python:
|
||||||
|
|
||||||
- Bindings for functions related to parity games.
|
- Bindings for functions related to parity games.
|
||||||
|
|
|
||||||
|
|
@ -140,12 +140,16 @@ The default is 3, except when option --low is specified, in which case \
|
||||||
the default is 1.") },
|
the default is 1.") },
|
||||||
{ DOC("ba-simul", "Set to 0 to disable simulation-based reductions \
|
{ DOC("ba-simul", "Set to 0 to disable simulation-based reductions \
|
||||||
on automata where state-based acceptance must be preserved (e.g., \
|
on automata where state-based acceptance must be preserved (e.g., \
|
||||||
after degeneralization has been performed). The name suggests this applies \
|
after degeneralization has been performed). The name suggests this applies \
|
||||||
only to Büchi automata for historical reasons; it really applies to any \
|
only to Büchi automata for historical reasons; it really applies to any \
|
||||||
state-based acceptance nowadays. \
|
state-based acceptance nowadays. \
|
||||||
Set to 1 to use only direct simulation. Set to 2 to use only reverse \
|
Set to 1 to use only direct simulation. Set to 2 to use only reverse \
|
||||||
simulation. Set to 3 to iterate both direct and reverse simulations. \
|
simulation. Set to 3 to iterate both direct and reverse simulations. \
|
||||||
The default is 3 in --high mode, and 0 otherwise.") },
|
The default is 3 in --high mode, and 0 otherwise.") },
|
||||||
|
{ DOC("simul-max", "Number of states above which simulation-based \
|
||||||
|
reductions are skipped. Defaults to 512. Set to 0 to disable. This also \
|
||||||
|
applies to the simulation-based optimization of the determinization \
|
||||||
|
algorithm.") },
|
||||||
{ DOC("relabel-bool", "If set to a positive integer N, a formula \
|
{ DOC("relabel-bool", "If set to a positive integer N, a formula \
|
||||||
with N atomic propositions or more will have its Boolean subformulas \
|
with N atomic propositions or more will have its Boolean subformulas \
|
||||||
abstracted as atomic propositions during the translation to automaton. \
|
abstracted as atomic propositions during the translation to automaton. \
|
||||||
|
|
@ -156,6 +160,12 @@ this value to 0 will disable the rewriting.") },
|
||||||
always try it, or 2 to attempt it only on syntactic obligations or on automata \
|
always try it, or 2 to attempt it only on syntactic obligations or on automata \
|
||||||
that are weak and deterministic. The default is 1 in --high mode, else 2 in \
|
that are weak and deterministic. The default is 1 in --high mode, else 2 in \
|
||||||
--medium or --deterministic modes, else 0 in --low mode.") },
|
--medium or --deterministic modes, else 0 in --low mode.") },
|
||||||
|
{ DOC("wdba-det-max", "Maximum number of additional states allowed \
|
||||||
|
in intermediate steps of WDBA-minimization. If the number of additional \
|
||||||
|
states reached in the powerset construction or in the followup products \
|
||||||
|
exceeds this value, WDBA-minimization is aborted. \
|
||||||
|
Defaults to 4096. Set to 0 to disable. This limit is ignored when -D used \
|
||||||
|
or when det-max-states is set.") },
|
||||||
{ DOC("tba-det", "Set to 1 to attempt a powerset determinization \
|
{ DOC("tba-det", "Set to 1 to attempt a powerset determinization \
|
||||||
if the TGBA is not already deterministic. Doing so will degeneralize \
|
if the TGBA is not already deterministic. Doing so will degeneralize \
|
||||||
the automaton. This is disabled by default, unless sat-minimize is set.") },
|
the automaton. This is disabled by default, unless sat-minimize is set.") },
|
||||||
|
|
|
||||||
|
|
@ -85,6 +85,8 @@ namespace spot
|
||||||
state_based_ = opt->get("state-based", 0);
|
state_based_ = opt->get("state-based", 0);
|
||||||
wdba_minimize_ = opt->get("wdba-minimize", -1);
|
wdba_minimize_ = opt->get("wdba-minimize", -1);
|
||||||
gen_reduce_parity_ = opt->get("gen-reduce-parity", 1);
|
gen_reduce_parity_ = opt->get("gen-reduce-parity", 1);
|
||||||
|
simul_max_ = opt->get("simul-max", 512);
|
||||||
|
wdba_det_max_ = opt->get("wdba-det-max", 4096);
|
||||||
|
|
||||||
if (sat_acc_ && sat_minimize_ == 0)
|
if (sat_acc_ && sat_minimize_ == 0)
|
||||||
sat_minimize_ = 1; // Dicho.
|
sat_minimize_ = 1; // Dicho.
|
||||||
|
|
@ -110,6 +112,11 @@ namespace spot
|
||||||
twa_graph_ptr
|
twa_graph_ptr
|
||||||
postprocessor::do_simul(const twa_graph_ptr& a, int opt) const
|
postprocessor::do_simul(const twa_graph_ptr& a, int opt) const
|
||||||
{
|
{
|
||||||
|
if (simul_max_ > 0 && static_cast<unsigned>(simul_max_) < a->num_states())
|
||||||
|
return a;
|
||||||
|
|
||||||
|
// FIXME: simulation-based reduction how have work-arounds for
|
||||||
|
// non-separated sets, so we can probably try them.
|
||||||
if (!has_separate_sets(a))
|
if (!has_separate_sets(a))
|
||||||
return a;
|
return a;
|
||||||
switch (opt)
|
switch (opt)
|
||||||
|
|
@ -131,6 +138,8 @@ namespace spot
|
||||||
{
|
{
|
||||||
if (ba_simul_ <= 0)
|
if (ba_simul_ <= 0)
|
||||||
return a;
|
return a;
|
||||||
|
if (simul_max_ > 0 && static_cast<unsigned>(simul_max_) < a->num_states())
|
||||||
|
return a;
|
||||||
switch (opt)
|
switch (opt)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
|
@ -386,7 +395,16 @@ namespace spot
|
||||||
if (wdba_minimize)
|
if (wdba_minimize)
|
||||||
{
|
{
|
||||||
bool reject_bigger = (PREF_ == Small) && (level_ <= Medium);
|
bool reject_bigger = (PREF_ == Small) && (level_ <= Medium);
|
||||||
dba = minimize_obligation(a, f, nullptr, reject_bigger, aborter);
|
output_aborter* ab = aborter;
|
||||||
|
output_aborter wdba_aborter(wdba_det_max_ > 0 ?
|
||||||
|
(static_cast<unsigned>(wdba_det_max_)
|
||||||
|
+ a->num_states()) : -1U);
|
||||||
|
if (!ab && PREF_ != Deterministic)
|
||||||
|
ab = &wdba_aborter;
|
||||||
|
dba = minimize_obligation(a, f, nullptr, reject_bigger, ab);
|
||||||
|
if (!dba)
|
||||||
|
std::cerr << "DBA aborted\n";
|
||||||
|
|
||||||
if (dba
|
if (dba
|
||||||
&& dba->prop_inherently_weak().is_true()
|
&& dba->prop_inherently_weak().is_true()
|
||||||
&& dba->prop_universal().is_true())
|
&& dba->prop_universal().is_true())
|
||||||
|
|
@ -502,8 +520,13 @@ namespace spot
|
||||||
|
|
||||||
if ((PREF_ == Deterministic && (type_ == Generic || want_parity)) && !dba)
|
if ((PREF_ == Deterministic && (type_ == Generic || want_parity)) && !dba)
|
||||||
{
|
{
|
||||||
dba = tgba_determinize(to_generalized_buchi(sim),
|
bool det_simul = det_simul_;
|
||||||
false, det_scc_, det_simul_, det_stutter_,
|
auto tba = to_generalized_buchi(sim);
|
||||||
|
if (simul_max_ > 0
|
||||||
|
&& static_cast<unsigned>(simul_max_) < tba->num_states())
|
||||||
|
det_simul = false;
|
||||||
|
dba = tgba_determinize(tba,
|
||||||
|
false, det_scc_, det_simul, det_stutter_,
|
||||||
aborter);
|
aborter);
|
||||||
// Setting det-max-states or det-max-edges may cause tgba_determinize
|
// Setting det-max-states or det-max-edges may cause tgba_determinize
|
||||||
// to fail.
|
// to fail.
|
||||||
|
|
|
||||||
|
|
@ -254,6 +254,8 @@ namespace spot
|
||||||
int gen_reduce_parity_ = 1;
|
int gen_reduce_parity_ = 1;
|
||||||
bool state_based_ = false;
|
bool state_based_ = false;
|
||||||
int wdba_minimize_ = -1;
|
int wdba_minimize_ = -1;
|
||||||
|
int simul_max_ = 512;
|
||||||
|
int wdba_det_max_ = 4096;
|
||||||
};
|
};
|
||||||
/// @}
|
/// @}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Copyright (C) 2016 Laboratoire de Recherche et Développement de
|
# Copyright (C) 2016, 2020 Laboratoire de Recherche et Développement de
|
||||||
# l'Epita (LRDE).
|
# l'Epita (LRDE).
|
||||||
#
|
#
|
||||||
# This file is part of Spot, a model checking library.
|
# This file is part of Spot, a model checking library.
|
||||||
|
|
@ -34,3 +34,8 @@ grep -- "- 'bar'" error
|
||||||
ltl2tgba -f FGa | autfilt -D |
|
ltl2tgba -f FGa | autfilt -D |
|
||||||
autfilt --sat-minimize='acc="co-Buchi",other' 2>error && exit 1
|
autfilt --sat-minimize='acc="co-Buchi",other' 2>error && exit 1
|
||||||
grep "autfilt: option 'other' was not used" error
|
grep "autfilt: option 'other' was not used" error
|
||||||
|
|
||||||
|
# Make sure wdba-det-max has an effect
|
||||||
|
f='G(!p0 | (!p2 U (p1 | (!p2 & p3 & X(!p2 U p4)))) | G!p1)'
|
||||||
|
test 4,1 = `ltl2tgba --stats=%s,%d "$f"`
|
||||||
|
test 6,0 = `ltl2tgba -x wdba-det-max=4 --stats=%s,%d "$f"`
|
||||||
|
|
|
||||||
|
|
@ -302,7 +302,7 @@
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdf9af30> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad816be40> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -603,7 +603,7 @@
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdfa3f60> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad816be70> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -812,7 +812,7 @@
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdfa3f60> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad816be70> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -964,7 +964,7 @@
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdfa9210> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad8057690> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -1062,7 +1062,7 @@
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdf8e900> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad8253210> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -1272,7 +1272,7 @@
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdfa97b0> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad8057ea0> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -1401,7 +1401,7 @@
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdfaed20> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad8247a20> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -1452,87 +1452,87 @@
|
||||||
"<!-- Generated by graphviz version 2.43.0 (0)\n",
|
"<!-- Generated by graphviz version 2.43.0 (0)\n",
|
||||||
" -->\n",
|
" -->\n",
|
||||||
"<!-- Pages: 1 -->\n",
|
"<!-- Pages: 1 -->\n",
|
||||||
"<svg width=\"245pt\" height=\"170pt\"\n",
|
"<svg width=\"245pt\" height=\"203pt\"\n",
|
||||||
" viewBox=\"0.00 0.00 245.00 170.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
|
" viewBox=\"0.00 0.00 245.00 203.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
|
||||||
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1.0 1.0) rotate(0) translate(4 166)\">\n",
|
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1.0 1.0) rotate(0) translate(4 199)\">\n",
|
||||||
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-166 241,-166 241,4 -4,4\"/>\n",
|
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-199 241,-199 241,4 -4,4\"/>\n",
|
||||||
"<text text-anchor=\"start\" x=\"98\" y=\"-147.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
"<text text-anchor=\"start\" x=\"98\" y=\"-180.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</text>\n",
|
||||||
"<text text-anchor=\"start\" x=\"119\" y=\"-147.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
"<text text-anchor=\"start\" x=\"119\" y=\"-180.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
||||||
"<text text-anchor=\"start\" x=\"135\" y=\"-147.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
"<text text-anchor=\"start\" x=\"135\" y=\"-180.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
||||||
"<text text-anchor=\"start\" x=\"97\" y=\"-133.8\" font-family=\"Lato\" font-size=\"14.00\">[Büchi]</text>\n",
|
"<text text-anchor=\"start\" x=\"97\" y=\"-166.8\" font-family=\"Lato\" font-size=\"14.00\">[Büchi]</text>\n",
|
||||||
"<!-- I -->\n",
|
"<!-- I -->\n",
|
||||||
"<!-- 3 -->\n",
|
"<!-- 3 -->\n",
|
||||||
"<g id=\"node2\" class=\"node\">\n",
|
"<g id=\"node2\" class=\"node\">\n",
|
||||||
"<title>3</title>\n",
|
"<title>3</title>\n",
|
||||||
"<path fill=\"#ffffaa\" stroke=\"black\" d=\"M62,-64C62,-64 50,-64 50,-64 44,-64 38,-58 38,-52 38,-52 38,-40 38,-40 38,-34 44,-28 50,-28 50,-28 62,-28 62,-28 68,-28 74,-34 74,-40 74,-40 74,-52 74,-52 74,-58 68,-64 62,-64\"/>\n",
|
"<path fill=\"#ffffaa\" stroke=\"black\" d=\"M62,-81C62,-81 50,-81 50,-81 44,-81 38,-75 38,-69 38,-69 38,-57 38,-57 38,-51 44,-45 50,-45 50,-45 62,-45 62,-45 68,-45 74,-51 74,-57 74,-57 74,-69 74,-69 74,-75 68,-81 62,-81\"/>\n",
|
||||||
"<text text-anchor=\"middle\" x=\"56\" y=\"-42.3\" font-family=\"Lato\" font-size=\"14.00\">3</text>\n",
|
"<text text-anchor=\"middle\" x=\"56\" y=\"-59.3\" font-family=\"Lato\" font-size=\"14.00\">3</text>\n",
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- I->3 -->\n",
|
"<!-- I->3 -->\n",
|
||||||
"<g id=\"edge1\" class=\"edge\">\n",
|
"<g id=\"edge1\" class=\"edge\">\n",
|
||||||
"<title>I->3</title>\n",
|
"<title>I->3</title>\n",
|
||||||
"<path fill=\"none\" stroke=\"black\" d=\"M1.15,-46C2.79,-46 17.15,-46 30.63,-46\"/>\n",
|
"<path fill=\"none\" stroke=\"black\" d=\"M1.15,-63C2.79,-63 17.15,-63 30.63,-63\"/>\n",
|
||||||
"<polygon fill=\"black\" stroke=\"black\" points=\"37.94,-46 30.94,-49.15 34.44,-46 30.94,-46 30.94,-46 30.94,-46 34.44,-46 30.94,-42.85 37.94,-46 37.94,-46\"/>\n",
|
"<polygon fill=\"black\" stroke=\"black\" points=\"37.94,-63 30.94,-66.15 34.44,-63 30.94,-63 30.94,-63 30.94,-63 34.44,-63 30.94,-59.85 37.94,-63 37.94,-63\"/>\n",
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 0 -->\n",
|
"<!-- 0 -->\n",
|
||||||
"<g id=\"node3\" class=\"node\">\n",
|
"<g id=\"node3\" class=\"node\">\n",
|
||||||
"<title>0</title>\n",
|
"<title>0</title>\n",
|
||||||
"<path fill=\"#ffffaa\" stroke=\"#e31a1c\" stroke-width=\"2\" d=\"M146,-93C146,-93 134,-93 134,-93 128,-93 122,-87 122,-81 122,-81 122,-67 122,-67 122,-61 128,-55 134,-55 134,-55 146,-55 146,-55 152,-55 158,-61 158,-67 158,-67 158,-81 158,-81 158,-87 152,-93 146,-93\"/>\n",
|
"<path fill=\"#ffffaa\" stroke=\"#e31a1c\" stroke-width=\"2\" d=\"M146,-125C146,-125 134,-125 134,-125 128,-125 122,-119 122,-113 122,-113 122,-101 122,-101 122,-95 128,-89 134,-89 134,-89 146,-89 146,-89 152,-89 158,-95 158,-101 158,-101 158,-113 158,-113 158,-119 152,-125 146,-125\"/>\n",
|
||||||
"<text text-anchor=\"start\" x=\"135.5\" y=\"-77.8\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
"<text text-anchor=\"middle\" x=\"140\" y=\"-103.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
||||||
"<text text-anchor=\"start\" x=\"132\" y=\"-62.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 3->0 -->\n",
|
"<!-- 3->0 -->\n",
|
||||||
"<g id=\"edge5\" class=\"edge\">\n",
|
"<g id=\"edge5\" class=\"edge\">\n",
|
||||||
"<title>3->0</title>\n",
|
"<title>3->0</title>\n",
|
||||||
"<path fill=\"none\" stroke=\"black\" d=\"M74.39,-51.94C86.21,-55.97 102,-61.37 115.02,-65.81\"/>\n",
|
"<path fill=\"none\" stroke=\"black\" d=\"M74.39,-72.33C86.43,-78.79 102.59,-87.46 115.74,-94.52\"/>\n",
|
||||||
"<polygon fill=\"black\" stroke=\"black\" points=\"121.92,-68.17 114.27,-68.89 118.6,-67.04 115.29,-65.9 115.29,-65.9 115.29,-65.9 118.6,-67.04 116.31,-62.92 121.92,-68.17 121.92,-68.17\"/>\n",
|
"<polygon fill=\"black\" stroke=\"black\" points=\"121.92,-97.83 114.26,-97.3 118.83,-96.18 115.75,-94.52 115.75,-94.52 115.75,-94.52 118.83,-96.18 117.24,-91.75 121.92,-97.83 121.92,-97.83\"/>\n",
|
||||||
"<text text-anchor=\"start\" x=\"94\" y=\"-64.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
"<text text-anchor=\"start\" x=\"92\" y=\"-91.8\" font-family=\"Lato\" font-size=\"14.00\">!b</text>\n",
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 1 -->\n",
|
"<!-- 1 -->\n",
|
||||||
"<g id=\"node4\" class=\"node\">\n",
|
"<g id=\"node5\" class=\"node\">\n",
|
||||||
"<title>1</title>\n",
|
"<title>1</title>\n",
|
||||||
"<path fill=\"#ffffaa\" stroke=\"#e31a1c\" stroke-width=\"2\" d=\"M146,-37C146,-37 134,-37 134,-37 128,-37 122,-31 122,-25 122,-25 122,-13 122,-13 122,-7 128,-1 134,-1 134,-1 146,-1 146,-1 152,-1 158,-7 158,-13 158,-13 158,-25 158,-25 158,-31 152,-37 146,-37\"/>\n",
|
"<path fill=\"#ffffaa\" stroke=\"#e31a1c\" stroke-width=\"2\" d=\"M146,-38C146,-38 134,-38 134,-38 128,-38 122,-32 122,-26 122,-26 122,-12 122,-12 122,-6 128,0 134,0 134,0 146,0 146,0 152,0 158,-6 158,-12 158,-12 158,-26 158,-26 158,-32 152,-38 146,-38\"/>\n",
|
||||||
"<text text-anchor=\"middle\" x=\"140\" y=\"-15.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
"<text text-anchor=\"start\" x=\"135.5\" y=\"-22.8\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
||||||
|
"<text text-anchor=\"start\" x=\"132\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 3->1 -->\n",
|
"<!-- 3->1 -->\n",
|
||||||
"<g id=\"edge6\" class=\"edge\">\n",
|
"<g id=\"edge6\" class=\"edge\">\n",
|
||||||
"<title>3->1</title>\n",
|
"<title>3->1</title>\n",
|
||||||
"<path fill=\"none\" stroke=\"black\" d=\"M74.31,-38.64C79.9,-36.37 86.17,-33.97 92,-32 99.34,-29.53 107.44,-27.16 114.81,-25.14\"/>\n",
|
"<path fill=\"none\" stroke=\"black\" d=\"M74.39,-53.67C86.43,-47.21 102.59,-38.54 115.74,-31.48\"/>\n",
|
||||||
"<polygon fill=\"black\" stroke=\"black\" points=\"121.89,-23.24 115.95,-28.1 118.51,-24.15 115.13,-25.05 115.13,-25.05 115.13,-25.05 118.51,-24.15 114.32,-22.01 121.89,-23.24 121.89,-23.24\"/>\n",
|
"<polygon fill=\"black\" stroke=\"black\" points=\"121.92,-28.17 117.24,-34.25 118.83,-29.82 115.75,-31.48 115.75,-31.48 115.75,-31.48 118.83,-29.82 114.26,-28.7 121.92,-28.17 121.92,-28.17\"/>\n",
|
||||||
"<text text-anchor=\"start\" x=\"92\" y=\"-35.8\" font-family=\"Lato\" font-size=\"14.00\">!b</text>\n",
|
"<text text-anchor=\"start\" x=\"94\" y=\"-47.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
||||||
"</g>\n",
|
|
||||||
"<!-- 0->0 -->\n",
|
|
||||||
"<g id=\"edge2\" class=\"edge\">\n",
|
|
||||||
"<title>0->0</title>\n",
|
|
||||||
"<path fill=\"none\" stroke=\"black\" d=\"M133.09,-93.04C132.13,-102.53 134.43,-111 140,-111 144.09,-111 146.42,-106.43 146.99,-100.25\"/>\n",
|
|
||||||
"<polygon fill=\"black\" stroke=\"black\" points=\"146.91,-93.04 150.13,-100.01 146.95,-96.54 146.98,-100.04 146.98,-100.04 146.98,-100.04 146.95,-96.54 143.83,-100.07 146.91,-93.04 146.91,-93.04\"/>\n",
|
|
||||||
"<text text-anchor=\"start\" x=\"136\" y=\"-114.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 2 -->\n",
|
"<!-- 2 -->\n",
|
||||||
"<g id=\"node5\" class=\"node\">\n",
|
"<g id=\"node4\" class=\"node\">\n",
|
||||||
"<title>2</title>\n",
|
"<title>2</title>\n",
|
||||||
"<path fill=\"#ffffaa\" stroke=\"#e31a1c\" stroke-width=\"2\" d=\"M225,-38C225,-38 213,-38 213,-38 207,-38 201,-32 201,-26 201,-26 201,-12 201,-12 201,-6 207,0 213,0 213,0 225,0 225,0 231,0 237,-6 237,-12 237,-12 237,-26 237,-26 237,-32 231,-38 225,-38\"/>\n",
|
"<path fill=\"#ffffaa\" stroke=\"#e31a1c\" stroke-width=\"2\" d=\"M225,-126C225,-126 213,-126 213,-126 207,-126 201,-120 201,-114 201,-114 201,-100 201,-100 201,-94 207,-88 213,-88 213,-88 225,-88 225,-88 231,-88 237,-94 237,-100 237,-100 237,-114 237,-114 237,-120 231,-126 225,-126\"/>\n",
|
||||||
"<text text-anchor=\"start\" x=\"214.5\" y=\"-22.8\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
|
"<text text-anchor=\"start\" x=\"214.5\" y=\"-110.8\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
|
||||||
"<text text-anchor=\"start\" x=\"211\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
"<text text-anchor=\"start\" x=\"211\" y=\"-95.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 1->2 -->\n",
|
"<!-- 0->2 -->\n",
|
||||||
"<g id=\"edge3\" class=\"edge\">\n",
|
"<g id=\"edge2\" class=\"edge\">\n",
|
||||||
"<title>1->2</title>\n",
|
"<title>0->2</title>\n",
|
||||||
"<path fill=\"none\" stroke=\"black\" d=\"M158.09,-19C168.56,-19 182.12,-19 193.69,-19\"/>\n",
|
"<path fill=\"none\" stroke=\"black\" d=\"M158.09,-107C168.56,-107 182.12,-107 193.69,-107\"/>\n",
|
||||||
"<polygon fill=\"black\" stroke=\"black\" points=\"200.96,-19 193.96,-22.15 197.46,-19 193.96,-19 193.96,-19 193.96,-19 197.46,-19 193.96,-15.85 200.96,-19 200.96,-19\"/>\n",
|
"<polygon fill=\"black\" stroke=\"black\" points=\"200.96,-107 193.96,-110.15 197.46,-107 193.96,-107 193.96,-107 193.96,-107 197.46,-107 193.96,-103.85 200.96,-107 200.96,-107\"/>\n",
|
||||||
"<text text-anchor=\"start\" x=\"176\" y=\"-22.8\" font-family=\"Lato\" font-size=\"14.00\">a</text>\n",
|
"<text text-anchor=\"start\" x=\"176\" y=\"-110.8\" font-family=\"Lato\" font-size=\"14.00\">a</text>\n",
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 2->2 -->\n",
|
"<!-- 2->2 -->\n",
|
||||||
"<g id=\"edge4\" class=\"edge\">\n",
|
"<g id=\"edge4\" class=\"edge\">\n",
|
||||||
"<title>2->2</title>\n",
|
"<title>2->2</title>\n",
|
||||||
"<path fill=\"none\" stroke=\"black\" d=\"M212.09,-38.04C211.13,-47.53 213.43,-56 219,-56 223.09,-56 225.42,-51.43 225.99,-45.25\"/>\n",
|
"<path fill=\"none\" stroke=\"black\" d=\"M212.09,-126.04C211.13,-135.53 213.43,-144 219,-144 223.09,-144 225.42,-139.43 225.99,-133.25\"/>\n",
|
||||||
"<polygon fill=\"black\" stroke=\"black\" points=\"225.91,-38.04 229.13,-45.01 225.95,-41.54 225.98,-45.04 225.98,-45.04 225.98,-45.04 225.95,-41.54 222.83,-45.07 225.91,-38.04 225.91,-38.04\"/>\n",
|
"<polygon fill=\"black\" stroke=\"black\" points=\"225.91,-126.04 229.13,-133.01 225.95,-129.54 225.98,-133.04 225.98,-133.04 225.98,-133.04 225.95,-129.54 222.83,-133.07 225.91,-126.04 225.91,-126.04\"/>\n",
|
||||||
"<text text-anchor=\"middle\" x=\"219\" y=\"-59.8\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
"<text text-anchor=\"middle\" x=\"219\" y=\"-147.8\" font-family=\"Lato\" font-size=\"14.00\">1</text>\n",
|
||||||
|
"</g>\n",
|
||||||
|
"<!-- 1->1 -->\n",
|
||||||
|
"<g id=\"edge3\" class=\"edge\">\n",
|
||||||
|
"<title>1->1</title>\n",
|
||||||
|
"<path fill=\"none\" stroke=\"black\" d=\"M133.09,-38.04C132.13,-47.53 134.43,-56 140,-56 144.09,-56 146.42,-51.43 146.99,-45.25\"/>\n",
|
||||||
|
"<polygon fill=\"black\" stroke=\"black\" points=\"146.91,-38.04 150.13,-45.01 146.95,-41.54 146.98,-45.04 146.98,-45.04 146.98,-45.04 146.95,-41.54 143.83,-45.07 146.91,-38.04 146.91,-38.04\"/>\n",
|
||||||
|
"<text text-anchor=\"start\" x=\"136\" y=\"-59.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdf45d80> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad8057450> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -1792,7 +1792,7 @@
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdf457e0> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad816b390> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -2106,7 +2106,7 @@
|
||||||
"</svg>\n"
|
"</svg>\n"
|
||||||
],
|
],
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fb4fdf457e0> >"
|
"<spot.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7faad816b390> >"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
|
|
@ -2347,7 +2347,7 @@
|
||||||
"name": "python",
|
"name": "python",
|
||||||
"nbconvert_exporter": "python",
|
"nbconvert_exporter": "python",
|
||||||
"pygments_lexer": "ipython3",
|
"pygments_lexer": "ipython3",
|
||||||
"version": "3.8.2"
|
"version": "3.8.6rc1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nbformat": 4,
|
"nbformat": 4,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue