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

dot: use tooltips with option "1"

Fixes #327.

* spot/twaalgos/dot.cc: Emit a tooltip="..." for state names and
labels that are disabled by option "1".
* doc/org/tut51.org, tests/python/product.ipynb, NEWS: Discuss this.
* tests/core/readsave.test, tests/python/alternation.ipynb,
tests/python/automata.ipynb: Adjust test cases.
parent 99876048
......@@ -14,6 +14,12 @@ New in spot 2.5.2.dev (not yet released)
the command-line tools, as well as the various way to display
automata using the Python bindings.
- When option "1" is passed to print_dot() to hide state names
and force the display of state numbers, the actual state names
is now moved to the "tooltip" field of the state. The SVG
files produced by "dot -Tsvg" will show those as popups.
This is also done for state labels of kripke structures.
- cleanup_parity() and cleanup_parity_here() are smarter and now
remove from the acceptance condition the parity colors that are
not used in the automaton.
......
......@@ -469,13 +469,15 @@ counterexample:
With a small variant of the above code, we could also display the
counterexample on the state space, but only because our state space is
so small: displaying large state spaces is not sensible. Besides, highlighting
a run only works on =twa_graph= automata, so we need to convert the
Kripke structure to a =twa_graph=: this can be done with =make_twa_graph()=. But
now =k= is no longer a Kripke structure (also not generated
on-the-fly anymore), so the =print_dot()= function will display it as
a classical automaton with conditions on edges rather than state:
passing the option "~k~" to =print_dot()= will fix that.
so small: displaying large state spaces is not sensible. Besides,
highlighting a run only works on =twa_graph= automata, so we need to
convert the Kripke structure to a =twa_graph=: this can be done with
=make_twa_graph()=. But now =k= is no longer a Kripke structure (also
not generated on-the-fly anymore), so the =print_dot()= function will
display it as a classical automaton with conditions on edges rather
than state: passing the option "~k~" to =print_dot()= will fix that.
We also pass option "~A~" to hide the acceptance condition (which is
=t=, i.e., accepting every infinite run).
#+NAME: demo-3-aux
#+BEGIN_SRC C++ :exports none :noweb strip-export
......@@ -515,7 +517,7 @@ passing the option "~k~" to =print_dot()= will fix that.
if (auto run = k->intersecting_run(af))
{
run->highlight(5); // 5 is a color number.
spot::print_dot(std::cout, k, ".k");
spot::print_dot(std::cout, k, ".kA");
}
}
#+END_SRC
......@@ -527,6 +529,58 @@ $txt
#+RESULTS:
[[file:kripke-3.svg]]
Note that labeling states with names (the first line) and the
valuation of all atomic propositions (the second line) will quickly
produce graphs with large nodes that are problematic to render. A
trick to reduce the clutter and the size of the graph is to pass
option "~1~" to =print_dot()=, changing the above call to
src_cpp[:exports code]{spot::print_dot(std::cout, k, ".kA1");}. This
will cause all states to be numbered instead, but if the automaton is
rendered as an SVG figure, the old label will still appear as a
tooltip when the mouse is over a state. Try that on the following
figure:
#+NAME: demo-3b
#+BEGIN_SRC C++ :exports none :noweb strip-export :results verbatim
#include <spot/twaalgos/dot.hh>
#include <spot/tl/parse.hh>
#include <spot/twaalgos/translate.hh>
#include <spot/twa/twaproduct.hh>
#include <spot/twaalgos/emptiness.hh>
<<demo-3-aux>>
int main()
{
auto d = spot::make_bdd_dict();
// Parse the input formula.
spot::parsed_formula pf = spot::parse_infix_psl("GF(odd_x) -> GF(odd_y)");
if (pf.format_errors(std::cerr))
return 1;
// Translate its negation.
spot::formula f = spot::formula::Not(pf.f);
spot::twa_graph_ptr af = spot::translator(d).run(f);
// Convert demo_kripke into an explicit graph
spot::twa_graph_ptr k =
spot::make_twa_graph(std::make_shared<demo_kripke>(d),
spot::twa::prop_set::all(), true);
// Find a run of or demo_kripke that intersects af.
if (auto run = k->intersecting_run(af))
{
run->highlight(5); // 5 is a color number.
spot::print_dot(std::cout, k, ".kA1");
}
}
#+END_SRC
#+BEGIN_SRC dot :file kripke-3b.svg :cmd circo :var txt=demo-3b :exports results
$txt
#+END_SRC
#+RESULTS:
[[file:kripke-3b.svg]]
* Possible improvements
The on-the-fly interface, especially as implemented here, involves a
......
......@@ -112,7 +112,7 @@ namespace spot
std::string opt_font_;
std::string opt_node_color_;
std::ostream& os_;
bool opt_want_state_names_ = true;
bool inline_state_names_ = true;
unsigned max_states_ = -1U; // related to max_states_given_
bool opt_shared_univ_dest_ = true;
......@@ -189,7 +189,7 @@ namespace spot
opt_numbered_edges_ = true;
break;
case '1':
opt_want_state_names_ = false;
inline_state_names_ = false;
break;
case 'a':
opt_show_acc_ = true;
......@@ -576,19 +576,39 @@ namespace spot
os_ << '}' << std::endl;
}
void
process_state(unsigned s)
bool print_state_name(std::ostream& os, unsigned s,
bool force_text = false) const
{
os_ << " " << s << " [" << label_pre_;
if (sn_ && s < sn_->size() && !(*sn_)[s].empty())
escape_for_output(os_, (*sn_)[s]);
{
if (force_text)
escape_str(os, (*sn_)[s]);
else
escape_for_output(os, (*sn_)[s]);
}
else if (sprod_)
os_ << (*sprod_)[s].first << ',' << (*sprod_)[s].second;
{
os << (*sprod_)[s].first << ',' << (*sprod_)[s].second;
}
else
{
return false;
}
return true;
}
void
process_state(unsigned s)
{
os_ << " " << s << " [" << label_pre_;
if (!(inline_state_names_ && print_state_name(os_, s)))
os_ << s;
if (orig_ && s < orig_->size())
os_ << " (" << (*orig_)[s] << ')';
bool include_state_labels =
opt_state_labels_ && (inline_state_names_ || opt_latex_);
if (mark_states_ && !dcircles_)
{
acc_cond::mark_t acc = {};
......@@ -603,13 +623,13 @@ namespace spot
os_ << nl_;
output_mark(acc);
}
if (opt_state_labels_)
if (include_state_labels)
format_state_label(os_ << nl_, s);
os_ << label_post_;
}
else
{
if (opt_state_labels_)
if (include_state_labels)
format_state_label(os_ << nl_, s);
os_ << label_post_;
// Use state_acc_sets(), not state_is_accepting() because
......@@ -630,6 +650,21 @@ namespace spot
<< '"';
}
}
if (!inline_state_names_ && (sn_ || sprod_ || opt_state_labels_)
&& !opt_latex_)
{
std::ostringstream os;
bool nonempty = print_state_name(os, s, true);
if (opt_state_labels_)
{
if (nonempty)
os << '\n';
format_state_label(os, s);
nonempty = true;
}
if (nonempty)
os_ << ", tooltip=\"" << os.str() << '"';
}
os_ << "]\n";
if (incomplete_ && incomplete_->find(s) != incomplete_->end())
os_ << " u" << s << " [label=\"...\", shape=none, width=0, height=0"
......@@ -707,19 +742,18 @@ namespace spot
void print(const const_twa_graph_ptr& aut)
{
aut_ = aut;
if (opt_want_state_names_)
sn_ = aut->get_named_prop<std::vector<std::string>>("state-names");
// We have no names. Do we have product sources?
if (!sn_)
{
sn_ = aut->get_named_prop<std::vector<std::string>>("state-names");
// We have no names. Do we have product sources?
if (!sn_)
{
sprod_ = aut->get_named_prop
<std::vector<std::pair<unsigned, unsigned>>>
("product-states");
if (sprod_ && aut->num_states() != sprod_->size())
sprod_ = nullptr;
}
sprod_ = aut->get_named_prop
<std::vector<std::pair<unsigned, unsigned>>>
("product-states");
if (sprod_ && aut->num_states() != sprod_->size())
sprod_ = nullptr;
}
if (opt_orig_show_)
orig_ = aut->get_named_prop<std::vector<unsigned>>("original-states");
if (opt_state_labels_)
......@@ -758,8 +792,10 @@ namespace spot
&& (aut_->acc().is_buchi() || aut_->acc().is_co_buchi()));
if (opt_shape_ == ShapeAuto)
{
if (sn_ || sprod_ || aut->num_states() > 100
|| opt_state_labels_ || orig_)
if ((inline_state_names_ && (sn_ || sprod_ || opt_state_labels_))
|| (opt_state_labels_ && opt_latex_)
|| aut->num_states() > 100
|| orig_)
{
opt_shape_ = ShapeEllipse;
// If all state names are short, prefer circles.
......
......@@ -529,10 +529,10 @@ digraph G {
node [shape="circle"]
I [label="", style=invis, width=0]
0 [label="0"]
1 [label="1\n⓿❸"]
1 [label="1\n⓿❸", tooltip="test me"]
2 [label="2\n⓿❷❸"]
3 [label="3\n❸"]
4 [label="4\n❷❸"]
4 [label="4\n❷❸", tooltip="hihi"]
5 [label="5\n❶❸"]
6 [label="6\n⓿"]
7 [label="7\n⓿❷"]
......
This diff is collapsed.
......@@ -17,11 +17,11 @@
"source": [
"To build an automaton, simply call `translate()` with a formula, and a list of options to characterize the automaton you want (those options have the same name as the long options name of the `ltl2tgba` tool, and they can be abbreviated)."
]
},
{
 
 
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
......@@ -73,22 +73,22 @@
"<text text-anchor=\"start\" x=\"108\" y=\"-95.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">b</text>\n",
"</g>\n",
"<!-- 4 -->\n",
"<g id=\"node4\" class=\"node\">\n",
"<title>4</title>\n",
 
 
"<text text-anchor=\"middle\" x=\"173\" y=\"-14.3\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">4</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;4 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>0&#45;&gt;4</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M73.0128,-56.4566C93.1156,-48.7248 126.6847,-35.8136 149.32,-27.1077\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"155.9667,-24.5513 150.564,-30.0042 152.6999,-25.8077 149.4332,-27.0642 149.4332,-27.0642 149.4332,-27.0642 152.6999,-25.8077 148.3024,-24.1242 155.9667,-24.5513 155.9667,-24.5513\"/>\n",
"<text text-anchor=\"start\" x=\"92\" y=\"-51.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!a &amp; !b</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
 
 
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M162.9332,-128.7575C161.2225,-139.3499 164.5781,-149 173,-149 179.448,-149 182.9262,-143.3433 183.4347,-135.9379\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"183.0668,-128.7575 186.571,-135.5871 183.2459,-132.2529 183.4251,-135.7483 183.4251,-135.7483 183.4251,-135.7483 183.2459,-132.2529 180.2792,-135.9095 183.0668,-128.7575 183.0668,-128.7575\"/>\n",
"<text text-anchor=\"start\" x=\"156\" y=\"-152.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">c &amp; d</text>\n",
"</g>\n",
......@@ -99,11 +99,11 @@
"<text text-anchor=\"middle\" x=\"283.5\" y=\"-139.3\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">2</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;2 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>1&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M188.2292,-125.0657C195.139,-131.2494 203.8158,-137.6313 213,-141 227.3552,-146.2653 244.4805,-146.8697 258.2579,-146.1075\"/>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M188.2292,-125.0657C195.139,-131.2494 203.8158,-137.6313 213,-141 227.3552,-146.2653 244.4805,-146.8697 258.2579,-146.1075\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"265.5286,-145.5644 258.7828,-149.2272 262.0383,-145.8252 258.5481,-146.0859 258.5481,-146.0859 258.5481,-146.0859 262.0383,-145.8252 258.3134,-142.9447 265.5286,-145.5644 265.5286,-145.5644\"/>\n",
"<text text-anchor=\"start\" x=\"223.5\" y=\"-149.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!d</text>\n",
"</g>\n",
"<!-- 3 -->\n",
"<g id=\"node6\" class=\"node\">\n",
......@@ -151,11 +151,11 @@
"<title>3&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M375.5284,-87.3769C350.8107,-81.4822 304.2663,-72.7596 265,-79 242.5895,-82.5616 218.2163,-90.7163 200.1902,-97.6258\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"193.3666,-100.2979 198.736,-94.8123 196.6256,-99.0217 199.8847,-97.7454 199.8847,-97.7454 199.8847,-97.7454 196.6256,-99.0217 201.0333,-100.6785 193.3666,-100.2979 193.3666,-100.2979\"/>\n",
"<text text-anchor=\"start\" x=\"280\" y=\"-82.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">c</text>\n",
"</g>\n",
 
 
"<g id=\"edge12\" class=\"edge\">\n",
"<title>3&#45;&gt;3</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M383.7674,-107.5414C381.1685,-117.9087 384.2461,-128 393,-128 399.7022,-128 403.077,-122.0847 403.1245,-114.6591\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"402.2326,-107.5414 406.2286,-114.0955 402.6678,-111.0143 403.103,-114.4871 403.103,-114.4871 403.103,-114.4871 402.6678,-111.0143 399.9775,-114.8788 402.2326,-107.5414 402.2326,-107.5414\"/>\n",
"<text text-anchor=\"start\" x=\"387.5\" y=\"-131.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!c</text>\n",
......@@ -166,11 +166,11 @@
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f76ec2fef30> >"
]
},
"execution_count": 2,
 
 
"output_type": "execute_result"
}
],
"source": [
"a = spot.translate('(a U b) & GFc & GFd', 'BA', 'complete'); a"
......@@ -181,11 +181,11 @@
"metadata": {},
"source": [
"The call the `spot.setup()` in the first cells has installed a default style for the graphviz output. If you want to change this style temporarily, you can call the `show(style)` method explicitely. For instance here is a vertical layout with the default font of GraphViz."
]
},
 
 
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
......@@ -196,22 +196,22 @@
"<title>G</title>\n",
"<polygon fill=\"#ffffff\" points=\"-4,4 -4,-386 233,-386 233,4 -4,4\" stroke=\"transparent\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"114.5\" y=\"-350.8\">[Büchi]</text>\n",
"<!-- I -->\n",
"<!-- 0 -->\n",
 
 
"<title>0</title>\n",
"<ellipse cx=\"131\" cy=\"-287\" fill=\"none\" rx=\"18\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"131\" y=\"-283.3\">0</text>\n",
"</g>\n",
"<!-- I&#45;&gt;0 -->\n",
"<g class=\"edge\" id=\"edge1\">\n",
"<title>I-&gt;0</title>\n",
"<path d=\"M131,-341.8767C131,-338.822 131,-325.0552 131,-312.0759\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"131,-305.0193 134.1501,-312.0192 131,-308.5193 131.0001,-312.0193 131.0001,-312.0193 131.0001,-312.0193 131,-308.5193 127.8501,-312.0193 131,-305.0193 131,-305.0193\" stroke=\"#000000\"/>\n",
"</g>\n",
 
 
"<g class=\"edge\" id=\"edge2\">\n",
"<title>0-&gt;0</title>\n",
"<path d=\"M148.0373,-293.3792C157.8579,-294.6811 167,-292.5547 167,-287 167,-282.834 161.8576,-280.5964 155.1433,-280.2872\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"148.0373,-280.6208 154.8818,-277.1459 151.5335,-280.4566 155.0296,-280.2924 155.0296,-280.2924 155.0296,-280.2924 151.5335,-280.4566 155.1774,-283.439 148.0373,-280.6208 148.0373,-280.6208\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"185.5\" y=\"-283.3\">a &amp; !b</text>\n",
......@@ -290,22 +290,22 @@
"<polygon fill=\"#000000\" points=\"65.8581,-177.5848 59.375,-173.4747 63.9315,-174.6628 62.0049,-171.7407 62.0049,-171.7407 62.0049,-171.7407 63.9315,-174.6628 64.6347,-170.0068 65.8581,-177.5848 65.8581,-177.5848\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"68\" y=\"-144.8\">c &amp; d</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;2 -->\n",
"<g class=\"edge\" id=\"edge9\">\n",
 
 
"<path d=\"M34.6641,-112.3828C44.625,-114.0234 54,-111.5625 54,-105 54,-100.0781 48.7266,-97.4634 41.8876,-97.1558\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"34.6641,-97.6172 41.449,-94.0273 38.1569,-97.394 41.6498,-97.1709 41.6498,-97.1709 41.6498,-97.1709 38.1569,-97.394 41.8507,-100.3145 34.6641,-97.6172 34.6641,-97.6172\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"60\" y=\"-101.3\">!d</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;3 -->\n",
"<g class=\"edge\" id=\"edge10\">\n",
"<title>2-&gt;3</title>\n",
"<path d=\"M26.4061,-88.7063C32.3724,-78.0914 41.0649,-64.3444 51,-54 59.4985,-45.1514 70.4535,-37.089 80.0307,-30.8478\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"86.0856,-27.0195 81.8524,-33.4228 83.1273,-28.8899 80.169,-30.7604 80.169,-30.7604 80.169,-30.7604 83.1273,-28.8899 78.4856,-28.0979 86.0856,-27.0195 86.0856,-27.0195\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"69.5\" y=\"-57.8\">!c &amp; d</text>\n",
 
 
"<!-- 3&#45;&gt;1 -->\n",
"<g class=\"edge\" id=\"edge11\">\n",
"<title>3-&gt;1</title>\n",
"<path d=\"M113.2113,-32.3093C127.6447,-52.5584 149.568,-90.7074 138,-123 130.4785,-143.9967 114.0239,-163.2804 100.2457,-176.7489\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"94.9274,-181.7954 97.837,-174.692 97.4663,-179.3862 100.0052,-176.977 100.0052,-176.977 100.0052,-176.977 97.4663,-179.3862 102.1735,-179.2621 94.9274,-181.7954 94.9274,-181.7954\" stroke=\"#000000\"/>\n",
......@@ -328,11 +328,11 @@
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
 
