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.
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:
Std:
- Arguments
@ -11,7 +14,6 @@ On suppose que les procédures/fonctions suivantes sont élémentaires:
- Ouvrir
- Fermer
- Fin // end of file
- Abs
- Somme
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 » ?
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
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 » ?
@ -39,26 +41,27 @@ R2: Comment « Récupérer les arguments de la ligne de commande » ?
Sinon
Traiter les arguments in: args, len_args ; out: filename, ite_max, alpha, naif
FinSi
Si Exception(QUELCONQUE)
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
alpha ← 0.85
naif ← False
ite_max ← 150 // Integer
alpha ← 0.85 // Float
naif ← False // Boolean
i ← 0
Répéter
Si args[i] = "-I" Alors
ite_max ← args[i+1]
ite_max ← Integer(args[i+1])
i ← i + 2
SinonSi args[i] = "-A" Alors
alpha ← args[i+1]
alpha ← Float(args[i+1])
i ← i + 2
SinonSi args[i][-4:-1] == ".net" Alors
SinonSi args[i][-4:-1] = ".net" Alors
filename ← args[i][0:-4]
i ← i + 1
SinonSi args[i] == "-P" Alors
SinonSi args[i] = "-P" Alors
naif ← True
i ← i + 1
Sinon
@ -72,12 +75,10 @@ R3: Comment « Afficher les consignes d'utilisation » ?
É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
pi ← Ones(N, 1)/N
G ← alpha * S + Ones(N, N) * (1-alpha)/N
R3: Comment « Créer H » ?
fichier ← Ouvrir(filename + ".net")
@ -96,27 +97,22 @@ R3: Comment « Créer H » ?
FinPour
R3: Comment « Créer S » ?
X ← Ones(N, 1)
V ← H * X
V ← H * Ones(N, 1)
S ← H
Pour i de 0 a N-1 Faire
Si V[i] = 0 Alors
S[i,:] = 1/N
S[i,:] 1/N
Fin Si
FinPour
R2: Comment « Éxecuter l'algorithme itératif » ?
i ← 0
Répéter
pi_last ← pi
Pour i de 1 à ite_max Faire
pi ← Transposer(G) * pi
i ← i + 1
SortirQuand i >= ite_max ou Abs(pi - pi_last) < epsilon
FinRépéter
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, '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")
É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 » ?
pi_couple ← Zeros(N, 2)
pi_couple[:, 0] = pi
Pour i de 0 N-1 Faire
pi_couple[:, 0] pi
Pour i de 0 à N-1 Faire
pi_couple[i, 1] ← i
FinPour