Add final state from 2018-10-07
[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
7
8
9 int main()
10 {
11         FILE *in_file;
12         FILE *out_file;
13
14         size_t titles;
15
16         size_t **linko;
17         size_t *linkos;
18
19         size_t **linki;
20         size_t *linkis;
21
22         size_t link_titles_done = 0;
23
24         size_t i;
25
26
27         /*
28          * Read all outgoing links into memory
29          */
30
31         in_file = fopen("links-outgoing.bin", "rb");
32
33         fread(&titles, sizeof(titles), 1, in_file);
34
35         linko = malloc(titles * sizeof(size_t*));
36         linkos = malloc(titles * sizeof(size_t));
37
38         for (i = 0; i < titles; i++) {
39                 size_t j;
40
41                 fread(&linkos[i], sizeof(linkos[i]), 1, in_file);
42
43                 linko[i] = malloc(linkos[i] * sizeof(linko[i][0]));
44
45                 for (j = 0; j < linkos[i]; j++) {
46                         fread(&linko[i][j], sizeof(linko[i][j]), 1, in_file);
47                 }
48         }
49         fclose(in_file);
50
51         printf("Outgoing links read.\n");
52
53
54
55         linki = malloc(titles * sizeof(size_t*));
56         linkis = malloc(titles * sizeof(size_t));
57
58         for (i = 0; i < titles; i++) {
59                 size_t j;
60
61                 for (j = 0; j < linkos[i]; j++) {
62                         size_t x = linko[i][j];
63
64                         linkis[x]++;
65                         linki[x] = realloc(linki[x], linkis[x] * sizeof(linki[x][0]));
66
67                         linki[x][linkis[x] - 1] = i;
68                 }
69         }
70
71         printf("Links turned upside down.\n");
72
73
74
75         out_file = fopen("links-incoming.bin", "wb");
76         fwrite(&titles, sizeof(titles), 1, out_file);
77         for (i = 0; i < titles; i++) {
78                 size_t j;
79
80                 fwrite(&linkis[i], sizeof(linkis[i]), 1, out_file);
81
82                 for (j = 0; j < linkis[i]; j++) {
83                         fwrite(&linki[i][j], sizeof(linki[i][j]), 1, out_file);
84                 }
85         }
86         fclose(out_file);
87
88         printf("Incoming links written.\n");
89 }