@@ -196,7 +196,7 @@ class FiniteStateMachine {
196196 FiniteStateMachine &operator =(FiniteStateMachine &&) = delete ;
197197 virtual std::shared_ptr<FiniteStateMachine> newInstance () = 0;
198198
199- [[nodiscard]] virtual State &getInitialState () = 0;
199+ [[nodiscard]] virtual State &getInitialState () const = 0;
200200};
201201
202202//
@@ -330,6 +330,7 @@ template <typename StateLabelType, typename EdgeLabelType> class Edge : public A
330330 Abstract::Edge (src, dst), label(lbl) {}
331331
332332 [[nodiscard]] const EdgeLabelType &getLabel () const { return this ->label ; }
333+ void setLabel (EdgeLabelType l) { this ->label = l; }
333334
334335private:
335336 EdgeLabelType label;
@@ -442,6 +443,7 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
442443 return &s;
443444 };
444445
446+
445447 Edge<StateLabelType, EdgeLabelType> *addEdge (const State<StateLabelType, EdgeLabelType> &src,
446448 EdgeLabelType lbl,
447449 const State<StateLabelType, EdgeLabelType> &dst) {
@@ -486,7 +488,7 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
486488 this ->initialState = &s;
487489 };
488490
489- [[nodiscard]] State<StateLabelType, EdgeLabelType> &getInitialState () override {
491+ [[nodiscard]] State<StateLabelType, EdgeLabelType> &getInitialState () const override {
490492 return *this ->initialState ;
491493 };
492494
@@ -523,6 +525,13 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
523525 };
524526
525527 SetOfStates<StateLabelType, EdgeLabelType> &getStates () { return this ->states ; };
528+ Abstract::SetOfStateRefs getStateRefs () {
529+ Abstract::SetOfStateRefs result;
530+ for (auto i: this ->states ) {
531+ result.insert (&(*(i.second )));
532+ }
533+ return result;
534+ };
526535
527536 Abstract::SetOfEdges &getEdges () { return this ->edges ; };
528537
@@ -679,47 +688,42 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
679688 return result;
680689 };
681690
682- using EquivalenceMap = std::map<State<StateLabelType, EdgeLabelType> *,
683- SetOfStates<StateLabelType, EdgeLabelType> * >;
691+ using EquivalenceMap = std::map<const Abstract::State *,
692+ std::shared_ptr<Abstract::SetOfStateRefs> >;
684693
685694 // minimize the automaton based on edge labels only.
686695 std::shared_ptr<FiniteStateMachine<StateLabelType, EdgeLabelType>> minimizeEdgeLabels () {
687696 // partition refinement algorithm
688697
689698 // generate a vector of equivalence classes
690- std::shared_ptr<std::list<std::shared_ptr<Abstract::SetOfStateRefs>>> eqClasses =
691- std::make_shared<std::list<std::shared_ptr<Abstract::SetOfStateRefs>>>();
699+ std::list<std::shared_ptr<Abstract::SetOfStateRefs>> eqClasses;
692700
693701 // populate it with s set of all states
694- std::shared_ptr<Abstract::SetOfStateRefs> initialClass =
695- std::make_shared<Abstract::SetOfStateRefs>(*(this ->getStates ()));
696- eqClasses->push_back (initialClass);
702+ std::shared_ptr<Abstract::SetOfStateRefs> initialClass = std::make_shared<Abstract::SetOfStateRefs>(this ->getStateRefs ());
703+ eqClasses.push_back (initialClass);
697704
698705 // initially map all state to the initial class
699706 EquivalenceMap eqMap;
700707 for (const auto *si : *initialClass) {
701- eqMap[*si] = initialClass;
708+ auto sp = dynamic_cast <const State<StateLabelType, EdgeLabelType>*>(si);
709+ eqMap[sp] = initialClass;
702710 }
703711
704712 // partition refinement
705713 bool changed = false ;
706714 do {
707715 changed = false ;
708716
709- std::shared_ptr<std::list<std::shared_ptr<Abstract::SetOfStateRefs>>> newEqClasses =
710- std::make_shared<std::list<std::shared_ptr<Abstract::SetOfStateRefs>>>();
717+ std::list<std::shared_ptr<Abstract::SetOfStateRefs>> newEqClasses;
711718
712719 // for every potential equivalence class
713- for (const auto &ic : * eqClasses) {
720+ for (const auto &ic : eqClasses) {
714721 std::shared_ptr<Abstract::SetOfStateRefs> _class = ic;
715722
716- typename SetOfStates<StateLabelType, EdgeLabelType>::iterator i;
717- i = _class->begin ();
723+ auto i = _class->begin ();
718724
719725 // pick arbitrary state from class
720- State<StateLabelType, EdgeLabelType> *s1 = nullptr ;
721- State<StateLabelType, EdgeLabelType> *s2 = nullptr ;
722- s1 = *i;
726+ auto s1 = dynamic_cast <const State<StateLabelType, EdgeLabelType> *>(*i);
723727
724728 std::shared_ptr<Abstract::SetOfStateRefs> equivSet =
725729 std::make_shared<Abstract::SetOfStateRefs>();
@@ -730,7 +734,7 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
730734 // check whether all other states can go with the same label to
731735 // the same set of other equivalence classes.
732736 while (++i != _class->end ()) {
733- s2 = *i ;
737+ auto s2 = dynamic_cast < const State<StateLabelType, EdgeLabelType> *>(*i) ;
734738 if (this ->edgesEquivalent (eqMap, s1, s2)) {
735739 equivSet->insert (s2);
736740 } else {
@@ -739,12 +743,12 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
739743 }
740744 // if not, split the class
741745 if (equivSet->size () == _class->size ()) {
742- newEqClasses-> push_back (equivSet);
746+ newEqClasses. push_back (equivSet);
743747 this ->mapStates (eqMap, equivSet);
744748 } else {
745- newEqClasses-> push_back (equivSet);
749+ newEqClasses. push_back (equivSet);
746750 this ->mapStates (eqMap, equivSet);
747- newEqClasses-> push_back (remainingSet);
751+ newEqClasses. push_back (remainingSet);
748752 this ->mapStates (eqMap, remainingSet);
749753 changed = true ;
750754 }
@@ -753,35 +757,34 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
753757 eqClasses = newEqClasses;
754758 } while (changed);
755759
756- std::shared_ptr<FiniteStateMachine<StateLabelType, EdgeLabelType>> result =
757- std::make_shared<FiniteStateMachine<StateLabelType, EdgeLabelType>>();
760+ auto result = std::dynamic_pointer_cast<FiniteStateMachine<StateLabelType,EdgeLabelType>>(this ->newInstance ());
758761
759762 // make a state for every equivalence class
760- std::map<Abstract::SetOfStateRefs * , State<StateLabelType, EdgeLabelType> *> newStateMap;
763+ std::map<std::shared_ptr< Abstract::SetOfStateRefs> , State<StateLabelType, EdgeLabelType> *> newStateMap;
761764 CId sid = 0 ;
762- for (const auto &cli : * eqClasses) {
763- std::shared_ptr<State<StateLabelType, EdgeLabelType>> ns =
764- std::make_shared< State<StateLabelType, EdgeLabelType>>(sid);
765- result->addState (ns );
766- newStateMap[* cli] = ns;
765+ for (const auto &cli : eqClasses) {
766+ // take state label from arbitrary state from the class
767+ const State<StateLabelType, EdgeLabelType>* s = dynamic_cast < const State<StateLabelType, EdgeLabelType>*>(*(cli-> begin ()));
768+ auto ns = result->addState (s-> stateLabel );
769+ newStateMap[cli] = ns;
767770 sid++;
768771 }
769772
770773 // make the appropriate edges
771- for (const auto &cli : * eqClasses) {
774+ for (const auto &cli : eqClasses) {
772775 // take a representative state
773776 const auto *s = *(cli->begin ());
774777 auto es = s->getOutgoingEdges ();
775778 // for every outgoing edge
776779 for (auto *edi : es) {
777780 auto ed = dynamic_cast <Edge<StateLabelType, EdgeLabelType> *>(edi);
778781 result->addEdge (
779- newStateMap[* cli], ed->label , newStateMap[eqMap[ed->getDestination ()]] );
782+ *( newStateMap[cli]) , ed->getLabel (), *( newStateMap[eqMap[&( ed->getDestination ())]]) );
780783 }
781784 }
782785
783786 // set initial state
784- result->setInitialState (newStateMap[eqMap[this ->getInitialState ()]] );
787+ result->setInitialState (*( newStateMap[eqMap[&( this ->getInitialState ())]]) );
785788
786789 return result;
787790 }
@@ -800,8 +803,8 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
800803
801804 // function only used by minimizeEdgeLabels
802805 bool edgesEquivalent (EquivalenceMap &m,
803- State<StateLabelType, EdgeLabelType> *s1,
804- State<StateLabelType, EdgeLabelType> *s2) {
806+ const State<StateLabelType, EdgeLabelType> *s1,
807+ const State<StateLabelType, EdgeLabelType> *s2) {
805808 // s1 and s2 are equivalent if for every s1-a->C, s2-a->C
806809 // and vice versa
807810 std::set<EdgeLabelType> labels;
@@ -812,17 +815,17 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
812815 typename std::set<EdgeLabelType>::const_iterator k;
813816 for (k = labels.begin (); k != labels.end (); k++) {
814817 EdgeLabelType l = *k;
815- SetOfStates<StateLabelType, EdgeLabelType> * ns1 = s1->nextStatesOfEdgeLabel (l);
816- SetOfStates<StateLabelType, EdgeLabelType> * ns2 = s2->nextStatesOfEdgeLabel (l);
818+ std::shared_ptr<Abstract::SetOfStateRefs> ns1 = s1->nextStatesOfEdgeLabel (l);
819+ std::shared_ptr<Abstract::SetOfStateRefs> ns2 = s2->nextStatesOfEdgeLabel (l);
817820 // collect classes of states in ns1 and ns2
818821 std::set<SetOfStates<StateLabelType, EdgeLabelType> *> cs1;
819822 std::set<SetOfStates<StateLabelType, EdgeLabelType> *> cs2;
820- for (auto j : ns1) {
821- auto s = * j;
823+ for (auto j : * ns1) {
824+ auto s = j;
822825 cs1.insert (m[s]);
823826 }
824- for (auto j : ns2) {
825- auto s = * j;
827+ for (auto j : * ns2) {
828+ auto s = j;
826829 cs2.insert (m[s]);
827830 }
828831
@@ -835,10 +838,9 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
835838 }
836839
837840 // function only used by minimizeEdgeLabels
838- void mapStates (EquivalenceMap &m, SetOfStates<StateLabelType, EdgeLabelType> *sos) {
839- for (auto i : sos) {
840- auto s = *i;
841- m[s] = sos;
841+ void mapStates (EquivalenceMap &m, std::shared_ptr<Abstract::SetOfStateRefs>& sos) {
842+ for (auto i : *sos) {
843+ m[i] = sos;
842844 }
843845 }
844846};
@@ -888,7 +890,7 @@ class State : public Labeled::State<CString, char> {
888890
889891class FiniteStateMachine : public Labeled ::FiniteStateMachine<CString, char > {
890892public:
891- State &getInitialState () {
893+ State &getInitialState () const {
892894 return dynamic_cast <State &>(Labeled::FiniteStateMachine<CString, char >::getInitialState ());
893895 };
894896
@@ -930,7 +932,7 @@ class FiniteStateMachine : public Abstract::FiniteStateMachine {
930932 const Abstract::FiniteStateMachine &fsm2) :
931933 fsm_a (fsm1), fsm_b(fsm2) {}
932934
933- State &getInitialState ();
935+ State &getInitialState () const ;
934936
935937 [[nodiscard]] virtual bool matchEdges (const Abstract::Edge &e1 ,
936938 const Abstract::Edge &e2 ) const = 0;
0 commit comments