From f0848765ea2ac42f2ebfa428dec27045a2006d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Pecka?= <peckato1@fit.cvut.cz> Date: Mon, 3 Mar 2014 17:14:02 +0100 Subject: [PATCH] Algebraic Method: decrease memory consumption by reducing regexp trees on the fly (side effect: speedup) --- .../src/fa2re/BrzozowskiAlgebraic.cpp | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/aconversions/src/fa2re/BrzozowskiAlgebraic.cpp b/aconversions/src/fa2re/BrzozowskiAlgebraic.cpp index f4887942d9..7e4944460b 100644 --- a/aconversions/src/fa2re/BrzozowskiAlgebraic.cpp +++ b/aconversions/src/fa2re/BrzozowskiAlgebraic.cpp @@ -23,10 +23,6 @@ BrzozowskiAlgebraic::~BrzozowskiAlgebraic( void ) { for( const auto & kv : m_eqFinal ) delete kv.second; - - for( const auto & kv1 : m_eqTransition ) - for( const auto & kv2 : kv1.second ) - delete kv2.second; } void BrzozowskiAlgebraic::initEquations( void ) @@ -58,6 +54,8 @@ void BrzozowskiAlgebraic::initEquations( void ) void BrzozowskiAlgebraic::eliminate( void ) { + RegExpOptimize opt; + for( auto itA = m_statesByDepth.rbegin( ); itA != m_statesByDepth.rend( ); itA ++ ) { const State & a = * itA; @@ -77,12 +75,14 @@ void BrzozowskiAlgebraic::eliminate( void ) Concatenation* concat = new Concatenation( ); concat->getElements( ).push_back( loop->clone( ) ); concat->getElements( ).push_back( m_eqTransition[ a ][ b ] ); - m_eqTransition[ a ][ b ] = concat; + m_eqTransition[ a ][ b ] = opt.optimize( concat ); + delete concat; } Concatenation* concat = new Concatenation( ); concat->getElements( ).push_back( loop->clone( ) ); concat->getElements( ).push_back( m_eqFinal[ a ] ); - m_eqFinal[ a ] = concat; + m_eqFinal[ a ] = opt.optimize( concat ); + delete concat; loop->setElement( NULL ); delete loop; @@ -105,7 +105,8 @@ void BrzozowskiAlgebraic::eliminate( void ) concat->getElements( ).push_back( m_eqTransition[ a ][ c ]->clone( ) ); alt->getElements( ).push_back( m_eqTransition[ b ][ c ] ); alt->getElements( ).push_back( concat ); - m_eqTransition[ b ][ c ] = alt; + m_eqTransition[ b ][ c ] = opt.optimize( alt ); + delete alt; } Alternation* alt = new Alternation( ); @@ -114,8 +115,12 @@ void BrzozowskiAlgebraic::eliminate( void ) concat->getElements( ).push_back( m_eqFinal[ a ]->clone( ) ); alt->getElements( ).push_back( m_eqFinal[ b ] ); alt->getElements( ).push_back( concat ); - m_eqFinal[ b ] = alt; + m_eqFinal[ b ] = opt.optimize( alt ); + delete alt; } + + for( const auto & kv : m_eqTransition[ a ] ) + delete kv.second; } } -- GitLab