cf mail KJR + 2/3 changements mineurs

git-svn-id: http://cregut.svn.enseeiht.fr/2020/1sn/pim/projets/GH-05@207543 e13453a9-b01f-0410-a051-f404c4f0c485
This commit is contained in:
lfainsin 2020-12-07 20:07:59 +00:00
parent 08944a8856
commit 9f321ff6cb

View file

@ -1,6 +1,9 @@
Ce raffinage décrit l'implémentation de l'algorithme de PageRank dans le cas d'une implémentation de matrice naives. 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é. Une syntaxe proche du python3 est adoptée pour simplifier l'écriture et la lisibilité.
DISCLAIMER: raffinages pas encore finis
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: On suppose que les procédures/fonctions suivantes sont élémentaires:
Std: Std:
- Arguments - Arguments
@ -11,7 +14,6 @@ On suppose que les procédures/fonctions suivantes sont élémentaires:
- Ouvrir - Ouvrir
- Fermer - Fermer
- Fin // end of file - Fin // end of file
- Abs
- Somme - Somme
Matrice: Matrice:
@ -27,8 +29,8 @@ 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 » ? 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 Récuperer les arguments de la ligne de commande out: filename, ite_max, alpha, naif
Initialiser les variables out: pi, G, epsilon, N Initialiser les variables out: pi, G, N
Éxecuter l'algorithme itératif in out: pi ; in: G, epsilon Éxecuter l'algorithme itératif in out: pi ; in: G
Écrire les résultats dans des fichiers in: pi, filename, N Écrire les résultats dans des fichiers in: pi, filename, N
R2: Comment « Récupérer les arguments de la ligne de commande » ? R2: Comment « Récupérer les arguments de la ligne de commande » ?
@ -39,26 +41,27 @@ R2: Comment « Récupérer les arguments de la ligne de commande » ?
Sinon Sinon
Traiter les arguments in: args, len_args ; out: filename, ite_max, alpha, naif Traiter les arguments in: args, len_args ; out: filename, ite_max, alpha, naif
FinSi FinSi
Si Exception(QUELCONQUE) Quand Exception(QUELCONQUE)
// ici on attend principalement les exceptions: EEROR_ARGS et CONSTRAINT_ERROR
Afficher les consignes d'utilisation Afficher les consignes d'utilisation
Fin Si Fin Si
R3: Comment « Traiter les arguments » ? R3: Comment « Traiter les arguments » ?
ite_max ← 150 ite_max ← 150 // Integer
alpha ← 0.85 alpha ← 0.85 // Float
naif ← False naif ← False // Boolean
i ← 0 i ← 0
Répéter Répéter
Si args[i] = "-I" Alors Si args[i] = "-I" Alors
ite_max ← args[i+1] ite_max ← Integer(args[i+1])
i ← i + 2 i ← i + 2
SinonSi args[i] = "-A" Alors SinonSi args[i] = "-A" Alors
alpha ← args[i+1] alpha ← Float(args[i+1])
i ← i + 2 i ← i + 2
SinonSi args[i][-4:-1] == ".net" Alors SinonSi args[i][-4:-1] = ".net" Alors
filename ← args[i][0:-4] filename ← args[i][0:-4]
i ← i + 1 i ← i + 1
SinonSi args[i] == "-P" Alors SinonSi args[i] = "-P" Alors
naif ← True naif ← True
i ← i + 1 i ← i + 1
Sinon Sinon
@ -72,12 +75,10 @@ R3: Comment « Afficher les consignes d'utilisation » ?
Écrire("Usage: pagerank [-I max_iterations] [-A alpha] fichier_reseau.net") Écrire("Usage: pagerank [-I max_iterations] [-A alpha] fichier_reseau.net")
R2: Comment « Initialiser les variables » ? R2: Comment « Initialiser les variables » ?
epsilon ← 0.01
Créer H out: H, N Créer H out: H, N
Créer S in: H, N ; out: S Créer S in: H, N ; out: S
pi ← Ones(N, N)/N pi ← Ones(N, 1)/N
E ← Ones(N, N) * (1-alpha)/N G ← alpha * S + Ones(N, N) * (1-alpha)/N
G ← alpha * S + E
R3: Comment « Créer H » ? R3: Comment « Créer H » ?
fichier ← Ouvrir(filename + ".net") fichier ← Ouvrir(filename + ".net")
@ -96,27 +97,22 @@ R3: Comment « Créer H » ?
FinPour FinPour
R3: Comment « Créer S » ? R3: Comment « Créer S » ?
X ← Ones(N, 1) V ← H * Ones(N, 1)
V ← H * X
S ← H S ← H
Pour i de 0 a N-1 Faire Pour i de 0 a N-1 Faire
Si V[i] = 0 Alors Si V[i] = 0 Alors
S[i,:] = 1/N S[i,:] 1/N
Fin Si Fin Si
FinPour FinPour
R2: Comment « Éxecuter l'algorithme itératif » ? R2: Comment « Éxecuter l'algorithme itératif » ?
i ← 0 Pour i de 1 à ite_max Faire
Répéter
pi_last ← pi
pi ← Transposer(G) * pi pi ← Transposer(G) * pi
i ← i + 1 FinPour
SortirQuand i >= ite_max ou Abs(pi - pi_last) < epsilon
FinRépéter
R2: Comment « Écrire les résultats dans des fichiers » ? R2: Comment « Écrire les résultats dans des fichiers » ?
Coupler les poids et leur indice in: pi ; out: pi_couple 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 pi_couple ← Trier(pi_couple, 0) // on trie selon la première colonne
fichier ← Ouvrir(filename + ".p") fichier ← Ouvrir(filename + ".p")
Écrire(fichier, pi_couple[:,0]) Écrire(fichier, pi_couple[:,0])
@ -128,7 +124,7 @@ R2: Comment « Écrire les résultats dans des fichiers » ?
R3: Comment « Coupler les poids et leur indice » ? R3: Comment « Coupler les poids et leur indice » ?
pi_couple ← Zeros(N, 2) pi_couple ← Zeros(N, 2)
pi_couple[:, 0] = pi pi_couple[:, 0] pi
Pour i de 0 N-1 Faire Pour i de 0 à N-1 Faire
pi_couple[i, 1] ← i pi_couple[i, 1] ← i
FinPour FinPour