Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members

tgbaalgos/emptinesscheck.hh

Go to the documentation of this file.
00001 // Copyright (C) 2003, 2004  Laboratoire d'Informatique de Paris 6 (LIP6),
00002 // département Systèmes Répartis Coopératifs (SRC), Université Pierre
00003 // et Marie Curie.
00004 //
00005 // This file is part of Spot, a model checking library.
00006 //
00007 // Spot is free software; you can redistribute it and/or modify it
00008 // under the terms of the GNU General Public License as published by
00009 // the Free Software Foundation; either version 2 of the License, or
00010 // (at your option) any later version.
00011 //
00012 // Spot is distributed in the hope that it will be useful, but WITHOUT
00013 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
00014 // or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
00015 // License for more details.
00016 //
00017 // You should have received a copy of the GNU General Public License
00018 // along with Spot; see the file COPYING.  If not, write to the Free
00019 // Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
00020 // 02111-1307, USA.
00021 
00022 #ifndef SPOT_EMPTINESS_CHECK_HH
00023 # define SPOT_EMPTINESS_CHECK_HH
00024 
00025 #include "tgba/tgba.hh"
00026 #include "misc/hash.hh"
00027 #include <stack>
00028 #include <list>
00029 #include <utility>
00030 #include <iostream>
00031 
00032 namespace spot
00033 {
00034 
00055   class emptiness_check
00056   {
00057     typedef std::list<const state*> state_sequence;
00058     typedef std::pair<const state*, bdd> state_proposition;
00059     typedef std::list<state_proposition> cycle_path;
00060   public:
00061     emptiness_check(const tgba* a);
00062     ~emptiness_check();
00063 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085     bool check();
00086     bool check2();
00088 
00090     void counter_example();
00091 
00095     std::ostream& print_result(std::ostream& os,
00096                                const tgba* restrict = 0) const;
00097 
00099     void print_stats(std::ostream& os) const;
00100 
00101   private:
00102 
00103     struct connected_component
00104     {
00105       // During the Depth path we keep the connected component that we met.
00106     public:
00107       connected_component(int index = -1);
00108 
00109       int index;
00112       bdd condition;
00113     };
00114 
00115     struct connected_component_set: public connected_component
00116     {
00117       typedef Sgi::hash_set<const state*,
00118                             state_ptr_hash, state_ptr_equal> set_type;
00121       set_type states;
00122 
00124       bool has_state(const state* s) const;
00125     };
00126 
00127     const tgba* aut_;
00128     std::stack<connected_component> root;
00129     state_sequence suffix;
00130     cycle_path period;
00131 
00132     typedef Sgi::hash_map<const state*, int,
00133                           state_ptr_hash, state_ptr_equal> hash_type;
00134     hash_type h;                
00135 
00141     const state* h_filt(const state* s) const;
00142 
00148     void remove_component(const state* start_delete);
00149 
00152     void accepting_path (const connected_component_set& scc,
00153                          const state* start, bdd acc_to_traverse);
00154 
00157     void complete_cycle(const connected_component_set& scc,
00158                         const state* from, const state* to);
00159   };
00160 }
00161 #endif // SPOT_EMPTINESS_CHECK_HH

Generated on Mon Mar 8 23:31:01 2004 for spot by doxygen 1.3.5