translate: enable a restricted form of ltl-split for TGBA/BA

Fixes #267

* spot/twaalgos/gfguarantee.cc: Fix a typo when comparing automata
sizes.
* spot/twaalgos/translate.cc, spot/twaalgos/translate.hh: Use
ltl-split even for BA/TGBA, but only of conjunctions with GF(..)
in those cases.
* tests/core/ltl2tgba2.test: Adjust and add the example of #267.
* tests/core/degenid.test, tests/core/parity2.test,
tests/core/stutter-tgba.test, tests/python/automata.ipynb,
tests/python/highlighting.ipynb, tests/python/stutter-inv.ipynb,
bin/spot-x.cc: Adjust.
This commit is contained in:
Alexandre Duret-Lutz 2018-06-28 23:02:26 +02:00
parent 4235b007f3
commit f5f5daec9a
11 changed files with 1338 additions and 1494 deletions

View file

@ -46,8 +46,7 @@ more rules based on automata-based implication checks. The default value \
depends on the --low/--medium/--high settings.") },
{ nullptr, 0, nullptr, 0, "Translation options:", 0 },
{ DOC("ltl-split", "Set to 0 to disable the translation of automata \
as product or sum of subformulas. This is currently used only when \
building automata with generic acceptance conditions.") },
as product or sum of subformulas.") },
{ DOC("comp-susp", "Set to 1 to enable compositional suspension, \
as described in our SPIN'13 paper (see Bibliography below). Set to 2, \
to build only the skeleton TGBA without composing it. Set to 0 (the \

View file

@ -418,7 +418,7 @@ namespace spot
if (!is_terminal_automaton(aut, &si2, true))
return reduced;
do_g_f_terminal_inplace(si2, state_based);
if (aut->num_states() <= reduced->num_states())
if (aut->num_states() < reduced->num_states())
return aut;
}
return reduced;

View file

@ -105,7 +105,8 @@ namespace spot
simpl_owned_ = simpl_ = new tl_simplifier(options, dict);
}
twa_graph_ptr translator::run(formula* f)
twa_graph_ptr translator::run_aux(formula r)
{
#define PREF_ (pref_ & (Small | Deterministic))
@ -118,49 +119,6 @@ namespace spot
set_pref(pref_ | postprocessor::Deterministic);
}
// Do we want to relabel Boolean subformulas?
// If we have a huge formula such as
// (a1 & a2 & ... & an) U (b1 | b2 | ... | bm)
// then it is more efficient to translate
// a U b
// and then fix the automaton. We use relabel_bse() to find
// sub-formulas that are Boolean but do not have common terms.
//
// This rewriting is enabled only if the formula
// 1) has some Boolean subformula
// 2) has more than relabel_bool_ atomic propositions (the default
// is 4, but this can be changed)
// 3) relabel_bse() actually reduces the number of atomic
// propositions.
relabeling_map m;
formula to_work_on = *f;
if (relabel_bool_ > 0)
{
bool has_boolean_sub = false; // that is not atomic
std::set<formula> aps;
to_work_on.traverse([&](const formula& f)
{
if (f.is(op::ap))
aps.insert(f);
else if (f.is_boolean())
has_boolean_sub = true;
return false;
});
unsigned atomic_props = aps.size();
if (has_boolean_sub && (atomic_props >= (unsigned) relabel_bool_))
{
formula relabeled = relabel_bse(to_work_on, Pnn, &m);
if (m.size() < atomic_props)
to_work_on = relabeled;
else
m.clear();
}
}
formula r = simpl_->simplify(to_work_on);
if (to_work_on == *f)
*f = r;
// This helps ltl_to_tgba_fm() to order BDD variables in a more
// natural way (improving the degeneralization).
simpl_->clear_as_bdd_cache();
@ -168,8 +126,7 @@ namespace spot
twa_graph_ptr aut;
twa_graph_ptr aut2 = nullptr;
if (ltl_split_ && (type_ == Generic
|| (type_ & Parity)) && !r.is_syntactic_obligation())
if (ltl_split_ && !r.is_syntactic_obligation())
{
formula r2 = r;
unsigned leading_x = 0;
@ -178,11 +135,11 @@ namespace spot
r2 = r2[0];
++leading_x;
}
if (type_ == Generic)
if (type_ == Generic || type_ == TGBA)
{
// F(q|u|f) = q|F(u)|F(f)
// F(q|u|f) = q|F(u)|F(f) only for generic acceptance
// G(q&e&f) = q&G(e)&G(f)
bool want_u = r2.is({op::F, op::Or});
bool want_u = r2.is({op::F, op::Or}) && (type_ == Generic);
if (want_u || r2.is({op::G, op::And}))
{
std::vector<formula> susp;
@ -204,7 +161,12 @@ namespace spot
r2 = formula::multop(op2, susp);
}
}
if (r2.is_syntactic_obligation() || !r2.is(op::And, op::Or))
if (r2.is_syntactic_obligation() || !r2.is(op::And, op::Or) ||
// For TGBA/BA we only do conjunction. There is nothing wrong
// with disjunction, but it seems to generated larger automata
// in many cases and it needs to be further investigated. Maybe
// this could be relaxed in the case of deterministic output.
(r2.is(op::Or) && (type_ == TGBA || type_ == BA)))
goto nosplit;
bool is_and = r2.is(op::And);
@ -212,16 +174,38 @@ namespace spot
std::vector<formula> oblg;
std::vector<formula> susp;
std::vector<formula> rest;
bool want_g = type_ == TGBA || type_ == BA;
for (formula child: r2)
{
if (child.is_syntactic_obligation())
oblg.push_back(child);
else if (child.is_eventual() && child.is_universal()
&& (type_ == Generic))
&& (!want_g || child.is(op::G)))
susp.push_back(child);
else
rest.push_back(child);
}
if (!susp.empty())
{
// The only cases where we accept susp and rest to be both
// non-empty is when doing arbitrary acceptance, or when doing
// Generic or TGBA.
if (!rest.empty() && !(type_ == Generic || type_ == TGBA))
{
rest.insert(rest.end(), susp.begin(), susp.end());
susp.clear();
}
// For Parity, we want to translate all suspendable
// formulas at once.
if (rest.empty() && type_ & Parity)
susp = { formula::multop(r2.kind(), susp) };
}
// For TGBA and BA, we only split if there is something to
// suspend.
if (susp.empty() && (type_ == TGBA || type_ == BA))
goto nosplit;
option_map om;
if (opt_)
om = *opt_;
@ -238,34 +222,26 @@ namespace spot
return run(f);
};
// std::cerr << "splitting\n";
aut = nullptr;
// All obligations can be converted into a minimal WDBA.
if (!oblg.empty())
{
formula oblg_f = formula::multop(r2.kind(), oblg);
//std::cerr << "oblg: " << oblg_f << '\n';
aut = transrun(oblg_f);
}
if (!rest.empty())
{
formula rest_f = formula::multop(r2.kind(), rest);
// In case type_ is Parity, all suspendable formulas have
// been put into rest_f. But if the entire rest_f is
// suspendable, we want to handle it like so.
if (rest_f.is_eventual() && rest_f.is_universal())
{
assert(susp.empty());
susp.push_back(rest_f);
}
//std::cerr << "rest: " << rest_f << '\n';
twa_graph_ptr rest_aut = transrun(rest_f);
if (aut == nullptr)
aut = rest_aut;
else if (is_and)
aut = product(aut, rest_aut);
else
{
twa_graph_ptr rest_aut = transrun(rest_f);
if (aut == nullptr)
aut = rest_aut;
else if (is_and)
aut = product(aut, rest_aut);
else
aut = product_or(aut, rest_aut);
}
aut = product_or(aut, rest_aut);
}
if (!susp.empty())
{
@ -273,6 +249,7 @@ namespace spot
// Each suspendable formula separately
for (formula f: susp)
{
//std::cerr << "susp: " << f << '\n';
twa_graph_ptr one = transrun(f);
if (!susp_aut)
susp_aut = one;
@ -370,6 +347,56 @@ namespace spot
aut = std::move(aut2);
}
return aut;
}
twa_graph_ptr translator::run(formula* f)
{
// Do we want to relabel Boolean subformulas?
// If we have a huge formula such as
// (a1 & a2 & ... & an) U (b1 | b2 | ... | bm)
// then it is more efficient to translate
// a U b
// and then fix the automaton. We use relabel_bse() to find
// sub-formulas that are Boolean but do not have common terms.
//
// This rewriting is enabled only if the formula
// 1) has some Boolean subformula
// 2) has more than relabel_bool_ atomic propositions (the default
// is 4, but this can be changed)
// 3) relabel_bse() actually reduces the number of atomic
// propositions.
relabeling_map m;
formula to_work_on = *f;
if (relabel_bool_ > 0)
{
bool has_boolean_sub = false; // that is not atomic
std::set<formula> aps;
to_work_on.traverse([&](const formula& f)
{
if (f.is(op::ap))
aps.insert(f);
else if (f.is_boolean())
has_boolean_sub = true;
return false;
});
unsigned atomic_props = aps.size();
if (has_boolean_sub && (atomic_props >= (unsigned) relabel_bool_))
{
formula relabeled = relabel_bse(to_work_on, Pnn, &m);
if (m.size() < atomic_props)
to_work_on = relabeled;
else
m.clear();
}
}
formula r = simpl_->simplify(to_work_on);
if (to_work_on == *f)
*f = r;
auto aut = run_aux(r);
if (!m.empty())
relabel_here(aut, &m);
return aut;

View file

@ -138,6 +138,7 @@ namespace spot
protected:
void setup_opt(const option_map* opt);
void build_simplifier(const bdd_dict_ptr& dict);
twa_graph_ptr run_aux(formula f);
private:
tl_simplifier* simpl_;

View file

@ -1,7 +1,7 @@
#!/bin/sh
# -*- coding: utf-8 -*-
# Copyright (C) 2011, 2013, 2014, 2015, 2017 Laboratoire de Recherche
# et Développement de l'Epita (LRDE).
# Copyright (C) 2011, 2013, 2014, 2015, 2017, 2018 Laboratoire de
# Recherche et Développement de l'Epita (LRDE).
#
# This file is part of Spot, a model checking library.
#
@ -239,7 +239,9 @@ properties: trans-labels explicit-labels state-acc deterministic
properties: stutter-invariant
--BODY--
State: 0
[0] 1
[0&1&2] 1
[0&!2] 2
[0&!1&2] 3
State: 1 {0}
[1&2] 1
[!2] 2

View file

@ -362,12 +362,14 @@ EOF
diff output expected
# These four formulas appear in a NEWS entry for Spot 2.6
# The first four formulas appear in a NEWS entry for Spot 2.6
# The 5th one is from issue #267.
cat >formulas <<EOF
GF((a & XXa) | (!a & XX!a)), 4,8, 4,8, 6,14, 7,14
GF((a & XXXa) | (!a & XXX!a)), 7,14, 8,16, 8,18, 15,30
GF(((a & Xb) | XXc) & Xd), 4,60, 4,64, 4,68, 5,80
GF(((a & Xb) | XXc) & Xd), 4,64, 4,64, 5,80, 5,80
GF((b | Fa) & (b R Xb)), 2,4, 2,4, 3,6, 3,12
G(F(a & Xa) & F(a & X!a)), 2,4, 2,4, 4,8, 4,8
EOF
ltl2tgba -Fformulas/1 --stats='%f, %s,%t' |

View file

@ -426,7 +426,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 6
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: Buchi
@ -435,23 +435,21 @@ properties: trans-labels explicit-labels trans-acc
--BODY--
State: 0
[0] 0
[t] 2
[0&1&2] 3
[!0] 1
[0&1&2] 2
State: 1
[2] 4
State: 2
[t] 3
[1&2] 4
[t] 5
State: 2
[!0] 1
[0&!1&2] 2
[0&1&2] 2 {0}
State: 3
[2] 1
[0&!1&2] 3
[0&1&2] 3 {0}
[0] 3
[0&1&2] 4
State: 4
[0&!1&2] 4
[0&1&2] 4 {0}
State: 5
[0&1&2] 4
[0] 5
--END--
HOA: v1
name: "FGa"
@ -489,7 +487,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 6
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: Rabin 1
@ -498,23 +496,21 @@ properties: trans-labels explicit-labels trans-acc
--BODY--
State: 0
[0] 0
[t] 2
[0&1&2] 3
[!0] 1
[0&1&2] 2
State: 1
[2] 4
State: 2
[t] 3
[1&2] 4
[t] 5
State: 2
[!0] 1
[0&!1&2] 2
[0&1&2] 2 {1}
State: 3
[2] 1
[0&!1&2] 3
[0&1&2] 3 {1}
[0] 3
[0&1&2] 4
State: 4
[0&!1&2] 4
[0&1&2] 4 {1}
State: 5
[0&1&2] 4
[0] 5
--END--
HOA: v1
name: "FGa"
@ -552,7 +548,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 6
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: Buchi
@ -561,23 +557,21 @@ properties: trans-labels explicit-labels trans-acc
--BODY--
State: 0
[0] 0
[t] 2
[0&1&2] 3
[!0] 1
[0&1&2] 2
State: 1
[2] 4
State: 2
[t] 3
[1&2] 4
[t] 5
State: 2
[!0] 1
[0&!1&2] 2
[0&1&2] 2 {0}
State: 3
[2] 1
[0&!1&2] 3
[0&1&2] 3 {0}
[0] 3
[0&1&2] 4
State: 4
[0&!1&2] 4
[0&1&2] 4 {0}
State: 5
[0&1&2] 4
[0] 5
--END--
HOA: v1
name: "FGa"
@ -615,7 +609,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 6
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: Streett 1
@ -624,23 +618,21 @@ properties: trans-labels explicit-labels trans-acc colored
--BODY--
State: 0
[0] 0 {0}
[t] 2 {0}
[0&1&2] 3 {0}
[!0] 1 {0}
[0&1&2] 2 {0}
State: 1
[2] 4 {0}
State: 2
[t] 3 {0}
[1&2] 4 {0}
[t] 5 {0}
State: 2
[!0] 1 {0}
[0&!1&2] 2 {0}
[0&1&2] 2 {1}
State: 3
[2] 1 {0}
[0&!1&2] 3 {0}
[0&1&2] 3 {1}
[0] 3 {0}
[0&1&2] 4 {0}
State: 4
[0&!1&2] 4 {0}
[0&1&2] 4 {1}
State: 5
[0&1&2] 4 {0}
[0] 5 {0}
--END--
HOA: v1
name: "FGa"
@ -678,7 +670,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 6
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: parity min odd 3
@ -687,23 +679,21 @@ properties: trans-labels explicit-labels trans-acc colored
--BODY--
State: 0
[0] 0 {2}
[t] 2 {2}
[0&1&2] 3 {2}
[!0] 1 {2}
[0&1&2] 2 {2}
State: 1
[2] 4 {2}
State: 2
[t] 3 {2}
[1&2] 4 {2}
[t] 5 {2}
State: 2
[!0] 1 {2}
[0&!1&2] 2 {2}
[0&1&2] 2 {1}
State: 3
[2] 1 {2}
[0&!1&2] 3 {2}
[0&1&2] 3 {1}
[0] 3 {2}
[0&1&2] 4 {2}
State: 4
[0&!1&2] 4 {2}
[0&1&2] 4 {1}
State: 5
[0&1&2] 4 {2}
[0] 5 {2}
--END--
HOA: v1
name: "FGa"
@ -741,7 +731,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 6
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: parity max even 3
@ -750,23 +740,21 @@ properties: trans-labels explicit-labels trans-acc colored
--BODY--
State: 0
[0] 0 {1}
[t] 2 {1}
[0&1&2] 3 {1}
[!0] 1 {1}
[0&1&2] 2 {1}
State: 1
[2] 4 {1}
State: 2
[t] 3 {1}
[1&2] 4 {1}
[t] 5 {1}
State: 2
[!0] 1 {1}
[0&!1&2] 2 {1}
[0&1&2] 2 {2}
State: 3
[2] 1 {1}
[0&!1&2] 3 {1}
[0&1&2] 3 {2}
[0] 3 {1}
[0&1&2] 4 {1}
State: 4
[0&!1&2] 4 {1}
[0&1&2] 4 {2}
State: 5
[0&1&2] 4 {1}
[0] 5 {1}
--END--
EOF
diff expected2 res2
@ -1182,7 +1170,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 10
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: Rabin 1
@ -1190,46 +1178,24 @@ Acceptance: 2 Fin(0) & Inf(1)
properties: trans-labels explicit-labels trans-acc deterministic
--BODY--
State: 0
[0&!1 | 0&!2] 0
[!0] 1
[0&!1 | 0&!2] 2
[0&1&2] 3
[0&1&2] 2
State: 1
[!1 | !2] 4
[1&2] 5
[!1 | !2] 3
[1&2] 4
State: 2
[!0&!1 | !0&!2] 1
[0&!1 | 0&!2] 2
[0&1&2] 3
[!0&1&2] 6
[0&!2] 0 {0}
[!0] 1
[0&!1&2] 2
[0&1&2] 2 {1}
State: 3
[!0&!2] 1
[0&!2] 2 {0}
[!0&!1&2] 7
[!0&1&2] 8
[0&!1&2] 9
[0&1&2] 9 {1}
[0&!1 | 0&!2] 3
[0&1&2] 4
State: 4
[0&!1 | 0&!2] 4
[0&1&2] 5
State: 5
[0&!2] 4 {0}
[0&!1&2] 5
[0&1&2] 5 {1}
State: 6
[!0&!1 | !2] 4
[0&2 | 1&2] 5
State: 7
[!2] 4
[2] 5
State: 8
[!2] 4
[2] 5
State: 9
[!0&!2] 1
[0&!2] 2 {0}
[!0&2] 8
[0&!1&2] 9
[0&1&2] 9 {1}
[0&!2] 3 {0}
[0&!1&2] 4
[0&1&2] 4 {1}
--END--
HOA: v1
name: "FGa"
@ -1268,7 +1234,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 10
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: Rabin 1
@ -1276,46 +1242,24 @@ Acceptance: 2 Fin(0) & Inf(1)
properties: trans-labels explicit-labels trans-acc deterministic
--BODY--
State: 0
[0&!1 | 0&!2] 0
[!0] 1
[0&!1 | 0&!2] 2
[0&1&2] 3
[0&1&2] 2
State: 1
[!1 | !2] 4
[1&2] 5
[!1 | !2] 3
[1&2] 4
State: 2
[!0&!1 | !0&!2] 1
[0&!1 | 0&!2] 2
[0&1&2] 3
[!0&1&2] 6
[0&!2] 0 {0}
[!0] 1
[0&!1&2] 2
[0&1&2] 2 {1}
State: 3
[!0&!2] 1
[0&!2] 2 {0}
[!0&!1&2] 7
[!0&1&2] 8
[0&!1&2] 9
[0&1&2] 9 {1}
[0&!1 | 0&!2] 3
[0&1&2] 4
State: 4
[0&!1 | 0&!2] 4
[0&1&2] 5
State: 5
[0&!2] 4 {0}
[0&!1&2] 5
[0&1&2] 5 {1}
State: 6
[!0&!1 | !2] 4
[0&2 | 1&2] 5
State: 7
[!2] 4
[2] 5
State: 8
[!2] 4
[2] 5
State: 9
[!0&!2] 1
[0&!2] 2 {0}
[!0&2] 8
[0&!1&2] 9
[0&1&2] 9 {1}
[0&!2] 3 {0}
[0&!1&2] 4
[0&1&2] 4 {1}
--END--
HOA: v1
name: "FGa"
@ -1354,7 +1298,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 10
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: parity max even 2
@ -1362,46 +1306,24 @@ Acceptance: 2 Fin(1) & Inf(0)
properties: trans-labels explicit-labels trans-acc deterministic
--BODY--
State: 0
[0&!1 | 0&!2] 0
[!0] 1
[0&!1 | 0&!2] 2
[0&1&2] 3
[0&1&2] 2
State: 1
[!1 | !2] 4
[1&2] 5
[!1 | !2] 3
[1&2] 4
State: 2
[!0&!1 | !0&!2] 1
[0&!1 | 0&!2] 2
[0&1&2] 3
[!0&1&2] 6
[0&!2] 0 {1}
[!0] 1
[0&!1&2] 2
[0&1&2] 2 {0}
State: 3
[!0&!2] 1
[0&!2] 2 {1}
[!0&!1&2] 7
[!0&1&2] 8
[0&!1&2] 9
[0&1&2] 9 {0}
[0&!1 | 0&!2] 3
[0&1&2] 4
State: 4
[0&!1 | 0&!2] 4
[0&1&2] 5
State: 5
[0&!2] 4 {1}
[0&!1&2] 5
[0&1&2] 5 {0}
State: 6
[!0&!1 | !2] 4
[0&2 | 1&2] 5
State: 7
[!2] 4
[2] 5
State: 8
[!2] 4
[2] 5
State: 9
[!0&!2] 1
[0&!2] 2 {1}
[!0&2] 8
[0&!1&2] 9
[0&1&2] 9 {0}
[0&!2] 3 {1}
[0&!1&2] 4
[0&1&2] 4 {0}
--END--
HOA: v1
name: "FGa"
@ -1440,7 +1362,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 10
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: parity min odd 3
@ -1449,46 +1371,24 @@ properties: trans-labels explicit-labels trans-acc colored
properties: deterministic
--BODY--
State: 0
[0&!1 | 0&!2] 0 {2}
[!0] 1 {2}
[0&!1 | 0&!2] 2 {2}
[0&1&2] 3 {2}
[0&1&2] 2 {2}
State: 1
[!1 | !2] 4 {2}
[1&2] 5 {2}
[!1 | !2] 3 {2}
[1&2] 4 {2}
State: 2
[!0&!1 | !0&!2] 1 {2}
[0&!1 | 0&!2] 2 {2}
[0&1&2] 3 {2}
[!0&1&2] 6 {2}
[0&!2] 0 {0}
[!0] 1 {2}
[0&!1&2] 2 {2}
[0&1&2] 2 {1}
State: 3
[!0&!2] 1 {2}
[0&!2] 2 {0}
[!0&!1&2] 7 {2}
[!0&1&2] 8 {2}
[0&!1&2] 9 {2}
[0&1&2] 9 {1}
[0&!1 | 0&!2] 3 {2}
[0&1&2] 4 {2}
State: 4
[0&!1 | 0&!2] 4 {2}
[0&1&2] 5 {2}
State: 5
[0&!2] 4 {0}
[0&!1&2] 5 {2}
[0&1&2] 5 {1}
State: 6
[!0&!1 | !2] 4 {2}
[0&2 | 1&2] 5 {2}
State: 7
[!2] 4 {2}
[2] 5 {2}
State: 8
[!2] 4 {2}
[2] 5 {2}
State: 9
[!0&!2] 1 {2}
[0&!2] 2 {0}
[!0&2] 8 {2}
[0&!1&2] 9 {2}
[0&1&2] 9 {1}
[0&!2] 3 {0}
[0&!1&2] 4 {2}
[0&1&2] 4 {1}
--END--
HOA: v1
name: "FGa"
@ -1527,7 +1427,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 10
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: parity min odd 3
@ -1536,46 +1436,24 @@ properties: trans-labels explicit-labels trans-acc colored
properties: deterministic
--BODY--
State: 0
[0&!1 | 0&!2] 0 {2}
[!0] 1 {2}
[0&!1 | 0&!2] 2 {2}
[0&1&2] 3 {2}
[0&1&2] 2 {2}
State: 1
[!1 | !2] 4 {2}
[1&2] 5 {2}
[!1 | !2] 3 {2}
[1&2] 4 {2}
State: 2
[!0&!1 | !0&!2] 1 {2}
[0&!1 | 0&!2] 2 {2}
[0&1&2] 3 {2}
[!0&1&2] 6 {2}
[0&!2] 0 {0}
[!0] 1 {2}
[0&!1&2] 2 {2}
[0&1&2] 2 {1}
State: 3
[!0&!2] 1 {2}
[0&!2] 2 {0}
[!0&!1&2] 7 {2}
[!0&1&2] 8 {2}
[0&!1&2] 9 {2}
[0&1&2] 9 {1}
[0&!1 | 0&!2] 3 {2}
[0&1&2] 4 {2}
State: 4
[0&!1 | 0&!2] 4 {2}
[0&1&2] 5 {2}
State: 5
[0&!2] 4 {0}
[0&!1&2] 5 {2}
[0&1&2] 5 {1}
State: 6
[!0&!1 | !2] 4 {2}
[0&2 | 1&2] 5 {2}
State: 7
[!2] 4 {2}
[2] 5 {2}
State: 8
[!2] 4 {2}
[2] 5 {2}
State: 9
[!0&!2] 1 {2}
[0&!2] 2 {0}
[!0&2] 8 {2}
[0&!1&2] 9 {2}
[0&1&2] 9 {1}
[0&!2] 3 {0}
[0&!1&2] 4 {2}
[0&1&2] 4 {1}
--END--
HOA: v1
name: "FGa"
@ -1614,7 +1492,7 @@ State: 1
--END--
HOA: v1
name: "(p0 W XXGp0) & G(Fp1 & FGp2)"
States: 10
States: 5
Start: 0
AP: 3 "p0" "p1" "p2"
acc-name: parity max even 4
@ -1623,46 +1501,24 @@ properties: trans-labels explicit-labels trans-acc colored
properties: deterministic
--BODY--
State: 0
[0&!1 | 0&!2] 0 {1}
[!0] 1 {1}
[0&!1 | 0&!2] 2 {1}
[0&1&2] 3 {1}
[0&1&2] 2 {1}
State: 1
[!1 | !2] 4 {1}
[1&2] 5 {1}
[!1 | !2] 3 {1}
[1&2] 4 {1}
State: 2
[!0&!1 | !0&!2] 1 {1}
[0&!1 | 0&!2] 2 {1}
[0&1&2] 3 {1}
[!0&1&2] 6 {1}
[0&!2] 0 {3}
[!0] 1 {1}
[0&!1&2] 2 {1}
[0&1&2] 2 {2}
State: 3
[!0&!2] 1 {1}
[0&!2] 2 {3}
[!0&!1&2] 7 {1}
[!0&1&2] 8 {1}
[0&!1&2] 9 {1}
[0&1&2] 9 {2}
[0&!1 | 0&!2] 3 {1}
[0&1&2] 4 {1}
State: 4
[0&!1 | 0&!2] 4 {1}
[0&1&2] 5 {1}
State: 5
[0&!2] 4 {3}
[0&!1&2] 5 {1}
[0&1&2] 5 {2}
State: 6
[!0&!1 | !2] 4 {1}
[0&2 | 1&2] 5 {1}
State: 7
[!2] 4 {1}
[2] 5 {1}
State: 8
[!2] 4 {1}
[2] 5 {1}
State: 9
[!0&!2] 1 {1}
[0&!2] 2 {3}
[!0&2] 8 {1}
[0&!1&2] 9 {1}
[0&1&2] 9 {2}
[0&!2] 3 {3}
[0&!1&2] 4 {1}
[0&1&2] 4 {2}
--END--
EOF
diff expected4 res4

View file

@ -26,13 +26,13 @@ ltl2tgba '!FG(a | Xa | G!a)' -H | autfilt -H --destut > pos.hoa
ltl2tgba 'FG(a | Xa | G!a)' -H | autfilt -H --destut > neg.hoa
autfilt pos.hoa --product neg.hoa -H > prod.hoa
autfilt --is-empty prod.hoa -q && exit 1
autfilt --states=7 prod.hoa -q
autfilt --states=5 prod.hoa -q
ltl2tgba '!FG(a | Xa | G!a)' -H | autfilt -H --instut > pos.hoa
ltl2tgba 'FG(a | Xa | G!a)' -H | autfilt -H --instut > neg.hoa
autfilt pos.hoa --product neg.hoa -H > prod.hoa
autfilt --is-empty prod.hoa -q && exit 1
autfilt --states=9 prod.hoa -q
autfilt --states=6 prod.hoa -q
# Check for issue #7.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -302,7 +302,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a00c1660> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f68605f5630> >"
]
},
"metadata": {},
@ -595,7 +595,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a00c1b40> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f68605f5ae0> >"
]
},
"metadata": {},
@ -804,7 +804,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a00c1b40> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f68605f5ae0> >"
]
},
"metadata": {},
@ -890,18 +890,18 @@
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Title: G(F(a &amp; Xa) &amp; F!a) Pages: 1 -->\n",
"<svg width=\"170pt\" height=\"178pt\"\n",
" viewBox=\"0.00 0.00 170.00 177.59\" 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 173.5945)\">\n",
"<svg width=\"170pt\" height=\"145pt\"\n",
" viewBox=\"0.00 0.00 170.00 144.59\" 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 140.5945)\">\n",
"<title>G(F(a &amp; Xa) &amp; F!a)</title>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-173.5945 166,-173.5945 166,4 -4,4\"/>\n",
"<text text-anchor=\"start\" x=\"25\" y=\"-155.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">G(F(a &amp; Xa) &amp; F!a)</text>\n",
"<text text-anchor=\"start\" x=\"34\" y=\"-141.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">Inf(</text>\n",
"<text text-anchor=\"start\" x=\"56\" y=\"-141.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"72\" y=\"-141.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)&amp;Inf(</text>\n",
"<text text-anchor=\"start\" x=\"108\" y=\"-141.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"<text text-anchor=\"start\" x=\"124\" y=\"-141.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)</text>\n",
"<text text-anchor=\"start\" x=\"37\" y=\"-127.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">[gen. Büchi 2]</text>\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-140.5945 166,-140.5945 166,4 -4,4\"/>\n",
"<text text-anchor=\"start\" x=\"25\" y=\"-122.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">G(F(a &amp; Xa) &amp; F!a)</text>\n",
"<text text-anchor=\"start\" x=\"34\" y=\"-108.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">Inf(</text>\n",
"<text text-anchor=\"start\" x=\"56\" y=\"-108.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"72\" y=\"-108.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)&amp;Inf(</text>\n",
"<text text-anchor=\"start\" x=\"108\" y=\"-108.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"<text text-anchor=\"start\" x=\"124\" y=\"-108.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)</text>\n",
"<text text-anchor=\"start\" x=\"37\" y=\"-94.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">[gen. Büchi 2]</text>\n",
"<!-- I -->\n",
"<!-- 0 -->\n",
"<g id=\"node2\" class=\"node\">\n",
@ -918,17 +918,10 @@
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M52.7643,-38.3763C52.2144,-47.9095 53.293,-56.5945 56,-56.5945 57.988,-56.5945 59.0977,-51.9106 59.3292,-45.6466\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"59.2357,-38.3763 62.4756,-45.3351 59.2808,-41.876 59.3258,-45.3757 59.3258,-45.3757 59.3258,-45.3757 59.2808,-41.876 56.1761,-45.4162 59.2357,-38.3763 59.2357,-38.3763\"/>\n",
"<text text-anchor=\"start\" x=\"50.5\" y=\"-75.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!a</text>\n",
"<text text-anchor=\"start\" x=\"48\" y=\"-60.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M50.9906,-38.1717C47.5451,-59.3126 49.2148,-86.5945 56,-86.5945 62.043,-86.5945 64.0285,-64.9541 61.9564,-45.2852\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"61.0094,-38.1717 65.0556,-44.6947 61.4713,-41.6411 61.9332,-45.1105 61.9332,-45.1105 61.9332,-45.1105 61.4713,-41.6411 58.8107,-45.5262 61.0094,-38.1717 61.0094,-38.1717\"/>\n",
"<text text-anchor=\"start\" x=\"52.5\" y=\"-90.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M49.6208,-37.6318C48.3189,-47.4524 50.4453,-56.5945 56,-56.5945 60.166,-56.5945 62.4036,-51.4521 62.7128,-44.7378\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"62.3792,-37.6318 65.8541,-44.4764 62.5434,-41.128 62.7076,-44.6241 62.7076,-44.6241 62.7076,-44.6241 62.5434,-41.128 59.561,-44.7719 62.3792,-37.6318 62.3792,-37.6318\"/>\n",
"<text text-anchor=\"start\" x=\"52.5\" y=\"-75.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"<text text-anchor=\"start\" x=\"48\" y=\"-60.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 1 -->\n",
"<g id=\"node3\" class=\"node\">\n",
@ -937,33 +930,33 @@
"<text text-anchor=\"middle\" x=\"144\" y=\"-16.8945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">1</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M74.2337,-20.5945C87.0948,-20.5945 104.4907,-20.5945 118.6942,-20.5945\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"125.7897,-20.5945 118.7897,-23.7446 122.2897,-20.5946 118.7897,-20.5946 118.7897,-20.5946 118.7897,-20.5946 122.2897,-20.5946 118.7897,-17.4446 125.7897,-20.5945 125.7897,-20.5945\"/>\n",
"<text text-anchor=\"start\" x=\"96.5\" y=\"-39.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"<text text-anchor=\"start\" x=\"92\" y=\"-24.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"94.5\" y=\"-39.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!a</text>\n",
"<text text-anchor=\"start\" x=\"92\" y=\"-24.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;0 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>1&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M129.247,-10.1729C118.9796,-4.1758 104.8748,1.5945 92,-1.5945 87.1146,-2.8046 82.1612,-4.8119 77.5558,-7.0792\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"71.1057,-10.5245 75.7959,-4.448 74.1929,-8.8755 77.2801,-7.2264 77.2801,-7.2264 77.2801,-7.2264 74.1929,-8.8755 78.7642,-10.0049 71.1057,-10.5245 71.1057,-10.5245\"/>\n",
"<text text-anchor=\"start\" x=\"96.5\" y=\"-5.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M136.3321,-36.8848C134.4831,-46.9837 137.0391,-56.5945 144,-56.5945 149.2207,-56.5945 151.9636,-51.1884 152.2287,-44.2249\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"151.6679,-36.8848 155.3421,-43.6244 151.9346,-40.3746 152.2013,-43.8645 152.2013,-43.8645 152.2013,-43.8645 151.9346,-40.3746 149.0604,-44.1045 151.6679,-36.8848 151.6679,-36.8848\"/>\n",
"<text text-anchor=\"start\" x=\"140.5\" y=\"-75.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"<text text-anchor=\"start\" x=\"136\" y=\"-60.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"138.5\" y=\"-75.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!a</text>\n",
"<text text-anchor=\"start\" x=\"136\" y=\"-60.3945\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"</g>\n",
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a00c1630> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f68605f5a50> >"
]
},
"metadata": {},
@ -1061,7 +1054,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a0114060> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f68605f5b70> >"
]
},
"metadata": {},
@ -1101,18 +1094,18 @@
"<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n",
" -->\n",
"<!-- Pages: 1 -->\n",
"<svg width=\"338pt\" height=\"360pt\"\n",
" viewBox=\"0.00 0.00 337.98 360.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
"<g id=\"graph0\" class=\"graph\" transform=\"scale(.997 .997) rotate(0) translate(4 357.0877)\">\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-357.0877 335,-357.0877 335,4 -4,4\"/>\n",
"<text text-anchor=\"start\" x=\"89\" y=\"-338.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">(Inf(</text>\n",
"<text text-anchor=\"start\" x=\"114\" y=\"-338.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"130\" y=\"-338.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)&amp;Inf(</text>\n",
"<text text-anchor=\"start\" x=\"166\" y=\"-338.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"<text text-anchor=\"start\" x=\"182\" y=\"-338.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)) | Inf(</text>\n",
"<text text-anchor=\"start\" x=\"222\" y=\"-338.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"238\" y=\"-338.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)</text>\n",
"<text text-anchor=\"start\" x=\"130.5\" y=\"-324.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">[Fin&#45;less 3]</text>\n",
"<svg width=\"339pt\" height=\"328pt\"\n",
" viewBox=\"0.00 0.00 339.00 328.09\" 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 324.0877)\">\n",
"<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-324.0877 335,-324.0877 335,4 -4,4\"/>\n",
"<text text-anchor=\"start\" x=\"89\" y=\"-305.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">(Inf(</text>\n",
"<text text-anchor=\"start\" x=\"114\" y=\"-305.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"130\" y=\"-305.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)&amp;Inf(</text>\n",
"<text text-anchor=\"start\" x=\"166\" y=\"-305.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"<text text-anchor=\"start\" x=\"182\" y=\"-305.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)) | Inf(</text>\n",
"<text text-anchor=\"start\" x=\"222\" y=\"-305.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"<text text-anchor=\"start\" x=\"238\" y=\"-305.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">)</text>\n",
"<text text-anchor=\"start\" x=\"130.5\" y=\"-291.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">[Fin&#45;less 3]</text>\n",
"<!-- I -->\n",
"<!-- 5 -->\n",
"<g id=\"node2\" class=\"node\">\n",
@ -1133,11 +1126,11 @@
"<text text-anchor=\"middle\" x=\"137\" y=\"-214.3877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">0</text>\n",
"</g>\n",
"<!-- 5&#45;&gt;0 -->\n",
"<g id=\"edge16\" class=\"edge\">\n",
"<g id=\"edge14\" class=\"edge\">\n",
"<title>5&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M59.2987,-97.858C63.9004,-119.1522 73.8056,-155.195 92,-181.0877 98.2094,-189.9244 107.068,-197.8267 115.2855,-204.0366\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"121.3899,-208.443 113.8704,-206.9001 118.552,-206.3945 115.7141,-204.346 115.7141,-204.346 115.7141,-204.346 118.552,-206.3945 117.5577,-201.7919 121.3899,-208.443 121.3899,-208.443\"/>\n",
"<text text-anchor=\"middle\" x=\"96.5\" y=\"-193.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">1</text>\n",
"<text text-anchor=\"start\" x=\"93\" y=\"-193.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"</g>\n",
"<!-- 1 -->\n",
"<g id=\"node4\" class=\"node\">\n",
@ -1146,11 +1139,11 @@
"<text text-anchor=\"middle\" x=\"225\" y=\"-196.3877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">1</text>\n",
"</g>\n",
"<!-- 5&#45;&gt;1 -->\n",
"<g id=\"edge14\" class=\"edge\">\n",
"<g id=\"edge12\" class=\"edge\">\n",
"<title>5&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M68.2009,-93.4848C80.3253,-106.3497 99.8305,-125.8734 119,-140.0877 145.785,-159.9489 179.7906,-178.1074 201.959,-189.1251\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"208.4376,-192.3091 200.7659,-192.0486 205.2965,-190.7653 202.1553,-189.2215 202.1553,-189.2215 202.1553,-189.2215 205.2965,-190.7653 203.5447,-186.3945 208.4376,-192.3091 208.4376,-192.3091\"/>\n",
"<text text-anchor=\"start\" x=\"133.5\" y=\"-166.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"<text text-anchor=\"start\" x=\"131.5\" y=\"-166.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!a</text>\n",
"</g>\n",
"<!-- 2 -->\n",
"<g id=\"node5\" class=\"node\">\n",
@ -1159,7 +1152,7 @@
"<text text-anchor=\"middle\" x=\"137\" y=\"-76.3877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">2</text>\n",
"</g>\n",
"<!-- 5&#45;&gt;2 -->\n",
"<g id=\"edge17\" class=\"edge\">\n",
"<g id=\"edge16\" class=\"edge\">\n",
"<title>5&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M74.3802,-80.0877C85.4352,-80.0877 99.6622,-80.0877 111.7609,-80.0877\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"118.9716,-80.0877 111.9716,-83.2378 115.4716,-80.0878 111.9716,-80.0878 111.9716,-80.0878 111.9716,-80.0878 115.4716,-80.0878 111.9716,-76.9378 118.9716,-80.0877 118.9716,-80.0877\"/>\n",
@ -1194,64 +1187,57 @@
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge2\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M133.4047,-235.8695C132.7938,-245.4027 133.9922,-254.0877 137,-254.0877 139.2089,-254.0877 140.4419,-249.4038 140.6991,-243.1398\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"140.5953,-235.8695 143.845,-242.8237 140.6453,-239.3691 140.6954,-242.8687 140.6954,-242.8687 140.6954,-242.8687 140.6453,-239.3691 137.5457,-242.9138 140.5953,-235.8695 140.5953,-235.8695\"/>\n",
"<text text-anchor=\"start\" x=\"131.5\" y=\"-272.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!a</text>\n",
"<text text-anchor=\"start\" x=\"129\" y=\"-257.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;0 -->\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>0&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M131.494,-235.3368C127.5865,-256.5223 129.4219,-284.0877 137,-284.0877 143.7493,-284.0877 145.9433,-262.2225 143.582,-242.4728\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"142.506,-235.3368 146.6646,-241.7888 143.0279,-238.7976 143.5498,-242.2585 143.5498,-242.2585 143.5498,-242.2585 143.0279,-238.7976 140.435,-242.7282 142.506,-235.3368 142.506,-235.3368\"/>\n",
"<text text-anchor=\"start\" x=\"133.5\" y=\"-287.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M129.9688,-234.7518C128.4063,-244.7127 130.75,-254.0877 137,-254.0877 141.6875,-254.0877 144.1777,-248.8143 144.4707,-241.9753\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"144.0313,-234.7518 147.6006,-241.5475 144.2438,-238.2453 144.4564,-241.7389 144.4564,-241.7389 144.4564,-241.7389 144.2438,-238.2453 141.3122,-241.9302 144.0313,-234.7518 144.0313,-234.7518\"/>\n",
"<text text-anchor=\"start\" x=\"133.5\" y=\"-272.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"<text text-anchor=\"start\" x=\"129\" y=\"-257.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"</g>\n",
"<!-- 0&#45;&gt;1 -->\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<g id=\"edge3\" class=\"edge\">\n",
"<title>0&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M152.6013,-208.9598C158.7477,-205.8411 166.0013,-202.7279 173,-201.0877 181.5673,-199.0799 191.1475,-198.4558 199.7278,-198.4529\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"206.96,-198.5911 199.9011,-201.6067 203.4607,-198.5242 199.9613,-198.4573 199.9613,-198.4573 199.9613,-198.4573 203.4607,-198.5242 200.0216,-195.3079 206.96,-198.5911 206.96,-198.5911\"/>\n",
"<text text-anchor=\"start\" x=\"177.5\" y=\"-219.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"<text text-anchor=\"start\" x=\"173\" y=\"-204.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"175.5\" y=\"-219.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!a</text>\n",
"<text text-anchor=\"start\" x=\"173\" y=\"-204.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;0 -->\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<g id=\"edge4\" class=\"edge\">\n",
"<title>1&#45;&gt;0</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M213.1708,-214.1226C206.7688,-220.6164 198.2788,-227.6432 189,-231.0877 179.5455,-234.5975 168.7766,-232.8058 159.5007,-229.5722\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"152.7448,-226.8824 160.4135,-226.5452 155.9966,-228.1771 159.2483,-229.4718 159.2483,-229.4718 159.2483,-229.4718 155.9966,-228.1771 158.0831,-232.3984 152.7448,-226.8824 152.7448,-226.8824\"/>\n",
"<text text-anchor=\"start\" x=\"177.5\" y=\"-235.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"</g>\n",
"<!-- 1&#45;&gt;1 -->\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<g id=\"edge5\" class=\"edge\">\n",
"<title>1&#45;&gt;1</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M217.3321,-216.378C215.4831,-226.4769 218.0391,-236.0877 225,-236.0877 230.2207,-236.0877 232.9636,-230.6816 233.2287,-223.7181\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"232.6679,-216.378 236.3421,-223.1176 232.9346,-219.8678 233.2013,-223.3577 233.2013,-223.3577 233.2013,-223.3577 232.9346,-219.8678 230.0604,-223.5977 232.6679,-216.378 232.6679,-216.378\"/>\n",
"<text text-anchor=\"start\" x=\"221.5\" y=\"-254.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"<text text-anchor=\"start\" x=\"217\" y=\"-239.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#1f78b4\">⓿</text>\n",
"<text text-anchor=\"start\" x=\"219.5\" y=\"-254.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!a</text>\n",
"<text text-anchor=\"start\" x=\"217\" y=\"-239.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff4da0\">❶</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;2 -->\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<g id=\"edge6\" class=\"edge\">\n",
"<title>2&#45;&gt;2</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M129.9688,-96.7518C128.4063,-106.7127 130.75,-116.0877 137,-116.0877 141.6875,-116.0877 144.1777,-110.8143 144.4707,-103.9753\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"144.0313,-96.7518 147.6006,-103.5475 144.2438,-100.2453 144.4564,-103.7389 144.4564,-103.7389 144.4564,-103.7389 144.2438,-100.2453 141.3122,-103.9302 144.0313,-96.7518 144.0313,-96.7518\"/>\n",
"<text text-anchor=\"middle\" x=\"137\" y=\"-119.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">1</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;3 -->\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<g id=\"edge7\" class=\"edge\">\n",
"<title>2&#45;&gt;3</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M152.7326,-70.9699C166.7481,-62.8473 187.3994,-50.879 203.0408,-41.8141\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"209.4036,-38.1266 204.9266,-44.362 206.3754,-39.8816 203.3471,-41.6366 203.3471,-41.6366 203.3471,-41.6366 206.3754,-39.8816 201.7676,-38.9112 209.4036,-38.1266 209.4036,-38.1266\"/>\n",
"<text text-anchor=\"start\" x=\"175.5\" y=\"-62.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">!a</text>\n",
"</g>\n",
"<!-- 2&#45;&gt;4 -->\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<g id=\"edge8\" class=\"edge\">\n",
"<title>2&#45;&gt;4</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M153.1296,-88.1435C173.8803,-97.4931 211.0592,-110.8204 243,-104.0877 259.1612,-100.6811 263.6823,-98.8565 277,-89.0877 284.7574,-83.3976 292.0258,-75.7692 297.9722,-68.636\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"302.638,-62.8141 300.7185,-70.2464 300.4492,-65.5453 298.2604,-68.2764 298.2604,-68.2764 298.2604,-68.2764 300.4492,-65.5453 295.8024,-66.3065 302.638,-62.8141 302.638,-62.8141\"/>\n",
"<text text-anchor=\"start\" x=\"221.5\" y=\"-108.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#000000\">a</text>\n",
"</g>\n",
"<!-- 3&#45;&gt;3 -->\n",
"<g id=\"edge10\" class=\"edge\">\n",
"<g id=\"edge9\" class=\"edge\">\n",
"<title>3&#45;&gt;3</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M217.3321,-45.378C215.4831,-55.4769 218.0391,-65.0877 225,-65.0877 230.2207,-65.0877 232.9636,-59.6816 233.2287,-52.7181\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"232.6679,-45.378 236.3421,-52.1176 232.9346,-48.8678 233.2013,-52.3577 233.2013,-52.3577 233.2013,-52.3577 232.9346,-48.8678 230.0604,-52.5977 232.6679,-45.378 232.6679,-45.378\"/>\n",
@ -1259,7 +1245,7 @@
"<text text-anchor=\"start\" x=\"217\" y=\"-68.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 3&#45;&gt;4 -->\n",
"<g id=\"edge11\" class=\"edge\">\n",
"<g id=\"edge10\" class=\"edge\">\n",
"<title>3&#45;&gt;4</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M242.1973,-23.5921C252.4927,-21.1595 265.7259,-19.557 277,-23.0877 282.9499,-24.951 288.779,-28.1827 293.9551,-31.7158\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"299.6996,-35.938 292.1937,-34.3305 296.8794,-33.8652 294.0593,-31.7923 294.0593,-31.7923 294.0593,-31.7923 296.8794,-33.8652 295.9248,-29.2542 299.6996,-35.938 299.6996,-35.938\"/>\n",
@ -1267,7 +1253,7 @@
"<text text-anchor=\"start\" x=\"261\" y=\"-26.8877\" font-family=\"Lato\" font-size=\"14.00\" fill=\"#ff7f00\">❷</text>\n",
"</g>\n",
"<!-- 4&#45;&gt;3 -->\n",
"<g id=\"edge12\" class=\"edge\">\n",
"<g id=\"edge11\" class=\"edge\">\n",
"<title>4&#45;&gt;3</title>\n",
"<path fill=\"none\" stroke=\"#000000\" d=\"M295.3331,-53.1108C285.1107,-55.2018 272.1107,-56.4518 261,-53.0877 255.3385,-51.3735 249.7535,-48.4429 244.7337,-45.2064\"/>\n",
"<polygon fill=\"#000000\" stroke=\"#000000\" points=\"238.7143,-41.0119 246.2584,-42.4296 241.5859,-43.0129 244.4575,-45.014 244.4575,-45.014 244.4575,-45.014 241.5859,-43.0129 242.6565,-47.5984 238.7143,-41.0119 238.7143,-41.0119\"/>\n",
@ -1278,7 +1264,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a00c1480> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f68605f5ba0> >"
]
},
"metadata": {},
@ -1407,7 +1393,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a01140c0> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f686063ef30> >"
]
},
"metadata": {},
@ -1538,7 +1524,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a00c1ae0> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f6860602930> >"
]
},
"metadata": {},
@ -1798,7 +1784,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a005d870> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f6860591c30> >"
]
},
"metadata": {},
@ -2112,7 +2098,7 @@
"</svg>\n"
],
"text/plain": [
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f31a005d870> >"
"<spot.impl.twa_graph; proxy of <Swig Object of type 'std::shared_ptr< spot::twa_graph > *' at 0x7f6860591c30> >"
]
},
"metadata": {},
@ -2353,7 +2339,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5+"
"version": "3.6.6"
}
},
"nbformat": 4,