-
Notifications
You must be signed in to change notification settings - Fork 3
/
laplacian.cpp
98 lines (90 loc) · 3.04 KB
/
laplacian.cpp
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
#include "laplacian.h"
vector<double> getCSCMatrixDiagonal(CSCMat mat) {
vector<double> diagonal(mat.pCol.size()-1,0.0f);
/*sum values in rows*/
for(size_t i = 0; i < mat.iRow.size();i++) {
if(mat.val[i] != -1.0f) {
diagonal[mat.iRow[i]]+=mat.val[i];
}
}
/*sum values in columns*/
for(size_t i = 0; i < mat.pCol.size()-1;i++) {
for(int j = mat.pCol[i]; j < mat.pCol[i+1]; j++) {
if(mat.val[j] != -1.0f) {
diagonal[i]+=mat.val[j];
}
}
}
return diagonal;
}
CSCMat getCSCLaplacianMatrix(CSCMat mat) {
/*
Simple Laplacian Matrix Ls = D - A
*/
CSCMat laplacian = mat;
vector<double> diagonal = getCSCMatrixDiagonal(laplacian);
int counter = 0;
for(size_t i = 0; i < laplacian.val.size(); i++) {
if(laplacian.val[i] == -1.0) {
laplacian.val[i] = diagonal[counter];
counter++;
} else {
laplacian.val[i] *= -1.0;
}
}
return laplacian;
}
CSCMat getCSCLaplacianSym(CSCMat mat) {
/*
Normalized symetrical laplacian matrix L sym = I - D^-1/2 * A * D^-1/2
*/
printf("Creating normalized symetric laplacian matrix L sym = I - D^-1/2 * A * D^-1/2...");
CSCMat laplacian = mat;
vector<double> diagonal = getCSCMatrixDiagonal(laplacian);
int curCol = 0;
int nextColStartInd = laplacian.pCol[curCol+1];
for(size_t i = 0; i < laplacian.val.size(); i++) {
if(nextColStartInd == i) {
curCol++;
nextColStartInd = laplacian.pCol[curCol+1];
}
if(laplacian.val[i] == -1.0) {
laplacian.val[i] = 1.0;
} else {
double val = -1.0* laplacian.val[i] / (sqrt(diagonal[laplacian.iRow[i]]*diagonal[curCol]));
//printf("i %d val %f (d1 %f d2 %f) = res %f\n",i,laplacian.val[i],sqrt(diagonal[laplacian.iRow[i]]),sqrt(diagonal[curCol]),val);
laplacian.val[i] *= (-1.0 / (sqrt(diagonal[laplacian.iRow[i]])*sqrt(diagonal[curCol])));
}
}
printf("[OK]\n");
return laplacian;
}
CSCMat getCSCLaplacianRW(CSCMat aff_mat) {
/*
IN PROGRESS NOT SYMETRICAL
Normalized symetrical laplacian matrix L rw = I - D^-1/2 * A
*/
printf("Creating normalized symetric laplacian matrix L RW = D^-1 * L");
CSCMat laplacian = aff_mat;
vector<double> diagonal = getCSCMatrixDiagonal(laplacian);
int last_ind = -1;
int row_ind = 0;
for(size_t i = 0; i < laplacian.val.size(); i++) {
/*if(laplacian.rowInd[i] < last_ind) {
row_ptr++;
}
last_ind = laplacian.pCol[i];
if(laplacian.val[i] == -1.0) {
laplacian.val[i] = 1.0;
} else {
printf("%d, %f / %f\n",row_ptr, laplacian.val[i],diagonal[row_ptr]);
laplacian.val[i] = laplacian.val[i] / diagonal[row_ptr];
}*/
if(laplacian.val[i] == -1.0) {
laplacian.val[i] = 1.0;
} else {
laplacian.val[i] = -1.0 * laplacian.val[i] / diagonal[laplacian.iRow[i]];
}
}
return laplacian;
}