#ifndef MLP_H
#define MLP_H

#include <QtGui>
#include <Layer.h>
#include <AddNeuronsDialog.h>
#include <AddSingleNeuron.h>
#include <TrainingDataDialog.h>

#define INPUT   0
#define OUTPUT  1
#define IBIAS   2
#define HBIAS   3
#define HIDDEN  4

class MLP : public QMainWindow
{
    Q_OBJECT
    
public:
    MLP(QWidget *parent = 0);
    ~MLP();

private:

    QAction *aboutToolAction;
    QAction *exitAction;
    QAction *closeAction;
    QAction *setBackgroundColor;

    QVBoxLayout *windowLayout;

    QGraphicsView *graphDisplay;
    QGraphicsScene *graphScene;

    QGraphicsView *networkDisplay;
    QGraphicsScene *networkScene;

    QHBoxLayout *variableLayout;
    QLabel *noiseL, *learningRateL, *momentumL, *noOfIterationsL;
    QLineEdit *noise, *learningRate, *momentum, *noOfIterations;

    QHBoxLayout *buttonLayout;
    QPushButton *initialise, *clear, *learn, *addLayer, *addNeuron, *setData;

    int numberOfNeurons;
    double currentNoise, currentLearningRate, currentMomentum;

    void createActions();
    void createMenus();
    void createContextMenu();
    void createToolBars();

    void drawCircle(int x, int y, float size, int type);
    void connectNetworkView();
    void moveOutput(float x);

    QList<QPoint> circlePositions;
    QList<int> circleTypes;

    QList<Layer> layers;

    bool hasHiddenLayer;

    Layer input, output;

    AddNeuronsDialog *dialog;
    AddSingleNeuron *singleNDialog;
    TrainingDataDialog *tDialog;

    QList<float> inputV1, inputV2;

    QList<float> inputTestValues;

    float stoppingCriteria;

    int noi;
    QPoint firstPoint;

protected:
    void closeEvent(QCloseEvent *event);
    QMenu *fileMenu;
    QMenu *helpMenu;


public slots:
    void aboutTool();

private slots:
    void changeBackground();
    void momentumChanged(QString text);
    void noiseChanged(QString text);
    void neuronsChanged(QString text);
    void learningRateChanged(QString text);
    void iterationsChanged(QString text);
    void createLayer();
    void createNeuron();
    void createNeurons(int no);
    void addSingleNeuron(int atLayer);
    void init();
    void clearView();
    void inputTdata();
    void firstDataSet(QList<float> values);
    void secondDataSet(QList<float> values);
    void learnData();

};


#endif // MLP_H
