Newer
Older
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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
package fr.univ.dblp;
import fr.univ.dblp.analysis.*;
import fr.univ.dblp.export.ResultsPrinter;
import fr.univ.dblp.generators.CopyGenerator;
import fr.univ.dblp.generators.NetworkGenerator;
import fr.univ.dblp.loader.GraphLoader;
import org.graphstream.graph.Graph;
import java.util.Scanner;
/**
* Point d'entrée principal pour l'analyse du réseau DBLP.
*
* Cette classe gère le menu interactif et orchestre l'exécution
* des différentes analyses du réseau de collaboration scientifique DBLP.
*
* @author Hamadou BA
* @see <a href="https://www-apps.univ-lehavre.fr/forge/bh243413/tp2-ri-mesures-de-reseaux-interaction.git">Dépôt Git</a>
*/
public class Main {
private static final String DBLP_FILE_PATH = "src/main/resources/snap/com-dblp.ungraph.txt";
private static Graph dblpGraph = null;
private static Graph baGraph = null;
public static void main(String[] args) {
ResultsPrinter.printHeader("TP: ANALYSE DU RÉSEAU DBLP");
ResultsPrinter.printInfo("Mesures de réseaux d'interaction - Collaboration scientifique");
ResultsPrinter.printInfo("Données: DBLP (Digital Bibliography & Library Project)");
System.out.println();
// Chargement initial du graphe DBLP
runQuestion1();
if (dblpGraph == null) {
ResultsPrinter.printError("Impossible de charger le graphe DBLP!");
ResultsPrinter.printError("Vérifiez que le fichier existe: " + DBLP_FILE_PATH);
return;
}
// Affichage du menu interactif
Scanner scanner = new Scanner(System.in);
boolean continueRunning = true;
while (continueRunning) {
displayMenu();
System.out.print("\nVotre choix: ");
String choice = scanner.nextLine().trim();
switch (choice) {
case "1":
runQuestion1();
break;
case "2":
runQuestion2();
break;
case "3":
runQuestion3();
break;
case "4":
runQuestion4();
break;
case "5":
runQuestion5();
break;
case "6":
runQuestion6();
break;
case "7":
runQuestion7();
break;
case "8":
runAllQuestions();
break;
case "0":
continueRunning = false;
ResultsPrinter.printInfo("Au revoir!");
break;
default:
ResultsPrinter.printWarning("Choix invalide! Essayez encore.");
}
if (continueRunning && !choice.equals("8")) {
System.out.println("\nAppuyez sur Entrée pour continuer...");
scanner.nextLine();
}
}
scanner.close();
}
/**
* Affiche le menu interactif principal.
*
* Ce menu permet à l'utilisateur de choisir quelle analyse exécuter
* parmi les 7 questions du TP ou d'exécuter toutes les analyses en séquence.
*/
private static void displayMenu() {
System.out.println("\n" + "=".repeat(80));
System.out.println("MENU PRINCIPAL");
System.out.println("=".repeat(80));
System.out.println(" 1. Question 1 - Chargement des données");
System.out.println(" 2. Question 2 - Mesures de base");
System.out.println(" 3. Question 3 - Analyse de connexité");
System.out.println(" 4. Question 4 - Distribution des degrés");
System.out.println(" 5. Question 5 - Distance moyenne");
System.out.println(" 6. Question 6 - Comparaison avec générateurs");
System.out.println(" 7. Question 7 - Générateur par copie (BONUS)");
System.out.println(" 8. TOUT EXÉCUTER (Questions 1-7)");
System.out.println(" 0. Quitter");
System.out.println("=".repeat(80));
}
/**
* Question 1: Charge les données du réseau DBLP.
*
* Cette méthode charge le graphe de collaboration DBLP depuis le fichier
* de données et affiche les informations de base sur le graphe chargé.
*/
private static void runQuestion1() {
ResultsPrinter.printHeader("QUESTION 1: Chargement des données");
dblpGraph = GraphLoader.loadDBLP(DBLP_FILE_PATH);
if (dblpGraph != null) {
ResultsPrinter.printSuccess("Graphe DBLP chargé avec succès!");
GraphLoader.displayGraphInfo(dblpGraph);
ResultsPrinter.printInfo("\nNote: La visualisation n'est pas recommandée pour ce graphe");
ResultsPrinter.printInfo(" (trop de nœuds: visualisation très lente et peu informative)");
}
}
/**
* Question 2: Calcule et affiche les mesures de base du réseau.
*
* Cette méthode calcule le nombre de nœuds, d'arêtes, le degré moyen
* et le coefficient de clustering du réseau DBLP.
*/
private static void runQuestion2() {
if (dblpGraph == null) {
ResultsPrinter.printError("Chargez d'abord le graphe (Question 1)!");
return;
}
BasicMetrics.analyze(dblpGraph, "DBLP");
}
/**
* Question 3: Analyse la connexité du réseau.
*
* Cette méthode vérifie si le réseau est connexe, compte le nombre de
* composantes connexes et détermine le degré critique pour la connexité.
*/
private static void runQuestion3() {
if (dblpGraph == null) {
ResultsPrinter.printError("Chargez d'abord le graphe (Question 1)!");
return;
}
ConnectivityAnalyzer.analyze(dblpGraph);
}
/**
* Question 4: Analyse la distribution des degrés du réseau.
*
* Cette méthode calcule la distribution des degrés, l'exporte pour
* visualisation avec gnuplot et vérifie si elle suit une loi de puissance.
*/
private static void runQuestion4() {
if (dblpGraph == null) {
ResultsPrinter.printError("Chargez d'abord le graphe (Question 1)!");
return;
}
DegreeAnalyzer.analyze(dblpGraph, "DBLP", "dblp");
ResultsPrinter.printInfo("\nPour générer les graphiques avec gnuplot:");
ResultsPrinter.printInfo(" cd gnuplot");
ResultsPrinter.printInfo(" gnuplot plot_dd_linear.gnu");
ResultsPrinter.printInfo(" gnuplot plot_dd_loglog.gnu");
ResultsPrinter.printInfo(" gnuplot plot_dd_powerlaw.gnu");
}
/**
* Question 5: Calcule la distance moyenne du réseau.
*
* Cette méthode effectue un échantillonnage de 1000 nœuds et calcule
* la distance moyenne par parcours BFS. Attention: opération longue (15-25 min).
*/
private static void runQuestion5() {
if (dblpGraph == null) {
ResultsPrinter.printError("Chargez d'abord le graphe (Question 1)!");
return;
}
ResultsPrinter.printWarning("ATTENTION: Cette analyse peut prendre 15-25 minutes!");
ResultsPrinter.printInfo("(1000 parcours BFS sur un graphe de 317k nœuds)");
System.out.print("\nContinuer? (o/n): ");
Scanner scanner = new Scanner(System.in);
String response = scanner.nextLine().trim().toLowerCase();
if (response.equals("o") || response.equals("oui") || response.equals("y") || response.equals("yes")) {
DistanceAnalyzer.analyze(dblpGraph, "DBLP", "dblp");
ResultsPrinter.printInfo("\nPour générer le graphique avec gnuplot:");
ResultsPrinter.printInfo(" cd gnuplot && gnuplot plot_distances.gnu");
} else {
ResultsPrinter.printInfo("Analyse annulée.");
}
}
/**
* Question 6: Compare le réseau DBLP avec des générateurs de réseaux.
*
* Cette méthode génère un réseau aléatoire (Erdős-Rényi) et un réseau
* Barabási-Albert, puis compare leurs propriétés avec DBLP. Durée: 30-40 min.
*/
private static void runQuestion6() {
if (dblpGraph == null) {
ResultsPrinter.printError("Chargez d'abord le graphe (Question 1)!");
return;
}
ResultsPrinter.printWarning("ATTENTION: Cette analyse peut prendre 30-40 minutes!");
ResultsPrinter.printInfo("(Génération et analyse de 2 grands réseaux)");
System.out.print("\nContinuer? (o/n): ");
Scanner scanner = new Scanner(System.in);
String response = scanner.nextLine().trim().toLowerCase();
if (response.equals("o") || response.equals("oui") || response.equals("y") || response.equals("yes")) {
NetworkGenerator.analyze(dblpGraph);
ResultsPrinter.printInfo("\nPour générer le graphique comparatif:");
ResultsPrinter.printInfo(" cd gnuplot && gnuplot plot_comparison_networks.gnu");
} else {
ResultsPrinter.printInfo("Analyse annulée.");
}
}
/**
* Question 7 (BONUS): Teste le générateur par copie.
*
* Cette méthode génère un réseau avec le mécanisme de copie et compare
* son clustering avec DBLP et Barabási-Albert. Durée: 15-20 min.
*/
private static void runQuestion7() {
if (dblpGraph == null) {
ResultsPrinter.printError("Chargez d'abord le graphe (Question 1)!");
return;
}
// Génération du graphe BA si nécessaire pour la comparaison
if (baGraph == null) {
ResultsPrinter.printInfo("Génération du graphe Barabási-Albert pour comparaison...");
int n = Math.min(dblpGraph.getNodeCount(), 50000);
double avgDegree = BasicMetrics.getAverageDegree(dblpGraph);
int edgesPerNode = (int) Math.round(avgDegree / 2.0);
baGraph = NetworkGenerator.generateBarabasiAlbert(n, Math.max(1, edgesPerNode));
}
ResultsPrinter.printWarning("ATTENTION: Cette analyse peut prendre 15-20 minutes!");
System.out.print("\nContinuer? (o/n): ");
Scanner scanner = new Scanner(System.in);
String response = scanner.nextLine().trim().toLowerCase();
if (response.equals("o") || response.equals("oui") || response.equals("y") || response.equals("yes")) {
CopyGenerator.analyze(dblpGraph, baGraph);
} else {
ResultsPrinter.printInfo("Analyse annulée.");
}
}
/**
* Exécute toutes les questions en séquence.
*
* Cette méthode lance l'exécution automatique de toutes les analyses
* (Questions 1 à 7) sans interruption. Durée totale: environ 1h30.
*/
private static void runAllQuestions() {
ResultsPrinter.printHeader("EXÉCUTION COMPLÈTE - TOUTES LES QUESTIONS");
ResultsPrinter.printWarning("ATTENTION: L'exécution complète peut prendre 1h30 à 2h!");
ResultsPrinter.printInfo("Les questions longues (Q5, Q6, Q7) seront exécutées automatiquement.");
System.out.print("\nVoulez-vous vraiment tout exécuter? (o/n): ");
Scanner scanner = new Scanner(System.in);
String response = scanner.nextLine().trim().toLowerCase();
if (!response.equals("o") && !response.equals("oui") && !response.equals("y") && !response.equals("yes")) {
ResultsPrinter.printInfo("Exécution annulée.");
return;
}
long globalStart = System.currentTimeMillis();
// Question 1: Chargement
if (dblpGraph == null) {
runQuestion1();
}
// Question 2: Mesures de base
if (dblpGraph != null) {
runQuestion2();
}
// Question 3: Connexité
if (dblpGraph != null) {
runQuestion3();
}
// Question 4: Distribution des degrés
if (dblpGraph != null) {
runQuestion4();
}
// Question 5: Distance moyenne
if (dblpGraph != null) {
ResultsPrinter.printInfo("\n>>> Démarrage Question 5 (Distance moyenne)...");
DistanceAnalyzer.analyze(dblpGraph, "DBLP", "dblp");
}
// Question 6: Comparaison avec générateurs
if (dblpGraph != null) {
ResultsPrinter.printInfo("\n>>> Démarrage Question 6 (Générateurs)...");
NetworkGenerator.analyze(dblpGraph);
}
// Question 7: Générateur par copie (BONUS)
if (dblpGraph != null) {
ResultsPrinter.printInfo("\n>>> Démarrage Question 7 (Générateur copie - BONUS)...");
// Génération du graphe BA si nécessaire
if (baGraph == null) {
int n = Math.min(dblpGraph.getNodeCount(), 50000);
double avgDegree = BasicMetrics.getAverageDegree(dblpGraph);
int edgesPerNode = (int) Math.round(avgDegree / 2.0);
baGraph = NetworkGenerator.generateBarabasiAlbert(n, Math.max(1, edgesPerNode));
}
CopyGenerator.analyze(dblpGraph, baGraph);
}
ResultsPrinter.printHeader("TOUTES LES ANALYSES TERMINÉES!");
ResultsPrinter.printElapsedTime(globalStart);
ResultsPrinter.printInfo("\nPROCHAINES ÉTAPES:");
ResultsPrinter.printInfo(" 1. Générez les graphiques avec gnuplot (voir gnuplot/*.gnu)");
ResultsPrinter.printInfo(" 2. Consultez les fichiers de données dans output/data/");
ResultsPrinter.printInfo(" 3. Rédigez le rapport README.md avec les résultats et graphiques");
}
}