-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgraph.py
155 lines (119 loc) · 3.74 KB
/
graph.py
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import uuid
from abc import ABC, abstractmethod, ABCMeta
from typing import List, TypeVar, Generic, List, Dict, Tuple
class Vertex(metaclass=ABCMeta):
def __init__(self):
pass
@property
@abstractmethod
def uuid(self):
raise NotImplementedError
@property
@abstractmethod
def name(self):
raise NotImplementedError
class Edge(metaclass=ABCMeta):
def __init__(self, v1: Vertex, v2: Vertex):
pass
@property
@abstractmethod
def uuid(self):
raise NotImplementedError
@property
@abstractmethod
def vertices(self):
raise NotImplementedError
class VNode(Vertex):
def __init__(self, name: str, system_id: str):
super().__init__()
assert isinstance(name, str)
self._name = name
self._uuid = uuid.uuid4()
self._nsid = 0
self._system_id = system_id
def __repr__(self):
return f'<Name: {self._name}, SystemID: {self._system_id}>'
def __str__(self) -> str:
return f"{self._name} ({self.nsid})"
def __hash__(self) -> int:
return hash(self._uuid)
def __eq__(self, o: object) -> bool:
if isinstance(o, VNode):
return self._uuid == o.uuid and self._system_id == o._system_id
return False
@property
def uuid(self):
return self._uuid
@property
def name(self):
return self._name
@property
def nsid(self):
return self._nsid
@nsid.setter
def nsid(self, value: int):
assert isinstance(value, int)
self._nsid = value
@property
def system_id(self):
return self._system_id
@system_id.setter
def system_id(self, value: str):
assert isinstance(value, str)
self._system_id = value
@property
def nx_node(self):
return (self, {"nsid": self._nsid, "system_id": self._system_id})
class VEdge(Edge):
def __init__(self, v1: VNode, v2: VNode, adj_sid: int = 0):
super().__init__(v1, v2)
self._uuid = uuid.uuid4()
self._vertices = [v1, v2]
self.adj_sid = adj_sid
self._inf_name = "" # Optional, to record interface name.
self._nei_snpa = "" # Optional, needed in case of muliple point-to-point links between the same nodes.
def __str__(self):
return f'{self._vertices[0]} -> {self._vertices[1]}: {self.adj_sid}'
def __repr__(self):
return f'<Vertices: {[str(v) for v in self._vertices]}, UUID: {self._uuid}>'
@property
def uuid(self):
return self._uuid
@property
def vertices(self):
return self._vertices
@property
def nx_edge(self):
return (self._vertices[0], self._vertices[1],
{"adj_sid": self.adj_sid, "inf_name": self.inf_name,
"inf_mac": self.inf_mac, "nei_snpa": self.nei_snpa})
@property
def adj_sid(self):
return self._adj_sid
@adj_sid.setter
def adj_sid(self, value: int):
assert isinstance(value, int)
self._adj_sid = value
@property
def inf_name(self):
return self._inf_name
@inf_name.setter
def inf_name(self, value: str):
assert isinstance(value, str)
self._inf_name = value
@property
def nei_snpa(self):
return self._nei_snpa
@nei_snpa.setter
def nei_snpa(self, value: str):
assert isinstance(value, str)
self._nei_snpa = value
@property
def inf_mac(self):
return self._inf_mac
@inf_mac.setter
def inf_mac(self, value: str):
assert isinstance(value, str)
assert len(value) == 14
assert value.startswith('0x')
self._inf_mac = value