| @@ -28,16 +28,16 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| def __init__(self, **kwargs): | def __init__(self, **kwargs): | ||||
| GraphKernel.__init__(self) | GraphKernel.__init__(self) | ||||
| self.__node_labels = kwargs.get('node_labels', []) | |||||
| self.__edge_labels = kwargs.get('edge_labels', []) | |||||
| self.__depth = int(kwargs.get('depth', 10)) | |||||
| self.__k_func = kwargs.get('k_func', 'MinMax') | |||||
| self.__compute_method = kwargs.get('compute_method', 'trie') | |||||
| self.__ds_infos = kwargs.get('ds_infos', {}) | |||||
| self._node_labels = kwargs.get('node_labels', []) | |||||
| self._edge_labels = kwargs.get('edge_labels', []) | |||||
| self._depth = int(kwargs.get('depth', 10)) | |||||
| self._k_func = kwargs.get('k_func', 'MinMax') | |||||
| self._compute_method = kwargs.get('compute_method', 'trie') | |||||
| self._ds_infos = kwargs.get('ds_infos', {}) | |||||
| def _compute_gm_series(self): | def _compute_gm_series(self): | ||||
| self.__add_dummy_labels(self._graphs) | |||||
| self._add_dummy_labels(self._graphs) | |||||
| from itertools import combinations_with_replacement | from itertools import combinations_with_replacement | ||||
| itr_kernel = combinations_with_replacement(range(0, len(self._graphs)), 2) | itr_kernel = combinations_with_replacement(range(0, len(self._graphs)), 2) | ||||
| @@ -50,16 +50,16 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| gram_matrix = np.zeros((len(self._graphs), len(self._graphs))) | gram_matrix = np.zeros((len(self._graphs), len(self._graphs))) | ||||
| if self.__compute_method == 'trie': | |||||
| all_paths = [self.__find_all_path_as_trie(self._graphs[i]) for i in iterator_ps] | |||||
| if self._compute_method == 'trie': | |||||
| all_paths = [self._find_all_path_as_trie(self._graphs[i]) for i in iterator_ps] | |||||
| for i, j in iterator_kernel: | for i, j in iterator_kernel: | ||||
| kernel = self.__kernel_do_trie(all_paths[i], all_paths[j]) | |||||
| kernel = self._kernel_do_trie(all_paths[i], all_paths[j]) | |||||
| gram_matrix[i][j] = kernel | gram_matrix[i][j] = kernel | ||||
| gram_matrix[j][i] = kernel | gram_matrix[j][i] = kernel | ||||
| else: | else: | ||||
| all_paths = [self.__find_all_paths_until_length(self._graphs[i]) for i in iterator_ps] | |||||
| all_paths = [self._find_all_paths_until_length(self._graphs[i]) for i in iterator_ps] | |||||
| for i, j in iterator_kernel: | for i, j in iterator_kernel: | ||||
| kernel = self.__kernel_do_naive(all_paths[i], all_paths[j]) | |||||
| kernel = self._kernel_do_naive(all_paths[i], all_paths[j]) | |||||
| gram_matrix[i][j] = kernel | gram_matrix[i][j] = kernel | ||||
| gram_matrix[j][i] = kernel | gram_matrix[j][i] = kernel | ||||
| @@ -67,7 +67,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| def _compute_gm_imap_unordered(self): | def _compute_gm_imap_unordered(self): | ||||
| self.__add_dummy_labels(self._graphs) | |||||
| self._add_dummy_labels(self._graphs) | |||||
| # get all paths of all graphs before computing kernels to save time, | # get all paths of all graphs before computing kernels to save time, | ||||
| # but this may cost a lot of memory for large datasets. | # but this may cost a lot of memory for large datasets. | ||||
| @@ -78,9 +78,9 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| else: | else: | ||||
| chunksize = 100 | chunksize = 100 | ||||
| all_paths = [[] for _ in range(len(self._graphs))] | all_paths = [[] for _ in range(len(self._graphs))] | ||||
| if self.__compute_method == 'trie' and self.__k_func is not None: | |||||
| if self._compute_method == 'trie' and self._k_func is not None: | |||||
| get_ps_fun = self._wrapper_find_all_path_as_trie | get_ps_fun = self._wrapper_find_all_path_as_trie | ||||
| elif self.__compute_method != 'trie' and self.__k_func is not None: | |||||
| elif self._compute_method != 'trie' and self._k_func is not None: | |||||
| get_ps_fun = partial(self._wrapper_find_all_paths_until_length, True) | get_ps_fun = partial(self._wrapper_find_all_paths_until_length, True) | ||||
| else: | else: | ||||
| get_ps_fun = partial(self._wrapper_find_all_paths_until_length, False) | get_ps_fun = partial(self._wrapper_find_all_paths_until_length, False) | ||||
| @@ -97,12 +97,12 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| # compute Gram matrix. | # compute Gram matrix. | ||||
| gram_matrix = np.zeros((len(self._graphs), len(self._graphs))) | gram_matrix = np.zeros((len(self._graphs), len(self._graphs))) | ||||
| if self.__compute_method == 'trie' and self.__k_func is not None: | |||||
| if self._compute_method == 'trie' and self._k_func is not None: | |||||
| def init_worker(trie_toshare): | def init_worker(trie_toshare): | ||||
| global G_trie | global G_trie | ||||
| G_trie = trie_toshare | G_trie = trie_toshare | ||||
| do_fun = self._wrapper_kernel_do_trie | do_fun = self._wrapper_kernel_do_trie | ||||
| elif self.__compute_method != 'trie' and self.__k_func is not None: | |||||
| elif self._compute_method != 'trie' and self._k_func is not None: | |||||
| def init_worker(plist_toshare): | def init_worker(plist_toshare): | ||||
| global G_plist | global G_plist | ||||
| G_plist = plist_toshare | G_plist = plist_toshare | ||||
| @@ -111,7 +111,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| def init_worker(plist_toshare): | def init_worker(plist_toshare): | ||||
| global G_plist | global G_plist | ||||
| G_plist = plist_toshare | G_plist = plist_toshare | ||||
| do_fun = self.__wrapper_kernel_do_kernelless # @todo: what is this? | |||||
| do_fun = self._wrapper_kernel_do_kernelless # @todo: what is this? | |||||
| parallel_gm(do_fun, gram_matrix, self._graphs, init_worker=init_worker, | parallel_gm(do_fun, gram_matrix, self._graphs, init_worker=init_worker, | ||||
| glbv=(all_paths,), n_jobs=self._n_jobs, verbose=self._verbose) | glbv=(all_paths,), n_jobs=self._n_jobs, verbose=self._verbose) | ||||
| @@ -119,7 +119,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| def _compute_kernel_list_series(self, g1, g_list): | def _compute_kernel_list_series(self, g1, g_list): | ||||
| self.__add_dummy_labels(g_list + [g1]) | |||||
| self._add_dummy_labels(g_list + [g1]) | |||||
| if self._verbose >= 2: | if self._verbose >= 2: | ||||
| iterator_ps = tqdm(g_list, desc='getting paths', file=sys.stdout) | iterator_ps = tqdm(g_list, desc='getting paths', file=sys.stdout) | ||||
| @@ -130,24 +130,24 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| kernel_list = [None] * len(g_list) | kernel_list = [None] * len(g_list) | ||||
| if self.__compute_method == 'trie': | |||||
| paths_g1 = self.__find_all_path_as_trie(g1) | |||||
| paths_g_list = [self.__find_all_path_as_trie(g) for g in iterator_ps] | |||||
| if self._compute_method == 'trie': | |||||
| paths_g1 = self._find_all_path_as_trie(g1) | |||||
| paths_g_list = [self._find_all_path_as_trie(g) for g in iterator_ps] | |||||
| for i in iterator_kernel: | for i in iterator_kernel: | ||||
| kernel = self.__kernel_do_trie(paths_g1, paths_g_list[i]) | |||||
| kernel = self._kernel_do_trie(paths_g1, paths_g_list[i]) | |||||
| kernel_list[i] = kernel | kernel_list[i] = kernel | ||||
| else: | else: | ||||
| paths_g1 = self.__find_all_paths_until_length(g1) | |||||
| paths_g_list = [self.__find_all_paths_until_length(g) for g in iterator_ps] | |||||
| paths_g1 = self._find_all_paths_until_length(g1) | |||||
| paths_g_list = [self._find_all_paths_until_length(g) for g in iterator_ps] | |||||
| for i in iterator_kernel: | for i in iterator_kernel: | ||||
| kernel = self.__kernel_do_naive(paths_g1, paths_g_list[i]) | |||||
| kernel = self._kernel_do_naive(paths_g1, paths_g_list[i]) | |||||
| kernel_list[i] = kernel | kernel_list[i] = kernel | ||||
| return kernel_list | return kernel_list | ||||
| def _compute_kernel_list_imap_unordered(self, g1, g_list): | def _compute_kernel_list_imap_unordered(self, g1, g_list): | ||||
| self.__add_dummy_labels(g_list + [g1]) | |||||
| self._add_dummy_labels(g_list + [g1]) | |||||
| # get all paths of all graphs before computing kernels to save time, | # get all paths of all graphs before computing kernels to save time, | ||||
| # but this may cost a lot of memory for large datasets. | # but this may cost a lot of memory for large datasets. | ||||
| @@ -158,14 +158,14 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| else: | else: | ||||
| chunksize = 100 | chunksize = 100 | ||||
| paths_g_list = [[] for _ in range(len(g_list))] | paths_g_list = [[] for _ in range(len(g_list))] | ||||
| if self.__compute_method == 'trie' and self.__k_func is not None: | |||||
| paths_g1 = self.__find_all_path_as_trie(g1) | |||||
| if self._compute_method == 'trie' and self._k_func is not None: | |||||
| paths_g1 = self._find_all_path_as_trie(g1) | |||||
| get_ps_fun = self._wrapper_find_all_path_as_trie | get_ps_fun = self._wrapper_find_all_path_as_trie | ||||
| elif self.__compute_method != 'trie' and self.__k_func is not None: | |||||
| paths_g1 = self.__find_all_paths_until_length(g1) | |||||
| elif self._compute_method != 'trie' and self._k_func is not None: | |||||
| paths_g1 = self._find_all_paths_until_length(g1) | |||||
| get_ps_fun = partial(self._wrapper_find_all_paths_until_length, True) | get_ps_fun = partial(self._wrapper_find_all_paths_until_length, True) | ||||
| else: | else: | ||||
| paths_g1 = self.__find_all_paths_until_length(g1) | |||||
| paths_g1 = self._find_all_paths_until_length(g1) | |||||
| get_ps_fun = partial(self._wrapper_find_all_paths_until_length, False) | get_ps_fun = partial(self._wrapper_find_all_paths_until_length, False) | ||||
| if self._verbose >= 2: | if self._verbose >= 2: | ||||
| iterator = tqdm(pool.imap_unordered(get_ps_fun, itr, chunksize), | iterator = tqdm(pool.imap_unordered(get_ps_fun, itr, chunksize), | ||||
| @@ -196,28 +196,28 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| def _wrapper_kernel_list_do(self, itr): | def _wrapper_kernel_list_do(self, itr): | ||||
| if self.__compute_method == 'trie' and self.__k_func is not None: | |||||
| return itr, self.__kernel_do_trie(G_p1, G_plist[itr]) | |||||
| elif self.__compute_method != 'trie' and self.__k_func is not None: | |||||
| return itr, self.__kernel_do_naive(G_p1, G_plist[itr]) | |||||
| if self._compute_method == 'trie' and self._k_func is not None: | |||||
| return itr, self._kernel_do_trie(G_p1, G_plist[itr]) | |||||
| elif self._compute_method != 'trie' and self._k_func is not None: | |||||
| return itr, self._kernel_do_naive(G_p1, G_plist[itr]) | |||||
| else: | else: | ||||
| return itr, self.__kernel_do_kernelless(G_p1, G_plist[itr]) | |||||
| return itr, self._kernel_do_kernelless(G_p1, G_plist[itr]) | |||||
| def _compute_single_kernel_series(self, g1, g2): | def _compute_single_kernel_series(self, g1, g2): | ||||
| self.__add_dummy_labels([g1] + [g2]) | |||||
| if self.__compute_method == 'trie': | |||||
| paths_g1 = self.__find_all_path_as_trie(g1) | |||||
| paths_g2 = self.__find_all_path_as_trie(g2) | |||||
| kernel = self.__kernel_do_trie(paths_g1, paths_g2) | |||||
| self._add_dummy_labels([g1] + [g2]) | |||||
| if self._compute_method == 'trie': | |||||
| paths_g1 = self._find_all_path_as_trie(g1) | |||||
| paths_g2 = self._find_all_path_as_trie(g2) | |||||
| kernel = self._kernel_do_trie(paths_g1, paths_g2) | |||||
| else: | else: | ||||
| paths_g1 = self.__find_all_paths_until_length(g1) | |||||
| paths_g2 = self.__find_all_paths_until_length(g2) | |||||
| kernel = self.__kernel_do_naive(paths_g1, paths_g2) | |||||
| paths_g1 = self._find_all_paths_until_length(g1) | |||||
| paths_g2 = self._find_all_paths_until_length(g2) | |||||
| kernel = self._kernel_do_naive(paths_g1, paths_g2) | |||||
| return kernel | return kernel | ||||
| def __kernel_do_trie(self, trie1, trie2): | |||||
| def _kernel_do_trie(self, trie1, trie2): | |||||
| """Compute path graph kernels up to depth d between 2 graphs using trie. | """Compute path graph kernels up to depth d between 2 graphs using trie. | ||||
| Parameters | Parameters | ||||
| @@ -233,7 +233,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| kernel : float | kernel : float | ||||
| Path kernel up to h between 2 graphs. | Path kernel up to h between 2 graphs. | ||||
| """ | """ | ||||
| if self.__k_func == 'tanimoto': | |||||
| if self._k_func == 'tanimoto': | |||||
| # traverse all paths in graph1 and search them in graph2. Deep-first | # traverse all paths in graph1 and search them in graph2. Deep-first | ||||
| # search is applied. | # search is applied. | ||||
| def traverseTrie1t(root, trie2, setlist, pcurrent=[]): | def traverseTrie1t(root, trie2, setlist, pcurrent=[]): | ||||
| @@ -278,7 +278,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| # print(setlist) | # print(setlist) | ||||
| kernel = setlist[0] / setlist[1] | kernel = setlist[0] / setlist[1] | ||||
| elif self.__k_func == 'MinMax': # MinMax kernel | |||||
| elif self._k_func == 'MinMax': # MinMax kernel | |||||
| # traverse all paths in graph1 and search them in graph2. Deep-first | # traverse all paths in graph1 and search them in graph2. Deep-first | ||||
| # search is applied. | # search is applied. | ||||
| def traverseTrie1m(root, trie2, sumlist, pcurrent=[]): | def traverseTrie1m(root, trie2, sumlist, pcurrent=[]): | ||||
| @@ -331,10 +331,10 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| def _wrapper_kernel_do_trie(self, itr): | def _wrapper_kernel_do_trie(self, itr): | ||||
| i = itr[0] | i = itr[0] | ||||
| j = itr[1] | j = itr[1] | ||||
| return i, j, self.__kernel_do_trie(G_trie[i], G_trie[j]) | |||||
| return i, j, self._kernel_do_trie(G_trie[i], G_trie[j]) | |||||
| def __kernel_do_naive(self, paths1, paths2): | |||||
| def _kernel_do_naive(self, paths1, paths2): | |||||
| """Compute path graph kernels up to depth d between 2 graphs naively. | """Compute path graph kernels up to depth d between 2 graphs naively. | ||||
| Parameters | Parameters | ||||
| @@ -355,7 +355,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| """ | """ | ||||
| all_paths = list(set(paths1 + paths2)) | all_paths = list(set(paths1 + paths2)) | ||||
| if self.__k_func == 'tanimoto': | |||||
| if self._k_func == 'tanimoto': | |||||
| length_union = len(set(paths1 + paths2)) | length_union = len(set(paths1 + paths2)) | ||||
| kernel = (len(set(paths1)) + len(set(paths2)) - | kernel = (len(set(paths1)) + len(set(paths2)) - | ||||
| length_union) / length_union | length_union) / length_union | ||||
| @@ -364,7 +364,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| # kernel_uv = np.dot(vector1, vector2) | # kernel_uv = np.dot(vector1, vector2) | ||||
| # kernel = kernel_uv / (len(set(paths1)) + len(set(paths2)) - kernel_uv) | # kernel = kernel_uv / (len(set(paths1)) + len(set(paths2)) - kernel_uv) | ||||
| elif self.__k_func == 'MinMax': # MinMax kernel | |||||
| elif self._k_func == 'MinMax': # MinMax kernel | |||||
| path_count1 = Counter(paths1) | path_count1 = Counter(paths1) | ||||
| path_count2 = Counter(paths2) | path_count2 = Counter(paths2) | ||||
| vector1 = [(path_count1[key] if (key in path_count1.keys()) else 0) | vector1 = [(path_count1[key] if (key in path_count1.keys()) else 0) | ||||
| @@ -374,7 +374,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| kernel = np.sum(np.minimum(vector1, vector2)) / \ | kernel = np.sum(np.minimum(vector1, vector2)) / \ | ||||
| np.sum(np.maximum(vector1, vector2)) | np.sum(np.maximum(vector1, vector2)) | ||||
| elif self.__k_func is None: # no sub-kernel used; compare paths directly. | |||||
| elif self._k_func is None: # no sub-kernel used; compare paths directly. | |||||
| path_count1 = Counter(paths1) | path_count1 = Counter(paths1) | ||||
| path_count2 = Counter(paths2) | path_count2 = Counter(paths2) | ||||
| vector1 = [(path_count1[key] if (key in path_count1.keys()) else 0) | vector1 = [(path_count1[key] if (key in path_count1.keys()) else 0) | ||||
| @@ -392,10 +392,10 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| def _wrapper_kernel_do_naive(self, itr): | def _wrapper_kernel_do_naive(self, itr): | ||||
| i = itr[0] | i = itr[0] | ||||
| j = itr[1] | j = itr[1] | ||||
| return i, j, self.__kernel_do_naive(G_plist[i], G_plist[j]) | |||||
| return i, j, self._kernel_do_naive(G_plist[i], G_plist[j]) | |||||
| def __find_all_path_as_trie(self, G): | |||||
| def _find_all_path_as_trie(self, G): | |||||
| # all_path = find_all_paths_until_length(G, length, ds_attrs, | # all_path = find_all_paths_until_length(G, length, ds_attrs, | ||||
| # node_label=node_label, | # node_label=node_label, | ||||
| # edge_label=edge_label) | # edge_label=edge_label) | ||||
| @@ -431,11 +431,11 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| # them. Deep-first search is applied. Notice the reverse of each path is | # them. Deep-first search is applied. Notice the reverse of each path is | ||||
| # also stored to the trie. | # also stored to the trie. | ||||
| def traverseGraph(root, ptrie, G, pcurrent=[]): | def traverseGraph(root, ptrie, G, pcurrent=[]): | ||||
| if len(pcurrent) < self.__depth + 1: | |||||
| if len(pcurrent) < self._depth + 1: | |||||
| for neighbor in G[root]: | for neighbor in G[root]: | ||||
| if neighbor not in pcurrent: | if neighbor not in pcurrent: | ||||
| pcurrent.append(neighbor) | pcurrent.append(neighbor) | ||||
| plstr = self.__paths2labelseqs([pcurrent], G) | |||||
| plstr = self._paths2labelseqs([pcurrent], G) | |||||
| ptrie.insertWord(plstr[0]) | ptrie.insertWord(plstr[0]) | ||||
| traverseGraph(neighbor, ptrie, G, pcurrent) | traverseGraph(neighbor, ptrie, G, pcurrent) | ||||
| del pcurrent[-1] | del pcurrent[-1] | ||||
| @@ -443,7 +443,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| ptrie = Trie() | ptrie = Trie() | ||||
| path_l = [[n] for n in G.nodes] # paths of length l | path_l = [[n] for n in G.nodes] # paths of length l | ||||
| path_l_str = self.__paths2labelseqs(path_l, G) | |||||
| path_l_str = self._paths2labelseqs(path_l, G) | |||||
| for p in path_l_str: | for p in path_l_str: | ||||
| ptrie.insertWord(p) | ptrie.insertWord(p) | ||||
| for n in G.nodes: | for n in G.nodes: | ||||
| @@ -480,11 +480,11 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| def _wrapper_find_all_path_as_trie(self, itr_item): | def _wrapper_find_all_path_as_trie(self, itr_item): | ||||
| g = itr_item[0] | g = itr_item[0] | ||||
| i = itr_item[1] | i = itr_item[1] | ||||
| return i, self.__find_all_path_as_trie(g) | |||||
| return i, self._find_all_path_as_trie(g) | |||||
| # @todo: (can be removed maybe) this method find paths repetively, it could be faster. | # @todo: (can be removed maybe) this method find paths repetively, it could be faster. | ||||
| def __find_all_paths_until_length(self, G, tolabelseqs=True): | |||||
| def _find_all_paths_until_length(self, G, tolabelseqs=True): | |||||
| """Find all paths no longer than a certain maximum length in a graph. A | """Find all paths no longer than a certain maximum length in a graph. A | ||||
| recursive depth first search is applied. | recursive depth first search is applied. | ||||
| @@ -511,7 +511,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| """ | """ | ||||
| # path_l = [tuple([n]) for n in G.nodes] # paths of length l | # path_l = [tuple([n]) for n in G.nodes] # paths of length l | ||||
| # all_paths = path_l[:] | # all_paths = path_l[:] | ||||
| # for l in range(1, self.__depth + 1): | |||||
| # for l in range(1, self._depth + 1): | |||||
| # path_l_new = [] | # path_l_new = [] | ||||
| # for path in path_l: | # for path in path_l: | ||||
| # for neighbor in G[path[-1]]: | # for neighbor in G[path[-1]]: | ||||
| @@ -525,7 +525,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| path_l = [[n] for n in G.nodes] # paths of length l | path_l = [[n] for n in G.nodes] # paths of length l | ||||
| all_paths = [p.copy() for p in path_l] | all_paths = [p.copy() for p in path_l] | ||||
| for l in range(1, self.__depth + 1): | |||||
| for l in range(1, self._depth + 1): | |||||
| path_lplus1 = [] | path_lplus1 = [] | ||||
| for path in path_l: | for path in path_l: | ||||
| for neighbor in G[path[-1]]: | for neighbor in G[path[-1]]: | ||||
| @@ -537,7 +537,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| all_paths += path_lplus1 | all_paths += path_lplus1 | ||||
| path_l = [p.copy() for p in path_lplus1] | path_l = [p.copy() for p in path_lplus1] | ||||
| # for i in range(0, self.__depth + 1): | |||||
| # for i in range(0, self._depth + 1): | |||||
| # new_paths = find_all_paths(G, i) | # new_paths = find_all_paths(G, i) | ||||
| # if new_paths == []: | # if new_paths == []: | ||||
| # break | # break | ||||
| @@ -546,36 +546,36 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| # consider labels | # consider labels | ||||
| # print(paths2labelseqs(all_paths, G, ds_attrs, node_label, edge_label)) | # print(paths2labelseqs(all_paths, G, ds_attrs, node_label, edge_label)) | ||||
| # print() | # print() | ||||
| return (self.__paths2labelseqs(all_paths, G) if tolabelseqs else all_paths) | |||||
| return (self._paths2labelseqs(all_paths, G) if tolabelseqs else all_paths) | |||||
| def _wrapper_find_all_paths_until_length(self, tolabelseqs, itr_item): | def _wrapper_find_all_paths_until_length(self, tolabelseqs, itr_item): | ||||
| g = itr_item[0] | g = itr_item[0] | ||||
| i = itr_item[1] | i = itr_item[1] | ||||
| return i, self.__find_all_paths_until_length(g, tolabelseqs=tolabelseqs) | |||||
| return i, self._find_all_paths_until_length(g, tolabelseqs=tolabelseqs) | |||||
| def __paths2labelseqs(self, plist, G): | |||||
| if len(self.__node_labels) > 0: | |||||
| if len(self.__edge_labels) > 0: | |||||
| def _paths2labelseqs(self, plist, G): | |||||
| if len(self._node_labels) > 0: | |||||
| if len(self._edge_labels) > 0: | |||||
| path_strs = [] | path_strs = [] | ||||
| for path in plist: | for path in plist: | ||||
| pths_tmp = [] | pths_tmp = [] | ||||
| for idx, node in enumerate(path[:-1]): | for idx, node in enumerate(path[:-1]): | ||||
| pths_tmp.append(tuple(G.nodes[node][nl] for nl in self.__node_labels)) | |||||
| pths_tmp.append(tuple(G[node][path[idx + 1]][el] for el in self.__edge_labels)) | |||||
| pths_tmp.append(tuple(G.nodes[path[-1]][nl] for nl in self.__node_labels)) | |||||
| pths_tmp.append(tuple(G.nodes[node][nl] for nl in self._node_labels)) | |||||
| pths_tmp.append(tuple(G[node][path[idx + 1]][el] for el in self._edge_labels)) | |||||
| pths_tmp.append(tuple(G.nodes[path[-1]][nl] for nl in self._node_labels)) | |||||
| path_strs.append(tuple(pths_tmp)) | path_strs.append(tuple(pths_tmp)) | ||||
| else: | else: | ||||
| path_strs = [] | path_strs = [] | ||||
| for path in plist: | for path in plist: | ||||
| pths_tmp = [] | pths_tmp = [] | ||||
| for node in path: | for node in path: | ||||
| pths_tmp.append(tuple(G.nodes[node][nl] for nl in self.__node_labels)) | |||||
| pths_tmp.append(tuple(G.nodes[node][nl] for nl in self._node_labels)) | |||||
| path_strs.append(tuple(pths_tmp)) | path_strs.append(tuple(pths_tmp)) | ||||
| return path_strs | return path_strs | ||||
| else: | else: | ||||
| if len(self.__edge_labels) > 0: | |||||
| if len(self._edge_labels) > 0: | |||||
| path_strs = [] | path_strs = [] | ||||
| for path in plist: | for path in plist: | ||||
| if len(path) == 1: | if len(path) == 1: | ||||
| @@ -583,7 +583,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| else: | else: | ||||
| pths_tmp = [] | pths_tmp = [] | ||||
| for idx, node in enumerate(path[:-1]): | for idx, node in enumerate(path[:-1]): | ||||
| pths_tmp.append(tuple(G[node][path[idx + 1]][el] for el in self.__edge_labels)) | |||||
| pths_tmp.append(tuple(G[node][path[idx + 1]][el] for el in self._edge_labels)) | |||||
| path_strs.append(tuple(pths_tmp)) | path_strs.append(tuple(pths_tmp)) | ||||
| return path_strs | return path_strs | ||||
| else: | else: | ||||
| @@ -591,13 +591,13 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func is None | |||||
| # return [tuple([len(path)]) for path in all_paths] | # return [tuple([len(path)]) for path in all_paths] | ||||
| def __add_dummy_labels(self, Gn): | |||||
| if self.__k_func is not None: | |||||
| if len(self.__node_labels) == 0 or (len(self.__node_labels) == 1 and self.__node_labels[0] == SpecialLabel.DUMMY): | |||||
| def _add_dummy_labels(self, Gn): | |||||
| if self._k_func is not None: | |||||
| if len(self._node_labels) == 0 or (len(self._node_labels) == 1 and self._node_labels[0] == SpecialLabel.DUMMY): | |||||
| for i in range(len(Gn)): | for i in range(len(Gn)): | ||||
| nx.set_node_attributes(Gn[i], '0', SpecialLabel.DUMMY) | nx.set_node_attributes(Gn[i], '0', SpecialLabel.DUMMY) | ||||
| self.__node_labels = [SpecialLabel.DUMMY] | |||||
| if len(self.__edge_labels) == 0 or (len(self.__edge_labels) == 1 and self.__edge_labels[0] == SpecialLabel.DUMMY): | |||||
| self._node_labels = [SpecialLabel.DUMMY] | |||||
| if len(self._edge_labels) == 0 or (len(self._edge_labels) == 1 and self._edge_labels[0] == SpecialLabel.DUMMY): | |||||
| for i in range(len(Gn)): | for i in range(len(Gn)): | ||||
| nx.set_edge_attributes(Gn[i], '0', SpecialLabel.DUMMY) | nx.set_edge_attributes(Gn[i], '0', SpecialLabel.DUMMY) | ||||
| self.__edge_labels = [SpecialLabel.DUMMY] | |||||
| self._edge_labels = [SpecialLabel.DUMMY] | |||||