From 61d3f342bd71342f4dffca4cd476b3b910be24b8 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 28 Aug 2017 17:13:20 +0200
Subject: [PATCH] adapt gui to use abstraction

---
 agui2/ALIB.pro                         |  7 +--
 agui2/converter.cpp                    | 70 +++++++++++++++++++-------
 agui2/converter.h                      | 19 +++----
 agui2/graphics/dialogs/inputdialog.cpp | 34 ++++++++-----
 agui2/graphics/dialogs/inputdialog.h   | 10 ++--
 agui2/graphics/graphicsbox.cpp         |  8 +--
 agui2/graphics/graphicsconnection.h    |  1 +
 agui2/graphics/inputgraphicsbox.cpp    |  8 +--
 agui2/mainwindow.cpp                   |  5 +-
 agui2/mainwindow.h                     |  7 ++-
 agui2/models/doublemodelbox.cpp        | 24 +++++----
 agui2/models/doublemodelbox.h          |  8 ++-
 agui2/models/inputmodelbox.cpp         | 16 ++----
 agui2/models/inputmodelbox.h           |  8 +--
 agui2/models/modelbox.h                |  9 ++--
 agui2/models/outputmodelbox.cpp        | 47 ++++++++---------
 agui2/models/outputmodelbox.h          | 24 ++++-----
 agui2/models/singlemodelbox.cpp        | 15 ++++--
 agui2/models/singlemodelbox.h          |  8 ++-
 agui2/wrapperfactory.cpp               | 61 ++++++++--------------
 20 files changed, 203 insertions(+), 186 deletions(-)

diff --git a/agui2/ALIB.pro b/agui2/ALIB.pro
index 69806aaf5a..a6d9b5845e 100644
--- a/agui2/ALIB.pro
+++ b/agui2/ALIB.pro
@@ -125,12 +125,7 @@ else:unix: LIBS += -L$$PWD/$${ALIB_PATH}/bin-debug/ -lalib2algo
 
 INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2std/src/
 INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2common/src/
-INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2data/src/
-INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2str/src/
-INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2raw/src/
-INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2aux/src/
-INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2algo/src/
-INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2elgo/src/
+INCLUDEPATH += $$PWD/$${ALIB_PATH}/alib2cli/src/
 INCLUDEPATH += /usr/include/libxml2
 
 unix:!macx: LIBS += -L/usr/lib/ -lgvc -lcgraph -lcdt
diff --git a/agui2/converter.cpp b/agui2/converter.cpp
index 5ac671f487..a5266c8380 100644
--- a/agui2/converter.cpp
+++ b/agui2/converter.cpp
@@ -1,34 +1,60 @@
 #include "converter.h"
 #include "graphvizintegrator.h"
+#include <abstraction/common/AlgorithmHelper.h>
+#include <abstraction/ValueProvider.hpp>
+#include <factory/XmlDataFactory.hpp>
+#include <abstraction/ImmediateValueAbstraction.hpp>
 
 #include <QDomComment>
-#include <factory/XmlDataFactory.hpp>
-#include <factory/StringDataFactory.hpp>
 
-QString Converter::automatonToDOT(const automaton::Automaton &automaton)
+QString Converter::automatonToDOT(const std::shared_ptr < abstraction::OperationAbstraction > &automaton)
 {
     std::stringbuf sb;
     std::ostream os(&sb);
-    convert::DotConverter::convert( os , automaton );
-    return QString::fromStdString(sb.str());
+    ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params;
+    params.push_back ( automaton );
+
+    std::vector < bool > moves;
+    moves.push_back ( true );
+
+    std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::AlgorithmHelper::eval ( "convert::DotConverter", params, moves );
+
+    abstraction::ValueProvider < std::string > & value = dynamic_cast < abstraction::ValueProvider < std::string > & > ( * res );
+
+    return QString::fromStdString(value.getValue(true));
 }
 
-QString Converter::automatonToTXT(const automaton::Automaton &automaton)
+QString Converter::automatonToTXT(const std::shared_ptr < abstraction::OperationAbstraction > &automaton)
 {
     QString text;
     try {
-        text = QString::fromStdString(alib::StringDataFactory::toString( automaton ) );
+        ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params;
+        params.push_back ( automaton );
+
+        std::vector < bool > moves;
+        moves.push_back ( true );
+
+        std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::AlgorithmHelper::eval ( "automaton::AutomatonToStringComposer", params, moves );
+
+        abstraction::ValueProvider < std::string > & value = dynamic_cast < abstraction::ValueProvider < std::string > & > ( * res );
+
+        return QString::fromStdString(value.getValue(true));
     } catch (exception::CommonException e ) {
         text = QString::fromStdString( e.getCause() );
     }
     return text.trimmed();
 }
 
-QString Converter::automatonToXML(const automaton::Automaton &automaton)
+QString Converter::automatonToXML(const std::shared_ptr < abstraction::OperationAbstraction > &automaton)
 {
     QString text;
     try {
-        text = QString::fromStdString(alib::XmlDataFactory::toString( automaton ) );
+        std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getXmlComposerAbstraction ( automaton->getReturnType ( ) );
+	res->attachInput ( automaton, 0, true );
+        res->eval ( );
+        abstraction::ValueProvider < std::string > & value = dynamic_cast < abstraction::ValueProvider < std::string > & > ( * res );
+
+        text = QString::fromStdString(value.getValue(true));
         text = indentXML( text );
     } catch (exception::CommonException e ) {
         text = QString::fromStdString( e.getCause() );
@@ -36,12 +62,12 @@ QString Converter::automatonToXML(const automaton::Automaton &automaton)
     return text;
 }
 
-QImage Converter::automatonToPNG(const automaton::Automaton &automaton)
+QImage Converter::automatonToPNG(const std::shared_ptr < abstraction::OperationAbstraction > &automaton)
 {
     return GraphvizIntegrator::getInstance().createImage( automatonToDOT(automaton), GraphvizIntegrator::PNG );
 }
 
-QImage Converter::automatonToSVG(const automaton::Automaton &automaton)
+QImage Converter::automatonToSVG(const std::shared_ptr < abstraction::OperationAbstraction > &automaton)
 {
     return GraphvizIntegrator::getInstance().createImage( automatonToDOT(automaton), GraphvizIntegrator::SVG );
 }
@@ -54,16 +80,26 @@ QString Converter::indentXML(const QString &text)
     return text;
 }
 
