projet-programmation-impera.../livrables/raffinages.txt
2020-12-07 20:07:59 +00:00

130 lines
3.5 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
Exception(ERROR_ARGS)
Sinon
Traiter les arguments in: args, len_args ; out: filename, ite_max, alpha, naif
FinSi
Quand Exception(QUELCONQUE)
// ici on attend principalement les exceptions: EEROR_ARGS et CONSTRAINT_ERROR
Afficher les consignes d'utilisation
Fin Si
R3: Comment « Traiter les arguments » ?
ite_max ← 150 // Integer
alpha ← 0.85 // Float
naif ← False // Boolean
i ← 0
Répéter
Si args[i] = "-I" Alors
ite_max ← Integer(args[i+1])
i ← i + 2
SinonSi args[i] = "-A" Alors
alpha ← Float(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 » ?
Créer H out: H, N
Créer S in: H, N ; out: S
pi ← Ones(N, 1)/N
G ← alpha * S + Ones(N, N) * (1-alpha)/N
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 » ?
V ← H * Ones(N, 1)
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 » ?
Pour i de 1 à ite_max Faire
pi ← Transposer(G) * 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, 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