tgba_digraph: force selection of properties kept on copy

* src/tgba/tgba.hh: Declare a prop_set to specify the types.
* src/tgba/tgbagraph.hh: Use prop_set for all copy constructors.
* iface/ltsmin/ltsmin.cc, src/bin/autfilt.cc, src/bin/randaut.cc,
src/tgbaalgos/are_isomorphic.cc, src/tgbaalgos/closure.cc,
src/tgbaalgos/complete.cc, src/tgbaalgos/degen.cc,
src/tgbaalgos/dotty.cc, src/tgbaalgos/dtgbacomp.cc,
src/tgbaalgos/dupexp.cc, src/tgbaalgos/dupexp.hh,
src/tgbaalgos/sccfilter.cc, src/tgbaalgos/simulation.cc,
src/tgbaalgos/stutterize.cc, src/tgbatest/checkpsl.cc,
src/tgbatest/emptchk.cc, src/tgbatest/ltl2tgba.cc,
wrap/python/spot.i,src/graphtest/tgbagraph.test: Adjust all uses.
This commit is contained in:
Alexandre Duret-Lutz 2014-12-23 19:35:08 +01:00
parent 77cb836e47
commit 87c2b291ed
21 changed files with 309 additions and 162 deletions

View file

@ -602,7 +602,8 @@ namespace spot
public: public:
spins_kripke(const spins_interface* d, const bdd_dict_ptr& dict, spins_kripke(const spins_interface* d, const bdd_dict_ptr& dict,
const prop_set* ps, const ltl::formula* dead, int compress) const spot::prop_set* ps, const ltl::formula* dead,
int compress)
: kripke(dict), : kripke(dict),
d_(d), d_(d),
state_size_(d_->get_state_size()), state_size_(d_->get_state_size()),
@ -723,14 +724,13 @@ namespace spot
compute_state_condition_aux(const int* vars) const compute_state_condition_aux(const int* vars) const
{ {
bdd res = bddtrue; bdd res = bddtrue;
for (prop_set::const_iterator i = ps_->begin(); for (auto& i: *ps_)
i != ps_->end(); ++i)
{ {
int l = vars[i->var_num]; int l = vars[i.var_num];
int r = i->val; int r = i.val;
bool cond = false; bool cond = false;
switch (i->op) switch (i.op)
{ {
case OP_EQ: case OP_EQ:
cond = (l == r); cond = (l == r);
@ -753,9 +753,9 @@ namespace spot
} }
if (cond) if (cond)
res &= bdd_ithvar(i->bddvar); res &= bdd_ithvar(i.bddvar);
else else
res &= bdd_nithvar(i->bddvar); res &= bdd_nithvar(i.bddvar);
} }
return res; return res;
} }
@ -922,7 +922,7 @@ namespace spot
bdd_dict_ptr dict_; bdd_dict_ptr dict_;
const char** vname_; const char** vname_;
bool* format_filter_; bool* format_filter_;
const prop_set* ps_; const spot::prop_set* ps_;
bdd alive_prop; bdd alive_prop;
bdd dead_prop; bdd dead_prop;
void (*compress_)(const int*, size_t, int*, size_t&); void (*compress_)(const int*, size_t, int*, size_t&);
@ -1130,7 +1130,7 @@ namespace spot
return 0; return 0;
} }
prop_set* ps = new prop_set; spot::prop_set* ps = new spot::prop_set;
int errors = convert_aps(to_observe, d, dict, dead, *ps); int errors = convert_aps(to_observe, d, dict, dead, *ps);
if (errors) if (errors)
{ {

View file

@ -574,8 +574,9 @@ namespace
// If --stats or --name is used, duplicate the automaton so we // If --stats or --name is used, duplicate the automaton so we
// never modify the original automaton (e.g. with // never modify the original automaton (e.g. with
// merge_transitions()) and the statistics about it make sense. // merge_transitions()) and the statistics about it make sense.
auto aut = ((format == Stats) || opt_name) ? auto aut = ((format == Stats) || opt_name)
spot::make_tgba_digraph(haut->aut) : haut->aut; ? spot::make_tgba_digraph(haut->aut, spot::tgba::prop_set::all())
: haut->aut;
// Preprocessing. // Preprocessing.
@ -599,7 +600,9 @@ namespace
matched &= aut->is_empty(); matched &= aut->is_empty();
if (opt_uniq) if (opt_uniq)
{ {
auto tmp = spot::canonicalize(make_tgba_digraph(aut)); auto tmp =
spot::canonicalize(make_tgba_digraph(aut,
spot::tgba::prop_set::all()));
matched = opt_uniq->emplace(tmp->transition_vector().begin() + 1, matched = opt_uniq->emplace(tmp->transition_vector().begin() + 1,
tmp->transition_vector().end()).second; tmp->transition_vector().end()).second;
} }

View file

@ -311,7 +311,9 @@ main(int argc, char** argv)
if (opt_uniq) if (opt_uniq)
{ {
auto tmp = make_tgba_digraph(spot::canonicalize(aut)); auto tmp =
spot::canonicalize(make_tgba_digraph(aut,
spot::tgba::prop_set::all()));
std::vector<tr_t> trans(tmp->transition_vector().begin() + 1, std::vector<tr_t> trans(tmp->transition_vector().begin() + 1,
tmp->transition_vector().end()); tmp->transition_vector().end());
if (opt_uniq->emplace(trans).second) if (opt_uniq->emplace(trans).second)

View file

@ -35,84 +35,184 @@ run 0 ../tgbagraph | tee stdout
cat >expected <<EOF cat >expected <<EOF
digraph G { digraph G {
rankdir=LR rankdir=LR
0 [label="", style=invis, width=0] I [label="", style=invis, width=0]
0 -> 1 I -> 0
1 [label="0"] 0 [label="0"]
1 -> 1 [label="0"] 0 -> 0 [label="0"]
1 -> 2 [label="p1"] 0 -> 1 [label="p1"]
1 -> 3 [label="p2\n{1}"] 0 -> 2 [label="p2\n{1}"]
2 [label="1"] 1 [label="1"]
2 -> 3 [label="p1 & p2\n{0}"] 1 -> 2 [label="p1 & p2\n{0}"]
3 [label="2"] 2 [label="2"]
3 -> 1 [label="p1 | p2\n{0,1}"] 2 -> 0 [label="p1 | p2\n{0,1}"]
3 -> 2 [label="!p1 | p2"] 2 -> 1 [label="!p1 | p2"]
3 -> 3 [label="1\n{0,1}"] 2 -> 2 [label="1\n{0,1}"]
} }
digraph G { digraph G {
rankdir=LR rankdir=LR
0 [label="", style=invis, width=0] I [label="", style=invis, width=0]
0 -> 1 I -> 0
1 [label="0"] 0 [label="0"]
1 -> 1 [label="0"] 0 -> 0 [label="0"]
1 -> 2 [label="p1"] 0 -> 1 [label="p1"]
1 -> 3 [label="p2\n{1}"] 0 -> 2 [label="p2\n{1}"]
2 [label="1"] 1 [label="1"]
2 -> 3 [label="p1 & p2\n{0}"] 1 -> 2 [label="p1 & p2\n{0}"]
3 [label="2"] 2 [label="2"]
3 -> 1 [label="p1 | p2\n{0,1}"] 2 -> 0 [label="p1 | p2\n{0,1}"]
} }
digraph G { digraph G {
rankdir=LR rankdir=LR
0 [label="", style=invis, width=0] I [label="", style=invis, width=0]
0 -> 1 I -> 0
1 [label="0"] 0 [label="0"]
1 -> 1 [label="0"] 0 -> 0 [label="0"]
1 -> 2 [label="p1"] 0 -> 1 [label="p1"]
1 -> 3 [label="p2\n{1}"] 0 -> 2 [label="p2\n{1}"]
2 [label="1"] 1 [label="1"]
2 -> 3 [label="p1 & p2\n{0}"] 1 -> 2 [label="p1 & p2\n{0}"]
3 [label="2"] 2 [label="2"]
} }
digraph G { digraph G {
rankdir=LR rankdir=LR
0 [label="", style=invis, width=0] I [label="", style=invis, width=0]
0 -> 1 I -> 0
1 [label="0"] 0 [label="0"]
1 -> 1 [label="0"] 0 -> 0 [label="0"]
1 -> 2 [label="p1"] 0 -> 1 [label="p1"]
1 -> 3 [label="p2\n{1}"] 0 -> 2 [label="p2\n{1}"]
2 [label="1"] 1 [label="1"]
2 -> 3 [label="p1 & p2\n{0}"] 1 -> 2 [label="p1 & p2\n{0}"]
3 [label="2"] 2 [label="2"]
3 -> 1 [label="p1 | p2\n{0,1}"] 2 -> 0 [label="p1 | p2\n{0,1}"]
3 -> 2 [label="!p1 | p2"] 2 -> 1 [label="!p1 | p2"]
3 -> 1 [label="1\n{0,1}"] 2 -> 0 [label="1\n{0,1}"]
} }
digraph G { digraph G {
rankdir=LR rankdir=LR
0 [label="", style=invis, width=0] I [label="", style=invis, width=0]
0 -> 1 I -> 0
1 [label="0"] 0 [label="0"]
1 -> 2 [label="p1"] 0 -> 1 [label="p1"]
1 -> 3 [label="p2\n{1}"] 0 -> 2 [label="p2\n{1}"]
2 [label="1"] 1 [label="1"]
2 -> 3 [label="p1 & p2\n{0}"] 1 -> 2 [label="p1 & p2\n{0}"]
3 [label="2"] 2 [label="2"]
3 -> 1 [label="1\n{0,1}"] 2 -> 0 [label="1\n{0,1}"]
3 -> 2 [label="!p1 | p2"] 2 -> 1 [label="!p1 | p2"]
} }
digraph G { digraph G {
rankdir=LR rankdir=LR
0 [label="", style=invis, width=0] I [label="", style=invis, width=0]
0 -> 1 I -> 0
1 [label="0"] 0 [label="0"]
1 -> 2 [label="p1"] 0 -> 1 [label="p1"]
1 -> 3 [label="p2\n{1}"] 0 -> 2 [label="p2\n{1}"]
2 [label="1"] 1 [label="1"]
2 -> 3 [label="p1 & p2\n{0}"] 1 -> 2 [label="p1 & p2\n{0}"]
3 [label="2"] 2 [label="2"]
3 -> 1 [label="1\n{0,1}"] 2 -> 0 [label="1\n{0,1}"]
3 -> 2 [label="!p1 | p2"] 2 -> 1 [label="!p1 | p2"]
3 [label="3"]
4 [label="4"]
5 [label="5"]
6 [label="6"]
7 [label="7"]
8 [label="8"]
9 [label="9"]
10 [label="10"]
11 [label="11"]
12 [label="12"]
13 [label="13"]
14 [label="14"]
15 [label="15"]
16 [label="16"]
17 [label="17"]
18 [label="18"]
19 [label="19"]
20 [label="20"]
21 [label="21"]
22 [label="22"]
23 [label="23"]
24 [label="24"]
25 [label="25"]
26 [label="26"]
27 [label="27"]
28 [label="28"]
29 [label="29"]
30 [label="30"]
31 [label="31"]
32 [label="32"]
33 [label="33"]
34 [label="34"]
35 [label="35"]
36 [label="36"]
37 [label="37"]
38 [label="38"]
39 [label="39"]
40 [label="40"]
41 [label="41"]
42 [label="42"]
43 [label="43"]
44 [label="44"]
45 [label="45"]
46 [label="46"]
47 [label="47"]
48 [label="48"]
49 [label="49"]
50 [label="50"]
51 [label="51"]
52 [label="52"]
53 [label="53"]
54 [label="54"]
55 [label="55"]
56 [label="56"]
57 [label="57"]
58 [label="58"]
59 [label="59"]
60 [label="60"]
61 [label="61"]
62 [label="62"]
63 [label="63"]
64 [label="64"]
65 [label="65"]
66 [label="66"]
67 [label="67"]
68 [label="68"]
69 [label="69"]
70 [label="70"]
71 [label="71"]
72 [label="72"]
73 [label="73"]
74 [label="74"]
75 [label="75"]
76 [label="76"]
77 [label="77"]
78 [label="78"]
79 [label="79"]
80 [label="80"]
81 [label="81"]
82 [label="82"]
83 [label="83"]
84 [label="84"]
85 [label="85"]
86 [label="86"]
87 [label="87"]
88 [label="88"]
89 [label="89"]
90 [label="90"]
91 [label="91"]
92 [label="92"]
93 [label="93"]
94 [label="94"]
95 [label="95"]
96 [label="96"]
97 [label="97"]
98 [label="98"]
99 [label="99"]
100 [label="100"]
101 [label="101"]
102 [label="102"]
} }
EOF EOF

View file

@ -29,6 +29,7 @@
#include <memory> #include <memory>
#include <unordered_map> #include <unordered_map>
#include <functional> #include <functional>
#include <array>
#include "misc/casts.hh" #include "misc/casts.hh"
#include "misc/hash.hh" #include "misc/hash.hh"
@ -734,24 +735,45 @@ namespace spot
is.deterministic = val; is.deterministic = val;
} }
// This is no default value here on purpose. This way any time we struct prop_set
// add a new property we cannot to update every call to prop_copy().
void prop_copy(const const_tgba_ptr& other,
bool state_based,
bool single_acc,
bool inherently_weak,
bool deterministic)
{ {
if (state_based) bool state_based;
bool single_acc;
bool inherently_weak;
bool deterministic;
static prop_set all()
{
return { true, true, true, true };
}
};
// There is no default value here on purpose. This way any time we
// add a new property we have to update every call to prop_copy().
void prop_copy(const const_tgba_ptr& other, prop_set p)
{
if (p.state_based)
prop_state_based_acc(other->has_state_based_acc()); prop_state_based_acc(other->has_state_based_acc());
if (single_acc) if (p.single_acc)
prop_single_acc_set(other->has_single_acc_set()); prop_single_acc_set(other->has_single_acc_set());
if (inherently_weak) if (p.inherently_weak)
prop_inherently_weak(other->is_inherently_weak()); prop_inherently_weak(other->is_inherently_weak());
if (deterministic) if (p.deterministic)
prop_deterministic(other->is_deterministic()); prop_deterministic(other->is_deterministic());
} }
void prop_keep(prop_set p)
{
if (!p.state_based)
prop_state_based_acc(false);
if (!p.single_acc)
prop_single_acc_set(false);
if (!p.inherently_weak)
prop_inherently_weak(false);
if (!p.deterministic)
prop_deterministic(false);
}
}; };
/// \addtogroup tgba_representation TGBA representations /// \addtogroup tgba_representation TGBA representations

