class SentenceGraph(): def __init__(self, sentence, directed=False, graph=None): # Create a SentenceGraph from an existing graph tool graph if graph is not None: self.sentence_graph = graph return # Create a new SentenceGraph from scratch self.sentence_graph = Graph(directed=directed) # Graph properties sentence_property = self.sentence_graph.new_graph_property("string", sentence) self.sentence_graph.graph_properties[SENTENCE_KEY] = sentence_property # Vertex properties word_property = self.sentence_graph.new_vertex_property("string") part_of_speech_property = self.sentence_graph.new_vertex_property("string") vertex_color_property = self.sentence_graph.new_vertex_property("vector<double>") self.sentence_graph.vertex_properties[WORD_KEY] = word_property self.sentence_graph.vertex_properties[PART_OF_SPEECH_KEY] = part_of_speech_property self.sentence_graph.vertex_properties[VERTEX_COLOR_KEY] = vertex_color_property # Edge properties sentence_edge_property = self.sentence_graph.new_edge_property("string") definition_edge_property = self.sentence_graph.new_edge_property("string") parsed_dependencies_edge_property = self.sentence_graph.new_edge_property("string") inter_sentence_edge_property = self.sentence_graph.new_edge_property("string") edge_color_property = self.sentence_graph.new_edge_property("vector<double>") dependency_edge_property = self.sentence_graph.new_edge_property("string") self.sentence_graph.edge_properties[SENTENCE_EDGE_KEY] = sentence_edge_property self.sentence_graph.edge_properties[DEFINITION_EDGE_KEY] = definition_edge_property self.sentence_graph.edge_properties[PARSED_DEPENDENCIES_EDGE_KEY] = parsed_dependencies_edge_property self.sentence_graph.edge_properties[INTER_SENTENCE_EDGE_KEY] = inter_sentence_edge_property self.sentence_graph.edge_properties[EDGE_COLOR_KEY] = edge_color_property self.sentence_graph.edge_properties[PARSE_TREE_DEPENDENCY_VALUE_KEY] = dependency_edge_property # Edge filter properties definition_edge_filter_property = self.sentence_graph.new_edge_property("bool") inter_sentence_edge_filter_property = self.sentence_graph.new_edge_property("bool") parsed_dependencies_edge_filter_property = self.sentence_graph.new_edge_property("bool") sentence_edge_filter_property = self.sentence_graph.new_edge_property("bool") self.sentence_graph.edge_properties[FILTER_DEFINITION_EDGE_KEY] = definition_edge_filter_property self.sentence_graph.edge_properties[FILTER_INTER_SENTENCE_EDGE_KEY] = inter_sentence_edge_filter_property self.sentence_graph.edge_properties[FILTER_PARSED_DEPENDENCIES_EDGE_KEY] = parsed_dependencies_edge_filter_property self.sentence_graph.edge_properties[FILTER_SENTENCE_EDGE_KEY] = sentence_edge_filter_property def get_sentence(self): return self.sentence_graph.graph_properties[SENTENCE_KEY] def add_vertex(self, word, pos): word_pos_tuple = (word, pos) # Create vertex, set properties word_vertex = self.sentence_graph.add_vertex() self.sentence_graph.vertex_properties[WORD_KEY][word_vertex] = word self.sentence_graph.vertex_properties[PART_OF_SPEECH_KEY][word_vertex] = pos self.sentence_graph.vertex_properties[VERTEX_COLOR_KEY][word_vertex] = [0, 0, 1, 1] return word_vertex def set_vertex_color_from_word(self, word, pos, color=[1, 0, 0, 1]): word_vertex = self.get_vertex(word, pos) return self.set_vertex_color(word_vertex, color) def set_vertex_color(self, vertex, color=[1, 0, 0, 1]): self.sentence_graph.vertex_properties[VERTEX_COLOR_KEY][vertex] = color def set_vertices_color(self, vertices, color=[1, 0, 0, 1]): for vertex in vertices: self.set_vertex_color(vertex, color) def add_sentence_edge_from_words(self, word1, pos1, word2, pos2): return self.add_sentence_edge(self.get_vertex(word1, pos1), self.get_vertex(word2, pos2)) def add_sentence_edge(self, word_vertex1, word_vertex2): sentence_edge = self.sentence_graph.add_edge(word_vertex1, word_vertex2, add_missing=False) self.sentence_graph.edge_properties[SENTENCE_EDGE_KEY][sentence_edge] = sentence_edge # Green self.sentence_graph.edge_properties[EDGE_COLOR_KEY][sentence_edge] = [0.2, 1, 0.2, 1] self._set_edge_to_zero_in_all_filters(sentence_edge) self.sentence_graph.edge_properties[FILTER_SENTENCE_EDGE_KEY][sentence_edge] = True return sentence_edge def add_sentence_edges(self, sentence_vertices): for i in range(1, len(sentence_vertices)): self.add_sentence_edge(sentence_vertices[i - 1], sentence_vertices[i]) def add_parsed_dependency_edge(self, word_vertex1, word_vertex2, dependency_relationship): parsed_dependency_edge = self.sentence_graph.add_edge(word_vertex1, word_vertex2, add_missing=False) self.sentence_graph.edge_properties[PARSED_DEPENDENCIES_EDGE_KEY][parsed_dependency_edge] = parsed_dependency_edge self.sentence_graph.edge_properties[PARSE_TREE_DEPENDENCY_VALUE_KEY][parsed_dependency_edge] = dependency_relationship # Blue self.sentence_graph.edge_properties[EDGE_COLOR_KEY][parsed_dependency_edge] = [0, 0, 1, 1] self._set_edge_to_zero_in_all_filters(parsed_dependency_edge) self.sentence_graph.edge_properties[FILTER_PARSED_DEPENDENCIES_EDGE_KEY][parsed_dependency_edge] = True return parsed_dependency_edge def add_parsed_dependency_edge_from_words(self, word1, pos1, word2, pos2, dependency_relationship): return self.add_parsed_dependency_edge( self.get_vertex(word1, pos1), self.get_vertex(word2, pos2), dependency_relationship) def add_definition_edge_from_words(self, word, pos, definition_word, definition_pos): return self.add_definition_edge( self.get_vertex(word, pos), self.get_vertex(definition_word, definition_pos)) def _set_edge_to_zero_in_all_filters(self, edge): self.sentence_graph.edge_properties[FILTER_DEFINITION_EDGE_KEY][edge] = False self.sentence_graph.edge_properties[FILTER_INTER_SENTENCE_EDGE_KEY][edge] = False self.sentence_graph.edge_properties[FILTER_PARSED_DEPENDENCIES_EDGE_KEY][edge] = False self.sentence_graph.edge_properties[FILTER_SENTENCE_EDGE_KEY][edge] = False def add_definition_edge(self, word_vertex, definition_word_vertex): definition_edge = self.sentence_graph.add_edge(word_vertex, definition_word_vertex, add_missing=False) self.sentence_graph.edge_properties[DEFINITION_EDGE_KEY][definition_edge] = definition_edge # Red self.sentence_graph.edge_properties[EDGE_COLOR_KEY][definition_edge] = [1, 0.1, 0.1, 1] self._set_edge_to_zero_in_all_filters(definition_edge) self.sentence_graph.edge_properties[FILTER_DEFINITION_EDGE_KEY][definition_edge] = True return definition_edge def add_definition_edges(self, word_vertex, definition_word_vertices): # Add edges from the word_vertex to all definition vertices and set # the definition edge property on each edge for definition_word_vertex in definition_word_vertices: self.add_definition_edge(word_vertex, definition_word_vertex) return self def add_inter_sentence_edge(self, sentence1_word_vertex, sentence2_word_vertex): inter_sentence_edge = self.sentence_graph.add_edge(sentence1_word_vertex, sentence2_word_vertex, add_missing=False) self.sentence_graph.edge_properties[INTER_SENTENCE_EDGE_KEY][inter_sentence_edge] = inter_sentence_edge # Pink self.sentence_graph.edge_properties[EDGE_COLOR_KEY][inter_sentence_edge] = [1, 0.05, 1, 1] self._set_edge_to_zero_in_all_filters(inter_sentence_edge) self.sentence_graph.edge_properties[FILTER_INTER_SENTENCE_EDGE_KEY][inter_sentence_edge] = True return inter_sentence_edge def add_inter_sentence_edge_from_words(self, word1, pos1, word2, pos2): return self.add_inter_sentence_edge( self.get_vertex(word1, pos1), self.get_vertex(word2, pos2)) def remove_vertex_by_word(self, word, pos): self.remove_vertex(self.get_vertex(word, pos)) def remove_vertex(self, vertex): word = self.sentence_graph.vertex_properties[WORD_KEY][vertex] pos = self.sentence_graph.vertex_properties[PART_OF_SPEECH_KEY][vertex] self.sentence_graph.remove_vertex(vertex) def remove_edge(self, word1, pos1, word2, pos2): self.sentence_graph.remove_edge(self.get_edge(word1, pos1, word2, pos2)) def contains(self, word, pos): return self.get_vertex(word, pos) is not None def get_vertex(self, word, pos): for vertex in self.sentence_graph.vertices(): try: vertex_word = self.sentence_graph.vertex_properties[WORD_KEY][vertex] vertex_pos = self.sentence_graph.vertex_properties[PART_OF_SPEECH_KEY][vertex] if vertex_word == word and vertex_pos == pos: return vertex except: pass return None def get_word_pos_tuple(self, vertex): return self.sentence_graph.vertex_properties[WORD_KEY][vertex],\ self.sentence_graph.vertex_properties[PART_OF_SPEECH_KEY][vertex] def get_word_pos_tuple_by_index(self, index): return self.get_word_pos_tuple(self.get_vertex_by_index(index)) def get_vertex_by_index(self, index): return self.sentence_graph.vertex(index) def get_vertices_iterator(self): return self.sentence_graph.vertices() def get_vertices(self): return [x for x in self.sentence_graph.vertices()] def get_vertex_out_neighbor_word_pos_tuples(self, vertex): return [self.get_word_pos_tuple(neighbor_vertex) for neighbor_vertex in self.get_vertex_out_neighbors(vertex)] def get_vertex_in_neighbor_word_pos_tuples(self, vertex): return [self.get_word_pos_tuple(neighbor_vertex) for neighbor_vertex in self.get_vertex_in_neighbors(vertex)] def get_vertex_out_neighbors(self, vertex): return [neighbor_vertex for neighbor_vertex in vertex.out_neighbours()] def get_vertex_in_neighbors(self, vertex): return [neighbor_vertex for neighbor_vertex in vertex.in_neighbours()] def get_word_pos_tuples(self): return [self.get_word_pos_tuple(v) for v in self.sentence_graph.vertices()] def get_num_vertices(self): return self.sentence_graph.num_vertices() def get_num_edges(self): return self.sentence_graph.num_edges() def get_edge(self, word1, pos1, word2, pos2): vertex_1 = self.get_vertex(word1, pos1) vertex_2 = self.get_vertex(word2, pos2) return None\ if vertex_1 is None or vertex_2 is None\ else self.sentence_graph.edge(vertex_1, vertex_2) def get_edges_iterator(self): return self.sentence_graph.edges() def get_edges(self): return [x for x in self.sentence_graph.edges()] def set_definition_edge_filter(self, inverted=False): self.sentence_graph.set_edge_filter( self.sentence_graph.edge_properties[FILTER_DEFINITION_EDGE_KEY], inverted=inverted) def set_inter_sentence_edge_filter(self, inverted=False): self.sentence_graph.set_edge_filter( self.sentence_graph.edge_properties[FILTER_INTER_SENTENCE_EDGE_KEY], inverted=inverted) def set_parsed_dependency_edge_filter(self, inverted=False): self.sentence_edge.set_edge_filter( self.sentence_graph.edge_properties[FILTER_PARSED_DEPENDENCIES_EDGE_KEY], inverted=inverted) def set_sentence_edge_filter(self, inverted=False): self.sentence_graph.set_edge_filter( self.sentence_graph.edge_properties[FILTER_SENTENCE_EDGE_KEY], inverted=inverted) def clear_filters(self): self.sentence_graph.clear_filters() def get_definition_edges(self): return filter(lambda x: x in self.get_definition_edge_properties(), self.get_edges()) def get_word_vertex_properties(self): return self.sentence_graph.vertex_properties[WORD_KEY] def get_pos_vertex_properties(self): return self.sentence_graph.vertex_properties[PART_OF_SPEECH_KEY] def get_color_vertex_properties(self): return self.sentence_graph.vertex_properties[VERTEX_COLOR_KEY] def get_sentence_edge_properties(self): return self.sentence_graph.edge_properties[SENTENCE_EDGE_KEY] def get_definition_edge_properties(self): return self.sentence_graph.edge_properties[DEFINITION_EDGE_KEY] def get_inter_sentence_edge_properties(self): return self.sentence_graph.edge_properties[INTER_SENTENCE_EDGE_KEY] def get_color_edge_properties(self): return self.sentence_graph.edge_properties[EDGE_COLOR_KEY] def get_vertex_index(self, vertex): return self.sentence_graph.vertex_index[vertex] def get_degree_properties(self, degree_type): return self.sentence_graph.degree_property_map(degree_type) def get_graph(self): return self.sentence_graph def copy(self): return SentenceGraph( sentence=self.sentence_graph.graph_properties[SENTENCE_KEY], graph=self.sentence_graph.copy())
class Network: def __init__(self): self.g = Graph(directed=True) self.player_id_to_vertex = {} self.pairs = {} # player pair: edge # property maps for additional information self.g.vertex_properties['player_id'] = self.g.new_vertex_property( "string") self.g.vertex_properties['player_coords'] = self.g.new_vertex_property( "vector<float>") self.g.vertex_properties[ 'average_player_coords'] = self.g.new_vertex_property( "vector<float>") self.g.vertex_properties[ 'player_n_coords'] = self.g.new_vertex_property("int") self.g.edge_properties['weight'] = self.g.new_edge_property("float") @property def edge_weights(self): return self.g.edge_properties['weight'] @property def player_id_pmap(self): return self.g.vertex_properties['player_id'] @property def player_coords_pmap(self): return self.g.vertex_properties['player_coords'] @property def player_n_coords_pmap(self): return self.g.vertex_properties['player_n_coords'] @property def average_player_coords_pmap(self): # lazy evaluation of means for v in self.g.vertices(): self.g.vertex_properties['average_player_coords'][v] = np.asarray( self.player_coords_pmap[v]) / self.player_n_coords_pmap[v] return self.g.vertex_properties['average_player_coords'] def add_players(self, pids: List[str]): n = len(pids) vs = list(self.g.add_vertex(n)) self.player_id_to_vertex.update({pids[i]: vs[i] for i in range(n)}) for i in range(n): self.player_id_pmap[vs[i]] = pids[i] return vs def add_passes(self, id_pairs: List[Tuple], coords_pairs: List[Tuple], pass_scores=None): pairs = [(self.player_id_to_vertex[i1], self.player_id_to_vertex[i2]) for i1, i2 in id_pairs] # append player coordinates n = len(coords_pairs) if pass_scores is None: pass_scores = [1 for _ in range(n)] for i in range(n): # remember orig and dest location # orig player coords = self.player_coords_pmap[pairs[i][0]] if len(coords) == 0: coords = np.asarray([coords_pairs[i][0], coords_pairs[i][1]]) else: # accumulate coords += np.asarray([coords_pairs[i][0], coords_pairs[i][1]]) self.player_coords_pmap[pairs[i][0]] = coords self.player_n_coords_pmap[pairs[i][0]] += 1 # dest player coords = self.player_coords_pmap[pairs[i][1]] if len(coords) == 0: coords = np.asarray([coords_pairs[i][2], coords_pairs[i][3]]) else: # accumulate coords += np.asarray([coords_pairs[i][2], coords_pairs[i][3]]) self.player_coords_pmap[pairs[i][1]] = coords self.player_n_coords_pmap[pairs[i][1]] += 1 # if the edge exists, increment its weight instead of creating a new edge e = self.pairs.get(pairs[i]) if e is not None: self.edge_weights[e] += pass_scores[i] else: e = self.g.add_edge(*pairs[i]) self.pairs[pairs[i]] = e self.edge_weights[e] = pass_scores[i] def cleanup(self): """remove isolated vertices""" to_remove = [] for v in self.g.vertices(): if v.in_degree() + v.out_degree() == 0: to_remove.append(v) n = len(to_remove) self.g.remove_vertex(to_remove, fast=True) print("Removed {0} isolated vertices".format(n)) def save(self, file: str): self.g.save(file, fmt='graphml')
print("graph builded") degr = [] for v in pairs_graph_m.vertices(): degr.append((v, v.out_degree())) degr = sorted(degr, key=itemgetter(1)) fout = open('deg_sort_m.txt', 'w', encoding='utf-8') for tup in degr: fout.write(ver_names[tup[0]] + ' ' + str(tup[1]) + '\n') # find min subset of words conected to all others vol = len(word_dict) print(vol) cur = 0 fout = open('dominators1.txt', 'w', encoding='utf-8') while cur <= vol: v = max(degr, key=itemgetter(1))[0] fout.write(ver_names[v] + '\n') cur += v.out_degree() print(cur) print(ver_names[v]) for u in v.out_neighbours(): for e in u.out_edges(): if e.target() in v.out_neighbours(): pairs_graph_m.remove_edge(e) pairs_graph_m.remove_vertex(v) degr = [] for v in pairs_graph_m.vertices(): degr.append((v, v.out_degree()))