"a.show(\"v\")"
]
},
{
"cell_type": "markdown",
......@@ -358,11 +358,11 @@
"<text fill=\"#000000\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"264.5\" y=\"-332.8\">)</text>\n",
"<text fill=\"#000000\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"224.5\" y=\"-318.8\">[Büchi]</text>\n",
"<g class=\"cluster\" id=\"clust1\">\n",
"<title>cluster_0</title>\n",
"<polygon fill=\"none\" points=\"143,-101 143,-303 487,-303 487,-101 143,-101\" stroke=\"#00ff00\"/>\n",
 
 
"<g class=\"cluster\" id=\"clust2\">\n",
"<title>cluster_1</title>\n",
"<polygon fill=\"none\" points=\"143,-8 143,-93 195,-93 195,-8 143,-8\" stroke=\"#c0c0c0\"/>\n",
"</g>\n",
"<g class=\"cluster\" id=\"clust3\">\n",
......@@ -373,11 +373,11 @@
"<!-- 0 -->\n",
"<g class=\"node\" id=\"node2\">\n",
"<title>0</title>\n",
"<ellipse cx=\"56\" cy=\"-53\" fill=\"#ffffaa\" rx=\"18\" ry=\"18\" stroke=\"#000000\"/>\n",
"<text fill=\"#000000\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"56\" y=\"-49.3\">0</text>\n",
 
 
"<!-- I&#45;&gt;0 -->\n",
"<g class=\"edge\" id=\"edge1\">\n",
"<title>I-&gt;0</title>\n",
"<path d=\"M1.1233,-53C4.178,-53 17.9448,-53 30.9241,-53\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"37.9807,-53 30.9808,-56.1501 34.4807,-53 30.9807,-53.0001 30.9807,-53.0001 30.9807,-53.0001 34.4807,-53 30.9807,-49.8501 37.9807,-53 37.9807,-53\" stroke=\"#000000\"/>\n",
......@@ -403,11 +403,11 @@
"<text fill=\"#000000\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"108\" y=\"-131.8\">b</text>\n",
"</g>\n",
"<!-- 4 -->\n",
"<g class=\"node\" id=\"node6\">\n",
"<title>4</title>\n",
 
 
"<text fill=\"#000000\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"169\" y=\"-30.3\">4</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;4 -->\n",
"<g class=\"edge\" id=\"edge4\">\n",
"<title>0-&gt;4</title>\n",
......@@ -445,6 +445,6 @@
"</g>\n",
"<!-- 1&#45;&gt;3 -->\n",
"<g class=\"edge\" id=\"edge7\">\n",
"<title>1-&gt;3</title>\n",
"<path d=\"M182.553,-152.0893C196.2916,-141.273 218.6543,-127 241,-127 241,-127 241,-127 387.5,-127 414.4268,-127 435.9717,-151.826 448.6077,-171.0258\" fill=\"none\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"452.3928,-177.0232 445.9929,-172.7848 450.5247,-174.0634 448.6567,-171.1036 448.6567,-171.1036 448.6567,-171.1036 450.5247,-174.0634 451.3206,-169.4224 452.3928,-177.0232 452.3928,-177.0232\" stroke=\"#000000\"/>\n",
"<polygon fill=\"#000000\" points=\"452.3928,-177.0232 445.9929,-172.7848 450.5247,-174.0634 448.6567,-171.1036 448.6567,-171.1036 448.6567,-171.1036 450.5247,-174.0634 451.3206,-169.4224 452.3928,-177.0232 452.3928,-177.0232\" stroke=\"#000000\"/>\n",
......
This diff is collapsed.
Markdown is supported
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