Exemple #1
0
	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.')
Exemple #2
0
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)
Exemple #3
0
 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)