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.
This commit is contained in:
parent
b13b591f11
commit
344ac0f930
2 changed files with 103 additions and 110 deletions
|
|
@ -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
|
||||||
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
|
||||||
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
|
||||||
// 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
|
||||||
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
|
||||||
// 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
|
||||||
|
|
||||||
// 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
|
||||||
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 @@
|
||||||
"</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 @@
|
||||||
"<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->0 -->\n",
|
"<!-- I->0 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge1\"><title>I->0</title>\n",
|
"<g class=\"edge\" id=\"edge1\"><title>I->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->0 -->\n",
|
"<!-- 0->0 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge2\"><title>0->0</title>\n",
|
"<g class=\"edge\" id=\"edge2\"><title>0->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 & !b</text>\n",
|
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"37.5\" y=\"-88.8\">a & !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->1 -->\n",
|
"<!-- 0->1 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge3\"><title>0->1</title>\n",
|
"<g class=\"edge\" id=\"edge3\"><title>0->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 @@
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 0->4 -->\n",
|
"<!-- 0->4 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge4\"><title>0->4</title>\n",
|
"<g class=\"edge\" id=\"edge4\"><title>0->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 & !b</text>\n",
|
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"92\" y=\"-48.8\">!a & !b</text>\n",
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 1->1 -->\n",
|
"<!-- 1->1 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge5\"><title>1->1</title>\n",
|
"<g class=\"edge\" id=\"edge5\"><title>1->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 & d</text>\n",
|
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"152\" y=\"-247.8\">c & 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->3 -->\n",
|
|
||||||
"<g class=\"edge\" id=\"edge7\"><title>1->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->2 -->\n",
|
"<!-- 1->2 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge6\"><title>1->2</title>\n",
|
"<g class=\"edge\" id=\"edge6\"><title>1->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 & d</text>\n",
|
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"257\" y=\"-159.8\">!c & 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->1 -->\n",
|
"<!-- 3 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge10\"><title>3->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 & d</text>\n",
|
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 3->3 -->\n",
|
"<!-- 1->3 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge12\"><title>3->3</title>\n",
|
"<g class=\"edge\" id=\"edge7\"><title>1->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",
|
"<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=\"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",
|
"<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=\"269\" y=\"-232.8\">!d</text>\n",
|
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"215.5\" y=\"-236.8\">!d</text>\n",
|
||||||
"</g>\n",
|
"<text fill=\"#5da5da\" font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"214\" y=\"-221.8\">\u24ff</text>\n",
|
||||||
"<!-- 3->2 -->\n",
|
|
||||||
"<g class=\"edge\" id=\"edge11\"><title>3->2</title>\n",
|
|
||||||
"<path d=\"M293.772,-193C311.638,-193 339.686,-193 359.767,-193\" 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",
|
|
||||||
"<text font-family=\"Lato\" font-size=\"14.00\" text-anchor=\"start\" x=\"312\" y=\"-196.8\">!c & d</text>\n",
|
|
||||||
"</g>\n",
|
"</g>\n",
|
||||||
"<!-- 2->1 -->\n",
|
"<!-- 2->1 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge8\"><title>2->1</title>\n",
|
"<g class=\"edge\" id=\"edge8\"><title>2->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->2 -->\n",
|
"<!-- 2->2 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge9\"><title>2->2</title>\n",
|
"<g class=\"edge\" id=\"edge9\"><title>2->2</title>\n",
|
||||||
|
|
@ -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->1 -->\n",
|
||||||
|
"<g class=\"edge\" id=\"edge10\"><title>3->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 & d</text>\n",
|
||||||
|
"</g>\n",
|
||||||
|
"<!-- 3->2 -->\n",
|
||||||
|
"<g class=\"edge\" id=\"edge11\"><title>3->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 & d</text>\n",
|
||||||
|
"</g>\n",
|
||||||
|
"<!-- 3->3 -->\n",
|
||||||
|
"<g class=\"edge\" id=\"edge12\"><title>3->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->4 -->\n",
|
"<!-- 4->4 -->\n",
|
||||||
"<g class=\"edge\" id=\"edge13\"><title>4->4</title>\n",
|
"<g class=\"edge\" id=\"edge13\"><title>4->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 @@
|
||||||
"</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 @@
|
||||||
"</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 @@
|
||||||
"</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 @@
|
||||||
"</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 @@
|
||||||
"</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 @@
|
||||||
"</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 @@
|
||||||
"</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 @@
|
||||||
"</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 @@
|
||||||
"</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> >"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue