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