2fd853ad8bc4de78867a92c13112e2a6dbb7c5fe
[enwiki-links-graph.git] / links-outgoing-to-incoming.c
1 #include <assert.h>
2 #include <ctype.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <sys/types.h>
7
8
9 typedef __uint32_t art_id;
10
11
12 int main()
13 {
14         FILE *in_file;
15         FILE *out_file;
16
17         art_id titles;
18
19         art_id **linko;
20         art_id *linkos;
21
22         art_id **linki;
23         art_id *linkis;
24
25         art_id link_titles_done = 0;
26
27         art_id i;
28
29
30         /*
31          * Read all outgoing links into memory
32          */
33
34         in_file = fopen("links-outgoing.bin", "rb");
35
36         fread(&titles, sizeof(titles), 1, in_file);
37
38         linko = malloc(titles * sizeof(art_id*));
39         linkos = malloc(titles * sizeof(art_id));
40
41         for (i = 0; i < titles; i++) {
42                 art_id j;
43
44                 fread(&linkos[i], sizeof(linkos[i]), 1, in_file);
45
46                 linko[i] = malloc(linkos[i] * sizeof(linko[i][0]));
47
48                 for (j = 0; j < linkos[i]; j++) {
49                         fread(&linko[i][j], sizeof(linko[i][j]), 1, in_file);
50                 }
51         }
52         fclose(in_file);
53
54         printf("Outgoing links read.\n");
55
56
57
58         linki = malloc(titles * sizeof(art_id*));
59         linkis = malloc(titles * sizeof(art_id));
60
61         for (i = 0; i < titles; i++) {
62                 art_id j;
63
64                 for (j = 0; j < linkos[i]; j++) {
65                         art_id x = linko[i][j];
66
67                         linkis[x]++;
68                         linki[x] = realloc(linki[x], linkis[x] * sizeof(linki[x][0]));
69
70                         linki[x][linkis[x] - 1] = i;
71                 }
72         }
73
74         printf("Links turned upside down.\n");
75
76
77
78         out_file = fopen("links-incoming.bin", "wb");
79         fwrite(&titles, sizeof(titles), 1, out_file);
80         for (i = 0; i < titles; i++) {
81                 art_id j;
82
83                 fwrite(&linkis[i], sizeof(linkis[i]), 1, out_file);
84
85                 for (j = 0; j < linkis[i]; j++) {
86                         fwrite(&linki[i][j], sizeof(linki[i][j]), 1, out_file);
87                 }
88         }
89         fclose(out_file);
90
91         printf("Incoming links written.\n");
92 }