projet-programmation-impera.../livrables/raffinages.txt
2020-12-05 13:48:44 +00:00

134 lines
3.4 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: raffinages pas encore finis
On suppose que les procédures/fonctions suivantes sont élémentaires:
Std:
- Arguments
- Longueur
- Exception
- Écrire
- Lire
- Ouvrir
- Fermer
- Fin // end of file
- Abs
- 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, epsilon, N
Éxecuter l'algorithme itératif in out: pi ; in: G, epsilon
É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
Exception(ERROR_ARGS)
Sinon
Traiter les arguments in: args, len_args ; out: filename, ite_max, alpha, naif
FinSi
Si Exception(QUELCONQUE)
Afficher les consignes d'utilisation
Fin Si
R3: Comment « Traiter les arguments » ?
ite_max ← 150
alpha ← 0.85
naif ← False
i ← 0
Répéter
Si args[i] = "-I" Alors
ite_max ← args[i+1]
i ← i + 2
SinonSi args[i] = "-A" Alors
alpha ← args[i+1]
i ← i + 2
SinonSi args[i][-4:-1] == ".net" Alors
filename ← args[i][0:-4]
i ← i + 1
SinonSi args[i] == "-P" Alors
naif ← True
i ← i + 1
Sinon
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 » ?
epsilon ← 0.01
Créer H out: H, N
Créer S in: H, N ; out: S
pi ← Ones(N, N)/N
E ← Ones(N, N) * (1-alpha)/N
G ← alpha * S + E
R3: Comment « Créer H » ?
fichier ← Ouvrir(filename + ".net")
N ← Lire(fichier)
H ← Zeros(N, N)
TantQue non Fin(fichier) Faire
i ← Lire(fichier)
j ← Lire(fichier)
H[i, j] ← 1
FinTantQue
Fermer(fichier)
Pour i de 0 à N-1 Faire
H[i,:] ← H[i,:]/Somme(H[i,:])
FinPour
R3: Comment « Créer S » ?
X ← Ones(N, 1)
V ← H * X
S ← H
Pour i de 0 a N-1 Faire
Si V[i] = 0 Alors
S[i,:] = 1/N
Fin Si
FinPour
R2: Comment « Éxecuter l'algorithme itératif » ?
i ← 0
Répéter
pi_last ← pi
pi ← Transposer(G) * pi
i ← i + 1
SortirQuand i >= ite_max ou Abs(pi - pi_last) < epsilon
FinRépéter
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, 'c', 0) // on trie selon la première colonne
fichier ← Ouvrir(filename + ".p")
Écrire(fichier, pi_couple[:,0])
Fermer(fichier)
fichier ← Ouvrir(filename + ".ord")
Écrire(fichier, pi_couple[:,1])
Fermer(fichier)
R3: Comment « Coupler les poids et leur indice » ?
pi_couple ← Zeros(N, 2)
pi_couple[:, 0] = pi
Pour i de 0 N-1 Faire
pi_couple[i, 1] ← i
FinPour