|
@@ -0,0 +1,102 @@ |
|
|
|
|
|
#!/usr/bin/env python3 |
|
|
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
|
|
""" |
|
|
|
|
|
Created on Wed Apr 22 11:31:26 2020 |
|
|
|
|
|
|
|
|
|
|
|
@author: ljia |
|
|
|
|
|
""" |
|
|
|
|
|
import numpy as np |
|
|
|
|
|
from gklearn.utils import dummy_node, undefined_node |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NodeMap(object): |
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, num_nodes_g, num_nodes_h): |
|
|
|
|
|
self.__forward_map = [undefined_node()] * num_nodes_g |
|
|
|
|
|
self.__backward_map = [undefined_node()] * num_nodes_h |
|
|
|
|
|
self.__induced_cost = np.inf |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def clear(self): |
|
|
|
|
|
""" |
|
|
|
|
|
/*! |
|
|
|
|
|
* @brief Clears the node map. |
|
|
|
|
|
*/ |
|
|
|
|
|
""" |
|
|
|
|
|
self.__forward_map = [undefined_node() for i in range(len(self.__forward_map))] |
|
|
|
|
|
self.__backward_map = [undefined_node() for i in range(len(self.__backward_map))] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def num_source_nodes(self): |
|
|
|
|
|
return len(self.__forward_map) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def num_target_nodes(self): |
|
|
|
|
|
return len(self.__backward_map) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def image(self, node): |
|
|
|
|
|
if node < len(self.__forward_map): |
|
|
|
|
|
return self.__forward_map[node] |
|
|
|
|
|
else: |
|
|
|
|
|
raise Exception('The node with ID ', str(node), ' is not contained in the source nodes of the node map.') |
|
|
|
|
|
return undefined_node() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def pre_image(self, node): |
|
|
|
|
|
if node < len(self.__backward_map): |
|
|
|
|
|
return self.__backward_map[node] |
|
|
|
|
|
else: |
|
|
|
|
|
raise Exception('The node with ID ', str(node), ' is not contained in the target nodes of the node map.') |
|
|
|
|
|
return undefined_node() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 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 set_induced_cost(self, induced_cost): |
|
|
|
|
|
self.__induced_cost = induced_cost |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def induced_cost(self): |
|
|
|
|
|
return self.__induced_cost |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
|
def forward_map(self): |
|
|
|
|
|
return self.__forward_map |
|
|
|
|
|
|
|
|
|
|
|
@forward_map.setter |
|
|
|
|
|
def forward_map(self, value): |
|
|
|
|
|
self.__forward_map = value |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property |
|
|
|
|
|
def backward_map(self): |
|
|
|
|
|
return self.__backward_map |
|
|
|
|
|
|
|
|
|
|
|
@backward_map.setter |
|
|
|
|
|
def backward_map(self, value): |
|
|
|
|
|
self.__backward_map = value |