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

sccinfo: do not accumulate successors during merge

The command in #96 now takes 1min 16s.

* src/twaalgos/sccinfo.cc: Only gather successor SCCs when popping an
SCC.
* wrap/python/tests/automata.ipynb: Adjust.
parent b13b591f
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "twaalgos/mask.hh" #include "twaalgos/mask.hh"
#include "misc/escape.hh" #include "misc/escape.hh"
namespace spot namespace spot
{ {
...@@ -51,9 +52,8 @@ namespace spot ...@@ -51,9 +52,8 @@ namespace spot
unsigned n = aut->num_states(); unsigned n = aut->num_states();
sccof_.resize(n, -1U); sccof_.resize(n, -1U);
typedef std::list<scc> stack_type;
std::deque<unsigned> live; std::deque<unsigned> live;
stack_type root_; // Stack of SCC roots. std::deque<scc> root_; // Stack of SCC roots.
std::vector<int> h_(n, 0); std::vector<int> h_(n, 0);
// Map of visited states. Values > 0 designate maximal SCC. // Map of visited states. Values > 0 designate maximal SCC.
// Values < 0 number states that are part of incomplete SCCs being // Values < 0 number states that are part of incomplete SCCs being
...@@ -79,7 +79,7 @@ namespace spot ...@@ -79,7 +79,7 @@ namespace spot
unsigned init = aut->get_init_state_number(); unsigned init = aut->get_init_state_number();
num_ = -1; num_ = -1;
h_[init] = num_; h_[init] = num_;
root_.emplace_front(num_, bddfalse, 0U); root_.emplace_back(num_, bddfalse, 0U);
todo_.emplace(init, aut->out(init).begin()); todo_.emplace(init, aut->out(init).begin());
live.emplace_back(init); live.emplace_back(init);
} }
...@@ -102,12 +102,12 @@ namespace spot ...@@ -102,12 +102,12 @@ namespace spot
// remove that SCC from the ARC/ROOT stacks. We must // remove that SCC from the ARC/ROOT stacks. We must
// discard from H all reachable states from this SCC. // discard from H all reachable states from this SCC.
assert(!root_.empty()); assert(!root_.empty());
if (root_.front().index == h_[curr]) if (root_.back().index == h_[curr])
{ {
int num = node_.size(); unsigned num = node_.size();
bdd cond = root_.front().in_cond; bdd cond = root_.back().in_cond;
auto acc = root_.front().node.acc_marks(); auto acc = root_.back().node.acc_marks();
bool triv = root_.front().node.is_trivial(); bool triv = root_.back().node.is_trivial();
node_.emplace_back(acc, triv); node_.emplace_back(acc, triv);
// Move all elements of this SCC from the live stack // Move all elements of this SCC from the live stack
...@@ -119,22 +119,30 @@ namespace spot ...@@ -119,22 +119,30 @@ namespace spot
nbs.insert(nbs.end(), i.base(), live.end()); nbs.insert(nbs.end(), i.base(), live.end());
live.erase(i.base(), live.end()); live.erase(i.base(), live.end());
std::set<unsigned> dests;
unsigned np1 = num + 1;
for (unsigned s: nbs) for (unsigned s: nbs)
{ {
sccof_[s] = num; sccof_[s] = num;
h_[s] = num + 1; h_[s] = np1;
} }
// Gather all successor SCCs
std::swap(node_.back().succ_, root_.front().node.succ_); for (unsigned s: nbs)
for (auto& t: aut->out(s))
{
unsigned n = sccof_[t.dst];
assert(n != -1U);
if (n == num)
continue;
dests.insert(n);
}
auto& succ = node_.back().succ_;
succ.insert(succ.end(), dests.begin(), dests.end());
node_.back().accepting_ = node_.back().accepting_ =
!triv && root_.front().node.accepting_; !triv && root_.back().node.accepting_;
node_.back().rejecting_ = node_.back().rejecting_ =
triv || !aut->acc().inf_satisfiable(acc); triv || !aut->acc().inf_satisfiable(acc);
root_.pop_front(); root_.pop_back();
// Record the transition between the SCC being popped
// and the previous SCC.
if (!root_.empty())
root_.front().node.succ_.emplace_back(num);
} }
continue; continue;
} }
...@@ -155,7 +163,7 @@ namespace spot ...@@ -155,7 +163,7 @@ namespace spot
// Yes. Number it, stack it, and register its successors // Yes. Number it, stack it, and register its successors
// for later processing. // for later processing.
h_[dest] = --num_; h_[dest] = --num_;
root_.emplace_front(num_, cond, acc); root_.emplace_back(num_, cond, acc);
todo_.emplace(dest, aut->out(dest).begin()); todo_.emplace(dest, aut->out(dest).begin());
live.emplace_back(dest); live.emplace_back(dest);
continue; continue;
...@@ -165,17 +173,7 @@ namespace spot ...@@ -165,17 +173,7 @@ namespace spot
// Have we reached a maximal SCC? // Have we reached a maximal SCC?
if (spi > 0) if (spi > 0)
{ continue;
--spi;
// Record that there is a transition from this SCC to the
// dest SCC labelled with cond.
auto& succ = root_.front().node.succ_;
scc_succs::iterator i =
std::find(succ.begin(), succ.end(), (unsigned) spi);
if (i == succ.end())
succ.emplace_back(spi);
continue;
}
// Now this is the most interesting case. We have reached a // Now this is the most interesting case. We have reached a
// state S1 which is already part of a non-dead SCC. Any such // state S1 which is already part of a non-dead SCC. Any such
...@@ -196,32 +194,27 @@ namespace spot ...@@ -196,32 +194,27 @@ namespace spot
is_accepting = aut->acc().accepting(acc); is_accepting = aut->acc().accepting(acc);
assert(!root_.empty()); assert(!root_.empty());
while (threshold > root_.front().index) while (threshold > root_.back().index)
{ {
acc |= root_.front().node.acc_; acc |= root_.back().node.acc_;
acc |= root_.front().in_acc; acc |= root_.back().in_acc;
is_accepting |= root_.front().node.accepting_; is_accepting |= root_.back().node.accepting_;
succs.insert(succs.end(), root_.pop_back();
root_.front().node.succ_.begin(),
root_.front().node.succ_.end());
root_.pop_front();
assert(!root_.empty()); assert(!root_.empty());
} }
// Note that we do not always have // Note that we do not always have
// threshold == root_.front().index // threshold == root_.back().index
// after this loop, the SCC whose index is threshold might have // after this loop, the SCC whose index is threshold might have
// been merged with a higher SCC. // been merged with a higher SCC.
// Accumulate all acceptance conditions, states, SCC // Accumulate all acceptance conditions, states, SCC
// successors, and conditions into the merged SCC. // successors, and conditions into the merged SCC.
root_.front().node.acc_ |= acc; root_.back().node.acc_ |= acc;
root_.front().node.accepting_ |= is_accepting root_.back().node.accepting_ |= is_accepting
|| aut->acc().accepting(root_.front().node.acc_); || aut->acc().accepting(root_.back().node.acc_);
root_.front().node.succ_.insert(root_.front().node.succ_.end(),
succs.begin(), succs.end());
// This SCC is no longer trivial. // This SCC is no longer trivial.
root_.front().node.trivial_ = false; root_.back().node.trivial_ = false;
} }
determine_usefulness(); determine_usefulness();
......
...@@ -176,7 +176,7 @@ ...@@ -176,7 +176,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44bdf3f8d0> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49c07cf30> >"
] ]
} }
], ],
...@@ -356,35 +356,35 @@ ...@@ -356,35 +356,35 @@
"<polygon fill=\"none\" points=\"143,-8 143,-93 195,-93 195,-8 143,-8\" stroke=\"grey\"/>\n", "<polygon fill=\"none\" points=\"143,-8 143,-93 195,-93 195,-8 143,-8\" stroke=\"grey\"/>\n",
"</g>\n", "</g>\n",
"<g class=\"cluster\" id=\"clust3\"><title>cluster_2</title>\n", "<g class=\"cluster\" id=\"clust3\"><title>cluster_2</title>\n",
"<polygon fill=\"none\" points=\"30,-18 30,-103 82,-103 82,-18 30,-18\" stroke=\"red\"/>\n", "<polygon fill=\"none\" points=\"30,-23 30,-108 82,-108 82,-23 30,-23\" stroke=\"red\"/>\n",
"</g>\n", "</g>\n",
"<!-- I -->\n", "<!-- I -->\n",
"<!-- 0 -->\n", "<!-- 0 -->\n",
"<g class=\"node\" id=\"node2\"><title>0</title>\n", "<g class=\"node\" id=\"node2\"><title>0</title>\n",
"<ellipse cx=\"56\" cy=\"-44\" fill=\"#ffffaa\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n", "<ellipse cx=\"56\" cy=\"-49\" fill=\"#ffffaa\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"56\" y=\"-40.3\">0</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"56\" y=\"-45.3\">0</text>\n",
"</g>\n", "</g>\n",
"<!-- I&#45;&gt;0 -->\n", "<!-- I&#45;&gt;0 -->\n",
"<g class=\"edge\" id=\"edge1\"><title>I-&gt;0</title>\n", "<g class=\"edge\" id=\"edge1\"><title>I-&gt;0</title>\n",
"<path d=\"M1.15491,-44C2.79388,-44 17.1543,-44 30.6317,-44\" fill=\"none\" stroke=\"black\"/>\n", "<path d=\"M1.15491,-49C2.79388,-49 17.1543,-49 30.6317,-49\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"37.9419,-44 30.9419,-47.1501 34.4419,-44 30.9419,-44.0001 30.9419,-44.0001 30.9419,-44.0001 34.4419,-44 30.9418,-40.8501 37.9419,-44 37.9419,-44\" stroke=\"black\"/>\n", "<polygon fill=\"black\" points=\"37.9419,-49 30.9419,-52.1501 34.4419,-49 30.9419,-49.0001 30.9419,-49.0001 30.9419,-49.0001 34.4419,-49 30.9418,-45.8501 37.9419,-49 37.9419,-49\" stroke=\"black\"/>\n",
"</g>\n", "</g>\n",
"<!-- 0&#45;&gt;0 -->\n", "<!-- 0&#45;&gt;0 -->\n",
"<g class=\"edge\" id=\"edge2\"><title>0-&gt;0</title>\n", "<g class=\"edge\" id=\"edge2\"><title>0-&gt;0</title>\n",
"<path d=\"M49.6208,-61.0373C48.3189,-70.8579 50.4453,-80 56,-80 60.166,-80 62.4036,-74.8576 62.7128,-68.1433\" fill=\"none\" stroke=\"black\"/>\n", "<path d=\"M49.6208,-66.0373C48.3189,-75.8579 50.4453,-85 56,-85 60.166,-85 62.4036,-79.8576 62.7128,-73.1433\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"62.3792,-61.0373 65.8541,-67.8818 62.5434,-64.5335 62.7076,-68.0296 62.7076,-68.0296 62.7076,-68.0296 62.5434,-64.5335 59.561,-68.1774 62.3792,-61.0373 62.3792,-61.0373\" stroke=\"black\"/>\n", "<polygon fill=\"black\" points=\"62.3792,-66.0373 65.8541,-72.8818 62.5434,-69.5335 62.7076,-73.0296 62.7076,-73.0296 62.7076,-73.0296 62.5434,-69.5335 59.561,-73.1774 62.3792,-66.0373 62.3792,-66.0373\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"37.5\" y=\"-83.8\">a &amp; !b</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"37.5\" y=\"-88.8\">a &amp; !b</text>\n",
"</g>\n", "</g>\n",
"<!-- 1 -->\n", "<!-- 1 -->\n",
"<g class=\"node\" id=\"node3\"><title>1</title>\n", "<g class=\"node\" id=\"node3\"><title>1</title>\n",
"<ellipse cx=\"169\" cy=\"-151\" fill=\"#ffffaa\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n", "<ellipse cx=\"169\" cy=\"-193\" fill=\"#ffffaa\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"169\" y=\"-147.3\">1</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"169\" y=\"-189.3\">1</text>\n",
"</g>\n", "</g>\n",
"<!-- 0&#45;&gt;1 -->\n", "<!-- 0&#45;&gt;1 -->\n",
"<g class=\"edge\" id=\"edge3\"><title>0-&gt;1</title>\n", "<g class=\"edge\" id=\"edge3\"><title>0-&gt;1</title>\n",
"<path d=\"M69.7331,-56.2743C89.5555,-75.3823 127.846,-112.293 150.33,-133.967\" fill=\"none\" stroke=\"black\"/>\n", "<path d=\"M67.6431,-62.8073C87.4829,-88.5454 130.165,-143.916 152.947,-173.472\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"155.415,-138.869 148.189,-136.279 152.896,-136.44 150.376,-134.011 150.376,-134.011 150.376,-134.011 152.896,-136.44 152.562,-131.743 155.415,-138.869 155.415,-138.869\" stroke=\"black\"/>\n", "<polygon fill=\"black\" points=\"157.226,-179.023 150.458,-175.402 155.089,-176.251 152.952,-173.479 152.952,-173.479 152.952,-173.479 155.089,-176.251 155.447,-171.556 157.226,-179.023 157.226,-179.023\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"108\" y=\"-120.8\">b</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"108\" y=\"-150.8\">b</text>\n",
"</g>\n", "</g>\n",
"<!-- 4 -->\n", "<!-- 4 -->\n",
"<g class=\"node\" id=\"node6\"><title>4</title>\n", "<g class=\"node\" id=\"node6\"><title>4</title>\n",
...@@ -393,64 +393,46 @@ ...@@ -393,64 +393,46 @@
"</g>\n", "</g>\n",
"<!-- 0&#45;&gt;4 -->\n", "<!-- 0&#45;&gt;4 -->\n",
"<g class=\"edge\" id=\"edge4\"><title>0-&gt;4</title>\n", "<g class=\"edge\" id=\"edge4\"><title>0-&gt;4</title>\n",
"<path d=\"M74.3438,-42.4375C92.9975,-40.757 122.797,-38.0723 143.763,-36.1835\" fill=\"none\" stroke=\"black\"/>\n", "<path d=\"M73.8585,-46.7218C92.5211,-44.1998 122.756,-40.114 143.912,-37.2551\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"150.778,-35.5515 144.089,-39.317 147.292,-35.8656 143.806,-36.1797 143.806,-36.1797 143.806,-36.1797 147.292,-35.8656 143.524,-33.0424 150.778,-35.5515 150.778,-35.5515\" stroke=\"black\"/>\n", "<polygon fill=\"black\" points=\"150.983,-36.2996 144.468,-40.3588 147.514,-36.7684 144.046,-37.2371 144.046,-37.2371 144.046,-37.2371 147.514,-36.7684 143.624,-34.1155 150.983,-36.2996 150.983,-36.2996\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"92\" y=\"-44.8\">!a &amp; !b</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"92\" y=\"-48.8\">!a &amp; !b</text>\n",
"</g>\n", "</g>\n",
"<!-- 1&#45;&gt;1 -->\n", "<!-- 1&#45;&gt;1 -->\n",
"<g class=\"edge\" id=\"edge5\"><title>1-&gt;1</title>\n", "<g class=\"edge\" id=\"edge5\"><title>1-&gt;1</title>\n",
"<path d=\"M160.021,-166.916C157.679,-177.15 160.672,-187 169,-187 175.376,-187 178.625,-181.226 178.746,-173.927\" fill=\"none\" stroke=\"black\"/>\n", "<path d=\"M160.021,-208.916C157.679,-219.15 160.672,-229 169,-229 175.376,-229 178.625,-223.226 178.746,-215.927\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"177.979,-166.916 181.872,-173.532 178.36,-170.395 178.741,-173.874 178.741,-173.874 178.741,-173.874 178.36,-170.395 175.61,-174.217 177.979,-166.916 177.979,-166.916\" stroke=\"black\"/>\n", "<polygon fill=\"black\" points=\"177.979,-208.916 181.872,-215.532 178.36,-212.395 178.741,-215.874 178.741,-215.874 178.741,-215.874 178.36,-212.395 175.61,-216.217 177.979,-208.916 177.979,-208.916\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"152\" y=\"-205.8\">c &amp; d</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"152\" y=\"-247.8\">c &amp; d</text>\n",
"<text fill=\"#5da5da\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"161\" y=\"-190.8\">\u24ff</text>\n", "<text fill=\"#5da5da\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"161\" y=\"-232.8\">\u24ff</text>\n",
"</g>\n",
"<!-- 3 -->\n",
"<g class=\"node\" id=\"node4\"><title>3</title>\n",
"<ellipse cx=\"275.5\" cy=\"-193\" fill=\"#ffffaa\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"275.5\" y=\"-189.3\">3</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;3 -->\n",
"<g class=\"edge\" id=\"edge7\"><title>1-&gt;3</title>\n",
"<path d=\"M186.737,-147.555C201.262,-145.401 222.492,-144.312 239,-152 248.114,-156.244 255.801,-164.081 261.667,-171.775\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"265.79,-177.569 259.165,-173.693 263.76,-174.718 261.731,-171.866 261.731,-171.866 261.731,-171.866 263.76,-174.718 264.297,-170.04 265.79,-177.569 265.79,-177.569\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"215.5\" y=\"-170.8\">!d</text>\n",
"<text fill=\"#5da5da\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"214\" y=\"-155.8\">\u24ff</text>\n",
"</g>\n", "</g>\n",
"<!-- 2 -->\n", "<!-- 2 -->\n",
"<g class=\"node\" id=\"node5\"><title>2</title>\n", "<g class=\"node\" id=\"node4\"><title>2</title>\n",
"<ellipse cx=\"385\" cy=\"-193\" fill=\"#ffffaa\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n", "<ellipse cx=\"385\" cy=\"-193\" fill=\"#ffffaa\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"385\" y=\"-189.3\">2</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"385\" y=\"-189.3\">2</text>\n",
"</g>\n", "</g>\n",
"<!-- 1&#45;&gt;2 -->\n", "<!-- 1&#45;&gt;2 -->\n",
"<g class=\"edge\" id=\"edge6\"><title>1-&gt;2</title>\n", "<g class=\"edge\" id=\"edge6\"><title>1-&gt;2</title>\n",
"<path d=\"M186.385,-144.944C210.438,-136.96 256.512,-125.127 294,-136 321.45,-143.961 348.554,-163.081 365.728,-176.986\" fill=\"none\" stroke=\"black\"/>\n", "<path d=\"M183.382,-181.807C199.601,-169.041 228.334,-148.914 257,-141 296.803,-130.011 340.921,-157.735 365.268,-176.79\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"371.158,-181.479 363.756,-179.443 368.461,-179.247 365.764,-177.016 365.764,-177.016 365.764,-177.016 368.461,-179.247 367.772,-174.589 371.158,-181.479 371.158,-181.479\" stroke=\"black\"/>\n", "<polygon fill=\"black\" points=\"371.017,-181.419 363.59,-179.483 368.291,-179.224 365.565,-177.029 365.565,-177.029 365.565,-177.029 368.291,-179.224 367.54,-174.576 371.017,-181.419 371.017,-181.419\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"257\" y=\"-154.8\">!c &amp; d</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"257\" y=\"-159.8\">!c &amp; d</text>\n",
"<text fill=\"#5da5da\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"267.5\" y=\"-139.8\">\u24ff</text>\n", "<text fill=\"#5da5da\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"267.5\" y=\"-144.8\">\u24ff</text>\n",
"</g>\n", "</g>\n",
"<!-- 3&#45;&gt;1 -->\n", "<!-- 3 -->\n",
"<g class=\"edge\" id=\"edge10\"><title>3-&gt;1</title>\n", "<g class=\"node\" id=\"node5\"><title>3</title>\n",
"<path d=\"M257.435,-192.94C242.865,-192.285 221.682,-189.872 205,-182 198.283,-178.83 191.897,-173.966 186.462,-169.024\" fill=\"none\" stroke=\"black\"/>\n", "<ellipse cx=\"275.5\" cy=\"-244\" fill=\"#ffffaa\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"181.368,-164.115 188.595,-166.704 183.889,-166.544 186.409,-168.972 186.409,-168.972 186.409,-168.972 183.889,-166.544 184.223,-171.241 181.368,-164.115 181.368,-164.115\" stroke=\"black\"/>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"middle\" x=\"275.5\" y=\"-240.3\">3</text>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"205\" y=\"-195.8\">c &amp; d</text>\n",
"</g>\n",
"<!-- 3&#45;&gt;3 -->\n",
"<g class=\"edge\" id=\"edge12\"><title>3-&gt;3</title>\n",
"<path d=\"M266.521,-208.916C264.179,-219.15 267.172,-229 275.5,-229 281.876,-229 285.125,-223.226 285.246,-215.927\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"284.479,-208.916 288.372,-215.532 284.86,-212.395 285.241,-215.874 285.241,-215.874 285.241,-215.874 284.86,-212.395 282.11,-216.217 284.479,-208.916 284.479,-208.916\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"269\" y=\"-232.8\">!d</text>\n",
"</g>\n", "</g>\n",
"<!-- 3&#45;&gt;2 -->\n", "<!-- 1&#45;&gt;3 -->\n",
"<g class=\"edge\" id=\"edge11\"><title>3-&gt;2</title>\n", "<g class=\"edge\" id=\"edge7\"><title>1-&gt;3</title>\n",
"<path d=\"M293.772,-193C311.638,-193 339.686,-193 359.767,-193\" fill=\"none\" stroke=\"black\"/>\n", "<path d=\"M186.45,-197.514C200.79,-201.783 221.911,-208.888 239,-218 244.62,-220.997 250.345,-224.799 255.51,-228.565\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"366.771,-193 359.771,-196.15 363.271,-193 359.771,-193 359.771,-193 359.771,-193 363.271,-193 359.771,-189.85 366.771,-193 366.771,-193\" stroke=\"black\"/>\n", "<polygon fill=\"black\" points=\"261.277,-232.918 253.792,-231.215 258.484,-230.809 255.69,-228.701 255.69,-228.701 255.69,-228.701 258.484,-230.809 257.588,-226.187 261.277,-232.918 261.277,-232.918\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"312\" y=\"-196.8\">!c &amp; d</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"215.5\" y=\"-236.8\">!d</text>\n",
"<text fill=\"#5da5da\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"214\" y=\"-221.8\">\u24ff</text>\n",
"</g>\n", "</g>\n",
"<!-- 2&#45;&gt;1 -->\n", "<!-- 2&#45;&gt;1 -->\n",
"<g class=\"edge\" id=\"edge8\"><title>2-&gt;1</title>\n", "<g class=\"edge\" id=\"edge8\"><title>2-&gt;1</title>\n",
"<path d=\"M372.089,-205.642C349.996,-227.482 300.914,-268.52 257,-253 219.934,-239.901 193.906,-199.684 180.487,-173.836\" fill=\"none\" stroke=\"black\"/>\n", "<path d=\"M366.768,-193C328.813,-193 237.915,-193 194.238,-193\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"177.192,-167.28 183.15,-172.121 178.764,-170.408 180.336,-173.535 180.336,-173.535 180.336,-173.535 178.764,-170.408 177.521,-174.949 177.192,-167.28 177.192,-167.28\" stroke=\"black\"/>\n", "<polygon fill=\"black\" points=\"187.151,-193 194.151,-189.85 190.651,-193 194.151,-193 194.151,-193 194.151,-193 190.651,-193 194.151,-196.15 187.151,-193 187.151,-193\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"272\" y=\"-259.8\">c</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"272\" y=\"-196.8\">c</text>\n",
"</g>\n", "</g>\n",
"<!-- 2&#45;&gt;2 -->\n", "<!-- 2&#45;&gt;2 -->\n",
"<g class=\"edge\" id=\"edge9\"><title>2-&gt;2</title>\n", "<g class=\"edge\" id=\"edge9\"><title>2-&gt;2</title>\n",
...@@ -458,6 +440,24 @@ ...@@ -458,6 +440,24 @@
"<polygon fill=\"black\" points=\"394.233,-208.541 398.229,-215.095 394.668,-212.014 395.103,-215.487 395.103,-215.487 395.103,-215.487 394.668,-212.014 391.977,-215.879 394.233,-208.541 394.233,-208.541\" stroke=\"black\"/>\n", "<polygon fill=\"black\" points=\"394.233,-208.541 398.229,-215.095 394.668,-212.014 395.103,-215.487 395.103,-215.487 395.103,-215.487 394.668,-212.014 391.977,-215.879 394.233,-208.541 394.233,-208.541\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"379.5\" y=\"-232.8\">!c</text>\n", "<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"379.5\" y=\"-232.8\">!c</text>\n",
"</g>\n", "</g>\n",
"<!-- 3&#45;&gt;1 -->\n",
"<g class=\"edge\" id=\"edge10\"><title>3-&gt;1</title>\n",
"<path d=\"M258.25,-249.586C243.436,-253.647 221.422,-257.015 205,-248 192.725,-241.262 184.14,-228.191 178.545,-216.482\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"175.592,-209.803 181.304,-214.931 177.007,-213.004 178.423,-216.205 178.423,-216.205 178.423,-216.205 177.007,-213.004 175.542,-217.479 175.592,-209.803 175.592,-209.803\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"205\" y=\"-256.8\">c &amp; d</text>\n",
"</g>\n",
"<!-- 3&#45;&gt;2 -->\n",
"<g class=\"edge\" id=\"edge11\"><title>3-&gt;2</title>\n",
"<path d=\"M292.362,-236.475C310.807,-227.724 341.364,-213.227 362.073,-203.403\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"368.422,-200.39 363.448,-206.237 365.26,-201.891 362.098,-203.391 362.098,-203.391 362.098,-203.391 365.26,-201.891 360.748,-200.545 368.422,-200.39 368.422,-200.39\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"312\" y=\"-229.8\">!c &amp; d</text>\n",
"</g>\n",
"<!-- 3&#45;&gt;3 -->\n",
"<g class=\"edge\" id=\"edge12\"><title>3-&gt;3</title>\n",
"<path d=\"M266.521,-259.916C264.179,-270.15 267.172,-280 275.5,-280 281.876,-280 285.125,-274.226 285.246,-266.927\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"284.479,-259.916 288.372,-266.532 284.86,-263.395 285.241,-266.874 285.241,-266.874 285.241,-266.874 284.86,-263.395 282.11,-267.217 284.479,-259.916 284.479,-259.916\" stroke=\"black\"/>\n",
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"269\" y=\"-283.8\">!d</text>\n",
"</g>\n",
"<!-- 4&#45;&gt;4 -->\n", "<!-- 4&#45;&gt;4 -->\n",
"<g class=\"edge\" id=\"edge13\"><title>4-&gt;4</title>\n", "<g class=\"edge\" id=\"edge13\"><title>4-&gt;4</title>\n",
"<path d=\"M160.021,-49.916C157.679,-60.1504 160.672,-70 169,-70 175.376,-70 178.625,-64.2263 178.746,-56.9268\" fill=\"none\" stroke=\"black\"/>\n", "<path d=\"M160.021,-49.916C157.679,-60.1504 160.672,-70 169,-70 175.376,-70 178.625,-64.2263 178.746,-56.9268\" fill=\"none\" stroke=\"black\"/>\n",
...@@ -568,7 +568,7 @@ ...@@ -568,7 +568,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44bdff74b0> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49c065360> >"
] ]
} }
], ],
...@@ -638,7 +638,7 @@ ...@@ -638,7 +638,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44bdff7510> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49c0654b0> >"
] ]
} }
], ],
...@@ -714,7 +714,7 @@ ...@@ -714,7 +714,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44bdff73c0> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49c065270> >"
] ]
} }
], ],
...@@ -1174,7 +1174,7 @@ ...@@ -1174,7 +1174,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44bdff7420> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49c0652d0> >"
] ]
} }
], ],
...@@ -1275,7 +1275,7 @@ ...@@ -1275,7 +1275,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44bdff72d0> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49c065150> >"
] ]
} }
], ],
...@@ -1393,7 +1393,7 @@ ...@@ -1393,7 +1393,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44bdff7360> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49c0651e0> >"
] ]
} }
], ],
...@@ -1493,7 +1493,7 @@ ...@@ -1493,7 +1493,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44bdff7450> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49c065300> >"
] ]
} }
], ],
...@@ -1967,7 +1967,7 @@ ...@@ -1967,7 +1967,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44bdfd9ba0> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49c04ad80> >"
] ]
} }
], ],
...@@ -2170,7 +2170,7 @@ ...@@ -2170,7 +2170,7 @@
"</svg>\n" "</svg>\n"
], ],
"text": [ "text": [
"<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f44c5f30cc0> >" "<spot_impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7fe49f10ec90> >"
] ]
} }
], ],
......
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