File: GraphReporter.h

package info (click to toggle)
maria 1.3.5-2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 3,980 kB
  • ctags: 5,458
  • sloc: cpp: 43,402; yacc: 8,080; ansic: 436; sh: 404; lisp: 395; makefile: 291; perl: 21
file content (286 lines) | stat: -rw-r--r-- 9,808 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
// Reporting successor states in graph-based analysis -*- c++ -*-

#ifndef GRAPHREPORTER_H_
# define GRAPHREPORTER_H_
# ifdef __GNUC__
#  pragma interface
# endif // __GNUC__

# include "StateReporter.h"
# include "Search.h"

/** @file GraphReporter.h
 * Interface for reporting successor states in graph-based analysis
 */

/* Copyright  2002-2003 Marko Mkel (msmakela@tcs.hut.fi).

   This file is part of MARIA, a reachability analyzer and model checker
   for high-level Petri nets.

   MARIA is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   MARIA is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   The GNU General Public License is often shipped with GNU software, and
   is generally kept in a file called COPYING or LICENSE.  If you do not
   have a copy of the license, write to the Free Software Foundation,
   59 Temple Place, Suite 330, Boston, MA 02111 USA. */

/** Reporting successor states in graph-based analysis */
class GraphReporter : public StateReporter
{
public:
  /** Constructor
   * @param compilation	the compiled model (optional)
   * @param net_	the net that is being analysed
   * @param printer_	printer object for diagnostic output
   * @param maxerrors	maximum number of allowed errors (0=infinity)
   * @param compress	flag: collapse deterministic sequences?
   * @param local	flag: suppress transient (invisible) states?
   * @param flattened	flag: consider the flattened net?
   * @param threshold	threshold for reporting state space statistics
   * @param graph	the reachability graph being generated
   */
  GraphReporter (
#ifdef EXPR_COMPILE
		 const class Compilation* compilation,
#endif // EXPR_COMPILE
		 const class Net& net_,
		 const class Printer& printer_,
		 unsigned maxerrors,
		 bool compress,
		 bool local,
		 bool flattened,
		 unsigned threshold,
		 class Graph& graph);
private:
  /** Copy constructor */
  GraphReporter (const class GraphReporter& old);
  /** Assignment operator */
  class GraphReporter& operator= (const class GraphReporter& other);
public:
  /** Destructor */
  ~GraphReporter ();

  /** Get a reference to the reachability graph */
  const class Graph& getGraph () const { return myGraph; }
  /** Get the graph of strongly connected components */
  const class ComponentGraph* getComponents () const { return myComponents; }
  /** Get a GraphReporter by module
   * @param path	amount and indexes of path components (subnets)
   */
  class GraphReporter& getChild (const unsigned* path);
  /** Get a GraphReporter by module
   * @param path	amount and indexes of path components (subnets)
   */
  const class GraphReporter& getChild (const unsigned* path) const {
    return const_cast<class GraphReporter*>(this)->getChild (path);
  }

  /** Compute the strongly connected components for this graph
   * @param state	start state of the search
   * @param cond	condition for exploring states (NULL=true)
   * @return		number of strongly connected components (0=fail)
   */
  unsigned strong (card_t state,
		   const class Expression* cond);

  /** Initialize the search list
   * @param state	the state to be analyzed
   */
  void init (card_t state) {
    assert (myStates.empty ()); myStates.push (state);
  }
  /** Assign the addOld flag */
  void setAddOld (bool addOld) { myAddOld = addOld; }

  /** Retrieve the successors of a state
   * @param state	the state to be analyzed
   * @return		the successors of the state (must be cleared by caller)
   */
  class SearchList& getSuccessors (card_t state);

  /** Analyze an anonymous transition
   * @param transition	the transition
   * @return		the successor states (must be cleared by caller)
   */
  class SearchList& getSuccessors (const class Transition& transition);

  /** Prepare for computing the enabled fairness sets
   * @param state	the state to be analyzed
   * @param buf		(output) the encoded event labels (deleted by caller)
   * @param u		(output) the bit unpacker object (deleted by caller)
   * @return		the successors of the state (deleted by caller)
   */
  card_t* prepareFair (card_t state,
		       word_t*& buf,
		       class BitUnpacker*& u);

  /** Compute the enabled fairness sets
   * @param state	the state being analyzed (for diagnostics)
   * @param u		the bit unpacker object from prepareFair ()
   * @param strong	(output) the enabled strong fairness sets (optional)
   *			(static allocation; not deleted by caller)
   * @return		amount and numbers of enabled weak fairness sets
   *			(static allocation; not deleted by caller)
   */
  unsigned* computeFair (card_t state,
			 class BitUnpacker* u,
			 unsigned** strong);