-automaton::Automaton *Converter::XMLToAutomaton(const QString &xml)
+std::shared_ptr < abstraction::OperationAbstraction > Converter::XMLToAutomaton(const QString &xml)
 {
-    automaton::Automaton automaton = alib::XmlDataFactory::fromString( xml.toStdString() );
-    return new automaton::Automaton( automaton );
+    ext::deque < sax::Token > tokens;
+    sax::SaxParseInterface::parseMemory ( xml.toStdString(), tokens );
+    std::string type = tokens [ 0 ].getData ( );
+    std::shared_ptr < abstraction::OperationAbstraction > automaton = abstraction::Registry::getXmlParserAbstraction ( type, tokens );
+    return automaton;
 }
 
-automaton::Automaton *Converter::TXTToAutomaton(const QString &txt)
+std::shared_ptr < abstraction::OperationAbstraction > Converter::TXTToAutomaton(const QString &txt)
 {
-    automaton::Automaton automaton = alib::StringDataFactory::fromString( txt.toStdString() );
-    return new automaton::Automaton( automaton );
+    ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params;
+    params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < std::string > > ( txt.toStdString() ) );
+
+    std::vector < bool > moves;
+    moves.push_back ( true );
+
+    std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::AlgorithmHelper::eval ( "automaton::AutomatonFromStringParser", params, moves );
+
+    return res;
 }
 
 Converter::Converter()
diff --git a/agui2/converter.h b/agui2/converter.h
index eec50ee012..9e1cd02fbd 100644
--- a/agui2/converter.h
+++ b/agui2/converter.h
@@ -1,24 +1,21 @@
 #ifndef CONVERTOR_H
 #define CONVERTOR_H
 
-#include <automaton/Automaton.h>
-#include <automaton/FSM/NFA.h>
-#include <automaton/determinize/Determinize.h>
-#include <convert/DotConverter.h>
+#include <abstraction/OperationAbstraction.hpp>
 #include <QString>
 #include <QImage>
 
 class Converter
 {
 public:
-    static QString automatonToDOT(const automaton::Automaton & automaton );
-    static QString automatonToTXT(const automaton::Automaton & automaton );
-    static QString automatonToXML(const automaton::Automaton & automaton );
-    static QImage automatonToPNG(const automaton::Automaton & automaton );
-    static QImage automatonToSVG(const automaton::Automaton & automaton );
+    static QString automatonToDOT(const std::shared_ptr < abstraction::OperationAbstraction > & automaton );
+    static QString automatonToTXT(const std::shared_ptr < abstraction::OperationAbstraction > & automaton );
+    static QString automatonToXML(const std::shared_ptr < abstraction::OperationAbstraction > & automaton );
+    static QImage automatonToPNG(const std::shared_ptr < abstraction::OperationAbstraction > & automaton );
+    static QImage automatonToSVG(const std::shared_ptr < abstraction::OperationAbstraction > & automaton );
     static QString indentXML(const QString & text );
-    static automaton::Automaton * XMLToAutomaton( const QString & xml );
-    static automaton::Automaton * TXTToAutomaton( const QString & txt );
+    static std::shared_ptr < abstraction::OperationAbstraction > XMLToAutomaton( const QString & xml );
+    static std::shared_ptr < abstraction::OperationAbstraction > TXTToAutomaton( const QString & txt );
 private:
     Converter();
 };
diff --git a/agui2/graphics/dialogs/inputdialog.cpp b/agui2/graphics/dialogs/inputdialog.cpp
index fb96c88820..0a9044c60b 100644
--- a/agui2/graphics/dialogs/inputdialog.cpp
+++ b/agui2/graphics/dialogs/inputdialog.cpp
@@ -2,10 +2,9 @@
 #include "inputdialog.h"
 #include "ui_inputdialog.h"
 #include "graphvizintegrator.h"
+#include <abstraction/common/AlgorithmHelper.h>
+#include <abstraction/ImmediateValueAbstraction.hpp>
 
-#include <factory/XmlDataFactory.hpp>
-#include <automaton/generate/RandomAutomatonFactory.h>
-#include <convert/DotConverter.h>
 #include <gvc.h>
 #include <QImage>
 #include <QFileDialog>
@@ -21,16 +20,16 @@ InputDialog::InputDialog(QWidget *parent) :
     setWindowTitle("Input settings");
 }
 
-automaton::Automaton *InputDialog::getAutomaton()
+std::shared_ptr < abstraction::OperationAbstraction > InputDialog::getAutomaton()
 {
     return m_automaton;
 }
 
