pev_abstraction.h
Go to the documentation of this file.
1 /** @file pev_abstraction.h Conflict preserving abstractions */
2 
3 
4 /* FAU Discrete Event Systems Library (libfaudes)
5 
6  Copyright (C) 2023 Yiheng Tang
7  Copyright (C) 2025 Thomas Moor
8  Exclusive copyright is granted to Klaus Schmidt
9 
10  This library is free software; you can redistribute it and/or
11  modify it under the terms of the GNU Lesser General Public
12  License as published by the Free Software Foundation; either
13  version 2.1 of the License, or (at your option) any later version.
14 
15  This library is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public
21  License along with this library; if not, write to the Free Software
22  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23 
24 #ifndef PEV_ABSTRACTION_H
25 #define PEV_ABSTRACTION_H
26 
27 #define PCOMPVER_VERB2(msg) \
28  { if((!faudes::ConsoleOut::G()->Mute()) && (faudes::ConsoleOut::G()->Verb() >=2 )) { \
29  std::ostringstream cfl_line; cfl_line << msg << std::endl; faudes::ConsoleOut::G()->Write(cfl_line.str(),0,0,0);} }
30 #define PCOMPVER_VERB1(msg) \
31  { if((!faudes::ConsoleOut::G()->Mute()) && (faudes::ConsoleOut::G()->Verb() >=1 )) { \
32  std::ostringstream cfl_line; cfl_line << msg << std::endl; faudes::ConsoleOut::G()->Write(cfl_line.str(),0,0,0);} }
33 #define PCOMPVER_VERB0(msg) \
34  { if((!faudes::ConsoleOut::G()->Mute()) && (faudes::ConsoleOut::G()->Verb() >=0 )) { \
35  std::ostringstream cfl_line; cfl_line << msg << std::endl; faudes::ConsoleOut::G()->Write(cfl_line.str(),0,0,0);} }
36 
37 #include "pev_pgenerator.h"
38 
39 namespace faudes {
40 
41 // manually install omega events
42 void AppendOmega(Generator& rGen);
43 
44 /**
45  * Shape generator by removing transitions that are preempted by higher priority altyernatives.
46  *
47  * @param rGen generator to shape
48  * @param rPrios event priorities
49  *
50  * @ingroup PrioritiesPlugin
51  */
52 FAUDES_API void ShapePriorities(vGenerator& rGen, const EventPriorities& rPrios);
53 
54 /**
55  * Shape generator by removing transitions that are preempted by higher priority altyernatives.
56  *
57  * @param rPGen generator to shape incl. event priorities
58  *
59  * @ingroup PrioritiesPlugin
60  */
62 
63 /**
64  * Shape generator by removing transitions that are preempted by higher priority alternatives.
65  *
66  * @param rPGen generator to shape incl. event priorities
67  * @param rUpsilon only consider events in Upsilon for shaping
68  *
69  * @ingroup PrioritiesPlugin
70  */
71 FAUDES_API void ShapeUpsilon(pGenerator& rPGen, const EventSet& rUpsilon);
72 
73 
74 /**
75  * Shape generator by removing preempted transitions
76  *
77  * @param rGen generator to shape
78  * @param rPrevs set of preempting events
79  *
80  * @ingroup PrioritiesPlugin
81  */
82 FAUDES_API void ShapePreemption(Generator& rGen, const EventSet& rPrevs);
83 
84 
85 FAUDES_API bool IsShaped(const pGenerator& rPGen, const EventSet& pevs);
86 
87 
88 /**
89  * Nonconflicting Test
90  *
91  * Given a family of generators and global event priorities, decide whether or not the
92  * synchronous composition is non-conflicting under event priorisation. This function
93  * is a variant of faudes::IsPFNonblocking that addresses a generalised concept of fairness.
94  *
95  * @param rGvec generators to consider
96  * @param rPrevs global event priosities
97  * @param rFairVec one fairness constraint per generator
98  * @return true for nonconflicting
99  *
100  * @ingroup PrioritiesPlugin
101  */
103  const GeneratorVector& rGvec,
104  const EventPriorities& rPrios,
105  const std::vector<FairnessConstraints>& rFairVec);
106 
107 /**
108  * Nonconflicting Test
109  *
110  * Given a family of generators and global event priorities, decide whether or not the
111  * synchronous composition is non-conflicting under event priorisation. This functions
112  * implements a compositional approach to avoid an explicit representation of the composed
113  * overall system.
114  *
115  * @param rGvec generators to consider
116  * @param rPrevs global event priosities
117  * @return true for nonconflicting
118  *
119  * @ingroup PrioritiesPlugin
120  */
122  const GeneratorVector& rGvec,
123  const EventPriorities& rPrios);
124 
125 
126 
127 
128 class CompVerify;
129 
130 class Candidate{
131 public:
132  Candidate(void){}
133  Candidate(Generator& goi);
134  Candidate(Generator& goi, ProductCompositionMap map,std::pair<Candidate*, Candidate*> pair);
135  virtual ~Candidate();
139  std::map<Idx,Idx> MergeMap(){return mMergeMap;}
140  std::set<Idx> FindConcreteStates(Idx abstract);
141  bool IsInMergedClass(Idx concrete,Idx abstract);
143  std::pair<Candidate*,Candidate*> DecomposedPair(){return mDecomposedPair;}
145  void SetSilentevs(EventSet silentevs) {mSilentevs.Clear(); mSilentevs.InsertSet(silentevs);}
147  Idx Tau(){return mtau;}
148  void SetTau(Idx tau){mtau = tau;}
149 
150 
151  /*! re-imp conflict-eq abstraction below */
152  virtual void HidePrivateEvs(EventSet& silent); // derived class has variance
153 
155  Generator& rGen,
156  TransSetX2EvX1& rRevTrans,
157  const std::list< StateSet >& rClasses,
158  const EventSet& silent);
159 
160  void ExtendedTransRel(
161  const Generator& rGen,
162  const EventSet& rSilentAlphabet,
163  TransSet& rXTrans);
164 
165  void IncomingTransSet(
166  const Generator& rGen,
167  const EventSet& silent,
168  const Idx& state,
169  std::set<std::pair<Idx, Idx>>& result);
170 
171  void ActiveNonTauEvs(const Generator& rGen,
172  const EventSet& silent,
173  const Idx& state,
174  EventSet &result);
175 
177  Generator& g,
178  const EventSet& silent);
179 
181  Generator& g,
182  const EventSet& silent);
183 
184 
186  Generator& g,
187  const EventSet& silent);
188 
189 
191  Generator& g,
192  const EventSet& silent);
193 
194  void RemoveTauSelfloops(
195  Generator& g,
196  const EventSet& silent);
197 
198  virtual void MergeSilentLoops(
199  Generator& g,
200  const EventSet& silent);
201 
203 
204  void BlockingSilentEvent(
205  Generator& g,
206  const EventSet& silent);
207 
209 
210  void BlockingEvent(
211  Generator& g,
212  const EventSet& silent);
213 
214  void OnlySilentIncoming(
215  Generator& g,
216  const EventSet& silent);
217 
218  void OnlySilentOutgoing(
219  Generator& g,
220  const EventSet& silent);
221 
222  virtual void ConflictEquivalentAbstraction(EventSet &silent);
223 
224 protected:
225  void DoAssign(Candidate cand);
226  Generator mGenRaw; // input generator, not abstracted yet
227  Generator mGenHidden; // generator after hiding private evs
228  Generator mGenMerged; // generator after state merging abstraction
229  std::map<Idx,Idx> mMergeMap; // map of states between mGenMerged and mGenRaw
230  EventSet mSilentevs; // original silent events before hiding.
231 
232  Idx mtau = 0;
233  // the composition map from the last iteration.
234  // Empty when not composed in the last iteration
235  // the compmap matches mGenRaw to some candidate pair
236  // in the latest iteration
238  std::pair<Candidate*, Candidate*> mDecomposedPair;
239 };
240 
241 class PCandidate : public Candidate{
242 public:
243  PCandidate (void){}
244  PCandidate (Generator &goi, EventSet pevs) : Candidate(goi), mPevs(pevs){}
245  PCandidate(Generator& goi, ProductCompositionMap map,std::pair<Candidate*, Candidate*> pair, EventSet pevs)
246  : Candidate(goi, map, pair), mPevs(pevs){}
248  EventSet Pevs() {return mPevs;}
249  void SetPSilentevs(EventSet psilentevs) {mPSilentevs.Clear(); mPSilentevs.InsertSet(psilentevs);}
250 
251  Idx Ptau(){return mPtau;}
252  void SetPtau(Idx ptau){mPtau = ptau;}
253 
254  /*!
255  * \brief HidePrivateEvs
256  * replace all private events
257  *
258  * \param silent
259  * private events which can be hidden
260  */
261  virtual void HidePrivateEvs(EventSet &silent);
262 
264  Generator& g,
265  const EventSet& silent);
266 
268  Generator& g,
269  const EventSet& silent,
270  const bool& flag);
271 
272  virtual void MergeSilentLoops(
273  Generator &g,
274  const EventSet &silent);
275 
276 
277  virtual void ConflictEquivalentAbstraction(EventSet &silent);
278 
279 private:
280  void DoAssign(PCandidate cand);
283 
284  Idx mPtau = 0;
285 
286 };
287 
288 
290 public:
292  SynchCandidates(Generator& gvoi);
294  SynchCandidates(GeneratorVector& gvoi, const EventSet& pevs);
295  virtual ~SynchCandidates();
296  typedef std::list<Candidate*>::iterator Iterator;
297 
300  void Insert(Candidate* cand) {mCandidates.push_back(cand);}
301  Idx Size(){return mCandidates.size();}
302 
303 protected:
304  void DoAssign(SynchCandidates synchcands);
305  std::list<Candidate*> mCandidates;
306 };
307 
308 
309 
310 } // namespace faudes
311 #endif // PEV_ABSTRACTION_H
#define FAUDES_API
Definition: cfl_platform.h:80
void OnlySilentIncoming(Generator &g, const EventSet &silent)
void BlockingSilentEvent(Generator &g, const EventSet &silent)
ProductCompositionMap ComposeMap()
virtual void HidePrivateEvs(EventSet &silent)
void RemoveTauSelfloops(Generator &g, const EventSet &silent)
void SetTau(Idx tau)
void RemoveNonCoaccessibleOut(Generator &g)
void ActiveNonTauEvs(const Generator &rGen, const EventSet &silent, const Idx &state, EventSet &result)
void SetSilentevs(EventSet silentevs)
std::map< Idx, Idx > mMergeMap
std::pair< Candidate *, Candidate * > DecomposedPair()
void ActiveEventsANDEnabledContinuationRule(Generator &g, const EventSet &silent)
std::map< Idx, Idx > MergeMap()
void MergeEquivalenceClasses(Generator &rGen, TransSetX2EvX1 &rRevTrans, const std::list< StateSet > &rClasses, const EventSet &silent)
Generator GenMerged()
Generator GenHidden()
std::pair< Candidate *, Candidate * > mDecomposedPair
virtual void MergeSilentLoops(Generator &g, const EventSet &silent)
void OnlySilentOutgoing(Generator &g, const EventSet &silent)
virtual ~Candidate()
Definition: pev_verify.cpp:103
ProductCompositionMap mComposeMap
void DoAssign(Candidate cand)
Definition: pev_verify.cpp:116
virtual void ConflictEquivalentAbstraction(EventSet &silent)
bool IsInMergedClass(Idx concrete, Idx abstract)
Definition: pev_verify.cpp:175
void BlockingEvent(Generator &g, const EventSet &silent)
void WeakObservationEquivalentQuotient(Generator &g, const EventSet &silent)
std::set< Idx > FindConcreteStates(Idx abstract)
Definition: pev_verify.cpp:164
void IncomingTransSet(const Generator &rGen, const EventSet &silent, const Idx &state, std::set< std::pair< Idx, Idx >> &result)
void ReverseObservationEquivalentQuotient(Generator &g, const EventSet &silent)
void ObservationEquivalentQuotient(Generator &g, const EventSet &silent)
void ExtendedTransRel(const Generator &rGen, const EventSet &rSilentAlphabet, TransSet &rXTrans)
void MergeNonCoaccessible(Generator &g)
virtual void InsertSet(const NameSet &rOtherSet)
virtual void HidePrivateEvs(EventSet &silent)
HidePrivateEvs replace all private events.
void SetPSilentevs(EventSet psilentevs)
void DoAssign(PCandidate cand)
Definition: pev_verify.cpp:128
void SetPtau(Idx ptau)
virtual void MergeSilentLoops(Generator &g, const EventSet &silent)
virtual void ConflictEquivalentAbstraction(EventSet &silent)
PCandidate(Generator &goi, EventSet pevs)
void ObservationEquivalenceQuotient_NonPreemptive(Generator &g, const EventSet &silent)
void ObservationEquivalenceQuotient_Preemptive(Generator &g, const EventSet &silent, const bool &flag)
PCandidate(Generator &goi, ProductCompositionMap map, std::pair< Candidate *, Candidate * > pair, EventSet pevs)
void Insert(Candidate *cand)
std::list< Candidate * >::iterator Iterator
std::list< Candidate * > mCandidates
void DoAssign(SynchCandidates synchcands)
Definition: pev_verify.cpp:109
virtual void Clear(void)
Definition: cfl_baseset.h:1919
NameSet EventSet
Definition: cfl_nameset.h:533
vGenerator Generator
void ShapePriorities(vGenerator &rGen, const EventPriorities &rPrios)
void ShapePreemption(Generator &rGen, const EventSet &pevs)
bool IsPFNonblocking(const GeneratorVector &rGvec, const EventPriorities &rPrios, const std::vector< FairnessConstraints > &rFairVec)
bool IsPNonblocking(const GeneratorVector &rGvec, const EventPriorities &rPrios)
TpEventSet< AttributePriority > EventPriorities
uint32_t Idx
void ShapeUpsilon(vGenerator &rGen, const EventPriorities &rPrios, const EventSet &rUpsilon)
TpGenerator< AttributePGenGl, AttributeVoid, AttributePriority, AttributeVoid > pGenerator
FAUDES_API bool IsShaped(const pGenerator &rPGen, const EventSet &pevs)
void AppendOmega(Generator &rGen)
Definition: pev_verify.cpp:31

libFAUDES 2.33b --- 2025.05.07 --- c++ api documentaion by doxygen