2020-12-03 18:56:35 +00:00
|
|
|
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é.
|
2020-12-07 20:07:59 +00:00
|
|
|
|
|
|
|
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).
|
2020-12-03 18:56:35 +00:00
|
|
|
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
|
2020-12-07 20:07:59 +00:00
|
|
|
Initialiser les variables out: pi, G, N
|
|
|
|
Éxecuter l'algorithme itératif in out: pi ; in: G
|
2020-12-03 18:56:35 +00:00
|
|
|
É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
|
2020-12-07 20:07:59 +00:00
|
|
|
Quand Exception(QUELCONQUE)
|
|
|
|
// ici on attend principalement les exceptions: EEROR_ARGS et CONSTRAINT_ERROR
|
2020-12-03 18:56:35 +00:00
|
|
|
Afficher les consignes d'utilisation
|
|
|
|
Fin Si
|
|
|
|
|
2020-12-05 13:48:44 +00:00
|
|
|
R3: Comment « Traiter les arguments » ?
|
2020-12-07 20:07:59 +00:00
|
|
|
ite_max ← 150 // Integer
|
|
|
|
alpha ← 0.85 // Float
|
|
|
|
naif ← False // Boolean
|
2020-12-03 18:56:35 +00:00
|
|
|
i ← 0
|
|
|
|
Répéter
|
|
|
|
Si args[i] = "-I" Alors
|
2020-12-07 20:07:59 +00:00
|
|
|
ite_max ← Integer(args[i+1])
|
2020-12-03 18:56:35 +00:00
|
|
|
i ← i + 2
|
|
|
|
SinonSi args[i] = "-A" Alors
|
2020-12-07 20:07:59 +00:00
|
|
|
alpha ← Float(args[i+1])
|
2020-12-03 18:56:35 +00:00
|
|
|
i ← i + 2
|
2020-12-07 20:07:59 +00:00
|
|
|
SinonSi args[i][-4:-1] = ".net" Alors
|
2020-12-03 18:56:35 +00:00
|
|
|
filename ← args[i][0:-4]
|
|
|
|
i ← i + 1
|
2020-12-07 20:07:59 +00:00
|
|
|
SinonSi args[i] = "-P" Alors
|
2020-12-03 18:56:35 +00:00
|
|
|
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
|
2020-12-07 20:07:59 +00:00
|
|
|
pi ← Ones(N, 1)/N
|
|
|
|
G ← alpha * S + Ones(N, N) * (1-alpha)/N
|
2020-12-03 18:56:35 +00:00
|
|
|
|
|
|
|
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 » ?
|
2020-12-07 20:07:59 +00:00
|
|
|
V ← H * Ones(N, 1)
|
2020-12-03 18:56:35 +00:00
|
|
|
S ← H
|
|
|
|
Pour i de 0 a N-1 Faire
|
|
|
|
Si V[i] = 0 Alors
|
2020-12-07 20:07:59 +00:00
|
|
|
S[i,:] ← 1/N
|
2020-12-03 18:56:35 +00:00
|
|
|
Fin Si
|
|
|
|
FinPour
|
|
|
|
|
|
|
|
R2: Comment « Éxecuter l'algorithme itératif » ?
|
2020-12-07 20:07:59 +00:00
|
|
|
Pour i de 1 à ite_max Faire
|
2020-12-03 18:56:35 +00:00
|
|
|
pi ← Transposer(G) * pi
|
2020-12-07 20:07:59 +00:00
|
|
|
FinPour
|
2020-12-03 18:56:35 +00:00
|
|
|
|
|
|
|
R2: Comment « Écrire les résultats dans des fichiers » ?
|
|
|
|
Coupler les poids et leur indice in: pi ; out: pi_couple
|
2020-12-07 20:07:59 +00:00
|
|
|
pi_couple ← Trier(pi_couple, 0) // on trie selon la première colonne
|
2020-12-03 18:56:35 +00:00
|
|
|
|
|
|
|
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)
|
2020-12-07 20:07:59 +00:00
|
|
|
pi_couple[:, 0] ← pi
|
|
|
|
Pour i de 0 à N-1 Faire
|
2020-12-03 18:56:35 +00:00
|
|
|
pi_couple[i, 1] ← i
|
|
|
|
FinPour
|