From eb238fcbdd5fa617a34015a8c0c33f2a343ad75f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Sat, 6 Nov 2021 14:04:54 +0100 Subject: [PATCH] chore: cleanup --- .gitignore | 1 + {livrables => doc}/raffinages.txt | 0 {livrables => doc}/rapport.pdf | Bin 703237 -> 703395 bytes doc/rapport.tex | 92 +++++++++++++++--------------- livrables/sources.zip | Bin 9532 -> 0 bytes livrables/sources_naive.zip | Bin 6294 -> 0 bytes 6 files changed, 47 insertions(+), 46 deletions(-) rename {livrables => doc}/raffinages.txt (100%) rename {livrables => doc}/rapport.pdf (98%) delete mode 100644 livrables/sources.zip delete mode 100644 livrables/sources_naive.zip diff --git a/.gitignore b/.gitignore index d571b2e..d25e174 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ build/ *.toc *.xdv *.tns +_minted* # Temp files *.sw? diff --git a/livrables/raffinages.txt b/doc/raffinages.txt similarity index 100% rename from livrables/raffinages.txt rename to doc/raffinages.txt diff --git a/livrables/rapport.pdf b/doc/rapport.pdf similarity index 98% rename from livrables/rapport.pdf rename to doc/rapport.pdf index 42a4bece45b1ae7ee36f7481730b40dce849781e..4d31ae00b6c2fbffd5d70c008b2feff14531a942 100644 GIT binary patch delta 13870 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 delta 13729 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 M!I6{yhlIlYFO-U^%m4rY diff --git a/doc/rapport.tex b/doc/rapport.tex index 3004daf..063a753 100644 --- a/doc/rapport.tex +++ b/doc/rapport.tex @@ -7,7 +7,7 @@ \usepackage{amssymb} \usepackage{color} \usepackage[french]{babel} -\usepackage{hyperref} +\usepackage[hidelinks]{hyperref} \usepackage{minted} %\usemintedstyle{borland} @@ -33,7 +33,7 @@ \title{\vspace{4cm} \textbf{Rapport de projet de programmation impérative} \\ Implémentation d'un algorithme de pageRank \vspace{1cm}} \author{Maxime Dubaux \\ Laurent Fainsin} \date{\vspace{7cm} Département Sciences du Numérique - Première année \\ -2020 - 2021 } + 2020 - 2021 } \maketitle @@ -78,17 +78,17 @@ Ada est un langage fortement typé. Comme nous manipulons ici plusieurs types de Lorsque nous trierons les données, nous ferons appel à l’algorithme QuickSort. -Nous avons séparé le module Vector en trois sous-modules : Un module capable de stocker des entiers, un autre pour des flottants et un dernier pour des liens. Nous avons fait ce choix car créer un unique module générique Vector pour gérer ces trois types de données (très différents) était trop compliqué. Cela était tout de même faisable mais le code était compliqué à lire. Ainsi bien que le code soit quelque fois redondant, il est plus compréhensible.  +Nous avons séparé le module Vector en trois sous-modules : Un module capable de stocker des entiers, un autre pour des flottants et un dernier pour des liens. Nous avons fait ce choix car créer un unique module générique Vector pour gérer ces trois types de données (très différents) était trop compliqué. Cela était tout de même faisable mais le code était compliqué à lire. Ainsi bien que le code soit quelque fois redondant, il est plus compréhensible. \subsection{Gestion des matrice de Google (google\_*.ads)} -Nous devrons regrouper dans des modules génériques le code en rapport avec la gestion des matrices de Google. Nous utiliserons deux modules, un gérant les matrices naïves et un autre pour gérer les matrices creuses. +Nous devrons regrouper dans des modules génériques le code en rapport avec la gestion des matrices de Google. Nous utiliserons deux modules, un gérant les matrices naïves et un autre pour gérer les matrices creuses. Ces modules introduiront le type T\_Google, ainsi que des procédures et fonctions permettant de générer la matrice G, nécessaire au calcul du pageRank. Ils implémenteront aussi l’opération de multiplication entre un vecteur et une matrice. \subsection{Gestion du calcul du Pagerank (pagerank.adb)} -Cette dernière partie s’occupe de regrouper tous les éléments présents dans les deux modules cités précédemment pour ainsi calculer itérativement le pageRank du réseau. Cette sous-partie gère de plus le traitement des arguments de la ligne de commande ainsi que la lecture et l’écriture des résultats dans des fichiers.  +Cette dernière partie s’occupe de regrouper tous les éléments présents dans les deux modules cités précédemment pour ainsi calculer itérativement le pageRank du réseau. Cette sous-partie gère de plus le traitement des arguments de la ligne de commande ainsi que la lecture et l’écriture des résultats dans des fichiers. \section{Structures de données} @@ -134,27 +134,27 @@ Voici l'ensemble des tests réalisés avec la commande time et valgrind sur l'or La commande suivante a été éxécutée pour élargir la taille maximale du stack: \begin{bashcode} -$ ulimit -s unlimited + $ ulimit -s unlimited \end{bashcode} Valgrind génère une sortie similaire à celle-ci pour l'ensemble des programmes: \begin{bashcode} -HEAP SUMMARY: + HEAP SUMMARY: in use at exit: 0 bytes in 0 blocks total heap usage: 22 allocs, 22 frees, 27,308 bytes allocated -All heap blocks were freed -- no leaks are possible + All heap blocks were freed -- no leaks are possible -ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) -ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) + ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) + ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) \end{bashcode} Comme le heap n’est pas utilisé par le programme (mis à part pour quelques variables dont nous n’avons pas le contrôle direct), sachant le PID du programme, nous pouvons naïvement inspecter le fichier suivant pour connaître la taille qu’occupe le programme dans le stack : \begin{bashcode} -$ build/pagerank fichiers_test/Exemple_sujet/exemple_sujet.net -n & \ - { while [[ -f /proc/$!/smaps ]]; do grep -A 1 stack /proc/$!/smaps >> stack.txt; done } ; \ - tail stack.txt + $ build/pagerank fichiers_test/Exemple_sujet/exemple_sujet.net -n & \ + { while [[ -f /proc/$!/smaps ]]; do grep -A 1 stack /proc/$!/smaps >> stack.txt; done } ; \ + tail stack.txt \end{bashcode} \newpage @@ -164,28 +164,28 @@ $ build/pagerank fichiers_test/Exemple_sujet/exemple_sujet.net -n & \ \subsubsection{exemple\_sujet.net} Stack size: 132 kB \begin{bashcode} -$ time build/pagerank fichiers_test/Exemple_sujet/exemple_sujet.net -n -real 0m0,009s -user 0m0,000s -sys 0m0,006s + $ time build/pagerank fichiers_test/Exemple_sujet/exemple_sujet.net -n + real 0m0,009s + user 0m0,000s + sys 0m0,006s \end{bashcode} \subsubsection{worm.net} Stack size: 1252 kB \begin{bashcode} -$ time build/pagerank fichiers_test/Worm/worm.net -n -real 0m0,073s -user 0m0,061s -sys 0m0,009s + $ time build/pagerank fichiers_test/Worm/worm.net -n + real 0m0,073s + user 0m0,061s + sys 0m0,009s \end{bashcode} \subsubsection{brainlinks.net} Stack size : 1570492 kB \begin{bashcode} -$ time build/pagerank fichiers_test/Brainlinks/brainlinks.net -n -real 2m41,387s -user 2m41,074s -sys 0m0,280s + $ time build/pagerank fichiers_test/Brainlinks/brainlinks.net -n + real 2m41,387s + user 2m41,074s + sys 0m0,280s \end{bashcode} \subsubsection{Linux26.net} @@ -197,19 +197,19 @@ On peut tout de même estimer son espace mémoire à au moins 650 Go. \subsubsection{exemple\_sujet.net} Stack size: 132 kB \begin{bashcode} -$ time build/pagerank fichiers_test/Exemple_sujet/exemple_sujet.net -real 0m0,168s -user 0m0,001s -sys 0m0,009s + $ time build/pagerank fichiers_test/Exemple_sujet/exemple_sujet.net + real 0m0,168s + user 0m0,001s + sys 0m0,009s \end{bashcode} \subsubsection{worm.net} Stack size: 132 kB \begin{bashcode} -$ time build/pagerank fichiers_test/Worm/worm.net -real 0m0,034s -user 0m0,016s -sys 0m0,004s + $ time build/pagerank fichiers_test/Worm/worm.net + real 0m0,034s + user 0m0,016s + sys 0m0,004s \end{bashcode} \newpage @@ -217,19 +217,19 @@ sys 0m0,004s \subsubsection{brainlinks.net} Stack size: 14748 kB \begin{bashcode} -$ time build/pagerank fichiers_test/Brainlinks/brainlinks.net -real 1m55,939s -user 1m55,909s -sys 0m0,012s + $ time build/pagerank fichiers_test/Brainlinks/brainlinks.net + real 1m55,939s + user 1m55,909s + sys 0m0,012s \end{bashcode} \subsubsection{Linux26.net} Stack size: 41152 kB \begin{bashcode} -$ time build/pagerank fichiers_test/Linux26/Linux26.net -real 437m38,234s -user 437m34,783s -sys 0m0,440s + $ time build/pagerank fichiers_test/Linux26/Linux26.net + real 437m38,234s + user 437m34,783s + sys 0m0,440s \end{bashcode} \section{Conclusion} @@ -238,7 +238,7 @@ Nos programmes ne génèrent aucune erreur selon Valgrind et s'exécutent pour c Les fichiers .org et .p qu’ils génèrent sont aussi pratiquement identiques à ceux fournis par l’énoncé. Il y a parfois quelques différences dans les fichiers .ord car certaines pages ont la même valeur de poids et parce que nous n'avons probablement pas utilisé le même algorithme de tri. De même les seules différences dans les fichiers .p sont dans les décimales après la précision donnée. -On remarque facilement la supériorité temporelle et spatiale de la version creuse contre la version naïve, surtout lorsque N et N\_links sont grands.  +On remarque facilement la supériorité temporelle et spatiale de la version creuse contre la version naïve, surtout lorsque N et N\_links sont grands. \subsection{Améliorations encore possible} @@ -250,18 +250,18 @@ Il serait aussi possible de rendre l’algorithme QuickSort générique mais nou Finalement une dernière amélioration possible est celle de supprimer network du scope lorsque nous n’en n’avons plus besoin. En effet , une fois le réseau créé à partir du fichier .net, nous le gardons jusqu’à la fin de l'exécution du programme. Cependant il est possible de s’en débarrasser après la création de G. -\section{Apports personnels} +\section{Apports personnels} Ce projet nous a permis de consolider nos connaissances sur les structures de données, car nous avons longuement réfléchi lesquelles étaient les plus adaptées au problème. De même, nous avons eu l’occasion de revoir plusieurs algorithmes classiques, nous permettant de mieux les maîtriser. Nous sommes tout de même déçus de ne pas avoir eu plus de temps à consacrer à l’optimisation du programme. \newpage \begin{thebibliography}{9} - \bibitem{wiki_pageRank} + \bibitem{wiki_pageRank} Wikipedia, PageRank \\ \href{https://en.wikipedia.org/wiki/PageRank}{https://en.wikipedia.org/wiki/PageRank} - - \bibitem{wiki_CSR} + + \bibitem{wiki_CSR} Wikipedia, Sparse matrix \\ \href{https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_(CSR,_CRS_or_Yale_format)}{https://en.wikipedia.org/wiki/Sparse\_matrix\#Compressed\_sparse\_row\_(CSR,\_CRS\_or\_Yale\_format)} diff --git a/livrables/sources.zip b/livrables/sources.zip deleted file mode 100644 index 3664f8477a1e1d41db9707846f118b3552d53db6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9532 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 TToVNN;~$8XYni1J-@N-j`=g