-void InputDialog::setAutomaton(const automaton::Automaton *automaton)
+void InputDialog::setAutomaton(const std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
     if( automaton != NULL )
     {
-        ui->plainTextEdit_5->document()->setPlainText( Converter::automatonToXML( *automaton ) );
+        ui->plainTextEdit_5->document()->setPlainText( Converter::automatonToXML( automaton ) );
     }
     else
         m_automaton = NULL;
@@ -61,15 +60,24 @@ void InputDialog::setSettings(const InputSettings &settings)
 
 InputDialog::~InputDialog()
 {
-    if( m_automaton )
-        delete m_automaton;
     delete ui;
 }
 
 void InputDialog::on_pushButton_clicked()
 {
-    automaton::NFA < > res = automaton::generate::RandomAutomatonFactory::generateNFA ( 5, 3, false, 10.0 );
-    automaton::Automaton automaton( res );
+    ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params;
+    params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < size_t > > ( 5 ) );
+    params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < size_t > > ( 3 ) );
+    params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < bool > > ( 5 ) );
+    params.push_back ( std::make_shared < abstraction::ImmediateValueAbstraction < double > > ( 10 ) );
+
+    std::vector < bool > moves;
+    moves.push_back ( true );
+    moves.push_back ( true );
+    moves.push_back ( true );
+    moves.push_back ( true );
+
+    std::shared_ptr < abstraction::OperationAbstraction > automaton = abstraction::AlgorithmHelper::eval ( "automaton::generate::RandomAutomatonFactory", params, moves );
     ui->plainTextEdit_5->document()->setPlainText( Converter::automatonToXML( automaton ) );
     ui->XMLRadioBtn->click();
 }
@@ -87,7 +95,7 @@ void InputDialog::on_buttonBox_6_rejected()
 
 void InputDialog::on_plainTextEdit_5_textChanged()
 {
-    automaton::Automaton * automaton;
+    std::shared_ptr < abstraction::OperationAbstraction > automaton;
     m_settings.m_inputString = ui->plainTextEdit_5->document()->toPlainText();
     automaton = convertTextField( m_settings.m_format );
     if( !automaton )
@@ -95,11 +103,11 @@ void InputDialog::on_plainTextEdit_5_textChanged()
         ui->label_5->setText("<span style=\" font-size:16pt; font-weight:600; color:#ff0000;\">Input is not a valid automaton!</span>");
         return;
     }
-    QPixmap pixmap = QPixmap::fromImage( Converter::automatonToSVG(*automaton) );
+    QPixmap pixmap = QPixmap::fromImage( Converter::automatonToSVG( automaton) );
     ui->label_5->setPixmap( pixmap );
 }
 
