v0.3.9b:
[mldemos:baraks-mldemos.git] / _IOPlugins / CSVImport / CSVImport.cpp
1 /*********************************************************************\r
2 MLDemos: A User-Friendly visualization toolkit for machine learning\r
3 Copyright (C) 2011 Chrstophe Paccolat\r
4 Contact: mldemos@b4silio.com\r
5 \r
6 This library is free software; you can redistribute it and/or\r
7 modify it under the terms of the GNU Lesser General Public License,\r
8 version 3 as published by the Free Software Foundation.\r
9 \r
10 This library is distributed in the hope that it will be useful, but\r
11 WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
13 Lesser General Public License for more details.\r
14 \r
15 You should have received a copy of the GNU Lesser General Public\r
16 License along with this library; if not, write to the Free\r
17 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
18 *********************************************************************/\r
19 \r
20 #include "CSVImport.h"\r
21 #include "pcaprojection.h"\r
22 \r
23 Q_EXPORT_PLUGIN2(IO_CSVImport, CSVImport)\r
24 \r
25 CSVImport::CSVImport()\r
26     : guiDialog(0), gui(0), inputParser(0)\r
27 {\r
28 }\r
29 \r
30 CSVImport::~CSVImport()\r
31 {\r
32     if(gui && guiDialog) guiDialog->hide();\r
33     DEL(inputParser);\r
34 }\r
35 \r
36 void CSVImport::Start()\r
37 {\r
38     if(!gui)\r
39     {\r
40         gui = new Ui::CSVImportDialog();\r
41         gui->setupUi(guiDialog = new QDialog());\r
42         connect(gui->closeButton, SIGNAL(clicked()), this, SLOT(Closing()));\r
43         connect(guiDialog, SIGNAL(finished(int)), this, SLOT(Closing()));\r
44         connect(gui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(spinBoxChanged(int)));\r
45         connect(gui->loadFile, SIGNAL(clicked()), this, SLOT(LoadFile())); // file loader\r
46         connect(gui->dumpButton, SIGNAL(clicked()),this,SLOT(on_dumpButton_clicked()));\r
47         connect(gui->pcaButton, SIGNAL(clicked()),this,SLOT(on_pcaButton_clicked()));\r
48         guiDialog->show();\r
49     }\r
50     else guiDialog->show();\r
51     if(!inputParser) inputParser = new CSVParser();\r
52 }\r
53 \r
54 void CSVImport::Stop()\r
55 {\r
56     guiDialog->hide();\r
57 }\r
58 \r
59 void CSVImport::Closing()\r
60 {\r
61     emit(Done(this));\r
62 }\r
63 \r
64 bool CSVImport::saveFile(const QString &filename, QIODevice *data)\r
65 {\r
66     QFile file(filename);\r
67     if (!file.open(QIODevice::WriteOnly)) {\r
68         qDebug() << "Could not open " << qPrintable(filename) << " for writing: " << qPrintable(file.errorString());\r
69         return false;\r
70     }\r
71 \r
72     file.write(data->readAll());\r
73     file.close();\r
74 \r
75     return true;\r
76 }\r
77 \r
78 void CSVImport::LoadFile()\r
79 {\r
80         QString filename = QFileDialog::getOpenFileName(NULL, tr("Load Data"), QDir::currentPath(), tr("dataset files (*.data *.csv);;All files (*.*)"));\r
81     if(filename.isEmpty()) return;\r
82     Parse(filename);\r
83     gui->tabWidget->setCurrentIndex(0);\r
84 }\r
85 \r
86 void CSVImport::Parse(QString filename)\r
87 {\r
88     if(filename.isEmpty()) return;\r
89     inputParser->clear();\r
90     inputParser->parse(filename.toStdString().c_str());\r
91     vector<vector<string> > rawData = inputParser->getRawData();\r
92     qDebug() << "Dataset extracted";\r
93 //    if(data.first.size() < 2) return;\r
94     if(rawData.size() < 2) return;\r
95     gui->tableWidget->clear();\r
96     gui->tableWidget->setRowCount(rawData.size());\r
97     gui->tableWidget->setColumnCount(rawData[0].size());\r
98     for(size_t r = 0; r < rawData.size(); r++)\r
99     {\r
100         for(size_t c = 0; c < rawData[r].size(); c++)\r
101         {\r
102             QTableWidgetItem *newItem = new  QTableWidgetItem(QString(rawData[r][c].c_str()));\r
103             gui->tableWidget->setItem(r, c, newItem);\r
104         }\r
105     }\r
106     gui->spinBox->setRange(1,rawData[0].size());\r
107 }\r
108 \r
109 void CSVImport::FetchResults(std::vector<fvec> results)\r
110 {\r
111 \r
112 }\r
113 \r
114 void CSVImport::spinBoxChanged(int value)\r
115 {\r
116     inputParser->setOutputColumn(value-1);\r
117 }\r
118 \r
119 void CSVImport::on_dumpButton_clicked()\r
120 {\r
121     ivec excludeIndices;\r
122     vector<bool> bExcluded(gui->tableWidget->columnCount(), false);\r
123     QModelIndexList indexes = gui->tableWidget->selectionModel()->selection().indexes();\r
124     FOR(i, indexes.count())\r
125     {\r
126         QModelIndex index = indexes.at(i);\r
127         bExcluded[index.column()] = true;\r
128     }\r
129     FOR(i, bExcluded.size())\r
130     {\r
131         if(bExcluded[i]) excludeIndices.push_back(i);\r
132     }\r
133 \r
134     pair<vector<fvec>,ivec> data = inputParser->getData(excludeIndices);\r
135     emit(SetData(data.first, data.second, vector<ipair>()));\r
136 }\r
137 \r
138 void CSVImport::on_pcaButton_clicked()\r
139 {\r
140     ivec excludeIndices;\r
141     vector<bool> bExcluded(gui->tableWidget->columnCount(), false);\r
142     QModelIndexList indexes = gui->tableWidget->selectionModel()->selection().indexes();\r
143     FOR(i, indexes.count())\r
144     {\r
145         QModelIndex index = indexes.at(i);\r
146         bExcluded[index.column()] = true;\r
147     }\r
148     FOR(i, bExcluded.size())\r
149     {\r
150         if(bExcluded[i]) excludeIndices.push_back(i);\r
151     }\r
152 \r
153     pair<vector<fvec>,ivec> data = inputParser->getData(excludeIndices);\r
154     PCAProjection pca;\r
155         if(!data.first.size()) return;\r
156     int pcaCount = min(data.first[0].size(),data.first.size() -1);\r
157         pca.Train(data.first, pcaCount);\r
158     data.first = pca.samples;\r
159     emit(SetData(data.first, data.second, vector<ipair>()));\r
160 }\r