Skip to content
Extraits de code Groupes Projets
Valider d4a1970e rédigé par Louis Fourcade's avatar Louis Fourcade
Parcourir les fichiers

pagerank (marche moyen)

parent 9c977ea7
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Aucun aperçu pour ce type de fichier
...@@ -161,6 +161,7 @@ unsigned long compute_densest_core_ordering_prefix(adjlist *g, unsigned long *et ...@@ -161,6 +161,7 @@ unsigned long compute_densest_core_ordering_prefix(adjlist *g, unsigned long *et
} }
return max_prefix; return max_prefix;
} }
......
Aucun aperçu pour ce type de fichier
...@@ -33,12 +33,13 @@ void calc_in_deg(edgelist *g, unsigned long *in_res) { ...@@ -33,12 +33,13 @@ void calc_in_deg(edgelist *g, unsigned long *in_res) {
// fonction réalisant nb_iter itération de power pagerank // fonction réalisant nb_iter itération de power pagerank
// distr_res doit être malloc et de taille g->n // 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 i, j;
unsigned long *out_deg; unsigned long *out_deg;
long double *prob_t = distr_res;
long double *prob_t1; long double *prob_t1;
long double *swap_buffer; long double *swap_pointeur;
out_deg = (unsigned long*) malloc((g->n)*sizeof(unsigned long)); 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 ...@@ -49,7 +50,7 @@ int pagerank(edgelist *g, long double *distr_res, long double alpha, int nb_iter
// initialisation des probas // initialisation des probas
for (i = 0; i < g->n; i += 1) { 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 ...@@ -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é // itération sur les arêtes pour chaque quantité
for (j = 0; j < g->e; j += 1) { 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 // 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; return 0;
} }
...@@ -114,18 +139,20 @@ int main(int argc, char **argv) { ...@@ -114,18 +139,20 @@ int main(int argc, char **argv) {
// fonctions du TP3 // fonctions du TP3
long double *p_distrib; long double *p_distrib;
p_distrib = (long double*) malloc((g->n)*sizeof(long double)); 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; return 0;
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter