Commit 5e5a6948 authored by Alexandre Duret-Lutz's avatar Alexandre Duret-Lutz
Browse files

twa_graph: do not order BDDs by IDs in merge_edges()

Fixes #282.

* spot/misc/bddlt.hh (bdd_less_than_stable): New function.
* spot/twa/twagraph.cc (merge_edges): Use it.
* tests/core/genltl.test: Adjust, and add an extra test
for the behavior of #282.
* tests/core/complement.test, tests/core/degenid.test,
tests/core/ltldo.test, tests/core/prodor.test,
tests/core/readsave.test, tests/core/sbacc.test,
tests/python/atva16-fig2a.ipynb, tests/python/automata.ipynb,
tests/python/decompose.ipynb, tests/python/dualize.py,
tests/python/highlighting.ipynb, tests/python/piperead.ipynb,
tests/python/product.ipynb, tests/python/simstate.py,
tests/python/tra2tba.py: Adjust all expected outputs.
* NEWS: Mention the bug.
parent 2bca21f7
......@@ -76,6 +76,14 @@ New in spot 2.4.0.dev (not yet released)
spot::scc_info::marks(), spot::scc_info::marks_of() and
spot::scc_info::acc_sets_of() respectively.
Bugs fixed:
- The twa_graph::mege_edges() function relied on BDD IDs to sort
edges. This in turn caused some algorithm (like the
degeneralization) to produce slighltly different outputs (but
still correct outputs) depending on the BDD operations performed
before.
New in spot 2.4 (2017-09-06)
Build:
......
// -*- coding: utf-8 -*-
// Copyright (C) 2011, 2014 Laboratoire de Recherche et Developpement de
// l'Epita (LRDE).
// Copyright (C) 2011, 2014, 2017 Laboratoire de Recherche et
// Developpement de l'Epita (LRDE).
// Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
// et Marie Curie.
......@@ -29,6 +29,10 @@ namespace spot
{
/// \ingroup misc_tools
/// \brief Comparison functor for BDDs.
///
/// This comparison function use BDD ids for efficiency. An
/// algorithm depending on this order may return different results
/// depending on how the BDD library has been used before.
struct bdd_less_than :
public std::binary_function<const bdd&, const bdd&, bool>
{
......@@ -39,6 +43,43 @@ namespace spot
}
};
/// \ingroup misc_tools
/// \brief Comparison functor for BDDs.
///
/// This comparison function actually check for BDD variables, so as
/// long as the variable order is the same, the output of this
/// comparison will be stable and independent on previous BDD
/// operations.
struct bdd_less_than_stable :
public std::binary_function<const bdd&, const bdd&, bool>
{
bool
operator()(const bdd& left, const bdd& right) const
{
int li = left.id();
int ri = right.id();
if (li == ri)
return false;
if (li <= 1 || ri <= 1)
return li < ri;
{
int vl = bdd_var(left);
int vr = bdd_var(right);
if (vl != vr)
return vl < vr;
}
// We check the high side before low, this way
// !a&b comes before a&!b and a&b
{
bdd hl = bdd_high(left);
bdd hr = bdd_high(right);
if (hl != hr)
return operator()(hl, hr);
return operator()(bdd_low(left), bdd_low(right));
}
}
};
/// \ingroup misc_tools
/// \brief Hash functor for BDDs.
struct bdd_hash :
......
......@@ -19,6 +19,7 @@
#include <spot/twa/twagraph.hh>
#include <spot/tl/print.hh>
#include <spot/misc/bddlt.hh>
#include <vector>
#include <deque>
......@@ -79,11 +80,11 @@ namespace spot
delete namer;
}
/// \brief Merge universal destinations
///
/// If several states have the same universal destination, merge
/// them all. Also remove unused destination, and any redundant
/// state in each destination.
/// \brief Merge universal destinations
///
/// If several states have the same universal destination, merge
/// them all. Also remove unused destination, and any redundant
/// state in each destination.
void twa_graph::merge_univ_dests()
{
auto& g = get_graph();
......@@ -198,7 +199,8 @@ namespace spot
return true;
if (lhs.dst > rhs.dst)
return false;
return lhs.cond.id() < rhs.cond.id();
bdd_less_than_stable lt;
return lt(lhs.cond, rhs.cond);
// Do not sort on acceptance, we'll merge
// them.
});
......
......@@ -62,10 +62,10 @@ properties: trans-labels explicit-labels trans-acc complete
properties: deterministic stutter-invariant
--BODY--
State: 0
[0&1] 0 {0 1}
[!0&!1] 0
[!0&1] 0 {1}
[0&!1] 0 {0}
[0&1] 0 {0 1}
--END--
HOA: v1
States: 4
......
#!/bin/sh
# -*- coding: utf-8 -*-
# Copyright (C) 2011, 2013, 2014, 2015 Laboratoire de Recherche et
# Développement de l'Epita (LRDE).
# Copyright (C) 2011, 2013, 2014, 2015, 2017 Laboratoire de Recherche
# et Développement de l'Epita (LRDE).
#
# This file is part of Spot, a model checking library.
#
......@@ -242,15 +242,15 @@ State: 0
[0] 1
State: 1 {0}
[1&2] 1
[!1&2] 2
[!2] 3
[!2] 2
[!1&2] 3
State: 2
[1] 1
[!1] 2
State: 3
[1&2] 1
[!1&2] 2
[!2] 3
[!2] 2
[!1&2] 3
State: 3
[1] 1
[!1] 3
--END--
EOF
diff out expected
......@@ -136,7 +136,7 @@ test $(genltl --kr-nlogn=4 | ltl2tgba --low --stats=%s) -ge 16
test $(genltl --kr-n=4 | ltl2tgba --low --stats=%s) -ge 16
genltl --ms-example=0..4 --ms-phi-r=0..2 --ms-phi-s=0..2 --ms-phi-h=0..4 \
--format=%F=%L,%f |
--gf-equiv=0..5 --format=%F=%L,%f |
ltl2tgba -G -D -F-/2 --stats='%<,%s' > out
cat >exp<<EOF
ms-example=0,1
......@@ -146,21 +146,15 @@ ms-example=3,7
ms-example=4,12
ms-phi-r=0,2
ms-phi-r=1,16
ms-phi-r=2,25
ms-phi-r=2,29
ms-phi-s=0,5
ms-phi-s=1,7
ms-phi-s=2,1322
ms-phi-s=1,8
ms-phi-s=2,497
ms-phi-h=0,2
ms-phi-h=1,4
ms-phi-h=2,21
ms-phi-h=3,170
ms-phi-h=4,1816
EOF
diff out exp
genltl --gf-equiv=0..5 --format=%F=%L,%f |
ltl2tgba -G -D -F-/2 --stats='%<,%s' > out
cat >exp<<EOF
gf-equiv=0,1
gf-equiv=1,4
gf-equiv=2,8
......@@ -169,3 +163,9 @@ gf-equiv=4,81
gf-equiv=5,431
EOF
diff out exp
# Running ltl2tgba on one formula at a time should give the same results
genltl --ms-example=0..4 --ms-phi-r=0..2 --ms-phi-s=0..2 --ms-phi-h=0..4 \
--gf-equiv=0..5 --format=%F=%L,%f |
ltldo -F-/2 'ltl2tgba -G -D' --stats='%<,%s' > out
diff out exp
......@@ -82,8 +82,8 @@ properties: trans-labels explicit-labels trans-acc complete
properties: deterministic stutter-invariant
--BODY--
State: 0
[0] 0 {0}
[!0] 0
[0] 0 {0}
--END--
EOF
diff output expected
......@@ -103,8 +103,8 @@ properties: trans-labels explicit-labels trans-acc complete
properties: deterministic stutter-invariant
--BODY--
State: 0
[0] 0 {0}
[!0] 0
[0] 0 {0}
--END--
EOF
diff output expected
......@@ -124,8 +124,8 @@ properties: trans-labels explicit-labels trans-acc complete
properties: deterministic
--BODY--
State: 0
[0] 0 {0}
[!0] 0
[0] 0 {0}
--END--
EOF
diff output expected
......
......@@ -65,18 +65,18 @@ properties: trans-labels explicit-labels trans-acc complete
properties: stutter-invariant
--BODY--
State: 0
[0] 0 {1}
[!0] 0
[0&1] 1 {1}
[0] 0 {1}
[!0&1] 1
[0&1] 1 {1}
State: 1
[0&1] 1 {0 1}
[!0&1] 1 {0}
[0&!1] 2 {0 1}
[0&1] 1 {0 1}
[!0&!1] 2 {0}
[0&!1] 2 {0 1}
State: 2
[0] 2 {1}
[!0] 2
[0] 2 {1}
--END--
EOF
diff por.hoa exp
......@@ -96,13 +96,13 @@ Acceptance: 2 Inf(0)&Inf(1)
properties: trans-labels explicit-labels trans-acc stutter-invariant
--BODY--
State: 0
[0] 0 {1}
[!0] 0
[0&1] 1 {1}
[0] 0 {1}
[!0&1] 1
[0&1] 1 {1}
State: 1
[0&1] 1 {0 1}
[!0&1] 1 {0}
[0&1] 1 {0 1}
--END--
EOF
diff pand.hoa exp
......
......@@ -363,10 +363,10 @@ digraph G {
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\n{0,1}"]
0 -> 0 [label="!a & !b"]
0 -> 0 [label="!a & b\n{1}"]
0 -> 0 [label="a & !b\n{0}"]
0 -> 0 [label="a & b\n{0,1}"]
}
EOF
diff output expected
......@@ -382,10 +382,10 @@ digraph G {
I [label="", style=invis, width=0]
I -> 0
0 [label="0"]
0 -> 0 [label="a & b\n⓿❶"]
0 -> 0 [label="!a & !b"]
0 -> 0 [label="!a & b\n❶"]
0 -> 0 [label="a & !b\n⓿"]
0 -> 0 [label="a & b\n⓿❶"]
}
EOF
diff output expected
......@@ -407,10 +407,10 @@ digraph G {
I [label="", style=invis, width=0]
I -> 0
0 [label=<0>]
0 -> 0 [label=<a &amp; b<br/>$zero$one>]
0 -> 0 [label=<!a &amp; !b>]
0 -> 0 [label=<!a &amp; b<br/>$one>]
0 -> 0 [label=<a &amp; !b<br/>$zero>]
0 -> 0 [label=<a &amp; b<br/>$zero$one>]
}
EOF
diff output expected
......
......@@ -37,26 +37,26 @@ Acceptance: 2 Inf(0)&Inf(1)
properties: trans-labels explicit-labels state-acc complete
properties: deterministic stutter-invariant
--BODY--
State: 0 {0}
[0&!1] 0
[0&1] 1
[!0&!1] 2
[!0&1] 3
State: 1 {0 1}
[0&!1] 0
[0&1] 1
[!0&!1] 2
[!0&1] 3
State: 2
[0&!1] 0
[0&1] 1
[!0&!1] 2
[!0&1] 3
State: 3 {1}
[0&!1] 0
[0&1] 1
[!0&!1] 2
[!0&1] 3
State: 0 {0 1}
[0&1] 0
[!0&!1] 1
[!0&1] 2
[0&!1] 3
State: 1
[0&1] 0
[!0&!1] 1
[!0&1] 2
[0&!1] 3
State: 2 {1}
[0&1] 0
[!0&!1] 1
[!0&1] 2
[0&!1] 3
State: 3 {0}
[0&1] 0
[!0&!1] 1
[!0&1] 2
[0&!1] 3
--END--
EOF
......
......@@ -140,29 +140,29 @@
"<g id=\"edge5\" class=\"edge\"><title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M166.467,-136.153C166.078,-145.539 166.922,-154 169,-154 170.526,-154 171.387,-149.437 171.582,-143.295\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"171.533,-136.153 174.731,-143.131 171.557,-139.653 171.581,-143.153 171.581,-143.153 171.581,-143.153 171.557,-139.653 168.431,-143.174 171.533,-136.153 171.533,-136.153\"/>\n",
"<text text-anchor=\"start\" x=\"150.5\" y=\"-172.8\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"161\" y=\"-157.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">\u2776</text>\n",
"<text text-anchor=\"start\" x=\"148.5\" y=\"-157.8\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; !b</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge6\" class=\"edge\"><title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M165.104,-135.577C162.424,-156.718 163.723,-184 169,-184 173.7,-184 175.244,-162.36 173.633,-142.691\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"172.896,-135.577 176.75,-142.215 173.257,-139.059 173.617,-142.54 173.617,-142.54 173.617,-142.54 173.257,-139.059 170.484,-142.864 172.896,-135.577 172.896,-135.577\"/>\n",
"<text text-anchor=\"start\" x=\"148.5\" y=\"-187.8\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; !b</text>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M164.828,-135.699C162.523,-152.996 163.914,-172 169,-172 173.371,-172 175.012,-157.965 173.925,-143.04\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"173.172,-135.699 177.02,-142.341 173.529,-139.181 173.886,-142.663 173.886,-142.663 173.886,-142.663 173.529,-139.181 170.753,-142.984 173.172,-135.699 173.172,-135.699\"/>\n",
"<text text-anchor=\"start\" x=\"150.5\" y=\"-190.8\" font-family=\"Lato\" font-size=\"14.00\">!a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"161\" y=\"-175.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">\u2776</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge7\" class=\"edge\"><title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M164.049,-135.467C158.901,-163.149 160.551,-202 169,-202 176.756,-202 178.783,-169.261 175.081,-142.477\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"173.951,-135.467 178.174,-141.877 174.508,-138.923 175.065,-142.378 175.065,-142.378 175.065,-142.378 174.508,-138.923 171.955,-142.879 173.951,-135.467 173.951,-135.467\"/>\n",
"<text text-anchor=\"start\" x=\"152\" y=\"-219.8\" font-family=\"Lato\" font-size=\"14.00\">a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"153\" y=\"-205.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">\u24ff</text>\n",
"<text text-anchor=\"start\" x=\"169\" y=\"-205.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">\u2776</text>\n",
"<text text-anchor=\"start\" x=\"150.5\" y=\"-220.8\" font-family=\"Lato\" font-size=\"14.00\">a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"161\" y=\"-205.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">\u24ff</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge8\" class=\"edge\"><title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M163.463,-135.36C155.342,-171.623 157.188,-230 169,-230 180.074,-230 182.389,-178.692 175.943,-142.399\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"174.537,-135.36 178.997,-141.607 175.223,-138.792 175.908,-142.224 175.908,-142.224 175.908,-142.224 175.223,-138.792 172.819,-142.841 174.537,-135.36 174.537,-135.36\"/>\n",
"<text text-anchor=\"start\" x=\"150.5\" y=\"-248.8\" font-family=\"Lato\" font-size=\"14.00\">a &amp; !b</text>\n",
"<text text-anchor=\"start\" x=\"161\" y=\"-233.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">\u24ff</text>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M163.519,-135.237C155.333,-171.922 157.16,-232 169,-232 180.1,-232 182.399,-179.197 175.898,-142.369\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"174.481,-135.237 178.935,-141.488 175.163,-138.669 175.845,-142.102 175.845,-142.102 175.845,-142.102 175.163,-138.669 172.756,-142.716 174.481,-135.237 174.481,-135.237\"/>\n",
"<text text-anchor=\"start\" x=\"152\" y=\"-249.8\" font-family=\"Lato\" font-size=\"14.00\">a &amp; b</text>\n",
"<text text-anchor=\"start\" x=\"153\" y=\"-235.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">\u24ff</text>\n",
"<text text-anchor=\"start\" x=\"169\" y=\"-235.8\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">\u2776</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;2 -->\n",
"<g id=\"edge9\" class=\"edge\"><title>2&#45;&gt;2</title>\n",
......@@ -176,7 +176,7 @@
"</svg>\n"
],
"text": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7ffb2c16a630> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f0d2406cc00> >"
]
}
],
......
......@@ -64,11 +64,11 @@
"<!-- Generated by graphviz version 2.38.0 (20140413.2041)\n",
" -->\n",
"<!-- Title: G Pages: 1 -->\n",
"<svg width=\"419pt\" height=\"184pt\"\n",
" viewBox=\"0.00 0.00 419.00 184.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 1) rotate(0) translate(4 180)\">\n",
"<svg width=\"419pt\" height=\"202pt\"\n",
" viewBox=\"0.00 0.00 419.00 202.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 1) rotate(0) translate(4 198)\">\n",
"<title>G</title>\n",
"<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-180 415,-180 415,4 -4,4\"/>\n",
"<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-198 415,-198 415,4 -4,4\"/>\n",
"<!-- I -->\n",
"<!-- 0 -->\n",
"<g id=\"node2\" class=\"node\"><title>0</title>\n",
......@@ -117,25 +117,25 @@
"</g>\n",
"<!-- 2 -->\n",
"<g id=\"node5\" class=\"node\"><title>2</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"393\" cy=\"-99\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"393\" y=\"-95.3\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"283.5\" cy=\"-143\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"283.5\" y=\"-139.3\" font-family=\"Lato\" font-size=\"14.00\">2</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;2 -->\n",
"<g id=\"edge6\" class=\"edge\"><title>1&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M190.278,-122.894C214.315,-141.67 260.899,-171.444 302,-159 329.774,-150.591 356.811,-130.471 373.881,-115.843\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"379.274,-111.117 376.085,-118.1 376.642,-113.424 374.009,-115.73 374.009,-115.73 374.009,-115.73 376.642,-113.424 371.933,-113.361 379.274,-111.117 379.274,-111.117\"/>\n",
"<text text-anchor=\"start\" x=\"265\" y=\"-164.8\" font-family=\"Lato\" font-size=\"14.00\">!c &amp; d</text>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M188.416,-124.722C195.199,-131.009 203.812,-137.563 213,-141 227.404,-146.388 244.685,-146.908 258.412,-146.072\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"265.631,-145.49 258.907,-149.192 262.143,-145.771 258.654,-146.052 258.654,-146.052 258.654,-146.052 262.143,-145.771 258.401,-142.912 265.631,-145.49 265.631,-145.49\"/>\n",
"<text text-anchor=\"start\" x=\"223.5\" y=\"-149.8\" font-family=\"Lato\" font-size=\"14.00\">!d</text>\n",
"</g>\n",
"<!-- 3 -->\n",
"<g id=\"node6\" class=\"node\"><title>3</title>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"283.5\" cy=\"-99\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"283.5\" y=\"-95.3\" font-family=\"Lato\" font-size=\"14.00\">3</text>\n",
"<ellipse fill=\"#ffffaa\" stroke=\"black\" cx=\"393\" cy=\"-92\" rx=\"18\" ry=\"18\"/>\n",
"<text text-anchor=\"middle\" x=\"393\" y=\"-88.3\" font-family=\"Lato\" font-size=\"14.00\">3</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;3 -->\n",
"<g id=\"edge7\" class=\"edge\"><title>1&#45;&gt;3</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M195.152,-108.988C209.762,-108.77 229.617,-108.059 247,-106 250.725,-105.559 254.645,-104.943 258.464,-104.257\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"265.61,-102.881 259.332,-107.298 262.173,-103.543 258.737,-104.204 258.737,-104.204 258.737,-104.204 262.173,-103.543 258.141,-101.111 265.61,-102.881 265.61,-102.881\"/>\n",
"<text text-anchor=\"start\" x=\"223.5\" y=\"-111.8\" font-family=\"Lato\" font-size=\"14.00\">!d</text>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M194.955,-107.056C213.394,-105.37 240.969,-102.908 265,-101 300.698,-98.1662 342.076,-95.3147 367.648,-93.6028\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"374.738,-93.1303 367.963,-96.7389 371.246,-93.363 367.753,-93.5958 367.753,-93.5958 367.753,-93.5958 371.246,-93.363 367.544,-90.4528 374.738,-93.1303 374.738,-93.1303\"/>\n",
"<text text-anchor=\"start\" x=\"265\" y=\"-104.8\" font-family=\"Lato\" font-size=\"14.00\">!c &amp; d</text>\n",
"</g>\n",
"<!-- 4&#45;&gt;4 -->\n",
"<g id=\"edge13\" class=\"edge\"><title>4&#45;&gt;4</title>\n",
......@@ -145,39 +145,39 @@
"</g>\n",
"<!-- 2&#45;&gt;1 -->\n",
"<g id=\"edge8\" class=\"edge\"><title>2&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M377.812,-89.0507C354.64,-74.0075 307.035,-48.1189 265,-57 239.248,-62.4409 213.545,-78.3348 196.057,-91.1322\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"190.453,-95.3338 194.164,-88.6143 193.253,-93.2342 196.053,-91.1346 196.053,-91.1346 196.053,-91.1346 193.253,-93.2342 197.943,-93.6549 190.453,-95.3338 190.453,-95.3338\"/>\n",
"<text text-anchor=\"start\" x=\"280\" y=\"-60.8\" font-family=\"Lato\" font-size=\"14.00\">c</text>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M268.237,-132.973C261.978,-129.002 254.385,-124.739 247,-122 232.611,-116.663 215.792,-113.477 201.927,-111.597\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"194.974,-110.728 202.311,-108.47 198.447,-111.162 201.92,-111.596 201.92,-111.596 201.92,-111.596 198.447,-111.162 201.53,-114.722 194.974,-110.728 194.974,-110.728\"/>\n",
"<text text-anchor=\"start\" x=\"213\" y=\"-125.8\" font-family=\"Lato\" font-size=\"14.00\">c &amp; d</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;2 -->\n",
"<g id=\"edge9\" class=\"edge\"><title>2&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M383.767,-114.541C381.169,-124.909 384.246,-135 393,-135 399.702,-135 403.077,-129.085 403.124,-121.659\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"402.233,-114.541 406.229,-121.095 402.668,-118.014 403.103,-121.487 403.103,-121.487 403.103,-121.487 402.668,-118.014 399.977,-121.879 402.233,-114.541 402.233,-114.541\"/>\n",
"<text text-anchor=\"start\" x=\"387.5\" y=\"-138.8\" font-family=\"Lato\" font-size=\"14.00\">!c</text>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M274.521,-158.916C272.179,-169.15 275.172,-179 283.5,-179 289.876,-179 293.125,-173.226 293.246,-165.927\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"292.479,-158.916 296.372,-165.532 292.86,-162.395 293.241,-165.874 293.241,-165.874 293.241,-165.874 292.86,-162.395 290.11,-166.217 292.479,-158.916 292.479,-158.916\"/>\n",
"<text text-anchor=\"start\" x=\"277\" y=\"-182.8\" font-family=\"Lato\" font-size=\"14.00\">!d</text>\n",
"</g>\n",
"<!-- 3&#45;&gt;1 -->\n",
"<g id=\"edge10\" class=\"edge\"><title>3&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M266.525,-92.366C260.514,-90.2005 253.548,-88.0768 247,-87 232.089,-84.548 227.616,-83.1619 213,-87 207.831,-88.3574 202.625,-90.5725 197.776,-93.0866\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"191.42,-96.6478 195.987,-90.4779 194.474,-94.9369 197.527,-93.2259 197.527,-93.2259 197.527,-93.2259 194.474,-94.9369 199.067,-95.9739 191.42,-96.6478 191.42,-96.6478\"/>\n",
"<text text-anchor=\"start\" x=\"213\" y=\"-90.8\" font-family=\"Lato\" font-size=\"14.00\">c &amp; d</text>\n",
"<!-- 2&#45;&gt;3 -->\n",
"<g id=\"edge10\" class=\"edge\"><title>2&#45;&gt;3</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M300.362,-135.475C318.807,-126.724 349.364,-112.227 370.073,-102.403\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"376.422,-99.3903 371.448,-105.237 373.26,-100.891 370.098,-102.391 370.098,-102.391 370.098,-102.391 373.26,-100.891 368.748,-99.5448 376.422,-99.3903 376.422,-99.3903\"/>\n",
"<text text-anchor=\"start\" x=\"320\" y=\"-128.8\" font-family=\"Lato\" font-size=\"14.00\">!c &amp; d</text>\n",
"</g>\n",
"<!-- 3&#45;&gt;2 -->\n",
"<g id=\"edge11\" class=\"edge\"><title>3&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M301.772,-99C319.638,-99 347.686,-99 367.767,-99\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"374.771,-99 367.771,-102.15 371.271,-99 367.771,-99.0001 367.771,-99.0001 367.771,-99.0001 371.271,-99 367.771,-95.8501 374.771,-99 374.771,-99\"/>\n",
"<text text-anchor=\"start\" x=\"320\" y=\"-102.8\" font-family=\"Lato\" font-size=\"14.00\">!c &amp; d</text>\n",
"<!-- 3&#45;&gt;1 -->\n",
"<g id=\"edge11\" class=\"edge\"><title>3&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M375.482,-87.5706C351.175,-81.6713 304.39,-72.6745 265,-79 242.525,-82.6091 218.077,-90.9312 200.187,-97.8967\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"193.429,-100.585 198.769,-95.0706 196.681,-99.2911 199.933,-97.9975 199.933,-97.9975 199.933,-97.9975 196.681,-99.2911 201.098,-100.924 193.429,-100.585 193.429,-100.585\"/>\n",
"<text text-anchor=\"start\" x=\"280\" y=\"-82.8\" font-family=\"Lato\" font-size=\"14.00\">c</text>\n",
"</g>\n",
"<!-- 3&#45;&gt;3 -->\n",
"<g id=\"edge12\" class=\"edge\"><title>3&#45;&gt;3</title>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M274.521,-114.916C272.179,-125.15 275.172,-135 283.5,-135 289.876,-135 293.125,-129.226 293.246,-121.927\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"292.479,-114.916 296.372,-121.532 292.86,-118.395 293.241,-121.874 293.241,-121.874 293.241,-121.874 292.86,-118.395 290.11,-122.217 292.479,-114.916 292.479,-114.916\"/>\n",
"<text text-anchor=\"start\" x=\"277\" y=\"-138.8\" font-family=\"Lato\" font-size=\"14.00\">!d</text>\n",
"<path fill=\"none\" stroke=\"black\" d=\"M383.767,-107.541C381.169,-117.909 384.246,-128 393,-128 399.702,-128 403.077,-122.085 403.124,-114.659\"/>\n",
"<polygon fill=\"black\" stroke=\"black\" points=\"402.233,-107.541 406.229,-114.095 402.668,-111.014 403.103,-114.487 403.103,-114.487 403.103,-114.487 402.668,-111.014 399.977,-114.879 402.233,-107.541 402.233,-107.541\"/>\n",
"<text text-anchor=\"start\" x=\"387.5\" y=\"-131.8\" font-family=\"Lato\" font-size=\"14.00\">!c</text>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f0d8c2c98a0> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f23c1786450> >"
]
}
],
......@@ -204,113 +204,113 @@
"output_type": "pyout",
"prompt_number": 3,
"svg": [
"<svg height=\"351pt\" viewBox=\"0.00 0.00 226.36 351.00\" width=\"226pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<svg height=\"351pt\" viewBox=\"0.00 0.00 237.00 351.00\" width=\"237pt\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g class=\"graph\" id=\"graph0\" transform=\"scale(1 1) rotate(0) translate(4 347)\">\n",
"<title>G</title>\n",
"<polygon fill=\"white\" points=\"-4,4 -4,-347 222.356,-347 222.356,4 -4,4\" stroke=\"none\"/>\n",
"<polygon fill=\"white\" points=\"-4,4 -4,-347 233,-347 233,4 -4,4\" stroke=\"none\"/>\n",
"<!-- I -->\n",
"<!-- 0 -->\n",
"<g class=\"node\" id=\"node2\"><title>0</title>\n",
"<ellipse cx=\"120.356\" cy=\"-287\" fill=\"none\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n",
"<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"120.356\" y=\"-283.3\">0</text>\n",
"<ellipse cx=\"131\" cy=\"-287\" fill=\"none\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n",
"<text 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\"><title>I-&gt;0</title>\n",
"<path d=\"M120.356,-341.845C120.356,-340.206 120.356,-325.846 120.356,-312.368\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"120.356,-305.058 123.506,-312.058 120.356,-308.558 120.356,-312.058 120.356,-312.058 120.356,-312.058 120.356,-308.558 117.206,-312.058 120.356,-305.058 120.356,-305.058\" stroke=\"black\"/>\n",
"<path d=\"M131,-341.845C131,-340.206 131,-325.846 131,-312.368\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"131,-305.058 134.15,-312.058 131,-308.558 131,-312.058 131,-312.058 131,-312.058 131,-308.558 127.85,-312.058 131,-305.058 131,-305.058\" stroke=\"black\"/>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g class=\"edge\" id=\"edge2\"><title>0-&gt;0</title>\n",
"<path d=\"M137.393,-293.379C147.214,-294.681 156.356,-292.555 156.356,-287 156.356,-282.834 151.214,-280.596 144.499,-280.287\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"137.393,-280.621 144.238,-277.146 140.89,-280.457 144.386,-280.292 144.386,-280.292 144.386,-280.292 140.89,-280.457 144.533,-283.439 137.393,-280.621 137.393,-280.621\" stroke=\"black\"/>\n",
"<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"174.856\" y=\"-283.3\">a &amp; !b</text>\n",
"<path d=\"M148.037,-293.379C157.858,-294.681 167,-292.555 167,-287 167,-282.834 161.858,-280.596 155.143,-280.287\" fill=\"none\" stroke=\"black\"/>\n",
"<polygon fill=\"black\" points=\"148.037,-280.621 154.882,-277.146 151.533,-280.457 155.03,-280.292 155.03,-280.292 155.03,-280.292 151.533,-280.457 155.177,-283.439 148.037,-280.621 148.037,-280.621\" stroke=\"black\"/>\n",
"<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"185.5\" y=\"-283.3\">a &amp; !b</text>\n",
"</g>\n",
"<!-- 1 -->\n",
"<g class=\"node\" id=\"node3\"><title>1</title>\n",
"<ellipse cx=\"67.3561\" cy=\"-196\" fill=\"none\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n",
"<ellipse cx=\"67.3561\" cy=\"-196\" fill=\"none\" rx=\"22\" ry=\"22\" stroke=\"black\"/>\n",
"<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"67.3561\" y=\"-192.3\">1</text>\n",
"<ellipse cx=\"78\" cy=\"-196\" fill=\"none\" rx=\"18\" ry=\"18\" stroke=\"black\"/>\n",
"<ellipse cx=\"78\" cy=\"-196\" fill=\"none\" rx=\"22\" ry=\"22\" stroke=\"black\"/>\n",
"<text font-family=\"Times,serif\" font-size=\"14.00\" text-anchor=\"middle\" x=\"78\" y=\"-192.3\">1</text>\n",