-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathganalyze.h
97 lines (86 loc) · 2.22 KB
/
ganalyze.h
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
#ifndef GANALYZE_H
#define GANALYZE_H
#include "head.h"
class Ganalyze
{
vector< vector<double> > vec;
// constructor
public:
Ganalyze() {}
Ganalyze(Graph g)
{
for (int i = 0; i < MAXN; i++)
{
vec.push_back(vector<double>(g.n, 0));
}
}
private:
// 计算累积和
inline void CalculateSum(Graph g, int idx)
{
for (int i = 0; i < g.n; i++)
{
double probSum = 0;
for (int j = 0; j < g.gT[i].size(); j++)
{
int adj_vert = g.gT[i][j];
probSum += (g.probT[i][j] * vec[idx - 1][adj_vert]);
}
vec[idx][i] = probSum;
}
}
// function
public:
// 分析Graph中的传播概率随着跳数的变化
void AnalyzeProb(Graph g)
{
double start, finish;
start = clock();
for (int i = 0; i < g.n; i++)
{
double probSum = 0;
for (int j = 0; j < g.gT[i].size(); j++)
{
probSum += g.probT[i][j];
}
vec[0][i] = probSum;
}
for (int i = 1; i < MAXN - 1; i++)
{
CalculateSum(g, i);
}
finish = clock();
cout << "totoal time: " << (finish - start) / CLOCKS_PER_SEC << "s" << endl;
for (int i = 0; i < g.n; i++)
{
vec[MAXN - 1][i] = 0;
for (int j = 0; j < MAXN - 1; j++)
{
vec[MAXN - 1][i] += vec[j][i];
}
}
}
// 采样 LIMIT 个结点输出 MAXN-1 跳的结果
void SampleNode(Graph g)
{
int snode; // sample node
srand((unsigned int)time(NULL));
for (int i = 0; i < LIMIT; i++)
{
// 舍弃累积和为0的结点, 重新选择
while (true)
{
snode = rand() % (g.n);
if (vec[MAXN - 1][snode] != 0)
break;
}
cout << snode << ": " << vec[MAXN - 1][snode] << " ";
for (int j = 0; j < MAXN - 1; j++)
{
cout << vec[j][snode] / vec[MAXN - 1][snode] << " ";
}
cout << endl;
}
}
};
#endif