From 94b7e87ea45225554c43ff52f6e6d2453a14b716 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 4 Nov 2016 17:19:35 +0100 Subject: [PATCH] fix and simplify rte traversal --- alib2algo/src/rte/glushkov/GlushkovFirst.cpp | 10 ++++----- alib2algo/src/rte/glushkov/GlushkovFollow.cpp | 22 +++++-------------- .../src/rte/glushkov/GlushkovIndexate.cpp | 12 +++++----- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/alib2algo/src/rte/glushkov/GlushkovFirst.cpp b/alib2algo/src/rte/glushkov/GlushkovFirst.cpp index 31e5bc4521..6648a418ca 100644 --- a/alib2algo/src/rte/glushkov/GlushkovFirst.cpp +++ b/alib2algo/src/rte/glushkov/GlushkovFirst.cpp @@ -16,10 +16,10 @@ std::set < std::ranked_symbol < > > GlushkovFirst::first ( const rte::FormalRTE std::set < std::ranked_symbol < > > GlushkovFirst::Formal::visit ( const rte::FormalRTEAlternation < alphabet::Symbol, primitive::Unsigned > & node ) { std::set < std::ranked_symbol < > > ret, tmp; - tmp = node.getLeftElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal::Formal > ( ); + tmp = node.getLeftElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal > ( ); ret.insert ( tmp.begin ( ), tmp.end ( ) ); - tmp = node.getRightElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal::Formal > ( ); + tmp = node.getRightElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal > ( ); ret.insert ( tmp.begin ( ), tmp.end ( ) ); return ret; @@ -28,7 +28,7 @@ std::set < std::ranked_symbol < > > GlushkovFirst::Formal::visit ( const rte::Fo std::set < std::ranked_symbol < > > GlushkovFirst::Formal::visit ( const rte::FormalRTESubstitution < alphabet::Symbol, primitive::Unsigned > & node ) { std::set < std::ranked_symbol < > > ret, tmp; - tmp = node.getLeftElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal::Formal > ( ); + tmp = node.getLeftElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal > ( ); ret.insert ( tmp.begin ( ), tmp.end ( ) ); // First::Formal() returns a set. hence only one occurrence. @@ -38,7 +38,7 @@ std::set < std::ranked_symbol < > > GlushkovFirst::Formal::visit ( const rte::Fo if ( it != ret.end ( ) ) { ret.erase ( it ); - tmp = node.getRightElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal::Formal > ( ); + tmp = node.getRightElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal > ( ); ret.insert ( tmp.begin ( ), tmp.end ( ) ); } @@ -48,7 +48,7 @@ std::set < std::ranked_symbol < > > GlushkovFirst::Formal::visit ( const rte::Fo std::set < std::ranked_symbol < > > GlushkovFirst::Formal::visit ( const rte::FormalRTEIteration < alphabet::Symbol, primitive::Unsigned > & node ) { std::set < std::ranked_symbol < > > ret; - ret = node.getElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal::Formal > ( ); + ret = node.getElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal > ( ); ret.insert ( node.getSubstitutionSymbol ( ).getSymbol ( ) ); return ret; } diff --git a/alib2algo/src/rte/glushkov/GlushkovFollow.cpp b/alib2algo/src/rte/glushkov/GlushkovFollow.cpp index 68b16df6e2..37a8cea54f 100644 --- a/alib2algo/src/rte/glushkov/GlushkovFollow.cpp +++ b/alib2algo/src/rte/glushkov/GlushkovFollow.cpp @@ -49,11 +49,7 @@ std::vector < std::vector < T > > cartesian ( const std::vector < std::vector < } void preprocessSubMap ( const std::set < std::ranked_symbol < > > & alphabetK, std::map < std::ranked_symbol < >, std::set < std::ranked_symbol < > > > & subMap ) { - bool change = true; - - while ( change ) { - change = false; - + for ( bool change = true; change; change = false ) for ( std::pair < const std::ranked_symbol < >, std::set < std::ranked_symbol < > > > & kv : subMap ) { std::set < std::ranked_symbol < > > & substSet = kv.second; @@ -67,7 +63,6 @@ void preprocessSubMap ( const std::set < std::ranked_symbol < > > & alphabetK, s substSet.erase ( e ); } } - } } std::set < std::vector < std::ranked_symbol < > > > replaceConstants ( const std::set < std::ranked_symbol < > > & alphabetK, const std::vector < std::ranked_symbol < > > & follow, const std::map < std::ranked_symbol < >, std::set < std::ranked_symbol < > > > & subMap2 ) { @@ -118,14 +113,10 @@ std::set < std::vector < std::ranked_symbol < > > > GlushkovFollow::Formal::visi * 2. if symbolF in E subtree, then Follow(E, symbolF); */ - std::set < std::vector < std::ranked_symbol < > > > ret; - if ( node.getLeftElement ( ).accept < bool, GlushkovPos::Formal > ( symbolF ) ) - ret = node.getLeftElement ( ).accept < std::set < std::vector < std::ranked_symbol < > > >, GlushkovFollow::Formal > ( symbolF, alphabetK, subMap2 ); + return node.getLeftElement ( ).accept < std::set < std::vector < std::ranked_symbol < > > >, GlushkovFollow::Formal > ( symbolF, alphabetK, subMap2 ); else - ret = node.getRightElement ( ).accept < std::set < std::vector < std::ranked_symbol < > > >, GlushkovFollow::Formal > ( symbolF, alphabetK, subMap ); - - return ret; + return node.getRightElement ( ).accept < std::set < std::vector < std::ranked_symbol < > > >, GlushkovFollow::Formal > ( symbolF, alphabetK, subMap ); } std::set < std::vector < std::ranked_symbol < > > > GlushkovFollow::Formal::visit ( const rte::FormalRTEIteration < alphabet::Symbol, primitive::Unsigned > & node, const std::ranked_symbol < > & symbolF, const std::set < std::ranked_symbol < > > & alphabetK, std::map < std::ranked_symbol < >, std::set < std::ranked_symbol < > > > & subMap ) { @@ -135,9 +126,7 @@ std::set < std::vector < std::ranked_symbol < > > > GlushkovFollow::Formal::visi for ( const auto & s : node.getElement ( ).accept < std::set < std::ranked_symbol < > >, GlushkovFirst::Formal > ( ) ) subMap[node.getSubstitutionSymbol ( ).getSymbol ( )].insert ( s ); - ret = node.getElement ( ).accept < std::set < std::vector < std::ranked_symbol < > > >, GlushkovFollow::Formal > ( symbolF, alphabetK, subMap ); - - return ret; + return node.getElement ( ).accept < std::set < std::vector < std::ranked_symbol < > > >, GlushkovFollow::Formal > ( symbolF, alphabetK, subMap ); } std::set < std::vector < std::ranked_symbol < > > > GlushkovFollow::Formal::visit ( const rte::FormalRTESymbolAlphabet < alphabet::Symbol, primitive::Unsigned > & node, const std::ranked_symbol < > & symbolF, const std::set < std::ranked_symbol < > > & alphabetK, std::map < std::ranked_symbol < >, std::set < std::ranked_symbol < > > > & subMap ) { @@ -150,8 +139,7 @@ std::set < std::vector < std::ranked_symbol < > > > GlushkovFollow::Formal::visi for ( const std::smart_ptr < const rte::FormalRTESymbol < alphabet::Symbol, primitive::Unsigned > > & c : node.getElements ( ) ) children.push_back ( c->getSymbol ( ) ); - ret = replaceConstants ( alphabetK, children, subMap ); - return ret; + return replaceConstants ( alphabetK, children, subMap ); } for ( const auto & c : node.getElements ( ) ) { diff --git a/alib2algo/src/rte/glushkov/GlushkovIndexate.cpp b/alib2algo/src/rte/glushkov/GlushkovIndexate.cpp index f50ce4f3b4..aa2c96c94a 100644 --- a/alib2algo/src/rte/glushkov/GlushkovIndexate.cpp +++ b/alib2algo/src/rte/glushkov/GlushkovIndexate.cpp @@ -30,7 +30,7 @@ std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > G FormalRTESymbolAlphabet < alphabet::Symbol, primitive::Unsigned > * ns = new FormalRTESymbolAlphabet < alphabet::Symbol, primitive::Unsigned > ( std::ranked_symbol < > ( alphabet::Symbol ( sps ), node.getSymbol ( ).getRank ( ) ) ); for ( const std::smart_ptr < const rte::FormalRTESymbol < alphabet::Symbol, primitive::Unsigned > > & e : node.getElements ( ) ) { - std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > child = e->accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal::Formal > ( i ); + std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > child = e->accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal > ( i ); ns->appendElement ( * static_cast < FormalRTESymbol < alphabet::Symbol, primitive::Unsigned > * > ( child->clone ( ) ) ); // FIXME typecast } @@ -42,19 +42,19 @@ std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > G } std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > GlushkovIndexate::Formal::visit ( const rte::FormalRTEAlternation < alphabet::Symbol, primitive::Unsigned > & node, int & i ) { - std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > left = node.getLeftElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal::Formal > ( i ); - std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > right = node.getRightElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal::Formal > ( i ); + std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > left = node.getLeftElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal > ( i ); + std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > right = node.getRightElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal > ( i ); return std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > ( new FormalRTEAlternation < alphabet::Symbol, primitive::Unsigned > ( left, right ) ); } std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > GlushkovIndexate::Formal::visit ( const rte::FormalRTESubstitution < alphabet::Symbol, primitive::Unsigned > & node, int & i ) { - std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > left = node.getLeftElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal::Formal > ( i ); - std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > right = node.getRightElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal::Formal > ( i ); + std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > left = node.getLeftElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal > ( i ); + std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > right = node.getRightElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal > ( i ); return std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > ( new FormalRTESubstitution < alphabet::Symbol, primitive::Unsigned > ( left, right, node.getSubstitutionSymbol ( ) ) ); } std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > GlushkovIndexate::Formal::visit ( const rte::FormalRTEIteration < alphabet::Symbol, primitive::Unsigned > & node, int & i ) { - std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > element = node.getElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal::Formal > ( i ); + std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > element = node.getElement ( ).accept < std::rvalue_ref < rte::FormalRTEElement < alphabet::Symbol, primitive::Unsigned > >, GlushkovIndexate::Formal > ( i ); return std::rvalue_ref < FormalRTEElement < alphabet::Symbol, primitive::Unsigned > > ( new FormalRTEIteration < alphabet::Symbol, primitive::Unsigned > ( element, node.getSubstitutionSymbol ( ) ) ); } -- GitLab