View file

@ -186,13 +186,13 @@ namespace spot
{ {
} }
explicit tgba_digraph(const const_tgba_digraph_ptr& other) explicit tgba_digraph(const const_tgba_digraph_ptr& other, prop_set p)
: tgba(other->get_dict()), : tgba(other->get_dict()),
g_(other->g_), init_number_(other->init_number_) g_(other->g_), init_number_(other->init_number_)
{ {
copy_acceptance_conditions_of(other); copy_acceptance_conditions_of(other);
copy_ap_of(other); copy_ap_of(other);
prop_copy(other, true, true, true, true); prop_copy(other, p);
} }
virtual ~tgba_digraph() virtual ~tgba_digraph()
@ -489,23 +489,26 @@ namespace spot
return std::make_shared<tgba_digraph>(dict); return std::make_shared<tgba_digraph>(dict);
} }
inline tgba_digraph_ptr make_tgba_digraph(const tgba_digraph_ptr& aut) inline tgba_digraph_ptr make_tgba_digraph(const tgba_digraph_ptr& aut,
tgba::prop_set p)
{ {
return std::make_shared<tgba_digraph>(aut); return std::make_shared<tgba_digraph>(aut, p);
} }
inline tgba_digraph_ptr make_tgba_digraph(const const_tgba_digraph_ptr& aut) inline tgba_digraph_ptr make_tgba_digraph(const const_tgba_digraph_ptr& aut,
tgba::prop_set p)
{ {
return std::make_shared<tgba_digraph>(aut); return std::make_shared<tgba_digraph>(aut, p);
} }
inline tgba_digraph_ptr make_tgba_digraph(const const_tgba_ptr& aut) inline tgba_digraph_ptr make_tgba_digraph(const const_tgba_ptr& aut,
tgba::prop_set p)
{ {
auto p = std::dynamic_pointer_cast<const tgba_digraph>(aut); auto a = std::dynamic_pointer_cast<const tgba_digraph>(aut);
if (p) if (a)
return std::make_shared<tgba_digraph>(p); return std::make_shared<tgba_digraph>(a, p);
else else
return tgba_dupexp_dfs(aut); return tgba_dupexp_dfs(aut, p);
} }
} }