  /** Evaluate the gates of a property automaton
   * @param state	the state number of the reachability graph
   * @param prop	the state number of the property automaton
   * @param ps		current state in the property automaton
   * @return		the amount and numbers of enabled successor states
   */
  const unsigned* eval (card_t state,
			unsigned prop,
			const class PropertyState& ps);
  /** Finish evaluating the gates of a property automaton
   * @param enabled	an array of enabled states returned by eval ()
   */
#ifdef EXPR_COMPILE
  void eval_done (const unsigned* enabled) const
#else
  static void eval_done (const unsigned* enabled)
#endif // EXPR_COMPILE
  {
#ifdef EXPR_COMPILE
    if (!myCompilation)
#endif // EXPR_COMPILE
      delete[] enabled;
  }

  /** Search the state space in a modular way
   * @param kind	Type of search
   */
  void analyzeModular (enum SearchKind kind);

private:
  /** Add an encoded state to the state space
   * @param state	the encoded state
   * @param size	length of the encoded state in bytes
   * @return		true if the state was new
   */
  bool do_addState (const void* state,
		    size_t size);

  /** Add an encoded state to the state space, but do not enqueue it
   * @param state	the encoded state
   * @param size	length of the encoded state in bytes
   * @return		true if the state was new
   */
  bool do_addStateOnly (const void* state,
			size_t size);

  /** Fetch an encoded state
   * @param tail	flag: retrieve from tail of list instead of head
   * @param size	(output) length of the encoded stream
   * @return		the encoded state, or NULL if none available
   */
  word_t* do_popState (bool tail, size_t& size);

  /** Dequeue an unprocessed state
   * @param breadth	true=dequeue (FIFO, queue), false=pop (LIFO, stack)
   * @return		an unprocessed state, or NULL if all processed
   */
  class GlobalMarking* pop (bool breadth);

#ifdef EXPR_COMPILE
  /** Dequeue an unprocessed state
   * @param breadth	true=dequeue (FIFO, queue), false=pop (LIFO, stack)
   * @return		true if a state was found, or false if all processed
   */
  bool popCompiled (bool breadth);

  /** Determine whether arcs should be generated */
  bool isGraph () const { return true; }
#endif // EXPR_COMPILE

  /** Add all events from the current source state to the graph */
  void addEvents ();

  /** Report a successor state
   * @param transition	the transition fired
   * @param valuation	the binding of the transition
   * @param marking	the resulting marking
   * @param rejected	flag: is the state rejected?
   * @return		true if the state was new
   */
  bool report (const class Transition& transition,
	       const class Valuation& valuation,
	       const class GlobalMarking& marking,
	       bool rejected);

  /** Report a deadlock or an error in the current state
   * @param deadlock	flag: is this a deadlock?
   */
  void reportError (bool deadlock);

public:
#ifdef EXPR_COMPILE
  /** Report a successor state
   * @param state	the resulting encoded deflated state (mandatory)
   * @param size	length of the encoded state, in bytes
   * @param rejected	flag: is the state rejected?
   * @param hidden	flag: is the transition to the state hidden?
   * @return		true if the state was new
   */
  bool report (const void* state,
	       size_t size,
	       bool rejected,
	       bool hidden);
#endif // EXPR_COMPILE

private:
  /** Report an inconsistent successor state */
  void reject ();

public:
  /** Display a state number
   * @param m		the state (to be decomposed into module states)
   * @param state	the state number
   * @param out		the output stream
   */
  void printState (const class GlobalMarking& m,
		   card_t state,
		   const class Printer& out);

private:
  /** Threshold for reporting intermediate statistics */
  const unsigned myThreshold;
  /** The reachability graph being constructed */
  class Graph& myGraph;
  /** Graph of strongly connected components (optional) */
  class ComponentGraph* myComponents;
  /** GraphReporters for modules (only for non-flattened analysis) */
  class GraphReporter** const myChildren;
  /** Table for keeping track of visited states in non-flattened analysis */
  class BitVector* myVisited;
  /** Buffer for encoding events */
  class BitPacker myEventBuf;
  /** List of unprocessed states */
  class SearchList myStates;
  /** Number of the state being analyzed */
  card_t myStateNum;
  /** Number of the state last generated (set by do_addState) */
  card_t myTargetNum;
  /** Flag: is myStateNum being revisited? */
  bool myProcessed;
  /** Work area for computing enabled weak fairness sets */
  unsigned* myWeaklyFair;
  /** Work area for computing enabled strong fairness sets */
  unsigned* myStronglyFair;
  /** Flag: add also existing states to the state list */
  bool myAddOld;
};

#endif // GRAPHREPORTER_H_