9 #ifndef __DIADES__AUTOMATA__EXPERIMENTAL__PROJECT__HH 10 #define __DIADES__AUTOMATA__EXPERIMENTAL__PROJECT__HH 12 #include<unordered_map> 13 #include<unordered_set> 23 namespace Experimental {
24 namespace Projection {
39 template<
typename Fsm>
44 bool fixpoint =
false;
47 std::for_each(machine.stateBegin(), machine.stateEnd(),
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));
55 std::for_each(states.begin(), states.end(),
57 if (visited != state) {
58 bsFromState[state]->insertStates(bsFromState[visited]->begin(),
59 bsFromState[visited]->end());
62 fixpoint &= previousSize == bsFromState[state]->size();
87 template<
typename Fsm,
typename IsGoal>
93 std::for_each(machine.stateBegin(), machine.stateEnd(),
95 bsFromState[state] = std::make_shared<FsmBs>(machine);
96 bsFromState[state]->insertState(state);
98 std::for_each(machine.transitionBegin(), machine.transitionEnd(),
101 if(isGoal(transition))
103 bsFromState[transition.source()]->insertState(transition.target());
123 template<
typename Fsm,
typename IsGoal>
152 template<
typename Fsm,
typename EventPropertyIdIterator>
155 EventPropertyIdIterator begin,
156 EventPropertyIdIterator end,
159 std::for_each(machine.stateBegin(), machine.stateEnd(),
161 bsFromState[state] = std::make_shared<FsmBs>(machine);
162 bsFromState[state]->insertState(state);
164 std::for_each(begin, end,
165 [&](
typename Fsm::EventPropertyId evt) {
166 std::for_each(machine.eventTransitionBegin(evt), machine.eventTransitionEnd(evt),
168 bsFromState[t.source()]->insertState(t.target());
190 template<
typename Fsm,
typename EventPropertyIdIterator>
193 EventPropertyIdIterator begin,
194 EventPropertyIdIterator end,
231 template<
typename Fsm,
typename EventPropertyIdIterator>
234 Fsm & abstractMachine,
235 EventPropertyIdIterator projectedBegin,
236 EventPropertyIdIterator projectedEnd,
237 EventPropertyIdIterator abstractedBegin,
238 EventPropertyIdIterator abstractedEnd,
242 bool result = (machine.initialStateBegin() != machine.initialStateEnd())
243 && (machine != abstractMachine);
247 abstractMachine.clear();
248 std::vector<typename Fsm::State> toVisit;
249 toVisit.reserve(machine.numberOfStates());
252 std::for_each(machine.initialStateBegin(), machine.initialStateEnd(),
257 std::tie(newState, result) = stateCreation.
newState(state, *localBsMap[state]);
259 abstractMachine.setInitial(newState);
260 stMap[state] = newState;
261 bsMap[newState] = localBsMap[state];
262 toVisit.push_back(state);
265 std::for_each(projectedBegin, projectedEnd,
266 [&](
typename Fsm::EventPropertyId event) {
267 abstractMachine.copyEventPropertyId(machine, event);
270 while (result && !toVisit.empty()) {
272 auto currentState = toVisit.back();
275 std::for_each(projectedBegin, projectedEnd,
276 [&](
typename Fsm::EventPropertyId evt) {
279 auto nextBs = localBsMap[currentState]->nextBeliefState(evt);
284 std::for_each(nextBs->begin(), nextBs->end(),
286 if (!stMap[target].valid()) {
290 std::tie(newTarget, result) = stateCreation.
newState(target, *localBsMap[target]);
292 stMap[target] = newTarget;
293 toVisit.push_back(target);
296 abstractMachine.newTransition(stMap[currentState], stMap[target], evt);
325 template<
typename Fsm,
typename IsGoal>
328 Fsm & abstractMachine,
333 bool result = (machine.initialStateBegin() != machine.initialStateEnd())
334 && (machine != abstractMachine);
342 std::vector<typename Fsm::State> toVisit;
343 toVisit.reserve(machine.numberOfStates());
346 std::for_each(machine.initialStateBegin(), machine.initialStateEnd(),
351 std::tie(newState, result) = stateCreation.
newState(state, *localBsMap[state]);
353 abstractMachine.setInitial(newState);
354 stMap[state] = newState;
355 bsMap[newState] = localBsMap[state];
356 toVisit.push_back(state);
360 while (result && !toVisit.empty()) {
362 auto currentState = toVisit.back();
366 auto nextBs = std::make_shared<FsmBs>(machine);
367 std::for_each(localBsMap[currentState]->begin(),
368 localBsMap[currentState]->end(),
371 for(
auto it = machine.outputTransitionBegin(s);
372 it != machine.outputTransitionEnd(s);
377 nextBs->insertState(it->target());
378 if (!stMap[it->target()].valid()) {
382 std::tie(newTarget, result) = stateCreation.
newState(it->target(),
383 *localBsMap[it->target()]);
386 stMap[it->target()] = newTarget;
387 bsMap[newTarget] = localBsMap[it->target()];
388 toVisit.push_back(it->target());
391 abstractMachine.newTransition(stMap[currentState],
393 machine.getEvent(*it));
424 template<
typename Fsm,
typename IsGoal>
427 Fsm & abstractMachine,
433 bsMap.init(abstractMachine.behaviour());
434 stMap.init(machine.behaviour());
437 {
return isGoal(transition); }, creator,
456 template<
typename Fsm,
typename IsGoal>
459 Fsm & abstractMachine,
463 return project(machine,abstractMachine,isGoal,bsMap,stMap);
490 template<
typename Fsm,
typename EventPropertyIdIterator>
493 Fsm & abstractMachine,
494 EventPropertyIdIterator begin,
495 EventPropertyIdIterator end,
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;
506 bsMap.init(abstractMachine.behaviour());
507 stMap.init(machine.behaviour());
510 abstractedEvents.begin(), abstractedEvents.end(), creator,
530 template<
typename Fsm,
typename EventPropertyIdIterator>
533 Fsm & abstractMachine,
534 EventPropertyIdIterator begin,
535 EventPropertyIdIterator end) {
538 return project(machine,abstractMachine,begin,end,bsMap,stMap);
562 template<
typename Fsm,
564 typename StateProperty,
565 typename StateLabelProjection>
571 const StateLabelProjection & projection,
576 bsMap.init(projectedFsm.behaviour());
577 stMap.init(fsm.behaviour());
596 template<
typename Fsm,
598 typename StateProperty,
599 typename StateLabelProjection>
605 const StateLabelProjection & projection,
609 return project(fsm,projectedFsm,stateManager,projectionStateManager,projection,isGoal,bsMap,stMap);
638 template<
typename Fsm,
639 typename EventPropertyIdIterator,
640 typename StateProperty,
641 typename StateLabelProjection>
647 const StateLabelProjection & projection,
648 EventPropertyIdIterator begin,
649 EventPropertyIdIterator end,
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;
659 bsMap.init(projectedFsm.behaviour());
660 stMap.init(fsm.behaviour());
663 abstractedEvents.begin(), abstractedEvents.end(), creator,
680 template<
typename Fsm,
681 typename EventPropertyIdIterator,
682 typename StateProperty,
683 typename StateLabelProjection>
689 const StateLabelProjection & projection,
690 EventPropertyIdIterator begin,
691 EventPropertyIdIterator end) {
694 return project(fsm,projectedFsm,stateManager,projectionStateManager,projection,begin,end,bsMap,stMap);
718 template<
typename Fsm,
typename EventPropertyIdIterator>
721 Fsm & abstractMachine,
722 EventPropertyIdIterator begin,
723 EventPropertyIdIterator end,
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;
732 bsMap.init(abstractMachine.behaviour());
733 stMap.init(machine.behaviour());
735 projectedEvents.begin(), projectedEvents.end(),
755 template<
typename Fsm,
typename EventPropertyIdIterator>
758 Fsm & abstractMachine,
759 EventPropertyIdIterator begin,
760 EventPropertyIdIterator end) {
763 return abstractEvents(machine, abstractMachine, begin, end, bsMap, stMap);
788 template<
typename Fsm,
typename EventPropertyIdIterator,
typename StateProperty,
789 typename StateLabelProjection>
795 const StateLabelProjection & projection,
796 EventPropertyIdIterator begin,
797 EventPropertyIdIterator end,
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;
809 bsMap.init(projectedFsm.behaviour());
810 stMap.init(fsm.behaviour());
812 projectedEvents.begin(),
813 projectedEvents.end(),
835 template<
typename Fsm,
typename EventPropertyIdIterator,
typename StateProperty,
836 typename StateLabelProjection>
842 const StateLabelProjection & projection,
843 EventPropertyIdIterator begin,
844 EventPropertyIdIterator end) {
847 return abstractEvents(fsm,projectedFsm,stateManager,projectionStateManager,projection, begin,end, bsMap, stMap);
Diades::Graph::ConstNodeMap< Type > CstStMap
Diades::Graph::Edge Transition
virtual std::pair< State, bool > newState(State source, const FsmBs &bs)=0
FaultyEventStateMachine< CandidateId, EventInfoId > Fsm
void aggregateElementaryBeliefStates(const Fsm &machine, CstBsMap< Fsm > &bsFromState)
CstStMap< BsPtr< Fsm > > CstBsMap
bool abstractEvents(const Fsm &machine, Fsm &abstractMachine, EventPropertyIdIterator begin, EventPropertyIdIterator end, BsMap< Fsm > &bsMap, CstStMap< typename Fsm::State > &stMap)
AutFsm::Transition Transition
Namespace of the Diades project.
bool project(const Fsm &machine, Fsm &abstractMachine, IsGoal isGoal, BsMap< Fsm > &bsMap, CstStMap< typename Fsm::State > &stMap)
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)
Diades::Graph::Node State
void computeElementaryBeliefStates(const Fsm &machine, IsGoal isGoal, CstBsMap< Fsm > &bsFromState)
StMap< BsPtr< Fsm > > BsMap
void makeBeliefStates(const Fsm &machine, IsGoal isGoal, CstBsMap< Fsm > &bsFromState)