def add_assignment(self, i, k): if i != dummy_node(): if i < len(self.__forward_map): self.__forward_map[i] = k else: raise Exception('The node with ID ', str(i), ' is not contained in the source nodes of the node map.') if k != dummy_node(): if k < len(self.__backward_map): self.__backward_map[k] = i else: raise Exception('The node with ID ', str(k), ' is not contained in the target nodes of the node map.')
def construct_node_map_from_solver(solver, node_map, solution_id): node_map.clear() num_nodes_g = node_map.num_source_nodes() num_nodes_h = node_map.num_target_nodes() # add deletions and substitutions for row in range(0, num_nodes_g): col = solver.get_assigned_col(row, solution_id) if col >= num_nodes_h: node_map.add_assignment(row, dummy_node()) else: node_map.add_assignment(row, col) # insertions. for col in range(0, num_nodes_h): if solver.get_assigned_row(col, solution_id) >= num_nodes_g: node_map.add_assignment(dummy_node(), col)
def as_relation(self, relation): relation.clear() for i in range(0, len(self._forward_map)): k = self._forward_map[i] if k != undefined_node(): relation.append(tuple((i, k))) for k in range(0, len(self._backward_map)): i = self._backward_map[k] if i == dummy_node(): relation.append(tuple((i, k)))
def compute_induced_cost(self, g, h, node_map): """ /*! * @brief Computes the edit cost between two graphs induced by a node map. * @param[in] g Input graph. * @param[in] h Input graph. * @param[in,out] node_map Node map whose induced edit cost is to be computed. */ """ cost = 0 # collect node costs for node in g.nodes(): image = node_map.image(node) label2 = (SpecialLabel.DUMMY if image == dummy_node() else h.nodes[image]['label']) cost += self.node_cost(g.nodes[node]['label'], label2) for node in h.nodes(): pre_image = node_map.pre_image(node) if pre_image == dummy_node(): cost += self.node_cost(SpecialLabel.DUMMY, h.nodes[node]['label']) # collect edge costs for (n1, n2) in g.edges(): image1 = node_map.image(n1) image2 = node_map.image(n2) label2 = (h.edges[(image2, image1)]['label'] if h.has_edge( image2, image1) else SpecialLabel.DUMMY) cost += self.edge_cost(g.edges[(n1, n2)]['label'], label2) for (n1, n2) in h.edges(): if not g.has_edge(node_map.pre_image(n2), node_map.pre_image(n1)): cost += self.edge_cost(SpecialLabel.DUMMY, h.edges[(n1, n2)]['label']) node_map.set_induced_cost(cost)