-automaton::Automaton *InputDialog::convertTextField( InputSettings::format formatSettings )
+std::shared_ptr < abstraction::OperationAbstraction > InputDialog::convertTextField( InputSettings::format formatSettings )
 {
     try
     {
diff --git a/agui2/graphics/dialogs/inputdialog.h b/agui2/graphics/dialogs/inputdialog.h
index 3469a37440..33e6aab7e2 100644
--- a/agui2/graphics/dialogs/inputdialog.h
+++ b/agui2/graphics/dialogs/inputdialog.h
@@ -2,9 +2,9 @@
 #define INPUTDIALOG_H
 
 #include "models/inputmodelbox.h"
+#include <abstraction/OperationAbstraction.hpp>
 
 #include <QDialog>
-#include <automaton/Automaton.h>
 
 namespace Ui {
 class InputDialog;
@@ -16,8 +16,8 @@ class InputDialog : public QDialog
 
 public:
     explicit InputDialog(QWidget *parent = 0);
-    automaton::Automaton *getAutomaton();
-    void setAutomaton(const automaton::Automaton *automaton);
+    std::shared_ptr < abstraction::OperationAbstraction > getAutomaton();
+    void setAutomaton(const std::shared_ptr < abstraction::OperationAbstraction > automaton);
     InputSettings getSettings();
     void setSettings(const InputSettings & settings);
     ~InputDialog();
@@ -35,10 +35,10 @@ private slots:
     void on_PathLineEdit_textChanged(const QString &arg1);
 
 private:
-    automaton::Automaton *convertTextField(InputSettings::format formatSettings);
+    std::shared_ptr < abstraction::OperationAbstraction > convertTextField(InputSettings::format formatSettings);
 
     Ui::InputDialog *ui;
-    automaton::Automaton *m_automaton = NULL;
+    std::shared_ptr < abstraction::OperationAbstraction > m_automaton = NULL;
     InputSettings m_settings;
 };
 
diff --git a/agui2/graphics/graphicsbox.cpp b/agui2/graphics/graphicsbox.cpp
index b423b7e1c1..dacaa1228a 100644
--- a/agui2/graphics/graphicsbox.cpp
+++ b/agui2/graphics/graphicsbox.cpp
@@ -1,13 +1,13 @@
-#include <QGraphicsSceneContextMenuEvent>
-#include <QDialog>
-#include <QGraphicsScene>
-
 #include "graphicsbox.h"
 #include "graphicsconnection.h"
 #include "graphicsscene.h"
 #include "connectionhelper.h"
 #include "dialogs/inputdialog.h"
 
+#include <QGraphicsSceneContextMenuEvent>
+#include <QDialog>
+#include <QGraphicsScene>
+
 GraphicsBox::GraphicsBox(QString text, qreal x, qreal y)
     : QGraphicsObject( NULL )
 {
diff --git a/agui2/graphics/graphicsconnection.h b/agui2/graphics/graphicsconnection.h
index c5fc914eb6..441fa996e5 100644
--- a/agui2/graphics/graphicsconnection.h
+++ b/agui2/graphics/graphicsconnection.h
@@ -1,6 +1,7 @@
 #ifndef GRAPHICSCONNECTION_H
 #define GRAPHICSCONNECTION_H
 
+#include <tuple>
 #include "graphicsbox.h"
 
 #include <QGraphicsItem>
diff --git a/agui2/graphics/inputgraphicsbox.cpp b/agui2/graphics/inputgraphicsbox.cpp
index aa48301979..525fa0da3d 100644
--- a/agui2/graphics/inputgraphicsbox.cpp
+++ b/agui2/graphics/inputgraphicsbox.cpp
@@ -1,12 +1,12 @@
-#include <QMenu>
-#include <QAction>
-#include <QObject>
-
 #include "inputgraphicsbox.h"
 #include "connectionhelper.h"
 #include "dialogs/inputdialog.h"
 #include "models/inputmodelbox.h"
 
+#include <QMenu>
+#include <QAction>
+#include <QObject>
+
 class InputModelBox;
 class ModelBox;
 
diff --git a/agui2/mainwindow.cpp b/agui2/mainwindow.cpp
index 02c38e8c33..d0eb4bd2fb 100644
--- a/agui2/mainwindow.cpp
+++ b/agui2/mainwindow.cpp
@@ -1,5 +1,3 @@
-#include <QFileDialog>
-#include <QGraphicsItem>
 #include <iostream>
 
 #include "mainwindow.h"
@@ -10,6 +8,9 @@
 #include "wrapperfactory.h"
 #include "connectionhelper.h"
 
+#include <QFileDialog>
+#include <QGraphicsItem>
+
 MainWindow::MainWindow(QWidget *parent) :
     QMainWindow(parent),
     ui(new Ui::MainWindow)
diff --git a/agui2/mainwindow.h b/agui2/mainwindow.h
index 1b2afb91cb..fb86cfd066 100644
--- a/agui2/mainwindow.h
+++ b/agui2/mainwindow.h
@@ -1,15 +1,14 @@
 #ifndef MAINWINDOW_H
 #define MAINWINDOW_H
 
+#include "wrapperbox.h"
+#include "graphics/graphicsscene.h"
+
 #include <QMainWindow>
-#include <automaton/Automaton.h>
 #include <QGraphicsView>
 #include <QGraphicsScene>
 #include <QGraphicsItem>
 
-#include "wrapperbox.h"
-#include "graphics/graphicsscene.h"
-
 namespace Ui {
 class MainWindow;
 }
diff --git a/agui2/models/doublemodelbox.cpp b/agui2/models/doublemodelbox.cpp
index afcece373d..192d832af1 100644
--- a/agui2/models/doublemodelbox.cpp
+++ b/agui2/models/doublemodelbox.cpp
@@ -1,7 +1,7 @@
 #include "doublemodelbox.h"
+#include <abstraction/common/AlgorithmHelper.h>
 
-
-DoubleModelBox::DoubleModelBox(functwo func)
+DoubleModelBox::DoubleModelBox(std::string func)
 {
     m_func = func;
 }
@@ -44,11 +44,11 @@ bool DoubleModelBox::isInputAvailable()
     return (m_InConnectionOne == NULL || m_InConnectionTwo == NULL );
 }
 
-automaton::Automaton *DoubleModelBox::run()
+std::shared_ptr < abstraction::OperationAbstraction > DoubleModelBox::run()
 {
-    automaton::Automaton * inOne = NULL;
-    automaton::Automaton * inTwo = NULL;
-    automaton::Automaton * res = NULL;
+    std::shared_ptr < abstraction::OperationAbstraction > inOne = NULL;
+    std::shared_ptr < abstraction::OperationAbstraction > inTwo = NULL;
+    std::shared_ptr < abstraction::OperationAbstraction > res = NULL;
     if( m_InConnectionOne && m_InConnectionTwo )
     {
          inOne = m_InConnectionOne->run();
@@ -58,7 +58,15 @@ automaton::Automaton *DoubleModelBox::run()
     {
         try
         {
-            res = new automaton::Automaton( m_func( *inOne, *inTwo ) );
+            ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params;
+            params.push_back ( inOne );
+            params.push_back ( inTwo );
+
+            std::vector < bool > moves;
+            moves.push_back ( true );
+            moves.push_back ( true );
+
+            res = abstraction::AlgorithmHelper::eval ( m_func, params, moves );
         }
         catch (exception::CommonException e)
         {
@@ -66,8 +74,6 @@ automaton::Automaton *DoubleModelBox::run()
             AlibExceptionHandler::getInstance().setMessage( mes );
             res = NULL;
         }
-        delete inOne;
-        delete inTwo;
     }
     return res;
 }
diff --git a/agui2/models/doublemodelbox.h b/agui2/models/doublemodelbox.h
index 273fa21e3a..e4a519c0aa 100644
--- a/agui2/models/doublemodelbox.h
+++ b/agui2/models/doublemodelbox.h
@@ -3,12 +3,10 @@
 
 #include "modelbox.h"
 
-typedef automaton::Automaton(*functwo)(const automaton::Automaton&, const automaton::Automaton&);
-
 class DoubleModelBox : public ModelBox
 {
 public:
-    DoubleModelBox(functwo func);
+    DoubleModelBox(std::string func);
     // Inherited
     virtual bool addInput( ModelBox * origin );
     virtual bool addOutput( ModelBox * target );
@@ -18,12 +16,12 @@ public:
     virtual bool isOutputAvailable() { return m_OutConnection == NULL; }
     virtual bool acceptInput() { return true; }
     virtual bool isOutputSet() { return m_OutConnection != NULL; }
-    virtual automaton::Automaton * run();
+    virtual std::shared_ptr < abstraction::OperationAbstraction > run();
 private:
     ModelBox * m_OutConnection = NULL;
     ModelBox * m_InConnectionOne = NULL;
     ModelBox * m_InConnectionTwo = NULL;
-    functwo m_func;
+    std::string m_func;
 };
 
 #endif // DOUBLEMODELBOX_H
diff --git a/agui2/models/inputmodelbox.cpp b/agui2/models/inputmodelbox.cpp
index f5d2898237..ceba4c7ac2 100644
--- a/agui2/models/inputmodelbox.cpp
+++ b/agui2/models/inputmodelbox.cpp
@@ -7,17 +7,12 @@ InputModelBox::InputModelBox()
     m_settings.m_inputString = "";
 }
 
-void InputModelBox::setAutomaton(automaton::Automaton *automaton)
+void InputModelBox::setAutomaton(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
-    if( m_automaton )
-        delete m_automaton;
-    if( automaton )
-        m_automaton = new automaton::Automaton( *automaton );
-    else
-        m_automaton = NULL;
+    m_automaton = automaton;
 }
 
-const automaton::Automaton *InputModelBox::getAutomaton()
+const std::shared_ptr < abstraction::OperationAbstraction > InputModelBox::getAutomaton()
 {
     return m_automaton;
 }
@@ -31,10 +26,9 @@ bool InputModelBox::addOutput(ModelBox *target)
     return true;
 }
 
-automaton::Automaton *InputModelBox::run()
+std::shared_ptr < abstraction::OperationAbstraction > InputModelBox::run()
 {
-    automaton::Automaton * res = m_automaton ? new automaton::Automaton( *m_automaton ) : NULL;
-    return res;
+    return m_automaton;
 }
 
 void InputModelBox::setSettings(const InputSettings &settings)
diff --git a/agui2/models/inputmodelbox.h b/agui2/models/inputmodelbox.h
index 89ad3b7714..0626e822f9 100644
--- a/agui2/models/inputmodelbox.h
+++ b/agui2/models/inputmodelbox.h
@@ -18,8 +18,8 @@ class InputModelBox : public ModelBox
 {
 public:
     InputModelBox();
-    void setAutomaton( automaton::Automaton *automaton );
-    const automaton::Automaton *getAutomaton();
+    void setAutomaton( std::shared_ptr < abstraction::OperationAbstraction > automaton );
+    const std::shared_ptr < abstraction::OperationAbstraction > getAutomaton();
 
     // Inherited
     virtual ~InputModelBox() {}
@@ -31,13 +31,13 @@ public:
     virtual bool isOutputAvailable() { return m_OutConnection == NULL; }
     virtual bool acceptInput() { return false; }
     virtual bool isOutputSet() { return m_OutConnection != NULL; }
-    virtual automaton::Automaton * run();
+    virtual std::shared_ptr < abstraction::OperationAbstraction > run();
     bool isInputEmpty() { return m_automaton == NULL; }
     void setSettings( const InputSettings & settings );
     InputSettings getSettings();
 private:
     ModelBox * m_OutConnection = NULL;
-    automaton::Automaton *m_automaton = NULL;
+    std::shared_ptr < abstraction::OperationAbstraction > m_automaton = NULL;
     InputSettings m_settings;
 };
 
diff --git a/agui2/models/modelbox.h b/agui2/models/modelbox.h
index b5617bd231..c4d4f34ea1 100644
--- a/agui2/models/modelbox.h
+++ b/agui2/models/modelbox.h
@@ -2,10 +2,13 @@
 #define MODELBOX_H
 
 #include "wrapperbox.h"
-#include "alibexceptionhandler.h"
 
-#include <automaton/Automaton.h>
+#include <abstraction/OperationAbstraction.hpp>
 #include <exception/CommonException.h>
+
+#include <memory>
+
+#include "alibexceptionhandler.h"
 #include <QString>
 #include <QList>
 
@@ -23,7 +26,7 @@ public:
     virtual bool isOutputAvailable() = 0;
     virtual bool acceptInput() = 0;
     virtual bool isOutputSet() = 0;
-    virtual automaton::Automaton * run() = 0;
+    virtual std::shared_ptr < abstraction::OperationAbstraction > run() = 0;
     friend class WrapperBox;
 protected:
     WrapperBox* m_wrapper;
diff --git a/agui2/models/outputmodelbox.cpp b/agui2/models/outputmodelbox.cpp
index a526be2e67..aeae0a23c1 100644
--- a/agui2/models/outputmodelbox.cpp
+++ b/agui2/models/outputmodelbox.cpp
@@ -1,7 +1,3 @@
-#include <automaton/Automaton.h>
-#include <automaton/FSM/NFA.h>
-#include <automaton/determinize/Determinize.h>
-
 #include "outputmodelbox.h"
 #include "graphics/dialogs/resultdialog.h"
 #include "mainwindow.h"
@@ -21,9 +17,9 @@ OutputModelBox::OutputModelBox()
     m_Settings.m_filename = "";
 }
 
