REMOVED: the DrawModel function from classifierInterface (they all do exactly the...
[mldemos:baraks-mldemos.git] / _AlgorithmsPlugins / KNN / interfaceKNNClassifier.cpp
1 /*********************************************************************
2 MLDemos: A User-Friendly visualization toolkit for machine learning
3 Copyright (C) 2010  Basilio Noris
4 Contact: mldemos@b4silio.com
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public License,
8 version 3 as published by the Free Software Foundation.
9
10 This library is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free
17 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *********************************************************************/
19 #include "interfaceKNNClassifier.h"
20 #include <QPixmap>
21 #include <QBitmap>
22 #include <QPainter>
23
24 using namespace std;
25
26 ClassKNN::ClassKNN()
27 {
28         params = new Ui::ParametersKNN();
29         params->setupUi(widget = new QWidget());
30     connect(params->knnNormCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(ChangeOptions()));
31     ChangeOptions();
32 }
33
34 void ClassKNN::ChangeOptions()
35 {
36     params->knnNormSpin->setVisible(params->knnNormCombo->currentIndex() == 2);
37     params->labelPower->setVisible(params->knnNormCombo->currentIndex() == 2);
38 }
39
40 void ClassKNN::SetParams(Classifier *classifier)
41 {
42         if(!classifier) return;
43     SetParams(classifier, GetParams());
44 }
45
46 fvec ClassKNN::GetParams()
47 {
48     fvec par(3);
49     par[0] = params->knnKspin->value();
50     par[1] = params->knnNormCombo->currentIndex();
51     par[2] = params->knnNormSpin->value();
52     return par;
53 }
54
55 void ClassKNN::SetParams(Classifier *classifier, fvec parameters)
56 {
57     if(!classifier) return;
58     int k = parameters.size() > 0 ? parameters[0] : 1;
59     int metricType = parameters.size() > 1 ? parameters[1] : 0;
60     int metricP = parameters.size() > 2 ? parameters[2] : 0;
61     ((ClassifierKNN *)classifier)->SetParams(k, metricType, metricP);
62 }
63
64 void ClassKNN::GetParameterList(std::vector<QString> &parameterNames,
65                              std::vector<QString> &parameterTypes,
66                              std::vector< std::vector<QString> > &parameterValues)
67 {
68     parameterNames.push_back("K");
69     parameterNames.push_back("Metric Type");
70     parameterNames.push_back("Metric Power");
71     parameterTypes.push_back("Integer");
72     parameterTypes.push_back("List");
73     parameterTypes.push_back("Integer");
74     parameterValues.push_back(vector<QString>());
75     parameterValues.back().push_back("1");
76     parameterValues.back().push_back("999");
77     parameterValues.push_back(vector<QString>());
78     parameterValues.back().push_back("L1");
79     parameterValues.back().push_back("L2");
80     parameterValues.back().push_back("Lp");
81     parameterValues.back().push_back("L-Inf");
82     parameterValues.push_back(vector<QString>());
83     parameterValues.back().push_back("1");
84     parameterValues.back().push_back("150");
85 }
86
87 QString ClassKNN::GetAlgoString()
88 {
89         int k = params->knnKspin->value();
90         int metricType = params->knnNormCombo->currentIndex();
91         int metricP = params->knnNormSpin->value();
92         QString algo = QString("KNN %1 %2").arg(k).arg(metricType==3? 0 : metricType == 2 ? metricP : metricType+1);
93         return algo;
94 }
95
96 Classifier *ClassKNN::GetClassifier()
97 {
98         ClassifierKNN *classifier = new ClassifierKNN();
99         SetParams(classifier);
100         return classifier;
101 }
102
103 void ClassKNN::SaveOptions(QSettings &settings)
104 {
105         settings.setValue("knnK", params->knnKspin->value());
106         settings.setValue("knnNorm", params->knnNormCombo->currentIndex());
107         settings.setValue("knnPower", params->knnNormSpin->value());
108 }
109
110 bool ClassKNN::LoadOptions(QSettings &settings)
111 {
112         if(settings.contains("knnK")) params->knnKspin->setValue(settings.value("knnK").toFloat());
113         if(settings.contains("knnNorm")) params->knnNormCombo->setCurrentIndex(settings.value("knnNorm").toInt());
114         if(settings.contains("knnPower")) params->knnNormSpin->setValue(settings.value("knnPower").toFloat());
115         return true;
116 }
117
118 void ClassKNN::SaveParams(QTextStream &file)
119 {
120         file << "classificationOptions" << ":" << "knnK" << " " << params->knnKspin->value() << "\n";
121         file << "classificationOptions" << ":" << "knnNorm" << " " << params->knnNormCombo->currentIndex() << "\n";
122         file << "classificationOptions" << ":" << "knnPower" << " " << params->knnNormSpin->value() << "\n";
123 }
124
125 bool ClassKNN::LoadParams(QString name, float value)
126 {
127         if(name.endsWith("knnK")) params->knnKspin->setValue((int)value);
128         if(name.endsWith("knnNorm")) params->knnNormCombo->setCurrentIndex((int)value);
129         if(name.endsWith("knnPower")) params->knnNormSpin->setValue((int)value);
130         return true;
131 }