File: StateSetReporter.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 (259 lines) | stat: -rw-r--r-- 8,975 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
// Reporting successor states in safety property analysis -*- c++ -*-

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

# include "StateReporter.h"

/** @file StateSetReporter.h
 * Interface for reporting successor states in safety property 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 safety property analysis */
class StateSetReporter : 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 dotty	visualization interface for counterexamples
   * @param merge	flag: merge visual counterexamples to one graph?
   * @param states	the state space being generated
   * @param prop	property being analyzed (optional)
   */
  StateSetReporter (
# 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,
		    const class Dotty* dotty,
		    bool merge,
		    class StateSet& states,
		    const class Property* prop);

  /** Constructor for recovering error traces
   * @param old		the reporter being copied
   * @param update	flag: update the state space?
   * @param states	the state space being generated
   * @param dest	the encoded inflated destination state
   * @param destsize	length of the encoded state being sought, in words
   */
  StateSetReporter (const class StateSetReporter& old,
		    bool update,
		    class StateSet& states,
		    const word_t* dest,
		    unsigned destsize);

  /** Constructor for client-side reporting in distributed search
   * @param old		the reporter being copied
   * @param states	the state space being generated
   */
  StateSetReporter (const class StateSetReporter& old,
		    class StateSet& states);

private:
  /** Copy constructor */
  StateSetReporter (const class StateSetReporter& old);
  /** Assignment operator */
  class StateSetReporter& operator= (const class StateSetReportert& other);
public:
  /** Destructor */
  ~StateSetReporter ();

  /** Start displaying an error trace */
  void displayPrologue () const;
  /** Finish displaying an error trace */
  void displayEpilogue () const;
  /** Display a marking */
  void displayMarking (const class GlobalMarking& m) const;
  /** Display an encoded inflated state
   * @param s		the state to be displayed
   */
  void displayState (const word_t* s) const;
  /** Display a path leading from a state to another
   * @param src		the encoded inflated source state
   * @param dest	the encoded inflated destination state
   * @param destsize	length of the encoded state being sought, in words
   */
  void displayPath (const word_t* src,
		    const word_t* dest,
		    unsigned destsize) const;

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);

  /** 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);
# 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 analysis should proceed; false on fatal error
   */
  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

  /** @name Server-side methods for distributed verification */
  /*@{*/
  /** Report a successor state and a number of pending states
   * @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?
   * @param pending	number of additional pending states
   * @return		true if the state was new
   */
  bool report (const void* state,
	       size_t size,
	       bool rejected,
	       bool hidden,
	       unsigned pending);

  /** Display path to a rejected state
   * @param dstate	the encoded rejected state
   * @param dlen	length of dstate in bytes
   * @param offset	offset to the counterexample path file
   * @param reduced	flag: has the state space been reduced?
   * @param reason	reason for rejecting the state
   */
  void reject (const void* dstate,
	       size_t dlen,
	       long offset,
	       bool reduced,
	       unsigned reason);

  /** Fetch an encoded state
   * @param tail	flag: retrieve from tail of list instead of head
   * @param size	(output) length of the encoded stream
   * @param offset	(output) offset to the counterexample file
   * @return		the encoded state
   */
  word_t* pop (bool tail, size_t& size, long& offset);

  /** Set the offset to the counterexample
   * @param offset	offset to the counterexample path file
   */
  void setOffset (long offset);
  /*@}*/

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

  /** Display a path from src to myDest
   * @param src		the encoded inflated source state
   */
  void displayPath (const word_t* src);

private:
  /** Threshold for reporting intermediate statistics */
  const unsigned myThreshold;
  /** Visualization interface for counterexamples */
  const class Dotty* const myDotty;
  /** Flag: merge visual counterexamples to one graph? */
  const bool myMerge;
  /** Flag: update the state space? */
  const bool myUpdate;
  /** Encoded state being sought (optional) */
  const word_t* const myDest;
  /** Length of the encoded state being sought */
  const unsigned myDestSize;
  /** The state space being generated */
  class StateSet& myStates;
  /** Property being analyzed (optional) */
  const class Property* const myProp;
  /** Number of bits per property state (0 when no property) */
  const unsigned myPropBits;
  /** Amount and numbers of the enabled successor states in myProp */
  unsigned* myPropSucc;
  /** Flag: is the property automaton about to enter a rejecting state? */
  bool myPropReject;
};

#endif // STATESETREPORTER_H_