-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNetSimilarity.cpp
85 lines (75 loc) · 2.31 KB
/
NetSimilarity.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
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector compute_shared_userbase_similarity(NumericMatrix A, NumericMatrix E, int size, NumericVector selection, NumericVector userbase) {
// Inizializza la matrice dei pesi
std::vector<std::vector<double>*>* W = new std::vector<std::vector<double>*>();
for(int i=0; i<size; i++){
W->push_back(new std::vector<double>());
for(int j=0; j<size; j++){
W->at(i)->push_back(0);
}
}
// calcolo della matrice dei pesi
for(int i=0; i<E.nrow(); i++){
W->at((int)E(i,0)-1)->at((int)E(i,1)-1) = E(i,2);
}
// calcolo della lista di adiacenza
std::vector<std::vector<double>*>* AL = new std::vector<std::vector<double>*>();
for(int i=0; i<size; i++){
AL->push_back(new std::vector<double>());
for(int j=0;j<size; j++){
if(A(i,j)==1){
AL->at(i)->push_back(j);
}
}
}
// algoritmo BFS-based
NumericVector out(size);
for(int s:selection){
int iter = 0;
NumericVector flow(size);
NumericVector considered(size);
NumericVector queued(size);
std::vector<int> Q = std::vector<int>();
std::vector<int> next_Q = std::vector<int>();
// init
flow[s] = userbase[s];
considered[s] = 1;
queued[s] = 1;
Q.push_back(s);
while(Q.size() > 0){
int source = Q.back();
Q.pop_back();
for(int destination:*(AL->at(source))){
if(!considered[destination]){
flow[destination] += flow[source]*(W->at(source)->at(destination)/userbase[source])/(pow(10,iter));
if(!queued[destination]){
next_Q.push_back(destination);
queued[destination] = 1;
}
}
}
// prossimo livello di profondità
if(Q.size() == 0){
iter++;
while(next_Q.size() > 0){
Q.push_back(next_Q.back());
considered[next_Q.back()] = 1;
next_Q.pop_back();
}
}
}
// salva il flusso
for(int i=0; i<size;i++){
out[i] += flow[i];
}
}
for(int i=0; i<size; i++)
delete(W->at(i));
delete(W);
for(int i=0; i<size; i++)
delete(AL->at(i));
delete(AL);
return out;
}