View file

@ -110,7 +110,7 @@ namespace spot
{ {
isomorphism_checker::isomorphism_checker(const const_tgba_digraph_ptr ref) isomorphism_checker::isomorphism_checker(const const_tgba_digraph_ptr ref)
{ {
ref_ = make_tgba_digraph(ref); ref_ = make_tgba_digraph(ref, {true, true, true, true});
ref_deterministic_ = ref_->is_deterministic(); ref_deterministic_ = ref_->is_deterministic();
if (!ref_deterministic_) if (!ref_deterministic_)
{ {
@ -142,7 +142,7 @@ namespace spot
} }
} }
auto tmp = make_tgba_digraph(aut); auto tmp = make_tgba_digraph(aut, {true, true, true, true});
spot::canonicalize(tmp); spot::canonicalize(tmp);
return *tmp == *ref_; return *tmp == *ref_;
} }

View file

@ -28,6 +28,12 @@ namespace spot
tgba_digraph_ptr tgba_digraph_ptr
closure(tgba_digraph_ptr&& a) closure(tgba_digraph_ptr&& a)
{ {
a->prop_keep({false, // state_based
true, // single_acc
false, // inherently_weak
false, // deterministic
});
unsigned n = a->num_states(); unsigned n = a->num_states();
std::vector<unsigned> todo; std::vector<unsigned> todo;
std::vector<std::vector<unsigned> > dst2trans(n); std::vector<std::vector<unsigned> > dst2trans(n);
@ -90,6 +96,6 @@ namespace spot
tgba_digraph_ptr tgba_digraph_ptr
closure(const const_tgba_digraph_ptr& a) closure(const const_tgba_digraph_ptr& a)
{ {
return closure(make_tgba_digraph(a)); return closure(make_tgba_digraph(a, {true, true, true, true}));
} }
} }

View file

@ -104,12 +104,12 @@ namespace spot
tgba_digraph_ptr tgba_complete(const const_tgba_ptr& aut) tgba_digraph_ptr tgba_complete(const const_tgba_ptr& aut)
{ {
auto res = make_tgba_digraph(aut); auto res = make_tgba_digraph(aut, {
res->prop_copy(aut, true, // state based
true, // state based true, // single acc
true, // single acc true, // inherently_weak
true, // inherently_weak true, // deterministic
true); // deterministic });
tgba_complete_here(res); tgba_complete_here(res);
return res; return res;
} }

View file

@ -203,7 +203,7 @@ namespace spot
if (want_sba) if (want_sba)
res->prop_state_based_acc(); res->prop_state_based_acc();
// Preserve determinism and weakness // Preserve determinism and weakness
res->prop_copy(a, false, false, true, true); res->prop_copy(a, { false, false, true, true });
// Create an order of acceptance conditions. Each entry in this // Create an order of acceptance conditions. Each entry in this
// vector correspond to an acceptance set. Each index can // vector correspond to an acceptance set. Each index can

View file

@ -281,7 +281,7 @@ namespace spot
return os; return os;
} }
dotty_output d(os, options); dotty_output d(os, options);
auto aut = make_tgba_digraph(g); auto aut = make_tgba_digraph(g, tgba::prop_set::all());
if (assume_sba) if (assume_sba)
aut->prop_state_based_acc(); aut->prop_state_based_acc();
d.print(aut); d.print(aut);

View file

@ -25,12 +25,12 @@ namespace spot
tgba_digraph_ptr dtgba_complement_nonweak(const const_tgba_ptr& aut) tgba_digraph_ptr dtgba_complement_nonweak(const const_tgba_ptr& aut)
{ {
// Clone the original automaton. // Clone the original automaton.
auto res = make_tgba_digraph(aut); auto res = make_tgba_digraph(aut,
res->prop_copy(aut, { false, // state based
false, // state based false, // single acc
false, // single acc false, // inherently_weak
false, // inherently_weak false, // deterministic
false); // deterministic });
// Copy the old acceptance condition before we replace it. // Copy the old acceptance condition before we replace it.
acc_cond oldacc = aut->acc(); // Copy it! acc_cond oldacc = aut->acc(); // Copy it!
@ -113,13 +113,12 @@ namespace spot
tgba_digraph_ptr dtgba_complement_weak(const const_tgba_ptr& aut) tgba_digraph_ptr dtgba_complement_weak(const const_tgba_ptr& aut)
{ {
// Clone the original automaton. // Clone the original automaton.
auto res = make_tgba_digraph(aut); auto res = make_tgba_digraph(aut,
res->prop_copy(aut, { true, // state based
true, // state based true, // single acc
true, // single acc true, // inherently weak
true, // inherently_weak true, // determinisitic
true); // deterministic });
scc_info si(res); scc_info si(res);
// We will modify res in place, and the resulting // We will modify res in place, and the resulting

View file

@ -36,12 +36,12 @@ namespace spot
class dupexp_iter: public T class dupexp_iter: public T
{ {
public: public:
dupexp_iter(const const_tgba_ptr& a) dupexp_iter(const const_tgba_ptr& a, tgba::prop_set p)
: T(a), out_(make_tgba_digraph(a->get_dict())) : T(a), out_(make_tgba_digraph(a->get_dict()))
{ {
out_->copy_acceptance_conditions_of(a); out_->copy_acceptance_conditions_of(a);
out_->copy_ap_of(a); out_->copy_ap_of(a);
out_->prop_copy(a, true, true, true, true); out_->prop_copy(a, p);
} }
tgba_digraph_ptr tgba_digraph_ptr
@ -77,8 +77,9 @@ namespace spot
{ {
public: public:
dupexp_iter_save(const const_tgba_ptr& a, dupexp_iter_save(const const_tgba_ptr& a,
tgba::prop_set p,
std::vector<const state*>& relation) std::vector<const state*>& relation)
: dupexp_iter<T>(a), relation_(relation) : dupexp_iter<T>(a, p), relation_(relation)
{ {
} }
@ -96,37 +97,39 @@ namespace spot
} // anonymous } // anonymous
tgba_digraph_ptr tgba_digraph_ptr
tgba_dupexp_bfs(const const_tgba_ptr& aut) tgba_dupexp_bfs(const const_tgba_ptr& aut, tgba::prop_set p)
{ {
dupexp_iter<tgba_reachable_iterator_breadth_first> di(aut); dupexp_iter<tgba_reachable_iterator_breadth_first> di(aut, p);
di.run(); di.run();
return di.result(); return di.result();
} }
tgba_digraph_ptr tgba_digraph_ptr
tgba_dupexp_dfs(const const_tgba_ptr& aut) tgba_dupexp_dfs(const const_tgba_ptr& aut, tgba::prop_set p)
{ {
dupexp_iter<tgba_reachable_iterator_depth_first> di(aut); dupexp_iter<tgba_reachable_iterator_depth_first> di(aut, p);
di.run(); di.run();
return di.result(); return di.result();
} }
tgba_digraph_ptr tgba_digraph_ptr
tgba_dupexp_bfs(const const_tgba_ptr& aut, std::vector<const state*>& rel) tgba_dupexp_bfs(const const_tgba_ptr& aut, tgba::prop_set p,
std::vector<const state*>& rel)
{ {
dupexp_iter_save<tgba_reachable_iterator_breadth_first> di(aut, rel); dupexp_iter_save<tgba_reachable_iterator_breadth_first> di(aut, p, rel);
di.run(); di.run();
return di.result(); return di.result();
} }
tgba_digraph_ptr tgba_digraph_ptr
tgba_dupexp_dfs(const const_tgba_ptr& aut, std::vector<const state*>& rel) tgba_dupexp_dfs(const const_tgba_ptr& aut, tgba::prop_set p,
std::vector<const state*>& rel)
{ {
auto aa = std::dynamic_pointer_cast<const spot::tgba_digraph>(aut); auto aa = std::dynamic_pointer_cast<const tgba_digraph>(aut);
if (aa) if (aa)
{ {
aa->get_init_state_number(); // Create an initial state if needed. aa->get_init_state_number(); // Create an initial state if needed.
auto res = make_tgba_digraph(aa); auto res = make_tgba_digraph(aa, p);
unsigned ns = aa->num_states(); unsigned ns = aa->num_states();
rel.reserve(ns); rel.reserve(ns);
// The state numbers are common to both automata, but // The state numbers are common to both automata, but
@ -136,7 +139,7 @@ namespace spot
return res; return res;
} }
dupexp_iter_save<tgba_reachable_iterator_depth_first> di(aut, rel); dupexp_iter_save<tgba_reachable_iterator_depth_first> di(aut, p, rel);
di.run(); di.run();
return di.result(); return di.result();
} }

View file

@ -34,12 +34,12 @@ namespace spot
/// \brief Build an explicit automaton from all states of \a aut, /// \brief Build an explicit automaton from all states of \a aut,
/// numbering states in bread first order as they are processed. /// numbering states in bread first order as they are processed.
SPOT_API tgba_digraph_ptr SPOT_API tgba_digraph_ptr
tgba_dupexp_bfs(const const_tgba_ptr& aut); tgba_dupexp_bfs(const const_tgba_ptr& aut, tgba::prop_set p);
/// \ingroup tgba_misc /// \ingroup tgba_misc
/// \brief Build an explicit automaton from all states of \a aut, /// \brief Build an explicit automaton from all states of \a aut,
/// numbering states in depth first order as they are processed. /// numbering states in depth first order as they are processed.
SPOT_API tgba_digraph_ptr SPOT_API tgba_digraph_ptr
tgba_dupexp_dfs(const const_tgba_ptr& aut); tgba_dupexp_dfs(const const_tgba_ptr& aut, tgba::prop_set p);
/// \ingroup tgba_misc /// \ingroup tgba_misc
/// \brief Build an explicit automaton from all states of \a aut, /// \brief Build an explicit automaton from all states of \a aut,
@ -48,7 +48,7 @@ namespace spot
/// \a relation a map of all the new states (represented by /// \a relation a map of all the new states (represented by
/// their number) to the old states. /// their number) to the old states.
SPOT_API tgba_digraph_ptr SPOT_API tgba_digraph_ptr
tgba_dupexp_bfs(const const_tgba_ptr& aut, tgba_dupexp_bfs(const const_tgba_ptr& aut, tgba::prop_set p,
std::vector<const state*>& relation); std::vector<const state*>& relation);
/// \ingroup tgba_misc /// \ingroup tgba_misc
@ -58,7 +58,7 @@ namespace spot
/// \a relation a map of all the new states (represented by /// \a relation a map of all the new states (represented by
/// their number) to the old states. /// their number) to the old states.
SPOT_API tgba_digraph_ptr SPOT_API tgba_digraph_ptr
tgba_dupexp_dfs(const const_tgba_ptr& aut, tgba_dupexp_dfs(const const_tgba_ptr& aut, tgba::prop_set p,
std::vector<const state*>& relation); std::vector<const state*>& relation);
} }

View file

@ -313,7 +313,7 @@ namespace spot
scc_filter_states(const const_tgba_digraph_ptr& aut, scc_info* given_si) scc_filter_states(const const_tgba_digraph_ptr& aut, scc_info* given_si)
{ {
auto res = scc_filter_apply<state_filter<>>(aut, given_si); auto res = scc_filter_apply<state_filter<>>(aut, given_si);
res->prop_copy(aut, true, true, true, true); res->prop_copy(aut, { true, true, true, true });
return res; return res;
} }
@ -332,10 +332,11 @@ namespace spot
<acc_filter_simplify<>>>>(aut, given_si); <acc_filter_simplify<>>>>(aut, given_si);
res->merge_transitions(); res->merge_transitions();
res->prop_copy(aut, res->prop_copy(aut,
false, // state-based acceptance is not preserved { false, // state-based acceptance is not preserved
true, true,
true, true,
true); true,
});
return res; return res;
} }
@ -363,10 +364,11 @@ namespace spot
early_susp); early_susp);
res->merge_transitions(); res->merge_transitions();
res->prop_copy(aut, res->prop_copy(aut,
false, // state-based acceptance is not preserved { false, // state-based acceptance is not preserved
true, true,
true, true,
false); // determinism may not be preserved false, // determinism may not be preserved
});
return res; return res;
} }

View file

@ -252,7 +252,7 @@ namespace spot
// the names (addresses) of the states in the automaton // the names (addresses) of the states in the automaton
// returned by dupexp, and in automaton given in argument to // returned by dupexp, and in automaton given in argument to
// the constructor. // the constructor.
a_ = tgba_dupexp_dfs(t, new_original_); a_ = tgba_dupexp_dfs(t, { true, true, true, true }, new_original_);
scc_info_.reset(new scc_info(a_)); scc_info_.reset(new scc_info(a_));
old_a_ = a_; old_a_ = a_;
@ -701,10 +701,11 @@ namespace spot
delete gb; delete gb;
res->prop_copy(original_, res->prop_copy(original_,
false, // state-based acc forced below { false, // state-based acc forced below
false, // single acc is set by set_acceptance_conditions false, // single acc set by set_acceptance_conditions
true, // weakness preserved, true, // weakness preserved,
false); // determinism checked and set below false, // determinism checked and set below
});
if (nb_minato == nb_satoneset) if (nb_minato == nb_satoneset)
res->prop_deterministic(); res->prop_deterministic();
if (Sba) if (Sba)

