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

gtec.hh

Go to the documentation of this file.
00001 // Copyright (C) 2003, 2004, 2005  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_TGBAALGOS_GTEC_GTEC_HH
00023 # define SPOT_TGBAALGOS_GTEC_GTEC_HH
00024 
00025 #include <stack>
00026 #include "status.hh"
00027 #include "tgbaalgos/emptiness.hh"
00028 #include "tgbaalgos/emptiness_stats.hh"
00029 
00030 namespace spot
00031 {
00034 
00085   class couvreur99_check: public emptiness_check, public ec_statistics
00086   {
00087   public:
00088     couvreur99_check(const tgba* a,
00089                      bool poprem = true,
00090                      const numbered_state_heap_factory* nshf
00091                      = numbered_state_heap_hash_map_factory::instance());
00092     virtual ~couvreur99_check();
00093 
00095     virtual emptiness_check_result* check();
00096 
00097     virtual std::ostream& print_stats(std::ostream& os) const;
00098 
00107     const couvreur99_check_status* result() const;
00108 
00109   protected:
00110     couvreur99_check_status* ecs_;
00116     void remove_component(const state* start_delete);
00117 
00119     bool poprem_;
00120   };
00121 
00131   class couvreur99_check_shy : public couvreur99_check
00132   {
00133   public:
00134     couvreur99_check_shy(const tgba* a,
00135                          bool poprem = true,
00136                          bool group = true,
00137                          const numbered_state_heap_factory* nshf
00138                          = numbered_state_heap_hash_map_factory::instance());
00139     virtual ~couvreur99_check_shy();
00140 
00141     virtual emptiness_check_result* check();
00142 
00143   protected:
00144     struct successor {
00145       bdd acc;
00146       const spot::state* s;
00147       successor(bdd acc, const spot::state* s): acc(acc), s(s) {}
00148     };
00149 
00150     // We use five main data in this algorithm:
00151     // * couvreur99_check::root, a stack of strongly connected components (SCC),
00152     // * couvreur99_check::h, a hash of all visited nodes, with their order,
00153     //   (it is called "Hash" in Couvreur's paper)
00154     // * arc, a stack of acceptance conditions between each of these SCC,
00155     std::stack<bdd> arc;
00156     // * num, the number of visited nodes.  Used to set the order of each
00157     //   visited node,
00158     int num;
00159     // * todo, the depth-first search stack.  This holds pairs of the
00160     //   form (STATE, SUCCESSORS) where SUCCESSORS is a list of
00161     //   (ACCEPTANCE_CONDITIONS, STATE) pairs.
00162     typedef std::list<successor> succ_queue;
00163 
00164     struct todo_item
00165     {
00166       const state* s;
00167       int n;
00168       succ_queue q;
00169       todo_item(const state* s, int n)
00170         : s(s), n(n)
00171       {
00172       }
00173     };
00174 
00175     typedef std::list<todo_item> todo_list;
00176     todo_list todo;
00177 
00178     void clear_todo();
00179 
00180     // Whether successors should be grouped for states in the same
00181     // SCC.
00182     bool group_;
00183 
00192     virtual int* find_state(const state* s);
00193   };
00194 
00196 }
00197 
00198 #endif // SPOT_TGBAALGOS_GTEC_GTEC_HH

Please comment this page and report errors about it on the RefDocComments page.
Generated on Mon Jan 31 12:54:24 2005 for spot by doxygen 1.4.0