-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain2.cpp
184 lines (153 loc) · 5.17 KB
/
main2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/*
// 5971 inputs
// 25 hidden
// 2 outputs
// Question ouverte :
- Learning coefficient
- Nombre d'augmentations avant arret
- Nombre de neurones de la couche cachée
// Les données à stocker :
- Les paramètres qui ont changé et leur valeur
- TPR, FPR
- Learning time
// A afficher :
- Chaque point du ROC (TPR, FPR)
- Learning time
Ce programme calcule pour chaque paramètre,
génère un fichier contenant tous les résultats,
produit un graphique représentant les résultats.
*/
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include "TestPool.h"
#include "NeuralNetwork.h"
#include "FileUtils.h"
#include "Plotting.h"
using namespace std;
string outputDataFilename = "result.data";
string inputDatasetFilename = "android-features.data";
string outputSVGFilename = "roc-curve.svg";
bool ProcessParameters(int argc, char** argv);
void DisplayHelp(string programmeName);
int main(int argc, char** argv) {
// Set de paramètres par défaut
ParameterSet defaultParam = VariationResult().inputParameter;
// Intervalles à parcourir pour chaque paramètre
map<string, VariationRange> mediumTestRanges = {
{"learning_coeff", {0.01, 1.0f, 0.1f} },
{"hidden_neurons_nb", {1, 100, 10} },
{"max_successive_augmentation_number", {1, 100, 10} },
{"desired_error", {0.00001, 0.0001, 0.00001} }
};
// Résultats des tests
map<string, vector<VariationResult>> testResults;
// Gestionnaire de tests
TestPool testPool;
// Désactive le changement de la seed de création
fann_disable_seed_rand();
// Traite les paramètres passés au programme
if(!ProcessParameters(argc, argv)){
cerr << "[Error] Exiting\n";
return -1;
}
// Affiche les données d'entrée du programme
cout << "[Initializing] Input dataset file : " << inputDatasetFilename << "\n";
cout << "[Initializing] Output result file : " << outputDataFilename << "\n";
cout << "[Initializing] Output SVG file : " << outputSVGFilename << "\n";
// Si le fichier de résultat existe déjà, alors on ne calcule pas
if(!FileExists(outputDataFilename))
{
cout << "[Initializing] Output file does not exist\n";
cout << "[Initializing] Beginning tests\n";
InitializeData(inputDatasetFilename, &testPool.train_set, &testPool.validation_set, &testPool.test_set);
testPool.SetTestRanges(mediumTestRanges, defaultParam);
testResults = testPool.ExecuteTests();
// Sauvegarde les résultats
WriteToFile(testResults, outputDataFilename);
}
else
{
cout << "[Initializing] Output file already exists\n";
ReadFromFile(outputDataFilename, testResults);
}
cout << "Generating new ROC curve\n";
cout << "Please open the " << outputSVGFilename << " file to see the ROC curve\n";
// Affiche la courbe ROC des résultats
ShowResults(outputSVGFilename, testResults);
return 0;
}
/** Traite les paramètres passés au programme.
* Vérifie l'existence des fichiers d'input.
* Renvoie true si les paramètres sont cohérents et valide, false sinon.
**/
bool ProcessParameters(int argc, char** argv)
{
vector<string> parameters;
vector<string>::iterator it;
// Construit un vector à partir des paramètres
for(int i = 0; i < argc; i++)
parameters.push_back(argv[i]);
// On a un paramètre
if(argc > 1)
{
// Check for --help
it = find(parameters.begin(), parameters.end(), "--help");
if(it != parameters.end())
{
DisplayHelp(parameters[0]);
parameters.erase(it);
return false;
}
}
// On a au moins deux paramètres
if(argc > 2)
{
// On ajoute le -1 pour ne pas parcourir le dernier élément qui est le nom du fichier de sortie
it = find(parameters.begin(), parameters.end()-1, "--input");
if(it != parameters.end()-1)
{
inputDatasetFilename = *(it+1);
parameters.erase(it, it+2);
}
it = find(parameters.begin(), parameters.end()-1, "--out-result");
if(it != parameters.end()-1)
{
outputDataFilename = *(it+1);
parameters.erase(it, it+2);
}
it = find(parameters.begin(), parameters.end()-1, "--out-svg");
if(it != parameters.end()-1)
{
outputSVGFilename = *(it+1);
parameters.erase(it, it+2);
}
}
// Affiche une erreur si certains paramètres sont invalides
if(parameters.size() > 1){
cerr << "[Error] Paramètres invalides : ";
for(auto p = parameters.begin()+1; p != parameters.end(); p++)
cerr << *p << ", ";
cerr << "\n";
return false;
}
// Vérifie l'existence des fichiers d'entrée
if(!FileExists(inputDatasetFilename)){
cerr << "[Error] Unable to open input dataset " << inputDatasetFilename << "\n";
return false;
}
// Si aucun paramètre n'est passé, affiche que l'aide est disponible
if(argc == 1){
cout << "[Information] Help available with : " << argv[0] << " --help\n";
}
return true;
}
void DisplayHelp(string programmeName)
{
cout << "USAGE : " << programmeName << " --help\n"
<< " Displays this help.\n";
cout << "USAGE : " << programmeName << " [--input <input_dataset_file>] [--out-result <output_result_file>] [--out-svg <output_svg_file>]\n"
<< " Process the given input file and produce a result file and a ROC curve. If a result file already exists, only produce the ROC curve.\n";
}