Alobé est un logiciel libres permettant de manipuler de grands graphes non-orientés décrits par la liste de leurs arrêtes. Il possède les caractéristiques suivantes :
Alobé a été entièrement réalisé par Glenn ROLLAND <glenux@fr.st> à l'occasion de travaux pratiques du cours de Grand Réseaux du Master 2 Ingénierie Informatique - Systèmes, Réseaux et Internet.
Alobé ne nécessite pas de bibliothèques de fonctions particulières pour fonctionnner.
Afin d'obtenir les sources les plus à jour, vous pouvez utiliser le logiciel de contrôle de sources Subversion
$ svn checkout http://repository.glenux.ath.cx/svn/Cours/M2/Grand_Reseaux/TP1/
Il n'y a pas de mot de passe, il suffit donc de presser la touche "Entrée" pour l'utilisateur "anonymous", si ce dernier vous est demandé.
Commencez par décompressez l'archive.
$ tar -xzvf alobe-0.1.tar.gz
Rendez vous ensuite dans le dossier qui vient d'être créé lors de la décompression.
$ cd alobe-0.1
Puis lancez l'auto-configuration du logiciel, puis la compilation.
$ ./autogen
$ ./configure
$ make
Le binaire produits se trouve dans le dossier :
Usage:
alobe <commande> <parametres_obligatoires>
[options]
Les commandes sont les suivants:
Les paramètres obligatoires sont les suivants:
Les parames optionnels sont les suivants:
Vous pouvez trouver la documentation de Alobé dans le dossier doc/html de l'application, ou en suivant ce lien.
Il est possible de filtrer le graphe d'entrée pour extraire un sous ensemble de noeuds de la façon suivante :
./src/alobe -F -t 0 -s 60 -i ../web.data.gz -c 701654
Ce qui produit en sortie
Command -> FILTER
Offset -> 0
Size -> 30
Input Data -> ../web.data.gz
Input Index -> 701654
Filtering between [ 0 .. 30 ]...
0 1
0 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
[...]
( uniquement les noeuds x compris entre 0 <= x < 30 )
Le calcul du degré des noeuds se fait par la commande suivante :
./src/alobe -D -i ../web.data.gz -c 701654
Ce qui produit (en première colone l'index du noeud et en seconde le degré):
Command -> DEGREE
Input Data -> ../web.data.gz
Input Index -> 701654
Computing degree of each node...
done
0 2
1 1194
2 77
3 496
4 227
5 339
6 337
7 340
8 337
9 10
10 16
11 31
12 15
13 22
[...]
Le calcul du degré est effectué dans un
tableau de sizeof(long) * N
(où N est le nombre de noeuds), initialisé à
zéro, et où les valeurs des cases sont
incrémentées à la lecture des arcs.
Le simple stockage du graphe en mémoire ne produit pas de sortie visible, mais s'execute en tapant :
./src/alobe -S -i ../web.data.gz -c 701654
Le programme commence par calculer les degrés, puis initialise un tableau de taille N (N = nombre de noeuds) pointeurs vers les cases d'un tableau de taille (M + 3) * sizeof(long) (où M est la somme des degrés des noeuds) destiné à contenir les arcs de chaque noeud. Les 3 cases supplémentaires ne servent qu'au calcul des composates connexes et seront décrites plus loin.Le calcul des statistiques sur les noeuds du graphe se fait de la façon suivante:
./src/alobe -A -i ../web.data.gz -c 701654
Command -> AVERAGE
Input Data -> ../web.data.gz
Input Index -> 701654
Computing degree of each node...
done
Degree average: 5.517015
Degree maximum: 5331
Density : 0.000000
Cet exercice réutilise la structure de données l'éxercice 3, et en la parcourant effectue le calcul.
Le calcul des composantes connexes se fait de la façon suivante :
./src/alobe -C -i ../web.data.gz -c 701654
Command -> CONNEXITY
Input Data -> ../web.data.gz
Input Index -> 701654
Computing degree of each node...
done
Filling the Big Table...
done
Found connex component at 0
Found connex component at 9484
Found connex component at 15516
Found connex component at 17477
Found connex component at 20073
Found connex component at 20100
[...]
Found connex component at 699413
Found connex component at 700568
Found connex component at 701306
Found connex component at 701313
Found 970 connex components
Pour le fichier IP.data.gz on obtient :
Command -> CONNEXITY
Input Data -> /home/warbrain/Films/IP.data.gz
Input Index -> 467273
Computing degree of each node...
done
Filling the Big Table...
done
Found connex component at 0
Found connex component at 324896
Found 2 connex components
Et pour le fichier P2P.data.gz les machines à ma disposition ne possédaient pas suffisament de mémoire...
Le calcul des composantes connexes utilise le même
tableau que l'exercice 4. Le calcul se fait dans les 3 cases
supplémentaires :
Lorsqu'on parcours un noeud x en provenance de y, on inscrit la référence du noeud père dans la case 3, puis pour chaque noeud adjacent non visité, on indique le noeud adjacent parcouru actuellement puis on parcourt récursivement le noeud adjacent.
Remarque: jusque là le TP était programmé en C++, et pour un éventeuel gain de performances il fut réécrit entièrement (en conservant les structures de données) en C. Cependant seules 0.3 secondes furent gagnées sur le graphe web.data.gz... sur un temps de calcul total de 14 sec... (sur un iBook G4 1Ghz avec 256 Mo de RAM sous GNU/Linux).
On suppose que dans le graphe du web, les noeud adjacents
ont de fortes chances d'appartenir à la même composante
connexe.
Ainsi, pour décrire en mémoire une composante regroupant
les noeuds {0, 1, 2 ,3 ,4, 5, 6, 7,
8, 9, 10, 14,15,16, 17, 19, 20} null besoin de stocker en
mémoire autre chose que les ensembles d'intervalles suivants: [0 .. 10] U [14 .. 17] U [19 .. 20] ...
Cependant, les fusions d'ensembles nécessitent de nombreuses recopies de données et d'allocations de mémoire. L'algorithme s'en trouve par conséquent fort ralenti...
On peut lancer le défi en tapant :
./src/alobe -E -i ../web.data.gz -c 701654
..et admirer les résultats (s'il apparaissent, car il y a encore pas mal de soucis de pointeurs se baladant librement...)