-automaton::Automaton *OutputModelBox::run()
+std::shared_ptr < abstraction::OperationAbstraction > OutputModelBox::run()
 {
-    automaton::Automaton * res = NULL;
+    std::shared_ptr < abstraction::OperationAbstraction > res = NULL;
     AlibExceptionHandler::getInstance().reset();
 
     if( m_InConnection )
@@ -48,7 +44,6 @@ automaton::Automaton *OutputModelBox::run()
         else
             displayError( "Missing an input" );
     }
-    delete res;
     return NULL;
 }
 
@@ -67,7 +62,7 @@ void OutputModelBox::displayError(const QString &text)
     QMessageBox::warning( m_wrapper->getGraphics()->scene()->views().first(), "Output fail", text, QMessageBox::Ok );
 }
 
-void OutputModelBox::displayResult(automaton::Automaton *automaton)
+void OutputModelBox::displayResult(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
     switch (m_Settings.m_format)
     {
@@ -88,32 +83,32 @@ void OutputModelBox::displayResult(automaton::Automaton *automaton)
     }
 }
 
-void OutputModelBox::displayXML( automaton::Automaton * automaton )
+void OutputModelBox::displayXML( std::shared_ptr < abstraction::OperationAbstraction > automaton )
 {
     ResultDialog * resultDlg = new ResultDialog();
-    resultDlg->setTextContent( Converter::automatonToXML(*automaton) );
+    resultDlg->setTextContent( Converter::automatonToXML( automaton) );
     resultDlg->exec();
 }
 
