projet-programmation-impera.../livrables/raffinages.txt
2020-12-09 13:28:36 +00:00

134 lines
4.2 KiB
Plaintext

Ce raffinage décrit l'implémentation de l'algorithme de PageRank dans le cas d'une implémentation de matrice naives.
Une syntaxe proche du python3 est adoptée pour simplifier l'écriture et la lisibilité.
DISCLAIMER: Cette implémentation n'est pas la plus efficace, mais la plus simple.
On suppose que l'on utilise un language fortement typé (utile pour la robustesse).
On suppose que les procédures/fonctions suivantes sont élémentaires:
Std:
- Arguments
- Longueur
- Exception
- Écrire
- Lire
- Ouvrir
- Fermer
- Fin // end of file
- Somme
Matrice:
- Transposer
- Ones
- Zeros
- Les opérations binaires: * / +
- L'accès via les [ ]
- Trier
R0: Calculer le PageRank et le poids de chaque nœud d'un réseau
R1: Comment « Calculer le PageRank et le poids de chaque nœud d'un réseau » ?
Récuperer les arguments de la ligne de commande out: filename, ite_max, alpha, naif
Initialiser les variables out: pi, G, N
Éxecuter l'algorithme itératif in out: pi ; in: G
Écrire les résultats dans des fichiers in: pi, filename, N
R2: Comment « Récupérer les arguments de la ligne de commande » ?
args ← Arguments()
len_args ← Longueur(args)
Si non 0 < len_args <= 6 Alors
Lever l'exception ERROR_ARGS
Sinon
Traiter les arguments in: args, len_args ; out: filename, ite_max, alpha, naif
FinSi
Lors d'une exception Faire
// ici on attend principalement les exceptions: EEROR_ARGS et CONSTRAINT_ERROR
Afficher les consignes d'utilisation
Fin du traitement des excpetions
R3: Comment « Traiter les arguments » ?
ite_max ← 150
alpha ← 0.85
naif ← False
i ← 0
Répéter
Si le ième argument est "-I" Alors
ite_max ← l'entier du (i+1)ème argument
i ← i + 2
SinonSi le ième argument est "-A" Alors
alpha ← le réel du (i+1)ème argument
i ← i + 2
SinonSi le ième argument finit par ".net" Alors
filename ← le ième argument sans l'extension
i ← i + 1
SinonSi le ième argument est "-P" Alors
naif ← True
i ← i + 1
Sinon
Lever l'exception ERROR_ARGS
FinSi
SortirQuand i < len_args
FinRépéter
R3: Comment « Afficher les consignes d'utilisation » ?
Écrire("Erreur lors de la saisi de la commande")
Écrire("Usage: pagerank [-I max_iterations] [-A alpha] fichier_reseau.net")
R2: Comment « Initialiser les variables » ?
Créer H out: H, N
Créer S in: H, N ; out: S
pi ← Vecteur de Taille N remplit de 1/N
G ← alpha * S + Matrice de Taille N, N remplit de (1-alpha)/N
R3: Comment « Créer H » ?
fichier ← Ouvrir(filename + ".net")
N ← Lire(fichier)
H ← Matrice de Taille de N,N de 0
TantQue non Fin(fichier) Faire
i ← Lire(fichier)
j ← Lire(fichier)
L'element i,j de la matrice H ← 1
FinTantQue
Fermer(fichier)
Pour i de 0 à N-1 Faire
somme_ligne ← La Somme la ligne i de la matrice H
Si somme_ligne /= 0
La ligne i de la matrice H ← La ligne i de la matrice H divisé par somme_ligne
FinSi
FinPour
R3: Comment « Créer S » ?
V ← H * Vecteur de Taille N remplit de 1
S ← H
Pour i de 0 a N-1 Faire
Si L'element i du vecteur V = 0 Alors
La ligne i de la matrice S ← 1/N
Fin Si
FinPour
R2: Comment « Éxecuter l'algorithme itératif » ?
G ← Transposer(G)
Pour i de 1 à ite_max Faire
pi ← G_transpo * pi
FinPour
R2: Comment « Écrire les résultats dans des fichiers » ?
Coupler les poids et leur indice in: pi ; out: pi_couple
pi_couple ← Trier(pi_couple, 0) // on trie selon la première colonne
fichier ← Ouvrir(filename + ".p")
Écrire(fichier, Première Colonne de pi_couple)
Fermer(fichier)
fichier ← Ouvrir(filename + ".ord")
Écrire(fichier, Seconde Colonne pi_couple)
Fermer(fichier)
R3: Comment « Coupler les poids et leur indice » ?
pi_couple ← Matrice de Taille N,2 remplit de 0
Première Colone de pi_couple ← pi
Pour i de 0 à N-1 Faire
L'element i,1 de pi-couple ← i
FinPour