-
Notifications
You must be signed in to change notification settings - Fork 0
/
Node.cpp
98 lines (79 loc) · 2.37 KB
/
Node.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
//Graph Node
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include "TrieTable.cpp"
using namespace std;
double qTime1 = 0, qTime2 = 0;
struct Edge{
int destId;
int startTime;
Edge(){
destId = -1;
startTime = -1;
}
Edge(int isDestId, int isStartTime){
destId = isDestId;
startTime = isStartTime;
}
};
struct Node{
int nodeId;
TrieTable *t;
vector<Edge*> presentEdges;
Node(){
nodeId = 0;
t = new TrieTable();
}
Node(int isNodeId){
nodeId = isNodeId;
t = new TrieTable();
}
int getIndexOfEdge(int destId){
for (int i = 0; i< presentEdges.size(); i++)
if (presentEdges[i]->destId == destId) return i;
return -1;
}
void addEdge(int destId, int timestep, int numLevels){
presentEdges.push_back(new Edge(destId, timestep));
//t->addEdge(destId, timestep, sizeof(int)*8);
}
int removeEdge(int destId, int timestep, int numLevels){
int edgeIndex = getIndexOfEdge(destId);
if (edgeIndex == -1) return; //no such edge found
int startTime = presentEdges[edgeIndex]->startTime;
int endTime = timestep;
int numBits = getCommonLabel(startTime, endTime);
t->addEdge(destId, startTime, numBits);
presentEdges.erase(presentEdges.begin() + edgeIndex);
return startTime;
}
void trieHeightIncrease(int timestep, int numLevels){
int numPresentEdges = presentEdges.size();
int *pE = (int*)malloc(sizeof(int)*numPresentEdges);
for (int i = 0; i < numPresentEdges; i++) pE[i] = presentEdges[i]->destId;
t->traverseRightmostPath(timestep, numLevels, pE, numPresentEdges);
free(pE);
}
int randomNeighbor(int label, int numBits, int startTime, int endTime){
struct timespec start, finish;
int presentSample = -1;
int numPresentEdges = 0;
// clock_gettime(CLOCK_MONOTONIC, &start);
for (int i = 0; i < presentEdges.size(); i++){
if (presentEdges[i]->startTime <= endTime){
numPresentEdges += 1;
int z = rand() % numPresentEdges;
if (z == 0) presentSample = presentEdges[i]->destId;
}
}
// clock_gettime(CLOCK_MONOTONIC, &finish);
// qTime1 += (finish.tv_sec - start.tv_sec) + (finish.tv_nsec - start.tv_nsec)/pow(10,9);
// clock_gettime(CLOCK_MONOTONIC, &start);
int rN = t->randomNeighbor(startTime, endTime, presentSample, numPresentEdges);
// clock_gettime(CLOCK_MONOTONIC, &finish);
// qTime2 += (finish.tv_sec - start.tv_sec) + (finish.tv_nsec - start.tv_nsec)/pow(10,9);
return rN;
}
};