-void OutputModelBox::displayTXT(automaton::Automaton *automaton)
+void OutputModelBox::displayTXT(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
-    QString text( Converter::automatonToTXT(*automaton) );
+    QString text( Converter::automatonToTXT( automaton) );
     ResultDialog * resultDlg = new ResultDialog();
     resultDlg->setTextContent( text );
     resultDlg->exec();
 }
 
-void OutputModelBox::displayPNG(automaton::Automaton *automaton)
+void OutputModelBox::displayPNG(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
     displayImage( automaton, GraphvizIntegrator::PNG );
 }
 
-void OutputModelBox::displaySVG(automaton::Automaton *automaton)
+void OutputModelBox::displaySVG(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
     displayImage( automaton, GraphvizIntegrator::SVG );
 }
 
-void OutputModelBox::displayImage(automaton::Automaton *automaton, GraphvizIntegrator::PictureFormat format)
+void OutputModelBox::displayImage(std::shared_ptr < abstraction::OperationAbstraction > automaton, GraphvizIntegrator::PictureFormat format)
 {
     ResultDialog * resultDlg = new ResultDialog();
     QImage img;
@@ -122,10 +117,10 @@ void OutputModelBox::displayImage(automaton::Automaton *automaton, GraphvizInteg
         switch (format)
         {
         case GraphvizIntegrator::PNG:
-            img = Converter::automatonToPNG(*automaton);
+            img = Converter::automatonToPNG(automaton);
             break;
         case GraphvizIntegrator::SVG:
-            img = Converter::automatonToSVG(*automaton);
+            img = Converter::automatonToSVG(automaton);
             break;
         default:
             break;
@@ -141,7 +136,7 @@ void OutputModelBox::displayImage(automaton::Automaton *automaton, GraphvizInteg
     resultDlg->exec();
 }
 
-void OutputModelBox::saveResultToFile(automaton::Automaton *automaton)
+void OutputModelBox::saveResultToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
     switch (m_Settings.m_format)
     {
@@ -162,32 +157,32 @@ void OutputModelBox::saveResultToFile(automaton::Automaton *automaton)
     }
 }
 
-void OutputModelBox::saveXMLToFile(automaton::Automaton *automaton)
+void OutputModelBox::saveXMLToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
     QFile file(m_Settings.m_filename);
     file.open(QFile::ReadWrite | QFile::Text);
     QTextStream s1(&file);
-    s1 << Converter::automatonToXML(*automaton) << endl;
+    s1 << Converter::automatonToXML(automaton) << endl;
     file.close();
 }
 
-void OutputModelBox::saveTXTToFile(automaton::Automaton *automaton)
+void OutputModelBox::saveTXTToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
     QFile file(m_Settings.m_filename);
     file.open(QFile::ReadWrite | QFile::Text);
     QTextStream s1(&file);
-    s1 << Converter::automatonToTXT(*automaton);
+    s1 << Converter::automatonToTXT(automaton);
     file.close();
 }
 
-void OutputModelBox::savePNGToFile(automaton::Automaton *automaton)
+void OutputModelBox::savePNGToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
-    GraphvizIntegrator::getInstance().createImageFile(Converter::automatonToDOT(*automaton), m_Settings.m_filename, GraphvizIntegrator::PNG);
+    GraphvizIntegrator::getInstance().createImageFile(Converter::automatonToDOT(automaton), m_Settings.m_filename, GraphvizIntegrator::PNG);
 }
 
-void OutputModelBox::saveSVGToFile(automaton::Automaton *automaton)
+void OutputModelBox::saveSVGToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton)
 {
-    GraphvizIntegrator::getInstance().createImageFile(Converter::automatonToDOT(*automaton), m_Settings.m_filename, GraphvizIntegrator::SVG);
+    GraphvizIntegrator::getInstance().createImageFile(Converter::automatonToDOT(automaton), m_Settings.m_filename, GraphvizIntegrator::SVG);
 }
 
 bool OutputModelBox::addInput(ModelBox *origin)
diff --git a/agui2/models/outputmodelbox.h b/agui2/models/outputmodelbox.h
index 0e924e7ab1..b50085f25d 100644
--- a/agui2/models/outputmodelbox.h
+++ b/agui2/models/outputmodelbox.h
@@ -34,22 +34,22 @@ public:
     virtual bool isOutputAvailable() { return false; }
     virtual bool acceptInput() { return true; }
     virtual bool isOutputSet() { return false; }
-    virtual automaton::Automaton * run();
+    virtual std::shared_ptr < abstraction::OperationAbstraction > run();
     void setSettings(const OutputSettings &settings );
     OutputSettings getSettings();
 private:
     void displayError(const QString & text);
