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

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.
parent a8143343
Pipeline #21618 passed with stages
in 371 minutes and 52 seconds
......@@ -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;
};
/// @}
}
#!/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&#45;&gt;3 -->\n",
"<g id=\"edge1\" class=\"edge\">\n",
"<title>I&#45;&gt;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&#45;&gt;0 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>3&#45;&gt;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&#45;&gt;1 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>3&#45;&gt;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&#45;&gt;0 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>0&#45;&gt;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&#45;&gt;2 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>1&#45;&gt;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&#45;&gt;2 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>0&#45;&gt;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&#45;&gt;2 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>2&#45;&gt;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&#45;&gt;1 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>1&#45;&gt;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,
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment