-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpage_graph.py
169 lines (131 loc) · 4.42 KB
/
page_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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
"""
Author: Marko Njegomir sw-38-2018
"""
class Vertex(object):
def __init__(self, index, page_num, content):
self._index = index
self._page_num = page_num
self._content = content
self._word_positions = {}
self._word_ranks = {}
def get_index(self):
return self._index
def get_page_num(self):
return self._page_num
def get_content(self):
return self._content
def get_word_ranks(self):
return self._word_ranks
def set_word_rank(self, word, value):
self._word_ranks[word] = value
def get_word_rank(self, word):
if word in self._word_ranks:
return self._word_ranks[word]
def set_word_ranks(self, new_rank):
self._word_ranks = new_rank
def add_word_position(self, word, position):
if word in self._word_positions:
self._word_positions[word].append(position)
return
self._word_positions[word] = [position]
def get_all_word_positions(self):
return self._word_positions
def get_word_positions(self, word):
if word in self._word_positions:
return self._word_positions[word]
def __str__(self):
return "Page with index " + str(self._index)
def __hash__(self):
return hash(self._index)
def __eq__(self, other):
return self.__class__ == other.__class__ and self._index == other.get_index()
class Edge(object):
def __init__(self, dest, sorc, value=None):
self._value = value
self._destination = dest
self._source = sorc
def get_source(self):
return self._source
def get_destination(self):
return self._destination
def get_value(self):
return self._value
def __str__(self):
return str((str(self._source), str(self._destination)))
class Graph(object):
def __init__(self, directed=False):
self._out = {}
self._in = {}
self._directed = directed
def get_out(self):
return self._out
def get_in(self):
return self._in
def insert_vertex(self, index, page_num, content):
v = Vertex(index, page_num, content)
self._out[v] = []
self._in[v] = []
return v
def insert_edge(self, source, dest, elem=None):
edge = Edge(source, dest, elem)
oposite = Edge(dest, source, elem)
if self._directed:
self._out[source].append(edge)
self._in[dest].append(edge)
else:
self._out[source].append(edge)
self._out[dest].append(oposite)
self._in[source].append(oposite)
self._in[dest].append(edge)
def vertex_count(self):
return len(self._in)
def vertices(self):
if self._directed:
vertices = {}
for vertex in self._out.keys():
vertices[vertex] = vertex
for vertex in self._in.keys():
vertices[vertex] = vertex
return vertices
else:
return self._out.keys()
def get_vertex(self, vertex_index):
vertices = self.vertices()
if vertex_index in vertices:
return vertices[vertex_index]
def get_vertex_by_page_num(self, page_num):
vertices = self.vertices()
for vertex in vertices:
if vertices[vertex].get_page_num() == page_num:
return vertices[vertex]
def edges(self):
ret_val = []
for veze in self._out.values():
ret_val.extend(veze)
return ret_val
def degree(self, vertex, out=True):
if out:
return len(self._out[vertex])
return len(self._in[vertex])
def incident_edges(self, vertex, out=True):
if out:
return self._out[vertex]
return self._in[vertex]
def remove_vertex(self, vertex):
izlazne = self._out[vertex]
self._out.pop(vertex)
ulazne = self._in[vertex]
self._in.pop(vertex)
for veza in izlazne:
self._in[veza[1]].pop(veza)
for veza in ulazne:
self._out[veza[1]].pop(veza)
def remove_edge(self, edge):
self._out[edge.get_source()].pop(edge)
self._in[edge.get_destination()].pop(edge)
def get_edge(self, source, destination):
lista_veza = self._out[source]
for edge in lista_veza:
if edge.get_destination == destination:
return edge
return None