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
|
||||
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:
|
||||
|
||||
- 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.") },
|
||||
{ DOC("ba-simul", "Set to 0 to disable simulation-based reductions \
|
||||
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 \
|
||||
state-based acceptance nowadays. \
|
||||
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. \
|
||||
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 \
|
||||
with N atomic propositions or more will have its Boolean subformulas \
|
||||
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 \
|
||||
that are weak and deterministic. The default is 1 in --high mode, else 2 in \
|
||||
--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 \
|
||||
if the TGBA is not already deterministic. Doing so will degeneralize \
|
||||
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);
|
||||
wdba_minimize_ = opt->get("wdba-minimize", -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)
|
||||
sat_minimize_ = 1; // Dicho.
|
||||
|
|
@ -110,6 +112,11 @@ namespace spot
|
|||
twa_graph_ptr
|
||||
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))
|
||||
return a;
|
||||
switch (opt)
|
||||
|
|
@ -131,6 +138,8 @@ namespace spot
|
|||
{
|
||||
if (ba_simul_ <= 0)
|
||||
return a;
|
||||
if (simul_max_ > 0 && static_cast<unsigned>(simul_max_) < a->num_states())
|
||||
return a;
|
||||
switch (opt)
|
||||
{
|
||||
case 0:
|
||||
|
|
@ -386,7 +395,16 @@ namespace spot
|
|||
if (wdba_minimize)
|
||||
{
|
||||
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
|
||||
&& dba->prop_inherently_weak().is_true()
|
||||
&& dba->prop_universal().is_true())
|
||||
|
|
@ -502,8 +520,13 @@ namespace spot
|
|||
|
||||
if ((PREF_ == Deterministic && (type_ == Generic || want_parity)) && !dba)
|
||||
{
|
||||
dba = tgba_determinize(to_generalized_buchi(sim),
|
||||
false, det_scc_, det_simul_, det_stutter_,
|
||||
bool det_simul = det_simul_;
|
||||
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);
|
||||
// Setting det-max-states or det-max-edges may cause tgba_determinize
|
||||
// to fail.
|
||||
|
|
|
|||
|
|
@ -254,6 +254,8 @@ namespace spot
|
|||
int gen_reduce_parity_ = 1;
|
||||
bool state_based_ = false;
|
||||
int wdba_minimize_ = -1;
|
||||
int simul_max_ = 512;
|
||||
int wdba_det_max_ = 4096;
|
||||
};
|
||||
/// @}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/sh
|
||||
# -*- 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).
|
||||
#
|
||||
# This file is part of Spot, a model checking library.
|
||||
|
|
@ -34,3 +34,8 @@ grep -- "- 'bar'" error
|
|||
ltl2tgba -f FGa | autfilt -D |
|
||||
autfilt --sat-minimize='acc="co-Buchi",other' 2>error && exit 1
|
||||
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"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -603,7 +603,7 @@
|
|||
"</svg>\n"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -812,7 +812,7 @@
|
|||
"</svg>\n"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -964,7 +964,7 @@
|
|||
"</svg>\n"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -1062,7 +1062,7 @@
|
|||
"</svg>\n"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -1272,7 +1272,7 @@
|
|||
"</svg>\n"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -1401,7 +1401,7 @@
|
|||
"</svg>\n"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -1452,87 +1452,87 @@
|
|||
"<!-- Generated by graphviz version 2.43.0 (0)\n",
|
||||
" -->\n",
|
||||
"<!-- Pages: 1 -->\n",
|
||||
"<svg width=\"245pt\" height=\"170pt\"\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",
|
||||
"<g id=\"graph0\" class=\"graph\" transform=\"scale(1.0 1.0) rotate(0) translate(4 166)\">\n",
|
||||
"<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-166 241,-166 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=\"119\" y=\"-147.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=\"97\" y=\"-133.8\" font-family=\"Lato\" font-size=\"14.00\">[Büchi]</text>\n",
|
||||
"<svg width=\"245pt\" height=\"203pt\"\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 199)\">\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=\"-180.8\" font-family=\"Lato\" font-size=\"14.00\">Inf(</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=\"-180.8\" font-family=\"Lato\" font-size=\"14.00\">)</text>\n",
|
||||
"<text text-anchor=\"start\" x=\"97\" y=\"-166.8\" font-family=\"Lato\" font-size=\"14.00\">[Büchi]</text>\n",
|
||||
"<!-- I -->\n",
|
||||
"<!-- 3 -->\n",
|
||||
"<g id=\"node2\" class=\"node\">\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",
|
||||
"<text text-anchor=\"middle\" x=\"56\" y=\"-42.3\" font-family=\"Lato\" font-size=\"14.00\">3</text>\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=\"-59.3\" font-family=\"Lato\" font-size=\"14.00\">3</text>\n",
|
||||
"</g>\n",
|
||||
"<!-- I->3 -->\n",
|
||||
"<g id=\"edge1\" class=\"edge\">\n",
|
||||
"<title>I->3</title>\n",
|
||||
"<path fill=\"none\" stroke=\"black\" d=\"M1.15,-46C2.79,-46 17.15,-46 30.63,-46\"/>\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",
|
||||
"<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,-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",
|
||||
"<!-- 0 -->\n",
|
||||
"<g id=\"node3\" class=\"node\">\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",
|
||||
"<text text-anchor=\"start\" x=\"135.5\" y=\"-77.8\" 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",
|
||||
"<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=\"middle\" x=\"140\" y=\"-103.3\" font-family=\"Lato\" font-size=\"14.00\">0</text>\n",
|
||||
"</g>\n",
|
||||
"<!-- 3->0 -->\n",
|
||||
"<g id=\"edge5\" class=\"edge\">\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",
|
||||
"<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",
|
||||
"<text text-anchor=\"start\" x=\"94\" y=\"-64.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\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,-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=\"92\" y=\"-91.8\" font-family=\"Lato\" font-size=\"14.00\">!b</text>\n",
|
||||
"</g>\n",
|
||||
"<!-- 1 -->\n",
|
||||
"<g id=\"node4\" class=\"node\">\n",
|
||||
"<g id=\"node5\" class=\"node\">\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",
|
||||
"<text text-anchor=\"middle\" x=\"140\" y=\"-15.3\" font-family=\"Lato\" font-size=\"14.00\">1</text>\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=\"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",
|
||||
"<!-- 3->1 -->\n",
|
||||
"<g id=\"edge6\" class=\"edge\">\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",
|
||||
"<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",
|
||||
"<text text-anchor=\"start\" x=\"92\" y=\"-35.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",
|
||||
"<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.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=\"94\" y=\"-47.8\" font-family=\"Lato\" font-size=\"14.00\">b</text>\n",
|
||||
"</g>\n",
|
||||
"<!-- 2 -->\n",
|
||||
"<g id=\"node5\" class=\"node\">\n",
|
||||
"<g id=\"node4\" class=\"node\">\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",
|
||||
"<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=\"211\" y=\"-7.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\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=\"-110.8\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
|
||||
"<text text-anchor=\"start\" x=\"211\" y=\"-95.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
|
||||
"</g>\n",
|
||||
"<!-- 1->2 -->\n",
|
||||
"<g id=\"edge3\" class=\"edge\">\n",
|
||||
"<title>1->2</title>\n",
|
||||
"<path fill=\"none\" stroke=\"black\" d=\"M158.09,-19C168.56,-19 182.12,-19 193.69,-19\"/>\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",
|
||||
"<text text-anchor=\"start\" x=\"176\" y=\"-22.8\" font-family=\"Lato\" font-size=\"14.00\">a</text>\n",
|
||||
"<!-- 0->2 -->\n",
|
||||
"<g id=\"edge2\" class=\"edge\">\n",
|
||||
"<title>0->2</title>\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,-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=\"-110.8\" font-family=\"Lato\" font-size=\"14.00\">a</text>\n",
|
||||
"</g>\n",
|
||||
"<!-- 2->2 -->\n",
|
||||
"<g id=\"edge4\" class=\"edge\">\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",
|
||||
"<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",
|
||||
"<text text-anchor=\"middle\" x=\"219\" y=\"-59.8\" font-family=\"Lato\" font-size=\"14.00\">1</text>\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,-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=\"-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",
|
||||
"</svg>\n"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -1792,7 +1792,7 @@
|
|||
"</svg>\n"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -2106,7 +2106,7 @@
|
|||
"</svg>\n"
|
||||
],
|
||||
"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": {},
|
||||
|
|
@ -2347,7 +2347,7 @@
|
|||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.2"
|
||||
"version": "3.8.6rc1"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue