288 lines
8.5 KiB
Markdown
288 lines
8.5 KiB
Markdown
# Alobe
|
||
|
||
## Description
|
||
|
||
Alobé est un logiciel libres permettant de manipuler de grands graphes non-orientes décrits par la liste de leurs arrêtes. Il possède les
|
||
caractéristiques suivantes :
|
||
|
||
* Il est distribue sous la licence [GNU General Public License](http://www.gnu.org/copyleft/gpl.html)
|
||
* Il est ecrit en C (bien qu’écrit au départ en C++, comme en témoigne le dépôt subversion) et possède une interface en ligne de commande,
|
||
* Il implémente le filtrage du graphe pour l'extraction d'un sous-ensemble (exercice 2).
|
||
* Il implémente le calcul des degrés (exercice 3)
|
||
* Il implémente les statistiques sur le calcul des degrés (degré moyen, degré maximum, densité du graphe) (exercice 5)
|
||
* Il implémente le stockage des données de façon contiguë en mémoire (en un unique tableau) (exercice 4).
|
||
* Il implémente le calcul des composantes connexes de façon efficace (exercice 5).
|
||
* Il implémente une méthode de calcul alternatif des composantes connexes (exercice 6 - defi).
|
||
|
||
### Auteurs
|
||
|
||
Alobe a ete entierement realise par Glenn ROLLAND
|
||
<[glenux@fr.st](mailto:glenux@fr.st)> a l'occasion de travaux pratiques du
|
||
cours de Grand Reseaux du Master 2 Ingenierie Informatique \- Systemes,
|
||
Reseaux et Internet.
|
||
|
||
## Pre-requis
|
||
|
||
Alobé ne nécessite pas de bibliothèques de fonctions particulières pour
|
||
fonctionner.
|
||
|
||
## Se procurer Alobe
|
||
|
||
Vous pouvez recharger la dernière archive des sources, ou bien directement
|
||
la version la plus récente du projet sur le dépôt Subversion du projet.
|
||
|
||
## 4. Utiliser Alobe
|
||
|
||
### 4.1. Compilation
|
||
|
||
Commencez par decompressez l'archive.
|
||
|
||
$ tar -xzvf alobe-0.1.tar.gz
|
||
|
||
Rendez vous ensuite dans le dossier qui vient d'etre cree lors de la
|
||
decompression.
|
||
|
||
$ 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 `src/alobe`
|
||
|
||
|
||
### 4.2. Utilisation
|
||
|
||
Les binaires de Alobe doivent etre appeles avec la syntaxe suivante:
|
||
|
||
Usage: alobe <commande> <parametres_obligatoires> [options]
|
||
|
||
Les commandes sont les suivants:
|
||
|
||
-F, --filter
|
||
Filtrage du fichier d'entree pour extraire un sous-graphe.
|
||
-D, --degree
|
||
Calcul du degre des noeuds du graphe pris en entree.
|
||
-S, --store
|
||
Stockage et remplissage du tableau representant le graphe en memoire.
|
||
-A, --average
|
||
Calcul des statistiques sur les noeuds du graphe d'entree (degre moyen, degre max, densite).
|
||
-C, --connexity
|
||
Calcul des composantes connexes par la methode du tableau unique.
|
||
-E, --defi
|
||
Calcul des composantes connexes par ensembles d'intervalles de noeuds.
|
||
|
||
Les parametres obligatoires sont les suivants:
|
||
|
||
-c, --count <entier>
|
||
Nombre de noeuds du fichier d'entree.
|
||
-s, --size <entier>
|
||
Taille du filtre
|
||
-t, --offset <entier>
|
||
Offset du filtre
|
||
|
||
Les parames optionnels sont les suivants:
|
||
|
||
-i, --input <fichier>
|
||
Le fichier d'entree, "-" designant l'entree standard,
|
||
-o, --output <fichier>
|
||
Le fichier de sorftie, "-" designant la sortie standard.
|
||
-v, --verbose
|
||
Passe l'affichage en mode verbeux.e numero du noeud a lire et afficher a partir du fichier compresse
|
||
|
||
## 5. Documentation
|
||
|
||
### 5.1. Code
|
||
|
||
Vous pouvez trouver la documentation de Alobe dans le dossier doc/html de
|
||
l'application, ou en suivant [ce lien](html/index.html).
|
||
|
||
### 5.2. Remarques sur les differents exercices
|
||
|
||
#### 5.2.1. Exercice 1
|
||
|
||
|
||
|
||
#### 5.2.2. Exercice 2
|
||
|
||
Il est possible de filtrer le graphe d'entree pour extraire un sous ensemble
|
||
de noeuds de la façon suivante :
|
||
|
||
./src/alobe -F -t 0 -s 30 -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 )
|
||
|
||
#### 5.2.3. Exercice 3
|
||
|
||
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 premiere colone l'index du noeud et en seconde le degre):
|
||
|
||
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 degre est effectue dans un tableau de sizeof(long) * N (ou N est
|
||
le nombre de noeuds), initialise a zero, et ou les valeurs des cases sont
|
||
incrementees a la lecture des arcs.
|
||
|
||
#### 5.2.4. Exercice 4
|
||
|
||
Le simple stockage du graphe en mémoire ne produit pas de sortie visible, mais
|
||
s’exécute en tapant :
|
||
|
||
./src/alobe -S -i ../web.data.gz -c 701654
|
||
|
||
Le programme commence par calculer les degres, puis initialise un tableau de
|
||
taille N (N = nombre de noeuds) pointeurs vers les cases d'un tableau de
|
||
taille (M + 3) * sizeof(long) (ou M est la somme des degres des noeuds)
|
||
destine a contenir les arcs de chaque noeud. Les 3 cases supplementaires ne
|
||
servent qu'au calcul des composates connexes et seront decrites plus loin.
|
||
|
||
#### 5.2.5. Exercice 5
|
||
|
||
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 reutilise la structure de donnees l'exercice 3, et en la
|
||
parcourant effectue le calcul.
|
||
|
||
#### 5.2.6. Exercice 6
|
||
|
||
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 a ma disposition ne possedaient
|
||
pas suffisament de memoire...
|
||
|
||
Le calcul des composantes connexes utilise le meme tableau que l'exercice 4.
|
||
Le calcul se fait dans les 3 cases supplementaires :
|
||
|
||
* une case pour le degre du noeud
|
||
* une case pour l'offset du noeud traite
|
||
* une case pour le noeud "pere" dans le parcours en profondeur.
|
||
|
||
Lorsqu'on parcours un noeud x en provenance de y, on inscrit la reference du
|
||
noeud pere dans la case 3, puis pour chaque noeud adjacent non visite, on
|
||
indique le noeud adjacent parcouru actuellement puis on parcourt recursivement
|
||
le noeud adjacent.
|
||
|
||
Remarque: jusque la le TP etait programme en C++, et pour un eventeuel gain de
|
||
performances il fut reecrit entierement (en conservant les structures de
|
||
donnees) en C. Cependant seules 0.3 secondes furent gagnees 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).
|
||
|
||
#### 5.2.7. Defi
|
||
|
||
On suppose que dans le graphe du web, les noeud adjacents ont de fortes
|
||
chances d'appartenir a la même composante connexe.
|
||
|
||
Ainsi, pour décrire en mémoire une composante regroupant les nœuds {0, 1, 2
|
||
,3 ,4, 5, 6, 7, 8, 9, 10, 14,15,16, 17, 19, 20} nul 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...)
|
||
|