diff --git a/TP2 b/TP2 index 7842f9c515ab9445446ce256f5dce16a12d3a8f6..8c90ef31e5334fcce47f26e929f863d6d82585a1 100755 Binary files a/TP2 and b/TP2 differ diff --git a/TP2.c b/TP2.c index 9785637e9155e068c9d57fc8f1d40911637e1f3b..dc4d9d9f027517eed19b938995c19e0f65678aae 100644 --- a/TP2.c +++ b/TP2.c @@ -161,6 +161,7 @@ unsigned long compute_densest_core_ordering_prefix(adjlist *g, unsigned long *et + } return max_prefix; } diff --git a/TP3 b/TP3 index 272b1556eb400a4ce954769f1625d4a440252984..2c865c5723dcb9cea539ca0d5767943ff098fea6 100755 Binary files a/TP3 and b/TP3 differ diff --git a/TP3.c b/TP3.c index e8f863157e7eb6f57a5d5d2483af166eefd1b81c..60d9de8990f1e1e461a47c5649a92a003a4193fb 100644 --- a/TP3.c +++ b/TP3.c @@ -33,12 +33,13 @@ void calc_in_deg(edgelist *g, unsigned long *in_res) { // fonction réalisant nb_iter itération de power pagerank // distr_res doit être malloc et de taille g->n -int pagerank(edgelist *g, long double *distr_res, long double alpha, int nb_iter) { +int pagerank(edgelist *g, long double *distr_res, long double alpha, unsigned long nb_iter) { unsigned long i, j; unsigned long *out_deg; + long double *prob_t = distr_res; long double *prob_t1; - long double *swap_buffer; + long double *swap_pointeur; out_deg = (unsigned long*) malloc((g->n)*sizeof(unsigned long)); @@ -49,7 +50,7 @@ int pagerank(edgelist *g, long double *distr_res, long double alpha, int nb_iter // initialisation des probas for (i = 0; i < g->n; i += 1) { - distr_res[i] = 1./((long double) (g->n)); + prob_t[i] = 1./((long double) (g->n)); } @@ -65,16 +66,40 @@ int pagerank(edgelist *g, long double *distr_res, long double alpha, int nb_iter // itération sur les arêtes pour chaque quantité for (j = 0; j < g->e; j += 1) { - prob_t1[g->edges[j].t] += (1 - alpha)*(distr_res[g->edges[j].s]/out_deg[g->edges[j].s]); + prob_t1[g->edges[j].t] += (1 - alpha)*(prob_t[g->edges[j].s]/out_deg[g->edges[j].s]); } // ajout du poids alpha en plus - for (j = 0; j < g->n; j +=1) {} - } + for (j = 0; j < g->n; j +=1) { + prob_t1[j] += alpha*(1./((long double) (g->n))); + } + // renormalisation du vecteur + long double v = 0; + for (j = 0; j < g->n; j += 1) { + v += prob_t1[j]; + } + v = (1-v)/((long double) (g->n)); + for (j = 0; j < g->n; j += 1) { + prob_t1[j] += v; + } + // échange des pointeurs pour prochaine itération + swap_pointeur = prob_t; + prob_t = prob_t1; + prob_t1 = swap_pointeur; + } + // si nombre impair d'itération, copie du résultat final dans le bon tableau + if (nb_iter%2 == 1 || nb_iter == 0) { + for (i = 0; i < g->n; i += 1) { + distr_res[i] = prob_t[i]; + } + } + + free(prob_t1); + free(out_deg); return 0; } @@ -114,18 +139,20 @@ int main(int argc, char **argv) { - - - // fonctions du TP3 long double *p_distrib; p_distrib = (long double*) malloc((g->n)*sizeof(long double)); - pagerank(g, p_distrib, 0.5, 4); + pagerank(g, p_distrib, 0.001, 200); - printf("test %f = %Lf\n", (1./548552.), p_distrib[0]); + long double last = p_distrib[0]; + for(int i =0; i < g->n; i +=1) { + if (last != p_distrib[i]) { + printf("|%Le|\n", p_distrib[i]); + } + } return 0;