-    void displayResult(automaton::Automaton *automaton);
-    void displayXML(automaton::Automaton *automaton);
-    void displayTXT(automaton::Automaton *automaton);
-    void displayPNG(automaton::Automaton *automaton);
-    void displaySVG(automaton::Automaton *automaton);
-    void displayImage(automaton::Automaton *automaton, GraphvizIntegrator::PictureFormat format);
-    void saveResultToFile(automaton::Automaton *automaton);
-    void saveXMLToFile(automaton::Automaton *automaton);
-    void saveTXTToFile(automaton::Automaton *automaton);
-    void savePNGToFile(automaton::Automaton *automaton);
-    void saveSVGToFile(automaton::Automaton *automaton);
+    void displayResult(std::shared_ptr < abstraction::OperationAbstraction > automaton);
+    void displayXML(std::shared_ptr < abstraction::OperationAbstraction > automaton);
+    void displayTXT(std::shared_ptr < abstraction::OperationAbstraction > automaton);
+    void displayPNG(std::shared_ptr < abstraction::OperationAbstraction > automaton);
+    void displaySVG(std::shared_ptr < abstraction::OperationAbstraction > automaton);
+    void displayImage(std::shared_ptr < abstraction::OperationAbstraction > automaton, GraphvizIntegrator::PictureFormat format);
+    void saveResultToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton);
+    void saveXMLToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton);
+    void saveTXTToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton);
+    void savePNGToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton);
+    void saveSVGToFile(std::shared_ptr < abstraction::OperationAbstraction > automaton);
 
     ModelBox * m_InConnection = NULL;
     OutputSettings m_Settings;
diff --git a/agui2/models/singlemodelbox.cpp b/agui2/models/singlemodelbox.cpp
index bb9714a0b3..22099ac17f 100644
--- a/agui2/models/singlemodelbox.cpp
+++ b/agui2/models/singlemodelbox.cpp
@@ -1,6 +1,7 @@
 #include "singlemodelbox.h"
+#include <abstraction/common/AlgorithmHelper.h>
 
-SingleModelBox::SingleModelBox( func func )
+SingleModelBox::SingleModelBox( std::string func )
 {
     m_func = func;
 }
@@ -23,15 +24,21 @@ bool SingleModelBox::addOutput(ModelBox *target)
     return true;
 }
 
