diff --git a/TP2.c b/TP2.c index dc4d9d9f027517eed19b938995c19e0f65678aae..36ae093d160c3a8aad9f395f40bb97f8c545221b 100644 --- a/TP2.c +++ b/TP2.c @@ -217,6 +217,7 @@ int main(int argc, char **argv) { printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60)); + // printf("- Overall time = %I64dh%I64dm%I64ds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60)); printf("core value du graphe : %i\n", max_c_val(c, g->n)); // calcul du densest prefix graph @@ -227,7 +228,9 @@ int main(int argc, char **argv) { indix_densest = compute_densest_core_ordering_prefix(g, eta, &densest_cop_av_deg_dens, &densest_cop_edge_dens); t2=time(NULL); printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60)); + // printf("- Overall time = %I64dh%I64dm%I64ds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60)); printf("densest core prefix :\n\taverage degre density : %Lf\n\tedge density : %Lf\n\tsize : %lu\n", densest_cop_av_deg_dens, densest_cop_edge_dens, indix_densest+1); + // printf("densest core prefix :\n\taverage degre density : %f\n\tedge density : %f\n\tsize : %lu\n", (double) densest_cop_av_deg_dens, (double) densest_cop_edge_dens, indix_densest+1); free_adjlist(g); diff --git a/TP4.c b/TP4.c index 1f027e76f3acfa623426dfcfe4afb9b1bc59c26e..cb9ebe38f9c9c32f89a9a4d180c386ed5e4f974b 100644 --- a/TP4.c +++ b/TP4.c @@ -1,71 +1,291 @@ #include "./implems.c" #include <stdio.h> #include <stdlib.h> +#include <time.h> -// génère un entier aléatoire entre min et max inclue -int randint_from(int min, int max) +// génère un nombre aléatoire sur 4 octets +unsigned long randlu() { - int range = (max - min); - return min + (rand() % (range + 1)); + unsigned long res = 0; + unsigned long tmp1 = rand() & 0x0F; + unsigned long tmp2 = rand() & 0x0F; + unsigned long tmp3 = rand() & 0x0F; + unsigned long tmp4 = rand() & 0x0F; + + tmp2 = tmp2 << 8; + tmp3 = tmp3 << 16; + tmp4 = tmp4 << 24; + + res = res | tmp1; + res = res | tmp2; + res = res | tmp3; + res = res | tmp4; + + return res; } +// génère un nombre aléatoire sur 4 octets entre min et max inclue +unsigned long randlu_from(unsigned long min, unsigned long max) +{ + unsigned long range = (max - min); + return min + (randlu() % (range + 1)); +} -void Fisher_Yates(int *tab, int size) { - int tmp; - int rdm; - for (int i = size-1; i > 0; i--) +void Fisher_Yates(unsigned long *tab, unsigned long size) +{ + unsigned long tmp; + unsigned long rdm; + for (unsigned long i = size - 1; i > 0; i--) { - rdm = randint_from(0, i); + rdm = randlu_from(0, i); tmp = tab[i]; tab[i] = tab[rdm]; tab[rdm] = tmp; } } +int ajuste_label(adjlist *g, unsigned long *label, unsigned long *label_count, unsigned long node) +{ + for (unsigned long i = 0; i < g->n; i++) + { + label_count[i] = 0; + } + for (unsigned long i = g->cd[node]; i < g->cd[node + 1]; i++) + { + label_count[label[g->adj[i]]]++; + } + unsigned long nb = 1; + unsigned long best = label_count[0]; + for (unsigned long i = 1; i < g->n; i++) + { + if (label_count[i] > best) + { + best = label_count[i]; + nb = 1; + } + else if (label_count[i] == best) + { + nb++; + } + } -int main(int argc, char **argv) { - if (argc < 2) { - printf("un argument est attendu\n"); - return 1; + if (label_count[label[node]] == best) + { + return 0; + } + + unsigned long chosen = randlu_from(1, nb); + unsigned long i = 0; + + while (i < g->n && chosen > 0) + { + if (label_count[i] == best) + { + chosen--; + if (chosen == 0) + { + label[node] = label[i]; + i = g->n; + } + } + i++; + } + if (chosen != 0) + { + printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n"); } + return 1; +} +unsigned long *label_propagation(adjlist *g) +{ + unsigned long *ordre = (unsigned long *)malloc(sizeof(unsigned long) * g->n); + unsigned long *label = (unsigned long *)malloc(sizeof(unsigned long) * g->n); + unsigned long *label_count = (unsigned long *)malloc(sizeof(unsigned long) * g->n); + + for (unsigned long i = 0; i < g->n; i++) + { + ordre[i] = i; + label[i] = i; + } + + int in_progress = 1; + + while (in_progress) + { + in_progress = 0; + Fisher_Yates(ordre, g->n); + for (unsigned long i = 0; i < g->n; i++) + { + in_progress = in_progress | ajuste_label(g, label, label_count, ordre[i]); + } + } + + free(ordre); + free(label_count); + return label; +} + +void aff_tab(unsigned long *t, int size) +{ + for (int i = 0; i < size; i++) + { + printf("%li ", t[i]); + } + printf("\n"); +} + +// ----------------------------------------------------------------------------------------------------------------------------------------- + +void simplifie_label(unsigned long *label, unsigned long size) +{ + unsigned long c = 0; + unsigned long smallest = size; + unsigned long in_progress = 1; + while (in_progress) + { + in_progress = 0; + smallest = size; + for (unsigned long i = 0; i < size; i++) + { + if (label[i] >= c && label[i] < smallest) + { + smallest = label[i]; + in_progress = 1; + } + } + for (unsigned long i = 0; i < size; i++) + { + if (label[i] == smallest) + { + label[i] = c; + } + } + c++; + } +} + +void output_graphe(adjlist *g, unsigned long *label, char *filename) +{ + FILE *ptr; + unsigned long tmp_nb_node; + + tmp_nb_node = g->n; + + ptr = fopen(filename, "w"); + + //définition des noeuds + fprintf(ptr, "graph D {\n"); + //noeuds + for (unsigned long k = 0; k < tmp_nb_node; k++) + { + fprintf(ptr, "%li [", k); + switch (label[k]) + { + case 0: + fprintf(ptr, "color=red"); + break; + case 1: + fprintf(ptr, "color=blue"); + break; + case 2: + fprintf(ptr, "color=green"); + break; + case 3: + fprintf(ptr, "color=yellow"); + break; + case 4: + fprintf(ptr, "color=black"); + break; + case 5: + fprintf(ptr, "color=brown"); + break; + case 6: + fprintf(ptr, "color=orange"); + break; + case 7: + fprintf(ptr, "color=grey"); + break; + case 8: + fprintf(ptr, "color=magenta"); + break; + case 9: + fprintf(ptr, "color=aqua"); + break; + case 10: + fprintf(ptr, "color=lime"); + break; + + default: + fprintf(ptr, "color=white"); + break; + } + + fprintf(ptr, "]\n"); + } + + for (unsigned long k = 0; k < tmp_nb_node; k++) + { + for (unsigned long i = g->cd[k]; i < g->cd[k + 1]; i++) + { + if (g->adj[i] > k) + { + fprintf(ptr, "%li -- %li\n", k, g->adj[i]); + } + } + } + fprintf(ptr, "}"); + fclose(ptr); + return; +} + +// ----------------------------------------------------------------------------------------------------------------------------------------- + +int main(int argc, char **argv) +{ + if (argc < 2) + { + printf("un argument est attendu\n"); + return 1; + } adjlist *g; time_t t1, t2, t3; // PARSING - t1=time(NULL); + t1 = time(NULL); - printf("Reading edgelist from file %s\n",argv[1]); - g=al_readedgelist(argv[1]); + printf("Reading edgelist from file %s\n", argv[1]); + g = al_readedgelist(argv[1]); t3 = time(NULL); - // printf("- edge list time = %ldh%ldm%lds\n",(t3-t1)/3600,((t3-t1)%3600)/60,((t3-t1)%60)); - printf("- edge list time = %I64dh%I64dm%I64ds\n",(t3-t1)/3600,((t3-t1)%3600)/60,((t3-t1)%60)); + printf("- edge list time = %ldh%ldm%lds\n",(t3-t1)/3600,((t3-t1)%3600)/60,((t3-t1)%60)); + // printf("- edge list time = %I64dh%I64dm%I64ds\n", (t3 - t1) / 3600, ((t3 - t1) % 3600) / 60, ((t3 - t1) % 60)); - printf("Number of nodes: %lu\n",g->n); - printf("Number of edges: %lu\n",g->e); + printf("Number of nodes: %lu\n", g->n); + printf("Number of edges: %lu\n", g->e); printf("Building the adjacency list\n"); mkadjlist(g); - t2=time(NULL); + t2 = time(NULL); + + printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60)); + // printf("- Overall time = %I64dh%I64dm%I64ds\n", (t2 - t1) / 3600, ((t2 - t1) % 3600) / 60, ((t2 - t1) % 60)); - // printf("- Overall time = %ldh%ldm%lds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60)); - printf("- Overall time = %I64dh%I64dm%I64ds\n",(t2-t1)/3600,((t2-t1)%3600)/60,((t2-t1)%60)); + srand(time(NULL)); - unsigned long a = 1; + unsigned long *res = label_propagation(g); - printf("%lu %lu %lu %i %li\n", sizeof(int), sizeof(unsigned long), sizeof(unsigned long long), RAND_MAX, a); - // printf("%I64i %I64i %I64i %i %li\n", sizeof(int), sizeof(unsigned long), sizeof(unsigned long long), RAND_MAX, a); + simplifie_label(res, g->n); + output_graphe(g, res, "toto.dot"); + printf("run {dot -Tpng -o out.png toto.dot} pour avoir une visualisation de la solution\n"); free_adjlist(g); return 0; } - -