-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsequential.c
100 lines (86 loc) · 2.57 KB
/
sequential.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <stdlib.h>
int* p1(int* indices, int n){
int* result = malloc(sizeof(int)*n);
for(int i = 0; i < n; i ++){
result[i] = indices[i+1] - indices[i];
}
return result;
}
int** p2_3(int* p1, int* c3, int* indices, int* data, int n){
int* result1 = calloc(sizeof(int),n);
int* result2 = calloc(sizeof(int),n);
int** result = malloc(sizeof(int*)*2);
for(int i = 0; i < n; i++){
for(int j = indices[i]; j < indices[i+1]; j++){
result1[i] += p1[data[j]];
}
result1[i]-=(p1[i]+2*c3[i]);
result2[i] = p1[i]*(p1[i]-1)/2-c3[i];
}
result[0] = result1;
result[1] = result2;
return result;
}
int* c3(int* indices, int n, int* data){
int col;
int* result = calloc(sizeof(int),n);
for(int i = 0; i < n; i++){//All nodes
int start_i = indices[i];
int end_i = indices[i+1];
int width_i = end_i-start_i;
for(int j = start_i; j < end_i; j++){//CSC
col = data[j];
int start_j = indices[col];
int width_j = indices[col+1] - start_j;
int idx_i = 0;
int idx_j = 0;
//printf("%d %d\n",width_i,width_j);
while(idx_i<width_i&&idx_j<width_j)//matrix mult
{
if(data[start_i+idx_i]==data[start_j+idx_j]){
result[i]++;
idx_i++;
idx_j++;
continue;
}
if(data[start_i+idx_i]>data[start_j+idx_j]){
idx_j++;
continue;
}
else{
idx_i++;
}
}
}
result[i] = result[i]/2;
}
return result;
}
int main(int argc, char const *argv[])
{
FILE* ind;
int num_ind;
ind = fopen("indices.txt","r");
fscanf(ind,"%d\n",&num_ind);
int* indices = malloc(sizeof(int)*num_ind);
for(int i = 0; i < num_ind; i++){
fscanf(ind,"%d\n",&indices[i]);
}
int num_data;
ind = fopen("data.txt","r");
fscanf(ind,"%d\n",&num_data);
int* data = malloc(sizeof(int)*num_data);
for(int i = 0; i < num_data; i++){
fscanf(ind,"%d\n",&data[i]);
}
int n = num_ind-1;
printf("Finding Nodes' degree...\n");
int* k = p1(indices,n);
printf("Nodes' degree found, Calculating 3-cliques...\n");
int* m = c3(indices,n,data);
printf("3-cliques found, Calculating 2-paths and biforks...\n");
int** l = p2_3(k,m,indices,data,n);
printf("All Done\n");
return 0;
}