-automaton::Automaton *SingleModelBox::run()
+std::shared_ptr < abstraction::OperationAbstraction > SingleModelBox::run()
 {
-    automaton::Automaton * res = NULL;
+    std::shared_ptr < abstraction::OperationAbstraction > res = NULL;
     if( m_InConnection )
          res = m_InConnection->run();
     if( res )
     {
         try{
-            res->setData( m_func( *res ).getData() );
+             ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > params;
+             params.push_back ( res );
+
+             std::vector < bool > moves;
+             moves.push_back ( true );
+
+            res = abstraction::AlgorithmHelper::eval ( m_func, params, moves );
         } catch (exception::CommonException e) {
             QString mes = QString::fromStdString( e.getCause() );
             AlibExceptionHandler::getInstance().setMessage( mes );
diff --git a/agui2/models/singlemodelbox.h b/agui2/models/singlemodelbox.h
index 2e3ce6fa72..57304cd33d 100644
--- a/agui2/models/singlemodelbox.h
+++ b/agui2/models/singlemodelbox.h
@@ -3,12 +3,10 @@
 
 #include "modelbox.h"
 
-typedef automaton::Automaton(*func)(const automaton::Automaton&);
-
 class SingleModelBox : public ModelBox
 {
 public:
-    SingleModelBox(func func);
+    SingleModelBox(std::string);
     // Inherited
     virtual ~SingleModelBox() {}
     virtual bool addInput( ModelBox * origin );
@@ -19,11 +17,11 @@ public:
     virtual bool isOutputAvailable() { return m_OutConnection == NULL; }
     virtual bool acceptInput() { return true; }
     virtual bool isOutputSet() { return m_OutConnection != NULL; }
-    virtual automaton::Automaton* run();
+    virtual std::shared_ptr < abstraction::OperationAbstraction > run();
 private:
     ModelBox * m_InConnection = NULL;
     ModelBox * m_OutConnection = NULL;
-    func m_func;
+    std::string m_func;
 };
 
 #endif // SINGLEMODELBOX_H
diff --git a/agui2/wrapperfactory.cpp b/agui2/wrapperfactory.cpp
index 8d9c9072c0..f1591ba33e 100644
--- a/agui2/wrapperfactory.cpp
+++ b/agui2/wrapperfactory.cpp
@@ -1,24 +1,3 @@
-#include <automaton/determinize/Determinize.h>
-#include <automaton/simplify/Total.h>
-#include <automaton/simplify/SingleInitialState.h>
-#include <automaton/simplify/EpsilonRemoverIncoming.h>
-#include <automaton/simplify/EpsilonRemoverOutgoing.h>
-#include <automaton/simplify/Minimize.h>
-#include <automaton/simplify/Normalize.h>
-#include <automaton/simplify/Rename.h>
-#include <automaton/simplify/Trim.h>
-#include <automaton/simplify/UselessStatesRemover.h>
-#include <automaton/simplify/UnreachableStatesRemover.h>
-#include <automaton/transform/Compaction.h>
-#include <automaton/transform/Reverse.h>
-#include <automaton/transform/AutomatonIteration.h>
-#include <automaton/transform/AutomatonIterationEpsilonTransition.h>
-#include <automaton/transform/AutomataConcatenation.h>
-#include <automaton/transform/AutomataConcatenationEpsilonTransition.h>
-#include <automaton/transform/AutomataUnionCartesianProduct.h>
-#include <automaton/transform/AutomataUnionEpsilonTransition.h>
-#include <automaton/transform/AutomataIntersectionCartesianProduct.h>
-
 #include "wrapperfactory.h"
 #include "graphics/inputgraphicsbox.h"
 #include "graphics/outputgraphicsbox.h"
@@ -45,49 +24,49 @@ WrapperBox *WrapperFactory::create(WrapperFactory::Algorithms algorithm, qreal x
 
     // Single simplify
     case DETERMINIZE:
-        return new WrapperBox( new SingleModelBox( &automaton::determinize::Determinize::determinize ), new GraphicsBox( "Determinize", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::determinize::Determinize" ), new GraphicsBox( "Determinize", x, y ) );
     case TOTAL:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::Total::total ), new GraphicsBox( "Total", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::Total" ), new GraphicsBox( "Total", x, y ) );
     case MINIMIZE:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::Minimize::minimize ), new GraphicsBox( "Minimize", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::Minimize" ), new GraphicsBox( "Minimize", x, y ) );
     case NORMALIZE:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::Normalize::normalize ), new GraphicsBox( "Normalize", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::Normalize" ), new GraphicsBox( "Normalize", x, y ) );
     case SINGLE_INITIAL:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::SingleInitialState::convert ), new GraphicsBox( "Single Initial", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::SingleInitialState" ), new GraphicsBox( "Single Initial", x, y ) );
     case EPSILON_REMOVE_IN:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::EpsilonRemoverIncoming::remove ), new GraphicsBox( str.append( "-Remove In" ), x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::EpsilonRemoverIncoming" ), new GraphicsBox( str.append( "-Remove In" ), x, y ) );
     case EPSILON_REMOVE_OUT:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::EpsilonRemoverOutgoing::remove ), new GraphicsBox( str.append( "-Remove Out" ), x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::EpsilonRemoverOutgoing" ), new GraphicsBox( str.append( "-Remove Out" ), x, y ) );
     case RENAME:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::Rename::rename ), new GraphicsBox( "Rename", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::Rename" ), new GraphicsBox( "Rename", x, y ) );
     case TRIM:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::Trim::trim ), new GraphicsBox( "Trim", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::Trim" ), new GraphicsBox( "Trim", x, y ) );
     case REMOVE_USELES:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::UselessStatesRemover::remove ), new GraphicsBox( "Remove Useless", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::UselessStatesRemover" ), new GraphicsBox( "Remove Useless", x, y ) );
     case REMOVE_UNREACHABLE:
-        return new WrapperBox( new SingleModelBox( &automaton::simplify::UnreachableStatesRemover::remove ), new GraphicsBox( "Remove Unreachable", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::simplify::UnreachableStatesRemover" ), new GraphicsBox( "Remove Unreachable", x, y ) );
 
     // Single transform
     case COMPACT:
-        return new WrapperBox( new SingleModelBox( &automaton::transform::Compaction::convert ), new GraphicsBox( "Compact", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::transform::Compaction" ), new GraphicsBox( "Compact", x, y ) );
     case REVERSE:
-        return new WrapperBox( new SingleModelBox( &automaton::transform::Reverse::convert ), new GraphicsBox( "Reverse", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::transform::Reverse" ), new GraphicsBox( "Reverse", x, y ) );
     case ITERATE:
-        return new WrapperBox( new SingleModelBox( &automaton::transform::AutomatonIteration::iteration ), new GraphicsBox( "Iterate", x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::transform::AutomatonIteration" ), new GraphicsBox( "Iterate", x, y ) );
     case ITERATE_EPSILON:
-        return new WrapperBox( new SingleModelBox( &automaton::transform::AutomatonIterationEpsilonTransition::iteration ), new GraphicsBox( str.append( "-Iterate" ), x, y ) );
+        return new WrapperBox( new SingleModelBox( "automaton::transform::AutomatonIterationEpsilonTransition" ), new GraphicsBox( str.append( "-Iterate" ), x, y ) );
 
     //Double
     case CONCATENATE:
-        return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataConcatenation::concatenation ), new DoubleGraphicsBox( "Concatenate", x, y ) );
+        return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataConcatenation" ), new DoubleGraphicsBox( "Concatenate", x, y ) );
     case CONCATENATE_EPSILON:
-        return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataConcatenationEpsilonTransition::concatenation ), new DoubleGraphicsBox( str.append( "-Concatenate" ), x, y ) );
+        return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataConcatenationEpsilonTransition" ), new DoubleGraphicsBox( str.append( "-Concatenate" ), x, y ) );
     case UNION:
-        return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataUnionCartesianProduct::unification ), new DoubleGraphicsBox( "Union", x, y ) );
+        return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataUnionCartesianProduct" ), new DoubleGraphicsBox( "Union", x, y ) );
     case UNION_EPSILON:
-        return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataUnionEpsilonTransition::unification ), new DoubleGraphicsBox( str.append( "-Union" ), x, y ) );
+        return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataUnionEpsilonTransition" ), new DoubleGraphicsBox( str.append( "-Union" ), x, y ) );
     case INTERSCT:
-        return new WrapperBox( new DoubleModelBox( &automaton::transform::AutomataIntersectionCartesianProduct::intersection ), new DoubleGraphicsBox( "Intersect", x, y ) );
+        return new WrapperBox( new DoubleModelBox( "automaton::transform::AutomataIntersectionCartesianProduct" ), new DoubleGraphicsBox( "Intersect", x, y ) );
     default:
         return NULL;
     }
-- 
GitLab