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