View file

@ -187,6 +187,7 @@ namespace spot
tgba_digraph_ptr tgba_digraph_ptr
sl2(const const_tgba_digraph_ptr& a, bdd atomic_propositions) sl2(const const_tgba_digraph_ptr& a, bdd atomic_propositions)
{ {
return sl2(make_tgba_digraph(a), atomic_propositions); return sl2(make_tgba_digraph(a, tgba::prop_set::all()),
atomic_propositions);
} }
} }

View file

@ -92,8 +92,12 @@ main(int argc, char** argv)
if (fpos->is_ltl_formula()) if (fpos->is_ltl_formula())
{ {
auto apos = scc_filter(make_tgba_digraph(ltl_to_taa(fpos, d))); auto apos =
auto aneg = scc_filter(make_tgba_digraph(ltl_to_taa(fneg, d))); scc_filter(make_tgba_digraph(ltl_to_taa(fpos, d),
spot::tgba::prop_set::all()));
auto aneg =
scc_filter(make_tgba_digraph(ltl_to_taa(fneg, d),
spot::tgba::prop_set::all()));
if (!spot::product(apos, aneg)->is_empty()) if (!spot::product(apos, aneg)->is_empty())
{ {
std::cerr << "non-empty intersection between pos and neg (TAA)\n"; std::cerr << "non-empty intersection between pos and neg (TAA)\n";

View file

@ -102,7 +102,8 @@ main(int argc, char** argv)
{ {
auto a = spot::ltl_to_taa(f, d); auto a = spot::ltl_to_taa(f, d);
aut[0] = a; aut[0] = a;
aut[1] = spot::degeneralize_tba(spot::make_tgba_digraph(a)); auto all = spot::tgba::prop_set::all();
aut[1] = spot::degeneralize_tba(spot::make_tgba_digraph(a, all));
} }
{ {
auto a = spot::ltl_to_tgba_fm(f, d); auto a = spot::ltl_to_tgba_fm(f, d);

View file

@ -328,7 +328,7 @@ spot::tgba_digraph_ptr ensure_digraph(const spot::tgba_ptr& a)
auto aa = std::dynamic_pointer_cast<spot::tgba_digraph>(a); auto aa = std::dynamic_pointer_cast<spot::tgba_digraph>(a);
if (aa) if (aa)
return aa; return aa;
return spot::make_tgba_digraph(a); return spot::make_tgba_digraph(a, spot::tgba::prop_set::all());
} }
int int
@ -1436,10 +1436,10 @@ checked_main(int argc, char** argv)
case NoneDup: case NoneDup:
break; break;
case BFS: case BFS:
a = tgba_dupexp_bfs(a); a = tgba_dupexp_bfs(a, spot::tgba::prop_set::all());
break; break;
case DFS: case DFS:
a = tgba_dupexp_dfs(a); a = tgba_dupexp_dfs(a, spot::tgba::prop_set::all());
break; break;
} }

View file

@ -368,7 +368,7 @@ ensure_digraph(const spot::tgba_ptr& a)
auto aa = std::dynamic_pointer_cast<spot::tgba_digraph>(a); auto aa = std::dynamic_pointer_cast<spot::tgba_digraph>(a);
if (aa) if (aa)
return aa; return aa;
return spot::make_tgba_digraph(a); return spot::make_tgba_digraph(a, spot::tgba::prop_set::all());
} }
std::ostream& std::ostream&