-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgraph.py
More file actions
56 lines (46 loc) · 1.73 KB
/
graph.py
File metadata and controls
56 lines (46 loc) · 1.73 KB
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
import numpy as np
from queue import PriorityQueue
class Graph:
def __init__(self, num_verts, edges, vert_feats, edge_feats):
self.vertN = num_verts
self.validateEdges(edges)
self.edges = edges
self.vert_feats = vert_feats
self.edge_feats = edge_feats
self.w, self.v = np.linalg.eigh(self.getLaplacian())
def validateEdges(self, edges):
for e1, e2 in edges:
if not self.isValidEdge(e1, e2):
raise ValueError("Invalid edge endpoints provided: " + str(e1) + ", " + str(e2) + ".")
def isValidEdge(self, e1, e2):
return e1 in range(1, self.vertN+1) and e2 in range(1, self.vertN+1)
def addEdge(self, e1, e2):
self.validateEdges([(e1, e2)])
self.edges += [(e1, e2)]
def getDegrees(self):
d = [0 for _ in range(self.vertN)]
for i, (e1, e2) in enumerate(self.edges):
d[e1-1] += self.edge_feats[i]
d[e2-1] += self.edge_feats[i]
return d
def getAdjacencyMatrix(self):
a = np.zeros((self.vertN, self.vertN))
for i, (e1, e2) in enumerate(self.edges):
a[e1-1][e2-1] = self.edge_feats[i]
a[e2-1][e1-1] = self.edge_feats[i]
return a
def getLaplacian(self):
return np.diag(self.getDegrees()) - self.getAdjacencyMatrix()
def generateRandom(N=10, p=0.5):
e = []
r = np.random.random((N*(N-1))//2)
c = 0
for i in range(1,N+1):
for j in range(i+1, N+1):
if r[c] > p:
e += [(i,j)]
c += 1
return Graph(N, e, [0 for _ in range(N)], [1 for _ in e])
def hasSixRing(self):
for i in self.vertN:
return True