From 2b20817839068865b304d485de8bacdae29ec1a0 Mon Sep 17 00:00:00 2001 From: lfainsin Date: Sat, 5 Dec 2020 15:20:01 +0000 Subject: [PATCH] brouillon de pageRank.adb git-svn-id: http://cregut.svn.enseeiht.fr/2020/1sn/pim/projets/GH-05@207224 e13453a9-b01f-0410-a051-f404c4f0c485 --- src/pageRank.adb | 111 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/src/pageRank.adb b/src/pageRank.adb index 3ef9c33..afe3ca1 100644 --- a/src/pageRank.adb +++ b/src/pageRank.adb @@ -1,7 +1,116 @@ +with SDA_Exceptions; use SDA_Exceptions; +with Ada.Text_IO; use Ada.Text_IO; +with Ada.Command_Line; use Ada.Command_Line; +with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; +with googleNaive; + procedure pageRank is + ERROR_args: Exception; + + procedure getArgs(filename: in out Unbounded_String; + iteMAX: in out Natural; + alpha: in out Float; + naif: in out Boolean) is + i: Natural := 0; + begin + -- on vérifie d'abord que le nombre d'arguments est cohérent + if not(0 < Argument_Count <= 6) then -- verif si double inégalité possible + raise ERROR_args; + else + loop + -- put(Argument(i)); + if Argument(i) = "-P" then + naif := True; + i := i + 1; + elsif Argument(i) = "-A" then + alpha := Float'Value(Argument(i+1)); + i := i + 2; + elsif Argument(i) = "-I" then + iteMAX := Natural'Value(Argument(i+1)); -- verif si les conversions sont bonnes + i := i + 2; + elsif Argument(i)(Argument(i)'Last-4 .. Argument(i)'Last) = ".net" then -- verif les indexs + filename := To_Unbounded_String(Argument(i)(Argument(i)'First .. Argument(i)'Last-5)); + i := i + 1; + else + raise ERROR_args; + end if; + exit when i > Argument_Count; + end loop; + end if; + exception + -- s'il y a un problème on arrête l'exectution et on affiche l'usage. + when others => + put_line("Erreur lors de la saisi de la commande"); + put_line("Usage: pagerank [-I max_iterations] [-A alpha] [-P] fichier_reseau.net"); + end getArgs; + + procedure createG_naive(G: in out T_Google) is + File : Ada.Text_IO.File_Type; + N: Natural; + H, S: T_Google; + row, col: Natural; + + function rowSum(row: T_Row) return Natural is + s: Natural := 0; + begin + for r in row loop + s := s + r; + end loop; + return s; + end rowSum; + begin + open(File, In_File, filename & ".net"); + get(File, N); -- on récupère le nombre de pages + + -- on créé H + while not end_of_File(File) loop + get(File, row); + get(File, col); + insert(H, row, col, 1.0); + end loop; + + -- on créé S + -- TODO: simplifier tout ça avec l'opérateur "/" sur T_row + for row in H loop + p = rowSum(row); + for j in row loop + if p = 0 then + row(j) := 1/N; + else + if row(j) /= 0 then + row(j) := 1/p; + end if; + end if; + end loop; + end loop; + + G := S*alpha + ones(N, N)*(1-alpha)/N; + + end createG_naive; + + filename: Unbounded_String; + iteMAX: Natural := 150; + naif: Boolean := False; + alpha: Float := 0.85; + + epsilon: Float := 0.01; + pi: T_Google; + G: T_Google; + N: Positive; + begin - -- TODO + getArgs(filename, alpha, iteMAX, naif); + + initialize(pi, 1, N); + initialize(G, N, N); + createG_naive(G); + + for i in 1..N loop + pi := pi * G; + end loop; + + -- write2file(filename, pi); à implémenter end pageRank; \ No newline at end of file