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 Lever l'exception ERROR_ARGS Sinon Traiter les arguments in: args, len_args ; out: filename, ite_max, alpha, naif FinSi Lors d'une exception Faire // ici on attend principalement les exceptions: EEROR_ARGS et CONSTRAINT_ERROR Afficher les consignes d'utilisation Fin du traitement des excpetions R3: Comment « Traiter les arguments » ? ite_max ← 150 alpha ← 0.85 naif ← False i ← 0 Répéter Si le ième argument est "-I" Alors ite_max ← l'entier du (i+1)ème argument i ← i + 2 SinonSi le ième argument est "-A" Alors alpha ← le réel du (i+1)ème argument i ← i + 2 SinonSi le ième argument finit par ".net" Alors filename ← le ième argument sans l'extension i ← i + 1 SinonSi le ième argument est "-P" Alors naif ← True i ← i + 1 Sinon Lever l'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 ← Vecteur de Taille N remplit de 1/N G ← alpha * S + Matrice de Taille N, N remplit de (1-alpha)/N R3: Comment « Créer H » ? fichier ← Ouvrir(filename + ".net") N ← Lire(fichier) H ← Matrice de Taille de N,N de 0 TantQue non Fin(fichier) Faire i ← Lire(fichier) j ← Lire(fichier) L'element i,j de la matrice H ← 1 FinTantQue Fermer(fichier) Pour i de 0 à N-1 Faire somme_ligne ← La Somme la ligne i de la matrice H Si somme_ligne /= 0 La ligne i de la matrice H ← La ligne i de la matrice H divisé par somme_ligne FinSi FinPour R3: Comment « Créer S » ? V ← H * Vecteur de Taille N remplit de 1 S ← H Pour i de 0 a N-1 Faire Si L'element i du vecteur V = 0 Alors La ligne i de la matrice S ← 1/N Fin Si FinPour R2: Comment « Éxecuter l'algorithme itératif » ? G ← Transposer(G) Pour i de 1 à ite_max Faire pi ← G_transpo * 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, Première Colonne de pi_couple) Fermer(fichier) fichier ← Ouvrir(filename + ".ord") Écrire(fichier, Seconde Colonne pi_couple) Fermer(fichier) R3: Comment « Coupler les poids et leur indice » ? pi_couple ← Matrice de Taille N,2 remplit de 0 Première Colone de pi_couple ← pi Pour i de 0 à N-1 Faire L'element i,1 de pi-couple ← i FinPour