DiaDes  0.1
DIAgnosis of Discrete-Event System
Project.hh
Go to the documentation of this file.
1 
9 #ifndef __DIADES__AUTOMATA__EXPERIMENTAL__PROJECT__HH
10 #define __DIADES__AUTOMATA__EXPERIMENTAL__PROJECT__HH
11 
12 #include<unordered_map>
13 #include<unordered_set>
20 
21 namespace Diades {
22  namespace Automata {
23  namespace Experimental {
24  namespace Projection {
25 
39  template<typename Fsm>
40  void
42  CstBsMap<Fsm> & bsFromState)
43  {
44  bool fixpoint = false;
45  while (!fixpoint) {
46  fixpoint = true;
47  std::for_each(machine.stateBegin(), machine.stateEnd(),
48  [&](typename Fsm::State state) {
49  auto previousSize = bsFromState[state]->size();
50  std::vector<typename Fsm::State> states;
51  states.reserve(bsFromState[state]->size());
52  std::copy(bsFromState[state]->begin(),
53  bsFromState[state]->end(),
54  std::back_inserter(states)); // can we do it better ?? without copy ?
55  std::for_each(states.begin(), states.end(),
56  [&](typename Fsm::State visited) {
57  if (visited != state) {
58  bsFromState[state]->insertStates(bsFromState[visited]->begin(),
59  bsFromState[visited]->end());
60  }
61  });
62  fixpoint &= previousSize == bsFromState[state]->size();
63  });
64  }
65  }
66 
67 
68 
69 
87  template<typename Fsm, typename IsGoal>
88  void
90  IsGoal isGoal,
91  CstBsMap<Fsm> & bsFromState) {
92  using FsmBs = BeliefState<Fsm>;
93  std::for_each(machine.stateBegin(), machine.stateEnd(),
94  [&](typename Fsm::State state) {
95  bsFromState[state] = std::make_shared<FsmBs>(machine);
96  bsFromState[state]->insertState(state);
97  });
98  std::for_each(machine.transitionBegin(), machine.transitionEnd(),
99  [&](typename Fsm::Transition transition)
100  {
101  if(isGoal(transition))
102  {
103  bsFromState[transition.source()]->insertState(transition.target());
104  }
105  });
106  }
107 
108 
109 
123  template<typename Fsm, typename IsGoal>
124  void
125  makeBeliefStates(const Fsm & machine,
126  IsGoal isGoal,
127  CstBsMap<Fsm> & bsFromState) {
128  computeElementaryBeliefStates(machine, isGoal, bsFromState);
129  aggregateElementaryBeliefStates(machine,bsFromState);
130  }
131 
132 
133 
152  template<typename Fsm, typename EventPropertyIdIterator>
153  void
155  EventPropertyIdIterator begin,
156  EventPropertyIdIterator end,
157  CstBsMap<Fsm> & bsFromState) {
158  using FsmBs = BeliefState<Fsm>;
159  std::for_each(machine.stateBegin(), machine.stateEnd(),
160  [&](typename Fsm::State state) {
161  bsFromState[state] = std::make_shared<FsmBs>(machine);
162  bsFromState[state]->insertState(state);
163  });
164  std::for_each(begin, end,
165  [&](typename Fsm::EventPropertyId evt) {
166  std::for_each(machine.eventTransitionBegin(evt), machine.eventTransitionEnd(evt),
167  [&](typename Fsm::Transition t) {
168  bsFromState[t.source()]->insertState(t.target());
169  });
170  });
171  }
172 
173 
174 
175 
190  template<typename Fsm, typename EventPropertyIdIterator>
191  void
192  makeBeliefStates(const Fsm & machine,
193  EventPropertyIdIterator begin,
194  EventPropertyIdIterator end,
195  CstBsMap<Fsm> & bsFromState) {
196  computeElementaryBeliefStates(machine, begin, end, bsFromState);
197  aggregateElementaryBeliefStates(machine, bsFromState);
198  }
199 
200 
201 
231  template<typename Fsm, typename EventPropertyIdIterator>
232  bool
233  projectRange(const Fsm & machine,
234  Fsm & abstractMachine,
235  EventPropertyIdIterator projectedBegin,
236  EventPropertyIdIterator projectedEnd,
237  EventPropertyIdIterator abstractedBegin,
238  EventPropertyIdIterator abstractedEnd,
240  BsMap<Fsm> & bsMap,
242  bool result = (machine.initialStateBegin() != machine.initialStateEnd())
243  && (machine != abstractMachine);
244  if (result) {
245  CstBsMap<Fsm> localBsMap(machine.behaviour());
246  makeBeliefStates(machine, abstractedBegin, abstractedEnd, localBsMap);
247  abstractMachine.clear();
248  std::vector<typename Fsm::State> toVisit;
249  toVisit.reserve(machine.numberOfStates());
250 
251  // the projected machine has the same number of initial states
252  std::for_each(machine.initialStateBegin(), machine.initialStateEnd(),
253  [&](typename Fsm::State state) {
254  typename Fsm::State newState;
255  // For each state i we associate the projected state i -> i1 i2 .. that
256  // in the belief state
257  std::tie(newState, result) = stateCreation.newState(state, *localBsMap[state]);
258  if (result) {
259  abstractMachine.setInitial(newState);
260  stMap[state] = newState;
261  bsMap[newState] = localBsMap[state];
262  toVisit.push_back(state);
263  }
264  });
265  std::for_each(projectedBegin, projectedEnd,
266  [&](typename Fsm::EventPropertyId event) {
267  abstractMachine.copyEventPropertyId(machine, event);
268  });
269 
270  while (result && !toVisit.empty()) {
271  // current visited state
272  auto currentState = toVisit.back();
273  toVisit.pop_back();
274  // for any event that is projected
275  std::for_each(projectedBegin, projectedEnd,
276  [&](typename Fsm::EventPropertyId evt) {
277  // we compute the set of states that can be reached from the belief state
278  // of the visited state by the trigger of the event evt
279  auto nextBs = localBsMap[currentState]->nextBeliefState(evt);
280 
281  // each state of nextBs is a potential target
282  // for the tigger of evt, so each target must have
283  // its corresponding beliefstates mapped into abstractMachine
284  std::for_each(nextBs->begin(), nextBs->end(),
285  [&](typename Fsm::State target) {
286  if (!stMap[target].valid()) {
287  // the corresponding beliefstate of target is not yet
288  // in abstractmachine, we put it
289  typename Fsm::State newTarget;
290  std::tie(newTarget, result) = stateCreation.newState(target, *localBsMap[target]);
291  if (result) {
292  stMap[target] = newTarget;
293  toVisit.push_back(target);
294  }
295  }
296  abstractMachine.newTransition(stMap[currentState], stMap[target], evt);
297  });
298  });
299  }
300  }
301  return result;
302  }
303 
325  template<typename Fsm, typename IsGoal>
326  bool
327  projectRange(const Fsm & machine,
328  Fsm & abstractMachine,
329  IsGoal isGoal,
331  BsMap<Fsm> & bsMap,
333  bool result = (machine.initialStateBegin() != machine.initialStateEnd())
334  && (machine != abstractMachine);
335  if (result) {
336  using FsmBs = BeliefState<Fsm>;
337  using Transition = typename Fsm::Transition;
338  using State = typename Fsm::State;
339  CstBsMap<Fsm> localBsMap(machine.behaviour());
340  makeBeliefStates(machine,[&](Transition t){ return !isGoal(t); }, localBsMap);
341  //abstractMachine.clear();
342  std::vector<typename Fsm::State> toVisit;
343  toVisit.reserve(machine.numberOfStates());
344 
345  // the projected machine has the same number of initial states
346  std::for_each(machine.initialStateBegin(), machine.initialStateEnd(),
347  [&](typename Fsm::State state) {
348  typename Fsm::State newState;
349  // For each state i we associate the projected state i -> i1 i2 .. that
350  // in the belief state
351  std::tie(newState, result) = stateCreation.newState(state, *localBsMap[state]);
352  if (result) {
353  abstractMachine.setInitial(newState);
354  stMap[state] = newState;
355  bsMap[newState] = localBsMap[state];
356  toVisit.push_back(state);
357  }
358  });
359 
360  while (result && !toVisit.empty()) {
361  // current visited state
362  auto currentState = toVisit.back();
363  toVisit.pop_back();
364  // we compute the set of states that can be reached from the belief state
365  // of the visited state by a goal transition from the current belief state
366  auto nextBs = std::make_shared<FsmBs>(machine);
367  std::for_each(localBsMap[currentState]->begin(),
368  localBsMap[currentState]->end(),
369  [&](State s)
370  {
371  for(auto it = machine.outputTransitionBegin(s);
372  it != machine.outputTransitionEnd(s);
373  ++it)
374  {
375  if(isGoal(*it))
376  {
377  nextBs->insertState(it->target());
378  if (!stMap[it->target()].valid()) {
379  // the corresponding beliefstate of target is not yet
380  // in abstractmachine, we put it
381  State newTarget;
382  std::tie(newTarget, result) = stateCreation.newState(it->target(),
383  *localBsMap[it->target()]);
384  if (result)
385  {
386  stMap[it->target()] = newTarget;
387  bsMap[newTarget] = localBsMap[it->target()];
388  toVisit.push_back(it->target());
389  }
390  }
391  abstractMachine.newTransition(stMap[currentState],
392  stMap[it->target()],
393  machine.getEvent(*it));
394  }
395  }
396  });
397  }
398  }
399  return result;
400  }
401 
402  };
403 
424  template<typename Fsm, typename IsGoal>
425  bool
426  project(const Fsm & machine,
427  Fsm & abstractMachine,
428  IsGoal isGoal,
429  BsMap<Fsm> & bsMap,
431  {
432  OnlySourceStateCreator<Fsm> creator(machine, abstractMachine);
433  bsMap.init(abstractMachine.behaviour());
434  stMap.init(machine.behaviour());
435  return Projection::projectRange(machine, abstractMachine,
436  [&](typename Fsm::Transition transition)
437  { return isGoal(transition); }, creator,
438  bsMap,stMap);
439  }
440 
441 
442 
456  template<typename Fsm, typename IsGoal>
457  bool
458  project(const Fsm & machine,
459  Fsm & abstractMachine,
460  IsGoal isGoal) {
461  BsMap<Fsm> bsMap;
463  return project(machine,abstractMachine,isGoal,bsMap,stMap);
464  }
465 
466 
467 
468 
490  template<typename Fsm, typename EventPropertyIdIterator>
491  bool
492  project(const Fsm & machine,
493  Fsm & abstractMachine,
494  EventPropertyIdIterator begin,
495  EventPropertyIdIterator end,
496  BsMap<Fsm> & bsMap,
498  std::vector<typename Fsm::EventPropertyId> abstractedEvents;
499  abstractedEvents.reserve(machine.numberOfEvents());
500  std::copy_if(machine.eventBegin(), machine.eventEnd(), std::back_inserter(abstractedEvents),
501  [&](typename Fsm::EventPropertyId evt) {
502  return std::find(begin, end, evt) == end;
503  });
504 
505  OnlySourceStateCreator<Fsm> creator(machine, abstractMachine);
506  bsMap.init(abstractMachine.behaviour());
507  stMap.init(machine.behaviour());
508  return Projection::projectRange(machine, abstractMachine,
509  begin, end,
510  abstractedEvents.begin(), abstractedEvents.end(), creator,
511  bsMap,stMap);
512  }
513 
514 
515 
530  template<typename Fsm, typename EventPropertyIdIterator>
531  bool
532  project(const Fsm & machine,
533  Fsm & abstractMachine,
534  EventPropertyIdIterator begin,
535  EventPropertyIdIterator end) {
536  BsMap<Fsm> bsMap;
538  return project(machine,abstractMachine,begin,end,bsMap,stMap);
539  }
540 
541 
562  template<typename Fsm,
563  typename IsGoal,
564  typename StateProperty,
565  typename StateLabelProjection>
566  bool
567  project(const Fsm & fsm,
568  Fsm & projectedFsm,
571  const StateLabelProjection & projection,
572  IsGoal isGoal,
573  BsMap<Fsm> & bsMap,
575  ManagedBeliefStateWithSourceStateCreator<Fsm, StateLabelProjection> creator(fsm, projectedFsm, stateManager, projectionStateManager);
576  bsMap.init(projectedFsm.behaviour());
577  stMap.init(fsm.behaviour());
578  return Projection::projectRange(fsm, projectedFsm,
579  isGoal, creator,
580  bsMap,stMap);
581  }
582 
596  template<typename Fsm,
597  typename IsGoal,
598  typename StateProperty,
599  typename StateLabelProjection>
600  bool
601  project(const Fsm & fsm,
602  Fsm & projectedFsm,
605  const StateLabelProjection & projection,
606  IsGoal isGoal) {
607  BsMap<Fsm> bsMap;
609  return project(fsm,projectedFsm,stateManager,projectionStateManager,projection,isGoal,bsMap,stMap);
610  }
611 
612 
613 
614 
615 
616 
638  template<typename Fsm,
639  typename EventPropertyIdIterator,
640  typename StateProperty,
641  typename StateLabelProjection>
642  bool
643  project(const Fsm & fsm,
644  Fsm & projectedFsm,
647  const StateLabelProjection & projection,
648  EventPropertyIdIterator begin,
649  EventPropertyIdIterator end,
650  BsMap<Fsm> & bsMap,
652  std::vector<typename Fsm::EventPropertyId> abstractedEvents;
653  abstractedEvents.reserve(fsm.numberOfEvents());
654  std::copy_if(fsm.eventBegin(), fsm.eventEnd(), std::back_inserter(abstractedEvents),
655  [&](typename Fsm::EventPropertyId evt) {
656  return std::find(begin, end, evt) == end;
657  });
658  ManagedBeliefStateWithSourceStateCreator<Fsm, StateLabelProjection> creator(fsm, projectedFsm, stateManager, projectionStateManager);
659  bsMap.init(projectedFsm.behaviour());
660  stMap.init(fsm.behaviour());
661  return Projection::projectRange(fsm, projectedFsm,
662  begin, end,
663  abstractedEvents.begin(), abstractedEvents.end(), creator,
664  bsMap, stMap);
665  }
680  template<typename Fsm,
681  typename EventPropertyIdIterator,
682  typename StateProperty,
683  typename StateLabelProjection>
684  bool
685  project(const Fsm & fsm,
686  Fsm & projectedFsm,
689  const StateLabelProjection & projection,
690  EventPropertyIdIterator begin,
691  EventPropertyIdIterator end) {
692  BsMap<Fsm> bsMap;
694  return project(fsm,projectedFsm,stateManager,projectionStateManager,projection,begin,end,bsMap,stMap);
695  }
696 
718  template<typename Fsm, typename EventPropertyIdIterator>
719  bool
720  abstractEvents(const Fsm & machine,
721  Fsm & abstractMachine,
722  EventPropertyIdIterator begin,
723  EventPropertyIdIterator end,
724  BsMap<Fsm> & bsMap,
726  std::vector<typename Fsm::EventPropertyId> projectedEvents;
727  projectedEvents.reserve(machine.numberOfEvents());
728  std::copy_if(machine.eventBegin(), machine.eventEnd(), std::back_inserter(projectedEvents),
729  [&](typename Fsm::EventPropertyId evt) {
730  return std::find(begin, end, evt) == end;
731  });
732  bsMap.init(abstractMachine.behaviour());
733  stMap.init(machine.behaviour());
734  return Projection::projectRange(machine, abstractMachine,
735  projectedEvents.begin(), projectedEvents.end(),
736  begin, end,
737  bsMap,stMap);
738  }
739 
740 
755  template<typename Fsm, typename EventPropertyIdIterator>
756  bool
757  abstractEvents(const Fsm & machine,
758  Fsm & abstractMachine,
759  EventPropertyIdIterator begin,
760  EventPropertyIdIterator end) {
761  BsMap<Fsm> bsMap;
763  return abstractEvents(machine, abstractMachine, begin, end, bsMap, stMap);
764  }
765 
766 
788  template<typename Fsm, typename EventPropertyIdIterator, typename StateProperty,
789  typename StateLabelProjection>
790  bool
791  abstractEvents(const Fsm & fsm,
792  Fsm & projectedFsm,
795  const StateLabelProjection & projection,
796  EventPropertyIdIterator begin,
797  EventPropertyIdIterator end,
798  BsMap<Fsm> & bsMap,
800  std::vector<typename Fsm::EventPropertyId> projectedEvents;
801  projectedEvents.reserve(fsm.numberOfEvents());
802  std::copy_if(fsm.eventBegin(), fsm.eventEnd(), std::back_inserter(projectedEvents),
803  [&](typename Fsm::EventPropertyId evt) {
804  return std::find(begin, end, evt) == end;
805  });
806 
807  ManagedBeliefStateWithSourceStateCreator<Fsm, StateLabelProjection> creator(fsm, projectedFsm, stateManager, projectionStateManager);
808 
809  bsMap.init(projectedFsm.behaviour());
810  stMap.init(fsm.behaviour());
811  return Projection::projectRange(fsm, projectedFsm,
812  projectedEvents.begin(),
813  projectedEvents.end(),
814  begin, end, creator,
815  bsMap,stMap);
816  }
817 
818 
819 
820 
835  template<typename Fsm, typename EventPropertyIdIterator, typename StateProperty,
836  typename StateLabelProjection>
837  bool
838  abstractEvents(const Fsm & fsm,
839  Fsm & projectedFsm,
842  const StateLabelProjection & projection,
843  EventPropertyIdIterator begin,
844  EventPropertyIdIterator end) {
845  BsMap<Fsm> bsMap;
847  return abstractEvents(fsm,projectedFsm,stateManager,projectionStateManager,projection, begin,end, bsMap, stMap);
848  }
849 
850  }
851  }
852 }
853 
854 #endif /* PROJECT_HH */
855 
Diades::Graph::ConstNodeMap< Type > CstStMap
Diades::Graph::Edge Transition
Definition: Component.hh:46
virtual std::pair< State, bool > newState(State source, const FsmBs &bs)=0
FaultyEventStateMachine< CandidateId, EventInfoId > Fsm
void aggregateElementaryBeliefStates(const Fsm &machine, CstBsMap< Fsm > &bsFromState)
Definition: Project.hh:41
StIndexes states
Definition: Run.cc:266
CstStMap< BsPtr< Fsm > > CstBsMap
Definition: BeliefState.hh:474
bool abstractEvents(const Fsm &machine, Fsm &abstractMachine, EventPropertyIdIterator begin, EventPropertyIdIterator end, BsMap< Fsm > &bsMap, CstStMap< typename Fsm::State > &stMap)
Definition: Project.hh:720
AutFsm::State State
Definition: Run.cc:72
AutFsm::Transition Transition
Definition: Run.cc:73
Namespace of the Diades project.
bool project(const Fsm &machine, Fsm &abstractMachine, IsGoal isGoal, BsMap< Fsm > &bsMap, CstStMap< typename Fsm::State > &stMap)
Definition: Project.hh:426
bool projectRange(const Fsm &machine, Fsm &abstractMachine, EventPropertyIdIterator projectedBegin, EventPropertyIdIterator projectedEnd, EventPropertyIdIterator abstractedBegin, EventPropertyIdIterator abstractedEnd, BeliefStateWithSourceStateCreator< Fsm > &stateCreation, BsMap< Fsm > &bsMap, CstStMap< typename Fsm::State > &stMap)
Definition: Project.hh:233
Diades::Graph::Node State
Definition: BeliefState.hh:36
void computeElementaryBeliefStates(const Fsm &machine, IsGoal isGoal, CstBsMap< Fsm > &bsFromState)
Definition: Project.hh:89
StMap< BsPtr< Fsm > > BsMap
Definition: BeliefState.hh:482
void makeBeliefStates(const Fsm &machine, IsGoal isGoal, CstBsMap< Fsm > &bsFromState)
Definition: Project.hh:125