* tgbaalgos/emptiness_stats.hh (unsigned_statistics): New base
class for ec_statistics and ars_statistics. (acss_statistics): Inherit from ars_statistics. * tgbaalgos/emptiness.cc, tgbaalgos/emptiness.hh: (emptiness_check::statistics, emptiness_check_result::statistics): New methods. * tgbatest/randtgba.cc: Adjust to use the above. * tgbaalgos/gv04.cc, tgbaalgos/ndfs_result.hxx, tgbaalgos/gtec/ce.cc, tgbaalgos/gtec/ce.hh: Do not inherit from ars_statistics if acss_statistics is used.
This commit is contained in:
parent
ad9eec60f1
commit
9c2c3926c7
9 changed files with 135 additions and 50 deletions
11
ChangeLog
11
ChangeLog
|
|
@ -1,5 +1,16 @@
|
||||||
2005-02-03 Alexandre Duret-Lutz <adl@src.lip6.fr>
|
2005-02-03 Alexandre Duret-Lutz <adl@src.lip6.fr>
|
||||||
|
|
||||||
|
* tgbaalgos/emptiness_stats.hh (unsigned_statistics): New base
|
||||||
|
class for ec_statistics and ars_statistics.
|
||||||
|
(acss_statistics): Inherit from ars_statistics.
|
||||||
|
* tgbaalgos/emptiness.cc, tgbaalgos/emptiness.hh:
|
||||||
|
(emptiness_check::statistics, emptiness_check_result::statistics):
|
||||||
|
New methods.
|
||||||
|
* tgbatest/randtgba.cc: Adjust to use the above.
|
||||||
|
* tgbaalgos/gv04.cc, tgbaalgos/ndfs_result.hxx, tgbaalgos/gtec/ce.cc,
|
||||||
|
tgbaalgos/gtec/ce.hh: Do not inherit from ars_statistics if
|
||||||
|
acss_statistics is used.
|
||||||
|
|
||||||
* src/tgbaalgos/gtec/gtec.hh (couvreur99_check): Add pseudo code.
|
* src/tgbaalgos/gtec/gtec.hh (couvreur99_check): Add pseudo code.
|
||||||
|
|
||||||
2005-02-02 Alexandre Duret-Lutz <adl@src.lip6.fr>
|
2005-02-02 Alexandre Duret-Lutz <adl@src.lip6.fr>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
// Copyright (C) 2004, 2005 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
// et Marie Curie.
|
// et Marie Curie.
|
||||||
//
|
//
|
||||||
|
|
@ -100,10 +100,22 @@ namespace spot
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const unsigned_statistics*
|
||||||
|
emptiness_check_result::statistics() const
|
||||||
|
{
|
||||||
|
return dynamic_cast<const unsigned_statistics*>(this);
|
||||||
|
}
|
||||||
|
|
||||||
emptiness_check::~emptiness_check()
|
emptiness_check::~emptiness_check()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const unsigned_statistics*
|
||||||
|
emptiness_check::statistics() const
|
||||||
|
{
|
||||||
|
return dynamic_cast<const unsigned_statistics*>(this);
|
||||||
|
}
|
||||||
|
|
||||||
std::ostream&
|
std::ostream&
|
||||||
emptiness_check::print_stats(std::ostream& os) const
|
emptiness_check::print_stats(std::ostream& os) const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
#include <bdd.h>
|
#include <bdd.h>
|
||||||
#include "tgba/state.hh"
|
#include "tgba/state.hh"
|
||||||
|
#include "emptiness_stats.hh"
|
||||||
|
|
||||||
namespace spot
|
namespace spot
|
||||||
{
|
{
|
||||||
|
|
@ -98,6 +99,10 @@ namespace spot
|
||||||
{
|
{
|
||||||
return a_;
|
return a_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return statistics, if available.
|
||||||
|
virtual const unsigned_statistics* statistics() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const tgba* a_; ///< The automaton.
|
const tgba* a_; ///< The automaton.
|
||||||
};
|
};
|
||||||
|
|
@ -131,6 +136,9 @@ namespace spot
|
||||||
/// several time, but generally you should not assume that.
|
/// several time, but generally you should not assume that.
|
||||||
virtual emptiness_check_result* check() = 0;
|
virtual emptiness_check_result* check() = 0;
|
||||||
|
|
||||||
|
/// Return statistics, if available.
|
||||||
|
virtual const unsigned_statistics* statistics() const;
|
||||||
|
|
||||||
/// Print statistics, if any.
|
/// Print statistics, if any.
|
||||||
virtual std::ostream& print_stats(std::ostream& os) const;
|
virtual std::ostream& print_stats(std::ostream& os) const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,8 @@
|
||||||
# define SPOT_TGBAALGOS_EMPTINESS_STATS_HH
|
# define SPOT_TGBAALGOS_EMPTINESS_STATS_HH
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace spot
|
namespace spot
|
||||||
{
|
{
|
||||||
|
|
@ -30,17 +32,48 @@ namespace spot
|
||||||
/// \addtogroup emptiness_check_stats
|
/// \addtogroup emptiness_check_stats
|
||||||
/// @{
|
/// @{
|
||||||
|
|
||||||
|
class unsigned_statistics
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual
|
||||||
|
~unsigned_statistics()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned
|
||||||
|
get(const char* str) const
|
||||||
|
{
|
||||||
|
stats_map_::const_iterator i = stats_.find(str);
|
||||||
|
assert(i != stats_.end());
|
||||||
|
return (this->*i->second)();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
typedef unsigned (unsigned_statistics::*unsigned_fun_)() const;
|
||||||
|
typedef std::map<std::string, unsigned_fun_> stats_map_;
|
||||||
|
stats_map_ stats_;
|
||||||
|
};
|
||||||
|
|
||||||
/// \brief Emptiness-check statistics
|
/// \brief Emptiness-check statistics
|
||||||
///
|
///
|
||||||
/// Implementations of spot::emptiness_check may also implement
|
/// Implementations of spot::emptiness_check may also implement
|
||||||
/// this interface. Try to dynamic_cast the spot::emptiness_check
|
/// this interface. Try to dynamic_cast the spot::emptiness_check
|
||||||
/// pointer to know whether these statistics are available.
|
/// pointer to know whether these statistics are available.
|
||||||
class ec_statistics
|
class ec_statistics: public unsigned_statistics
|
||||||
{
|
{
|
||||||
public :
|
public :
|
||||||
ec_statistics()
|
ec_statistics()
|
||||||
: states_(0), transitions_(0), depth_(0), max_depth_(0)
|
: states_(0), transitions_(0), depth_(0), max_depth_(0)
|
||||||
{
|
{
|
||||||
|
stats_["states"] =
|
||||||
|
static_cast<unsigned_statistics::unsigned_fun_>(&ec_statistics::states);
|
||||||
|
stats_["transitions"] =
|
||||||
|
static_cast<unsigned_statistics::unsigned_fun_>
|
||||||
|
(&ec_statistics::transitions);
|
||||||
|
stats_["max. depth"] =
|
||||||
|
static_cast<unsigned_statistics::unsigned_fun_>
|
||||||
|
(&ec_statistics::max_depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -76,25 +109,25 @@ namespace spot
|
||||||
depth_ -= n;
|
depth_ -= n;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
unsigned
|
||||||
states() const
|
states() const
|
||||||
{
|
{
|
||||||
return states_;
|
return states_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
unsigned
|
||||||
transitions() const
|
transitions() const
|
||||||
{
|
{
|
||||||
return transitions_;
|
return transitions_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
unsigned
|
||||||
max_depth() const
|
max_depth() const
|
||||||
{
|
{
|
||||||
return max_depth_;
|
return max_depth_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
unsigned
|
||||||
depth() const
|
depth() const
|
||||||
{
|
{
|
||||||
return depth_;
|
return depth_;
|
||||||
|
|
@ -107,29 +140,23 @@ namespace spot
|
||||||
unsigned max_depth_; /// maximal depth of the stack(s)
|
unsigned max_depth_; /// maximal depth of the stack(s)
|
||||||
};
|
};
|
||||||
|
|
||||||
/// \brief Accepting Cycle Search Space statistics
|
|
||||||
///
|
|
||||||
/// Implementations of spot::emptiness_check_result may also implement
|
|
||||||
/// this interface. Try to dynamic_cast the spot::emptiness_check_result
|
|
||||||
/// pointer to know whether these statistics are available.
|
|
||||||
class acss_statistics
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/// Number of states in the search space for the accepting cycle.
|
|
||||||
virtual int acss_states() const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// \brief Accepting Run Search statistics.
|
/// \brief Accepting Run Search statistics.
|
||||||
///
|
///
|
||||||
/// Implementations of spot::emptiness_check_result may also implement
|
/// Implementations of spot::emptiness_check_result may also implement
|
||||||
/// this interface. Try to dynamic_cast the spot::emptiness_check_result
|
/// this interface. Try to dynamic_cast the spot::emptiness_check_result
|
||||||
/// pointer to know whether these statistics are available.
|
/// pointer to know whether these statistics are available.
|
||||||
class ars_statistics
|
class ars_statistics: public unsigned_statistics
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ars_statistics()
|
ars_statistics()
|
||||||
: prefix_states_(0), cycle_states_(0)
|
: prefix_states_(0), cycle_states_(0)
|
||||||
{
|
{
|
||||||
|
stats_["(non unique) states for prefix"] =
|
||||||
|
static_cast<unsigned_statistics::unsigned_fun_>
|
||||||
|
(&ars_statistics::ars_prefix_states);
|
||||||
|
stats_["(non unique) states for cycle"] =
|
||||||
|
static_cast<unsigned_statistics::unsigned_fun_>
|
||||||
|
(&ars_statistics::ars_cycle_states);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -138,7 +165,7 @@ namespace spot
|
||||||
++prefix_states_;
|
++prefix_states_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
unsigned
|
||||||
ars_prefix_states() const
|
ars_prefix_states() const
|
||||||
{
|
{
|
||||||
return prefix_states_;
|
return prefix_states_;
|
||||||
|
|
@ -150,7 +177,7 @@ namespace spot
|
||||||
++cycle_states_;
|
++cycle_states_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
unsigned
|
||||||
ars_cycle_states() const
|
ars_cycle_states() const
|
||||||
{
|
{
|
||||||
return cycle_states_;
|
return cycle_states_;
|
||||||
|
|
@ -161,6 +188,31 @@ namespace spot
|
||||||
unsigned cycle_states_; /// states visited to construct the cycle
|
unsigned cycle_states_; /// states visited to construct the cycle
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// \brief Accepting Cycle Search Space statistics
|
||||||
|
///
|
||||||
|
/// Implementations of spot::emptiness_check_result may also implement
|
||||||
|
/// this interface. Try to dynamic_cast the spot::emptiness_check_result
|
||||||
|
/// pointer to know whether these statistics are available.
|
||||||
|
class acss_statistics: public ars_statistics
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
acss_statistics()
|
||||||
|
{
|
||||||
|
stats_["search space states"] =
|
||||||
|
static_cast<unsigned_statistics::unsigned_fun_>
|
||||||
|
(&acss_statistics::acss_states);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual
|
||||||
|
~acss_statistics()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Number of states in the search space for the accepting cycle.
|
||||||
|
virtual unsigned acss_states() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -82,10 +82,10 @@ namespace spot
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
unsigned
|
||||||
couvreur99_check_result::acss_states() const
|
couvreur99_check_result::acss_states() const
|
||||||
{
|
{
|
||||||
int count = 0;
|
unsigned count = 0;
|
||||||
int scc_root = ecs_->root.top().index;
|
int scc_root = ecs_->root.top().index;
|
||||||
|
|
||||||
numbered_state_heap_const_iterator* i = ecs_->h->iterator();
|
numbered_state_heap_const_iterator* i = ecs_->h->iterator();
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,7 @@ namespace spot
|
||||||
/// Compute a counter example from a spot::couvreur99_check_status
|
/// Compute a counter example from a spot::couvreur99_check_status
|
||||||
class couvreur99_check_result:
|
class couvreur99_check_result:
|
||||||
public emptiness_check_result,
|
public emptiness_check_result,
|
||||||
public acss_statistics,
|
public acss_statistics
|
||||||
public ars_statistics
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
couvreur99_check_result(const couvreur99_check_status* ecs);
|
couvreur99_check_result(const couvreur99_check_status* ecs);
|
||||||
|
|
@ -41,7 +40,7 @@ namespace spot
|
||||||
|
|
||||||
void print_stats(std::ostream& os) const;
|
void print_stats(std::ostream& os) const;
|
||||||
|
|
||||||
virtual int acss_states() const;
|
virtual unsigned acss_states() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Called by accepting_run() to find a cycle which traverses all
|
/// Called by accepting_run() to find a cycle which traverses all
|
||||||
|
|
|
||||||
|
|
@ -238,8 +238,7 @@ namespace spot
|
||||||
|
|
||||||
struct result:
|
struct result:
|
||||||
public emptiness_check_result,
|
public emptiness_check_result,
|
||||||
public acss_statistics,
|
public acss_statistics
|
||||||
public ars_statistics
|
|
||||||
{
|
{
|
||||||
gv04& data;
|
gv04& data;
|
||||||
|
|
||||||
|
|
@ -265,7 +264,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int
|
virtual unsigned
|
||||||
acss_states() const
|
acss_states() const
|
||||||
{
|
{
|
||||||
// Gross!
|
// Gross!
|
||||||
|
|
|
||||||
|
|
@ -67,15 +67,16 @@ namespace spot
|
||||||
// size() method (which we indicate using n==1).
|
// size() method (which we indicate using n==1).
|
||||||
|
|
||||||
template <typename T, int n>
|
template <typename T, int n>
|
||||||
struct acss_interface
|
struct stats_interface
|
||||||
|
: public ars_statistics
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct acss_interface<T, 1>
|
struct stats_interface<T, 1>
|
||||||
: public acss_statistics
|
: public acss_statistics
|
||||||
{
|
{
|
||||||
int
|
unsigned
|
||||||
acss_states() const
|
acss_states() const
|
||||||
{
|
{
|
||||||
// all visited states are in the state space search
|
// all visited states are in the state space search
|
||||||
|
|
@ -89,9 +90,8 @@ namespace spot
|
||||||
template <typename ndfs_search, typename heap>
|
template <typename ndfs_search, typename heap>
|
||||||
class ndfs_result:
|
class ndfs_result:
|
||||||
public emptiness_check_result,
|
public emptiness_check_result,
|
||||||
public ars_statistics,
|
// Conditionally inherit from acss_statistics or ars_statistics.
|
||||||
// Conditionally inherit from acss_statistics.
|
public stats_interface<ndfs_result<ndfs_search, heap>, heap::Has_Size>
|
||||||
public acss_interface<ndfs_result<ndfs_search, heap>, heap::Has_Size>
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ndfs_result(const ndfs_search& ms)
|
ndfs_result(const ndfs_search& ms)
|
||||||
|
|
@ -216,7 +216,7 @@ namespace spot
|
||||||
const ndfs_search& ms_;
|
const ndfs_search& ms_;
|
||||||
const heap& h_;
|
const heap& h_;
|
||||||
template <typename T, int n>
|
template <typename T, int n>
|
||||||
friend struct acss_interface;
|
friend struct stats_interface;
|
||||||
|
|
||||||
struct transition {
|
struct transition {
|
||||||
const state* source;
|
const state* source;
|
||||||
|
|
@ -286,7 +286,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
else if (seen.find(s_prime) == seen.end())
|
else if (seen.find(s_prime) == seen.end())
|
||||||
{
|
{
|
||||||
inc_ars_cycle_states();
|
this->inc_ars_cycle_states();
|
||||||
ndfsr_trace << " it is not seen, go down" << std::endl;
|
ndfsr_trace << " it is not seen, go down" << std::endl;
|
||||||
seen.insert(s_prime);
|
seen.insert(s_prime);
|
||||||
tgba_succ_iterator* i = a_->succ_iter(s_prime);
|
tgba_succ_iterator* i = a_->succ_iter(s_prime);
|
||||||
|
|
@ -295,7 +295,7 @@ namespace spot
|
||||||
}
|
}
|
||||||
else if ((acc & covered_acc) != acc)
|
else if ((acc & covered_acc) != acc)
|
||||||
{
|
{
|
||||||
inc_ars_cycle_states();
|
this->inc_ars_cycle_states();
|
||||||
ndfsr_trace << " a propagation is needed, "
|
ndfsr_trace << " a propagation is needed, "
|
||||||
<< "start a search" << std::endl;
|
<< "start a search" << std::endl;
|
||||||
if (search(s_prime, target, dead))
|
if (search(s_prime, target, dead))
|
||||||
|
|
|
||||||
|
|
@ -302,11 +302,11 @@ struct ec_stat
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
count(const spot::ec_statistics* ec)
|
count(const spot::unsigned_statistics* ec)
|
||||||
{
|
{
|
||||||
int s = ec->states();
|
int s = ec->get("states");
|
||||||
int t = ec->transitions();
|
int t = ec->get("transitions");
|
||||||
int m = ec->max_depth();
|
int m = ec->get("max. depth");
|
||||||
|
|
||||||
if (n++)
|
if (n++)
|
||||||
{
|
{
|
||||||
|
|
@ -348,12 +348,15 @@ struct ec_ratio_stat
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
count(const spot::ec_statistics* ec, const spot::tgba* a)
|
count(const spot::unsigned_statistics* ec, const spot::tgba* a)
|
||||||
{
|
{
|
||||||
spot::tgba_statistics a_size = spot::stats_reachable(a);
|
spot::tgba_statistics a_size = spot::stats_reachable(a);
|
||||||
float ms = ec->states() / static_cast<float>(a_size.states);
|
int s = ec->get("states");
|
||||||
float mt = ec->transitions() / static_cast<float>(a_size.transitions);
|
int t = ec->get("transitions");
|
||||||
float mm = ec->max_depth() / static_cast<float>(a_size.states);
|
int m = ec->get("max. depth");
|
||||||
|
float ms = s / static_cast<float>(a_size.states);
|
||||||
|
float mt = t / static_cast<float>(a_size.transitions);
|
||||||
|
float mm = m / static_cast<float>(a_size.states);
|
||||||
|
|
||||||
if (n++)
|
if (n++)
|
||||||
{
|
{
|
||||||
|
|
@ -1413,8 +1416,7 @@ main(int argc, char** argv)
|
||||||
ec = cons_emptiness_check(i, a, degen, real_n_acc);
|
ec = cons_emptiness_check(i, a, degen, real_n_acc);
|
||||||
}
|
}
|
||||||
tm_ec.stop(algo);
|
tm_ec.stop(algo);
|
||||||
const spot::ec_statistics* ecs =
|
const spot::unsigned_statistics* ecs = ec->statistics();
|
||||||
dynamic_cast<const spot::ec_statistics*>(ec);
|
|
||||||
if (opt_z && ecs)
|
if (opt_z && ecs)
|
||||||
{
|
{
|
||||||
ec_stats[algo].count(ecs);
|
ec_stats[algo].count(ecs);
|
||||||
|
|
@ -1432,7 +1434,8 @@ main(int argc, char** argv)
|
||||||
std::cout << "acc. run";
|
std::cout << "acc. run";
|
||||||
++n_non_empty;
|
++n_non_empty;
|
||||||
const spot::acss_statistics* acss =
|
const spot::acss_statistics* acss =
|
||||||
dynamic_cast<const spot::acss_statistics*>(res);
|
dynamic_cast<const spot::acss_statistics*>
|
||||||
|
(res->statistics());
|
||||||
if (opt_z && acss)
|
if (opt_z && acss)
|
||||||
{
|
{
|
||||||
acss_stats[algo].count(acss);
|
acss_stats[algo].count(acss);
|
||||||
|
|
@ -1443,7 +1446,8 @@ main(int argc, char** argv)
|
||||||
spot::tgba_run* run;
|
spot::tgba_run* run;
|
||||||
|
|
||||||
const spot::ars_statistics* ars =
|
const spot::ars_statistics* ars =
|
||||||
dynamic_cast<const spot::ars_statistics*>(res);
|
dynamic_cast<const spot::ars_statistics*>
|
||||||
|
(res->statistics());
|
||||||
|
|
||||||
tm_ar.start(algo);
|
tm_ar.start(algo);
|
||||||
for (int count = opt_R;;)
|
for (int count = opt_R;;)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue